2026/01/17 Update

Removed a lot of old backup files.
Fixed Eye of Gruumsh's epic bonus feats.
Add Epic marker feat for Eye of Gruumsh.
Added Channeled Pyroburst to prc_desc_fire.2da
Added GetCurrentUnixTimestamp() function.
Moved crafting conversation functions to prc_craft_cv_inc.nss.
Made Midnight Augment work slightly better, still not quite per PnP yet.
Disciple of Asmodeus' Summoned Devils are supposed to be Lawful Evil.
Every instance of ItemPropertySpellImmunitySpecific() in race_skin.nss was misconfigured.
Several instances of ItemPropertyDamageImmunity() in race_skin.nss were misconfigured.
Fixed issue where Blighters were still considered undead after leaving undead wildshape.
PRC8 now supports offline PnP magical crafting.
Disciple of Asmodeus' Dread Night now increases AC instead of Damage, per PnP.
Non-spellcaster Disciples of Asmodeus have a Hellcat duration based on DoA class level.
Hexblade's Dark Companion shouldn't lose Sacntuary when loading from a save.
Claws of the Savage should increase size properly if caster already has claws at time of casting.
This commit is contained in:
Jaysyn904
2026-01-17 22:50:31 -05:00
parent a1248f389f
commit 829d9d7999
50 changed files with 1705 additions and 35013 deletions

View File

@@ -1,63 +1,63 @@
2DA V2.0
Bonus
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0
13 0
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 1
25 0
26 0
27 0
28 0
29 1
30 0
31 0
32 0
33 0
34 1
35 0
36 0
37 0
38 0
39 1
40 0
41 0
42 0
43 0
44 1
45 0
46 0
47 0
48 0
49 1
50 0
51 0
52 0
53 0
54 1
55 0
56 0
57 0
58 0
59 1
Bonus
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 1
13 0
14 0
15 1
16 0
17 0
18 1
19 0
20 0
21 1
22 0
23 0
24 1
25 0
26 0
27 1
28 0
29 0
30 1
31 0
32 0
33 1
34 0
35 0
36 1
37 0
38 0
39 1
40 0
41 0
42 1
43 0
44 0
45 1
46 0
47 0
48 1
49 0
50 0
51 1
52 0
53 0
54 1
55 0
56 0
57 1
58 0
59 0

View File

@@ -1,17 +1,220 @@
2DA V2.0
FeatLabel FeatIndex List GrantedOnLevel OnMenu
0 Blind_Fight 408 3 1 0
1 Rage 293 3 1 1
2 Command_the_horde 4600 3 1 1
3 Swing_Blindly 4602 3 2 0
4 Ritual_Scarring 4603 3 3 0
5 Blinding_Spittle 4601 3 4 1
6 Blinding_Spittle_2 4607 3 7 1
7 Blindsight_5ft 485 3 5 0
8 Blindsight_10ft 486 3 8 0
9 Sight_of_Gruumsh 4604 3 10 0
10 FEAT_EPIC_BLINDING_SPEED 491 0 -1 1
11 DefArrow 8 0 -1 0
12 TwoWeap 41 0 -1 0
13 Ambidex 1 0 -1 0
FeatLabel FeatIndex List GrantedOnLevel OnMenu
0 Blind_Fight 408 3 1 0
1 Rage 293 3 1 1
2 Command_the_horde 4600 3 1 1
3 Swing_Blindly 4602 3 2 0
4 Ritual_Scarring 4603 3 3 0
5 Blinding_Spittle 4601 3 4 1
6 Blinding_Spittle_2 4607 3 7 1
7 Blindsight_5ft 485 3 5 0
8 Blindsight_10ft 486 3 8 0
9 Sight_of_Gruumsh 4604 3 10 0
10 FEAT_EPIC_BLINDING_SPEED 491 0 -1 1
11 DefArrow 8 0 -1 0
12 TwoWeap 41 0 -1 0
13 Ambidex 1 0 -1 0
14 FEAT_EPIC_EYE_OF_GRUUMSH 25000 3 11 0
15 FEAT_PRC_EPIC_MIGHT_RAGE 3516 1 -1 0
16 FEAT_EPIC_THUNDERING_RAGE 988 1 -1 0
17 FEAT_EPIC_ARMOR_SKIN 490 1 -1 0
18 FEAT_EPIC_DAMAGE_REDUCTION_3 492 1 -1 0
19 FEAT_EPIC_DAMAGE_REDUCTION_6 493 1 -1 0
20 FEAT_EPIC_DAMAGE_REDUCTION_9 494 1 -1 0
21 FEAT_EPIC_DEVASTATING_CRITICAL_CLUB 495 1 -1 0
22 FEAT_EPIC_DEVASTATING_CRITICAL_DAGGER 496 1 -1 0
23 FEAT_EPIC_DEVASTATING_CRITICAL_DART 497 1 -1 0
24 FEAT_EPIC_DEVASTATING_CRITICAL_HEAVYCROSSBOW 498 1 -1 0
25 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTCROSSBOW 499 1 -1 0
26 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTMACE 500 1 -1 0
27 FEAT_EPIC_DEVASTATING_CRITICAL_MORNINGSTAR 501 1 -1 0
28 FEAT_EPIC_DEVASTATING_CRITICAL_QUARTERSTAFF 502 1 -1 0
29 FEAT_EPIC_DEVASTATING_CRITICAL_SHORTSPEAR 503 1 -1 0
30 FEAT_EPIC_DEVASTATING_CRITICAL_SICKLE 504 1 -1 0
31 FEAT_EPIC_DEVASTATING_CRITICAL_SLING 505 1 -1 0
32 FEAT_EPIC_DEVASTATING_CRITICAL_UNARMED 506 1 -1 0
33 FEAT_EPIC_DEVASTATING_CRITICAL_LONGBOW 507 1 -1 0
34 FEAT_EPIC_DEVASTATING_CRITICAL_SHORTBOW 508 1 -1 0
35 FEAT_EPIC_DEVASTATING_CRITICAL_SHORTSWORD 509 1 -1 0
36 FEAT_EPIC_DEVASTATING_CRITICAL_RAPIER 510 1 -1 0
37 FEAT_EPIC_DEVASTATING_CRITICAL_SCIMITAR 511 1 -1 0
38 FEAT_EPIC_DEVASTATING_CRITICAL_LONGSWORD 512 1 -1 0
39 FEAT_EPIC_DEVASTATING_CRITICAL_GREATSWORD 513 1 -1 0
40 FEAT_EPIC_DEVASTATING_CRITICAL_HANDAXE 514 1 -1 0
41 FEAT_EPIC_DEVASTATING_CRITICAL_THROWINGAXE 515 1 -1 0
42 FEAT_EPIC_DEVASTATING_CRITICAL_BATTLEAXE 516 1 -1 0
43 FEAT_EPIC_DEVASTATING_CRITICAL_GREATAXE 517 1 -1 0
44 FEAT_EPIC_DEVASTATING_CRITICAL_HALBERD 518 1 -1 0
45 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTHAMMER 519 1 -1 0
46 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTFLAIL 520 1 -1 0
47 FEAT_EPIC_DEVASTATING_CRITICAL_WARHAMMER 521 1 -1 0
48 FEAT_EPIC_DEVASTATING_CRITICAL_HEAVYFLAIL 522 1 -1 0
49 FEAT_EPIC_DEVASTATING_CRITICAL_KAMA 523 1 -1 0
50 FEAT_EPIC_DEVASTATING_CRITICAL_KUKRI 524 1 -1 0
51 FEAT_EPIC_DEVASTATING_CRITICAL_SHURIKEN 525 1 -1 0
52 FEAT_EPIC_DEVASTATING_CRITICAL_SCYTHE 526 1 -1 0
53 FEAT_EPIC_DEVASTATING_CRITICAL_KATANA 527 1 -1 0
54 FEAT_EPIC_DEVASTATING_CRITICAL_BASTARDSWORD 528 1 -1 0
55 FEAT_EPIC_DEVASTATING_CRITICAL_DIREMACE 529 1 -1 0
56 FEAT_EPIC_DEVASTATING_CRITICAL_DOUBLEAXE 530 1 -1 0
57 FEAT_EPIC_DEVASTATING_CRITICAL_TWOBLADEDSWORD 531 1 -1 0
58 FEAT_EPIC_DEVASTATING_CRITICAL_TRIDENT 1075 1 -1 0
59 FEAT_EPIC_TOUGHNESS_1 754 1 -1 0
60 FEAT_EPIC_TOUGHNESS_2 755 1 -1 0
61 FEAT_EPIC_TOUGHNESS_3 756 1 -1 0
62 FEAT_EPIC_TOUGHNESS_4 757 1 -1 0
63 FEAT_EPIC_TOUGHNESS_5 758 1 -1 0
64 FEAT_EPIC_TOUGHNESS_6 759 1 -1 0
65 FEAT_EPIC_TOUGHNESS_7 760 1 -1 0
66 FEAT_EPIC_TOUGHNESS_8 761 1 -1 0
67 FEAT_EPIC_TOUGHNESS_9 762 1 -1 0
68 FEAT_EPIC_TOUGHNESS_10 763 1 -1 0
69 FEAT_EPIC_DEVASTATING_CRITICAL_DWAXE 955 1 -1 0
70 FEAT_EPIC_WEAPON_FOCUS_CLUB 619 1 -1 0
71 FEAT_EPIC_WEAPON_FOCUS_DAGGER 620 1 -1 0
72 FEAT_EPIC_WEAPON_FOCUS_DART 621 1 -1 0
73 FEAT_EPIC_WEAPON_FOCUS_HEAVYCROSSBOW 622 1 -1 0
74 FEAT_EPIC_WEAPON_FOCUS_LIGHTCROSSBOW 623 1 -1 0
75 FEAT_EPIC_WEAPON_FOCUS_LIGHTMACE 624 1 -1 0
76 FEAT_EPIC_WEAPON_FOCUS_MORNINGSTAR 625 1 -1 0
77 FEAT_EPIC_WEAPON_FOCUS_QUARTERSTAFF 626 1 -1 0
78 FEAT_EPIC_WEAPON_FOCUS_SHORTSPEAR 627 1 -1 0
79 FEAT_EPIC_WEAPON_FOCUS_SICKLE 628 1 -1 0
80 FEAT_EPIC_WEAPON_FOCUS_SLING 629 1 -1 0
81 FEAT_EPIC_WEAPON_FOCUS_UNARMED 630 1 -1 0
82 FEAT_EPIC_WEAPON_FOCUS_LONGBOW 631 1 -1 0
83 FEAT_EPIC_WEAPON_FOCUS_SHORTBOW 632 1 -1 0
84 FEAT_EPIC_WEAPON_FOCUS_SHORTSWORD 633 1 -1 0
85 FEAT_EPIC_WEAPON_FOCUS_RAPIER 634 1 -1 0
86 FEAT_EPIC_WEAPON_FOCUS_SCIMITAR 635 1 -1 0
87 FEAT_EPIC_WEAPON_FOCUS_LONGSWORD 636 1 -1 0
88 FEAT_EPIC_WEAPON_FOCUS_GREATSWORD 637 1 -1 0
89 FEAT_EPIC_WEAPON_FOCUS_HANDAXE 638 1 -1 0
90 FEAT_EPIC_WEAPON_FOCUS_THROWINGAXE 639 1 -1 0
91 FEAT_EPIC_WEAPON_FOCUS_BATTLEAXE 640 1 -1 0
92 FEAT_EPIC_WEAPON_FOCUS_GREATAXE 641 1 -1 0
93 FEAT_EPIC_WEAPON_FOCUS_HALBERD 642 1 -1 0
94 FEAT_EPIC_WEAPON_FOCUS_LIGHTHAMMER 643 1 -1 0
95 FEAT_EPIC_WEAPON_FOCUS_LIGHTFLAIL 644 1 -1 0
96 FEAT_EPIC_WEAPON_FOCUS_WARHAMMER 645 1 -1 0
97 FEAT_EPIC_WEAPON_FOCUS_HEAVYFLAIL 646 1 -1 0
98 FEAT_EPIC_WEAPON_FOCUS_KAMA 647 1 -1 0
99 FEAT_EPIC_WEAPON_FOCUS_KUKRI 648 1 -1 0
100 FEAT_EPIC_WEAPON_FOCUS_SHURIKEN 649 1 -1 0
101 FEAT_EPIC_WEAPON_FOCUS_SCYTHE 650 1 -1 0
102 FEAT_EPIC_WEAPON_FOCUS_KATANA 651 1 -1 0
103 FEAT_EPIC_WEAPON_FOCUS_BASTARDSWORD 652 1 -1 0
104 FEAT_EPIC_WEAPON_FOCUS_DIREMACE 653 1 -1 0
105 FEAT_EPIC_WEAPON_FOCUS_DOUBLEAXE 654 1 -1 0
106 FEAT_EPIC_WEAPON_FOCUS_TWOBLADEDSWORD 655 1 -1 0
107 FEAT_EPIC_WEAPON_FOCUS_DWAXE 956 1 -1 0
108 FEAT_EPIC_WEAPON_FOCUS_TRIDENT 1076 1 -1 0
109 FEAT_EPIC_OVERWHELMING_CRITICAL_CLUB 709 1 -1 0
110 FEAT_EPIC_OVERWHELMING_CRITICAL_DAGGER 710 1 -1 0
111 FEAT_EPIC_OVERWHELMING_CRITICAL_DART 711 1 -1 0
112 FEAT_EPIC_OVERWHELMING_CRITICAL_HEAVYCROSSBOW 712 1 -1 0
113 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTCROSSBOW 713 1 -1 0
114 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTMACE 714 1 -1 0
115 FEAT_EPIC_OVERWHELMING_CRITICAL_MORNINGSTAR 715 1 -1 0
116 FEAT_EPIC_OVERWHELMING_CRITICAL_QUARTERSTAFF 716 1 -1 0
117 FEAT_EPIC_OVERWHELMING_CRITICAL_SHORTSPEAR 717 1 -1 0
118 FEAT_EPIC_OVERWHELMING_CRITICAL_SICKLE 718 1 -1 0
119 FEAT_EPIC_OVERWHELMING_CRITICAL_SLING 719 1 -1 0
120 FEAT_EPIC_OVERWHELMING_CRITICAL_UNARMED 720 1 -1 0
121 FEAT_EPIC_OVERWHELMING_CRITICAL_LONGBOW 721 1 -1 0
122 FEAT_EPIC_OVERWHELMING_CRITICAL_SHORTBOW 722 1 -1 0
123 FEAT_EPIC_OVERWHELMING_CRITICAL_SHORTSWORD 723 1 -1 0
124 FEAT_EPIC_OVERWHELMING_CRITICAL_RAPIER 724 1 -1 0
125 FEAT_EPIC_OVERWHELMING_CRITICAL_SCIMITAR 725 1 -1 0
126 FEAT_EPIC_OVERWHELMING_CRITICAL_LONGSWORD 726 1 -1 0
127 FEAT_EPIC_OVERWHELMING_CRITICAL_GREATSWORD 727 1 -1 0
128 FEAT_EPIC_OVERWHELMING_CRITICAL_HANDAXE 728 1 -1 0
129 FEAT_EPIC_OVERWHELMING_CRITICAL_THROWINGAXE 729 1 -1 0
130 FEAT_EPIC_OVERWHELMING_CRITICAL_BATTLEAXE 730 1 -1 0
131 FEAT_EPIC_OVERWHELMING_CRITICAL_GREATAXE 731 1 -1 0
132 FEAT_EPIC_OVERWHELMING_CRITICAL_HALBERD 732 1 -1 0
133 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTHAMMER 733 1 -1 0
134 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTFLAIL 734 1 -1 0
135 FEAT_EPIC_OVERWHELMING_CRITICAL_WARHAMMER 735 1 -1 0
136 FEAT_EPIC_OVERWHELMING_CRITICAL_HEAVYFLAIL 736 1 -1 0
137 FEAT_EPIC_OVERWHELMING_CRITICAL_KAMA 737 1 -1 0
138 FEAT_EPIC_OVERWHELMING_CRITICAL_KUKRI 738 1 -1 0
139 FEAT_EPIC_OVERWHELMING_CRITICAL_SHURIKEN 739 1 -1 0
140 FEAT_EPIC_OVERWHELMING_CRITICAL_SCYTHE 740 1 -1 0
141 FEAT_EPIC_OVERWHELMING_CRITICAL_KATANA 741 1 -1 0
142 FEAT_EPIC_OVERWHELMING_CRITICAL_BASTARDSWORD 742 1 -1 0
143 FEAT_EPIC_OVERWHELMING_CRITICAL_DIREMACE 743 1 -1 0
144 FEAT_EPIC_OVERWHELMING_CRITICAL_DOUBLEAXE 744 1 -1 0
145 FEAT_EPIC_OVERWHELMING_CRITICAL_TWOBLADEDSWORD 745 1 -1 0
146 FEAT_EPIC_OVERWHELMING_CRITICAL_DWAXE 958 1 -1 0
147 FEAT_EPIC_OVERWHELMING_CRITICAL_TRIDENT 1078 1 -1 0
148 FEAT_EPIC_SUPERIOR_INITIATIVE 753 1 -1 0
150 FEAT_EPIC_PROWESS 584 1 -1 0
151 FEAT_EPIC_TERRIFYING_RAGE 989 1 -1 0
152 FEAT_EPIC_WEAPON_FOCUS_WHIP 997 1 -1 0
153 FEAT_EPIC_DEVASTATING_CRITICAL_WHIP 996 1 -1 0
154 FEAT_EPIC_OVERWHELMING_CRITICAL_WHIP 999 1 -1 0
155 FEAT_EPIC_BLINDING_SPEED 491 0 -1 1
156 OverWCrit_Mindblade 3615 1 -1 0
157 DevCrit_Mindblade 3616 1 -1 0
158 Epic_WeaponFocus_Mindblade 3618 1 -1 0
159 DEVASTATING_CRITICAL_LIGHT_LANCE 24673 1 -1 0
160 DEVASTATING_CRITICAL_HEAVY_PICK 24674 1 -1 0
161 DEVASTATING_CRITICAL_LIGHT_PICK 24675 1 -1 0
162 DEVASTATING_CRITICAL_SAI 24676 1 -1 0
163 DEVASTATING_CRITICAL_NUNCHAKU 24677 1 -1 0
164 DEVASTATING_CRITICAL_FALCHION 24678 1 -1 0
165 DEVASTATING_CRITICAL_SAP 24679 1 -1 0
166 DEVASTATING_CRITICAL_KATAR 24680 1 -1 0
167 DEVASTATING_CRITICAL_HEAVY_MACE 24681 1 -1 0
168 DEVASTATING_CRITICAL_MAUL 24682 1 -1 0
169 DEVASTATING_CRITICAL_DBL_SCIMITAR 24683 1 -1 0
170 DEVASTATING_CRITICAL_GOAD 24684 1 -1 0
171 DEVASTATING_CRITICAL_ELVEN_LIGHTBLADE 24703 1 -1 0
172 DEVASTATING_CRITICAL_ELVEN_THINBLADE 24711 1 -1 0
173 DEVASTATING_CRITICAL_ELVEN_COURTBLADE 24719 1 -1 0
174 EPIC_WEAPON_FOCUS_LANCE 24613 1 -1 0
175 EPIC_WEAPON_FOCUS_HEAVY_PICK 24614 1 -1 0
176 EPIC_WEAPON_FOCUS_LIGHT_PICK 24615 1 -1 0
177 EPIC_WEAPON_FOCUS_SAI 24616 1 -1 0
178 EPIC_WEAPON_FOCUS_NUNCHAKU 24617 1 -1 0
179 EPIC_WEAPON_FOCUS_FALCHION 24618 1 -1 0
180 EPIC_WEAPON_FOCUS_SAP 24619 1 -1 0
181 EPIC_WEAPON_FOCUS_KATAR 24620 1 -1 0
182 EPIC_WEAPON_FOCUS_HEAVY_MACE 24621 1 -1 0
183 EPIC_WEAPON_FOCUS_MAUL 24622 1 -1 0
184 EPIC_WEAPON_FOCUS_DBL_SCIMITAR 24623 1 -1 0
185 EPIC_WEAPON_FOCUS_GOAD 24624 1 -1 0
186 EPIC_WEAPON_FOCUS_ELVEN_LIGHTBLADE 24698 1 -1 0
187 EPIC_WEAPON_FOCUS_ELVEN_THINBLADE 24706 1 -1 0
188 EPIC_WEAPON_FOCUS_ELVEN_COURTBLADE 24714 1 -1 0
189 OVERWHELMING_CRITICAL_LIGHT_LANCE 24661 1 -1 0
190 OVERWHELMING_CRITICAL_HEAVY_PICK 24662 1 -1 0
191 OVERWHELMING_CRITICAL_LIGHT_PICK 24663 1 -1 0
192 OVERWHELMING_CRITICAL_SAI 24664 1 -1 0
193 OVERWHELMING_CRITICAL_NUNCHAKU 24665 1 -1 0
194 OVERWHELMING_CRITICAL_FALCHION 24666 1 -1 0
195 OVERWHELMING_CRITICAL_SAP 24667 1 -1 0
196 OVERWHELMING_CRITICAL_KATAR 24668 1 -1 0
197 OVERWHELMING_CRITICAL_HEAVY_MACE 24669 1 -1 0
198 OVERWHELMING_CRITICAL_MAUL 24670 1 -1 0
199 OVERWHELMING_CRITICAL_DBL_SCIMITAR 24671 1 -1 0
200 OVERWHELMING_CRITICAL_GOAD 24672 1 -1 0
201 OVERWHELMING_CRITICAL_ELVEN_LIGHTBLADE 24702 1 -1 0
202 OVERWHELMING_CRITICAL_ELVEN_THINBLADE 24710 1 -1 0
203 OVERWHELMING_CRITICAL_ELVEN_COURTBLADE 24718 1 -1 0
204 FEAT_EPIC_GREAT_CONSTITUTION_1 774 1 -1 0
205 FEAT_EPIC_GREAT_CONSTITUTION_2 775 1 -1 0
206 FEAT_EPIC_GREAT_CONSTITUTION_3 776 1 -1 0
207 FEAT_EPIC_GREAT_CONSTITUTION_4 777 1 -1 0
208 FEAT_EPIC_GREAT_CONSTITUTION_5 778 1 -1 0
209 FEAT_EPIC_GREAT_CONSTITUTION_6 779 1 -1 0
210 FEAT_EPIC_GREAT_CONSTITUTION_7 780 1 -1 0
211 FEAT_EPIC_GREAT_CONSTITUTION_8 781 1 -1 0
212 FEAT_EPIC_GREAT_CONSTITUTION_9 782 1 -1 0
213 FEAT_EPIC_GREAT_CONSTITUTION_10 783 1 -1 0
214 FAST_HEALING_1 4145 1 -1 0
215 FAST_HEALING_2 4146 1 -1 0
216 FAST_HEALING_3 4147 1 -1 0
217 LegendaryWrestler 5173 1 -1 0

View File

@@ -1,40 +1,41 @@
2DA V2.0
Label Name School Innate SpellID
0 Burning_Hands 760 T 1 10
1 Delayed_Blast_Fireball 789 V 7 39
2 Elemental_Shield 797 V 4 47
3 Fire_Storm 807 V 7 57
4 Fireball 808 V 3 58
5 Flame_Arrow 809 C 3 59
6 Flame_Lash 810 V 2 60
7 Flame_Strike 811 V 4 61
8 Incendiary_Cloud 839 V 8 89
9 Meteor_Swarm 866 V 9 116
10 Wall_of_Fire 941 V 4 191
11 Firebrand 1895 V 5 440
12 Inferno 2368 T 5 446
13 Combust 3859 V 2 518
14 Kelgores_Fire_Bolt 16826679 V 1 1834
15 ScorchingRay 16827579 V 2 3056
16 Fire_Orb 16830222 C 4 3103
17 Burning_Bolt 16830234 V 1 3109
18 Blast_of_Flame 16830236 V 4 3110
19 Lesser_Fire_Orb 16830360 C 1 3147
20 Fireburst 16830386 V 2 3158
21 Greater_Fireburst 16830388 V 5 3159
22 Agnazzars_Scorcher 16830423 V 2 3165
23 Flashburst 16830427 V 3 3168
24 Beltyns_Burning_Blood 16830435 N 5 3172
25 Epic_Spell_Magma_Burst 16833440 V 9 4041
26 Epic_Spell_Rain_of_Fire 16833479 V 9 4054
27 Pyrotechnics 16832229 T 2 3680
28 Serpents_Sigh 16830265 V 3 3127
29 Darkfire 3781 V 3 548
30 Flame_Weapon 3763 V 2 542
31 PHOENIX_FIRE 16829636 N 7 2615
32 Epic_Spell_Rain_of_Fire 16833479 V 9 4054
33 PnP_FireShield 16832237 V 4 3684
34 FireTrap 16832227 A 4 3679
35 BladesOfFire 16832225 C 2 3678
37 Hellball 8673 V 9 636
Label Name School Innate SpellID
0 Burning_Hands 760 T 1 10
1 Delayed_Blast_Fireball 789 V 7 39
2 Elemental_Shield 797 V 4 47
3 Fire_Storm 807 V 7 57
4 Fireball 808 V 3 58
5 Flame_Arrow 809 C 3 59
6 Flame_Lash 810 V 2 60
7 Flame_Strike 811 V 4 61
8 Incendiary_Cloud 839 V 8 89
9 Meteor_Swarm 866 V 9 116
10 Wall_of_Fire 941 V 4 191
11 Firebrand 1895 V 5 440
12 Inferno 2368 T 5 446
13 Combust 3859 V 2 518
14 Kelgores_Fire_Bolt 16826679 V 1 1834
15 ScorchingRay 16827579 V 2 3056
16 Fire_Orb 16830222 C 4 3103
17 Burning_Bolt 16830234 V 1 3109
18 Blast_of_Flame 16830236 V 4 3110
19 Lesser_Fire_Orb 16830360 C 1 3147
20 Fireburst 16830386 V 2 3158
21 Greater_Fireburst 16830388 V 5 3159
22 Agnazzars_Scorcher 16830423 V 2 3165
23 Flashburst 16830427 V 3 3168
24 Beltyns_Burning_Blood 16830435 N 5 3172
25 Epic_Spell_Magma_Burst 16833440 V 9 4041
26 Epic_Spell_Rain_of_Fire 16833479 V 9 4054
27 Pyrotechnics 16832229 T 2 3680
28 Serpents_Sigh 16830265 V 3 3127
29 Darkfire 3781 V 3 548
30 Flame_Weapon 3763 V 2 542
31 PHOENIX_FIRE 16829636 N 7 2615
32 Epic_Spell_Rain_of_Fire 16833479 V 9 4054
33 PnP_FireShield 16832237 V 4 3684
34 FireTrap 16832227 A 4 3679
35 BladesOfFire 16832225 C 2 3678
37 Hellball 8673 V 9 636
37 Channeled_Pyroburst 16826296 V 4 1810

View File

@@ -685,4 +685,17 @@ string SQLocalsPlayer_GetLastUpdated_UTC(object oPlayer, string sVarName, int nT
return SqlGetString(sql, 0);
else
return "";
}
}
// Returns the current Unix timestamp (seconds since 1970-01-01)
int GetCurrentUnixTimestamp()
{
sqlquery sql = SqlPrepareQueryObject(GetModule(),
"SELECT strftime('%s','now');");
if (SqlStep(sql))
return SqlGetInt(sql, 0);
else
return 0;
}

File diff suppressed because it is too large Load Diff

View File

@@ -713,5 +713,8 @@ void SetAugmentationOverride(object oCreature, struct user_augment_profile uap)
SetLocalInt(oCreature, PRC_AUGMENT_OVERRIDE, _EncodeProfile(uap) + 1);
}
// Test main
//void main(){}

View File

@@ -158,60 +158,7 @@ void main()
{
if(DEBUG) DoDebug("moi_midnightcnv: Stage was not set up already");
if(nStage == STAGE_SELECT_POWER)
{
if(DEBUG) DoDebug("moi_midnightcnv: Building power selection");
int i, nPowerLevel;
int nMaxLevel = GetMaxEssentiaCapacityFeat(oMeldshaper);
string sFeatID;
int added = 0;
for(i = 14001; i < 14351 ; i++)
{
// Skip blank IDs between 14266 and 14329
if(i >= 14266 && i < 14330)
continue;
nPowerLevel = StringToInt(Get2DACache("spells", "Innate", i));
if(nPowerLevel > nMaxLevel)
continue;
string sName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", i)));
// Check if it's a regular power or a subradial
int bHasPower = GetHasPower(i, oMeldshaper);
if (!bHasPower && GetIsSubradialSpell(i))
{
// For subradials, check if they know the master spell
int nMasterSpell = GetMasterSpellFromSubradial(i);
if (nMasterSpell != -1)
{
bHasPower = GetHasPower(nMasterSpell, oMeldshaper);
}
}
if (bHasPower)
{
if(SORT) AddToTempList(oMeldshaper, sName, i);
else AddChoice(sName, i, oMeldshaper);
added++;
}
}
if(SORT)
{
if(added == 0)
{
AddChoice("No valid powers found.", 0, oMeldshaper);
}
else
{
TransferTempList(oMeldshaper);
}
}
}
/* if(nStage == STAGE_SELECT_POWER)
if(nStage == STAGE_SELECT_POWER)
{
if(DEBUG) DoDebug("moi_midnightcnv: Building power selection");
int i, nPowerLevel;
@@ -235,7 +182,7 @@ void main()
else AddChoice(GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", i))), i, oMeldshaper);
}
}
} */
}
else if(nStage == STAGE_SELECT_ESSENTIA_POWER)
{
if(DEBUG) DoDebug("moi_midnightcnv: Building essentia selection");

View File

@@ -43,13 +43,13 @@ void main()
//:: Immunity to Petrification (has to be done per spell, thanks Bioware!)
if(GetHasFeat(FEAT_IMMUNE_PETRIFICATION))
{
ipIP = ItemPropertySpellImmunitySpecific(402); //:: Flesh to Stone
ipIP = ItemPropertySpellImmunitySpecific(398); //:: Flesh to Stone
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(795); //:: Breath, Petrify
ipIP = ItemPropertySpellImmunitySpecific(791); //:: Breath, Petrify
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(797); //:: Touch, Petrify
ipIP = ItemPropertySpellImmunitySpecific(793); //:: Touch, Petrify
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(796); //:: Gaze, Petrify
ipIP = ItemPropertySpellImmunitySpecific(792); //:: Gaze, Petrify
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(482); //:: Stonehold
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
@@ -88,9 +88,9 @@ void main()
//only immunity to wierd and phatasmal killer
if(GetHasFeat(FEAT_IMM_PHANT))
{
ipIP = ItemPropertySpellImmunitySpecific(SPELL_WEIRD);
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_WEIRD);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(SPELL_PHANTASMAL_KILLER);
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_PHANTASMAL_KILLER);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}
@@ -208,31 +208,33 @@ void main()
//immunity to breathing-targeted spells
if(GetHasFeat(FEAT_BREATHLESS))
{
ipIP = ItemPropertySpellImmunitySpecific(SPELL_DROWN);
ipIP = ItemPropertySpellImmunitySpecific(368); //:: Drown
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(SPELL_MASS_DROWN);
ipIP = ItemPropertySpellImmunitySpecific(1117); //:: Drown, Mass
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(SPELL_CLOUDKILL);
ipIP = ItemPropertySpellImmunitySpecific(830); //:: Pulse, Drown
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CLOUDKILL);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(SPELL_STINKING_CLOUD);
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_STINKING_CLOUD);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}
//immunity to charm
if(GetHasFeat(FEAT_IMMUNE_CHARM) || GetRacialType(OBJECT_SELF) == RACIAL_TYPE_DOPPELGANGER)
{
ipIP = ItemPropertySpellImmunitySpecific(SPELL_CHARM_PERSON);
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CHARM_PERSON);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(SPELL_CHARM_MONSTER);
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CHARM_MONSTER);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(SPELL_CHARM_PERSON_OR_ANIMAL);
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CHARM_PERSON_OR_ANIMAL);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}
//immunity to confusion
if(GetHasFeat(FEAT_IMMUNE_CONFUSION))
{
ipIP = ItemPropertySpellImmunitySpecific(SPELL_CONFUSION);
ipIP = ItemPropertySpellImmunitySpecific(IP_CONST_IMMUNITYSPELL_CONFUSION);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}
@@ -240,9 +242,11 @@ void main()
//water gensasi and aquatic elves can breath water, so can some Spirit Folk
if(GetHasFeat(FEAT_WATER_BREATHING) || GetHasFeat(FEAT_BONUS_RIVER) || GetHasFeat(FEAT_BONUS_SEA))
{
ipIP = ItemPropertySpellImmunitySpecific(SPELL_DROWN);
ipIP = ItemPropertySpellImmunitySpecific(368); //:: Drown
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(SPELL_MASS_DROWN );
ipIP = ItemPropertySpellImmunitySpecific(1117); //:: Drown, Mass
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
ipIP = ItemPropertySpellImmunitySpecific(830); //:: Pulse, Drown
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}
@@ -501,7 +505,7 @@ void main()
//damage invulnerability fire
if(GetHasFeat(FEAT_DRAGON_IMMUNE_FIRE))
{
ipIP = ItemPropertyDamageImmunity(DAMAGE_TYPE_FIRE, IP_CONST_DAMAGEIMMUNITY_100_PERCENT);
ipIP = ItemPropertyDamageImmunity(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEIMMUNITY_100_PERCENT);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}
@@ -822,21 +826,21 @@ void main()
//damage vulnerability cold 50%
if(GetHasFeat(FEAT_VULN_COLD))
{
ipIP = ItemPropertyDamageVulnerability(DAMAGE_TYPE_COLD, IP_CONST_DAMAGEVULNERABILITY_50_PERCENT);
ipIP = ItemPropertyDamageVulnerability(IP_CONST_DAMAGETYPE_COLD, IP_CONST_DAMAGEVULNERABILITY_50_PERCENT);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}
//damage vulnerability fire 50%
if(GetHasFeat(FEAT_VULN_FIRE))
{
ipIP = ItemPropertyDamageVulnerability(DAMAGE_TYPE_FIRE, IP_CONST_DAMAGEVULNERABILITY_50_PERCENT);
ipIP = ItemPropertyDamageVulnerability(IP_CONST_DAMAGETYPE_FIRE, IP_CONST_DAMAGEVULNERABILITY_50_PERCENT);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}
//damage immunity 50% Piercing
if(GetHasFeat(FEAT_PARTIAL_PIERCE_IMMUNE))
{
ipIP = ItemPropertyDamageImmunity(DAMAGE_TYPE_PIERCING, IP_CONST_DAMAGEIMMUNITY_50_PERCENT);
ipIP = ItemPropertyDamageImmunity(IP_CONST_DAMAGETYPE_PIERCING, IP_CONST_DAMAGEIMMUNITY_50_PERCENT);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}

View File

@@ -56,8 +56,10 @@ void main()
PRCRemoveSpellEffects(2285, oPC, oPC);
PRCRemoveSpellEffects(2286, oPC, oPC);
PRCRemoveSpellEffects(2287, oPC, oPC);
PRCRemoveSpellEffects(2288, oPC, oPC);
PRCRemoveSpellEffects(2288, oPC, oPC);
DeleteLocalInt(oPC, "PRC_ShiftingOverride_Race");
if(GetLocalInt(oPC, "AraneaHumanoidForm") == TRUE || GetLocalInt(oPC, "AraneaHybridForm") == TRUE || GetPersistantLocalInt(oPC, "nPCShifted") == TRUE || GetLocalInt(oPC, "shifting") == TRUE)
{
SetLocalInt(oPC, "AraneaBiteEquip", TRUE);

View File

@@ -22,808 +22,9 @@
89 properties with constants, 15 without
*/
#include "prc_craft_inc"
#include "prc_craft_cv_inc"
#include "inc_dynconv"
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
//const int STAGE_ = ;
const int STAGE_START = 0;
const int STAGE_SELECT_SUBTYPE = 1;
const int STAGE_SELECT_COSTTABLEVALUE = 2;
const int STAGE_SELECT_PARAM1VALUE = 3;
const int STAGE_CONFIRM = 4;
const int STAGE_BANE = 5;
const int STAGE_CONFIRM_MAGIC = 7;
const int STAGE_APPEARANCE = 8;
const int STAGE_CLONE = 9;
const int STAGE_APPEARANCE_LIST = 10;
const int STAGE_APPEARANCE_VALUE = 11;
const int STAGE_CRAFT_GOLEM = 12;
const int STAGE_CRAFT_GOLEM_HD = 13;
const int STAGE_CRAFT_ALCHEMY = 14;
const int STAGE_CONFIRM_ALCHEMY = 15;
const int STAGE_CRAFT_POISON = 16;
const int STAGE_CONFIRM_POISON = 17;
const int STAGE_CRAFT_LICH = 18;
const int STAGE_CRAFT = 101;
const int STAGE_CRAFT_SELECT = 102;
const int STAGE_CRAFT_MASTERWORK = 103;
const int STAGE_CRAFT_AC = 104;
const int STAGE_CRAFT_MIGHTY = 105;
const int STAGE_CRAFT_CONFIRM = 106;
//const int STAGE_CRAFT = 101;
//const int CHOICE_ = ;
//these must be past the highest 2da entry to be read
const int CHOICE_FORGE = 20001;
const int CHOICE_BOOST = 20002;
const int CHOICE_BACK = 20003;
const int CHOICE_CLEAR = 20004;
const int CHOICE_CONFIRM = 20005;
const int CHOICE_SETNAME = 20006;
const int CHOICE_SETAPPEARANCE = 20007;
const int CHOICE_CLONE = 20008;
const int CHOICE_APPEARANCE_SHOUT = 20009;
const int CHOICE_APPEARANCE_SELECT = 20010;
const int CHOICE_PLUS_1 = 20011;
const int CHOICE_PLUS_10 = 20012;
const int CHOICE_MINUS_1 = 20013;
const int CHOICE_MINUS_10 = 20014;
const int CHOICE_CRAFT = 20101;
//const int NUM_MAX_COSTTABLEVALUES = 70;
//const int NUM_MAX_PARAM1VALUES = 70;
const int HAS_SUBTYPE = 1;
const int HAS_COSTTABLE = 2;
const int HAS_PARAM1 = 4;
const int STRREF_YES = 4752; // "Yes"
const int STRREF_NO = 4753; // "No"
const string PRC_CRAFT_ITEM = "PRC_CRAFT_ITEM";
const string PRC_CRAFT_TYPE = "PRC_CRAFT_TYPE";
const string PRC_CRAFT_SUBTYPE = "PRC_CRAFT_SUBTYPE";
const string PRC_CRAFT_SUBTYPEVALUE = "PRC_CRAFT_SUBTYPEVALUE";
const string PRC_CRAFT_COSTTABLE = "PRC_CRAFT_COSTTABLE";
const string PRC_CRAFT_COSTTABLEVALUE = "PRC_CRAFT_COSTTABLEVALUE";
const string PRC_CRAFT_PARAM1 = "PRC_CRAFT_PARAM1";
const string PRC_CRAFT_PARAM1VALUE = "PRC_CRAFT_PARAM1VALUE";
const string PRC_CRAFT_PROPLIST = "PRC_CRAFT_PROPLIST";
const string PRC_CRAFT_COST = "PRC_CRAFT_COST";
const string PRC_CRAFT_XP = "PRC_CRAFT_XP";
const string PRC_CRAFT_TIME = "PRC_CRAFT_TIME";
//const string PRC_CRAFT_BLUEPRINT = "PRC_CRAFT_BLUEPRINT";
const string PRC_CRAFT_CONVO_ = "PRC_CRAFT_CONVO_";
const string PRC_CRAFT_BASEITEMTYPE = "PRC_CRAFT_BASEITEMTYPE";
const string PRC_CRAFT_AC = "PRC_CRAFT_AC";
const string PRC_CRAFT_MIGHTY = "PRC_CRAFT_MIGHTY";
const string PRC_CRAFT_MATERIAL = "PRC_CRAFT_MATERIAL";
const string PRC_CRAFT_TAG = "PRC_CRAFT_TAG";
const string PRC_CRAFT_LINE = "PRC_CRAFT_LINE";
const string PRC_CRAFT_FILE = "PRC_CRAFT_FILE";
const string PRC_CRAFT_MAGIC_ENHANCE = "PRC_CRAFT_MAGIC_ENHANCE";
const string PRC_CRAFT_MAGIC_ADDITIONAL = "PRC_CRAFT_MAGIC_ADDITIONAL";
const string PRC_CRAFT_MAGIC_EPIC = "PRC_CRAFT_MAGIC_EPIC";
const string PRC_CRAFT_SCRIPT_STATE = "PRC_CRAFT_SCRIPT_STATE";
const string ARTIFICER_PREREQ_RACE = "ARTIFICER_PREREQ_RACE";
const string ARTIFICER_PREREQ_ALIGN = "ARTIFICER_PREREQ_ALIGN";
const string ARTIFICER_PREREQ_CLASS = "ARTIFICER_PREREQ_CLASS";
const string ARTIFICER_PREREQ_SPELL1 = "ARTIFICER_PREREQ_SPELL1";
const string ARTIFICER_PREREQ_SPELL2 = "ARTIFICER_PREREQ_SPELL2";
const string ARTIFICER_PREREQ_SPELL3 = "ARTIFICER_PREREQ_SPELL3";
const string ARTIFICER_PREREQ_SPELLOR1 = "ARTIFICER_PREREQ_SPELLOR1";
const string ARTIFICER_PREREQ_SPELLOR2 = "ARTIFICER_PREREQ_SPELLOR2";
const string ARTIFICER_PREREQ_COMPLETE = "ARTIFICER_PREREQ_COMPLETE";
const int PRC_CRAFT_STATE_NORMAL = 1;
const int PRC_CRAFT_STATE_MAGIC = 2;
const string PRC_CRAFT_HB = "PRC_CRAFT_HB";
const int SORT = TRUE; // If the sorting takes too much CPU, set to FALSE
const int DEBUG_LIST = FALSE;
//////////////////////////////////////////////////
/* Function defintions */
//////////////////////////////////////////////////
void PrintList(object oPC)
{
string tp = "Printing list:\n";
string s = GetLocalString(oPC, "ForgeConvo_List_Head");
if(s == ""){
tp += "Empty\n";
}
else{
tp += s + "\n";
s = GetLocalString(oPC, "ForgeConvo_List_Next_" + s);
while(s != ""){
tp += "=> " + s + "\n";
s = GetLocalString(oPC, "ForgeConvo_List_Next_" + s);
}
}
DoDebug(tp);
}
/**
* Creates a linked list of entries that is sorted into alphabetical order
* as it is built.
* Assumption: Power names are unique.
*
* @param oPC The storage object aka whomever is gaining powers in this conversation
* @param sChoice The choice string
* @param nChoice The choice value
*/
void AddToTempList(object oPC, string sChoice, int nChoice)
{
if(DEBUG_LIST) DoDebug("\nAdding to temp list: '" + sChoice + "' - " + IntToString(nChoice));
if(DEBUG_LIST) PrintList(oPC);
// If there is nothing yet
if(!GetLocalInt(oPC, "PRC_CRAFT_CONVO_ListInited"))
{
SetLocalString(oPC, "PRC_CRAFT_CONVO_List_Head", sChoice);
SetLocalInt(oPC, "PRC_CRAFT_CONVO_List_" + sChoice, nChoice);
SetLocalInt(oPC, "PRC_CRAFT_CONVO_ListInited", TRUE);
}
else
{
// Find the location to instert into
string sPrev = "", sNext = GetLocalString(oPC, "PRC_CRAFT_CONVO_List_Head");
while(sNext != "" && StringCompare(sChoice, sNext) >= 0)
{
if(DEBUG_LIST) DoDebug("Comparison between '" + sChoice + "' and '" + sNext + "' = " + IntToString(StringCompare(sChoice, sNext)));
sPrev = sNext;
sNext = GetLocalString(oPC, "PRC_CRAFT_CONVO_List_Next_" + sNext);
}
// Insert the new entry
// Does it replace the head?
if(sPrev == "")
{
if(DEBUG_LIST) DoDebug("New head");
SetLocalString(oPC, "PRC_CRAFT_CONVO_List_Head", sChoice);
}
else
{
if(DEBUG_LIST) DoDebug("Inserting into position between '" + sPrev + "' and '" + sNext + "'");
SetLocalString(oPC, "PRC_CRAFT_CONVO_List_Next_" + sPrev, sChoice);
}
SetLocalString(oPC, "PRC_CRAFT_CONVO_List_Next_" + sChoice, sNext);
SetLocalInt(oPC, "PRC_CRAFT_CONVO_List_" + sChoice, nChoice);
}
}
/**
* Reads the linked list built with AddToTempList() to AddChoice() and
* deletes it.
*
* @param oPC A PC gaining powers at the moment
*/
void TransferTempList(object oPC)
{
string sChoice = GetLocalString(oPC, "PRC_CRAFT_CONVO_List_Head");
int nChoice = GetLocalInt (oPC, "PRC_CRAFT_CONVO_List_" + sChoice);
DeleteLocalString(oPC, "PRC_CRAFT_CONVO_List_Head");
string sPrev;
if(DEBUG_LIST) DoDebug("Head is: '" + sChoice + "' - " + IntToString(nChoice));
while(sChoice != "")
{
// Add the choice
AddChoice(sChoice, nChoice, oPC);
// Get next
sChoice = GetLocalString(oPC, "PRC_CRAFT_CONVO_List_Next_" + (sPrev = sChoice));
nChoice = GetLocalInt (oPC, "PRC_CRAFT_CONVO_List_" + sChoice);
if(DEBUG_LIST) DoDebug("Next is: '" + sChoice + "' - " + IntToString(nChoice) + "; previous = '" + sPrev + "'");
// Delete the already handled data
DeleteLocalString(oPC, "PRC_CRAFT_CONVO_List_Next_" + sPrev);
DeleteLocalInt (oPC, "PRC_CRAFT_CONVO_List_" + sPrev);
}
DeleteLocalInt(oPC, "PRC_CRAFT_CONVO_ListInited");
}
//Returns the next conversation stage according
// to item property
int GetNextItemPropStage(int nStage, object oPC, int nPropList)
{
nStage++;
if(nStage == STAGE_SELECT_SUBTYPE && !(nPropList & HAS_SUBTYPE))
nStage++;
if(nStage == STAGE_SELECT_COSTTABLEVALUE && !(nPropList & HAS_COSTTABLE))
nStage++;
if(nStage == STAGE_SELECT_PARAM1VALUE && !(nPropList & HAS_PARAM1))
nStage++;
MarkStageNotSetUp(nStage, oPC);
return nStage;
}
//Returns the previous conversation stage according
// to item property
int GetPrevItemPropStage(int nStage, object oPC, int nPropList)
{
nStage--;
if(nStage == STAGE_SELECT_PARAM1VALUE && !(nPropList & HAS_PARAM1))
nStage--;
if(nStage == STAGE_SELECT_COSTTABLEVALUE && !(nPropList & HAS_COSTTABLE))
nStage--;
if(nStage == STAGE_SELECT_SUBTYPE && !(nPropList & HAS_SUBTYPE))
nStage--;
MarkStageNotSetUp(nStage, oPC);
return nStage;
}
//hardcoded to save time/prevent tmi
int SkipLineSpells(int i)
{
switch(i)
{
//i +2
case 3:
case 6:
case 16:
case 22:
case 26:
case 29:
case 38:
case 41:
case 44:
case 58:
case 61:
case 64:
case 70:
case 73:
case 79:
case 82:
case 96:
case 111:
case 116:
case 134:
case 145:
case 165:
case 185:
case 193:
case 202:
case 289:
case 292:
case 295:
case 312:
case 516:
case 1017:
case 1038:
case 1041:
case 1068:
case 1082:
case 1090:
case 1099:
case 1104:
case 1107:
case 1134:
case 1363:
case 1430:
case 1435: i = i + 2; break;
//i +1
case 10:
case 12:
case 19:
case 21:
case 24:
case 32:
case 34:
case 36:
case 47:
case 51:
case 53:
case 56:
case 67:
case 85:
case 91:
case 93:
case 102:
case 107:
case 109:
case 114:
case 124:
case 132:
case 138:
case 141:
case 156:
case 163:
case 181:
case 191:
case 196:
case 199:
case 214:
case 218:
case 220:
case 222:
case 224:
case 235:
case 237:
case 248:
case 252:
case 256:
case 258:
case 263:
case 276:
case 285:
case 306:
case 309:
case 315:
case 325:
case 397:
case 462:
case 475:
case 485:
case 514:
case 949:
case 953:
case 1001:
case 1003:
case 1005:
case 1007:
case 1009:
case 1011:
case 1013:
case 1020:
case 1031:
case 1034:
case 1043:
case 1045:
case 1048:
case 1050:
case 1052:
case 1055:
case 1057:
case 1059:
case 1061:
case 1063:
case 1076:
case 1078:
case 1086:
case 1088:
case 1095:
case 1097:
case 1102:
case 1111:
case 1113:
case 1119:
case 1121:
case 1124:
case 1126:
case 1128:
case 1145:
case 1147:
case 1196:
case 1205:
case 1215:
case 1260:
case 1350: i = i + 1; break;
case 173: i = 179; break;
case 317: i = 321; break;
case 328: i = 345; break;
case 359: i = 360; break;
case 400: i = 450; break;
case 487: i = 514; break;
case 520: i = 538; break;
case 540: i = 899; break;
case 902: i = 903; break;
case 914: i = 928; break;
case 967: i = 1000; break;
case 1366: i = 1369; break;
case 1389: i = 1416; break;
}
return i;
}
//added by MSB - hardcoded to prevent TMI
int SkipLineFeats(int i)
{
switch (i)
{
case 40: i = 99; break;
case 141: i = 201; break;
case 213: i = 257; break;
case 259: i = 260; break;
case 262: i = 264; break;
case 266: i = 343; break;
case 381: i = 394; break;
case 395: i = 24813; break;
}
return i;
}
//hardcoded to save time/prevent tmi
int SkipLineItemprops(int i)
{
switch(i)
{
case 94: i = 100; break;
case 102: i = 133; break;
case 135: i = 150; break;
case 151: i = 200; break;
}
return i;
}
//Adds names to a list based on sTable (2da), delayed recursion
// to avoid TMI
void PopulateList(object oPC, int MaxValue, int bSort, string sTable, object oItem = OBJECT_INVALID, int i = 0)
{
if(GetLocalInt(oPC, "DynConv_Waiting") == FALSE)
return;
if(i <= MaxValue)
{
int bValid = TRUE;
string sTemp = "";
if(sTable == "iprp_spells")
{
i = SkipLineSpells(i);
MaxValue = 1150; //MSB changed this from 540
}
else if(sTable == "IPRP_FEATS")
{
MaxValue = 24819;
i = SkipLineFeats(i);
}
else if(sTable == "itempropdef")
{
i = SkipLineItemprops(i);
bValid = ValidProperty(oItem, i);
if(bValid)
bValid = !GetPRCSwitch("PRC_CRAFT_DISABLE_itempropdef_" + IntToString(i));
}
else if(GetStringLeft(sTable, 6) == "craft_")
bValid = array_get_int(oPC, PRC_CRAFT_ITEMPROP_ARRAY, i);
sTemp = Get2DACache(sTable, "Name", i);
if((sTemp != "") && bValid)//this is going to kill
{
if(sTable == "iprp_spells")
{
AddToTempList(oPC, ActionString(GetStringByStrRef(StringToInt(sTemp))), i);
}
else
{
if(bSort)
AddToTempList(oPC, ActionString(GetStringByStrRef(StringToInt(sTemp))), i);
else
AddChoice(ActionString(GetStringByStrRef(StringToInt(sTemp))), i, oPC);
}
}
if(!(i % 100) && i) //i != 0, i % 100 == 0
//following line is for debugging
//FloatingTextStringOnCreature(sTable, oPC, FALSE);
FloatingTextStringOnCreature("*Tick*", oPC, FALSE);
}
else
{
if(bSort) TransferTempList(oPC);
DeleteLocalInt(oPC, "DynConv_Waiting");
FloatingTextStringOnCreature("*Done*", oPC, FALSE);
return;
}
DelayCommand(0.01, PopulateList(oPC, MaxValue, bSort, sTable, oItem, i + 1));
}
//use heartbeat
void ApplyProperties(object oPC, object oItem, itemproperty ip, int nCost, int nXP, string sFile, int nLine)
{
if(GetGold(oPC) < nCost)
{
FloatingTextStringOnCreature("Crafting: Insufficient gold!", oPC);
return;
}
int nHD = GetHitDice(oPC);
int nMinXP = nHD * (nHD - 1) * 500;
int nCurrentXP = GetXP(oPC);
if((nCurrentXP - nMinXP) < nXP)
{
FloatingTextStringOnCreature("Crafting: Insufficient XP!", oPC);
return;
}
if(GetItemPossessor(oItem) != oPC)
{
FloatingTextStringOnCreature("Crafting: You do not have the item!", oPC);
return;
}
if(nLine == -1)
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
else if(nLine == -2)
{ //clone item
CopyItem(oItem, oPC, TRUE);
}
else
{
string sPropertyType = Get2DACache(sFile, "PropertyType", nLine);
if(sPropertyType == "M")
{ //checking required spells
if(!CheckCraftingSpells(oPC, sFile, nLine, TRUE))
{
FloatingTextStringOnCreature("Crafting: Required spells not available!", oPC);
return;
}
}
else if(sPropertyType == "P")
{
if(!CheckCraftingPowerPoints(oPC, sFile, nLine, TRUE))
{
FloatingTextStringOnCreature("Crafting: Insufficient power points!", oPC);
return;
}
}
ApplyItemProps(oItem, sFile, nLine);
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_BREACH), oPC);
TakeGoldFromCreature(nCost, oPC, TRUE);
SetXP(oPC, GetXP(oPC) - nXP);
}
//use heartbeat
void CreateGolem(object oPC, int nCost, int nXP, string sFile, int nLine)
{
if(GetGold(oPC) < nCost)
{
FloatingTextStringOnCreature("Crafting: Insufficient gold!", oPC);
return;
}
int nHD = GetHitDice(oPC);
int nMinXP = nHD * (nHD - 1) * 500;
int nCurrentXP = GetXP(oPC);
if((nCurrentXP - nMinXP) < nXP)
{
FloatingTextStringOnCreature("Crafting: Insufficient XP!", oPC);
return;
}
string sPropertyType = Get2DACache(sFile, "CasterType", nLine);
if(sPropertyType == "M")
{ //checking required spells
if(!CheckCraftingSpells(oPC, sFile, nLine, TRUE))
{
FloatingTextStringOnCreature("Crafting: Required spells not available!", oPC);
return;
}
}
else if(sPropertyType == "P")
{
if(!CheckCraftingPowerPoints(oPC, sFile, nLine, TRUE))
{
FloatingTextStringOnCreature("Crafting: Insufficient power points!", oPC);
return;
}
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_BREACH), oPC);
TakeGoldFromCreature(nCost, oPC, TRUE);
SetXP(oPC, GetXP(oPC) - nXP);
}
int ArtificerPrereqCheck(object oPC, string sFile, int nLine, int nCost)
{
string sTemp, sSub, sSpell;
int nRace, nAlignGE, nAlignLC, nClass, i, j, bBreak, nLength, nPosition, nTemp;
int nSpell1, nSpell2, nSpell3, nSpellOR1, nSpellOR2;
int nDays = nCost / 1000; //one set of UMD checks per "day" spent crafting
if(nCost % 1000) nDays++;
sTemp = Get2DACache(sFile, "PrereqMisc", nLine);
sSpell = Get2DACache(sFile, "Spells", nLine);
if(sTemp == "")
{
bBreak = TRUE;
nRace = -1;
nAlignGE = -1;
nAlignLC = -1;
nClass = -1;
}
nLength = GetStringLength(sTemp);
for(i = 0; i < 5; i++)
{
if(bBreak)
break;
nPosition = FindSubString(sTemp, "_");
sSub = (nPosition == -1) ? sTemp : GetStringLeft(sTemp, nPosition);
nLength -= (nPosition + 1);
if(sSub == "*")
nTemp = -1;
else
nTemp = StringToInt(sSub);
switch(i)
{
case 0:
{
nRace = (MyPRCGetRacialType(oPC) == nTemp) ? -1 : nTemp;
break;
}
case 1:
{
//can't emulate feat requirement
break;
}
case 2:
{
nAlignGE = -1;
if(sSub == "G") nAlignGE = (GetAlignmentGoodEvil(oPC) == ALIGNMENT_GOOD) ? -1 : ALIGNMENT_GOOD;
else if(sSub == "E") nAlignGE = (GetAlignmentGoodEvil(oPC) == ALIGNMENT_EVIL) ? -1 : ALIGNMENT_EVIL;
else if(sSub == "N") nAlignGE = (GetAlignmentGoodEvil(oPC) == ALIGNMENT_NEUTRAL) ? -1 : ALIGNMENT_NEUTRAL;
break;
}
case 3:
{
nAlignLC = -1;
if(sSub == "L") nAlignLC = (GetAlignmentLawChaos(oPC) == ALIGNMENT_LAWFUL) ? -1 : ALIGNMENT_LAWFUL;
if(sSub == "C") nAlignLC = (GetAlignmentLawChaos(oPC) == ALIGNMENT_CHAOTIC) ? -1 : ALIGNMENT_CHAOTIC;
if(sSub == "N") nAlignLC = (GetAlignmentLawChaos(oPC) == ALIGNMENT_NEUTRAL) ? -1 : ALIGNMENT_NEUTRAL;
break;
}
case 4:
{
nClass = (GetLevelByClass(nTemp, oPC)) ? -1 : nTemp;
break;
}
}
sTemp = GetSubString(sTemp, nPosition + 1, nLength);
}
if(sSpell == "")
{
nSpell1 = -1;
nSpell2 = -1;
nSpell3 = -1;
nSpellOR1 = -1;
nSpellOR2 = -1;
}
else
{
for(i = 0; i < 5; i++)
{
nPosition = FindSubString(sTemp, "_");
sSub = (nPosition == -1) ? sTemp : GetStringLeft(sTemp, nPosition);
nLength -= (nPosition + 1);
if(sSub == "*")
nTemp = -1;
else
{
nTemp = StringToInt(sSub);
switch(i)
{
case 0:
{ //storing the spell level and assuming it's a valid number
nSpell1 = (PRCGetHasSpell(nTemp, oPC)) ? -1 : StringToInt(Get2DACache("spells", "Innate", nTemp)) + 20;
break;
}
case 1:
{
nSpell2 = (PRCGetHasSpell(nTemp, oPC)) ? -1 : StringToInt(Get2DACache("spells", "Innate", nTemp)) + 20;
break;
}
case 2:
{
nSpell3 = (PRCGetHasSpell(nTemp, oPC)) ? -1 : StringToInt(Get2DACache("spells", "Innate", nTemp)) + 20;
break;
}
case 3:
{
nSpellOR1 = (PRCGetHasSpell(nTemp, oPC)) ? -1 : StringToInt(Get2DACache("spells", "Innate", nTemp)) + 20;
break;
}
case 4:
{
nSpellOR2 = (PRCGetHasSpell(nTemp, oPC)) ? -1 : StringToInt(Get2DACache("spells", "Innate", nTemp)) + 20;
break;
}
}
}
sTemp = GetSubString(sTemp, nPosition + 1, nLength);
}
}
int bTake10 = GetHasFeat(FEAT_SKILL_MASTERY_ARTIFICER, oPC) ? 10 : -1;
for(i = 0; i <= nDays; i++) //with extra last-ditch roll
{
if((nRace == -1) &&
(nAlignGE == -1) &&
(nAlignLC == -1) &&
(nClass == -1) &&
(nSpell1 == -1) &&
(nSpell2 == -1) &&
(nSpell3 == -1) &&
(nSpellOR1 == -1) &&
(nSpellOR2 == -1)
)
return TRUE;
if(nRace != -1) nRace = (GetPRCIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, 25, bTake10)) ? -1 : nRace;
if(nAlignGE != -1) nAlignGE = (GetPRCIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, 30, bTake10)) ? -1 : nAlignGE;
if(nAlignLC != -1) nAlignLC = (GetPRCIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, 30, bTake10)) ? -1 : nAlignLC;
if(nClass != -1) nClass = (GetPRCIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, 21, bTake10)) ? -1 : nClass;
if(nSpell1 != -1) nSpell1 = (GetPRCIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, nSpell1, bTake10)) ? -1 : nSpell1;
if(nSpell2 != -1) nSpell2 = (GetPRCIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, nSpell2, bTake10)) ? -1 : nSpell2;
if(nSpell3 != -1) nSpell3 = (GetPRCIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, nSpell3, bTake10)) ? -1 : nSpell3;
if(nSpellOR1 != -1) nSpellOR1 = (GetPRCIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, nSpellOR1, bTake10)) ? -1 : nSpellOR1;
if(nSpellOR2 != -1) nSpellOR2 = (GetPRCIsSkillSuccessful(oPC, SKILL_USE_MAGIC_DEVICE, nSpellOR2, bTake10)) ? -1 : nSpellOR2;
}
if((nRace == -1) &&
(nAlignGE == -1) &&
(nAlignLC == -1) &&
(nClass == -1) &&
(nSpell1 == -1) &&
(nSpell2 == -1) &&
(nSpell3 == -1) &&
(nSpellOR1 == -1) &&
(nSpellOR2 == -1)
)
return TRUE;
else
return FALSE; //made all the UMD rolls allocated and still failed
}
void CraftingHB(object oPC, object oItem, itemproperty ip, int nCost, int nXP, string sFile, int nLine, int nRounds)
{
if(GetBreakConcentrationCheck(oPC))
{
FloatingTextStringOnCreature("Crafting: Concentration lost!", oPC);
DeleteLocalInt(oPC, PRC_CRAFT_HB);
RemoveEventScript(oPC, EVENT_VIRTUAL_ONDAMAGED, "prc_od_conc");
return;
}
if(nRounds == 0 || GetPCPublicCDKey(oPC) == "") //default to zero time if single player
{
RemoveEventScript(oPC, EVENT_VIRTUAL_ONDAMAGED, "prc_od_conc");
if(GetLevelByClass(CLASS_TYPE_ARTIFICER, oPC))
{
if(!ArtificerPrereqCheck(oPC, sFile, nLine, nCost))
{
FloatingTextStringOnCreature("Crafting Failed!", oPC);
DeleteLocalInt(oPC, PRC_CRAFT_HB);
TakeGoldFromCreature(nCost, oPC, TRUE);
SetXP(oPC, PRCMax(GetXP(oPC) - nXP, GetHitDice(oPC) * (GetHitDice(oPC) - 1) * 500)); //can't delevel
return;
}
}
FloatingTextStringOnCreature("Crafting Complete!", oPC);
DeleteLocalInt(oPC, PRC_CRAFT_HB);
//if(GetIsItemPropertyValid(ip))
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")
{
}
}
else
{
FloatingTextStringOnCreature("Crafting: " + IntToString(nRounds) + " round(s) remaining", oPC);
DelayCommand(6.0, CraftingHB(oPC, oItem, ip, nCost, nXP, sFile, nLine, nRounds - 1));
}
}
void main()
{
@@ -1882,6 +1083,17 @@ void main()
TakeGoldFromCreature(GetLocalInt(oPC, PRC_CRAFT_COST), oPC, TRUE);
if(GetCraftingFeat(oNewItem) != FEAT_CRAFT_ARMS_ARMOR)
{
// Add this in prc_craft.nss where crafting is confirmed
int nTimeScale = GetPRCSwitch(PRC_CRAFTING_TIME_SCALE);
SendMessageToPC(oPC, "DEBUG: PRC_CRAFTING_TIME_SCALE = " + IntToString(nTimeScale));
int nBaseTime = GetCraftingTime(nCost);
SendMessageToPC(oPC, "DEBUG: Base crafting time = " + IntToString(nBaseTime) + " rounds");
int nFeat = GetCraftingFeat(oItem);
int nModifiedTime = GetModifiedTimeCost(nBaseTime, oPC, nFeat);
SendMessageToPC(oPC, "DEBUG: Modified crafting time = " + IntToString(nModifiedTime) + " rounds");
SetLocalInt(oPC, "PRC_CRAFT_REMOVE_MASTERWORK", TRUE);
CopyItem(oNewItem, oPC, TRUE);
}
@@ -1907,12 +1119,37 @@ void main()
nStage = STAGE_BANE;
MarkStageNotSetUp(nStage, oPC);
}
else if(nChoice == CHOICE_CONFIRM)
{
SetLocalInt(oPC, PRC_CRAFT_HB, 1);
CraftingHB(oPC, oItem, ip, nCost, nXP, sFile, nLine, nTime);
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else if(nChoice == CHOICE_CONFIRM)
{
// Save the item's UUID when crafting begins
object oItem = GetLocalObject(oPC, PRC_CRAFT_ITEM);
string sItemUUID = GetObjectUUID(oItem);
SQLocalsPlayer_SetString(oPC, "crafting_item_uuid", sItemUUID);
SQLocalsPlayer_SetString(oPC, "crafting_item_name", GetName(oItem));
// Construct the item property for this crafting session
int nType = GetLocalInt(oPC, PRC_CRAFT_TYPE);
int nSubTypeValue = GetLocalInt(oPC, PRC_CRAFT_SUBTYPEVALUE);
int nCostTableValue = GetLocalInt(oPC, PRC_CRAFT_COSTTABLEVALUE);
int nParam1Value = GetLocalInt(oPC, PRC_CRAFT_PARAM1VALUE);
itemproperty ip;
if(nType > 0)
{
ip = ConstructIP(nType, nSubTypeValue, nCostTableValue, nParam1Value);
}
// Store IP components for persistence
SetLocalInt(oPC, "PRC_CRAFT_IP_TYPE", nType);
SetLocalInt(oPC, "PRC_CRAFT_IP_SUBTYPE", nSubTypeValue);
SetLocalInt(oPC, "PRC_CRAFT_IP_COSTTABLE", nCostTableValue);
SetLocalInt(oPC, "PRC_CRAFT_IP_PARAM1", nParam1Value);
SetLocalInt(oPC, PRC_CRAFT_HB, 1);
SQLocalsPlayer_SetInt(oPC, "crafting_active", 1);
CraftingHB(oPC, oItem, ip, nCost, nXP, sFile, nLine, nTime);
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
break;
}
case STAGE_APPEARANCE:

View File

@@ -13,10 +13,10 @@ void main()
object oPC = PRCGetSpellTargetObject();
object oWeap = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
effect eDam = EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_DIVINE);
effect eAC = EffectACIncrease(2, AC_DODGE_BONUS);
effect eAtk = EffectAttackIncrease(2);
effect eSave = EffectSavingThrowIncrease(SAVING_THROW_ALL, 2);
effect eLink = EffectLinkEffects(eDam, eAtk);
effect eLink = EffectLinkEffects(eAC, eAtk);
eLink = EffectLinkEffects(eLink, eSave);
eLink = ExtraordinaryEffect(eLink);

View File

@@ -21,6 +21,11 @@ void main()
effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_GATE);
float fDuration = HoursToSeconds(24);
int nDuration = PRCGetCasterLevel(oPC);
if (nDuration == 0)
{
nDuration = 2 * GetLevelByClass(CLASS_TYPE_DISCIPLE_OF_ASMODEUS, oPC);
}
if(GetPRCSwitch(PRC_SUMMON_ROUND_PER_LEVEL))
fDuration = RoundsToSeconds(nDuration*GetPRCSwitch(PRC_SUMMON_ROUND_PER_LEVEL));

View File

@@ -7,6 +7,12 @@
* Specifics: The Hexblade gains a dark companion. It is an illusionary creature that does not engage in combat, but all monsters near it take a -2 penalty to AC and Saves.
* Use: Selected.
*/
//::
//:: Updated by: Jaysyn
//;; Updated on: 2026-01-16 00:11:27
//::
#include "prc_inc_assoc"
void main()
@@ -28,7 +34,7 @@ void main()
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_GLOW_GREY));//VFX_DUR_PROT_PRC_SHADOW_ARMOR
eLink = EffectLinkEffects(eLink, EffectCutsceneGhost());
eLink = EffectLinkEffects(eLink, EffectEthereal());
eLink = SupernaturalEffect(eLink);
eLink = UnyieldingEffect(eLink);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oCompanion);
}

View File

@@ -9,6 +9,107 @@
#include "shd_inc_myst"
#include "prc_inc_template"
#include "prc_inc_factotum"
#include "inc_persistsql"
#include "prc_craft_cv_inc"
//:: Restore crafting state on login with offline time calculation
void RestoreCraftingStateOnLogin(object oPC)
{
if(DEBUG) DoDebug("DEBUG: RestoreCraftingStateOnLogin called for " + GetName(oPC));
// Check switch conditions
if(!(!GetPRCSwitch(PRC_DISABLE_CRAFT) &&
GetPRCSwitch(PRC_CRAFTING_TIME_SCALE) > 1))
{
if(DEBUG) DoDebug("DEBUG: Switch conditions not met for crafting restore");
return;
}
if(DEBUG) DoDebug("DEBUG: Switch conditions met, checking for saved crafting state");
if(SQLocalsPlayer_GetInt(oPC, "crafting_active"))
{
if(DEBUG) DoDebug("DEBUG: Found active crafting state, restoring...");
// Get basic crafting state
string sUUID = SQLocalsPlayer_GetString(oPC, "crafting_item_uuid");
int nRounds = SQLocalsPlayer_GetInt(oPC, "crafting_rounds");
int nCost = SQLocalsPlayer_GetInt(oPC, "crafting_cost");
int nXP = SQLocalsPlayer_GetInt(oPC, "crafting_xp");
string sFile = SQLocalsPlayer_GetString(oPC, "crafting_file");
int nLine = SQLocalsPlayer_GetInt(oPC, "crafting_line");
int nIPType = SQLocalsPlayer_GetInt(oPC, "crafting_ip_type");
int nIPSubtype = SQLocalsPlayer_GetInt(oPC, "crafting_ip_subtype");
int nIPCostTable = SQLocalsPlayer_GetInt(oPC, "crafting_ip_costtable");
int nIPParam1 = SQLocalsPlayer_GetInt(oPC, "crafting_ip_param1");
if(DEBUG) DoDebug("DEBUG: Initial data - UUID: " + sUUID + ", rounds: " + IntToString(nRounds) +
", cost: " + IntToString(nCost) + ", xp: " + IntToString(nXP));
// Calculate offline progress
int nLogoutTime = SQLocalsPlayer_GetInt(oPC, "crafting_last_timestamp");
int nCurrentTime = GetCurrentUnixTimestamp();
if(DEBUG) DoDebug("prc_onenter >> : RestoreCraftingStateOnLogin() | GetCurrentUnixTimestamp is:" + IntToString(nCurrentTime) +".");
if(nLogoutTime > 0 && nCurrentTime > nLogoutTime)
{
// Calculate real time elapsed in seconds
int nSecondsOffline = nCurrentTime - nLogoutTime;
if(DEBUG) DoDebug("prc_onenter >> : RestoreCraftingStateOnLogin() | nSecondsOffline is:" + IntToString(nSecondsOffline) +".");
// Each round is always 6 seconds real time
int nRoundsOffline = nSecondsOffline / 6;
if(DEBUG) DoDebug("prc_onenter >> : RestoreCraftingStateOnLogin() | nRoundsOffline is:" + IntToString(nRoundsOffline) +".");
// Subtract offline progress from remaining rounds
nRounds -= nRoundsOffline;
if(nRounds < 1) nRounds = 1; // Minimum 1 round to finish
if(DEBUG) DoDebug("DEBUG: Offline progress - time diff: " + IntToString(nSecondsOffline) +
"s, rounds progress: " + IntToString(nRoundsOffline) +
", new rounds: " + IntToString(nRounds));
}
else
{
if(DEBUG) DoDebug("DEBUG: No valid logout time found, using saved rounds: " + IntToString(nRounds));
}
// Find the crafting item
object oItem = GetItemByUUID(oPC, sUUID);
if(GetIsObjectValid(oItem))
{
if(DEBUG) DoDebug("DEBUG: Found item, restoring crafting session");
// Reconstruct the itemproperty
itemproperty ip;
if(nIPType > 0)
{
ip = ConstructIP(nIPType, nIPSubtype, nIPCostTable, nIPParam1);
}
if(DEBUG) DoDebug("DEBUG: About to call CraftingHB with " + IntToString(nRounds) + " rounds, cost: " + IntToString(nCost) + ", xp: " + IntToString(nXP));
// Notify player
FloatingTextStringOnCreature("Resuming crafting session: " + IntToString(nRounds) + " round(s) remaining", oPC);
// Restart the crafting heartbeat with all correct parameters
AssignCommand(oPC, ClearAllActions(TRUE));
SetLocalInt(oPC, "PRC_CRAFT_RESTORED", 1);
DelayCommand(3.0, CraftingHB(oPC, oItem, ip, nCost, nXP, sFile, nLine, nRounds));
}
else
{
if(DEBUG) DoDebug("DEBUG: Failed to find item with UUID: " + sUUID);
FloatingTextStringOnCreature("Crafting session could not be restored - item not found", oPC);
// Clear the invalid crafting state
SQLocalsPlayer_SetInt(oPC, "crafting_active", 0);
}
}
else
{
if(DEBUG) DoDebug("DEBUG: No saved crafting state found");
}
}
void RestoreForsakerAbilities(object oPC)
{
@@ -160,6 +261,10 @@ void main()
//hopefully in the next update
// -Aaon Graywolf
object oPC = GetEnteringObject();
if(DEBUG) DoDebug("onEnter DEBUG: PW_LOC=" + IntToString(GetPRCSwitch(PRC_PW_LOCATION_TRACKING)) +
" DISABLE_CRAFT=" + IntToString(GetPRCSwitch(PRC_DISABLE_CRAFT)) +
" TIME_SCALE=" + IntToString(GetPRCSwitch(PRC_CRAFTING_TIME_SCALE)));
//FloatingTextStringOnCreature("PRC on enter was called", oPC, FALSE);
@@ -448,4 +553,17 @@ void main()
// Start the PC HeartBeat for PC's
if(GetIsPC(oPC))
AssignCommand(GetModule(), ExecuteScript("prc_onhb_indiv", oPC));
// Only restore crafting state if PW features and PnP crafting are enabled
if(!GetPRCSwitch(PRC_DISABLE_CRAFT) &&
GetPRCSwitch(PRC_CRAFTING_TIME_SCALE) > 1)
{
if(DEBUG) DoDebug("prc_onenter: Calling RestoreCraftingStateOnLogin in 6 seconds.");
DelayCommand(6.0, RestoreCraftingStateOnLogin(oPC));
//if(DEBUG) DoDebug("DEBUG: About to call RestoreCraftingStateOnLogin immediately");
//RestoreCraftingStateOnLogin(oPC);
}
//:: Display PRC8 version
FloatingTextStringOnCreature("PRC8 Version: " + PRC_VERSION, oPC, FALSE);
}

View File

@@ -4,11 +4,82 @@
//:://////////////////////////////////////////////
#include "prc_class_const"
#include "inc_utility"
#include "inc_persistsql"
// Save logout time when actually logging out
void SaveCraftingLogoutTime(object oPC)
{
if(DEBUG) DoDebug("SaveCraftingLogoutTime: Called for " + GetName(oPC));
// Check database first, then local int
int bCrafting = SQLocalsPlayer_GetInt(oPC, "crafting_active");
if(!bCrafting)
{
bCrafting = GetLocalInt(oPC, "PRC_CRAFT_HB");
if(DEBUG) DoDebug("SaveCraftingLogoutTime: DB crafting_active = " + IntToString(bCrafting) +
", Local PRC_CRAFT_HB = " + IntToString(GetLocalInt(oPC, "PRC_CRAFT_HB")));
}
if(bCrafting)
{
// Save the logout timestamp with fallback
int nLogoutTimestamp = GetCurrentUnixTimestamp();
if(DEBUG) DoDebug("prc_onleave >> SaveCraftingLogoutTime | nLogoutTimestamp is: " + IntToString(nLogoutTimestamp));
if(nLogoutTimestamp == 0)
{
// Fallback: use a simple counter
int nLastLogout = SQLocalsPlayer_GetInt(oPC, "crafting_last_timestamp");
nLogoutTimestamp = nLastLogout + 1;
SQLocalsPlayer_SetInt(oPC, "crafting_last_timestamp", nLogoutTimestamp);
if(DEBUG) DoDebug("SaveCraftingLogoutTime: Using fallback counter: " + IntToString(nLogoutTimestamp));
}
// Save the timestamp
SQLocalsPlayer_SetInt(oPC, "crafting_last_timestamp", nLogoutTimestamp);
// Save current rounds remaining
int nRounds = GetLocalInt(oPC, "PRC_CRAFT_TIME");
SQLocalsPlayer_SetInt(oPC, "crafting_rounds", nRounds);
// Save the crafting costs
SQLocalsPlayer_SetInt(oPC, "crafting_cost", GetLocalInt(oPC, "PRC_CRAFT_COST"));
SQLocalsPlayer_SetInt(oPC, "crafting_xp", GetLocalInt(oPC, "PRC_CRAFT_XP"));
if(nRounds > 0)
{
SQLocalsPlayer_SetInt(oPC, "crafting_rounds", nRounds);
}
if(DEBUG) DoDebug("SaveCraftingLogoutTime: Saved logout timestamp " + IntToString(nLogoutTimestamp) + ", rounds remaining: " + IntToString(nRounds));
SQLocalsPlayer_SetString(oPC, "crafting_file", GetLocalString(oPC, "PRC_CRAFT_FILE"));
SQLocalsPlayer_SetInt(oPC, "crafting_line", GetLocalInt(oPC, "PRC_CRAFT_LINE"));
// Remove concentration monitoring and clear heartbeat
RemoveEventScript(oPC, EVENT_VIRTUAL_ONDAMAGED, "prc_od_conc");
DeleteLocalInt(oPC, "PRC_CRAFT_HB");
}
else
{
if(DEBUG) DoDebug("SaveCraftingLogoutTime: Player not crafting, skipping");
}
}
void main()
{
//:: Execute scripts hooked to this event for the player triggering it
//:: Execute scripts hooked to this event for the player triggering it
object oPC = GetExitingObject();
AssignCommand(GetModule(), DelayCommand(0.1, RecalculateTime()));
string sPCName = GetName(oPC);
if (oPC == OBJECT_INVALID)
{
DoDebug("prc_onleave: oPC "+sPCName+" is invalid");
return;
}
if(DEBUG) DoDebug("prc_onleave: Player " +sPCName+ " leaving");
AssignCommand(GetModule(), DelayCommand(0.1, RecalculateTime()));
//SaveCraftingLogoutTime(oPC);
ExecuteAllScriptsHookedToEvent(oPC, EVENT_ONCLIENTLEAVE);
}

View File

@@ -102,11 +102,40 @@ void main()
case 7: nBaseDamage = IP_CONST_MONSTERDAMAGE_6d6; break;
}
//Check for existing claws, if so, nBaseDamage +=2
// Get creature size
int iSize = PRCGetCreatureSize(oTarget);
if(GetIsPolyMorphedOrShifted(oTarget) || GetPRCSwitch(PRC_APPEARANCE_SIZE))
{
iSize = PRCGetCreatureSize(oTarget) - CREATURE_SIZE_MEDIUM + 5;
}
else
{
iSize = 5; // medium
if (GetHasFeat(FEAT_TINY, oTarget)) iSize = 3;
if (GetHasFeat(FEAT_SMALL, oTarget)) iSize = 4;
if (GetHasFeat(FEAT_LARGE, oTarget)) iSize = 6;
if (GetHasFeat(FEAT_HUGE, oTarget)) iSize = 7;
iSize += PRCGetCreatureSize(oTarget) - PRCGetCreatureSize(oTarget, PRC_SIZEMASK_NONE);
if (iSize < 1) iSize = 1;
if (iSize > 9) iSize = 9;
}
// Calculate target size (2 size categories larger)
int iTargetSize = iSize + 2;
if (iTargetSize > 9) iTargetSize = 9;
// Map current claw damage to unarmed_dmg.2da row
// 1d6 = row 3 (monk level 1 progression)
int nDamageRow = 3;
// Look up damage from unarmed_dmg.2da for target size
nBaseDamage = StringToInt(Get2DACache("unarmed_dmg", "size" + IntToString(iTargetSize), nDamageRow));
/* //Check for existing claws, if so, nBaseDamage +=2
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oTarget)))
{
nBaseDamage += nBonus;
}
} */
// Get the creature weapon
oLClaw = GetClawWeapon(oPC, "PRC_UNARMED_SP", INVENTORY_SLOT_CWEAPON_L, fDuration);

View File

@@ -7169,7 +7169,7 @@ Level
Learn Secret 1/day - Grants a +10 bonus to lore
2: Command - As the spell
3: Learn Secret 2/day
4: Summon Hellcat - Summons a hellcat until dismissed
4: Summon Hellcat - Summons a hellcat.
5: Learn Secret 3/day
6: Evil Authority - Gain control of all evil creatures within 50 feet.
7: Learn Secret 4/day
@@ -7198,7 +7198,7 @@ Use: Selected.</entry>
<entry id="45418" lang="en" sex="m">Summon Hellcat</entry>
<entry id="45419" lang="en" sex="m">Type of Feat: Class Specific
Prerequisite: Disciple of Asmodeus level 4.
Specifics: Once per day, you may summon a hellcat for 24 hours. At level 9, you may summon 1d4 hellcats.
Specifics: A 4th-level disciple of Asmodeus can summon 1 hellcat once per day. This functions as a summon monster spell cast by a spellcaster of his effective caster level. A 9th-level disciple of Asmodeus gains the ability to summon 1d4 hellcats once per day. If the Disciple has no effective caster level, the duration will be 2 rounds per Disciple of Asmodeus class level.
Use: Selected.</entry>
<entry id="45420" lang="en" sex="m">Evil Authority</entry>
<entry id="45421" lang="en" sex="m">Type of Feat: Class Specific
@@ -25818,7 +25818,7 @@ Bonus Spells: The cleric gains access to the following spells at the specified s
Use: Automatic.</entry>
<entry id="50569" lang="en" sex="m">Type of Feat: Domain
Prerequisite: Access to War domain.
Granted Power: Free Martial Weapon Proficiency and Weapon Focus with the deity's favoured weapon.
Granted Power: Free Martial Weapon Proficiency and Weapon Focus with the deity's favoured weapon. These feats cannot be used as pre-requisites for classes or other feats.
Bonus Spells: The cleric gains access to the following spells at the specified spell level: Legion's Conviction (2), Legion's Shield of Faith (3), Mantle of Egregious Might (9)
Use: Once/Day.</entry>
<entry id="50570" lang="en" sex="m">Type of Feat: Domain
@@ -38249,7 +38249,7 @@ Area of Effect / Target: Spell Cone
Duration: Instant
Additional Counter Spells:
Save: Reflex 1/2
Spell Resistance: Yes
Spell Resistance: No
A cone of fire shoots forth from the caster's hands, doing 1d6 points of fire damage per caster level to all those within the area of effect, to a maximum of 10d6.</entry>
<entry id="53022" lang="en" sex="m">Disintegrate</entry>
@@ -73860,7 +73860,7 @@ A character can gain this feat multiple times. Its effects do not stack. Each ti
<entry id="202063" lang="en" sex="m">Ability Focus (Word of Changing)</entry>
<entry id="204999" lang="en" sex="m">### Start PRC8 Prestige Class Epic Expansion ###</entry>
<entry id="205000" lang="en" sex="m">Epic Eye of Gruumsh</entry>
<entry id="205001" lang="en" sex="m">You are the living embodiment of Gruumsh's savage furya one-eyed martyr whose terrible sacrifice has unlocked epic levels of brutal power. Your scarred visage and impaired sight serve as a constant reminder of your oath, granting you a glimpse into your deity's blind rage. In the heat of battle, your ferocity and unholy devotion enable you to strike terror into the hearts of your foes, as you channel the very essence of an orcish legend.
<entry id="205001" lang="en" sex="m">You are the living embodiment of Gruumsh's savage fury, a one-eyed martyr whose terrible sacrifice has unlocked epic levels of brutal power. Your scarred visage and impaired sight serve as a constant reminder of your oath, granting you a glimpse into your deity's blind rage. In the heat of battle, your ferocity and unholy devotion enable you to strike terror into the hearts of your foes, as you channel the very essence of an orcish legend.
Hit Die: d12
Skill Points at Each Additional Level: 2 + Intelligence modifier

View File

@@ -1,274 +0,0 @@
int GetFeatForSeed(int nSeedID);
int GetIPForSeed(int nSeedID);
int GetDCForSeed(int nSeedID);
int GetClassForSeed(int nSeedID);
int GetCanLearnSeed(object oPC, int nSeedID);
int GetSeedFromAbrev(string sAbrev);
string GetNameForSeed(int nSeedID);
int GetDCForSpell(int nSpellID);
int GetFeatForSpell(int nSpellID);
int GetResearchFeatForSpell(int nSpellID);
int GetIPForSpell(int nSpellID);
int GetResearchIPForSpell(int nSpellID);
int GetCastXPForSpell(int nSpellID);
string GetSchoolForSpell(int nSpellID);
int GetR1ForSpell(int nSpellID);
int GetR2ForSpell(int nSpellID);
int GetR3ForSpell(int nSpellID);
int GetR4ForSpell(int nSpellID);
string GetNameForSpell(int nSpellID);
int GetSpellFromAbrev(string sAbrev);
//////////////////////////////////////////////////
/* Includes */
//////////////////////////////////////////////////
#include "inc_utility"
//#include "inc_epicspelldef"
#include "inc_epicspells"
// SEED FUNCTIONS
int GetFeatForSeed(int nSeedID)
{
return StringToInt(Get2DACache("epicspellseeds", "FeatID", nSeedID));
}
int GetIPForSeed(int nSeedID)
{
return StringToInt(Get2DACache("epicspellseeds", "FeatIPID", nSeedID));
}
int GetDCForSeed(int nSeedID)
{
return StringToInt(Get2DACache("epicspellseeds", "DC", nSeedID));
}
int GetClassForSeed(int nSeedID)
{
return StringToInt(Get2DACache("epicspellseeds", "Class", nSeedID));
}
int GetSeedFromAbrev(string sAbrev)
{
sAbrev = GetStringLowerCase(sAbrev);
if(GetStringLeft(sAbrev, 8) == "epic_sd_")
sAbrev = GetStringRight(sAbrev, GetStringLength(sAbrev)-8);
int i = 0;
string sLabel = GetStringLowerCase(Get2DACache("epicspellseeds", "LABEL", i));
while(sLabel != "")
{
if(sAbrev == sLabel)
return i;
i++;
sLabel = GetStringLowerCase(Get2DACache("epicspellseeds", "LABEL", i));
}
return -1;
}
string GetNameForSeed(int nSeedID)
{
int nFeat = GetFeatForSeed(nSeedID);
string sName = GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", nFeat)));
return sName;
}
/*
Bit-flags set in epicspellseeds.2da in Class column
used to restrict access to epic spell seeds for some classes
ie: 13 means that only clerics, sorcerers and wizards can learn that seed (1 + 4 + 8),
all classes can use == 32767
*/
int _Class2BitFlag(int nClass)
{
switch(nClass)
{
case CLASS_TYPE_CLERIC: return 1;
case CLASS_TYPE_DRUID: return 2;
case CLASS_TYPE_SORCERER: return 4;
case CLASS_TYPE_WIZARD: return 8;
case CLASS_TYPE_HEALER: return 16;
case CLASS_TYPE_BEGUILER: return 32;
case CLASS_TYPE_SUBLIME_CHORD: return 64;
case CLASS_TYPE_DREAD_NECROMANCER: return 128;
case CLASS_TYPE_MYSTIC: return 256;
case CLASS_TYPE_ARCHIVIST: return 512;
case CLASS_TYPE_SHAMAN: return 4096;
case CLASS_TYPE_FAVOURED_SOUL: return 8192;
case CLASS_TYPE_WARMAGE: return 16384;
case CLASS_TYPE_UR_PRIEST: return 1;
case CLASS_TYPE_BLIGHTER: return 2;
}
return -1;
}
int _CheckEpicSpellcastingForClass(object oPC, int nClass)
{
if(GetHitDice(oPC) < 21)
return FALSE;
switch(nClass)
{
case CLASS_TYPE_CLERIC: return GetIsEpicCleric(oPC);
case CLASS_TYPE_DRUID: return GetIsEpicDruid(oPC);
case CLASS_TYPE_SORCERER: return GetIsEpicSorcerer(oPC);
case CLASS_TYPE_WIZARD: return GetIsEpicWizard(oPC);
case CLASS_TYPE_HEALER: return GetIsEpicHealer(oPC);
case CLASS_TYPE_BEGUILER: return GetIsEpicBeguiler(oPC);
case CLASS_TYPE_SUBLIME_CHORD: return GetIsEpicSublimeChord(oPC);
case CLASS_TYPE_DREAD_NECROMANCER: return GetIsEpicDreadNecromancer(oPC);
case CLASS_TYPE_ARCHIVIST: return GetIsEpicArchivist(oPC);
case CLASS_TYPE_SHAMAN: return GetIsEpicShaman(oPC);
case CLASS_TYPE_FAVOURED_SOUL: return GetIsEpicFavSoul(oPC);
case CLASS_TYPE_WARMAGE: return GetIsEpicWarmage(oPC);
case CLASS_TYPE_BLIGHTER: return GetIsEpicBlighter(oPC);
case CLASS_TYPE_UR_PRIEST: return GetIsEpicUrPriest(oPC);
}
return FALSE;
}
int GetCanLearnSeed(object oPC, int nSeedID)
{
int nRestr = GetClassForSeed(nSeedID);
int i, nClass;
for(i = 1; i <= 8; i++)
{
nClass = GetClassByPosition(i, oPC);
if(_CheckEpicSpellcastingForClass(oPC, nClass)//this class has epic spellcasting
&& (nRestr & _Class2BitFlag(nClass)))//and was added to class column in epicspellseeds.2da
{
return TRUE;
}
}
return FALSE;
}
// SPELL FUNCTIONS
int GetDCForSpell(int nSpellID)
{
return StringToInt(Get2DACache("epicspells", "DC", nSpellID));
}
int GetFeatForSpell(int nSpellID)
{
return StringToInt(Get2DACache("epicspells", "SpellFeatID", nSpellID));
}
int GetResearchFeatForSpell(int nSpellID)
{
return StringToInt(Get2DACache("epicspells", "ResFeatID", nSpellID));
}
int GetIPForSpell(int nSpellID)
{
return StringToInt(Get2DACache("epicspells", "SpellFeatIPID", nSpellID));
}
int GetResearchIPForSpell(int nSpellID)
{
return StringToInt(Get2DACache("epicspells", "ResFeatIPID", nSpellID));
}
int GetCastXPForSpell(int nSpellID)
{
return StringToInt(Get2DACache("epicspells", "CastingXP", nSpellID));
}
string GetSchoolForSpell(int nSpellID)
{
return Get2DACache("epicspells", "School", nSpellID);
}
int GetR1ForSpell(int nSpellID)
{
return StringToInt(Get2DACache("epicspells", "Prereq1", nSpellID));
}
int GetR2ForSpell(int nSpellID)
{
return StringToInt(Get2DACache("epicspells", "Prereq2", nSpellID));
}
int GetR3ForSpell(int nSpellID)
{
return StringToInt(Get2DACache("epicspells", "Prereq3", nSpellID));
}
int GetR4ForSpell(int nSpellID)
{
return StringToInt(Get2DACache("epicspells", "Prereq4", nSpellID));
}
int GetS1ForSpell(int nSpellID)
{
string sSeed = Get2DACache("epicspells", "PrereqSeed1", nSpellID);
if(sSeed == "")
return -1;
return StringToInt(sSeed);
}
int GetS2ForSpell(int nSpellID)
{
string sSeed = Get2DACache("epicspells", "PrereqSeed2", nSpellID);
if(sSeed == "")
return -1;
return StringToInt(sSeed);
}
int GetS3ForSpell(int nSpellID)
{
string sSeed = Get2DACache("epicspells", "PrereqSeed3", nSpellID);
if(sSeed == "")
return -1;
return StringToInt(sSeed);
}
int GetS4ForSpell(int nSpellID)
{
string sSeed = Get2DACache("epicspells", "PrereqSeed4", nSpellID);
if(sSeed == "")
return -1;
return StringToInt(sSeed);
}
int GetS5ForSpell(int nSpellID)
{
string sSeed = Get2DACache("epicspells", "PrereqSeed5", nSpellID);
if(sSeed == "")
return -1;
return StringToInt(sSeed);
}
int GetSpellFromAbrev(string sAbrev)
{
sAbrev = GetStringLowerCase(sAbrev);
if(GetStringLeft(sAbrev, 8) == "epic_sp_")
sAbrev = GetStringRight(sAbrev, GetStringLength(sAbrev)-8);
if(DEBUG) DoDebug("sAbrev to check vs: " + sAbrev);
int i = 0;
string sLabel = GetStringLowerCase(Get2DACache("epicspells", "LABEL", i));
while(sLabel != "")
{
if(DEBUG) DoDebug("sLabel to check vs: " + sLabel);
if(sAbrev == sLabel)
{
if(DEBUG) DoDebug("SpellID: " + IntToString(i));
return i;
}
i++;
sLabel = GetStringLowerCase(Get2DACache("epicspells", "LABEL", i));
}
return -1;
}
string GetNameForSpell(int nSpellID)
{
int nFeat = GetFeatForSpell(nSpellID);
string sName = GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", nFeat)));
return sName;
}
//:: void main (){}

View File

@@ -1,239 +0,0 @@
//::///////////////////////////////////////////////
//:: Rend OnHit include
//:: inc_rend
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//:: Created By: Ornedan
//:: Created On: 23.01.2005
//:://////////////////////////////////////////////
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
const string REND_1ST_HIT_DONE = "RendingHit1stHit";
const string REND_DONE = "RendingHitDone";
const string FROST_1ST_HIT_DONE = "FrostRendHit1stHit";
const string FROST_DONE = "FrostRendHitDone";
const string SPINE_1ST_HIT_DONE = "SpineRendHit1stHit";
const string SPINE_DONE = "SpineRendHitDone";
int GetMainHandAttacks(object oPC, int iBABBonus = 0, int bIgnoreCrossBow = FALSE);
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
void DoRend(object oTarget, object oAttacker, object oWeapon);
int GetDamageFromConstant(int nIPConst);
void DoFrostRend(object oTarget, object oAttacker, object oWeapon);
#include "moi_inc_moifunc"
//////////////////////////////////////////////////
/* Function defintions */
//////////////////////////////////////////////////
void DoRend(object oTarget, object oAttacker, object oWeapon)
{
if (DEBUG) DoDebug("DoRend running");
// Only one rend allowed per round for the sake of clearness
if(GetLocalInt(oAttacker, REND_DONE))
return;
if(GetLocalObject(oAttacker, REND_1ST_HIT_DONE) == oTarget)
{
if (DEBUG) DoDebug("DoRend second hit");
// First, find the weapon base damage
int nIPConst;
itemproperty ipCheck = GetFirstItemProperty(oWeapon);
while(GetIsItemPropertyValid(ipCheck))
{
if(GetItemPropertyType(ipCheck) == ITEM_PROPERTY_MONSTER_DAMAGE)
{
nIPConst = GetItemPropertyCostTableValue(ipCheck);
break;
}
ipCheck = GetNextItemProperty(oWeapon);
}
int nDamage = GetDamageFromConstant(nIPConst);
int nStrBon = GetAbilityModifier(ABILITY_STRENGTH, oAttacker);
nStrBon = nStrBon < 0 ? 0 : nStrBon;
nDamage += nStrBon;
if (GetLevelByClass(CLASS_TYPE_BLACK_BLOOD_CULTIST, oAttacker) >= 6) nDamage *= 2;
if (GetIsMeldBound(oAttacker, MELD_GIRALLON_ARMS) == CHAKRA_ARMS) nDamage *= 2;
if (GetHasSpellEffect(VESTIGE_IPOS, oAttacker) >= 6) nDamage *= 2;
int nDamageType;
switch(GetBaseItemType(oWeapon))
{
case BASE_ITEM_CBLUDGWEAPON:
nDamageType = DAMAGE_TYPE_BLUDGEONING;
break;
case BASE_ITEM_CPIERCWEAPON:
nDamageType = DAMAGE_TYPE_PIERCING;
break;
// Both slashing and slashing & piercing weapons do slashing damage from rend
// because it's not possible to make the damage be of both types in any
// elegant way
case BASE_ITEM_CSLASHWEAPON:
case BASE_ITEM_CSLSHPRCWEAP:
nDamageType = DAMAGE_TYPE_SLASHING;
break;
default:
WriteTimestampedLogEntry("Unexpected weapon type in DoRend()!");
return;
}
// Apply damage and VFX
effect eDamage = EffectDamage(nDamage, nDamageType);
effect eLink = EffectLinkEffects(eDamage, EffectVisualEffect(VFX_COM_BLOOD_CRT_RED));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
// Tell people what happened
// * AttackerName rends TargetName *
FloatingTextStringOnCreature("* " + GetName(oAttacker) + " " + GetStringByStrRef(0x01000000 + 51197) + " " + GetName(oTarget) + " *", oAttacker, TRUE);
// Note the rend having happened in the locals
SetLocalInt(oAttacker, REND_DONE, TRUE);
DelayCommand(4.5, DeleteLocalInt(oAttacker, REND_DONE));
}// end if - the target had a local signifying that rend is possible
else
{
SetLocalObject(oAttacker, REND_1ST_HIT_DONE, oTarget);
if (DEBUG) DoDebug("DoRend first hit");
}
}
void DoFrostRend(object oTarget, object oAttacker, object oWeapon)
{
// Only one rend allowed per round for the sake of clearness
if(GetLocalInt(oAttacker, FROST_DONE))
return;
float fDelay1 = 6.0 - (6.0 / GetMainHandAttacks(oAttacker));
float fDelay2 = 6.0 - 2 * (6.0 - fDelay1);
if(GetLocalObject(oAttacker, FROST_1ST_HIT_DONE) == oTarget)
{
// First, find the weapon base damage
int nIPConst;
itemproperty ipCheck = GetFirstItemProperty(oWeapon);
while(GetIsItemPropertyValid(ipCheck))
{
if(GetItemPropertyType(ipCheck) == ITEM_PROPERTY_MONSTER_DAMAGE)
{
nIPConst = GetItemPropertyCostTableValue(ipCheck);
break;
}
ipCheck = GetNextItemProperty(oWeapon);
}
int nDamage = GetDamageFromConstant(nIPConst);
int nStrBon = GetAbilityModifier(ABILITY_STRENGTH, oAttacker);
nStrBon = nStrBon < 0 ? 0 : nStrBon;
// nDamage += nStrBon;
// nDamage += FloatToInt(nStrBon/2); //1.5x Strength damage
nDamage += FloatToInt(nStrBon * 1.5);
int nDamageType = DAMAGE_TYPE_BLUDGEONING; // It's an unarmed strike, so always bludgeoning for this
// Apply damage and VFX
effect eDamage = EffectDamage(nDamage, nDamageType);
effect eLink = EffectLinkEffects(eDamage, EffectVisualEffect(VFX_IMP_FROST_L));
eLink = EffectLinkEffects(eLink, EffectDamage(d6(), DAMAGE_TYPE_COLD));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
// Tell people what happened
// * AttackerName rends TargetName *
FloatingTextStringOnCreature("* " + GetName(oAttacker) + " " + GetStringByStrRef(0x01000000 + 51197) + " " + GetName(oTarget) + " *",
oAttacker,
TRUE);
// Note the rend having happened in the locals
SetLocalInt(oAttacker, FROST_DONE, TRUE);
DelayCommand(fDelay2, DeleteLocalInt(oAttacker, FROST_DONE));
}// end if - the target had a local signifying that rend is possible
else
{
SetLocalObject(oAttacker, FROST_1ST_HIT_DONE, oTarget);
DelayCommand(fDelay1, DeleteLocalObject(oAttacker, FROST_1ST_HIT_DONE));
}
}
void DoSpineRend(object oTarget, object oAttacker, object oWeapon)
{
// Only one rend allowed per round for the sake of clearness
if(GetLocalInt(oAttacker, SPINE_DONE))
return;
float fDelay1 = 6.0 - (6.0 / GetMainHandAttacks(oAttacker));
float fDelay2 = 6.0 - 2 * (6.0 - fDelay1);
if(GetLocalObject(oAttacker, SPINE_1ST_HIT_DONE) == oTarget)
{
int nStrBon = GetAbilityModifier(ABILITY_STRENGTH, oAttacker);
nStrBon = nStrBon < 0 ? 0 : nStrBon;
int nDamage = FloatToInt(nStrBon * 1.5);
// Apply damage and VFX
effect eDamage = EffectDamage(nDamage + d6(2), DAMAGE_TYPE_PIERCING);
effect eLink = EffectLinkEffects(eDamage, EffectVisualEffect(VFX_COM_BLOOD_SPARK_MEDIUM));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
// Tell people what happened
// * AttackerName rends TargetName *
FloatingTextStringOnCreature("* " + GetName(oAttacker) + " " + GetStringByStrRef(0x01000000 + 51197) + " " + GetName(oTarget) + " *", oAttacker, TRUE);
// Note the rend having happened in the locals
SetLocalInt(oAttacker, SPINE_DONE, TRUE);
DelayCommand(fDelay2, DeleteLocalInt(oAttacker, SPINE_DONE));
}// end if - the target had a local signifying that rend is possible
else
{
SetLocalObject(oAttacker, SPINE_1ST_HIT_DONE, oTarget);
DelayCommand(fDelay1, DeleteLocalObject(oAttacker, SPINE_1ST_HIT_DONE));
}
}
int GetDamageFromConstant(int nIPConst)
{
// First, handle the values outside the main series
switch(nIPConst)
{
case IP_CONST_MONSTERDAMAGE_1d2: return d2(1);
case IP_CONST_MONSTERDAMAGE_1d3: return d3(1);
case IP_CONST_MONSTERDAMAGE_1d4: return d4(1);
case IP_CONST_MONSTERDAMAGE_2d4: return d4(2);
case IP_CONST_MONSTERDAMAGE_3d4: return d4(3);
case IP_CONST_MONSTERDAMAGE_4d4: return d4(4);
case IP_CONST_MONSTERDAMAGE_5d4: return d4(5);
case IP_CONST_MONSTERDAMAGE_7d4: return d4(7);
}
int nDieNum = ((nIPConst - 8) % 10) + 1;
switch((nIPConst - 8) / 10)
{
case 0: return d6(nDieNum);
case 1: return d8(nDieNum);
case 2: return d10(nDieNum);
case 3: return d12(nDieNum);
case 4: return d20(nDieNum);
}
WriteTimestampedLogEntry("Unknown IP_CONST_MONSTERDAMAGE_* constant passed to GetDamageFromConstant()!");
return 0;
}
//:: void main (){}

View File

@@ -1,384 +0,0 @@
//:://////////////////////////////////////////////
//:: Name: new spellbook spellgain / spell memorization include
//:: File: inc_sp_gain_mem.nss
//:://////////////////////////////////////////////
/**
contains helper functions for the two dynamic conversation scripts
- prc_s_spellb.nss
- prc_s_spellgain.nss
that handle learning / gaining new spells at level up (prc_s_spellgain)
or preparing what spells to learn at next rest (prc_s_spellb)
Author: motu99
Created: May 1, 2008
*/
//#include "prc_inc_core" //granted access via parent (inc_newspellbook)
#include "prc_inc_switch"
#include "inc_debug"
//:: Updated for .35 by Jaysyn 2023/03/11
//:: Test Void
//void main (){}
//:://////////////////////////////////////////////
//:: Constants
//:://////////////////////////////////////////////
// max. number of classes a PC (or creature) can take (8 for NWN, 4 for NWN2)
const int MAX_CLASSES = 8;
//////////////////////////////////////////////////
/* Aid functions */
//////////////////////////////////////////////////
string GetNSBDefinitionFileName(int nClass);
int GetCasterLevelByClass(int nClass, object oPC);
int GetSpellsKnown_MaxCount(int nCasterLevel, int nClass, int nSpellLevel, object oPC);
int GetSpellsInClassSpellbook_Count(int nClass, int nSpellLevel);
string GetClassString(int nClass);
int GetMaxSpellLevelForCasterLevel(int nClass, int nCasterLevel);
int GetMinSpellLevelForCasterLevel(int nClass, int nCasterLevel);
void WipeSpellFromHide(int nIPFeatID, object oPC);
string GetSpellsKnown_Array(int nClass, int nSpellLevel = -1);
object GetSpellsOfClass_Token(int nClass, int nSpellLevel);
string GetSpellsOfClass_Array();
string GetSpellsMemorized_Array(int nClass);
string GetSpellsToBeMemorized_Array(int nClass, int nSpellSlotLevel);
void array_set_size(object oPC, string sArrayName, int nSize);
int array_has_string(object oPC, string sArrayName, string sValue, int nFirst = 0, int nSize = 0);
int array_has_int(object oPC, string sArrayName, int nValue, int nFirst = 0, int nSize = 0);
int persistant_array_has_string(object oPC, string sArrayName, string sValue, int nFirst = 0, int nSize = 0);
int persistant_array_has_int(object oPC, string sArrayName, int nValue, int nFirst = 0, int nSize = 0);
int array_extract_string(object oPC, string sArrayName, string sValue, int nFirst = 0);
int array_extract_int(object oPC, string sArrayName, int nValue, int nFirst = 0);
int persistant_array_extract_string(object oPC, string sArrayName, string sValue, int nFirst = 0);
int persistant_array_extract_int(object oPC, string sArrayName, int nValue, int nFirst = 0);
string GetMetaMagicString_Short(int nMetaMagic);
string GetMetaMagicString(int nMetaMagic);
int GetMetaMagicFromFeat(int nFeat);
int GetMetaMagicOfCaster(object oPC = OBJECT_SELF);
string DebugIProp2Str(itemproperty iprop);
void DoDebug(string sString, object oAdditionalRecipient = OBJECT_INVALID);
int GetSpellbookTypeForClass(int nClass);
string GetFileForClass(int nClass);
int GetSpellslotLevel(int nClass, object oPC);
int GetSpellKnownMaxCount(int nCasterLevel, int nSpellLevel, int nClass, object oPC);
int persistant_array_get_size(object store, string name);
string Get2DACache(string s2DA, string sColumn, int nRow);
object GetPCSkin(object oPC);
void SetPersistantLocalInt(object oPC, string sName, int nValue);
int GetPersistantLocalInt(object oPC, string sName);
void SetPersistantLocalString(object oPC, string sName, string sValue);
string GetPersistantLocalString(object oPC, string sName);
// name of the new spellbook file (cls_spell_*)
string GetNSBDefinitionFileName(int nClass)
{
return GetFileForClass(nClass);
}
// gets the caster level (without special modifications due to feats), by which the max spell slot level is determined
int GetCasterLevelByClass(int nClass, object oPC)
{
return GetSpellslotLevel(nClass, oPC);
// return GetPrCAdjustedCasterLevel(nClass, oPC, TRUE);
}
// gets the maximum nr of spells that oPC can know with a given nCasterLevel, nClass and nSpellLevel
int GetSpellsKnown_MaxCount(int nCasterLevel, int nClass, int nSpellLevel, object oPC)
{
return GetSpellKnownMaxCount(nCasterLevel, nSpellLevel, nClass, oPC);
}
// gets the total nr of spells available at nSpellLevel for nClass
int GetSpellsInClassSpellbook_Count(int nClass, int nSpellLevel)
{
return persistant_array_get_size(GetSpellsOfClass_Token(nClass, nSpellLevel), GetSpellsOfClass_Array());
}
string GetClassString(int nClass)
{
// get the name of the feats table 2da
string sClass = Get2DACache("classes", "FeatsTable", nClass);
// truncate the first 8 characters (the "cls_feat" part), leaving the "_<class>" part
sClass = GetStringRight(sClass, GetStringLength(sClass) - 8);
return sClass;
}
// gets the maximum spell level that nClass can cast at nCasterLevel
int GetMaxSpellLevelForCasterLevel(int nClass, int nCasterLevel)
{
string sFile;
// Bioware casters use their classes.2da-specified tables
//if(GetIsBioSpellCastClass(nClass))
//{
sFile = Get2DACache("classes", "SpellGainTable", nClass);
//}
//else
//{
// sFile = "cls_spbk" + GetClassString(nClass);
//}
// row nr in the files is nCasterLevel minus 1
nCasterLevel--;
int nSpellLevel;
if (Get2DACache(sFile, "NumSpellLevels", 9) != "")
{
string sTemp = Get2DACache(sFile, "NumSpellLevels", nCasterLevel);
if (sTemp != "")
{
nSpellLevel = StringToInt(sTemp)-1;
if (nSpellLevel <= 0) nSpellLevel = 0;
}
}
else
{
for (nSpellLevel=9; nSpellLevel >= 0; nSpellLevel--)
{
string sTemp = Get2DACache(sFile, "SpellLevel" + IntToString(nSpellLevel), nCasterLevel);
if (sTemp != "")
{
break;
}
}
}
return nSpellLevel;
}
// gets the minimum spell level that nClass can cast at nCasterLevel
int GetMinSpellLevelForCasterLevel(int nClass, int nCasterLevel)
{
string sFile;
// Bioware casters use their classes.2da-specified tables
//if(GetIsBioSpellCastClass(nClass))
//{
sFile = Get2DACache("classes", "SpellGainTable", nClass);
//}
//else
//{
// sFile = "cls_spbk" + GetClassString(nClass);
//}
// row nr in the files is nCasterLevel minus 1
nCasterLevel--;
int bFound = 0;
int nSpellLevel;
for (nSpellLevel=0; nSpellLevel <= 9; nSpellLevel++)
{
string sTemp = Get2DACache(sFile, "SpellLevel" + IntToString(nSpellLevel), nCasterLevel);
if (sTemp != "")
{
bFound = TRUE;
break;
}
}
if (!bFound) nSpellLevel = -1;
return nSpellLevel;
}
// wipes the IPbonusfeat from the hide
void WipeSpellFromHide(int nIPFeatID, object oPC)
{
// go through all item properties on the hide
object oHide = GetPCSkin(oPC);
itemproperty ipTest = GetFirstItemProperty(oHide);
while(GetIsItemPropertyValid(ipTest))
{
// is it a bonus feat?
if(GetItemPropertyType(ipTest) == ITEM_PROPERTY_BONUS_FEAT)
{
// get the row nr of the bonus feat in iprp_feat.2da
// is it the ipfeat to delete?
if (GetItemPropertySubType(ipTest) == nIPFeatID)
{
RemoveItemProperty(oHide, ipTest);
if(DEBUG) DoDebug("WipeSpellFromHide: Removing item property " + DebugIProp2Str(ipTest));
}
}
ipTest = GetNextItemProperty(oHide);
}
}
// one array for each class (array holds all spell levels, but only non-metamagicked masterspells)
string GetSpellsKnown_Array(int nClass, int nSpellLevel = -1)
{
int nSpellbookType = GetSpellbookTypeForClass(nClass);
if(nSpellbookType == 1) //SPELLBOOK_TYPE_PREPARED
return "Spellbook_Known_" + IntToString(nClass) + "_" + IntToString(nSpellLevel);
return "Spellbook" + IntToString(nClass);
}
// class spellbook (one storage token for each spell level and class)
object GetSpellsOfClass_Token(int nClass, int nSpellLevel)
{
return GetObjectByTag("SpellLvl_" + IntToString(nClass) + "_Level_" + IntToString(nSpellLevel));
}
string GetSpellsOfClass_Array()
{
return "Lkup";
}
string GetSpellsMemorized_Array(int nClass)
{
return "NewSpellbookMem_" + IntToString(nClass);
}
string GetSpellsToBeMemorized_Array(int nClass, int nSpellSlotLevel)
{
return "Spellbook" + IntToString(nSpellSlotLevel) + "_" + IntToString(nClass);
}
void array_set_size(object oPC, string sArrayName, int nSize)
{
SetPersistantLocalInt(oPC, sArrayName, nSize+1);
}
int array_has_string(object oPC, string sArrayName, string sValue, int nFirst = 0, int nSize = 0)
{
// get array size, if size not already supplied
if (nSize == 0) nSize = GetPersistantLocalInt(oPC, sArrayName) -1;
int i;
for (i = nFirst; i < nSize; i++)
{
if (sValue == GetPersistantLocalString(oPC, sArrayName + "_" + IntToString(i)))
return i;
}
return -1;
}
int array_has_int(object oPC, string sArrayName, int nValue, int nFirst = 0, int nSize = 0)
{
// array values are stored as strings, so convert nValue to a string
return array_has_string(oPC, sArrayName, IntToString(nValue), nFirst, nSize);
}
int persistant_array_has_string(object oPC, string sArrayName, string sValue, int nFirst = 0, int nSize = 0)
{
return array_has_string(oPC, sArrayName, sValue, nFirst, nSize);
}
int persistant_array_has_int(object oPC, string sArrayName, int nValue, int nFirst = 0, int nSize = 0)
{
return array_has_string(oPC, sArrayName, IntToString(nValue), nFirst, nSize);
}
int array_extract_string(object oPC, string sArrayName, string sValue, int nFirst = 0)
{
// get array size
int nSize = GetPersistantLocalInt(oPC, sArrayName)-1;
if (nSize <= nFirst) return -1;
// position of the first found; -1 if not found
int nPos = array_has_string(oPC, sArrayName, sValue, nFirst, nSize);
if (nPos < 0) return -1;
// Is is not the last element?
if (nPos < nSize-1)
{
// then swap nPos (or rather nPos-1) with the last element (nSize-1)
string sTemp = GetPersistantLocalString(oPC, sArrayName + "_" + IntToString(nSize-1));
SetPersistantLocalString(oPC, sArrayName + "_" + IntToString(nPos), sTemp);
}
// now decrement the array size (note that we already subtracted one in the beginning)
SetPersistantLocalInt(oPC, sArrayName, nSize);
return nPos;
}
// extracts the integer value nValue from a persistant sArray on oPC
// extracts the first instance of nValue that it finds
// extracts it by swapping the last array element to the position of the extracted element and reducing the array size by one
// returns the position where the extracted element was found
int array_extract_int(object oPC, string sArrayName, int nValue, int nFirst = 0)
{
// array values are stored as strings, so convert nValue to a string
return array_extract_string(oPC, sArrayName, IntToString(nValue), nFirst);
}
int persistant_array_extract_string(object oPC, string sArrayName, string sValue, int nFirst = 0)
{
return array_extract_string(oPC, sArrayName, sValue, nFirst);
}
int persistant_array_extract_int(object oPC, string sArrayName, int nValue, int nFirst = 0)
{
// array values are stored as strings, so convert nValue to a string
return array_extract_string(oPC, sArrayName, IntToString(nValue), nFirst);
}
string GetMetaMagicString_Short(int nMetaMagic)
{
string s;
if (nMetaMagic == 0) return s;
if (nMetaMagic & METAMAGIC_EXTEND) s += "ext ";
if (nMetaMagic & METAMAGIC_SILENT) s += "sil ";
if (nMetaMagic & METAMAGIC_STILL) s += "sti ";
if (nMetaMagic & METAMAGIC_EMPOWER) s += "emp ";
if (nMetaMagic & METAMAGIC_MAXIMIZE) s += "max ";
if (nMetaMagic & METAMAGIC_QUICKEN) s += "qui ";
return GetStringLeft(s, GetStringLength(s)-1);
}
string GetMetaMagicString(int nMetaMagic)
{
string s;
if (nMetaMagic == 0) return s;
if (nMetaMagic & METAMAGIC_EXTEND) s += "extend ";
if (nMetaMagic & METAMAGIC_SILENT) s += "silent ";
if (nMetaMagic & METAMAGIC_STILL) s += "still ";
if (nMetaMagic & METAMAGIC_EMPOWER) s += "empower ";
if (nMetaMagic & METAMAGIC_MAXIMIZE) s += "maximize ";
if (nMetaMagic & METAMAGIC_QUICKEN) s += "quicken ";
return GetStringLeft(s, GetStringLength(s)-1);
}
int GetMetaMagicFromFeat(int nFeat)
{
switch(nFeat)
{
case FEAT_EMPOWER_SPELL: return METAMAGIC_EMPOWER;
case FEAT_EXTEND_SPELL: return METAMAGIC_EXTEND;
case FEAT_MAXIMIZE_SPELL: return METAMAGIC_MAXIMIZE;
case FEAT_QUICKEN_SPELL: return METAMAGIC_QUICKEN;
case FEAT_SILENCE_SPELL: return METAMAGIC_SILENT;
case FEAT_STILL_SPELL: return METAMAGIC_STILL;
}
return METAMAGIC_NONE;
}
int GetMetaMagicOfCaster(object oPC = OBJECT_SELF)
{
int nMetaMagic;
if (GetHasFeat(FEAT_EMPOWER_SPELL, oPC)) nMetaMagic |= METAMAGIC_EMPOWER;
if (GetHasFeat(FEAT_EXTEND_SPELL, oPC)) nMetaMagic |= METAMAGIC_EXTEND;
if (GetHasFeat(FEAT_MAXIMIZE_SPELL, oPC)) nMetaMagic |= METAMAGIC_MAXIMIZE;
if (GetHasFeat(FEAT_QUICKEN_SPELL, oPC)) nMetaMagic |= METAMAGIC_QUICKEN;
if (GetHasFeat(FEAT_SILENCE_SPELL, oPC)) nMetaMagic |= METAMAGIC_SILENT;
if (GetHasFeat(FEAT_STILL_SPELL, oPC)) nMetaMagic |= METAMAGIC_STILL;
return nMetaMagic;
}

View File

@@ -1,166 +0,0 @@
#include "prc_inc_clsfunc"
int SpellSneakAttackDamage(object oCaster, object oTarget);
int GetBlastDamageDices(object oInvoker, int nInvokerLevel)
{
int nDmgDice;
if(nInvokerLevel < 13)
nDmgDice = (nInvokerLevel + 1) / 2;
else if(nInvokerLevel < 20)
nDmgDice = (nInvokerLevel + 7) / 3;
else
nDmgDice = 9 + (nInvokerLevel - 20) / 2;
//check for the epic feats
if(GetHasFeat(FEAT_EPIC_ELDRITCH_BLAST_I, oInvoker))
{
int nFeatAmt = 0;
int bDone = FALSE;
while(!bDone)
{ if(nFeatAmt >= 9)
bDone = TRUE;
else if(GetHasFeat(FEAT_EPIC_ELDRITCH_BLAST_II + nFeatAmt, oInvoker))
nFeatAmt++;
else
bDone = TRUE;
}
nDmgDice += nFeatAmt;
}
return nDmgDice;
}
// Spellblast should use only AoE spells but Dispel Magic can be cast as AoE or single target
// we make sure here that we use AoE version
int CheckSpecialTarget(int nSpellID)
{
return nSpellID == SPELL_DISPEL_MAGIC
|| nSpellID == SPELL_GREATER_DISPELLING
|| nSpellID == SPELL_LESSER_DISPEL
|| nSpellID == SPELL_MORDENKAINENS_DISJUNCTION
|| nSpellID == SPELL_POWER_WORD_KILL;
}
void DoSpellBlast(object oPC, int bHit)
{
int nSpellbookID = GetLocalInt(oPC, "ET_SPELL_CURRENT");
//DoDebug("nSpellbookID = "+IntToString(nSpellbookID));
if(nSpellbookID)
{
object oTarget = GetSpellTargetObject();
if(GetIsObjectValid(oTarget))
{
nSpellbookID--;
DeleteLocalInt(oPC, "ET_SPELL_CURRENT");
int nSpellID = GetLocalInt(oPC, "ET_REAL_SPELL_CURRENT");
//DoDebug("nSpellID = "+IntToString(nSpellID));
string sArray = GetLocalString(oPC, "ET_SPELL_CURRENT");
//DoDebug("sArray = "+sArray);
int nUses = sArray == "" ? GetHasSpell(nSpellbookID, oPC) :
persistant_array_get_int(oPC, sArray, nSpellbookID);
if(nUses)
{
// expend spell use
if(sArray == "")
{
DecrementRemainingSpellUses(oPC, nSpellID);
}
else
{
nUses--;
persistant_array_set_int(oPC, sArray, nSpellbookID, nUses);
}
// use AoE Dispel Magic
int bTargetOverride = CheckSpecialTarget(nSpellID);
if(bHit)
{
int nCastingClass = GetETArcaneClass(oPC);
int nDC = 10 + PRCGetSpellLevelForClass(nSpellID, nCastingClass) + GetDCAbilityModForClass(nCastingClass, oPC);
//clear action queue to apply spell effect right after blast effect
ClearAllActions();
//override PRCDoMeleeTouchAttack() - we already know that blast hit
ActionDoCommand(SetLocalInt(oPC, "AttackHasHit", bHit));
SetLocalInt(oPC, "EldritchSpellBlast", TRUE);
if(DEBUG) DoDebug("inv_inc_blast >> EldritchSpellBlast Set");
ActionCastSpell(nSpellID, 0, nDC, 0, METAMAGIC_NONE, nCastingClass, FALSE, bTargetOverride);
ActionDoCommand(DeleteLocalInt(oPC, "AttackHasHit"));
DelayCommand(0.5, DeleteLocalInt(oPC, "EldritchSpellBlast"));
}
}
}
}
}
void ApplyBlastDamage(object oCaster, object oTarget, int iAttackRoll, int iSR, int iDamage, int iDamageType, int iDamageType2, int nHellFire, int bSneak = TRUE, int nMsg = FALSE)
{
if (DEBUG) DoDebug("ApplyBlastDamage oCaster "+GetName(oCaster)+" oTarget "+GetName(oTarget)+" iAttackRoll "+IntToString(iAttackRoll)+" iSR "+IntToString(iSR)+" iDamage "+IntToString(iDamage)+" iDamageType "+IntToString(iDamageType)+" iDamageType2 "+IntToString(iDamageType2)+" nHellFire "+IntToString(nHellFire)+" bSneak "+IntToString(bSneak)+" nMsg "+IntToString(nMsg));
// Is it a critical hit?
iDamage *= iAttackRoll;
if(iAttackRoll)
{
// Heal the Undead
if (iDamageType == DAMAGE_TYPE_NEGATIVE && (MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD || GetLocalInt(oTarget, "AcererakHealing") || (GetHasFeat(FEAT_TOMB_TAINTED_SOUL, oTarget) && GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD)))
{
//Set the heal effect
effect eHeal = EffectHeal(iDamage);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget);
}
else // Other targets
{
if(!GetPRCSwitch(PRC_SPELL_SNEAK_DISABLE) && bSneak)
iDamage += SpellSneakAttackDamage(oCaster, oTarget);
effect eDamage;
if(!iSR)
{
if(iDamageType == iDamageType2)
eDamage = EffectDamage(iDamage, iDamageType);
else
{
eDamage = EffectDamage(iDamage / 2, iDamageType);
eDamage = EffectLinkEffects(eDamage, EffectDamage(iDamage / 2, iDamageType2));
}
if(nHellFire)
eDamage = EffectLinkEffects(eDamage, EffectDamage(d6(nHellFire), DAMAGE_TYPE_DIVINE));
}
else if(iDamageType == DAMAGE_TYPE_ACID || iDamageType2 == DAMAGE_TYPE_ACID)
{
if(iDamageType == iDamageType2)
eDamage = EffectDamage(iDamage, iDamageType);
else
eDamage = EffectDamage(iDamage / 2, iDamageType);
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget);
}
}
}
int HellFireConDamage(object oPC)
{
if(GetIsImmune(oPC, IMMUNITY_TYPE_ABILITY_DECREASE))
{
if(DEBUG) DoDebug("HellFireConDamage: Immune to ability damage!");
return FALSE;
}
ApplyAbilityDamage(oPC, ABILITY_CONSTITUTION, 1, DURATION_TYPE_TEMPORARY, TRUE, -1.0);
return TRUE;
}
int GetIsHellFireBlast(object oPC)
{
if(GetLocalInt(oPC, "INV_HELLFIRE"))
{
DeleteLocalInt(oPC, "INV_HELLFIRE");
return TRUE;
}
return FALSE;
}
//:: void main (){}

View File

@@ -1,531 +0,0 @@
//::///////////////////////////////////////////////
//:: Invocation include: Invocations Known
//:: inv_inc_invknown
//::///////////////////////////////////////////////
/** @file
Defines functions for adding & removing
Invocations known.
Data stored:
- For each Class list
-- Total number of Invocations known
-- A modifier value to maximum Invocations known on this list to account for feats and classes that add Invocations
-- An array related to Invocations the knowledge of which is not dependent on character level
--- Each array entry specifies the spells.2da row of the known Invocations's class-specific entry
-- For each character level on which Invocations have been gained from this list
--- An array of Invocations gained on this level
---- Each array entry specifies the spells.2da row of the known Invocations's class-specific entry
@author Fox
@date Created - 2008.01.25
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
// Included here to provide the values for the constants below
#include "prc_class_const"
//////////////////////////////////////////////////
/* Constants */
//////////////////////////////////////////////////
const int INVOCATION_LIST_DRAGONFIRE_ADEPT = CLASS_TYPE_DRAGONFIRE_ADEPT;
const int INVOCATION_LIST_WARLOCK = CLASS_TYPE_WARLOCK;
const int INVOCATION_LIST_DRAGON_SHAMAN = CLASS_TYPE_DRAGON_SHAMAN;
/// Special Maneuver list. Maneuvers gained via Extra Invocation or other sources.
const int INVOCATION_LIST_EXTRA = CLASS_TYPE_INVALID;//-1;
const int INVOCATION_LIST_EXTRA_EPIC = /*CLASS_TYPE_INVALID - 1;*/-2; //needs a constant in there to compile properly
const string _INVOCATION_LIST_NAME_BASE = "PRC_InvocationList_";
const string _INVOCATION_LIST_TOTAL_KNOWN = "_TotalKnown";
const string _INVOCATION_LIST_MODIFIER = "_KnownModifier";
const string _INVOCATION_LIST_EXTRA_ARRAY = "_InvocationsKnownExtraArray";
const string _INVOCATION_LIST_EXTRA_EPIC_ARRAY = "_InvocationsKnownExtraEpicArray";
const string _INVOCATION_LIST_LEVEL_ARRAY = "_InvocationsKnownLevelArray_";
const string _INVOCATION_LIST_GENERAL_ARRAY = "_InvocationsKnownGeneralArray";
int GetPrimaryInvocationClass(object oCreature);
int GetInvocationPRCLevels(object oCreature);
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
/**
* Gives the creature the control feats for the given Invocation and marks the Invocation
* in a Invocations known array.
* If the Invocation's data is already stored in one of the Invocations known arrays for
* the list or adding the Invocation's data to the array fails, the function aborts.
*
* @param oCreature The creature to gain the Invocation
* @param nList The list the Invocation comes from. One of INVOCATION_LIST_*
* @param n2daRow The 2da row in the lists's 2da file that specifies the Invocation.
* @param bLevelDependent If this is TRUE, the Invocation is tied to a certain level and can
* be lost via level loss. If FALSE, the Invocation is not dependent
* of a level and cannot be lost via level loss.
* @param nLevelToTieTo If bLevelDependent is TRUE, this specifies the level the Invocation
* is gained on. Otherwise, it's ignored.
* The default value (-1) means that the current level of oCreature
* will be used.
*
* @return TRUE if the Invocation was successfully stored and control feats added.
* FALSE otherwise.
*/
int AddInvocationKnown(object oCreature, int nList, int n2daRow, int bLevelDependent = FALSE, int nLevelToTieTo = -1);
/**
* Removes all Invocations gained from each list on the given level.
*
* @param oCreature The creature whose Invocations to remove
* @param nLevel The level to clear
*/
void RemoveInvocationsKnownOnLevel(object oCreature, int nLevel);
/**
* Gets the value of the Invocations known modifier, which is a value that is added
* to the 2da-specified maximum Invocations known to determine the actual maximum.
*
* @param oCreature The creature whose modifier to get
* @param nList The list the maximum Invocations known from which the modifier
* modifies. One of INVOCATION_LIST_*
*/
int GetKnownInvocationsModifier(object oCreature, int nList);
/**
* Sets the value of the Invocations known modifier, which is a value that is added
* to the 2da-specified maximum Invocations known to determine the actual maximum.
*
* @param oCreature The creature whose modifier to set
* @param nList The list the maximum Invocations known from which the modifier
* modifies. One of INVOCATION_LIST_*
*/
void SetKnownInvocationsModifier(object oCreature, int nList, int nNewValue);
/**
* Gets the number of Invocations a character character possesses from a
* specific list and lexicon
*
* @param oCreature The creature whose Invocations to check
* @param nList The list to check. One of INVOCATION_LIST_*
* @return The number of Invocations known oCreature has from nList
*/
int GetInvocationCount(object oCreature, int nList);
/**
* Gets the maximum number of Invocations a character may posses from a given list
* at this time. Calculated based on class levels, feats and a misceallenous
* modifier. There are three Types of Invocations, so it checks each seperately.
*
* @param oCreature Character to determine maximum Invocations for
* @param nList INVOCATION_LIST_* of the list to determine maximum Invocations for
* @return Maximum number of Invocations that oCreature may know from the given list.
*/
int GetMaxInvocationCount(object oCreature, int nList);
/**
* Determines whether a character has a given Invocation, gained via some Invocation list.
*
* @param nInvocation INVOKE_* of the Invocation to test
* @param oCreature Character to test for the possession of the Invocation
* @return TRUE if the character has the Invocation, FALSE otherwise
*/
int GetHasInvocation(int nInvocation, object oCreature = OBJECT_SELF);
//////////////////////////////////////////////////
/* Includes */
//////////////////////////////////////////////////
#include "inc_item_props"
#include "prc_x2_itemprop"
#include "inc_lookups"
#include "prc_inc_nwscript"
//////////////////////////////////////////////////
/* Internal functions */
//////////////////////////////////////////////////
void _InvocationRecurseRemoveArray(object oCreature, string sArrayName, string sInvocFile, int nArraySize, int nCurIndex)
{
if(DEBUG) DoDebug("_InvocationRecurseRemoveArray():\n"
+ "oCreature = " + DebugObject2Str(oCreature) + "\n"
+ "sArrayName = '" + sArrayName + "'\n"
+ "sInvocFile = '" + sInvocFile + "'\n"
+ "nArraySize = " + IntToString(nArraySize) + "\n"
+ "nCurIndex = " + IntToString(nCurIndex) + "\n"
);
// Determine whether we've already parsed the whole array or not
if(nCurIndex >= nArraySize)
{
if(DEBUG) DoDebug("_InvocationRecurseRemoveArray(): Running itemproperty removal loop.");
// Loop over itemproperties on the skin and remove each match
object oSkin = GetPCSkin(oCreature);
itemproperty ipTest = GetFirstItemProperty(oSkin);
while(GetIsItemPropertyValid(ipTest))
{
// Check if the itemproperty is a bonus feat that has been marked for removal
if(GetItemPropertyType(ipTest) == ITEM_PROPERTY_BONUS_FEAT &&
GetLocalInt(oCreature, "PRC_InvocFeatRemovalMarker_" + IntToString(GetItemPropertySubType(ipTest)))
)
{
if(DEBUG) DoDebug("_InvocationRecurseRemoveArray(): Removing bonus feat itemproperty:\n" + DebugIProp2Str(ipTest));
// If so, remove it
RemoveItemProperty(oSkin, ipTest);
}
ipTest = GetNextItemProperty(oSkin);
}
}
// Still parsing the array
else
{
// Set the marker
string sName = "PRC_InvocFeatRemovalMarker_" + Get2DACache(sInvocFile, "IPFeatID",
GetPowerfileIndexFromSpellID(persistant_array_get_int(oCreature, sArrayName, nCurIndex))
);
if(DEBUG) DoDebug("_InvocationRecurseRemoveArray(): Recursing through array, marker set:\n" + sName);
SetLocalInt(oCreature, sName, TRUE);
// Recurse to next array index
_InvocationRecurseRemoveArray(oCreature, sArrayName, sInvocFile, nArraySize, nCurIndex + 1);
// After returning, delete the local
DeleteLocalInt(oCreature, sName);
}
}
void _RemoveInvocationArray(object oCreature, int nList, int nLevel)
{
if(DEBUG) DoDebug("_RemoveInvocationArray():\n"
+ "oCreature = " + DebugObject2Str(oCreature) + "\n"
+ "nList = " + IntToString(nList) + "\n"
);
string sBase = _INVOCATION_LIST_NAME_BASE + IntToString(nList);
string sArray = sBase + _INVOCATION_LIST_LEVEL_ARRAY + IntToString(nLevel);
int nSize = persistant_array_get_size(oCreature, sArray);
// Reduce the total by the array size
SetPersistantLocalInt(oCreature, sBase + _INVOCATION_LIST_TOTAL_KNOWN,
GetPersistantLocalInt(oCreature, sBase + _INVOCATION_LIST_TOTAL_KNOWN) - nSize
);
// Remove each Invocation in the array
_InvocationRecurseRemoveArray(oCreature, sArray, GetAMSDefinitionFileName(nList), nSize, 0);
// Remove the array itself
persistant_array_delete(oCreature, sArray);
}
//////////////////////////////////////////////////
/* Function definitions */
//////////////////////////////////////////////////
int AddInvocationKnown(object oCreature, int nList, int n2daRow, int bLevelDependent = FALSE, int nLevelToTieTo = -1)
{
string sBase = _INVOCATION_LIST_NAME_BASE + IntToString(nList);
string sArray = sBase;
string sPowerFile = GetAMSDefinitionFileName(/*PowerListToClassType(*/nList/*)*/);
if(nList == -2 || nList == CLASS_TYPE_INVALID)
{
sPowerFile = GetAMSDefinitionFileName(GetPrimaryInvocationClass(oCreature));
}
string sTestArray;
int i, j, nSize, bReturn;
// Get the spells.2da row corresponding to the cls_psipw_*.2da row
int nSpells2daRow = StringToInt(Get2DACache(sPowerFile, "SpellID", n2daRow));
// Determine the array name.
if(bLevelDependent)
{
// If no level is specified, default to the creature's current level
if(nLevelToTieTo == -1)
nLevelToTieTo = GetHitDice(oCreature);
sArray += _INVOCATION_LIST_LEVEL_ARRAY + IntToString(nLevelToTieTo);
}
else
{
sArray += _INVOCATION_LIST_GENERAL_ARRAY;
}
// Make sure the power isn't already in an array. If it is, abort and return FALSE
// Loop over each level array and check that it isn't there.
if(DEBUG) DoDebug("inv_inc_invknown: Checking first array set for duplicates.");
for(i = 1; i <= GetHitDice(oCreature); i++)
{
sTestArray = sBase + _INVOCATION_LIST_LEVEL_ARRAY + IntToString(i);
if(persistant_array_exists(oCreature, sTestArray))
{
nSize = persistant_array_get_size(oCreature, sTestArray);
for(j = 0; j < nSize; j++)
if(persistant_array_get_int(oCreature, sArray, j) == nSpells2daRow)
return FALSE;
}
}
// Check the non-level-dependent array
if(DEBUG) DoDebug("inv_inc_invknown: Checking second array set for duplicates.");
sTestArray = sBase + _INVOCATION_LIST_GENERAL_ARRAY;
if(persistant_array_exists(oCreature, sTestArray))
{
nSize = persistant_array_get_size(oCreature, sTestArray);
for(j = 0; j < nSize; j++)
if(persistant_array_get_int(oCreature, sArray, j) == nSpells2daRow)
return FALSE;
}
// All checks are made, now start adding the new power
// Create the array if it doesn't exist yet
if(!persistant_array_exists(oCreature, sArray))
persistant_array_create(oCreature, sArray);
// Store the power in the array
if(DEBUG) DoDebug("inv_inc_invknown: Adding to invocation array.");
if(persistant_array_set_int(oCreature, sArray, persistant_array_get_size(oCreature, sArray), nSpells2daRow) != SDL_SUCCESS)
{
if(DEBUG) DoDebug("inv_inc_invknown: AddPowerKnown(): ERROR: Unable to add power to known array\n"
+ "oCreature = " + DebugObject2Str(oCreature) + "\n"
+ "nList = " + IntToString(nList) + "\n"
+ "n2daRow = " + IntToString(n2daRow) + "\n"
+ "bLevelDependent = " + DebugBool2String(bLevelDependent) + "\n"
+ "nLevelToTieTo = " + IntToString(nLevelToTieTo) + "\n"
+ "nSpells2daRow = " + IntToString(nSpells2daRow) + "\n"
);
return FALSE;
}
// Increment Invocations known total
SetPersistantLocalInt(oCreature, sBase + _INVOCATION_LIST_TOTAL_KNOWN,
GetPersistantLocalInt(oCreature, sBase + _INVOCATION_LIST_TOTAL_KNOWN) + 1
);
// Give the power's control feats
object oSkin = GetPCSkin(oCreature);
string sPowerFeatIP = Get2DACache(sPowerFile, "IPFeatID", n2daRow);
itemproperty ipFeat = PRCItemPropertyBonusFeat(StringToInt(sPowerFeatIP));
IPSafeAddItemProperty(oSkin, ipFeat, 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
// Second power feat, if any
sPowerFeatIP = Get2DACache(sPowerFile, "IPFeatID2", n2daRow);
if(sPowerFeatIP != "")
{
ipFeat = PRCItemPropertyBonusFeat(StringToInt(sPowerFeatIP));
IPSafeAddItemProperty(oSkin, ipFeat, 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
}
return TRUE;
}
void RemoveInvocationsKnownOnLevel(object oCreature, int nLevel)
{
if(DEBUG) DoDebug("inv_inc_invknown: RemoveInvocationKnownOnLevel():\n"
+ "oCreature = " + DebugObject2Str(oCreature) + "\n"
+ "nLevel = " + IntToString(nLevel) + "\n"
);
string sPostFix = _INVOCATION_LIST_LEVEL_ARRAY + IntToString(nLevel);
// For each Invocation list, determine if an array exists for this level.
if(persistant_array_exists(oCreature, _INVOCATION_LIST_NAME_BASE + IntToString(INVOCATION_LIST_DRAGONFIRE_ADEPT) + sPostFix))
// If one does exist, clear it
_RemoveInvocationArray(oCreature, INVOCATION_LIST_DRAGONFIRE_ADEPT, nLevel);
if(persistant_array_exists(oCreature, _INVOCATION_LIST_NAME_BASE + IntToString(INVOCATION_LIST_WARLOCK) + sPostFix))
_RemoveInvocationArray(oCreature, INVOCATION_LIST_WARLOCK, nLevel);
if(persistant_array_exists(oCreature, _INVOCATION_LIST_NAME_BASE + IntToString(INVOCATION_LIST_DRAGON_SHAMAN) + sPostFix))
_RemoveInvocationArray(oCreature, INVOCATION_LIST_DRAGON_SHAMAN, nLevel);
if(persistant_array_exists(oCreature, _INVOCATION_LIST_NAME_BASE + IntToString(INVOCATION_LIST_EXTRA) + sPostFix))
_RemoveInvocationArray(oCreature, INVOCATION_LIST_EXTRA, nLevel);
if(persistant_array_exists(oCreature, _INVOCATION_LIST_NAME_BASE + IntToString(INVOCATION_LIST_EXTRA_EPIC) + sPostFix))
_RemoveInvocationArray(oCreature, INVOCATION_LIST_EXTRA_EPIC, nLevel);
}
int GetKnownInvocationsModifier(object oCreature, int nList)
{
return GetPersistantLocalInt(oCreature, _INVOCATION_LIST_NAME_BASE + IntToString(nList) + _INVOCATION_LIST_MODIFIER);
}
void SetKnownInvocationsModifier(object oCreature, int nList, int nNewValue)
{
SetPersistantLocalInt(oCreature, _INVOCATION_LIST_NAME_BASE + IntToString(nList) + _INVOCATION_LIST_MODIFIER, nNewValue);
}
int GetInvocationCount(object oCreature, int nList)
{
return GetPersistantLocalInt(oCreature, _INVOCATION_LIST_NAME_BASE + IntToString(nList) + _INVOCATION_LIST_TOTAL_KNOWN);
}
int GetMaxInvocationCount(object oCreature, int nList)
{
int nMaxInvocations = 0;
switch(nList)
{
case INVOCATION_LIST_DRAGONFIRE_ADEPT:{
// Determine base Invocations known
int nLevel = GetLevelByClass(CLASS_TYPE_DRAGONFIRE_ADEPT, oCreature);
nLevel += GetPrimaryInvocationClass(oCreature) == CLASS_TYPE_DRAGONFIRE_ADEPT ? GetInvocationPRCLevels(oCreature) : 0;
if(nLevel == 0)
break;
nMaxInvocations = StringToInt(Get2DACache(GetAMSKnownFileName(CLASS_TYPE_DRAGONFIRE_ADEPT), "InvocationKnown", nLevel - 1));
// Calculate feats
// Add in the custom modifier
nMaxInvocations += GetKnownInvocationsModifier(oCreature, nList);
break;
}
case INVOCATION_LIST_WARLOCK:{
// Determine base Invocations known
int nLevel = GetLevelByClass(CLASS_TYPE_WARLOCK, oCreature);
nLevel += GetPrimaryInvocationClass(oCreature) == CLASS_TYPE_WARLOCK ? GetInvocationPRCLevels(oCreature) : 0;
if(nLevel == 0)
break;
nMaxInvocations = StringToInt(Get2DACache(GetAMSKnownFileName(CLASS_TYPE_WARLOCK), "InvocationKnown", nLevel - 1));
// Calculate feats
// Add in the custom modifier
nMaxInvocations += GetKnownInvocationsModifier(oCreature, nList);
break;
}
case INVOCATION_LIST_DRAGON_SHAMAN:{
// Determine base Invocations known
int nLevel = GetLevelByClass(CLASS_TYPE_DRAGON_SHAMAN, oCreature);
nLevel += GetPrimaryInvocationClass(oCreature) == CLASS_TYPE_DRAGON_SHAMAN ? GetInvocationPRCLevels(oCreature) : 0;
if(nLevel == 0)
break;
nMaxInvocations = StringToInt(Get2DACache(GetAMSKnownFileName(CLASS_TYPE_DRAGON_SHAMAN), "InvocationKnown", nLevel - 1));
// Calculate feats
// Add in the custom modifier
nMaxInvocations += GetKnownInvocationsModifier(oCreature, nList);
break;
}
case INVOCATION_LIST_EXTRA:
nMaxInvocations = GetHasFeat(FEAT_EXTRA_INVOCATION_I, oCreature) +
GetHasFeat(FEAT_EXTRA_INVOCATION_II, oCreature) +
GetHasFeat(FEAT_EXTRA_INVOCATION_III, oCreature) +
GetHasFeat(FEAT_EXTRA_INVOCATION_IV, oCreature) +
GetHasFeat(FEAT_EXTRA_INVOCATION_V, oCreature) +
GetHasFeat(FEAT_EXTRA_INVOCATION_VI, oCreature) +
GetHasFeat(FEAT_EXTRA_INVOCATION_VII, oCreature) +
GetHasFeat(FEAT_EXTRA_INVOCATION_VIII, oCreature) +
GetHasFeat(FEAT_EXTRA_INVOCATION_IX, oCreature) +
GetHasFeat(FEAT_EXTRA_INVOCATION_X, oCreature);
break;
case INVOCATION_LIST_EXTRA_EPIC:
nMaxInvocations = GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_I, oCreature) +
GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_II, oCreature) +
GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_III, oCreature) +
GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_IV, oCreature) +
GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_V, oCreature) +
GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_VI, oCreature) +
GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_VII, oCreature) +
GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_VIII, oCreature) +
GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_IX, oCreature) +
GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_X, oCreature);
break;
default:{
string sErr = "GetMaxInvocationCount(): ERROR: Unknown power list value: " + IntToString(nList);
if(DEBUG) DoDebug(sErr);
else WriteTimestampedLogEntry(sErr);
}
}
return nMaxInvocations;
}
int GetHasInvocation(int nInvocation, object oCreature = OBJECT_SELF)
{
if((GetLevelByClass(CLASS_TYPE_DRAGONFIRE_ADEPT, oCreature)
&& GetHasFeat(GetClassFeatFromPower(nInvocation, CLASS_TYPE_DRAGONFIRE_ADEPT), oCreature)
) ||
(GetLevelByClass(CLASS_TYPE_WARLOCK, oCreature)
&& GetHasFeat(GetClassFeatFromPower(nInvocation, CLASS_TYPE_WARLOCK), oCreature)
) ||
(GetLevelByClass(CLASS_TYPE_DRAGON_SHAMAN, oCreature)
&& GetHasFeat(GetClassFeatFromPower(nInvocation, CLASS_TYPE_DRAGON_SHAMAN), oCreature)
)
// add new Invocation classes here
)
return TRUE;
return FALSE;
}
string DebugListKnownInvocations(object oCreature)
{
string sReturn = "Invocations known by " + DebugObject2Str(oCreature) + ":\n";
int i, j, k, numPowerLists = 6;
int nPowerList, nSize;
string sTemp, sArray, sArrayBase, sPowerFile;
// Loop over all power lists
for(i = 1; i <= numPowerLists; i++)
{
// Some padding
sReturn += " ";
// Get the power list for this loop
switch(i)
{
case 1: nPowerList = INVOCATION_LIST_DRAGONFIRE_ADEPT; sReturn += "Dragonfire Adept"; break;
case 2: nPowerList = INVOCATION_LIST_WARLOCK; sReturn += "Warlock"; break;
case 3: nPowerList = INVOCATION_LIST_DRAGON_SHAMAN; sReturn += "Dragon Shaman"; break;
// This should always be last
case 5: nPowerList = INVOCATION_LIST_EXTRA; sReturn += "Extra"; break;
case 6: nPowerList = INVOCATION_LIST_EXTRA_EPIC; sReturn += "Epic Extra"; break;
}
sReturn += " Invocations known:\n";
// Determine if the character has any Invocations from this list
sPowerFile = GetAMSDefinitionFileName(nPowerList);
sArrayBase = _INVOCATION_LIST_NAME_BASE + IntToString(nPowerList);
// Loop over levels
for(j = 1; j <= GetHitDice(oCreature); j++)
{
sArray = sArrayBase + _INVOCATION_LIST_LEVEL_ARRAY + IntToString(j);
if(persistant_array_exists(oCreature, sArray))
{
sReturn += " Gained on level " + IntToString(j) + ":\n";
nSize = persistant_array_get_size(oCreature, sArray);
for(k = 0; k < nSize; k++)
sReturn += " " + GetStringByStrRef(StringToInt(Get2DACache(sPowerFile, "Name",
GetPowerfileIndexFromSpellID(persistant_array_get_int(oCreature, sArray, k))
)
)
)
+ "\n";
}
}
// Non-leveldependent Invocations
sArray = sArrayBase + _INVOCATION_LIST_GENERAL_ARRAY;
if(persistant_array_exists(oCreature, sArray))
{
sReturn += " Non-leveldependent:\n";
nSize = persistant_array_get_size(oCreature, sArray);
for(k = 0; k < nSize; k++)
sReturn += " " + GetStringByStrRef(StringToInt(Get2DACache(sPowerFile, "Name",
GetPowerfileIndexFromSpellID(persistant_array_get_int(oCreature, sArray, k))
)
)
)
+ "\n";
}
}
return sReturn;
}
// Test main
//void main(){}

View File

@@ -1,582 +0,0 @@
//::///////////////////////////////////////////////
//:: Invocation include: Casting
//:: inv_inc_invoke
//::///////////////////////////////////////////////
/** @file
Defines structures and functions for handling
initiating a invocation
@author Fox
@date Created - 2008.1.26
@thanks to Ornedan for his work on Psionics upon which this is based.
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//////////////////////////////////////////////////
/* Constants */
//////////////////////////////////////////////////
const string PRC_INVOKING_CLASS = "PRC_CurrentInvocation_InitiatingClass";
const string PRC_INVOCATION_LEVEL = "PRC_CurrentInvocation_Level";
const string INV_DEBUG_IGNORE_CONSTRAINTS = "INV_DEBUG_IGNORE_CONSTRAINTS";
/**
* The variable in which the invocation token is stored. If no token exists,
* the variable is set to point at the invoker itself. That way OBJECT_INVALID
* means the variable is unitialised.
*/
//const string PRC_INVOCATION_TOKEN_VAR = "PRC_InvocationToken";
//const string PRC_INVOCATION_TOKEN_NAME = "PRC_INVOKETOKEN";
//const float PRC_INVOCATION_HB_DELAY = 0.5f;
int GetInvokerLevel(object oInvoker = OBJECT_SELF, int nSpecificClass = CLASS_TYPE_INVALID, int bPracticedInvoker = TRUE);
int GetInvocationLevel(object oInvoker);
int GetInvokingClass(object oInvoker = OBJECT_SELF);
//////////////////////////////////////////////////
/* Structures */
//////////////////////////////////////////////////
/**
* A structure that contains common data used during invocation.
*/
struct invocation{
/* Generic stuff */
/// The creature Truespeaking the Invocation
object oInvoker;
/// Whether the invocation is successful or not
int bCanInvoke;
/// The creature's invoker level in regards to this invocation
int nInvokerLevel;
/// The invocation's spell ID
int nInvocationId;
};
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
/**
* Determines if the invocation that is currently being attempted to be TrueSpoken
* can in fact be truespoken. Determines metainvocations used.
*
* @param oInvoker A creature attempting to truespeak a invocation at this moment.
* @param oTarget The target of the invocation, if any. For pure Area of Effect.
* invocations, this should be OBJECT_INVALID. Otherwise the main
* target of the invocation as returned by PRCGetSpellTargetObject().
*
* @return A invocation structure that contains the data about whether
* the invocation was successfully initiated and some other
* commonly used data, like the PC's invoker level for this invocation.
*/
struct invocation EvaluateInvocation(object oInvoker, object oTarget);
/**
* Causes OBJECT_SELF to use the given invocation.
*
* @param nInvocation The index of the invocation to use in spells.2da or an UTTER_*
* @param nClass The index of the class to use the invocation as in classes.2da or a CLASS_TYPE_*
* @param nLevelOverride An optional override to normal invoker level.
* @param bInstant If true invocation will be used without casting animations (eldritch sculptor)
* Default: 0, which means the parameter is ignored.
*/
void UseInvocation(int nInvocation, int nClass, int nLevelOverride = 0, int bInstant = FALSE);
/**
* A debugging function. Takes a invocation structure and
* makes a string describing the contents.
*
* @param move A set of invocation data
* @return A string describing the contents of move
*/
string DebugInvocation2Str(struct invocation invoked);
/**
* Stores a invocation structure as a set of local variables. If
* a structure was already stored with the same name on the same object,
* it is overwritten.
*
* @param oObject The object on which to store the structure
* @param sName The name under which to store the structure
* @param move The invocation structure to store
*/
void SetLocalInvocation(object oObject, string sName, struct invocation invoked);
/**
* Retrieves a previously stored invocation structure. If no structure is stored
* by the given name, the structure returned is empty.
*
* @param oObject The object from which to retrieve the structure
* @param sName The name under which the structure is stored
* @return The structure built from local variables stored on oObject under sName
*/
struct invocation GetLocalInvocation(object oObject, string sName);
/**
* Deletes a stored invocation structure.
*
* @param oObject The object on which the structure is stored
* @param sName The name under which the structure is stored
*/
void DeleteLocalInvocation(object oObject, string sName);
//////////////////////////////////////////////////
/* Includes */
//////////////////////////////////////////////////
//#include "inv_inc_invfunc" //Access in parent
#include "prc_spellf_inc"
//////////////////////////////////////////////////
/* Internal functions */
//////////////////////////////////////////////////
/** Internal function.
* Handles Spellfire absorption when a utterance is used on a friendly spellfire
* user.
*/
struct invocation _DoInvocationSpellfireFriendlyAbsorption(struct invocation invoked, object oTarget)
{
if(GetLocalInt(oTarget, "SpellfireAbsorbFriendly") &&
GetIsFriend(oTarget, invoked.oInvoker)
)
{
if(CheckSpellfire(invoked.oInvoker, oTarget, TRUE))
{
PRCShowSpellResist(invoked.oInvoker, oTarget, SPELL_RESIST_MANTLE);
invoked.bCanInvoke = FALSE;
}
}
return invoked;
}
/** Internal function.
* Sets invocation-related local variables.
*
* @param oInvoker The creature currently casting invocation
* @param nClass Invocation casting class constant
* @param nLevel Invocation level
*/
void _SetInvocationVariables(object oInvoker, int nClass, int nLevel)
{
if (DEBUG) FloatingTextStringOnCreature(GetName(oInvoker)+" is a "+IntToString(nClass)+" at "+IntToString(nLevel)+" invocation level", oInvoker);
SetLocalInt(oInvoker, PRC_INVOKING_CLASS, nClass + 1);
SetLocalInt(oInvoker, PRC_INVOCATION_LEVEL, nLevel);
}
/** Internal function.
* Deletes invocation-related local variables.
*
* @param oInvoker The creature currently initiating a invocation
*/
void _CleanInvocationVariables(object oInvoker)
{
DeleteLocalInt(oInvoker, PRC_INVOKING_CLASS);
DeleteLocalInt(oInvoker, PRC_INVOCATION_LEVEL);
}
/** Internal function.
* Determines whether a invocation token exists. If one does, returns it.
*
* @param oInvoker A creature whose invocation token to get
* @return The invocation token if it exists, OBJECT_INVALID otherwise.
*/
/*object _GetInvocationToken(object oInvoker)
{
object oInvokeToken = GetLocalObject(oInvoker, PRC_INVOCATION_TOKEN_VAR);
// If the token object is no longer valid, set the variable to point at invoker
if(!GetIsObjectValid(oInvokeToken))
{
oInvokeToken = oInvoker;
SetLocalObject(oInvoker, PRC_INVOCATION_TOKEN_VAR, oInvokeToken);
}
// Check if there is no token
if(oInvokeToken == oInvoker)
oInvokeToken = OBJECT_INVALID;
return oInvokeToken;
}*/
/** Internal function.
* Destroys the given invocation token and sets the creature's invocation token variable
* to point at itself.
*
* @param oInvoker The invoker whose token to destroy
* @param oInvokeToken The token to destroy
*/
/*void _DestroyInvocationToken(object oInvoker, object oInvokeToken)
{
DestroyObject(oInvokeToken);
SetLocalObject(oInvoker, PRC_INVOCATION_TOKEN_VAR, oInvoker);
}*/
/** Internal function.
* Destroys the previous invocation token, if any, and creates a new one.
*
* @param oInvoker A creature for whom to create a invocation token
* @return The newly created token
*/
/*object _CreateInvocationToken(object oInvoker)
{
object oInvokeToken = _GetInvocationToken(oInvoker);
object oStore = GetObjectByTag("PRC_MANIFTOKEN_STORE"); //GetPCSkin(oInvoker);
// Delete any previous tokens
if(GetIsObjectValid(oInvokeToken))
_DestroyInvocationToken(oInvoker, oInvokeToken);
// Create new token and store a reference to it
oInvokeToken = CreateItemOnObject(PRC_INVOCATION_TOKEN_NAME, oStore);
SetLocalObject(oInvoker, PRC_INVOCATION_TOKEN_VAR, oInvokeToken);
Assert(GetIsObjectValid(oInvokeToken), "GetIsObjectValid(oInvokeToken)", "ERROR: Unable to create invocation token! Store object: " + DebugObject2Str(oStore), "inv_inc_invoke", "_CreateInvocationToken()");
return oInvokeToken;
}*/
/** Internal function.
* Determines whether the given invoker is doing something that would
* interrupt initiating a invocation or affected by an effect that would do
* the same.
*
* @param oInvoker A creature on which _InvocationHB() is running
* @return TRUE if the creature can continue initiating,
* FALSE otherwise
*/
/*int _InvocationStateCheck(object oInvoker)
{
int nAction = GetCurrentAction(oInvoker);
// If the current action is not among those that could either be used to truespeak the invocation or movement, the invocation fails
if(!(nAction || ACTION_CASTSPELL || nAction == ACTION_INVALID ||
nAction || ACTION_ITEMCASTSPELL || nAction == ACTION_MOVETOPOINT ||
nAction || ACTION_USEOBJECT || nAction == ACTION_WAIT
) )
return FALSE;
// Affected by something that prevents one from initiating
effect eTest = GetFirstEffect(oInvoker);
int nEType;
while(GetIsEffectValid(eTest))
{
nEType = GetEffectType(eTest);
if(nEType == EFFECT_TYPE_CUTSCENE_PARALYZE ||
nEType == EFFECT_TYPE_DAZED ||
nEType == EFFECT_TYPE_PARALYZE ||
nEType == EFFECT_TYPE_PETRIFY ||
nEType == EFFECT_TYPE_SLEEP ||
nEType == EFFECT_TYPE_STUNNED
)
return FALSE;
// Get next effect
eTest = GetNextEffect(oInvoker);
}
return TRUE;
}*/
/** Internal function.
* Runs while the given creature is initiating. If they move, take other actions
* that would cause them to interrupt initiating the invocation or are affected by an
* effect that would cause such interruption, deletes the invocation token.
* Stops if such condition occurs or something else destroys the token.
*
* @param oInvoker A creature initiating a invocation
* @param lInvoker The location where the invoker was when starting the invocation
* @param oInvokeToken The invocation token that controls the ongoing invocation
*/
/*void _InvocationHB(object oInvoker, location lInvoker, object oInvokeToken)
{
if(DEBUG) DoDebug("_InvocationHB() running:\n"
+ "oInvoker = " + DebugObject2Str(oInvoker) + "\n"
+ "lInvoker = " + DebugLocation2Str(lInvoker) + "\n"
+ "oInvokeToken = " + DebugObject2Str(oInvokeToken) + "\n"
+ "Distance between invocation start location and current location: " + FloatToString(GetDistanceBetweenLocations(lInvoker, GetLocation(oInvoker))) + "\n"
);
if(GetIsObjectValid(oInvokeToken))
{
// Continuance check
if(GetDistanceBetweenLocations(lInvoker, GetLocation(oInvoker)) > 2.0f || // Allow some variance in the location to account for dodging and random fidgeting
!_InvocationStateCheck(oInvoker) // Action and effect check
)
{
if(DEBUG) DoDebug("_InvocationHB(): invoker moved or lost concentration, destroying token");
_DestroyInvocationToken(oInvoker, oInvokeToken);
// Inform invoker
FloatingTextStrRefOnCreature(16832980, oInvoker, FALSE); // "You have lost concentration on the invocation you were attempting to cast!"
}
// Schedule next HB
else
DelayCommand(PRC_INVOCATION_HB_DELAY, _InvocationHB(oInvoker, lInvoker, oInvokeToken));
}
}*/
/** Internal function.
* Checks if the invoker is in range to use the invocation they are trying to use.
* If not, queues commands to make the invoker to run into range.
*
* @param oInvoker A creature initiating a invocation
* @param nInvocation SpellID of the invocation being initiated
* @param lTarget The target location or the location of the target object
*/
/*void _InvocationRangeCheck(object oInvoker, int nInvocation, location lTarget)
{
float fDistance = GetDistanceBetweenLocations(GetLocation(oInvoker), lTarget);
float fRangeLimit;
string sRange = Get2DACache("spells", "Range", nInvocation);
// Personal range invocations are always in range
if(sRange == "P")
return;
// Ranges according to the CCG spells.2da page
else if(sRange == "T")
fRangeLimit = 2.25f;
else if(sRange == "S")
fRangeLimit = 8.0f;
else if(sRange == "M")
fRangeLimit = 20.0f;
else if(sRange == "L")
fRangeLimit = 40.0f;
// See if we are out of range
if(fDistance > fRangeLimit)
{
// Create waypoint for the movement
object oWP = CreateObject(OBJECT_TYPE_WAYPOINT, "nw_waypoint001", lTarget);
// Move into range, with a bit of fudge-factor
//ActionMoveToObject(oWP, TRUE, fRangeLimit - 0.15f);
// CleanUp
ActionDoCommand(DestroyObject(oWP));
// CleanUp, paranoia
AssignCommand(oWP, ActionDoCommand(DestroyObject(oWP, 60.0f)));
}
}*/
/** Internal function.
* Assigns the fakecast command that is used to display the conjuration VFX when using an invocation.
* Separated from UseInvocation() due to a bug with ActionFakeCastSpellAtObject(), which requires
* use of ClearAllActions() to work around.
* The problem is that if the target is an item on the ground, if the actor is out of spell
* range when doing the fakecast, they will run on top of the item instead of to the edge of
* the spell range. This only happens if there was a "real action" in the actor's action queue
* immediately prior to the fakecast.
*/
/*void _AssignUseInvocationFakeCastCommands(object oInvoker, object oTarget, location lTarget, int nSpellID)
{
// Nuke actions to prevent the fakecast action from bugging
ClearAllActions();
if(GetIsObjectValid(oTarget))
ActionCastFakeSpellAtObject(nSpellID, oTarget, PROJECTILE_PATH_TYPE_DEFAULT);
else
ActionCastFakeSpellAtLocation(nSpellID, lTarget, PROJECTILE_PATH_TYPE_DEFAULT);
}*/
/** Internal function.
* Places the cheatcasting of the real invocation into the invoker's action queue.
*/
/*void _UseInvocationAux(object oInvoker, object oInvokeToken, int nSpellId,
object oTarget, location lTarget,
int nInvocation, int nClass, int nLevelOverride)
{
if(DEBUG) DoDebug("_UseInvocationAux() running:\n"
+ "oInvoker = " + DebugObject2Str(oInvoker) + "\n"
+ "oInvokeToken = " + DebugObject2Str(oInvokeToken) + "\n"
+ "nSpellId = " + IntToString(nSpellId) + "\n"
+ "oTarget = " + DebugObject2Str(oTarget) + "\n"
+ "lTarget = " + DebugLocation2Str(lTarget) + "\n"
+ "nInvocation = " + IntToString(nInvocation) + "\n"
+ "nClass = " + IntToString(nClass) + "\n"
+ "nLevelOverride = " + IntToString(nLevelOverride) + "\n"
);
// Make sure nothing has interrupted this invocation
if(GetIsObjectValid(oInvokeToken))
{
if(DEBUG) DoDebug("_UseInvocationAux(): Token was valid, queueing actual invocation");
// Set the class to cast as
SetLocalInt(oInvoker, PRC_INVOKING_CLASS, nClass + 1);
// Set the invocation's level
SetLocalInt(oInvoker, PRC_INVOCATION_LEVEL, StringToInt(lookup_spell_innate(nSpellId)));
if(nLevelOverride != 0)
AssignCommand(oInvoker, ActionDoCommand(SetLocalInt(oInvoker, PRC_CASTERLEVEL_OVERRIDE, nLevelOverride)));
if(GetIsObjectValid(oTarget))
AssignCommand(oInvoker, ActionCastSpellAtObject(nInvocation, oTarget, METAMAGIC_NONE, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE));
else
AssignCommand(oInvoker, ActionCastSpellAtLocation(nInvocation, lTarget, METAMAGIC_NONE, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE));
if(nLevelOverride != 0)
AssignCommand(oInvoker, ActionDoCommand(DeleteLocalInt(oInvoker, PRC_CASTERLEVEL_OVERRIDE)));
// Destroy the invocation token for this invocation
_DestroyInvocationToken(oInvoker, oInvokeToken);
}
}*/
//////////////////////////////////////////////////
/* Function definitions */
//////////////////////////////////////////////////
struct invocation EvaluateInvocation(object oInvoker, object oTarget)
{
/* Get some data */
int bIgnoreConstraints = (DEBUG) ? GetLocalInt(oInvoker, INV_DEBUG_IGNORE_CONSTRAINTS) : FALSE;
// invoker-related stuff
int nInvokerLevel = GetInvokerLevel(oInvoker);
int nInvocationLevel = GetInvocationLevel(oInvoker);
int nClass = GetInvokingClass(oInvoker);
/* Initialise the invocation structure */
struct invocation invoked;
invoked.oInvoker = oInvoker;
invoked.bCanInvoke = TRUE; // Assume successfull invocation by default
invoked.nInvokerLevel = nInvokerLevel;
invoked.nInvocationId = PRCGetSpellId();
if (DEBUG) FloatingTextStringOnCreature(GetName(oInvoker)+" is a "+IntToString(nClass)+" casting invocation "+IntToString(invoked.nInvocationId)+", a "+IntToString(nInvocationLevel)+" level invocation, at "+IntToString(nInvokerLevel)+" invoker level", oInvoker);
// Skip doing anything if something has prevented a successful invocation already by this point
//if(invoked.bCanInvoke)
//{
invoked = _DoInvocationSpellfireFriendlyAbsorption(invoked, oTarget);
//}//end if
if(DEBUG) DoDebug("EvaluateInvocation(): Final result:\n" + DebugInvocation2Str(invoked));
// Initiate invocation-related variable CleanUp
//DelayCommand(0.5f, _CleanInvocationVariables(oInvoker));
return invoked;
}
void UseInvocation(int nInvocation, int nClass, int nLevelOverride = 0, int bInstant = FALSE)
{
if(nClass < 0)
nClass = CLASS_TYPE_WARLOCK;
object oInvoker = OBJECT_SELF;
// object oSkin = GetPCSkin(oInvoker);
// object oTarget = PRCGetSpellTargetObject();
// object oInvokeToken;
// location lTarget = PRCGetSpellTargetLocation();
// int nSpellID = PRCGetSpellId();
//int nInvocationDur = StringToInt(Get2DACache("spells", "ConjTime", nInvocation)) + StringToInt(Get2DACache("spells", "CastTime", nInvocation));
// This is a test case to speed up the impact of the melee attacks, as PerformAttackRound takes the full 6 second.
// int nInvocationDur = 0;
// Setup invocation-related variables
ActionDoCommand(_SetInvocationVariables(oInvoker, nClass, StringToInt(lookup_spell_innate(nInvocation))));
// Cast the actual invocation
ActionCastSpell(nInvocation, nLevelOverride, 0, 0, METAMAGIC_NONE, CLASS_TYPE_INVALID, 0, 0, OBJECT_INVALID, bInstant);
// Initiate invocation-related variable CleanUp
ActionDoCommand(_CleanInvocationVariables(oInvoker));
// Normally swift action invocations check
/*if(Get2DACache("feat", "Constant", GetClassFeatFromPower(nInvocation, nClass)) == "SWIFT_ACTION" && // The invocation is swift action to use
TakeSwiftAction(oInvoker) // And the invoker can take a swift action now
)
{
nInvocationDur = 0;
}*/
/*if(DEBUG) DoDebug("UseInvocation(): invoker is " + DebugObject2Str(oInvoker) + "\n"
+ "nInvocation = " + IntToString(nInvocation) + "\n"
+ "nClass = " + IntToString(nClass) + "\n"
+ "nLevelOverride = " + IntToString(nLevelOverride) + "\n"
+ "invocation duration = " + IntToString(nInvocationDur) + "ms \n"
//+ "Token exists = " + DebugBool2String(GetIsObjectValid(oInvokeToken))
);*/
// Create the invocation token. Deletes any old tokens and cancels corresponding invocations as a side effect
//oInvokeToken = _CreateInvocationToken(oInvoker);
/// @todo Hook to the invoker's OnDamaged event for the concentration checks to avoid losing the invocation
// Nuke action queue to prevent cheating with creative invocation stacking.
// Probably not necessary anymore - Ornedan
//if(DEBUG) SendMessageToPC(oInvoker, "Clearing all actions in preparation for second stage of the invocation.");
//ClearAllActions();
// If out of range, move to range
//_InvocationRangeCheck(oInvoker, nInvocation, GetIsObjectValid(oTarget) ? GetLocation(oTarget) : lTarget);
// Start the invocation monitor HB
//DelayCommand(IntToFloat(nInvocationDur), ActionDoCommand(_InvocationHB(oInvoker, GetLocation(oInvoker), oInvokeToken)));
// Assuming the spell isn't used as a swift action, fakecast for visuals
/*if(nInvocationDur > 0)
{
// Hack. Workaround of a bug with the fakecast actions. See function comment for details
ActionDoCommand(_AssignUseInvocationFakeCastCommands(oInvoker, oTarget, lTarget, nSpellID));
}*/
// Action queue the function that will cheatcast the actual invocation
//DelayCommand(IntToFloat(nInvocationDur), AssignCommand(oInvoker, ActionDoCommand(_UseInvocationAux(oInvoker, oInvokeToken, nSpellID, oTarget, lTarget, nInvocation, nClass, nLevelOverride))));
}
string DebugInvocation2Str(struct invocation invoked)
{
string sRet;
sRet += "oInvoker = " + DebugObject2Str(invoked.oInvoker) + "\n";
sRet += "bCanInvoke = " + DebugBool2String(invoked.bCanInvoke) + "\n";
sRet += "nInvokerLevel = " + IntToString(invoked.nInvokerLevel);
return sRet;
}
void SetLocalInvocation(object oObject, string sName, struct invocation invoked)
{
//SetLocal (oObject, sName + "_", );
SetLocalObject(oObject, sName + "_oInvoker", invoked.oInvoker);
SetLocalInt(oObject, sName + "_bCanInvoke", invoked.bCanInvoke);
SetLocalInt(oObject, sName + "_nInvokerLevel", invoked.nInvokerLevel);
SetLocalInt(oObject, sName + "_nSpellID", invoked.nInvocationId);
}
struct invocation GetLocalInvocation(object oObject, string sName)
{
struct invocation invoked;
invoked.oInvoker = GetLocalObject(oObject, sName + "_oInvoker");
invoked.bCanInvoke = GetLocalInt(oObject, sName + "_bCanInvoke");
invoked.nInvokerLevel = GetLocalInt(oObject, sName + "_nInvokerLevel");
invoked.nInvocationId = GetLocalInt(oObject, sName + "_nSpellID");
return invoked;
}
void DeleteLocalInvocation(object oObject, string sName)
{
DeleteLocalObject(oObject, sName + "_oInvoker");
DeleteLocalInt(oObject, sName + "_bCanInvoke");
DeleteLocalInt(oObject, sName + "_nInvokerLevel");
DeleteLocalInt(oObject, sName + "_nSpellID");
}
void InvocationDebugIgnoreConstraints(object oInvoker)
{
SetLocalInt(oInvoker, INV_DEBUG_IGNORE_CONSTRAINTS, TRUE);
DelayCommand(0.0f, DeleteLocalInt(oInvoker, INV_DEBUG_IGNORE_CONSTRAINTS));
}
// Test main
//void main(){}

View File

@@ -1,446 +0,0 @@
//::///////////////////////////////////////////////
//:: Spells include: Spell Penetration
//:: prc_add_spl_pen
//::///////////////////////////////////////////////
/** @file
Defines functions that may have something to do
with modifying a spell's caster level in regards
to Spell Resistance penetration.
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//////////////////////////////////////////////////
/* Forward Declarations */
//////////////////////////////////////////////////
int PRCGetMetaMagicFeat(object oCaster = OBJECT_SELF, int bClearFeatFlags = TRUE);
int GetIsElementalSpell(int nSpellID, int nDescriptor = -1);
int ShadowWeave(object oCaster, int iSpellID, int nSpellSchool = -1);
int HexToInt(string sHex);
int GetIsDeniedDexBonusToAC(object oDefender, object oAttacker, int nIgnoreUD = FALSE);
object PRCGetSpellTargetObject(object oCaster = OBJECT_SELF);
int PRCGetSpellId(object oCaster = OBJECT_SELF);
int GetSpellSchool(int iSpellId);
int GetEssentiaInvested(object oMeldshaper, int nMeld = -1);
int PRCGetCasterLevel(object oCaster = OBJECT_SELF);
int GetEssentiaInvestedFeat(object oMeldshaper, int nFeat);
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
int GetHeartWarderPene(int spell_id, object oCaster = OBJECT_SELF);
int ElementalSavantSP(int spell_id, object oCaster = OBJECT_SELF);
int RedWizardSP(int spell_id, int nSchool, object oCaster = OBJECT_SELF);
int GetSpellPenetreFocusSchool(int nSchool, object oCaster = OBJECT_SELF);
int GetSpellPowerBonus(object oCaster = OBJECT_SELF);
int ShadowWeavePen(int spell_id, int nSchool, object oCaster = OBJECT_SELF);
int KOTCSpellPenVsDemons(object oCaster, object oTarget);
int RunecasterRunePowerSP(object oCaster);
int MarshalDeterminedCaster(object oCaster);
int DuskbladeSpellPower(object oCaster, object oTarget);
int DraconicMagicPower(object oCaster);
int TrueCastingSpell(object oCaster);
string ChangedElementalType(int spell_id, object oCaster = OBJECT_SELF);
// Use this function to get the adjustments to a spell or SLAs spell penetration
// from the various class effects
// Update this function if any new classes change spell pentration
int add_spl_pen(object oCaster = OBJECT_SELF);
int SPGetPenetr(object oCaster = OBJECT_SELF);
int SPGetPenetrAOE(object oCaster = OBJECT_SELF, int nCasterLvl = 0);
//////////////////////////////////////////////////
/* Includes */
//////////////////////////////////////////////////
//#include "prc_inc_spells"
//#include "prc_alterations"
//#include "prcsp_archmaginc"
//#include "prc_inc_racial"
#include "inc_2dacache"
#include "prc_feat_const"
#include "prc_class_const"
#include "prc_inc_descrptr"
#include "prc_inc_racial"
#include "prc_spell_const"
#include "inv_invoc_const"
//////////////////////////////////////////////////
/* Function definitions */
//////////////////////////////////////////////////
//
// Determine if a spell type is elemental
//
int IsSpellTypeElemental(string type)
{
return type == "Acid"
|| type == "Cold"
|| type == "Electricity"
|| type == "Fire"
|| type == "Sonic";
}
int GetHeartWarderPene(int spell_id, object oCaster = OBJECT_SELF)
{
// Guard Expensive Calculations
if(!GetHasFeat(FEAT_VOICE_SIREN, oCaster))
return 0;
// Bonus Requires Verbal Spells
string VS = GetStringLowerCase(Get2DACache("spells", "VS", spell_id));
if(FindSubString(VS, "v") == -1)
return 0;
// These feats provide greater bonuses or remove the Verbal requirement
if(PRCGetMetaMagicFeat(oCaster, FALSE) & METAMAGIC_SILENT
|| GetHasFeat(FEAT_SPELL_PENETRATION, oCaster)
|| GetHasFeat(FEAT_GREATER_SPELL_PENETRATION, oCaster)
|| GetHasFeat(FEAT_EPIC_SPELL_PENETRATION, oCaster))
return 0;
return 2;
}
//
// Calculate Elemental Savant Contributions
//
int ElementalSavantSP(int spell_id, object oCaster = OBJECT_SELF)
{
// get spell elemental type
int element = GetIsElementalSpell(spell_id);
//not an elemental spell
if(!element)
return 0;
int nSP = 0;
// All Elemental Savants will have this feat
// when they first gain a penetration bonus.
// Otherwise this would require checking ~4 items (class or specific feats)
if(GetHasFeat(FEAT_ES_PEN_1, oCaster))
{
int feat, nES;
nES = GetLevelByClass(CLASS_TYPE_ELEMENTAL_SAVANT, oCaster);
// Specify the elemental type rather than lookup by class?
if(element & DESCRIPTOR_FIRE)
{
feat = FEAT_ES_FIRE;
}
else if(element & DESCRIPTOR_COLD)
{
feat = FEAT_ES_COLD;
}
else if(element & DESCRIPTOR_ELECTRICITY)
{
feat = FEAT_ES_ELEC;
}
else if(element & DESCRIPTOR_ACID)
{
feat = FEAT_ES_ACID;
}
// Now determine the bonus
if(feat && GetHasFeat(feat, oCaster))
nSP = nES / 3;
}
// SendMessageToPC(GetFirstPC(), "Your Elemental Penetration modifier is " + IntToString(nSP));
return nSP;
}
//Red Wizard SP boost based on spell school specialization
int RedWizardSP(int spell_id, int nSchool, object oCaster = OBJECT_SELF)
{
int iRedWizard = GetLevelByClass(CLASS_TYPE_RED_WIZARD, oCaster);
int nSP;
if(iRedWizard)
{
int iRWSpec;
switch(nSchool)
{
case SPELL_SCHOOL_ABJURATION: iRWSpec = FEAT_RW_TF_ABJ; break;
case SPELL_SCHOOL_CONJURATION: iRWSpec = FEAT_RW_TF_CON; break;
case SPELL_SCHOOL_DIVINATION: iRWSpec = FEAT_RW_TF_DIV; break;
case SPELL_SCHOOL_ENCHANTMENT: iRWSpec = FEAT_RW_TF_ENC; break;
case SPELL_SCHOOL_EVOCATION: iRWSpec = FEAT_RW_TF_EVO; break;
case SPELL_SCHOOL_ILLUSION: iRWSpec = FEAT_RW_TF_ILL; break;
case SPELL_SCHOOL_NECROMANCY: iRWSpec = FEAT_RW_TF_NEC; break;
case SPELL_SCHOOL_TRANSMUTATION: iRWSpec = FEAT_RW_TF_TRS; break;
}
if(iRWSpec && GetHasFeat(iRWSpec, oCaster))
nSP = (iRedWizard / 2) + 1;
}
// SendMessageToPC(GetFirstPC(), "Your Spell Power modifier is " + IntToString(nSP));
return nSP;
}
int GetSpellPenetreFocusSchool(int nSchool, object oCaster = OBJECT_SELF)
{
if(nSchool)
{
if(GetHasFeat(FEAT_FOCUSED_SPELL_PENETRATION_ABJURATION+nSchool-1, oCaster))
return 4;
}
return 0;
}
int GetSpellPowerBonus(object oCaster = OBJECT_SELF)
{
if(GetHasFeat(FEAT_SPELLPOWER_10, oCaster))
return 10;
else if(GetHasFeat(FEAT_SPELLPOWER_8, oCaster))
return 8;
else if(GetHasFeat(FEAT_SPELLPOWER_6, oCaster))
return 6;
else if(GetHasFeat(FEAT_SPELLPOWER_4, oCaster))
return 4;
else if(GetHasFeat(FEAT_SPELLPOWER_2, oCaster))
return 2;
return 0;
}
// Shadow Weave Feat
// +1 caster level vs SR (school Ench,Illu,Necro)
int ShadowWeavePen(int spell_id, int nSchool, object oCaster = OBJECT_SELF)
{
int iShadow = GetLevelByClass(CLASS_TYPE_SHADOW_ADEPT, oCaster);
int nSP;
// Apply changes if the caster has level in Shadow Adept class
// and this spell is eligible for the spell penetration check increase
if (iShadow > 0 && ShadowWeave(oCaster, spell_id, nSchool) == 1)
// Shadow Spell Power
nSP = iShadow / 3;
return nSP;
}
int KOTCSpellPenVsDemons(object oCaster, object oTarget)
{
if(GetLevelByClass(CLASS_TYPE_KNIGHT_CHALICE, oCaster) >= 1)
{
if(MyPRCGetRacialType(oTarget) == RACIAL_TYPE_OUTSIDER)
{
if(GetAlignmentGoodEvil(oTarget) == ALIGNMENT_EVIL)
{
return 2;
}
}
}
return 0;
}
int RunecasterRunePowerSP(object oCaster)
{
int nSP = 0;
// casting from a rune
if(GetResRef(GetSpellCastItem()) == "prc_rune_1")
{
nSP = StringToInt(GetTag(GetSpellCastItem()));
}
// caster is runechanting
else if(GetHasSpellEffect(SPELL_RUNE_CHANT))
{
int nClass = GetLevelByClass(CLASS_TYPE_RUNECASTER, oCaster);
if (nClass >= 30) nSP = 10;
else if (nClass >= 27) nSP = 9;
else if (nClass >= 24) nSP = 8;
else if (nClass >= 21) nSP = 7;
else if (nClass >= 18) nSP = 6;
else if (nClass >= 15) nSP = 5;
else if (nClass >= 12) nSP = 4;
else if (nClass >= 9) nSP = 3;
else if (nClass >= 5) nSP = 2;
else if (nClass >= 2) nSP = 1;
}
return nSP;
}
int MarshalDeterminedCaster(object oCaster)
{
return GetLocalInt(oCaster,"Marshal_DetCast");
}
int DuskbladeSpellPower(object oCaster, object oTarget)
{
int nSP = 0;
if(GetLocalInt(oTarget, "DuskbladeSpellPower"))
{
int nClass = GetLevelByClass(CLASS_TYPE_DUSKBLADE, oCaster);
if(nClass >= 38) nSP = 10;
else if(nClass >= 36) nSP = 9;
else if(nClass >= 31) nSP = 8;
else if(nClass >= 26) nSP = 7;
else if(nClass >= 21) nSP = 6;
else if(nClass >= 18) nSP = 5;
else if(nClass >= 16) nSP = 4;
else if(nClass >= 11) nSP = 3;
else if(nClass >= 6) nSP = 2;
}
return nSP;
}
int DraconicMagicPower(object oCaster)
{
return GetLocalInt(oCaster,"MagicPowerAura");
}
int TrueCastingSpell(object oCaster)
{
if(GetHasSpellEffect(SPELL_TRUE_CASTING, oCaster))
return 10;
return 0;
}
// Beguilers of level 8+ gain +2 bonus to SR agianst enemis that are denided DEX bonus to AC
int CloakedCastingSR(object oCaster, object oTarget)
{
if(GetLevelByClass(CLASS_TYPE_BEGUILER, oCaster) >= 8)
{
if(GetIsDeniedDexBonusToAC(oTarget, oCaster, TRUE))
return 2;
}
return 0;
}
int PenetratingBlast(object oCaster, object oTarget)
{
if(oTarget == GetLocalObject(oCaster, "SPELLWEAVE_TARGET"))
{
if(GetLocalInt(oCaster, "BlastEssence") == INVOKE_PENETRATING_BLAST)
return 4;
}
return 0;
}
int add_spl_pen(object oCaster = OBJECT_SELF)
{
object oTarget = PRCGetSpellTargetObject();
int spell_id = PRCGetSpellId();
int nSchool = GetSpellSchool(spell_id);
int nSP = ElementalSavantSP(spell_id, oCaster);
nSP += GetHeartWarderPene(spell_id, oCaster);
nSP += RedWizardSP(spell_id, nSchool, oCaster);
nSP += GetSpellPowerBonus(oCaster);
nSP += GetSpellPenetreFocusSchool(nSchool, oCaster);
nSP += ShadowWeavePen(spell_id, nSchool, oCaster);
nSP += RunecasterRunePowerSP(oCaster);
nSP += MarshalDeterminedCaster(oCaster);
nSP += DraconicMagicPower(oCaster);
nSP += TrueCastingSpell(oCaster);
nSP += GetEssentiaInvestedFeat(oCaster, FEAT_SOULTOUCHED_SPELLCASTING);
if(GetIsObjectValid(oTarget))
{
nSP += CloakedCastingSR(oCaster, oTarget);
nSP += PenetratingBlast(oCaster, oTarget);
nSP += KOTCSpellPenVsDemons(oCaster, oTarget);
nSP += DuskbladeSpellPower(oCaster, oTarget);
}
return nSP;
}
//
// This function converts elemental types as needed
//
string ChangedElementalType(int spell_id, object oCaster = OBJECT_SELF)
{
// Lookup the spell type
string spellType = Get2DACache("spells", "ImmunityType", spell_id);//lookup_spell_type(spell_id);
// Check if an override is set
string sType = GetLocalString(oCaster, "archmage_mastery_elements_name");
// If so, check if the spell qualifies for a change
if (sType == "" || !IsSpellTypeElemental(spellType))
sType = spellType;
return sType;
}
//////////////////////////////////////////////////
/* Function definitions */
//////////////////////////////////////////////////
//
// Get the Spell Penetration Bonuses
//
int SPGetPenetr(object oCaster = OBJECT_SELF)
{
int nPenetr = 0;
// This is a deliberate optimization attempt.
// The first feat determines if the others even need
// to be referenced.
if(GetHasFeat(FEAT_SPELL_PENETRATION, oCaster))
{
nPenetr += 2;
if(GetHasFeat(FEAT_EPIC_SPELL_PENETRATION, oCaster))
nPenetr += 4;
else if (GetHasFeat(FEAT_GREATER_SPELL_PENETRATION, oCaster))
nPenetr += 2;
}
// Check for additional improvements
nPenetr += add_spl_pen(oCaster);
return nPenetr;
}
//
// Interface for specific AOE requirements
// TODO: Determine who or what removes the cached local var (bug?)
// TODO: Try and remove this function completely? It does 2 things the
// above function doesnt: Effective Caster Level and Cache
//
int SPGetPenetrAOE(object oCaster = OBJECT_SELF, int nCasterLvl = 0)
{
// Check the cache
int nPenetr = GetLocalInt(OBJECT_SELF, "nPenetre");
// Compute the result
if (!nPenetr) {
nPenetr = (nCasterLvl) ? nCasterLvl : PRCGetCasterLevel(oCaster);
// Factor in Penetration Bonuses
nPenetr += SPGetPenetr(oCaster);
// Who removed this?
SetLocalInt(OBJECT_SELF,"nPenetre",nPenetr);
}
return nPenetr;
}
// Test main
//void main(){}

View File

@@ -1,766 +0,0 @@
/* Core functions taken from high up the branch
which are needed lower. */
//:: Updated for .35 by Jaysyn 2023/03/10
//////////////////////////////////////////////////
/* Forward Declarations */
//////////////////////////////////////////////////
int GetSpellLevel(int nSpell, int nClass);
string GetFileForClass(int nClass);
int GetSpellbookTypeForClass(int nClass);
//////////////////////////////////////////////////
/* Function Prototypes */
//////////////////////////////////////////////////
//:: Returns true if oCaster's race can naturally cast sorcerer spells.
int GetIsRHDSorcerer(object oCaster = OBJECT_SELF);
//:: Returns true if oCaster's race can naturally cast bard spells.
int GetIsRHDBard(object oCaster = OBJECT_SELF);
// wrapper for getspelltargetlocation
location PRCGetSpellTargetLocation(object oCaster = OBJECT_SELF);
// Avoids adding passive spellcasting to the character's action queue by
// creating an object specifically to cast the spell on the character.
//
// NOTE: The spell script must refer to the PC as PRCGetSpellTargetObject()
// otherwise this function WILL NOT WORK. Do not make any assumptions
// about the PC being OBJECT_SELF.
void ActionCastSpellOnSelf(int iSpell, int nMetaMagic = METAMAGIC_NONE, object oTarget = OBJECT_SELF);
// This is a wrapper function that causes OBJECT_SELF to fire the defined spell
// at the defined level. The target is automatically the object or location
// that the user selects. Useful for SLA's to perform the casting of a true
// spell. This is useful because:
//
// 1) If the original's spell script is updated, so is this one.
// 2) The spells are identified as the true spell. That is, they ARE the true spell.
// 3) Spellhooks (such as item crafting) that can only identify true spells
// will easily work.
//
// This function should only be used when SLA's are meant to simulate true
// spellcasting abilities, such as those seen when using feats with subradials
// to simulate spellbooks.
void ActionCastSpell(int iSpell, int iCasterLev = 0, int iBaseDC = 0, int iTotalDC = 0,
int nMetaMagic = METAMAGIC_NONE, int nClass = CLASS_TYPE_INVALID,
int bUseOverrideTargetLocation=FALSE, int bUseOverrideTargetObject=FALSE,
object oOverrideTarget=OBJECT_INVALID, int bInstantCast=TRUE, int bUseOverrideMetaMagic=FALSE);
/**
* Checks whether the given creature is committing an action, or
* under such effects that cause a breach of concentration.
*
* @param oConcentrator The creature to test
* @return TRUE if concentration is broken, FALSE otherwise
*/
int GetBreakConcentrationCheck(object oConcentrator);
/**
* Checks for breaks in concentration for an ongoing effect, and removes
* the effect if concentration is broken.
*
* @param oCaster The creature who cast the effect
* @param SpellID The id of the spell the effect belongs to
* @param oTarget The creature or object that is the target of the effect
* @param nDuration The duration the effect lasts in seconds.
*/
void CheckConcentrationOnEffect(object oCaster, int SpellID, object oTarget, int nDuration);
// gets the spell level adjustment to the nMetaMagic, including boni from the Improved Metamagic (epic) feat
int GetMetaMagicSpellLevelAdjustment(int nMetaMagic);
// Returns true if a spellcaster
int GetIsBioSpellCastClass(int nClass);
// Returns true for spell casters with spellbooks
int GetIsNSBClass(int nClass);
// returns the spelllevel of nSpell as it can be cast by oCreature
int PRCGetSpellLevel(object oCreature, int nSpell);
// returns if a character should be using the newspellbook when casting
int UseNewSpellBook(object oCreature);
// wrapper for GetHasSpell, works for newspellbook 'fake' spells too
// should return 0 if called with a normal spell when a character should be using the newspellbook
int PRCGetHasSpell(int nRealSpellID, object oCreature = OBJECT_SELF);
// checks if oPC knows the specified spell
// only works for classes that use the PRC spellbook, there is currently no way to do this for Bioware spellcasters
int PRCGetIsRealSpellKnown(int nRealSpellID, object oPC = OBJECT_SELF);
// checks if oPC knows the specified spell
// only works for classes that use the PRC spellbook, there is currently no way to do this for Bioware spellcasters
// this will only check the spellbook of the class specified
int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJECT_SELF);
//routes to action cast spell, but puts a wrapper around to tell other functions its a
//SLA, so dont craft etc
//also defaults the totalDC to 10+spellevel+chamod
// moved from prc_inc_racial
void DoRacialSLA(int nSpellID, int nCasterlevel = 0, int nTotalDC = 0, int bInstantCast = FALSE);
/**
* Deletes a stored manifestation structure.
*
* @param oObject The object on which the structure is stored
* @param sName The name under which the structure is stored
*/
void DeleteLocalManifestation(object oObject, string sName);
/**
* Deletes a stored mystery structure.
*
* @param oObject The object on which the structure is stored
* @param sName The name under which the structure is stored
*/
void DeleteLocalMystery(object oObject, string sName);
//////////////////////////////////////////////////
/* Constants */
//////////////////////////////////////////////////
// metamagic spell level adjustments for Bioware provided metamagic feats
const int METAMAGIC_EXTEND_LEVEL = 1;
const int METAMAGIC_SILENT_LEVEL = 1;
const int METAMAGIC_STILL_LEVEL = 1;
const int METAMAGIC_EMPOWER_LEVEL = 2;
const int METAMAGIC_MAXIMIZE_LEVEL = 3;
const int METAMAGIC_QUICKEN_LEVEL = 4;
//////////////////////////////////////////////////
/* Includes */
//////////////////////////////////////////////////
#include "lookup_2da_spell"
#include "inc_lookups"
#include "prc_inc_damage"
#include "prc_inc_sb_const" // Spell Book Constants
#include "x0_i0_position"
/*
access to prc_inc_nwscript via prc_inc_damage
access to PRCGetSpell* via prc_inc_damage
*/
//////////////////////////////////////////////////
/* Function Definitions */
//////////////////////////////////////////////////
//:: Returns true if oCaster's race can naturally cast sorcerer spells.
int GetIsRHDSorcerer(object oCaster = OBJECT_SELF)
{
int nRace = GetRacialType(oCaster);
return (nRace == RACIAL_TYPE_ARANEA ||
nRace == RACIAL_TYPE_ARKAMOI ||
nRace == RACIAL_TYPE_DRIDER ||
nRace == RACIAL_TYPE_HOBGOBLIN_WARSOUL ||
nRace == RACIAL_TYPE_MARRUTACT ||
nRace == RACIAL_TYPE_RAKSHASA ||
nRace == RACIAL_TYPE_REDSPAWN_ARCANISS);
}
//:: Returns true if oCaster's race can naturally cast bard spells.
int GetIsRHDBard(object oCaster = OBJECT_SELF)
{
int nRace = GetRacialType(oCaster);
return (nRace == RACIAL_TYPE_GLOURA);
}
//wrapper for GetSpellTargetLocation()
location PRCGetSpellTargetLocation(object oCaster = OBJECT_SELF)
{
// check if there is an override location on the module, and return that
// bioware did not define a LOCATION_INVALID const, so we must signal a valid override location by setting a local int on the module
if(GetLocalInt(GetModule(), PRC_SPELL_TARGET_LOCATION_OVERRIDE))
{
if (DEBUG) DoDebug("PRCGetSpellTargetLocation: found override target location on module");
return GetLocalLocation(GetModule(), PRC_SPELL_TARGET_LOCATION_OVERRIDE);
}
// check if there is an override location on the caster, and return that
// bioware did not define a LOCATION_INVALID const, so we signal a valid override location by setting a local int on oCaster
if (GetLocalInt(oCaster, PRC_SPELL_TARGET_LOCATION_OVERRIDE))
{
if (DEBUG) DoDebug("PRCGetSpellTargetLocation: found override target location on caster "+GetName(oCaster));
return GetLocalLocation(oCaster, PRC_SPELL_TARGET_LOCATION_OVERRIDE);
}
// The rune/gem/skull always targets the one who activates it.
object oItem = PRCGetSpellCastItem(oCaster);
if(GetIsObjectValid(oItem) && (GetResRef(oItem) == "prc_rune_1" ||
GetResRef(oItem) == "prc_skulltalis" || GetTag(oItem) == "prc_attunegem"))
return GetLocation(GetItemPossessor(oItem));
if (GetLocalInt(oCaster, "BlackLabyrinth") && d10() < 3)
return GenerateNewLocationFromLocation(GetSpellTargetLocation(), FeetToMeters(5.0*d4()), IntToFloat(Random(360)), IntToFloat(Random(360)));
// if we made it here, we must use Bioware's function
return GetSpellTargetLocation();
}
void ActionCastSpellOnSelf(int iSpell, int nMetaMagic = METAMAGIC_NONE, object oTarget = OBJECT_SELF)
{
if(!GetIsObjectValid(oTarget)) oTarget = OBJECT_SELF;
object oCastingObject = CreateObject(OBJECT_TYPE_PLACEABLE, "x0_rodwonder", GetLocation(oTarget));
AssignCommand(oCastingObject, ActionCastSpellAtObject(iSpell, oTarget, nMetaMagic, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE));
if (DEBUG) DoDebug("ActionCastSpellOnSelf: Casting Spell "+IntToString(iSpell)+" on "+GetName(oTarget));
DestroyObject(oCastingObject, 6.0);
}
void ActionCastSpell(int iSpell, int iCasterLev = 0, int iBaseDC = 0, int iTotalDC = 0,
int nMetaMagic = METAMAGIC_NONE, int nClass = CLASS_TYPE_INVALID,
int bUseOverrideTargetLocation=FALSE, int bUseOverrideTargetObject=FALSE,
object oOverrideTarget=OBJECT_INVALID, int bInstantCast=TRUE, int bUseOverrideMetaMagic=FALSE)
{
//if its a hostile spell, clear the action queue
//this stops people stacking hostile spells to be instacast
//at the end, for example when coming out of invisibility
// X - hope this is not needed if spells are cast normally
//if(Get2DACache("spells", "HostileSetting", iSpell) == "1" && bInstantCast)
// ClearAllActions();
object oTarget = PRCGetSpellTargetObject();
location lLoc = PRCGetSpellTargetLocation();
//set the overriding values
if (iCasterLev != 0)
ActionDoCommand(SetLocalInt(OBJECT_SELF, PRC_CASTERLEVEL_OVERRIDE, iCasterLev));
if (iTotalDC != 0)
ActionDoCommand(SetLocalInt(OBJECT_SELF, PRC_DC_TOTAL_OVERRIDE, iTotalDC));
if (iBaseDC != 0)
ActionDoCommand(SetLocalInt(OBJECT_SELF, PRC_DC_BASE_OVERRIDE, iBaseDC));
if (nClass != CLASS_TYPE_INVALID)
ActionDoCommand(SetLocalInt(OBJECT_SELF, PRC_CASTERCLASS_OVERRIDE, nClass));
if (bUseOverrideMetaMagic)
ActionDoCommand(SetLocalInt(OBJECT_SELF, PRC_METAMAGIC_OVERRIDE, nMetaMagic));
else if (nMetaMagic != METAMAGIC_NONE)
ActionDoCommand(SetLocalInt(OBJECT_SELF, PRC_METAMAGIC_ADJUSTMENT, nMetaMagic));
if (bUseOverrideTargetLocation)
{
ActionDoCommand(SetLocalInt(OBJECT_SELF, PRC_SPELL_TARGET_LOCATION_OVERRIDE, TRUE));
//location must be set outside of this function at the moment
//cant pass a location into a function as an optional parameter
//go bioware for not defining an invalid location constant
}
if (bUseOverrideTargetObject)
{
ActionDoCommand(SetLocalInt(OBJECT_SELF, PRC_SPELL_TARGET_OBJECT_OVERRIDE, TRUE));
ActionDoCommand(SetLocalObject(OBJECT_SELF, PRC_SPELL_TARGET_OBJECT_OVERRIDE, oOverrideTarget));
}
ActionDoCommand(SetLocalInt(OBJECT_SELF, "UsingActionCastSpell", TRUE));
if(DEBUG) DoDebug("ActionCastSpell SpellId: " + IntToString(iSpell));
if(DEBUG) DoDebug("ActionCastSpell Caster Level: " + IntToString(iCasterLev));
if(DEBUG) DoDebug("ActionCastSpell Base DC: " + IntToString(iBaseDC));
if(DEBUG) DoDebug("ActionCastSpell Total DC: " + IntToString(iTotalDC));
if(DEBUG) DoDebug("ActionCastSpell Metamagic: " + IntToString(nMetaMagic));
if(DEBUG) DoDebug("ActionCastSpell Caster Class: " + IntToString(nClass));
if(DEBUG) DoDebug("ActionCastSpell Target: " + GetName(oTarget));
if(DEBUG) DoDebug("ActionCastSpell Override Target: " + GetName(oOverrideTarget));
//cast the spell
if (GetIsObjectValid(oOverrideTarget))
ActionCastSpellAtObject(iSpell, oOverrideTarget, nMetaMagic, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstantCast);
else if (GetIsObjectValid(oTarget))
ActionCastSpellAtObject(iSpell, oTarget, nMetaMagic, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, bInstantCast);
else
ActionCastSpellAtLocation(iSpell, lLoc, nMetaMagic, TRUE, PROJECTILE_PATH_TYPE_DEFAULT, bInstantCast);
ActionDoCommand(DeleteLocalInt(OBJECT_SELF, "UsingActionCastSpell"));
//clean up afterwards
if(bInstantCast)//give scripts time to read the variables
{
if (iCasterLev != 0)
ActionDoCommand(DelayCommand(1.0, DeleteLocalInt(OBJECT_SELF, PRC_CASTERLEVEL_OVERRIDE)));
if (iTotalDC != 0)
ActionDoCommand(DelayCommand(1.0, DeleteLocalInt(OBJECT_SELF, PRC_DC_TOTAL_OVERRIDE)));
if (iBaseDC != 0)
ActionDoCommand(DelayCommand(1.0, DeleteLocalInt(OBJECT_SELF, PRC_DC_BASE_OVERRIDE)));
if (nClass != CLASS_TYPE_INVALID)
ActionDoCommand(DelayCommand(1.0, DeleteLocalInt(OBJECT_SELF, PRC_CASTERCLASS_OVERRIDE)));
if (nMetaMagic != METAMAGIC_NONE)
ActionDoCommand(DelayCommand(1.0, DeleteLocalInt(OBJECT_SELF, PRC_METAMAGIC_OVERRIDE)));
if (bUseOverrideTargetLocation)
{
ActionDoCommand(DelayCommand(1.0, DeleteLocalInt(OBJECT_SELF, PRC_SPELL_TARGET_LOCATION_OVERRIDE)));
//location must be set outside of this function at the moment
//cant pass a location into a function as an optional parameter
//go bioware for not defining an invalid location constant
}
if (bUseOverrideTargetObject)
{
ActionDoCommand(DelayCommand(1.0, DeleteLocalInt(OBJECT_SELF, PRC_SPELL_TARGET_OBJECT_OVERRIDE)));
ActionDoCommand(DelayCommand(1.0, DeleteLocalObject(OBJECT_SELF, PRC_SPELL_TARGET_OBJECT_OVERRIDE)));
}
}
else
{
if (iCasterLev != 0)
ActionDoCommand(DeleteLocalInt(OBJECT_SELF, PRC_CASTERLEVEL_OVERRIDE));
if (iTotalDC != 0)
ActionDoCommand(DeleteLocalInt(OBJECT_SELF, PRC_DC_TOTAL_OVERRIDE));
if (iBaseDC != 0)
ActionDoCommand(DeleteLocalInt(OBJECT_SELF, PRC_DC_BASE_OVERRIDE));
if (nClass != CLASS_TYPE_INVALID)
ActionDoCommand(DeleteLocalInt(OBJECT_SELF, PRC_CASTERCLASS_OVERRIDE));
if (bUseOverrideMetaMagic)
ActionDoCommand(DeleteLocalInt(OBJECT_SELF, PRC_METAMAGIC_OVERRIDE));
else if (nMetaMagic != METAMAGIC_NONE)
ActionDoCommand(DeleteLocalInt(OBJECT_SELF, PRC_METAMAGIC_ADJUSTMENT));
if (bUseOverrideTargetLocation)
{
ActionDoCommand(DeleteLocalInt(OBJECT_SELF, PRC_SPELL_TARGET_LOCATION_OVERRIDE));
//location must be set outside of this function at the moment
//cant pass a location into a function as an optional parameter
//go bioware for not defining an invalid location constant
}
if (bUseOverrideTargetObject)
{
ActionDoCommand(DeleteLocalInt(OBJECT_SELF, PRC_SPELL_TARGET_OBJECT_OVERRIDE));
ActionDoCommand(DeleteLocalObject(OBJECT_SELF, PRC_SPELL_TARGET_OBJECT_OVERRIDE));
}
}
/*
//The problem with this approace is that the effects are then applies by the original spell, which could go wrong. What to do?
SetLocalInt(OBJECT_SELF, PRC_SPELLID_OVERRIDE, GetSpellId());
DelayCommand(1.0, DeleteLocalInt(OBJECT_SELF, PRC_SPELLID_OVERRIDE));
string sScript = Get2DACache("spells", "ImpactScript", iSpell);
ExecuteScript(sScript, OBJECT_SELF);
*/
}
int GetBreakConcentrationCheck(object oConcentrator)
{
if (GetHasSpellEffect(VESTIGE_DAHLVERNAR, oConcentrator) && !GetLocalInt(oConcentrator, "PactQuality"+IntToString(VESTIGE_DAHLVERNAR))) return TRUE;
int nAction = GetCurrentAction(oConcentrator);
// creature doing anything that requires attention and breaks concentration
if (nAction == ACTION_DISABLETRAP || nAction == ACTION_TAUNT ||
nAction == ACTION_PICKPOCKET || nAction == ACTION_ATTACKOBJECT ||
nAction == ACTION_COUNTERSPELL || nAction == ACTION_FLAGTRAP ||
nAction == ACTION_CASTSPELL || nAction == ACTION_ITEMCASTSPELL)
{
return TRUE;
}
//suffering a mental effect
effect e1 = GetFirstEffect(oConcentrator);
int nType;
while (GetIsEffectValid(e1))
{
nType = GetEffectType(e1);
if (nType == EFFECT_TYPE_STUNNED || nType == EFFECT_TYPE_PARALYZE ||
nType == EFFECT_TYPE_SLEEP || nType == EFFECT_TYPE_FRIGHTENED ||
nType == EFFECT_TYPE_PETRIFY || nType == EFFECT_TYPE_CONFUSED ||
nType == EFFECT_TYPE_DOMINATED || nType == EFFECT_TYPE_POLYMORPH)
{
return TRUE;
}
e1 = GetNextEffect(oConcentrator);
}
// add to on damage event
AddEventScript(oConcentrator, EVENT_VIRTUAL_ONDAMAGED, "prc_od_conc", FALSE, FALSE);
if(GetLocalInt(oConcentrator, "CONC_BROKEN")) // won't be set first time around regardless
{
DeleteLocalInt(oConcentrator, "CONC_BROKEN"); // reset for next spell
return TRUE;
}
return FALSE;
}
void CheckConcentrationOnEffect(object oCaster, int SpellID, object oTarget, int nDuration)
{
int nDur = GetLocalInt(oCaster, "Conc" + IntToString(SpellID));
if(GetBreakConcentrationCheck(oCaster) == TRUE && nDur < nDuration)
{
FloatingTextStringOnCreature("*Concentration Broken*", oCaster);
DeleteLocalInt(oCaster, "Conc" + IntToString(SpellID));
PRCRemoveSpellEffects(SpellID, oCaster, oTarget);
}
else if(nDur < nDuration)
{
SetLocalInt(oCaster, "Conc" + IntToString(SpellID), nDur + 3);
DelayCommand(3.0, CheckConcentrationOnEffect(oCaster, SpellID, oTarget, nDuration));
}
else
{
DeleteLocalInt(oCaster, "Conc" + IntToString(SpellID));
}
}
int PRCGetSpellLevelForClass(int nSpell, int nClass)
{
string sSpellLevel = "";
if (nClass == CLASS_TYPE_WIZARD || nClass == CLASS_TYPE_SORCERER)
sSpellLevel = Get2DACache("spells", "Wiz_Sorc", nSpell);
else if (nClass == CLASS_TYPE_RANGER)
sSpellLevel = Get2DACache("spells", "Ranger", nSpell);
else if (nClass == CLASS_TYPE_PALADIN)
sSpellLevel = Get2DACache("spells", "Paladin", nSpell);
else if (nClass == CLASS_TYPE_DRUID)
sSpellLevel = Get2DACache("spells", "Druid", nSpell);
else if (nClass == CLASS_TYPE_CLERIC || nClass == CLASS_TYPE_UR_PRIEST || nClass == CLASS_TYPE_OCULAR)
sSpellLevel = Get2DACache("spells", "Cleric", nSpell);
else if (nClass == CLASS_TYPE_BARD)
sSpellLevel = Get2DACache("spells", "Bard", nSpell);
else if (nClass == CLASS_TYPE_ASSASSIN)
sSpellLevel = Get2DACache("spells", "Assassin", nSpell);
else if (nClass == CLASS_TYPE_CULTIST_SHATTERED_PEAK)
sSpellLevel = Get2DACache("spells", "Cultist", nSpell);
else if (nClass == CLASS_TYPE_NENTYAR_HUNTER)
sSpellLevel = Get2DACache("spells", "Nentyar", nSpell);
else if (nClass == CLASS_TYPE_SHADOWLORD)
sSpellLevel = Get2DACache("spells", "Telflammar", nSpell);
else if (nClass == CLASS_TYPE_SLAYER_OF_DOMIEL)
sSpellLevel = Get2DACache("spells", "Domiel", nSpell);
else if (nClass == CLASS_TYPE_SOHEI)
sSpellLevel = Get2DACache("spells", "Sohei", nSpell);
else if (nClass == CLASS_TYPE_VASSAL)
sSpellLevel = Get2DACache("spells", "Bahamut", nSpell);
else if (nClass == CLASS_TYPE_BLACKGUARD)
sSpellLevel = Get2DACache("spells", "Blackguard", nSpell);
else if (nClass == CLASS_TYPE_KNIGHT_CHALICE)
sSpellLevel = Get2DACache("spells", "Chalice", nSpell);
else if (nClass == CLASS_TYPE_KNIGHT_MIDDLECIRCLE)
sSpellLevel = Get2DACache("spells", "MiddleCircle", nSpell);
else if (nClass == CLASS_TYPE_SOLDIER_OF_LIGHT)
sSpellLevel = Get2DACache("spells", "SoLight", nSpell);
else if (nClass == CLASS_TYPE_BLIGHTER)
sSpellLevel = Get2DACache("spells", "Blighter", nSpell);
else if (nClass == CLASS_TYPE_HEALER)
sSpellLevel = Get2DACache("spells", "Healer", nSpell);
else if (nClass == CLASS_TYPE_SHAMAN)
sSpellLevel = Get2DACache("spells", "Shaman", nSpell);
else if (nClass == CLASS_TYPE_INVALID)
sSpellLevel = Get2DACache("spells", "Innate", nSpell);
if (sSpellLevel != "")
return StringToInt(sSpellLevel);
// 2009-9-21: Support real spell ID's. -N-S
// PRCGetSpellLevel() is called several times in the Bioware spellhooking script.
// That means it will always pass a "real" spell ID to this function, but new-spellbook users won't have the real spell!
// GetSpellLevel() takes the fake spell ID, so this function was always failing.
//int nSpellLevel = GetSpellLevel(nSpell, nClass);
int nSpellLevel = -1;
int nSpellbookID = RealSpellToSpellbookID(nClass, nSpell);
if (nSpellbookID == -1)
nSpellLevel = GetSpellLevel(nSpell, nClass);
else
{
string sFile = GetFileForClass(nClass);
string sSpellLevel = Get2DACache(sFile, "Level", nSpellbookID);
if (sSpellLevel != "")
nSpellLevel = StringToInt(sSpellLevel);
}
return nSpellLevel;
}
// returns the spell circle level of nSpell as it can be cast by oCreature
int PRCGetSpellLevel(object oCreature, int nSpell)
{
/*if (!PRCGetHasSpell(nSpell, oCreature))
return -1;*/
int nClass = PRCGetLastSpellCastClass();
int nSpellLevel = PRCGetSpellLevelForClass(nSpell, nClass);
if (nSpellLevel != -1)
return nSpellLevel;
int i;
for (i=1;i<=8;i++)
{
nClass = GetClassByPosition(i, oCreature);
int nCharLevel = GetLevelByClass(nClass, oCreature);
if (nCharLevel)
{
nSpellLevel = PRCGetSpellLevelForClass(nSpell, nClass);
if (nSpellLevel != -1)
return nSpellLevel;
}
}
//return innate level
return StringToInt(Get2DACache("spells", "Innate", nSpell));
}
// gets the spell level adjustment to the nMetaMagic, including boni from the Improved Metamagic (epic) feat
int GetMetaMagicSpellLevelAdjustment(int nMetaMagic)
{
int nAdj;
if (nMetaMagic == 0) return nAdj;
if (nMetaMagic & METAMAGIC_EXTEND) nAdj += METAMAGIC_EXTEND_LEVEL;
if (nMetaMagic & METAMAGIC_SILENT) nAdj += METAMAGIC_SILENT_LEVEL;
if (nMetaMagic & METAMAGIC_STILL) nAdj += METAMAGIC_STILL_LEVEL;
if (nMetaMagic & METAMAGIC_EMPOWER) nAdj += METAMAGIC_EMPOWER_LEVEL;
if (nMetaMagic & METAMAGIC_MAXIMIZE) nAdj += METAMAGIC_MAXIMIZE_LEVEL;
if (nMetaMagic & METAMAGIC_QUICKEN) nAdj += METAMAGIC_QUICKEN_LEVEL;
return nAdj;
}
int GetIsBioSpellCastClass(int nClass)
{
return nClass == CLASS_TYPE_WIZARD
|| nClass == CLASS_TYPE_SORCERER && !GetIsRHDSorcerer()
|| nClass == CLASS_TYPE_BARD && !GetIsRHDBard()
|| nClass == CLASS_TYPE_CLERIC
|| nClass == CLASS_TYPE_HEALER
|| nClass == CLASS_TYPE_BLIGHTER
|| nClass == CLASS_TYPE_BLACKGUARD
|| nClass == CLASS_TYPE_UR_PRIEST
|| nClass == CLASS_TYPE_OCULAR
|| nClass == CLASS_TYPE_SLAYER_OF_DOMIEL
|| nClass == CLASS_TYPE_CULTIST_SHATTERED_PEAK
|| nClass == CLASS_TYPE_NENTYAR_HUNTER
|| nClass == CLASS_TYPE_SHADOWLORD
|| nClass == CLASS_TYPE_SOHEI
|| nClass == CLASS_TYPE_SOLDIER_OF_LIGHT
|| nClass == CLASS_TYPE_VASSAL
|| nClass == CLASS_TYPE_KNIGHT_MIDDLECIRCLE
|| nClass == CLASS_TYPE_KNIGHT_CHALICE
|| nClass == CLASS_TYPE_SHAMAN
|| nClass == CLASS_TYPE_DRUID
|| nClass == CLASS_TYPE_PALADIN
|| nClass == CLASS_TYPE_RANGER;
}
int GetIsNSBClass(int nClass)
{
return !GetIsBioSpellCastClass(nClass)
&& GetSpellbookTypeForClass(nClass) != SPELLBOOK_TYPE_INVALID;
}
// returns if a character should be using the newspellbook when casting
int UseNewSpellBook(object oCreature)
{
int i;
for (i = 1; i <= 8; i++)
{
int nClass = GetClassByPosition(i, oCreature);
if(GetIsNSBClass(nClass))
return TRUE;
}
// Special case
if(GetLevelByClass(CLASS_TYPE_ULTIMATE_MAGUS, oCreature))
return TRUE;
int nPrimaryArcane = GetPrimaryArcaneClass(oCreature);
//check they have bard/sorc in first arcane slot
if(nPrimaryArcane != CLASS_TYPE_BARD && nPrimaryArcane != CLASS_TYPE_SORCERER)
return FALSE;
//check they have arcane PrC or Draconic Breath/Arcane Grace
if(!GetArcanePRCLevels(oCreature, nPrimaryArcane)
&& !(GetHasFeat(FEAT_DRACONIC_GRACE, oCreature) || GetHasFeat(FEAT_DRACONIC_BREATH, oCreature)))
return FALSE;
//check if the newspellbooks are disabled
if((GetPRCSwitch(PRC_SORC_DISALLOW_NEWSPELLBOOK) && nPrimaryArcane == CLASS_TYPE_SORCERER) ||
(GetPRCSwitch(PRC_BARD_DISALLOW_NEWSPELLBOOK) && nPrimaryArcane == CLASS_TYPE_BARD))
return FALSE;
//check they have bard/sorc levels
if(!GetLevelByClass(CLASS_TYPE_BARD) && !GetLevelByClass(CLASS_TYPE_SORCERER))
return FALSE;
//at this point, they should be using the new spellbook
return TRUE;
}
// wrapper for GetHasSpell, works for newspellbook 'fake' spells too (and metamagic)
// should return 0 if called with a normal spell when a character should be using the newspellbook
int PRCGetHasSpell(int nRealSpellID, object oCreature = OBJECT_SELF)
{
if(!PRCGetIsRealSpellKnown(nRealSpellID, oCreature))
return 0;
int nUses = GetHasSpell(nRealSpellID, oCreature);
int nClass, nSpellbookID, nCount, nMeta, i, j;
int nSpellbookType, nSpellLevel;
string sFile, sFeat;
for(i = 1; i <= 8; i++)
{
nClass = GetClassByPosition(i, oCreature);
sFile = GetFileForClass(nClass);
nSpellbookType = GetSpellbookTypeForClass(nClass);
nSpellbookID = RealSpellToSpellbookID(nClass, nRealSpellID);
nMeta = RealSpellToSpellbookIDCount(nClass, nRealSpellID);
if (nSpellbookID != -1)
{ //non-spellbook classes should return -1
for(j = nSpellbookID; j <= nSpellbookID + nMeta; j++)
{
sFeat = Get2DACache(sFile, "ReqFeat", j);
if(sFeat != "")
{
if(!GetHasFeat(StringToInt(sFeat), oCreature))
continue;
}
if(nSpellbookType == SPELLBOOK_TYPE_PREPARED)
{
nCount = persistant_array_get_int(oCreature, "NewSpellbookMem_" + IntToString(nClass), j);
if(DEBUG) DoDebug("prc_inc_core >> PRCGetHasSpell: NewSpellbookMem_" + IntToString(nClass) + "[" + IntToString(j) + "] = " + IntToString(nCount));
if(nCount > 0)
{
nUses += nCount;
}
}
else if(nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS)
{
nSpellLevel = StringToInt(Get2DACache(sFile, "Level", j));
nCount = persistant_array_get_int(oCreature, "NewSpellbookMem_" + IntToString(nClass), nSpellLevel);
if(DEBUG) DoDebug("prc_inc_core >> PRCGetHasSpell: NewSpellbookMem_" + IntToString(nClass) + "[" + IntToString(j) + "] = " + IntToString(nCount));
if(nCount > 0)
{
nUses += nCount;
}
}
}
}
}
if(DEBUG) DoDebug("PRCGetHasSpell: RealSpellID = " + IntToString(nRealSpellID) + ", Uses = " + IntToString(nUses));
return nUses;
}
// checks if oPC knows the specified spell
// only works for classes that use the PRC spellbook, there is currently no way to do this for Bioware spellcasters
int PRCGetIsRealSpellKnown(int nRealSpellID, object oPC = OBJECT_SELF)
{
if(GetHasSpell(nRealSpellID, oPC)) //FUGLY HACK: bioware class having uses of the spell
return TRUE; // means they know the spell (close enough)
int nClass;
int nClassSlot = 1;
while(nClassSlot <= 8)
{
nClass = GetClassByPosition(nClassSlot, oPC);
if(GetIsDivineClass(nClass) || GetIsArcaneClass(nClass))
if(PRCGetIsRealSpellKnownByClass(nRealSpellID, nClass, oPC))
return TRUE;
nClassSlot++;
}
// got here means no match
return FALSE;
}
// checks if oPC knows the specified spell
// only works for classes that use the PRC spellbook, there is currently no way to do this for Bioware spellcasters
// this will only check the spellbook of the class specified
int PRCGetIsRealSpellKnownByClass(int nRealSpellID, int nClass, object oPC = OBJECT_SELF)
{
// check for whether bard and sorc are using the prc spellbooks
if (nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_SORCERER)
{
if(!UseNewSpellBook(oPC))
return FALSE;
}
// get the cls_spell_***.2da index for the real spell
int nSpellbookSpell = RealSpellToSpellbookID(nClass, nRealSpellID);
// if the spell does not exist in the spellbook, return FALSE
if (nSpellbookSpell == -1)
return FALSE;
// next check if the PC is high enough level to know the spell
string sFile = GetFileForClass(nClass);
int nSpellLevel = -1;
string sSpellLevel = Get2DACache(sFile, "Level", nSpellbookSpell);
if (sSpellLevel != "")
nSpellLevel = StringToInt(sSpellLevel);
if ((GetLevelByClass(nClass) < nSpellLevel) || nSpellLevel == -1)
return FALSE; // not high enough level
// at this stage, prepared casters know the spell and only spontaneous classes need checking
// there are exceptions and these need hardcoding:
if((GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_PREPARED) && nClass != CLASS_TYPE_ARCHIVIST)
return TRUE;
// spontaneous casters have all their known spells as hide feats
// get the featID of the spell
int nFeatID = StringToInt(Get2DACache(sFile, "FeatID", nSpellbookSpell));
if (GetHasFeat(nFeatID, oPC))
return TRUE;
return FALSE;
}
//routes to action cast spell, but puts a wrapper around to tell other functions its a
//SLA, so dont craft etc
//also defaults th totalDC to 10+spellevel+chamod
//this is Base DC, not total DC. SLAs are still spells, so spell focus should still apply.
void DoRacialSLA(int nSpellID, int nCasterlevel = 0, int nTotalDC = 0, int bInstantCast = FALSE)
{
if(DEBUG) DoDebug("Spell DC passed to DoRacialSLA: " + IntToString(nTotalDC));
if(nTotalDC == 0)
nTotalDC = 10
+StringToInt(Get2DACache("spells", "Innate", nSpellID))
+GetAbilityModifier(ABILITY_CHARISMA);
ActionDoCommand(SetLocalInt(OBJECT_SELF, "SpellIsSLA", TRUE));
if(DEBUG) DoDebug("Spell DC entered in ActionCastSpell: " + IntToString(nTotalDC));
ActionCastSpell(nSpellID, nCasterlevel, 0, nTotalDC, METAMAGIC_NONE, CLASS_TYPE_INVALID, FALSE, FALSE, OBJECT_INVALID, bInstantCast);
//ActionCastSpell(nSpellID, nCasterlevel, 0, nTotalDC);
ActionDoCommand(DeleteLocalInt(OBJECT_SELF, "SpellIsSLA"));
}
void DeleteLocalManifestation(object oObject, string sName)
{
DeleteLocalObject(oObject, sName + "_oManifester");
DeleteLocalInt(oObject, sName + "_bCanManifest");
DeleteLocalInt(oObject, sName + "_nPPCost");
DeleteLocalInt(oObject, sName + "_nPsiFocUsesRemain");
DeleteLocalInt(oObject, sName + "_nManifesterLevel");
DeleteLocalInt(oObject, sName + "_nSpellID");
DeleteLocalInt(oObject, sName + "_nTimesAugOptUsed_1");
DeleteLocalInt(oObject, sName + "_nTimesAugOptUsed_2");
DeleteLocalInt(oObject, sName + "_nTimesAugOptUsed_3");
DeleteLocalInt(oObject, sName + "_nTimesAugOptUsed_4");
DeleteLocalInt(oObject, sName + "_nTimesAugOptUsed_5");
DeleteLocalInt(oObject, sName + "_nTimesGenericAugUsed");
DeleteLocalInt(oObject, sName + "_bChain");
DeleteLocalInt(oObject, sName + "_bEmpower");
DeleteLocalInt(oObject, sName + "_bExtend");
DeleteLocalInt(oObject, sName + "_bMaximize");
DeleteLocalInt(oObject, sName + "_bSplit");
DeleteLocalInt(oObject, sName + "_bTwin");
DeleteLocalInt(oObject, sName + "_bWiden");
DeleteLocalInt(oObject, sName + "_bQuicken");
}
void DeleteLocalMystery(object oObject, string sName)
{
DeleteLocalObject(oObject, sName + "_oShadow");
DeleteLocalInt(oObject, sName + "_bCanMyst");
DeleteLocalInt(oObject, sName + "_nShadowcasterLevel");
DeleteLocalInt(oObject, sName + "_nMystId");
DeleteLocalInt(oObject, sName + "_nPen");
DeleteLocalInt(oObject, sName + "_bIgnoreSR");
DeleteLocalInt(oObject, sName + "_bEmpower");
DeleteLocalInt(oObject, sName + "_bExtend");
DeleteLocalInt(oObject, sName + "_bMaximize");
DeleteLocalInt(oObject, sName + "_bQuicken");
DeleteLocalInt(oObject, sName + "_nSaveDC");
DeleteLocalFloat(oObject, sName + "_fDur");
}
//::void main (){}

View File

@@ -1,203 +0,0 @@
//
// Wrapper Functions for the Archmage Class and Feats
//
//
// Notes: Normal use is to include prc_alterations.
// If this file if to be included elsewhere add the following lines
// to the target file:
// #include "prcsp_reputation"
// #include "prcsp_archmaginc"
//
//////////////////////////////////////////////////
/* Constants */
//////////////////////////////////////////////////
/// @todo Change these to TLK reads
const string MASTERY_OF_ELEMENTS_TAG = "archmage_mastery_elements";
const string MASTERY_OF_ELEMENTS_NAME_TAG = "archmage_mastery_elements_name";
const string MASTERY_OF_SHAPE_TAG = "archmage_mastery_shaping";
const string MASTERY_OF_SHAPE_ON = "Shaping spells to protect allies.";
const string MASTERY_OF_SHAPE_OFF = "Spell shaping is disabled, allies may be effected.";
const string MASTERY_OF_ELEMENTS_ACID = "Elemental spell damage set to acid.";
const string MASTERY_OF_ELEMENTS_COLD = "Elemental spell damage set to cold.";
const string MASTERY_OF_ELEMENTS_ELECTRICAL = "Elemental spell damage set to electrical.";
const string MASTERY_OF_ELEMENTS_FIRE = "Elemental spell damage set to fire.";
const string MASTERY_OF_ELEMENTS_SONIC = "Elemental spell damage set to sonic.";
const string MASTERY_OF_ELEMENTS_OFF = "Elemental spell damage returned to normal.";
const int FEAT_INACTIVE = 0;
const int FEAT_ACTIVE = 1;
const int MASTERY_OF_SHAPE_EFFECT = 460;
const int MASTERY_OF_ELEMENTS_EFFECT_ACID = 448;
const int MASTERY_OF_ELEMENTS_EFFECT_ELECTRICAL = 463;
const int MASTERY_OF_ELEMENTS_EFFECT_OFF = 460;
const int SPELL_MASTERY_ELEMENTS_NORMAL = 2000;
const int SPELL_MASTERY_ELEMENTS_ACID = 2003;
const int SPELL_MASTERY_ELEMENTS_COLD = 2002;
const int SPELL_MASTERY_ELEMENTS_ELECTRICITY = 2004;
const int SPELL_MASTERY_ELEMENTS_FIRE = 2001;
const int SPELL_MASTERY_ELEMENTS_SONIC = 2005;
const int TIME_1_ROUND = 1;
int PRCGetSpellLevel(object oCreature, int nSpell);
int PRCGetSpellId(object oCaster = OBJECT_SELF);
object PRCGetSpellTargetObject(object oCaster = OBJECT_SELF);
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
/**
* Determines if Master of Shapes is active and applies in regards to the
* given target.
*
* @param oCaster A creature casting an area-affecting spell
* @param oTarget A creature that is in the affected area
* @return TRUE if the creature should be exempt from the spell due to
* Mastery of Shapes. FALSE otherwise
*/
int CheckMasteryOfShapes(object oCaster, object oTarget);
void SetFeatVisualEffects(object oCaster, int nEffect, string sMessage);
void ToggleMasteryOfShapes(object oCaster);
void SetMasteryOfElements();
//////////////////////////////////////////////////
/* Includes */
//////////////////////////////////////////////////
//#include "lookup_2da_spell"
#include "prcsp_reputation"
//#include "prc_inc_spells"
//////////////////////////////////////////////////
/* Function definitions */
//////////////////////////////////////////////////
int CheckMasteryOfShapes(object oCaster, object oTarget)
{
int bRetVal = FALSE;
// This variable should not be set without the feat being available.
// If someone wants to cheat, let them.
if (GetLocalInt(oCaster, MASTERY_OF_SHAPE_TAG) == FEAT_ACTIVE && !GetIsReactionTypeHostile(oTarget, oCaster))
{
bRetVal = TRUE;
}
return bRetVal;
}
int ExtraordinarySpellAim(object oCaster, object oTarget)
{
int bRetVal = FALSE;
// This variable should not be set without the feat being available.
// If someone wants to cheat, let them.
if(GetHasFeat(FEAT_EXTRAORDINARY_SPELL_AIM, oCaster)
&& !GetLocalInt(oCaster, "ExtraordinarySpellAim")
&& GetIsFriend(oTarget, oCaster))
{
// Only once per spell
SetLocalInt(oCaster, "ExtraordinarySpellAim", TRUE);
DelayCommand(1.0, DeleteLocalInt(oCaster, "ExtraordinarySpellAim"));
if(GetIsSkillSuccessful(oCaster, SKILL_SPELLCRAFT, 25 + PRCGetSpellLevel(oCaster, PRCGetSpellId())))
bRetVal = TRUE;
}
return bRetVal;
}
//
// Help with Visual Effects when setting feats
//
void SetFeatVisualEffects(object oCaster, int nEffect, string sMessage)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(nEffect),
oCaster, RoundsToSeconds(TIME_1_ROUND));
FloatingTextStringOnCreature(sMessage, OBJECT_SELF, FALSE);
}
//
// Enable/Disable Mastery of Shapes
//
void ToggleMasteryOfShapes(object oCaster)
{
if (GetLocalInt(OBJECT_SELF, MASTERY_OF_SHAPE_TAG) == FEAT_INACTIVE) {
SetLocalInt(OBJECT_SELF, MASTERY_OF_SHAPE_TAG, FEAT_ACTIVE);
SetFeatVisualEffects(oCaster, MASTERY_OF_SHAPE_EFFECT, MASTERY_OF_SHAPE_ON);
}
else {
SetLocalInt(OBJECT_SELF, MASTERY_OF_SHAPE_TAG, FEAT_INACTIVE);
SetFeatVisualEffects(oCaster, MASTERY_OF_SHAPE_EFFECT, MASTERY_OF_SHAPE_OFF);
}
}
//
// This function sets the Mastery of Elements feat to a specific element
//
void SetMasteryOfElements()
{
string msg = MASTERY_OF_ELEMENTS_OFF;
string sElem = "";
int nEffect = MASTERY_OF_ELEMENTS_EFFECT_OFF;
int dmgType = FEAT_INACTIVE;
switch (PRCGetSpellId()) {
case SPELL_MASTERY_ELEMENTS_ACID:
nEffect = MASTERY_OF_ELEMENTS_EFFECT_ACID;
dmgType = DAMAGE_TYPE_ACID;
msg = MASTERY_OF_ELEMENTS_ACID;
sElem = "Acid";
break;
case SPELL_MASTERY_ELEMENTS_COLD:
nEffect = VFX_IMP_AC_BONUS;
dmgType = DAMAGE_TYPE_COLD;
msg = MASTERY_OF_ELEMENTS_COLD;
sElem = "Cold";
break;
case SPELL_MASTERY_ELEMENTS_ELECTRICITY:
nEffect = MASTERY_OF_ELEMENTS_EFFECT_ELECTRICAL;
dmgType = DAMAGE_TYPE_ELECTRICAL;
msg = MASTERY_OF_ELEMENTS_ELECTRICAL;
sElem = "Electricity";
break;
case SPELL_MASTERY_ELEMENTS_FIRE:
nEffect = VFX_IMP_ELEMENTAL_PROTECTION;
dmgType = DAMAGE_TYPE_FIRE;
msg = MASTERY_OF_ELEMENTS_FIRE;
sElem = "Fire";
break;
case SPELL_MASTERY_ELEMENTS_SONIC:
nEffect = VFX_FNF_SOUND_BURST;
dmgType = DAMAGE_TYPE_SONIC;
msg = MASTERY_OF_ELEMENTS_SONIC;
sElem = "Sonic";
break;
default:
// Use the default initialized variables
break;
}
SetLocalInt(OBJECT_SELF, MASTERY_OF_ELEMENTS_TAG, dmgType);
SetLocalString(OBJECT_SELF, MASTERY_OF_ELEMENTS_NAME_TAG, sElem);
SetFeatVisualEffects(PRCGetSpellTargetObject(), nEffect, msg);
}
// Test main
//void main(){}

View File

@@ -1,419 +0,0 @@
// Module Constants
const float CACHE_TIMEOUT_CAST = 2.0;
const string CASTER_LEVEL_TAG = "PRCEffectiveCasterLevel";
// Constants that dictate ResistSpell results
const int SPELL_RESIST_FAIL = 0;
const int SPELL_RESIST_PASS = 1;
const int SPELL_RESIST_GLOBE = 2;
const int SPELL_RESIST_MANTLE = 3;
//////////////////////////////////////////////////
/* Forward Declarations */
//////////////////////////////////////////////////
int PRCDoResistSpell(object oCaster, object oTarget, int nEffCasterLvl=0, float fDelay = 0.0);
int CheckSpellfire(object oCaster, object oTarget, int bFriendly = FALSE);
int PRCGetLastSpellCastClass(object oCaster = OBJECT_SELF);
int GetIsArcaneClass(int nClass, object oCaster = OBJECT_SELF);
int GetIsDivineClass(int nClass, object oCaster = OBJECT_SELF);
int GetIsIncarnumUser(object oMeldshaper);
int GetIsMeldBound(object oMeldshaper, int nMeld = -1);
int GetEssentiaInvestedFeat(object oMeldshaper, int nFeat);
void SetPersistantLocalInt(object oPC, string sName, int nValue);
int GetPersistantLocalInt(object oPC, string sName);
//////////////////////////////////////////////////
/* Included Files */
//////////////////////////////////////////////////
#include "prc_inc_racial"
//#include "prc_feat_const"
//#include "prc_class_const"
//#include "prcsp_reputation"
#include "prcsp_archmaginc"
//#include "prc_add_spell_dc"
#include "prc_add_spl_pen"
#include "moi_meld_const"
//
// This function is a wrapper should someone wish to rewrite the Bioware
// version. This is where it should be done.
//
int PRCResistSpell(object oCaster, object oTarget)
{
return ResistSpell(oCaster, oTarget);
}
//
// This function is a wrapper should someone wish to rewrite the Bioware
// version. This is where it should be done.
//
int PRCGetSpellResistance(object oTarget, object oCaster)
{
int iSpellRes = GetSpellResistance(oTarget);
int nHD = GetHitDice(oTarget);
//racial pack SR
int iRacialSpellRes = 0;
if(GetHasFeat(FEAT_SPELL27, oTarget))
iRacialSpellRes = 27 + nHD;
else if(GetHasFeat(FEAT_SPELL25, oTarget))
iRacialSpellRes = 25 + nHD;
else if(GetHasFeat(FEAT_SPELL23, oTarget))
iRacialSpellRes = 23 + nHD;
else if(GetHasFeat(FEAT_SPELL22, oTarget))
iRacialSpellRes = 22 + nHD;
else if(GetHasFeat(FEAT_SPELL21, oTarget))
iRacialSpellRes = 21 + nHD;
else if(GetHasFeat(FEAT_SPELL20, oTarget))
iRacialSpellRes = 20 + nHD;
else if(GetHasFeat(FEAT_SPELL19, oTarget))
iRacialSpellRes = 19 + nHD;
else if(GetHasFeat(FEAT_SPELL18, oTarget))
iRacialSpellRes = 18 + nHD;
else if(GetHasFeat(FEAT_SPELL17, oTarget))
iRacialSpellRes = 17 + nHD;
else if(GetHasFeat(FEAT_SPELL16, oTarget))
iRacialSpellRes = 16 + nHD;
else if(GetHasFeat(FEAT_SPELL15, oTarget))
iRacialSpellRes = 15 + nHD;
else if(GetHasFeat(FEAT_SPELL14, oTarget))
iRacialSpellRes = 14 + nHD;
else if(GetHasFeat(FEAT_SPELL13, oTarget))
iRacialSpellRes = 13 + nHD;
else if(GetHasFeat(FEAT_SPELL11, oTarget))
iRacialSpellRes = 11 + nHD;
else if(GetHasFeat(FEAT_SPELL10, oTarget))
iRacialSpellRes = 10 + nHD;
else if(GetHasFeat(FEAT_SPELL8, oTarget))
iRacialSpellRes = 8 + nHD;
else if(GetHasFeat(FEAT_SPELL5, oTarget))
iRacialSpellRes = 5 + nHD;
if(iRacialSpellRes > iSpellRes)
iSpellRes = iRacialSpellRes;
// Exalted Companion, can also be used for Celestial Template
if(GetLocalInt(oTarget, "CelestialTemplate") || GetLocalInt(oTarget, "PseudonaturalTemplate"))
{
int nSR = nHD * 2;
if (nSR > 25) nSR = 25;
if (nSR > iSpellRes) iSpellRes = nSR;
}
// Enlightened Fist SR = 10 + monk level + enlightened fist level
if(GetHasFeat(FEAT_EF_DIAMOND_SOUL, oTarget))
{
int nEF = 10 + GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oTarget) + GetLevelByClass(CLASS_TYPE_MONK, oTarget);
if(nEF > iSpellRes)
iSpellRes = nEF;
}
// Contemplative SR = 15 + contemplative level
if(GetHasFeat(FEAT_DIVINE_SOUL, oTarget))
{
int nCont = 15 + GetLevelByClass(CLASS_TYPE_CONTEMPLATIVE, oTarget);
if(nCont > iSpellRes)
iSpellRes = nCont;
}
// Marrutact
if(GetRacialType(oTarget) == RACIAL_TYPE_MARRUTACT)
{
int nCont = 9 + GetHitDice(oTarget);
if(nCont > iSpellRes)
iSpellRes = nCont;
}
// Hobgoblin Wsrsoul
if(GetRacialType(oTarget) == RACIAL_TYPE_HOBGOBLIN_WARSOUL)
{
int nCont = 8 + GetHitDice(oTarget);
if(nCont > iSpellRes)
iSpellRes = nCont;
}
// Exordius Weapon of Legacy
if(GetLocalInt(oTarget, "ExordiusSR"))
{
int nCont = 5 + GetHitDice(oTarget);
if(nCont > iSpellRes)
iSpellRes = nCont;
}
// Hammer of Witches Weapon of Legacy
if(GetLocalInt(oTarget, "HammerWitchesSR"))
{
// SR vs arcane only
if(GetIsArcaneClass(PRCGetLastSpellCastClass(oCaster)))
{
int nCont = 5 + GetHitDice(oTarget);
if(nCont > iSpellRes)
iSpellRes = nCont;
}
}
// Ur-Priest
int nPriestLevel = GetLevelByClass(CLASS_TYPE_UR_PRIEST, oTarget);
if(nPriestLevel >= 4)
{
// SR vs divine only
if(GetIsDivineClass(PRCGetLastSpellCastClass(oCaster)))
{
//if(nPriestLevel > 50) nPriestLevel = 50; //:: cap if needed
// Calculate bonus: 15 at level 4, then +5 for every additional 4 levels
int nCont = 15 + (((nPriestLevel - 4) / 4) * 5);
if(nCont > iSpellRes)
iSpellRes = nCont;
}
}
/* // Ur-Priest
if(GetLevelByClass(CLASS_TYPE_UR_PRIEST, oTarget) >= 4)
{
// SR vs divine only
if(GetIsDivineClass(PRCGetLastSpellCastClass(oCaster)))
{
int nCont = 15;
if (GetLevelByClass(CLASS_TYPE_UR_PRIEST, oTarget) >= 8) nCont = 20;
if(nCont > iSpellRes)
iSpellRes = nCont;
}
} */
// Dread Carapace Heart Bind
if(GetIsIncarnumUser(oTarget))
{
if (GetIsMeldBound(oTarget, MELD_DREAD_CARAPACE) == CHAKRA_CROWN)
{
int nCont = 5 + (4 * GetEssentiaInvested(oTarget, MELD_DREAD_CARAPACE));
if(nCont > iSpellRes)
iSpellRes = nCont;
}
if (GetHasSpellEffect(MELD_SPELLWARD_SHIRT, oTarget)) // MELD_SPELLWARD_SHIRT
{
int nCont = 5 + (4 * GetEssentiaInvested(oTarget, MELD_SPELLWARD_SHIRT));
if(nCont > iSpellRes)
iSpellRes = nCont;
}
}
// Foe Hunter SR stacks with normal SR when a spell is cast by their hated enemy
if(GetHasFeat(FEAT_HATED_ENEMY_SR, oTarget) && GetLocalInt(oTarget, "HatedFoe") == MyPRCGetRacialType(oCaster))
{
iSpellRes += 15 + GetLevelByClass(CLASS_TYPE_FOE_HUNTER, oTarget);
}
// Adds +4 to SR
if(GetHasFeat(FEAT_PSYCHIC_REFUSAL, oTarget))
iSpellRes += 4;
// Forsaker SR adds to existing
if(GetLevelByClass(CLASS_TYPE_FORSAKER, oTarget))
iSpellRes = iSpellRes + 10 + GetLevelByClass(CLASS_TYPE_FORSAKER, oTarget);
return iSpellRes;
}
//
// If a spell is resisted, display the effect
//
void PRCShowSpellResist(object oCaster, object oTarget, int nResist, float fDelay = 0.0)
{
// If either caster/target is a PC send them a message
if (GetIsPC(oCaster))
{
string message = nResist == SPELL_RESIST_FAIL ?
"Target is affected by the spell." : "Target resisted the spell.";
SendMessageToPC(oCaster, message);
}
if (GetIsPC(oTarget))
{
string message = nResist == SPELL_RESIST_FAIL ?
"You are affected by the spell." : "You resisted the spell.";
SendMessageToPC(oTarget, message);
}
if (nResist != SPELL_RESIST_FAIL) {
// Default to a standard resistance
int eve = VFX_IMP_MAGIC_RESISTANCE_USE;
// Check for other resistances
if (nResist == SPELL_RESIST_GLOBE)
eve = VFX_IMP_GLOBE_USE;
else if (nResist == SPELL_RESIST_MANTLE)
eve = VFX_IMP_SPELL_MANTLE_USE;
// Render the effect
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,
EffectVisualEffect(eve), oTarget));
}
}
//
// This function overrides the BioWare MyResistSpell.
// TODO: Change name to PRCMyResistSpell.
//
int PRCDoResistSpell(object oCaster, object oTarget, int nEffCasterLvl=0, float fDelay = 0.0)
{
int nResist;
// Check if the archmage shape mastery applies to this target
if (CheckSpellfire(oCaster, oTarget) || CheckMasteryOfShapes(oCaster, oTarget) || ExtraordinarySpellAim(oCaster, oTarget) || (GetLocalInt(oCaster, "WOL_DesertWindFireball") && GetSpellId() == SPELL_FIREBALL))
nResist = SPELL_RESIST_MANTLE;
else if(GetLevelByClass(CLASS_TYPE_BEGUILER, oCaster) >= 20 && GetIsDeniedDexBonusToAC(oTarget, oCaster, TRUE))
{
//Beguilers of level 20+ automatically overcome SR of targets denied Dex bonus to AC
nResist = SPELL_RESIST_FAIL;
}
else if(GetLocalInt(oCaster, "CunningBreach"))
{
//Factotum can pay to breach all SR for a round
nResist = SPELL_RESIST_FAIL;
}
//using vitriolic blast with eldritch spellweave
else if(oTarget == GetLocalObject(oCaster, "SPELLWEAVE_TARGET")
&& GetLocalInt(oCaster, "BlastEssence") == INVOKE_VITRIOLIC_BLAST)
{
nResist = SPELL_RESIST_FAIL;
}
else {
// Check immunities and mantles, otherwise ignore the result completely
nResist = PRCResistSpell(oCaster, oTarget);
//Resonating Resistance
if((nResist <= SPELL_RESIST_PASS) && (GetHasSpellEffect(SPELL_RESONATING_RESISTANCE, oTarget)))
{
nResist = PRCResistSpell(oCaster, oTarget);
}
if (nResist <= SPELL_RESIST_PASS)
{
nResist = SPELL_RESIST_FAIL;
// Because the version of this function was recently changed to
// optionally allow the caster level, we must calculate it here.
// The result will be cached for a period of time.
if (!nEffCasterLvl) {
nEffCasterLvl = GetLocalInt(oCaster, CASTER_LEVEL_TAG);
if (!nEffCasterLvl) {
nEffCasterLvl = PRCGetCasterLevel(oCaster) + SPGetPenetr();
SetLocalInt(oCaster, CASTER_LEVEL_TAG, nEffCasterLvl);
DelayCommand(CACHE_TIMEOUT_CAST,
DeleteLocalInt(oCaster, CASTER_LEVEL_TAG));
}
}
// Pernicious Magic
// +4 caster level vs SR Weave user (not Evoc & Trans spells)
int iWeav;
if (GetHasFeat(FEAT_PERNICIOUSMAGIC,oCaster))
{
if (!GetHasFeat(FEAT_SHADOWWEAVE,oTarget))
{
int nSchool = GetLocalInt(oCaster, "X2_L_LAST_SPELLSCHOOL_VAR");
if ( nSchool != SPELL_SCHOOL_EVOCATION && nSchool != SPELL_SCHOOL_TRANSMUTATION )
iWeav=4;
}
}
// A tie favors the caster.
if ((nEffCasterLvl + d20(1)+iWeav) < PRCGetSpellResistance(oTarget, oCaster))
nResist = SPELL_RESIST_PASS;
}
}
// Karsites heal from resisting a spell
if(GetRacialType(oTarget) == RACIAL_TYPE_KARSITE && nResist == SPELL_RESIST_PASS)
{
int nSpellLevel = StringToInt(Get2DACache("spells", "Innate", PRCGetSpellId()));
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(nSpellLevel*2), oTarget);
}
PRCShowSpellResist(oCaster, oTarget, nResist, fDelay);
return nResist;
}
//Returns the maximum number of spellfire levels oPC can store
int SpellfireMax(object oPC)
{
//can't absorb spells without feat
if(!GetHasFeat(FEAT_SPELLFIRE_WIELDER, oPC)) return 0;
int nCON = GetAbilityScore(oPC, ABILITY_CONSTITUTION);
int i, nCount;
for (i = FEAT_EPIC_SPELLFIRE_WIELDER_I; i <= FEAT_EPIC_SPELLFIRE_WIELDER_X; i++)
{
if (GetHasFeat(i, oPC))
nCON = nCON + 4;
}
if (DEBUG) DoDebug("SpellfireMax nCon is "+IntToString(nCON));
int nStorage = ((GetLevelByClass(CLASS_TYPE_SPELLFIRE, oPC) + 1) / 2) + 1;
if(nStorage > 5) nStorage = 5;
return nCON * nStorage;
}
//Increases the number of stored spellfire levels on a creature
void AddSpellfireLevels(object oPC, int nLevels)
{
int nMax = SpellfireMax(oPC);
int nStored = GetPersistantLocalInt(oPC, "SpellfireLevelStored");
nStored += nLevels;
if(nStored > nMax) nStored = nMax; //capped
SetPersistantLocalInt(oPC, "SpellfireLevelStored", nStored);
}
//Checks if spell target can absorb spells by being a spellfire wielder
int CheckSpellfire(object oCaster, object oTarget, int bFriendly = FALSE)
{
//can't absorb spells without feat
if(!GetHasFeat(FEAT_SPELLFIRE_WIELDER, oTarget)) return 0;
//Can't absorb own spells/powers if switch is set
if(GetPRCSwitch(PRC_SPELLFIRE_DISALLOW_CHARGE_SELF) && oTarget == oCaster) return 0;
//abilities rely on access to weave
if(GetHasFeat(FEAT_SHADOWWEAVE, oTarget)) return 0;
int nSpellID = PRCGetSpellId();
if(!bFriendly && GetLocalInt(oCaster, "IsAOE_" + IntToString(nSpellID)))
return 0; //can't absorb hostile AOE spells
int nSpellfireLevel = GetPersistantLocalInt(oTarget, "SpellfireLevelStored");
if(DEBUG) DoDebug("CheckSpellfire: " + IntToString(nSpellfireLevel) + " levels stored", oTarget);
int nMax = SpellfireMax(oTarget);
if(DEBUG) DoDebug("CheckSpellfire: Maximum " + IntToString(nMax), oTarget);
//can't absorb any more spells, sanity check
if(nSpellfireLevel >= nMax) return 0;
//increasing stored levels
int nSpellLevel = GetLocalInt(oCaster, "PRC_CurrentManifest_PowerLevel"); //replicates GetPowerLevel(oCaster);
if(!nSpellLevel) //not a power //avoids compiler problems
{ //with includes
string sInnate = Get2DACache("spells", "Innate", nSpellID);//lookup_spell_innate(nSpellID);
if(sInnate == "") return 0; //no innate level, unlike cantrips
nSpellLevel = StringToInt(sInnate);
}
/*
string sInnate = Get2DACache("spells", "Innate", nSpellID);
if(sInnate == "") return 0; //no innate level, unlike cantrips
int nSpellLevel = StringToInt(sInnate);
*/
AddSpellfireLevels(oTarget, nSpellLevel);
//absorbed
return 1;
}
//:: void main(){}

View File

@@ -1,215 +0,0 @@
2DA V2.0
Label Level FeatID IPFeatID SpellID RealSpellID Prereqs Discipline Type
0 212 **** **** **** **** **** **** **** ****
1 Crusader_BlisteringFlourish 1 8001 17302 15801 17301 0 1 2
2 Crusader_BurningBlade 1 8002 17303 15802 17302 0 1 4
3 Crusader_BurningBrand 2 8003 17304 15803 17303 0 1 4
4 Crusader_DeathMark 3 8004 17305 15804 17304 0 1 2
5 Crusader_DesertTempest 6 8005 17306 15805 17305 2 1 2
6 Crusader_DistractingEmber 1 8006 17307 15806 17306 0 1 4
7 Crusader_DragonsFlame 5 8007 17308 15807 17307 2 1 2
8 Crusader_FanTheFlames 3 8008 17309 15808 17308 1 1 2
9 Crusader_FieryAssault 6 8009 17310 15809 17309 2 1 1
10 Crusader_FireRiposte 2 8010 17311 15810 17310 0 1 3
11 Crusader_Firesnake 4 8011 17312 15811 17311 2 1 2
12 Crusader_FlamesBlessing 1 8012 17313 15812 17312 0 1 1
13 Crusader_FlashingSun 2 8013 17314 15813 17313 1 1 2
14 Crusader_HatchlingsFlame 2 8014 17315 15814 17314 1 1 2
15 Crusader_HolocaustCloak 3 8015 17316 15815 17315 1 1 1
16 Crusader_InfernoBlade 7 8016 17317 15816 17316 0 1 4
17 Crusader_InfernoBlast 9 8017 17318 15817 17317 5 1 2
18 Crusader_LeapingFlame 5 8018 17319 15818 17318 2 1 3
19 Crusader_LingeringInferno 5 8019 17320 15819 17319 2 1 2
20 Crusader_RingOfFire 6 8020 17321 15820 17320 2 1 2
21 Crusader_RisingPhoenix 8 8021 17322 15821 17321 3 1 1
22 Crusader_SalamanderCharge 7 8022 17323 15822 17322 3 1 2
23 Crusader_SearingBlade 4 8023 17324 15823 17323 2 1 4
24 Crusader_SearingCharge 4 8024 17325 15824 17324 1 1 2
25 Crusader_WindStride 1 8025 17326 15825 17325 0 1 4
26 Crusader_WyrmsFlame 8 8026 17327 15826 17326 3 1 2
27 Crusader_ZephyrDance 3 8027 17328 15827 17327 1 1 3
28 Crusader_AuraOfChaos 6 8028 17329 15828 17328 2 2 1
29 Crusader_AuraOfPerfectOrder 6 8029 17330 15829 17329 2 2 1
30 Crusader_AuraOfTriumph 6 8030 17331 15830 17330 2 2 1
31 Crusader_AuraOfTyranny 6 8031 17332 15831 17331 2 2 1
32 Crusader_CastigatingStrike 7 8032 17333 15832 17332 2 2 2
33 Crusader_CrusadersStrike 1 8033 17334 15833 17333 0 2 2
34 Crusader_DauntingStrike 5 8034 17335 15834 17334 1 2 2
35 Crusader_DefensiveRebuke 3 8035 17336 15835 17335 1 2 4
36 Crusader_DivineSurge 4 8036 17337 15836 17336 1 2 2
37 Crusader_DivineSurgeGreater 8 8037 17338 15837 17337 2 2 2
38 Crusader_DivineSurgeGreaterSub1 **** **** **** 15838 17465 2 2 2
39 Crusader_DivineSurgeGreaterSub2 **** **** **** 15839 17466 2 2 2
40 Crusader_DivineSurgeGreaterSub3 **** **** **** 15840 17467 2 2 2
41 Crusader_DoomCharge 5 8038 17339 15841 17338 1 2 2
42 Crusader_EntanglingBlade 4 8039 17340 15842 17339 1 2 2
43 Crusader_Foehammer 2 8040 17341 15843 17340 0 2 2
44 Crusader_ImmortalFortitude 8 8041 17342 15844 17341 3 2 1
45 Crusader_IronGuardsGlare 1 8042 17343 15845 17342 0 2 1
46 Crusader_LawBearer 5 8043 17344 15846 17343 1 2 2
47 Crusader_MartialSpirit 1 8044 17345 15847 17344 0 2 1
48 Crusader_RadiantCharge 5 8045 17346 15848 17345 1 2 2
49 Crusader_RallyingStrike 6 8046 17347 15849 17346 2 2 2
50 Crusader_RevitalizingStrike 3 8047 17348 15850 17347 1 2 2
51 Crusader_ShieldBlock 2 8048 17349 15851 17348 0 2 3
52 Crusader_ShieldCounter 7 8049 17350 15852 17349 2 2 3
53 Crusader_StrikeOfRighteousVitality 9 8050 17351 15853 17350 3 2 2
54 Crusader_ThicketOfBlades 3 8051 17352 15854 17351 1 2 1
55 Crusader_TideOfChaos 5 8052 17353 15855 17352 1 2 2
56 Crusader_VanguardStrike 1 8053 17354 15856 17353 0 2 2
57 Crusader_ActionBeforeThought 2 8054 17355 15857 17354 0 4 3
58 Crusader_AvalancheOfBlades 7 8055 17356 15858 17355 3 4 2
59 Crusader_BoundingAssault 4 8056 17357 15859 17356 2 4 2
60 Crusader_DiamondDefense 8 8057 17358 15860 17357 0 4 3
61 Crusader_DiamondNightmareBlade 8 8058 17359 15861 17358 3 4 2
62 Crusader_DisruptingBlow 5 8059 17360 15862 17359 2 4 2
63 Crusader_EmeraldRazor 2 8060 17361 15863 17360 1 4 2
64 Crusader_HearingTheAir 5 8061 17362 15864 17361 2 4 1
65 Crusader_InsightfulStrike 3 8062 17363 15865 17362 0 4 2
66 Crusader_InsightfulStrikeGreater 6 8063 17364 15866 17363 2 4 2
67 Crusader_MindOverBody 3 8064 17365 15867 17364 0 4 3
68 Crusader_MindStrike 4 8065 17366 15868 17365 2 4 2
69 Crusader_MomentOfAlacrity 6 8066 17367 15869 17366 2 4 4
70 Crusader_MomentOfPerfectMind 1 8067 17368 15870 17367 0 4 3
71 Crusader_PearlOfBlackDoubt 3 8068 17369 15871 17368 1 4 1
72 Crusader_QuicksilverMotion 7 8069 17370 15872 17369 3 4 4
73 Crusader_RapidCounter 5 8070 17371 15873 17370 0 4 3
74 Crusader_RubyNightmareBlade 4 8071 17372 15874 17371 2 4 2
75 Crusader_SapphireNightmareBlade 1 8072 17373 15875 17372 0 4 2
76 Crusader_StanceOfAlacrity 8 8073 17374 15876 17373 3 4 1
77 Crusader_StanceOfClarity 1 8074 17375 15877 17374 0 4 1
78 Crusader_TimeStandsStill 9 8075 17376 15878 17375 4 4 2
79 Crusader_AbsoluteSteel 3 8076 17377 15879 17376 1 8 1
80 Crusader_AdamantineHurricane 8 8077 17378 15880 17377 3 8 2
81 Crusader_DancingBladeForm 5 8078 17379 15881 17378 2 8 1
82 Crusader_DazingStrike 5 8079 17380 15882 17379 2 8 2
83 Crusader_DisarmingStrike 2 8080 17381 15883 17380 0 8 2
84 Crusader_ExorcismOfSteel 3 8081 17382 15884 17381 1 8 2
85 Crusader_FinishingMove 7 8082 17383 15885 17382 3 8 2
86 Crusader_IronHeartEndurance 6 8083 17384 15886 17383 2 8 4
87 Crusader_IronHeartFocus 5 8084 17385 15887 17384 2 8 3
88 Crusader_IronHeartSurge 3 8085 17386 15888 17385 1 8 5
89 Crusader_LightningRecovery 4 8086 17387 15889 17386 2 8 3
90 Crusader_LightningThrow 8 8087 17388 15890 17387 2 8 2
91 Crusader_ManticoreParry 6 8088 17389 15891 17388 2 8 3
92 Crusader_MithralTornado 4 8089 17390 15892 17389 2 8 2
93 Crusader_PunishingStance 1 8090 17391 15893 17390 0 8 1
94 Crusader_ScythingBlade 7 8091 17392 15894 17391 3 8 4
95 Crusader_SteelWind 1 8092 17393 15895 17392 0 8 2
96 Crusader_SteelyStrike 1 8093 17394 15896 17393 0 8 2
97 Crusader_StrikeOfPerfectClarity 9 8094 17395 15897 17394 4 8 2
98 Crusader_SupremeBladeParry 8 8095 17396 15898 17395 3 8 1
99 Crusader_WallOfBlades 2 8096 17397 15899 17396 0 8 3
100 Crusader_BafflingDefense 2 8097 17398 15900 17397 1 16 3
101 Crusader_BallistaThrow 6 8098 17399 15901 17398 2 16 2
102 Crusader_CleverPositioning 2 8099 17400 15902 17399 0 16 2
103 Crusader_CometThrow 4 8100 17401 15903 17400 1 16 2
104 Crusader_CounterCharge 1 8101 17402 15904 17401 0 16 3
105 Crusader_DevastatingThrow 3 8102 17403 15905 17402 1 16 2
106 Crusader_FeignedOpening 3 8103 17404 15906 17403 1 16 3
107 Crusader_FoolsStrike 8 8104 17405 15907 17404 3 16 3
108 Crusader_GhostlyDefense 8 8105 17406 15908 17405 1 16 1
109 Crusader_GiantKillingStyle 3 8106 17407 15909 17406 1 16 1
110 Crusader_HydraSlayingStrike 7 8107 17408 15910 17407 3 16 2
111 Crusader_MightyThrow 1 8108 17409 15911 17408 0 16 2
112 Crusader_MirroredPursuit 5 8109 17410 15912 17409 2 16 3
113 Crusader_ScorpionParry 6 8110 17411 15913 17410 2 16 3
114 Crusader_ShiftingDefense 5 8111 17412 15914 17411 1 16 1
115 Crusader_SoaringThrow 5 8112 17413 15915 17412 2 16 2
116 Crusader_StalkingShadow 5 8113 17414 15916 17413 2 16 3
117 Crusader_StepOfTheWind 1 8114 17415 15917 17414 0 16 1
118 Crusader_StrikeOfTheBrokenShield 4 8115 17416 15918 17415 2 16 2
119 Crusader_TornadoThrow 9 8116 17417 15919 17416 1 16 2
120 Crusader_AssassinsStance 3 8117 17418 15920 17417 1 32 1
121 Crusader_BalanceOnTheSky 8 8118 17419 15921 17418 1 32 1
122 Crusader_BloodlettingStrike 5 8119 17420 15922 17419 2 32 2
123 Crusader_ChildOfShadow 1 8120 17421 15923 17420 0 32 1
124 Crusader_ClingingShadowStrike 1 8121 17422 15924 17421 0 32 2
125 Crusader_CloakOfDeception 2 8122 17423 15925 17422 0 32 4
126 Crusader_DanceOfTheSpider 3 8123 17424 15926 17423 0 32 1
127 Crusader_DeathInTheDark 7 8124 17425 15927 17424 0 32 2
128 Crusader_DrainVitality 2 8125 17426 15928 17425 0 32 2
129 Crusader_EnervatingShadowStrike 8 8126 17427 15929 17426 3 32 2
130 Crusader_FiveShadowCreepingIceEnervationStrike 9 8127 17428 15930 17427 5 32 2
131 Crusader_GhostBlade 6 8128 17429 15931 17428 3 32 2
132 Crusader_HandOfDeath 4 8129 17430 15932 17429 0 32 2
133 Crusader_IslandOfBlades 1 8130 17431 15933 17430 0 32 1
134 Crusader_ObscuringShadowVeil 4 8131 17432 15934 17431 2 32 2
135 Crusader_OneWithShadow 8 8132 17433 15935 17432 1 32 3
136 Crusader_ShadowBladeTechnique 1 8133 17434 15936 17433 0 32 2
137 Crusader_ShadowBlink 7 8134 17435 15937 17434 0 32 5
138 Crusader_ShadowGarrote 3 8135 17436 15938 17435 1 32 2
139 Crusader_ShadowJaunt 2 8136 17437 15939 17436 0 32 5
140 Crusader_ShadowNoose 6 8137 17438 15940 17437 0 32 2
141 Crusader_ShadowStride 5 8138 17439 15941 17438 0 32 5
142 Crusader_StalkerInTheNight 6 8139 17440 15942 17439 0 32 2
143 Crusader_StepOfTheDancingMoth 5 8140 17441 15943 17440 1 32 1
144 Crusader_StrengthDrainingStrike 3 8141 17442 15944 17441 1 32 2
145 Crusader_AdamantineBones 8 8142 17443 15945 17442 3 64 2
146 Crusader_AncientMountainHammer 7 8143 17444 15946 17443 3 64 2
147 Crusader_BonesplittingStrike 4 8144 17445 15947 17444 2 64 2
148 Crusader_Bonecrusher 3 8145 17446 15948 17445 0 64 2
149 Crusader_BoulderRoll 4 8146 17447 15949 17446 2 64 4
150 Crusader_ChargingMinotaur 1 8147 17448 15950 17447 0 64 2
151 Crusader_ColossusStrike 7 8148 17449 15951 17448 2 64 2
152 Crusader_CrushingVise 6 8149 17450 15952 17449 0 64 2
153 Crusader_CrushingWeightOfTheMountain 3 8150 17451 15953 17450 0 64 1
154 Crusader_EarthstrikeQuake 8 8151 17452 15954 17451 2 64 2
155 Crusader_ElderMountainHammer 5 8152 17453 15955 17452 2 64 2
156 Crusader_GiantsStance 5 8153 17454 15956 17453 2 64 1
157 Crusader_IronBones 6 8154 17455 15957 17454 2 64 2
158 Crusader_IrresistibleMountainStrike 6 8155 17456 15958 17455 0 64 2
159 Crusader_MountainAvalanche 5 8156 17457 15959 17456 2 64 2
160 Crusader_MountainHammer 2 8157 17458 15960 17457 0 64 2
161 Crusader_MountainTombstoneStrike 9 8158 17459 15961 17458 0 64 2
162 Crusader_OverwhelmingMountainStrike 4 8159 17460 15962 17459 0 64 2
163 Crusader_RootsOfTheMountain 3 8160 17461 15963 17460 0 64 1
164 Crusader_StoneBones 1 8161 17462 15964 17461 0 64 2
165 Crusader_StoneDragonsFury 3 8162 17463 15965 17462 0 64 2
166 Crusader_StoneVise 2 8163 17464 15966 17463 0 64 2
167 Crusader_StonefootStance 1 8164 17465 15967 17464 0 64 1
168 Crusader_StrengthOfStone 8 8165 17466 15968 17468 3 64 1
169 Crusader_BloodInTheWater 1 8166 17467 15969 17469 0 128 1
170 Crusader_ClawAtTheMoon 2 8167 17468 15970 17470 0 128 2
171 Crusader_DancingMongoose 5 8168 17469 15971 17471 2 128 4
172 Crusader_DeathFromAbove 4 8169 17470 15972 17472 1 128 2
173 Crusader_FeralDeathBlow 9 8170 17471 15973 17473 4 128 2
174 Crusader_FleshRipper 3 8171 17472 15974 17474 0 128 2
175 Crusader_FountainOfBlood 4 8172 17473 15975 17475 2 128 4
176 Crusader_GirallonWindmillFleshRip 8 8173 17474 15976 17476 3 128 4
177 Crusader_HamstringAttack 7 8174 17475 15977 17477 3 128 2
178 Crusader_HuntersSense 1 8175 17476 15978 17478 0 128 1
179 Crusader_LeapingDragonStance 3 8176 17477 15979 17479 0 128 1
180 Crusader_PouncingCharge 5 8177 17478 15980 17480 2 128 2
181 Crusader_PreyOnTheWeak 7 8178 17479 15981 17481 2 128 1
182 Crusader_RabidBearStrike 6 8179 17480 15982 17482 2 128 2
183 Crusader_RabidWolfStrike 2 8180 17481 15983 17483 0 128 2
184 Crusader_RagingMongoose 8 8181 17482 15984 17484 3 128 4
185 Crusader_SoaringRaptorStrike 3 8182 17483 15985 17485 0 128 2
186 Crusader_SuddenLeap 1 8183 17484 15986 17486 1 128 4
187 Crusader_SwoopingDragonStrike 7 8184 17485 15987 17487 3 128 2
188 Crusader_WolfClimbsTheMountain 6 8185 17486 15988 17488 2 128 2
189 Crusader_WolfFangStrike 1 8186 17487 15989 17489 0 128 2
190 Crusader_WolfPackTactics 8 8187 17488 15990 17490 2 128 1
191 Crusader_WolverineStance 3 8188 17489 15991 17491 0 128 1
192 Crusader_BattleLeadersCharge 2 8189 17490 15992 17492 0 256 2
193 Crusader_BolsteringVoice 1 8190 17491 15993 17493 0 256 1
194 Crusader_ClarionCall 7 8191 17492 15994 17494 3 256 4
195 Crusader_CoveringStrike 4 8192 17493 15995 17495 1 256 4
196 Crusader_DouseTheFlames 1 8193 17494 15996 17496 0 256 2
197 Crusader_FlankingManeuver 5 8194 17495 15997 17497 2 256 2
198 Crusader_LeadingTheAttack 1 8195 17496 15998 17498 0 256 2
199 Crusader_LeadingTheCharge 1 8196 17497 15999 17499 0 256 1
200 Crusader_LionsRoar 3 8197 17498 16000 17500 0 256 4
201 Crusader_OrderForgedFromChaos 6 8198 17499 16001 17501 2 256 5
202 Crusader_PressTheAdvantage 5 8199 17500 16002 17502 2 256 1
203 Crusader_SwarmTactics 8 8200 17501 16003 17503 1 256 1
204 Crusader_SwarmingAssault 7 8201 17502 16004 17504 3 256 2
205 Crusader_TacticalStrike 2 8202 17503 16005 17505 0 256 2
206 Crusader_TacticsOfTheWolf 3 8203 17504 16006 17506 1 256 1
207 Crusader_WarLeadersCharge 6 8204 17505 16007 17507 2 256 2
208 Crusader_WarMastersCharge 9 8205 17506 16008 17508 4 256 2
209 Crusader_WhiteRavenHammer 8 8206 17507 16009 17509 0 256 2
210 Crusader_WhiteRavenStrike 4 8207 17508 16010 17510 1 256 2
211 Crusader_WhiteRavenTactics 3 8208 17509 16011 17511 0 256 4

View File

@@ -1,215 +0,0 @@
2DA V2.0
Label Level FeatID IPFeatID SpellID RealSpellID Prereqs Discipline Type
0 212 **** **** **** **** **** **** **** ****
1 Swordsage_BlisteringFlourish 1 8209 17510 16012 17301 0 1 2
2 Swordsage_BurningBlade 1 8210 17511 16013 17302 0 1 4
3 Swordsage_BurningBrand 2 8211 17512 16014 17303 0 1 4
4 Swordsage_DeathMark 3 8212 17513 16015 17304 0 1 2
5 Swordsage_DesertTempest 6 8213 17514 16016 17305 2 1 2
6 Swordsage_DistractingEmber 1 8214 17515 16017 17306 0 1 4
7 Swordsage_DragonsFlame 5 8215 17516 16018 17307 2 1 2
8 Swordsage_FanTheFlames 3 8216 17517 16019 17308 1 1 2
9 Swordsage_FieryAssault 6 8217 17518 16020 17309 2 1 1
10 Swordsage_FireRiposte 2 8218 17519 16021 17310 0 1 3
11 Swordsage_Firesnake 4 8219 17520 16022 17311 2 1 2
12 Swordsage_FlamesBlessing 1 8220 17521 16023 17312 0 1 1
13 Swordsage_FlashingSun 2 8221 17522 16024 17313 1 1 2
14 Swordsage_HatchlingsFlame 2 8222 17523 16025 17314 1 1 2
15 Swordsage_HolocaustCloak 3 8223 17524 16026 17315 1 1 1
16 Swordsage_InfernoBlade 7 8224 17525 16027 17316 0 1 4
17 Swordsage_InfernoBlast 9 8225 17526 16028 17317 5 1 2
18 Swordsage_LeapingFlame 5 8226 17527 16029 17318 2 1 3
19 Swordsage_LingeringInferno 5 8227 17528 16030 17319 2 1 2
20 Swordsage_RingOfFire 6 8228 17529 16031 17320 2 1 2
21 Swordsage_RisingPhoenix 8 8229 17530 16032 17321 3 1 1
22 Swordsage_SalamanderCharge 7 8230 17531 16033 17322 3 1 2
23 Swordsage_SearingBlade 4 8231 17532 16034 17323 2 1 4
24 Swordsage_SearingCharge 4 8232 17533 16035 17324 1 1 2
25 Swordsage_WindStride 1 8233 17534 16036 17325 0 1 4
26 Swordsage_WyrmsFlame 8 8234 17535 16037 17326 3 1 2
27 Swordsage_ZephyrDance 3 8235 17536 16038 17327 1 1 3
28 Swordsage_AuraOfChaos 6 8236 17537 16039 17328 2 2 1
29 Swordsage_AuraOfPerfectOrder 6 8237 17538 16040 17329 2 2 1
30 Swordsage_AuraOfTriumph 6 8238 17539 16041 17330 2 2 1
31 Swordsage_AuraOfTyranny 6 8239 17540 16042 17331 2 2 1
32 Swordsage_CastigatingStrike 7 8240 17541 16043 17332 2 2 2
33 Swordsage_CrusadersStrike 1 8241 17542 16044 17333 0 2 2
34 Swordsage_DauntingStrike 5 8242 17543 16045 17334 1 2 2
35 Swordsage_DefensiveRebuke 3 8243 17544 16046 17335 1 2 4
36 Swordsage_DivineSurge 4 8244 17545 16047 17336 1 2 2
37 Swordsage_DivineSurgeGreater 8 8245 17546 16048 17337 2 2 2
38 Swordsage_DivineSurgeGreaterSub1 **** **** **** 16049 17465 2 2 2
39 Swordsage_DivineSurgeGreaterSub2 **** **** **** 16050 17466 2 2 2
40 Swordsage_DivineSurgeGreaterSub3 **** **** **** 16051 17467 2 2 2
41 Swordsage_DoomCharge 5 8246 17547 16052 17338 1 2 2
42 Swordsage_EntanglingBlade 4 8247 17548 16053 17339 1 2 2
43 Swordsage_Foehammer 2 8248 17549 16054 17340 0 2 2
44 Swordsage_ImmortalFortitude 8 8249 17550 16055 17341 3 2 1
45 Swordsage_IronGuardsGlare 1 8250 17551 16056 17342 0 2 1
46 Swordsage_LawBearer 5 8251 17552 16057 17343 1 2 2
47 Swordsage_MartialSpirit 1 8252 17553 16058 17344 0 2 1
48 Swordsage_RadiantCharge 5 8253 17554 16059 17345 1 2 2
49 Swordsage_RallyingStrike 6 8254 17555 16060 17346 2 2 2
50 Swordsage_RevitalizingStrike 3 8255 17556 16061 17347 1 2 2
51 Swordsage_ShieldBlock 2 8256 17557 16062 17348 0 2 3
52 Swordsage_ShieldCounter 7 8257 17558 16063 17349 2 2 3
53 Swordsage_StrikeOfRighteousVitality 9 8258 17559 16064 17350 3 2 2
54 Swordsage_ThicketOfBlades 3 8259 17560 16065 17351 1 2 1
55 Swordsage_TideOfChaos 5 8260 17561 16066 17352 1 2 2
56 Swordsage_VanguardStrike 1 8261 17562 16067 17353 0 2 2
57 Swordsage_ActionBeforeThought 2 8262 17563 16068 17354 0 4 3
58 Swordsage_AvalancheOfBlades 7 8263 17564 16069 17355 3 4 2
59 Swordsage_BoundingAssault 4 8264 17565 16070 17356 2 4 2
60 Swordsage_DiamondDefense 8 8265 17566 16071 17357 0 4 3
61 Swordsage_DiamondNightmareBlade 8 8266 17567 16072 17358 3 4 2
62 Swordsage_DisruptingBlow 5 8267 17568 16073 17359 2 4 2
63 Swordsage_EmeraldRazor 2 8268 17569 16074 17360 1 4 2
64 Swordsage_HearingTheAir 5 8269 17570 16075 17361 2 4 1
65 Swordsage_InsightfulStrike 3 8270 17571 16076 17362 0 4 2
66 Swordsage_InsightfulStrikeGreater 6 8271 17572 16077 17363 2 4 2
67 Swordsage_MindOverBody 3 8272 17573 16078 17364 0 4 3
68 Swordsage_MindStrike 4 8273 17574 16079 17365 2 4 2
69 Swordsage_MomentOfAlacrity 6 8274 17575 16080 17366 2 4 4
70 Swordsage_MomentOfPerfectMind 1 8275 17576 16081 17367 0 4 3
71 Swordsage_PearlOfBlackDoubt 3 8276 17577 16082 17368 1 4 1
72 Swordsage_QuicksilverMotion 7 8277 17578 16083 17369 3 4 4
73 Swordsage_RapidCounter 5 8278 17579 16084 17370 0 4 3
74 Swordsage_RubyNightmareBlade 4 8279 17580 16085 17371 2 4 2
75 Swordsage_SapphireNightmareBlade 1 8280 17581 16086 17372 0 4 2
76 Swordsage_StanceOfAlacrity 8 8281 17582 16087 17373 3 4 1
77 Swordsage_StanceOfClarity 1 8282 17583 16088 17374 0 4 1
78 Swordsage_TimeStandsStill 9 8283 17584 16089 17375 4 4 2
79 Swordsage_AbsoluteSteel 3 8284 17585 16090 17376 1 8 1
80 Swordsage_AdamantineHurricane 8 8285 17586 16091 17377 3 8 2
81 Swordsage_DancingBladeForm 5 8286 17587 16092 17378 2 8 1
82 Swordsage_DazingStrike 5 8287 17588 16093 17379 2 8 2
83 Swordsage_DisarmingStrike 2 8288 17589 16094 17380 0 8 2
84 Swordsage_ExorcismOfSteel 3 8289 17590 16095 17381 1 8 2
85 Swordsage_FinishingMove 7 8290 17591 16096 17382 3 8 2
86 Swordsage_IronHeartEndurance 6 8291 17592 16097 17383 2 8 4
87 Swordsage_IronHeartFocus 5 8292 17593 16098 17384 2 8 3
88 Swordsage_IronHeartSurge 3 8293 17594 16099 17385 1 8 5
89 Swordsage_LightningRecovery 4 8294 17595 16100 17386 2 8 3
90 Swordsage_LightningThrow 8 8295 17596 16101 17387 2 8 2
91 Swordsage_ManticoreParry 6 8296 17597 16102 17388 2 8 3
92 Swordsage_MithralTornado 4 8297 17598 16103 17389 2 8 2
93 Swordsage_PunishingStance 1 8298 17599 16104 17390 0 8 1
94 Swordsage_ScythingBlade 7 8299 17600 16105 17391 3 8 4
95 Swordsage_SteelWind 1 8300 17601 16106 17392 0 8 2
96 Swordsage_SteelyStrike 1 8301 17602 16107 17393 0 8 2
97 Swordsage_StrikeOfPerfectClarity 9 8302 17603 16108 17394 4 8 2
98 Swordsage_SupremeBladeParry 8 8303 17604 16109 17395 3 8 1
99 Swordsage_WallOfBlades 2 8304 17605 16110 17396 0 8 3
100 Swordsage_BafflingDefense 2 8305 17606 16111 17397 1 16 3
101 Swordsage_BallistaThrow 6 8306 17607 16112 17398 2 16 2
102 Swordsage_CleverPositioning 2 8307 17608 16113 17399 0 16 2
103 Swordsage_CometThrow 4 8308 17609 16114 17400 1 16 2
104 Swordsage_CounterCharge 1 8309 17610 16115 17401 0 16 3
105 Swordsage_DevastatingThrow 3 8310 17611 16116 17402 1 16 2
106 Swordsage_FeignedOpening 3 8311 17612 16117 17403 1 16 3
107 Swordsage_FoolsStrike 8 8312 17613 16118 17404 3 16 3
108 Swordsage_GhostlyDefense 8 8313 17614 16119 17405 1 16 1
109 Swordsage_GiantKillingStyle 3 8314 17615 16120 17406 1 16 1
110 Swordsage_HydraSlayingStrike 7 8315 17616 16121 17407 3 16 2
111 Swordsage_MightyThrow 1 8316 17617 16122 17408 0 16 2
112 Swordsage_MirroredPursuit 5 8317 17618 16123 17409 2 16 3
113 Swordsage_ScorpionParry 6 8318 17619 16124 17410 2 16 3
114 Swordsage_ShiftingDefense 5 8319 17620 16125 17411 1 16 1
115 Swordsage_SoaringThrow 5 8320 17621 16126 17412 2 16 2
116 Swordsage_StalkingShadow 5 8321 17622 16127 17413 2 16 3
117 Swordsage_StepOfTheWind 1 8322 17623 16128 17414 0 16 1
118 Swordsage_StrikeOfTheBrokenShield 4 8323 17624 16129 17415 2 16 2
119 Swordsage_TornadoThrow 9 8324 17625 16130 17416 1 16 2
120 Swordsage_AssassinsStance 3 8325 17626 16131 17417 1 32 1
121 Swordsage_BalanceOnTheSky 8 8326 17627 16132 17418 1 32 1
122 Swordsage_BloodlettingStrike 5 8327 17628 16133 17419 2 32 2
123 Swordsage_ChildOfShadow 1 8328 17629 16134 17420 0 32 1
124 Swordsage_ClingingShadowStrike 1 8329 17630 16135 17421 0 32 2
125 Swordsage_CloakOfDeception 2 8330 17631 16136 17422 0 32 4
126 Swordsage_DanceOfTheSpider 3 8331 17632 16137 17423 0 32 1
127 Swordsage_DeathInTheDark 7 8332 17633 16138 17424 0 32 2
128 Swordsage_DrainVitality 2 8333 17634 16139 17425 0 32 2
129 Swordsage_EnervatingShadowStrike 8 8334 17635 16140 17426 3 32 2
130 Swordsage_FiveShadowCreepingIceEnervationStrike 9 8335 17636 16141 17427 5 32 2
131 Swordsage_GhostBlade 6 8336 17637 16142 17428 3 32 2
132 Swordsage_HandOfDeath 4 8337 17638 16143 17429 0 32 2
133 Swordsage_IslandOfBlades 1 8338 17639 16144 17430 0 32 1
134 Swordsage_ObscuringShadowVeil 4 8339 17640 16145 17431 2 32 2
135 Swordsage_OneWithShadow 8 8340 17641 16146 17432 1 32 3
136 Swordsage_ShadowBladeTechnique 1 8341 17642 16147 17433 0 32 2
137 Swordsage_ShadowBlink 7 8342 17643 16148 17434 0 32 5
138 Swordsage_ShadowGarrote 3 8343 17644 16149 17435 1 32 2
139 Swordsage_ShadowJaunt 2 8344 17645 16150 17436 0 32 5
140 Swordsage_ShadowNoose 6 8345 17646 16151 17437 0 32 2
141 Swordsage_ShadowStride 5 8346 17647 16152 17438 0 32 5
142 Swordsage_StalkerInTheNight 6 8347 17648 16153 17439 0 32 2
143 Swordsage_StepOfTheDancingMoth 5 8348 17649 16154 17440 1 32 1
144 Swordsage_StrengthDrainingStrike 3 8349 17650 16155 17441 1 32 2
145 Swordsage_AdamantineBones 8 8350 17651 16156 17442 3 64 2
146 Swordsage_AncientMountainHammer 7 8351 17652 16157 17443 3 64 2
147 Swordsage_BonesplittingStrike 4 8352 17653 16158 17444 2 64 2
148 Swordsage_Bonecrusher 3 8353 17654 16159 17445 0 64 2
149 Swordsage_BoulderRoll 4 8354 17655 16160 17446 2 64 4
150 Swordsage_ChargingMinotaur 1 8355 17656 16161 17447 0 64 2
151 Swordsage_ColossusStrike 7 8356 17657 16162 17448 2 64 2
152 Swordsage_CrushingVise 6 8357 17658 16163 17449 0 64 2
153 Swordsage_CrushingWeightOfTheMountain 3 8358 17659 16164 17450 0 64 1
154 Swordsage_EarthstrikeQuake 8 8359 17660 16165 17451 2 64 2
155 Swordsage_ElderMountainHammer 5 8360 17661 16166 17452 2 64 2
156 Swordsage_GiantsStance 5 8361 17662 16167 17453 2 64 1
157 Swordsage_IronBones 6 8362 17663 16168 17454 2 64 2
158 Swordsage_IrresistibleMountainStrike 6 8363 17664 16169 17455 0 64 2
159 Swordsage_MountainAvalanche 5 8364 17665 16170 17456 2 64 2
160 Swordsage_MountainHammer 2 8365 17666 16171 17457 0 64 2
161 Swordsage_MountainTombstoneStrike 9 8366 17667 16172 17458 0 64 2
162 Swordsage_OverwhelmingMountainStrike 4 8367 17668 16173 17459 0 64 2
163 Swordsage_RootsOfTheMountain 3 8368 17669 16174 17460 0 64 1
164 Swordsage_StoneBones 1 8369 17670 16175 17461 0 64 2
165 Swordsage_StoneDragonsFury 3 8370 17671 16176 17462 0 64 2
166 Swordsage_StoneVise 2 8371 17672 16177 17463 0 64 2
167 Swordsage_StonefootStance 1 8372 17673 16178 17464 0 64 1
168 Swordsage_StrengthOfStone 8 8373 17674 16179 17468 3 64 1
169 Swordsage_BloodInTheWater 1 8374 17675 16180 17469 0 128 1
170 Swordsage_ClawAtTheMoon 2 8375 17676 16181 17470 0 128 2
171 Swordsage_DancingMongoose 5 8376 17677 16182 17471 2 128 4
172 Swordsage_DeathFromAbove 4 8377 17678 16183 17472 1 128 2
173 Swordsage_FeralDeathBlow 9 8378 17679 16184 17473 4 128 2
174 Swordsage_FleshRipper 3 8379 17680 16185 17474 0 128 2
175 Swordsage_FountainOfBlood 4 8380 17681 16186 17475 2 128 4
176 Swordsage_GirallonWindmillFleshRip 8 8381 17682 16187 17476 3 128 4
177 Swordsage_HamstringAttack 7 8382 17683 16188 17477 3 128 2
178 Swordsage_HuntersSense 1 8383 17684 16189 17478 0 128 1
179 Swordsage_LeapingDragonStance 3 8384 17685 16190 17479 0 128 1
180 Swordsage_PouncingCharge 5 8385 17686 16191 17480 2 128 2
181 Swordsage_PreyOnTheWeak 7 8386 17687 16192 17481 2 128 1
182 Swordsage_RabidBearStrike 6 8387 17688 16193 17482 2 128 2
183 Swordsage_RabidWolfStrike 2 8388 17689 16194 17483 0 128 2
184 Swordsage_RagingMongoose 8 8389 17690 16195 17484 3 128 4
185 Swordsage_SoaringRaptorStrike 3 8390 17691 16196 17485 0 128 2
186 Swordsage_SuddenLeap 1 8391 17692 16197 17486 1 128 4
187 Swordsage_SwoopingDragonStrike 7 8392 17693 16198 17487 3 128 2
188 Swordsage_WolfClimbsTheMountain 6 8393 17694 16199 17488 2 128 2
189 Swordsage_WolfFangStrike 1 8394 17695 16200 17489 0 128 2
190 Swordsage_WolfPackTactics 8 8395 17696 16201 17490 2 128 1
191 Swordsage_WolverineStance 3 8396 17697 16202 17491 0 128 1
192 Swordsage_BattleLeadersCharge 2 8397 17698 16203 17492 0 256 2
193 Swordsage_BolsteringVoice 1 8398 17699 16204 17493 0 256 1
194 Swordsage_ClarionCall 7 8399 17700 16205 17494 3 256 4
195 Swordsage_CoveringStrike 4 8400 17701 16206 17495 1 256 4
196 Swordsage_DouseTheFlames 1 8401 17702 16207 17496 0 256 2
197 Swordsage_FlankingManeuver 5 8402 17703 16208 17497 2 256 2
198 Swordsage_LeadingTheAttack 1 8403 17704 16209 17498 0 256 2
199 Swordsage_LeadingTheCharge 1 8404 17705 16210 17499 0 256 1
200 Swordsage_LionsRoar 3 8405 17706 16211 17500 0 256 4
201 Swordsage_OrderForgedFromChaos 6 8406 17707 16212 17501 2 256 5
202 Swordsage_PressTheAdvantage 5 8407 17708 16213 17502 2 256 1
203 Swordsage_SwarmTactics 8 8408 17709 16214 17503 1 256 1
204 Swordsage_SwarmingAssault 7 8409 17710 16215 17504 3 256 2
205 Swordsage_TacticalStrike 2 8410 17711 16216 17505 0 256 2
206 Swordsage_TacticsOfTheWolf 3 8411 17712 16217 17506 1 256 1
207 Swordsage_WarLeadersCharge 6 8412 17713 16218 17507 2 256 2
208 Swordsage_WarMastersCharge 9 8413 17714 16219 17508 4 256 2
209 Swordsage_WhiteRavenHammer 8 8414 17715 16220 17509 0 256 2
210 Swordsage_WhiteRavenStrike 4 8415 17716 16221 17510 1 256 2
211 Swordsage_WhiteRavenTactics 3 8416 17717 16222 17511 0 256 4

View File

@@ -1,215 +0,0 @@
2DA V2.0
Label Level FeatID IPFeatID SpellID RealSpellID Prereqs Discipline Type
0 212 **** **** **** **** **** **** **** ****
1 Warblade_BlisteringFlourish 1 8417 17718 16223 17301 0 1 2
2 Warblade_BurningBlade 1 8418 17719 16224 17302 0 1 4
3 Warblade_BurningBrand 2 8419 17720 16225 17303 0 1 4
4 Warblade_DeathMark 3 8420 17721 16226 17304 0 1 2
5 Warblade_DesertTempest 6 8421 17722 16227 17305 2 1 2
6 Warblade_DistractingEmber 1 8422 17723 16228 17306 0 1 4
7 Warblade_DragonsFlame 5 8423 17724 16229 17307 2 1 2
8 Warblade_FanTheFlames 3 8424 17725 16230 17308 1 1 2
9 Warblade_FieryAssault 6 8425 17726 16231 17309 2 1 1
10 Warblade_FireRiposte 2 8426 17727 16232 17310 0 1 3
11 Warblade_Firesnake 4 8427 17728 16233 17311 2 1 2
12 Warblade_FlamesBlessing 1 8428 17729 16234 17312 0 1 1
13 Warblade_FlashingSun 2 8429 17730 16235 17313 1 1 2
14 Warblade_HatchlingsFlame 2 8430 17731 16236 17314 1 1 2
15 Warblade_HolocaustCloak 3 8431 17732 16237 17315 1 1 1
16 Warblade_InfernoBlade 7 8432 17733 16238 17316 0 1 4
17 Warblade_InfernoBlast 9 8433 17734 16239 17317 5 1 2
18 Warblade_LeapingFlame 5 8434 17735 16240 17318 2 1 3
19 Warblade_LingeringInferno 5 8435 17736 16241 17319 2 1 2
20 Warblade_RingOfFire 6 8436 17737 16242 17320 2 1 2
21 Warblade_RisingPhoenix 8 8437 17738 16243 17321 3 1 1
22 Warblade_SalamanderCharge 7 8438 17739 16244 17322 3 1 2
23 Warblade_SearingBlade 4 8439 17740 16245 17323 2 1 4
24 Warblade_SearingCharge 4 8440 17741 16246 17324 1 1 2
25 Warblade_WindStride 1 8441 17742 16247 17325 0 1 4
26 Warblade_WyrmsFlame 8 8442 17743 16248 17326 3 1 2
27 Warblade_ZephyrDance 3 8443 17744 16249 17327 1 1 3
28 Warblade_AuraOfChaos 6 8444 17745 16250 17328 2 2 1
29 Warblade_AuraOfPerfectOrder 6 8445 17746 16251 17329 2 2 1
30 Warblade_AuraOfTriumph 6 8446 17747 16252 17330 2 2 1
31 Warblade_AuraOfTyranny 6 8447 17748 16253 17331 2 2 1
32 Warblade_CastigatingStrike 7 8448 17749 16254 17332 2 2 2
33 Warblade_CrusadersStrike 1 8449 17750 16255 17333 0 2 2
34 Warblade_DauntingStrike 5 8450 17751 16256 17334 1 2 2
35 Warblade_DefensiveRebuke 3 8451 17752 16257 17335 1 2 4
36 Warblade_DivineSurge 4 8452 17753 16258 17336 1 2 2
37 Warblade_DivineSurgeGreater 8 8453 17754 16259 17337 2 2 2
38 Warblade_DivineSurgeGreaterSub1 **** **** **** 16260 17465 2 2 2
39 Warblade_DivineSurgeGreaterSub2 **** **** **** 16261 17466 2 2 2
40 Warblade_DivineSurgeGreaterSub3 **** **** **** 16262 17467 2 2 2
41 Warblade_DoomCharge 5 8454 17755 16263 17338 1 2 2
42 Warblade_EntanglingBlade 4 8455 17756 16264 17339 1 2 2
43 Warblade_Foehammer 2 8456 17757 16265 17340 0 2 2
44 Warblade_ImmortalFortitude 8 8457 17758 16266 17341 3 2 1
45 Warblade_IronGuardsGlare 1 8458 17759 16267 17342 0 2 1
46 Warblade_LawBearer 5 8459 17760 16268 17343 1 2 2
47 Warblade_MartialSpirit 1 8460 17761 16269 17344 0 2 1
48 Warblade_RadiantCharge 5 8461 17762 16270 17345 1 2 2
49 Warblade_RallyingStrike 6 8462 17763 16271 17346 2 2 2
50 Warblade_RevitalizingStrike 3 8463 17764 16272 17347 1 2 2
51 Warblade_ShieldBlock 2 8464 17765 16273 17348 0 2 3
52 Warblade_ShieldCounter 7 8465 17766 16274 17349 2 2 3
53 Warblade_StrikeOfRighteousVitality 9 8466 17767 16275 17350 3 2 2
54 Warblade_ThicketOfBlades 3 8467 17768 16276 17351 1 2 1
55 Warblade_TideOfChaos 5 8468 17769 16277 17352 1 2 2
56 Warblade_VanguardStrike 1 8469 17770 16278 17353 0 2 2
57 Warblade_ActionBeforeThought 2 8470 17771 16279 17354 0 4 3
58 Warblade_AvalancheOfBlades 7 8471 17772 16280 17355 3 4 2
59 Warblade_BoundingAssault 4 8472 17773 16281 17356 2 4 2
60 Warblade_DiamondDefense 8 8473 17774 16282 17357 0 4 3
61 Warblade_DiamondNightmareBlade 8 8474 17775 16283 17358 3 4 2
62 Warblade_DisruptingBlow 5 8475 17776 16284 17359 2 4 2
63 Warblade_EmeraldRazor 2 8476 17777 16285 17360 1 4 2
64 Warblade_HearingTheAir 5 8477 17778 16286 17361 2 4 1
65 Warblade_InsightfulStrike 3 8478 17779 16287 17362 0 4 2
66 Warblade_InsightfulStrikeGreater 6 8479 17780 16288 17363 2 4 2
67 Warblade_MindOverBody 3 8480 17781 16289 17364 0 4 3
68 Warblade_MindStrike 4 8481 17782 16290 17365 2 4 2
69 Warblade_MomentOfAlacrity 6 8482 17783 16291 17366 2 4 4
70 Warblade_MomentOfPerfectMind 1 8483 17784 16292 17367 0 4 3
71 Warblade_PearlOfBlackDoubt 3 8484 17785 16293 17368 1 4 1
72 Warblade_QuicksilverMotion 7 8485 17786 16294 17369 3 4 4
73 Warblade_RapidCounter 5 8486 17787 16295 17370 0 4 3
74 Warblade_RubyNightmareBlade 4 8487 17788 16296 17371 2 4 2
75 Warblade_SapphireNightmareBlade 1 8488 17789 16297 17372 0 4 2
76 Warblade_StanceOfAlacrity 8 8489 17790 16298 17373 3 4 1
77 Warblade_StanceOfClarity 1 8490 17791 17521 17374 0 4 1
78 Warblade_TimeStandsStill 9 8491 17792 17522 17375 4 4 2
79 Warblade_AbsoluteSteel 3 8492 17793 17523 17376 1 8 1
80 Warblade_AdamantineHurricane 8 8493 17794 17524 17377 3 8 2
81 Warblade_DancingBladeForm 5 8494 17795 17525 17378 2 8 1
82 Warblade_DazingStrike 5 8495 17796 17526 17379 2 8 2
83 Warblade_DisarmingStrike 2 8496 17797 17527 17380 0 8 2
84 Warblade_ExorcismOfSteel 3 8497 17798 17528 17381 1 8 2
85 Warblade_FinishingMove 7 8498 17799 17529 17382 3 8 2
86 Warblade_IronHeartEndurance 6 8499 17800 17530 17383 2 8 4
87 Warblade_IronHeartFocus 5 8500 17801 17531 17384 2 8 3
88 Warblade_IronHeartSurge 3 8501 17802 17532 17385 1 8 5
89 Warblade_LightningRecovery 4 8502 17803 17533 17386 2 8 3
90 Warblade_LightningThrow 8 8503 17804 17534 17387 2 8 2
91 Warblade_ManticoreParry 6 8504 17805 17535 17388 2 8 3
92 Warblade_MithralTornado 4 8505 17806 17536 17389 2 8 2
93 Warblade_PunishingStance 1 8506 17807 17537 17390 0 8 1
94 Warblade_ScythingBlade 7 8507 17808 17538 17391 3 8 4
95 Warblade_SteelWind 1 8508 17809 17539 17392 0 8 2
96 Warblade_SteelyStrike 1 8509 17810 17540 17393 0 8 2
97 Warblade_StrikeOfPerfectClarity 9 8510 17811 17541 17394 4 8 2
98 Warblade_SupremeBladeParry 8 8511 17812 17542 17395 3 8 1
99 Warblade_WallOfBlades 2 8512 17813 17543 17396 0 8 3
100 Warblade_BafflingDefense 2 8513 17814 17544 17397 1 16 3
101 Warblade_BallistaThrow 6 8514 17815 17545 17398 2 16 2
102 Warblade_CleverPositioning 2 8515 17816 17546 17399 0 16 2
103 Warblade_CometThrow 4 8516 17817 17547 17400 1 16 2
104 Warblade_CounterCharge 1 8517 17818 17548 17401 0 16 3
105 Warblade_DevastatingThrow 3 8518 17819 17549 17402 1 16 2
106 Warblade_FeignedOpening 3 8519 17820 17550 17403 1 16 3
107 Warblade_FoolsStrike 8 8520 17821 17551 17404 3 16 3
108 Warblade_GhostlyDefense 8 8521 17822 17552 17405 1 16 1
109 Warblade_GiantKillingStyle 3 8522 17823 17553 17406 1 16 1
110 Warblade_HydraSlayingStrike 7 8523 17824 17554 17407 3 16 2
111 Warblade_MightyThrow 1 8524 17825 17555 17408 0 16 2
112 Warblade_MirroredPursuit 5 8525 17826 17556 17409 2 16 3
113 Warblade_ScorpionParry 6 8526 17827 17557 17410 2 16 3
114 Warblade_ShiftingDefense 5 8527 17828 17558 17411 1 16 1
115 Warblade_SoaringThrow 5 8528 17829 17559 17412 2 16 2
116 Warblade_StalkingShadow 5 8529 17830 17560 17413 2 16 3
117 Warblade_StepOfTheWind 1 8530 17831 17561 17414 0 16 1
118 Warblade_StrikeOfTheBrokenShield 4 8531 17832 17562 17415 2 16 2
119 Warblade_TornadoThrow 9 8532 17833 17563 17416 1 16 2
120 Warblade_AssassinsStance 3 8533 17834 17564 17417 1 32 1
121 Warblade_BalanceOnTheSky 8 8534 17835 17565 17418 1 32 1
122 Warblade_BloodlettingStrike 5 8535 17836 17566 17419 2 32 2
123 Warblade_ChildOfShadow 1 8536 17837 17567 17420 0 32 1
124 Warblade_ClingingShadowStrike 1 8537 17838 17568 17421 0 32 2
125 Warblade_CloakOfDeception 2 8538 17839 17569 17422 0 32 4
126 Warblade_DanceOfTheSpider 3 8539 17840 17570 17423 0 32 1
127 Warblade_DeathInTheDark 7 8540 17841 17571 17424 0 32 2
128 Warblade_DrainVitality 2 8541 17842 17572 17425 0 32 2
129 Warblade_EnervatingShadowStrike 8 8542 17843 17573 17426 3 32 2
130 Warblade_FiveShadowCreepingIceEnervationStrike 9 8543 17844 17574 17427 5 32 2
131 Warblade_GhostBlade 6 8544 17845 17575 17428 3 32 2
132 Warblade_HandOfDeath 4 8545 17846 17576 17429 0 32 2
133 Warblade_IslandOfBlades 1 8546 17847 17577 17430 0 32 1
134 Warblade_ObscuringShadowVeil 4 8547 17848 17578 17431 2 32 2
135 Warblade_OneWithShadow 8 8548 17849 17579 17432 1 32 3
136 Warblade_ShadowBladeTechnique 1 8549 17850 17580 17433 0 32 2
137 Warblade_ShadowBlink 7 8550 17851 17581 17434 0 32 5
138 Warblade_ShadowGarrote 3 8551 17852 17582 17435 1 32 2
139 Warblade_ShadowJaunt 2 8552 17853 17583 17436 0 32 5
140 Warblade_ShadowNoose 6 8553 17854 17584 17437 0 32 2
141 Warblade_ShadowStride 5 8554 17855 17585 17438 0 32 5
142 Warblade_StalkerInTheNight 6 8555 17856 17586 17439 0 32 2
143 Warblade_StepOfTheDancingMoth 5 8556 17857 17587 17440 1 32 1
144 Warblade_StrengthDrainingStrike 3 8557 17858 17588 17441 1 32 2
145 Warblade_AdamantineBones 8 8558 17859 17589 17442 3 64 2
146 Warblade_AncientMountainHammer 7 8559 17860 17590 17443 3 64 2
147 Warblade_BonesplittingStrike 4 8560 17861 17591 17444 2 64 2
148 Warblade_Bonecrusher 3 8561 17862 17592 17445 0 64 2
149 Warblade_BoulderRoll 4 8562 17863 17593 17446 2 64 4
150 Warblade_ChargingMinotaur 1 8563 17864 17594 17447 0 64 2
151 Warblade_ColossusStrike 7 8564 17865 17595 17448 2 64 2
152 Warblade_CrushingVise 6 8565 17866 17596 17449 0 64 2
153 Warblade_CrushingWeightOfTheMountain 3 8566 17867 17597 17450 0 64 1
154 Warblade_EarthstrikeQuake 8 8567 17868 17598 17451 2 64 2
155 Warblade_ElderMountainHammer 5 8568 17869 17599 17452 2 64 2
156 Warblade_GiantsStance 5 8569 17870 17600 17453 2 64 1
157 Warblade_IronBones 6 8570 17871 17601 17454 2 64 2
158 Warblade_IrresistibleMountainStrike 6 8571 17872 17602 17455 0 64 2
159 Warblade_MountainAvalanche 5 8572 17873 17603 17456 2 64 2
160 Warblade_MountainHammer 2 8573 17874 17604 17457 0 64 2
161 Warblade_MountainTombstoneStrike 9 8574 17875 17605 17458 0 64 2
162 Warblade_OverwhelmingMountainStrike 4 8575 17876 17606 17459 0 64 2
163 Warblade_RootsOfTheMountain 3 8576 17877 17607 17460 0 64 1
164 Warblade_StoneBones 1 8577 17878 17608 17461 0 64 2
165 Warblade_StoneDragonsFury 3 8578 17879 17609 17462 0 64 2
166 Warblade_StoneVise 2 8579 17880 17610 17463 0 64 2
167 Warblade_StonefootStance 1 8580 17881 17611 17464 0 64 1
168 Warblade_StrengthOfStone 8 8581 17882 17612 17468 3 64 1
169 Warblade_BloodInTheWater 1 8582 17883 17613 17469 0 128 1
170 Warblade_ClawAtTheMoon 2 8583 17884 17614 17470 0 128 2
171 Warblade_DancingMongoose 5 8584 17885 17615 17471 2 128 4
172 Warblade_DeathFromAbove 4 8585 17886 17616 17472 1 128 2
173 Warblade_FeralDeathBlow 9 8586 17887 17617 17473 4 128 2
174 Warblade_FleshRipper 3 8587 17888 17618 17474 0 128 2
175 Warblade_FountainOfBlood 4 8588 17889 17619 17475 2 128 4
176 Warblade_GirallonWindmillFleshRip 8 8589 17890 17620 17476 3 128 4
177 Warblade_HamstringAttack 7 8590 17891 17621 17477 3 128 2
178 Warblade_HuntersSense 1 8591 17892 17622 17478 0 128 1
179 Warblade_LeapingDragonStance 3 8592 17893 17623 17479 0 128 1
180 Warblade_PouncingCharge 5 8593 17894 17624 17480 2 128 2
181 Warblade_PreyOnTheWeak 7 8594 17895 17625 17481 2 128 1
182 Warblade_RabidBearStrike 6 8595 17896 17626 17482 2 128 2
183 Warblade_RabidWolfStrike 2 8596 17897 17627 17483 0 128 2
184 Warblade_RagingMongoose 8 8597 17898 17628 17484 3 128 4
185 Warblade_SoaringRaptorStrike 3 8598 17899 17629 17485 0 128 2
186 Warblade_SuddenLeap 1 8599 17900 17630 17486 1 128 4
187 Warblade_SwoopingDragonStrike 7 8600 17901 17631 17487 3 128 2
188 Warblade_WolfClimbsTheMountain 6 8601 17902 17632 17488 2 128 2
189 Warblade_WolfFangStrike 1 8602 17903 17633 17489 0 128 2
190 Warblade_WolfPackTactics 8 8603 17904 17634 17490 2 128 1
191 Warblade_WolverineStance 3 8604 17905 17635 17491 0 128 1
192 Warblade_BattleLeadersCharge 2 8605 17906 17636 17492 0 256 2
193 Warblade_BolsteringVoice 1 8606 17907 17637 17493 0 256 1
194 Warblade_ClarionCall 7 8607 17908 17638 17494 3 256 4
195 Warblade_CoveringStrike 4 8608 17909 17639 17495 1 256 4
196 Warblade_DouseTheFlames 1 8609 17910 17640 17496 0 256 2
197 Warblade_FlankingManeuver 5 8610 17911 17641 17497 2 256 2
198 Warblade_LeadingTheAttack 1 8611 17912 17642 17498 0 256 2
199 Warblade_LeadingTheCharge 1 8612 17913 17643 17499 0 256 1
200 Warblade_LionsRoar 3 8613 17914 17644 17500 0 256 4
201 Warblade_OrderForgedFromChaos 6 8614 17915 17645 17501 2 256 5
202 Warblade_PressTheAdvantage 5 8615 17916 17646 17502 2 256 1
203 Warblade_SwarmTactics 8 8616 17917 17647 17503 1 256 1
204 Warblade_SwarmingAssault 7 8617 17918 17648 17504 3 256 2
205 Warblade_TacticalStrike 2 8618 17919 17649 17505 0 256 2
206 Warblade_TacticsOfTheWolf 3 8619 17920 17650 17506 1 256 1
207 Warblade_WarLeadersCharge 6 8620 17921 17651 17507 2 256 2
208 Warblade_WarMastersCharge 9 8621 17922 17652 17508 4 256 2
209 Warblade_WhiteRavenHammer 8 8622 17923 17653 17509 0 256 2
210 Warblade_WhiteRavenStrike 4 8623 17924 17654 17510 1 256 2
211 Warblade_WhiteRavenTactics 3 8624 17925 17655 17511 0 256 4

View File

@@ -1,890 +0,0 @@
2DA V2.0
FeatLabel FeatIndex List GrantedOnLevel OnMenu
0 **Class_feats** **** **** **** ****
1 ImpCombatCasting 696 3 1 0
2 ReadyManeuver 1823 3 1 1
3 WeapProfSim 46 3 1 0
4 WeapProfSim_Dart 7914 3 1 0
5 WeapProfSim_Light_Mace 7908 3 1 0
6 WeapProfSim_Morningstar 7923 3 1 0
7 WeapProfSim_Shortspear 7927 3 1 0
8 WeapProfSim_Sickle 7929 3 1 0
9 WeapProfSim_Sling 7930 3 1 0
10 ArmProfLgt 3 3 1 0
11 ArmProfMed 4 3 1 0
12 ArmProfHvy 2 3 1 0
13 Shield 32 3 1 0
14 WeapProfMar 45 3 1 0
15 WeapProfMar_Battleaxe 7903 3 1 0
16 WeapProfMar_Greataxe 7913 3 1 0
17 WeapProfMar_Greatsword 7912 3 1 0
18 WeapProfMar_Halberd 7909 3 1 0
19 WeapProfMar_Handaxe 7919 3 1 0
20 WeapProfMar_Heavy_Flail 7917 3 1 0
21 WeapProfMar_Light_Flail 7905 3 1 0
22 WeapProfMar_Light_Hammer 7918 3 1 0
23 WeapProfMar_Longbow 7907 3 1 0
24 WeapProfMar_Longsword 7902 3 1 0
25 WeapProfMar_Rapier 7924 3 1 0
26 WeapProfMar_Scimitar 7925 3 1 0
27 WeapProfMar_Shortbow 7910 3 1 0
28 WeapProfMar_Shortsword 7901 3 1 0
29 WeapProfMar_Throwing_Axe 7931 3 1 0
30 WeapProfMar_Trident 7932 3 1 0
31 WeapProfMar_Warhammer 7906 3 1 0
32 WP_Light_Lance 7938 3 1 0
33 WP_Heavy_Pick 7939 3 1 0
34 WP_Light_Pick 7940 3 1 0
35 WP_Falchion 7943 3 1 0
36 WP_Maul 7947 3 1 0
37 WP_Goad 7949 3 1 0
38 WP_Heavy_Mace 7946 3 1 0
39 WP_Katar 7945 3 1 0
40 WP_Sap 7944 3 1 0
41 SteelyResolve 2865 3 1 0
42 FuriousCounterassault 2866 3 1 0
43 IndomitableSoul 2867 3 2 0
44 ZealousSurge 2868 3 4 1
45 Smite 2863 3 6 1
46 Die_Hard 3297 3 10 0
47 Mettle 3665 3 13 0
48 **** **** **** **** ****
49 AdaptiveStyle 24075 0 -1 0
50 ExtraGrantedManeuver 4096 0 -1 0
51 VitalRecovery 3636 0 -1 0
52 StonePower 5294 0 -1 1
53 RisingPhoenix_FullAttack 5204 0 99 1
54 "Remember to move all ToB feats" **** **** **** ****
55 "outside the autoupdate range" **** **** **** ****
56 **** **** **** **** ****
57 ###cls_feat_allBaseClasses_BEGIN### **** **** **** ****
58 **Bio169Feats** **** **** **** ****
59 FEAT_HORSE_MENU 1089 3 1 1
60 PLAYER_TOOL_01 1106 1 99 1
61 PLAYER_TOOL_02 1107 1 99 1
62 PLAYER_TOOL_03 1108 1 99 1
63 PLAYER_TOOL_04 1109 1 99 1
64 PLAYER_TOOL_05 1110 1 99 1
65 PLAYER_TOOL_06 1111 1 99 1
66 PLAYER_TOOL_07 1112 1 99 1
67 PLAYER_TOOL_08 1113 1 99 1
68 PLAYER_TOOL_09 1114 1 99 1
69 PLAYER_TOOL_10 1115 1 99 1
70 **FeatsGrantedToAll** **** **** **** ****
71 FEAT_JUMP 2884 3 1 1
72 FEAT_CLIMB 3112 3 1 1
73 FEAT_POWER_ATTACK_SINGLE_RADIAL 3143 0 99 1
74 FEAT_POWER_ATTACK_FIVES_RADIAL 3144 0 99 1
75 FEAT_PRC_POWER_ATTACK_QUICKS_RADIAL 3179 0 99 1
76 ACP_QUICK_FEAT 3479 0 99 1
77 ACP_HEAVY_FEAT 3480 0 99 1
78 ACP_UNARMED_FEAT 3481 0 99 1
79 TeleportManagementRadial 4235 3 1 1
80 SWITCH_FEAT 2285 3 1 1
81 FEAT_READ_RECIPE 2919 3 1 1
82 FEAT_SPELLS_TOUCH_ATTACK 4092 3 1 1
83 FEAT_SPELLS_HOLD_CHARGE_TOGGLE 4095 3 1 1
84 EndSpellEffects 2468 3 1 1
85 CombatMove_RadialMaster 2898 3 1 1
86 CombatMove_RadialMaster2 5195 3 1 1
87 CombatMove_RadialMaster3 3415 3 1 1
88 **** **** **** **** ****
89 **GeneralActivatableFeats** **** **** **** ****
90 FEAT_ATTUNE_GEM 2472 0 -1 1
91 FEAT_INSCRIBE_RUNE 2462 0 -1 1
92 FEAT_CRAFT_SKULL_TALISMAN 3004 0 -1 1
93 FEAT_THRALL_TO_DEMON 2616 0 -1 1
94 FEAT_HOLYRADIANCE 3164 0 -1 1
95 FEAT_NIMBUSOFLIGHT 3165 0 -1 1
96 FEAT_MANYSHOT 3306 0 -1 1
97 FEAT_IMP_MANYSHOT 3350 0 -1 1
98 Pinpoint_Accuracy 3351 0 -1 1
99 FEAT_SERVHEAVEN 3355 0 -1 1
100 FEAT_DISCIPLE_OF_DARKNESS 4012 0 -1 1
101 FEAT_BLOOD_OF_THE_WARLORD 4608 0 -1 1
102 Cloak_Dance 4817 0 -1 1
103 Reckless_Offense 4816 0 -1 1
104 ZoneOfAnimation 2891 0 -1 1
105 FEAT_SPELLFIRE_WIELDER 4368 0 -1 1
106 FEAT_SPELLFIRE_INCREASE 4369 0 99 1
107 FEAT_SPELLFIRE_DECREASE 4370 0 99 1
108 FEAT_SPELLFIRE_QUICKSELECT 4371 0 99 1
109 FEAT_DISCIPLE_OF_THE_SUN 3127 0 -1 1
110 Dragonfire_Assault 1842 0 -1 1
111 Dragonfire_Channeling 1843 0 -1 1
112 Dragonfire_Inspiration 1844 0 -1 1
113 DauntingPresence 24025 0 -1 1
114 ProfaneLifeLeech 24026 0 -1 1
115 ProfaneAgony 5282 0 -1 1
116 SacredVitality 24027 0 -1 1
117 SacredVengeance 24028 0 -1 1
118 DeformityEyes 24029 0 -1 1
119 DeformityParasite 24031 0 -1 1
120 DarkSpeech 24033 0 -1 1
121 DarkWhispers 24034 0 -1 1
122 MastersWill 24035 0 -1 1
123 DeformityMadness 24036 0 -1 1
124 ReflexivePsychosis 24037 0 -1 1
125 ChosenOfEvil 24038 0 -1 1
126 Avenging_Strike 4297 0 -1 1
127 SnowflakeWardance 4489 0 -1 1
128 MasterWand 5312 0 -1 1
129 RecklessWandWielder 5313 0 -1 1
130 DoubleWandWielder 5315 0 -1 1
131 Wandstrike 5316 0 -1 1
132 Snap_Kick 4398 0 -1 1
133 HighSwordLowAxe 5288 0 -1 1
134 ScorpionsGrasp 5178 0 -1 1
135 WeaponAndTorch 5291 0 -1 1
136 ShieldCharge 3256 0 -1 1
137 ShieldSlam 3257 0 -1 1
138 AwesomeBlow 5370 0 -1 1
139 Spinning_Halberd 5287 0 -1 1
140 FEAT_RAY_CHARM_PERSON 2220 0 99 1
141 FEAT_RAY_CHARM_MONSTER 2221 0 99 1
142 FEAT_RAY_SLEEP 2222 0 99 1
143 FEAT_RAY_FLESH_TO_STONE 2223 0 99 1
144 FEAT_RAY_DISINTIGRATE 2224 0 99 1
145 FEAT_RAY_FEAR 2225 0 99 1
146 FEAT_RAY_SLOW 2226 0 99 1
147 FEAT_RAY_INFLICT_MODERATE_WOUNDS 2227 0 99 1
148 FEAT_WANDER_UNSEEN 5028 0 99 1
149 BonesOfTheEarth_Feat 2864 0 99 1
150 FEAT_MYSTIC_BACKLASH 24737 0 -1 1
151 FEAT_ACIDIC_SPLATTER 24738 0 -1 1
152 FEAT_FIERY_BURST 24739 0 -1 1
153 FEAT_STORM_BOLT 24740 0 -1 1
154 FEAT_WINTERS_BLAST 24741 0 -1 1
155 FEAT_CLAP_OF_THUNDER 24742 0 -1 1
156 FEAT_SICKENING_GRASP 24743 0 -1 1
157 FEAT_TOUCH_OF_HEALING 24744 0 -1 1
158 FEAT_DIMENSIONAL_JAUNT 24745 0 -1 1
159 FEAT_CLUTCH_OF_EARTH 24746 0 -1 1
160 FEAT_BORNE_ALOFT 24747 0 -1 1
161 FEAT_PROTECTIVE_WARD 24748 0 -1 1
162 FEAT_SHADOW_VEIL 24749 0 -1 1
163 FEAT_SUNLIGHT_EYES 24750 0 -1 1
164 FEAT_TOUCH_OF_DISTRACTION 24751 0 -1 1
165 FEAT_UMBRAL_SHROUD 24752 0 -1 1
166 FEAT_CHARNEL_MIASMA 24753 0 -1 1
167 FEAT_DROWNING_GLANCE 24754 0 -1 1
168 FEAT_INVISIBLE_NEEDLE 24755 0 -1 1
169 FEAT_SUMMON_ELEMENTAL 24756 0 -1 1
170 FEAT_DIMENSIONAL_REACH 24757 0 -1 1
171 FEAT_HURRICANE_BREATH 24758 0 -1 1
172 FEAT_MINOR_SHAPESHIFT 24759 0 -1 1
173 FEAT_FACECHANGER 24760 0 -1 1
174 **** **** **** **** ****
175 **Metabreath_and_Channeling** **** **** **** ****
176 FEAT_CLINGING_BREATH 4966 0 -1 1
177 FEAT_LINGERING_BREATH 4967 0 -1 1
178 FEAT_ENLARGE_BREATH 4968 0 -1 1
179 FEAT_HEIGHTEN_BREATH 4969 0 -1 1
180 FEAT_MAXIMIZE_BREATH 4970 0 -1 1
181 FEAT_SHAPE_BREATH 4972 0 -1 1
182 FEAT_SPREAD_BREATH 4973 0 -1 1
183 FEAT_TEMPEST_BREATH 4974 0 -1 1
184 FEAT_ENTANGLING_EXHALATION 4975 0 -1 1
185 FEAT_EXHALED_BARRIER 4976 0 -1 1
186 FEAT_EXHALED_IMMUNITY 4977 0 -1 1
187 **** **** **** **** ****
188 **DraconicAuras** **** **** **** ****
189 FEAT_BONUS_AURA_ENERGYACID 1828 0 -1 1
190 FEAT_BONUS_AURA_ENERGYCOLD 1829 0 -1 1
191 FEAT_BONUS_AURA_ENERGYELEC 1830 0 -1 1
192 FEAT_BONUS_AURA_ENERGYFIRE 1831 0 -1 1
193 FEAT_BONUS_AURA_TOUGHNESS 1894 0 -1 1
194 FEAT_BONUS_AURA_SENSES 1891 0 -1 1
195 FEAT_BONUS_AURA_PRESENCE 1885 0 -1 1
196 FEAT_BONUS_AURA_INSIGHT 1884 0 -1 1
197 FEAT_BONUS_AURA_RESOLVE 1890 0 -1 1
198 FEAT_BONUS_AURA_STAMINA 1892 0 -1 1
199 FEAT_BONUS_AURA_SWIFTNESS 1893 0 -1 1
200 FEAT_BONUS_AURA_RESISTACID 1886 0 -1 1
201 FEAT_BONUS_AURA_RESISTCOLD 1887 0 -1 1
202 FEAT_BONUS_AURA_RESISTELEC 1888 0 -1 1
203 FEAT_BONUS_AURA_RESISTFIRE 1889 0 -1 1
204 FEAT_BONUS_AURA_MAGICPOWER 1840 0 -1 1
205 FEAT_SECOND_AURA_POWER 1853 0 99 1
206 FEAT_SECOND_AURA_ENERGYSHLD 1854 0 99 1
207 FEAT_SECOND_AURA_TOUGHNESS 1855 0 99 1
208 FEAT_SECOND_AURA_SENSES 1856 0 99 1
209 FEAT_SECOND_AURA_VIGOR 1857 0 99 1
210 FEAT_SECOND_AURA_RESISTANCE 1858 0 99 1
211 FEAT_SECOND_AURA_PRESENCE 1859 0 99 1
212 FEAT_SECOND_AURA_INSIGHT 1860 0 99 1
213 FEAT_SECOND_AURA_RESOLVE 1861 0 99 1
214 FEAT_SECOND_AURA_STAMINA 1862 0 99 1
215 FEAT_SECOND_AURA_SWIFTNESS 1863 0 99 1
216 FEAT_SECOND_AURA_RESISTACID 1864 0 99 1
217 FEAT_SECOND_AURA_RESISTCOLD 1865 0 99 1
218 FEAT_SECOND_AURA_RESISTELEC 1866 0 99 1
219 FEAT_SECOND_AURA_RESISTFIRE 1867 0 99 1
220 FEAT_SECOND_AURA_MAGICPOWER 1841 0 99 1
221 FEAT_SECOND_AURA_ENERGYACID 1824 0 99 1
222 FEAT_SECOND_AURA_ENERGYCOLD 1825 0 99 1
223 FEAT_SECOND_AURA_ENERGYELEC 1826 0 99 1
224 FEAT_SECOND_AURA_ENERGYFIRE 1827 0 99 1
225 FEAT_SECOND_AURA_ENERGY 1836 0 99 1
226 **** **** **** **** ****
227 **PsionicFeats** **** **** **** ****
228 Psionic_Focus 4818 0 99 1
229 Invest_Armour 3643 0 -1 1
230 Mental_Leap 4809 0 -1 1
231 Psionic_Fist 4800 0 -1 1
232 Greater_Psionic_Fist 4821 0 -1 1
233 Psionic_Weapon 4822 0 -1 1
234 Greater_Psionic_Weapon 4823 0 -1 1
235 Psionic_Shot 4824 0 -1 1
236 Greater_Psionic_Shot 4825 0 -1 1
237 Psionic_Meditation 4827 0 -1 1
238 Unavoidable_Strike 4830 0 -1 1
239 Wounding_Attack 4832 0 -1 1
240 Deep_Impact 4852 0 -1 1
241 Fell_Shot 4853 0 -1 1
242 Strength_of_Two 4965 0 -1 1
243 **** **** **** **** ****
244 **IncarnumFeats** **** **** **** ****
245 InvestEssentiaConversation 8800 0 99 1
246 HealingSoul 8882 0 99 1
247 MidnightAugmentation 8884 0 99 1
248 PsycarnumBlade 8887 0 99 1
249 DivineSoultouch 8891 0 99 1
250 PsycarnumInfusion 8896 0 99 1
251 **** **** **** **** ****
252 **BindingFeats** **** **** **** ****
253 BindVestige 9131 0 -1 1
254 ExpelVestige 9136 0 -1 1
255 MalphasArcaneEye 9040 0 99 1
256 SavnokCallArmor 9043 0 99 1
257 AndromaliusSee_Invisibility 9048 0 99 1
258 FocalorAuraSadness 9049 0 99 1
259 KarsusSenses 9052 0 99 1
260 **** **** **** **** ****
261 **RacialFeats** **** **** **** ****
262 FEAT_ASHERATI_BODY_DAZZLE 5213 0 99 1
263 FEAT_ASHERATI_BODY_LAMP 5214 0 99 1
264 FEAT_URDINNIR_STONESKIN 4644 0 99 1
265 FEAT_AVARIEL_DIVE 4645 0 99 1
266 FEAT_AYUAN_FEAR 4646 0 99 1
267 FEAT_AYUAN_ENTANGLE 4647 0 99 1
268 FEAT_AYUAN_DARKNESS 4648 0 99 1
269 FEAT_AYUAN_NEUTRALIZE_POISON 4649 0 99 1
270 FEAT_AASIMAR_LIGHT 4650 0 99 1
271 FEAT_TIEFLING_DARK 4651 0 99 1
272 FEAT_SVIRF_BLIND_DEAF 4652 0 99 1
273 FEAT_SVIRF_BLUR 4653 0 99 1
274 FEAT_SVIRF_DISGUISE 4654 0 99 1
275 FEAT_SVIRF_REVERT 4655 0 99 1
276 FEAT_RAK_DISGUISE 4656 0 99 1
277 FEAT_RAK_CHANGE_SHAPE 4657 0 99 1
278 FEAT_PYUAN_CHARM 4658 0 99 1
279 FEAT_PYUAN_DARKNESS 4659 0 99 1
280 FEAT_PYUAN_ENTANGLE 4660 0 99 1
281 FEAT_PYUAN_FEAR 4661 0 99 1
282 FEAT_PIXIE_INVIS 4662 0 99 1
283 FEAT_PIXIE_CONFUSE 4663 0 99 1
284 FEAT_PIXIE_ENTANGLE 4664 0 99 1
285 FEAT_PIXIE_DISPEL_MAGIC 4665 0 99 1
286 FEAT_PIXIE_POLYMORPH 4666 0 99 1
287 FEAT_PIXIE_REVERT 4667 0 99 1
288 FEAT_MINOTAUR_CHARGE 4668 0 99 1
289 FEAT_ILLITHID_CHARM 4669 0 99 1
290 FEAT_ILLITHID_BLAST 4670 0 99 1
291 FEAT_ILLITHID_SUCKBRAIN 4671 0 99 1
292 FEAT_GITHZERAI_DAZE 4672 0 99 1
293 FEAT_GITHYANKI_DAZE 4673 0 99 1
294 FEAT_GITHYANKI_BLUR 4674 0 99 1
295 FEAT_FEYRI_CHARMPERSON 4675 0 99 1
296 FEAT_FEYRI_CLAIRAUDIENCE 4676 0 99 1
297 FEAT_FEYRI_DARKNESS 4677 0 99 1
298 FEAT_FEYRI_ENERVATION 4678 0 99 1
299 FEAT_FEYRI_ALTER 4679 0 99 1
300 FEAT_FEYRI_REVERT 4680 0 99 1
301 FEAT_DUERGAR_INVIS 4681 0 99 1
302 FEAT_DROW_DARKNESS 4682 0 99 1
303 FEAT_DROW_FAERIE_FIRE 4683 0 99 1
304 BROWNIE_RAKSHASA_HIPS 433 0 99 1
305 FEAT_WGNOME_SILENCE 4555 0 99 1
306 FEAT_WGNOME_MAGEHAND 4519 0 99 1
307 FEAT_HOUND_AID 4574 0 99 1
308 FEAT_HOUND_AURAMENACE 4548 0 99 1
309 FEAT_HOUND_CONTFLAME 4514 0 99 1
310 FEAT_HOUND_DETECTEVIL 4618 0 99 1
311 FEAT_HOUND_DISGUISE 4513 0 99 1
312 FEAT_HOUND_MAGICCIRCLE 4515 0 99 1
313 FEAT_HOUND_TELEPORT 4516 0 99 1
314 FEAT_RACE_ENERGYRAY 4856 0 99 1
315 FEAT_RACE_ENERGYRAYSONIC 4520 0 99 1
316 FEAT_ELAN_RESISTANCE 4521 0 99 1
317 FEAT_ELAN_RESILIANCE 4522 0 99 1
318 FEAT_PSIRACE_STOMP 4524 0 99 1
319 FEAT_MAENAD_OUTBURST 4525 0 99 1
320 FEAT_XEPH_BURST 4526 0 99 1
321 FEAT_ZENYTH_TRUESTRIKE 4536 0 99 1
322 FEAT_TULADH_MAGIC_CIRCL 4533 0 99 1
323 FEAT_NATHRI_EXP_RETREAT 4534 0 99 1
324 FEAT_BLADELING_RAZOR_STORM 4539 0 99 1
325 FEAT_KAPAK_SALIVA 4546 0 99 1
326 FEAT_IRDA_FLARE 4551 0 99 1
327 FEAT_ZAKYA_CHILLTOUCH 4570 0 99 1
328 FEAT_ZAKYA_TRUESTRIKE 4557 0 99 1
329 FEAT_ZAKYA_VAMPTOUCH 4558 0 99 1
330 FEAT_MINOR_CHANGE_SHAPE 4560 0 99 1
331 FEAT_CHANGELING_CHANGE_SHAPE 4561 0 99 1
332 FEAT_IRDA_CHANGE_SHAPE 4562 0 99 1
333 FEAT_QUICK_CHANGE_SHAPE 4563 0 99 1
334 FEAT_SHIFTER_SHIFTING 4566 0 99 1
335 FEAT_RAK_SHADOW_JUMP 3307 0 99 1
336 FEAT_NIXIE_CHARM_PERSON 4597 0 99 1
337 FEAT_NIXIE_WATERBREATHING 4641 0 99 1
338 FEAT_NYMPH_DIMENSION_DOOR 4755 0 99 1
339 FEAT_NYMPH_STUNNING_GLANCE 4684 0 99 1
340 FEAT_NYMPH_BLINDING_BEAUTY 4685 0 99 1
341 FEAT_GRIG_PYROTECHNICS 4686 0 99 1
342 FEAT_GRIG_INVIS 4687 0 99 1
343 FEAT_GRIG_ENTANGLE 4635 0 99 1
344 FEAT_BRALANI_LIGHTNING_BOLT 4995 0 99 1
345 FEAT_BRALANI_CURE_SERIOUS 4996 0 99 1
346 FEAT_BRALANI_BLUR 4997 0 99 1
347 FEAT_BRALANI_CHARM_PERSON 4998 0 99 1
348 FEAT_BRALANI_MIRROR_IMAGE 4999 0 99 1
349 FEAT_BRALANI_GUST_OF_WIND 4978 0 99 1
350 FEAT_TOUCH_OF_LUCK 4634 0 99 1
351 FEAT_FORESTLORD_TREEWALK 4633 0 99 1
352 FEAT_TROGLODYTE_STENCH 23549 0 99 1
353 Skarn_spines 5180 0 99 1
354 Killoren_Aspect_H 5209 0 99 1
355 Killoren_Aspect_D 5210 0 99 1
356 Killoren_Aspect_A 5211 0 99 1
357 FrostFolk_IceBlast 5372 0 99 1
358 Uldra_RayFrost 5373 0 99 1
359 Uldra_Fatigue 5374 0 99 1
360 Marrulurk_DA 2930 0 99 1
361 Marrulurk_NauseatingBreath 5375 0 99 1
362 ExtaminaarCharmAnimal 5379 0 99 1
363 Marrusault_Howl 3308 0 99 1
364 FEAT_HYBSIL_MIRROR_IMAGE 5382 0 99 1
365 FEAT_HYBSIL_DANCLIGHTS 5383 0 99 1
366 FEAT_HYBSIL_JUMP 5384 0 99 1
367 FEAT_WILDREN_FURY 5386 0 99 1
368 Turlemoi_RockThrowing 5419 0 99 1
369 Arkamoi_ArcaneMastermind 5424 0 99 1
370 Muckdweller_Squirt 5425 0 99 1
371 Aranea_AlternateForm 5426 0 99 1
372 Aranea_Web 5427 0 99 1
373 Mephling_breath 5429 0 99 1
374 FEAT_FOG_CLOUD_BREATH 5434 0 99 1
375 **** **** **** **** ****
376 **BonusDomains** **** **** **** ****
377 FEAT_CHECK_DOMAIN_SLOTS 2000 0 99 1
378 FEAT_CAST_DOMAIN_LEVEL_ONE 2049 0 99 1
379 FEAT_CAST_DOMAIN_LEVEL_TWO 2050 0 99 1
380 FEAT_CAST_DOMAIN_LEVEL_THREE 2051 0 99 1
381 FEAT_CAST_DOMAIN_LEVEL_FOUR 2052 0 99 1
382 FEAT_CAST_DOMAIN_LEVEL_FIVE 2053 0 99 1
383 FEAT_CAST_DOMAIN_LEVEL_SIX 2054 0 99 1
384 FEAT_CAST_DOMAIN_LEVEL_SEVEN 2055 0 99 1
385 FEAT_CAST_DOMAIN_LEVEL_EIGHT 2056 0 99 1
386 FEAT_CAST_DOMAIN_LEVEL_NINE 2057 0 99 1
387 Strength_Domain_Power 307 0 99 1
388 Protection_Domain_Power 308 0 99 1
389 Death_Domain_Power 310 0 99 1
390 Air_Domain_Power 311 0 99 1
391 Destruction_Domain_Power 313 0 99 1
392 Earth_Domain_Power 314 0 99 1
393 Fire_Domain_Power 316 0 99 1
394 Plant_Domain_Power 321 0 99 1
395 Sun_Domain_Power 322 0 99 1
396 Travel_Domain_Power 323 0 99 1
397 Trickery_Domain_Power 324 0 99 1
398 Water_Domain_Power 325 0 99 1
399 FEAT_ORC_DOMAIN 4041 0 99 1
400 FEAT_SLIME_DOMAIN 4043 0 99 1
401 FEAT_CHARM_DOMAIN 4045 0 99 1
402 FEAT_FAMILY_DOMAIN 4051 0 99 1
403 FEAT_HALFLING_DOMAIN 4052 0 99 1
404 FEAT_ILLUSION_DOMAIN 4053 0 99 0
405 FEAT_HATRED_DOMAIN 4054 0 99 1
406 FEAT_NOBILITY_DOMAIN 4055 0 99 1
407 FEAT_SCALEYKIND_DOMAIN 4057 0 99 1
408 FEAT_RENEWAL_DOMAIN 4060 0 99 1
409 FEAT_SPIDER_DOMAIN 4061 0 99 1
410 FEAT_BLIGHTBRINGER 2250 0 99 1
411 **** **** **** **** ****
412 **Templates** **** **** **** ****
413 Celestial_Smite_Evil 22601 0 99 1
414 Fiendish_Smite_Good 22603 0 99 1
415 Half_Celestial_Smite_Evil 22605 0 99 1
416 Half_Celestial_Protection_from_Evil 22606 0 99 1
417 Half_Celestial_Bless 22607 0 99 1
418 Half_Celestial_Aid 22608 0 99 1
419 Half_Celestial_Detect_Evil 22609 0 99 1
420 Half_Celestial_Cure_Serious_Wounds 22610 0 99 1
421 Half_Celestial_Neutralize_Poison 22611 0 99 1
422 Half_Celestial_HolySmite **** 0 99 1
423 Half_Celestial_Remove_Disease 22613 0 99 1
424 Half_Celestial_DispelEvil **** 0 99 1
425 Half_Celestial_Holy_Word 22615 0 99 1
426 Half_Celestial_HolyAura 22616 0 99 1
427 Half_Celestial_Hallow **** 0 99 1
428 Half_Celestial_Mass_Charm 22618 0 99 1
429 Half_Celestial_Summon_Creature_IX 22619 0 99 1
430 Half_Celestial_Resurrection 22620 0 99 1
431 Half_Celestial_Daylight 22621 0 99 1
432 Half_Fiendish_Smite_Good 22624 0 99 1
433 Half_Fiendish_Darkness 22625 0 99 1
434 Half_Fiendish_Desecrate **** 0 99 1
435 Half_Fiendish_Unholy_Blight **** 0 99 1
436 Half_Fiendish_Poison 22628 0 99 1
437 Half_Fiendish_Contagion 22629 0 99 1
438 Half_Fiendish_Blasphemy 22630 0 99 1
439 Half_Fiendish_Unholy_Aura **** 0 99 1
440 Half_Fiendish_Unhallow **** 0 99 1
441 Half_Fiendish_Horrid_Wilting 22633 0 99 1
442 Half_Fiendish_Summon_Creature_IX 22634 0 99 1
443 Half_Fiendish_Destruction 22635 0 99 1
444 Lich_Fear_Aura 22637 0 99 1
445 Lich_Paralyzing_Touch 22638 0 99 1
446 Lich_Appearance 22639 0 99 1
447 Demilich_Alter_Self 22641 0 99 1
448 Demilich_Astral_Projection **** 0 99 1
449 Demilich_Create_Greater_Undead 22643 0 99 1
450 Demilich_Create_Undead 22644 0 99 1
451 Demilich_Death_Knell **** 0 99 1
452 Demilich_Enervation 22646 0 99 1
453 Demilich_Greater_Dispel_Magic 22647 0 99 1
454 Demilich_Harm 22648 0 99 1
455 Demilich_Summon_Creature_I 22649 0 99 1
456 Demilich_Summon_Creature_II 22650 0 99 1
457 Demilich_Summon_Creature_III 22651 0 99 1
458 Demilich_Summon_Creature_IV 22652 0 99 1
459 Demilich_Summon_Creature_V 22653 0 99 1
460 Demilich_Summon_Creature_VI 22654 0 99 1
461 Demilich_Summon_Creature_VII 22655 0 99 1
462 Demilich_Summon_Creature_VIII 22656 0 99 1
463 Demilich_Summon_Creature_IX 22657 0 99 1
464 Demilich_Telekinesis **** 0 99 1
465 Demilich_Weird 22659 0 99 1
466 Demilich_Greater_Planar_Ally 22660 0 99 1
467 HalfDragon_Breath_Weapon 22662 0 99 1
468 Earth_Strike 5328 0 99 1
469 BloodedOne_War_Cry 5377 0 99 1
470 RethDekala_VilefireBlast 5409 0 99 1
471 RethDekala_MartialSpirit 5410 0 99 1
472 RethDekala_ThicketOfBlades 5411 0 99 1
473 RethDekala_DauntingStrike 5412 0 99 1
474 RethDekala_DeathFromAbove 5413 0 99 1
475 RethDekala_DisarmingStrike 5414 0 99 1
476 RethDekala_EntanglingBlade 5415 0 99 1
477 RethDekala_WallOfBlades 5416 0 99 1
478 RethDekala_RecoverManeuvers 5417 0 99 1
479 ArchlichTurnUndead 22701 0 99 1
480 FEAT_ANIMATE_DEAD 3574 0 99 1
481 FEAT_PROJECTION 3579 0 99 1
482 FEAT_END_PROJECTION 3575 0 99 1
483 **** **** **** **** ****
484 Saint_Bless 22702 0 99 1
485 Saint_Guidance_Placeholder **** **** **** ****
486 Saint_Resistance 22704 0 99 1
487 Saint_Virtue 22705 0 99 1
488 Saint_Protective_Aura 22706 0 99 1
489 **** **** **** **** ****
490 **WeaponsOfLegacy** **** **** **** ****
491 BBB_Darkvision 22710 0 99 1
492 BBB_Longstrider 22711 0 99 1
493 BBB_Lesser_Restoration 22712 0 99 1
494 BBB_Teleport_SelfOnly 22713 0 99 1
495 BBB_Protection_from_Evil 22714 0 99 1
496 BBB_Drowseeker 22715 0 99 1
497 BBB_ShockingShot 22716 0 99 1
498 BBB_PierceTheBlackHeart 22717 0 99 1
499 Steadfast_vigor 22718 0 99 1
500 Steadfast_slow 22719 0 99 1
501 Flay_SnakeSting 22720 0 99 1
502 Flay_WhipWrap 22721 0 99 1
503 CrimsonRuination_FrozenFate 22722 0 99 1
504 Devious_DetectThoughts 22723 0 99 1
505 SimpleBow_TrueSeeing 22724 0 99 1
506 SimpleBow_Prescience 22725 0 99 1
507 SimpleBow_Focus 22726 0 99 1
508 Aradros_Extend 22727 0 99 1
509 Aradros_Survive 22728 0 99 1
510 Guurgal_Force 22729 0 99 1
511 Guurgal_Rage 22730 0 99 1
512 DivSpark_Fear 22731 0 99 1
513 DivSpark_Light 22732 0 99 1
514 Wargirds_Haste 22733 0 99 1
515 Wargirds_Stoneskin 22734 0 99 1
516 DesertWind_FierySlash 22735 0 99 1
517 DesertWind_HowlingWind 22736 0 99 1
518 DesertWind_FanFlames 22737 0 99 1
519 DesertWind_DustDesert 22738 0 99 1
520 Mindsplinter_VirtueDenied 22739 0 99 1
521 Mindsplinter_KissOfDeath 22740 0 99 1
522 Mindsplinter_BattleShriek 22741 0 99 1
523 Mindsplinter_RuinousHowl 22742 0 99 1
524 NotchedSpear_ParliamentOfFishes 22743 0 99 1
525 NotchedSpear_ConcealmentKraken 22744 0 99 1
526 NotchedSpear_ScionSea 22745 0 99 1
527 NotchedSpear_CommandSeaChildren 22746 0 99 1
528 Ur_SwiftStride 22747 0 99 1
529 Ur_HealingTotem 22748 0 99 1
530 Ur_SavageTransformation 22749 0 99 1
531 FlamecastersBolt_MarkTarget 22750 0 99 1
532 FlamecastersBolt_Morale 22751 0 99 1
533 FlamecastersBolt_Fireball 22752 0 99 1
534 StalkersBow_StalkersInsight 22753 0 99 1
535 StalkersBow_Ethereal 22754 0 99 1
536 Exordius_Guidance 22755 0 99 1
537 Exordius_Cure 22756 0 99 1
538 Exordius_Dismissal 22757 0 99 1
539 Caladbolg_Imprison 22758 0 99 1
540 HammerWitches_Detect 22759 0 99 1
541 HammerWitches_Spellbreaker 22760 0 99 1
542 HammerWitches_AMF 22761 0 99 1
543 HammerWitches_Dispel 22762 0 99 1
544 HammerWitches_Mantle 22763 0 99 1
545 SlingOfTheDireWind_StunningStone 22764 0 99 1
546 SlingOfTheDireWind_GustOfWind 22765 0 99 1
547 SlingOfTheDireWind_WindWall 22766 0 99 1
548 Treebrother_Shillelagh 22767 0 99 1
549 Treebrother_Charm_Plant 22768 0 99 1
550 Treebrother_Entangle 22769 0 99 1
551 Treebrother_Owls_Insight 22770 0 99 1
552 Treebrother_Changestaff 22771 0 99 1
553 FullMoonsTrick_Rage 22772 0 99 1
554 FullMoonsTrick_Invis 22773 0 99 1
555 FiendkillersFlail_Darkvis 22774 0 99 1
556 FiendkillersFlail_Detect 22775 0 99 1
557 ScalesBalance_Detect 22776 0 99 1
558 ScalesBalance_Cure 22777 0 99 1
559 ScalesBalance_Knell 22778 0 99 1
560 ScalesBalance_Enerv 22779 0 99 1
561 ScalesBalance_Heal 22780 0 99 1
562 ScalesBalance_Finger 22781 0 99 1
563 ShishiO_Charm 22782 0 99 1
564 ShishiO_Summon 22783 0 99 1
565 ShishiO_Poly 22784 0 99 1
566 ShishiO_Shout 22785 0 99 1
567 Dymondheart_ShedBolts 22786 0 99 1
568 Dymondheart_Deflect 22787 0 99 1
569 Dymondheart_Daylight 22788 0 99 1
570 Dymondheart_Cure 22789 0 99 1
571 Dymondheart_Banish 22790 0 99 1
572 Sunsword_Daylight 22791 0 99 1
573 Sunsword_Death_Ward 22792 0 99 1
574 Sunsword_Banish 22793 0 99 1
575 Sunsword_Undeath 22794 0 99 1
576 Blackrazor_Detect 22795 0 99 1
577 Blackrazor_Knell 22796 0 99 1
578 Blackrazor_Haste 22797 0 99 1
579 Ramethene_Detect 22798 0 99 1
580 Ramethene_Smite 22799 0 99 1
581 Ramethene_Resist_Elements 22800 0 99 1
582 Ramethene_Cloudkill 22801 0 99 1
583 Ramethene_SuddenMaximize 22802 0 99 1
584 Ramethene_Horrid_Wilting 22803 0 99 1
585 Wyrmbane_Cause_Fear 22804 0 99 1
586 Wyrmbane_Lightning_Bolt 22805 0 99 1
587 Wyrmbane_Sudden_Emp 22806 0 99 1
588 Wyrmbane_Breath_Lightning 22807 0 99 1
589 Whelm_Detect_Giant 22808 0 99 1
590 Whelm_Locate_Object 22809 0 99 1
591 Whelm_Detect_Goblin 22810 0 99 1
592 Ravenkind_Dancing_Lights 22811 0 99 1
593 Ravenkind_Light 22812 0 99 1
594 Ravenkind_Flare 22813 0 99 1
595 Ravenkind_Detect_Undead 22814 0 99 1
596 Ravenkind_Halt_Undead 22815 0 99 1
597 Ravenkind_Cure_Light_Wounds 22816 0 99 1
598 Ravenkind_Daylight 22817 0 99 1
599 Ravenkind_Death_Ward 22818 0 99 1
600 Ravenkind_Break_Enchantment 22819 0 99 1
601 Ravenkind_Mass_Heal 22820 0 99 1
602 LastCitadel_LeadingTheAttack 22821 0 99 1
603 LastCitadel_Prayer 22822 0 99 1
604 LastCitadel_Remove_Fear 22823 0 99 1
605 LastCitadel_Cure_Critical_Wounds 22824 0 99 1
606 LastCitadel_Blade_Barrier 22825 0 99 1
607 LastCitadel_Heal 22826 0 99 1
608 Unfettered_ChargingMinotaur 22827 0 99 1
609 Unfettered_ENLARGE_PERSON 22828 0 99 1
610 Unfettered_Etherealness 22829 0 99 1
611 Unfettered_Stoneskin 22830 0 99 1
612 Unfettered_Mordenkainens_Sword 22831 0 99 1
613 Hillcrusher_Earthen_Might 22832 0 99 1
614 Hillcrusher_Soften_Earth 22833 0 99 1
615 Hillcrusher_Fangs_of_Stone 22834 0 99 1
616 Hillcrusher_Raise_the_Earth 22835 0 99 1
617 Hillcrusher_Shake_the_Earth 22836 0 99 1
618 DesertWindToB_BurningBlade 22837 0 99 1
619 DesertWindToB_FanTheFlames 22838 0 99 1
620 DesertWindToB_WyrmsFlame 22839 0 99 1
621 Faithful_Detect_Evil 22840 0 99 1
622 Faithful_Lesser_Restoration 22841 0 99 1
623 Faithful_Restoration 22842 0 99 1
624 Faithful_Resiliency 22843 0 99 1
625 Faithful_ImmortalFortitude 22844 0 99 1
626 SupernalClarity_SapphireNightmareBlade 22845 0 99 1
627 SupernalClarity_PsychicPoise 22846 0 99 1
628 SupernalClarity_Haste 22847 0 99 1
629 SupernalClarity_Freeeeeedom 22848 0 99 1
630 SupernalClarity_Time_Stop 22849 0 99 1
631 Kamate_SteelWind 22850 0 99 1
632 Kamate_ShockingGrasp 22851 0 99 1
633 Kamate_Lightning_Bolt 22852 0 99 1
634 Kamate_Chain_Lightning 22853 0 99 1
635 Kamate_True_Strike 22854 0 99 1
636 Eventide_CometThrow 22855 0 99 1
637 Eventide_BafflingDefense 22856 0 99 1
638 Eventide_Improved_Invisibility 22857 0 99 1
639 Umbral_Invisibility 22858 0 99 1
640 Umbral_Shadowstep 22859 0 99 1
641 TigerFang_FrenziedCharge 22860 0 99 1
642 TigerFang_BattleFever 22861 0 99 1
643 TigerFang_Haste 22862 0 99 1
644 Bullybasher_KnockSilly 22863 0 99 1
645 Bullybasher_StoneGathering 22864 0 99 1
646 Bullybasher_LightningPunch 22865 0 99 1
647 Lorestealer_Read_Magic 22866 0 99 1
648 Lorestealer_DetectMagic 22867 0 99 1
649 Lorestealer_Axecasting 22868 0 99 1
650 Durindana_Daylight 22869 0 99 1
651 Durindana_Death_Ward 22870 0 99 1
652 Durindana_Hallow 22871 0 99 1
653 Durindana_Dazzle 22872 0 99 1
654 Thaas_Detect_Demon 22873 0 99 1
655 Thaas_ObstructSummoning 22874 0 99 1
656 Thaas_Banishment 22875 0 99 1
657 Thaas_Teleport 22876 0 99 1
658 Quickspur_Entropic_Shield 22877 0 99 1
659 Quickspur_Resist_Elements 22878 0 99 1
660 Quickspur_PhantomSteed 22879 0 99 1
661 Quickspur_Blur 22880 0 99 1
662 Quickspur_Stoneskin 22881 0 99 1
663 BES_FIRE_OF_THE_HEART 22882 0 99 1
664 BES_ENTHRALLING_LIGHT 22883 0 99 1
665 BES_COLOR_SPRAY 22884 0 99 1
666 BES_BLINDING_FLASH 22885 0 99 1
667 BES_SHOOTING_STARS 22886 0 99 1
668 BES_GLITTERING_MOTES 22887 0 99 1
669 BES_TWINKLE 22888 0 99 1
670 BES_SILVER_STARLIGHT 22889 0 99 1
671 BES_STARLIGHT_DISPELLING 22890 0 99 1
672 BES_TALES_IN_THE_SKY 22891 0 99 1
673 BES_CALL_DOWN_A_STAR 22892 0 99 1
674 ###cls_feat_allBaseClasses_END### **** **** **** ****
675 **** **** **** **** ****
676 ####START_OF_TOB_SPELLBOOK_RESERVE **** **** **** ****
677 Crusader_BlisteringFlourish 8001 0 99 1
678 Crusader_BurningBlade 8002 0 99 1
679 Crusader_BurningBrand 8003 0 99 1
680 Crusader_DeathMark 8004 0 99 1
681 Crusader_DesertTempest 8005 0 99 1
682 Crusader_DistractingEmber 8006 0 99 1
683 Crusader_DragonsFlame 8007 0 99 1
684 Crusader_FanTheFlames 8008 0 99 1
685 Crusader_FieryAssault 8009 0 99 1
686 Crusader_FireRiposte 8010 0 99 1
687 Crusader_Firesnake 8011 0 99 1
688 Crusader_FlamesBlessing 8012 0 99 1
689 Crusader_FlashingSun 8013 0 99 1
690 Crusader_HatchlingsFlame 8014 0 99 1
691 Crusader_HolocaustCloak 8015 0 99 1
692 Crusader_InfernoBlade 8016 0 99 1
693 Crusader_InfernoBlast 8017 0 99 1
694 Crusader_LeapingFlame 8018 0 99 1
695 Crusader_LingeringInferno 8019 0 99 1
696 Crusader_RingOfFire 8020 0 99 1
697 Crusader_RisingPhoenix 8021 0 99 1
698 Crusader_SalamanderCharge 8022 0 99 1
699 Crusader_SearingBlade 8023 0 99 1
700 Crusader_SearingCharge 8024 0 99 1
701 Crusader_WindStride 8025 0 99 1
702 Crusader_WyrmsFlame 8026 0 99 1
703 Crusader_ZephyrDance 8027 0 99 1
704 Crusader_AuraOfChaos 8028 0 99 1
705 Crusader_AuraOfPerfectOrder 8029 0 99 1
706 Crusader_AuraOfTriumph 8030 0 99 1
707 Crusader_AuraOfTyranny 8031 0 99 1
708 Crusader_CastigatingStrike 8032 0 99 1
709 Crusader_CrusadersStrike 8033 0 99 1
710 Crusader_DauntingStrike 8034 0 99 1
711 Crusader_DefensiveRebuke 8035 0 99 1
712 Crusader_DivineSurge 8036 0 99 1
713 Crusader_DivineSurgeGreater 8037 0 99 1
714 Crusader_DoomCharge 8038 0 99 1
715 Crusader_EntanglingBlade 8039 0 99 1
716 Crusader_Foehammer 8040 0 99 1
717 Crusader_ImmortalFortitude 8041 0 99 1
718 Crusader_IronGuardsGlare 8042 0 99 1
719 Crusader_LawBearer 8043 0 99 1
720 Crusader_MartialSpirit 8044 0 99 1
721 Crusader_RadiantCharge 8045 0 99 1
722 Crusader_RallyingStrike 8046 0 99 1
723 Crusader_RevitalizingStrike 8047 0 99 1
724 Crusader_ShieldBlock 8048 0 99 1
725 Crusader_ShieldCounter 8049 0 99 1
726 Crusader_StrikeOfRighteousVitality 8050 0 99 1
727 Crusader_ThicketOfBlades 8051 0 99 1
728 Crusader_TideOfChaos 8052 0 99 1
729 Crusader_VanguardStrike 8053 0 99 1
730 Crusader_ActionBeforeThought 8054 0 99 1
731 Crusader_AvalancheOfBlades 8055 0 99 1
732 Crusader_BoundingAssault 8056 0 99 1
733 Crusader_DiamondDefense 8057 0 99 1
734 Crusader_DiamondNightmareBlade 8058 0 99 1
735 Crusader_DisruptingBlow 8059 0 99 1
736 Crusader_EmeraldRazor 8060 0 99 1
737 Crusader_HearingTheAir 8061 0 99 1
738 Crusader_InsightfulStrike 8062 0 99 1
739 Crusader_InsightfulStrikeGreater 8063 0 99 1
740 Crusader_MindOverBody 8064 0 99 1
741 Crusader_MindStrike 8065 0 99 1
742 Crusader_MomentOfAlacrity 8066 0 99 1
743 Crusader_MomentOfPerfectMind 8067 0 99 1
744 Crusader_PearlOfBlackDoubt 8068 0 99 1
745 Crusader_QuicksilverMotion 8069 0 99 1
746 Crusader_RapidCounter 8070 0 99 1
747 Crusader_RubyNightmareBlade 8071 0 99 1
748 Crusader_SapphireNightmareBlade 8072 0 99 1
749 Crusader_StanceOfAlacrity 8073 0 99 1
750 Crusader_StanceOfClarity 8074 0 99 1
751 Crusader_TimeStandsStill 8075 0 99 1
752 Crusader_AbsoluteSteel 8076 0 99 1
753 Crusader_AdamantineHurricane 8077 0 99 1
754 Crusader_DancingBladeForm 8078 0 99 1
755 Crusader_DazingStrike 8079 0 99 1
756 Crusader_DisarmingStrike 8080 0 99 1
757 Crusader_ExorcismOfSteel 8081 0 99 1
758 Crusader_FinishingMove 8082 0 99 1
759 Crusader_IronHeartEndurance 8083 0 99 1
760 Crusader_IronHeartFocus 8084 0 99 1
761 Crusader_IronHeartSurge 8085 0 99 1
762 Crusader_LightningRecovery 8086 0 99 1
763 Crusader_LightningThrow 8087 0 99 1
764 Crusader_ManticoreParry 8088 0 99 1
765 Crusader_MithralTornado 8089 0 99 1
766 Crusader_PunishingStance 8090 0 99 1
767 Crusader_ScythingBlade 8091 0 99 1
768 Crusader_SteelWind 8092 0 99 1
769 Crusader_SteelyStrike 8093 0 99 1
770 Crusader_StrikeOfPerfectClarity 8094 0 99 1
771 Crusader_SupremeBladeParry 8095 0 99 1
772 Crusader_WallOfBlades 8096 0 99 1
773 Crusader_BafflingDefense 8097 0 99 1
774 Crusader_BallistaThrow 8098 0 99 1
775 Crusader_CleverPositioning 8099 0 99 1
776 Crusader_CometThrow 8100 0 99 1
777 Crusader_CounterCharge 8101 0 99 1
778 Crusader_DevastatingThrow 8102 0 99 1
779 Crusader_FeignedOpening 8103 0 99 1
780 Crusader_FoolsStrike 8104 0 99 1
781 Crusader_GhostlyDefense 8105 0 99 1
782 Crusader_GiantKillingStyle 8106 0 99 1
783 Crusader_HydraSlayingStrike 8107 0 99 1
784 Crusader_MightyThrow 8108 0 99 1
785 Crusader_MirroredPursuit 8109 0 99 1
786 Crusader_ScorpionParry 8110 0 99 1
787 Crusader_ShiftingDefense 8111 0 99 1
788 Crusader_SoaringThrow 8112 0 99 1
789 Crusader_StalkingShadow 8113 0 99 1
790 Crusader_StepOfTheWind 8114 0 99 1
791 Crusader_StrikeOfTheBrokenShield 8115 0 99 1
792 Crusader_TornadoThrow 8116 0 99 1
793 Crusader_AssassinsStance 8117 0 99 1
794 Crusader_BalanceOnTheSky 8118 0 99 1
795 Crusader_BloodlettingStrike 8119 0 99 1
796 Crusader_ChildOfShadow 8120 0 99 1
797 Crusader_ClingingShadowStrike 8121 0 99 1
798 Crusader_CloakOfDeception 8122 0 99 1
799 Crusader_DanceOfTheSpider 8123 0 99 1
800 Crusader_DeathInTheDark 8124 0 99 1
801 Crusader_DrainVitality 8125 0 99 1
802 Crusader_EnervatingShadowStrike 8126 0 99 1
803 Crusader_FiveShadowCreepingIceEnervationStrike 8127 0 99 1
804 Crusader_GhostBlade 8128 0 99 1
805 Crusader_HandOfDeath 8129 0 99 1
806 Crusader_IslandOfBlades 8130 0 99 1
807 Crusader_ObscuringShadowVeil 8131 0 99 1
808 Crusader_OneWithShadow 8132 0 99 1
809 Crusader_ShadowBladeTechnique 8133 0 99 1
810 Crusader_ShadowBlink 8134 0 99 1
811 Crusader_ShadowGarrote 8135 0 99 1
812 Crusader_ShadowJaunt 8136 0 99 1
813 Crusader_ShadowNoose 8137 0 99 1
814 Crusader_ShadowStride 8138 0 99 1
815 Crusader_StalkerInTheNight 8139 0 99 1
816 Crusader_StepOfTheDancingMoth 8140 0 99 1
817 Crusader_StrengthDrainingStrike 8141 0 99 1
818 Crusader_AdamantineBones 8142 0 99 1
819 Crusader_AncientMountainHammer 8143 0 99 1
820 Crusader_BonesplittingStrike 8144 0 99 1
821 Crusader_Bonecrusher 8145 0 99 1
822 Crusader_BoulderRoll 8146 0 99 1
823 Crusader_ChargingMinotaur 8147 0 99 1
824 Crusader_ColossusStrike 8148 0 99 1
825 Crusader_CrushingVise 8149 0 99 1
826 Crusader_CrushingWeightOfTheMountain 8150 0 99 1
827 Crusader_EarthstrikeQuake 8151 0 99 1
828 Crusader_ElderMountainHammer 8152 0 99 1
829 Crusader_GiantsStance 8153 0 99 1
830 Crusader_IronBones 8154 0 99 1
831 Crusader_IrresistibleMountainStrike 8155 0 99 1
832 Crusader_MountainAvalanche 8156 0 99 1
833 Crusader_MountainHammer 8157 0 99 1
834 Crusader_MountainTombstoneStrike 8158 0 99 1
835 Crusader_OverwhelmingMountainStrike 8159 0 99 1
836 Crusader_RootsOfTheMountain 8160 0 99 1
837 Crusader_StoneBones 8161 0 99 1
838 Crusader_StoneDragonsFury 8162 0 99 1
839 Crusader_StoneVise 8163 0 99 1
840 Crusader_StonefootStance 8164 0 99 1
841 Crusader_StrengthOfStone 8165 0 99 1
842 Crusader_BloodInTheWater 8166 0 99 1
843 Crusader_ClawAtTheMoon 8167 0 99 1
844 Crusader_DancingMongoose 8168 0 99 1
845 Crusader_DeathFromAbove 8169 0 99 1
846 Crusader_FeralDeathBlow 8170 0 99 1
847 Crusader_FleshRipper 8171 0 99 1
848 Crusader_FountainOfBlood 8172 0 99 1
849 Crusader_GirallonWindmillFleshRip 8173 0 99 1
850 Crusader_HamstringAttack 8174 0 99 1
851 Crusader_HuntersSense 8175 0 99 1
852 Crusader_LeapingDragonStance 8176 0 99 1
853 Crusader_PouncingCharge 8177 0 99 1
854 Crusader_PreyOnTheWeak 8178 0 99 1
855 Crusader_RabidBearStrike 8179 0 99 1
856 Crusader_RabidWolfStrike 8180 0 99 1
857 Crusader_RagingMongoose 8181 0 99 1
858 Crusader_SoaringRaptorStrike 8182 0 99 1
859 Crusader_SuddenLeap 8183 0 99 1
860 Crusader_SwoopingDragonStrike 8184 0 99 1
861 Crusader_WolfClimbsTheMountain 8185 0 99 1
862 Crusader_WolfFangStrike 8186 0 99 1
863 Crusader_WolfPackTactics 8187 0 99 1
864 Crusader_WolverineStance 8188 0 99 1
865 Crusader_BattleLeadersCharge 8189 0 99 1
866 Crusader_BolsteringVoice 8190 0 99 1
867 Crusader_ClarionCall 8191 0 99 1
868 Crusader_CoveringStrike 8192 0 99 1
869 Crusader_DouseTheFlames 8193 0 99 1
870 Crusader_FlankingManeuver 8194 0 99 1
871 Crusader_LeadingTheAttack 8195 0 99 1
872 Crusader_LeadingTheCharge 8196 0 99 1
873 Crusader_LionsRoar 8197 0 99 1
874 Crusader_OrderForgedFromChaos 8198 0 99 1
875 Crusader_PressTheAdvantage 8199 0 99 1
876 Crusader_SwarmTactics 8200 0 99 1
877 Crusader_SwarmingAssault 8201 0 99 1
878 Crusader_TacticalStrike 8202 0 99 1
879 Crusader_TacticsOfTheWolf 8203 0 99 1
880 Crusader_WarLeadersCharge 8204 0 99 1
881 Crusader_WarMastersCharge 8205 0 99 1
882 Crusader_WhiteRavenHammer 8206 0 99 1
883 Crusader_WhiteRavenStrike 8207 0 99 1
884 Crusader_WhiteRavenTactics 8208 0 99 1
885 **** **** **** **** ****
886 ####END_OF_TOB_SPELLBOOK_RESERVE **** **** **** ****

View File

@@ -1,905 +0,0 @@
2DA V2.0
FeatLabel FeatIndex List GrantedOnLevel OnMenu
0 **Class_feats** **** **** **** ****
1 ImpCombatCasting 696 3 1 0
2 ReadyManeuver 1899 3 1 1
3 RecoverManeuvers 3110 3 1 1
4 WeapProfSim 46 3 1 0
5 WeapProfSim_Dart 7914 3 1 0
6 WeapProfSim_Light_Mace 7908 3 1 0
7 WeapProfSim_Morningstar 7923 3 1 0
8 WeapProfSim_Shortspear 7927 3 1 0
9 WeapProfSim_Sickle 7929 3 1 0
10 WeapProfSim_Sling 7930 3 1 0
11 WP_Goad 7949 3 1 0
12 WP_Heavy_Mace 7946 3 1 0
13 WP_Katar 7945 3 1 0
14 WP_Sap 7944 3 1 0
15 ArmProfLgt 3 3 1 0
16 WeapProfMar 45 3 1 0
17 WeapProfMar_Battleaxe 7903 3 1 0
18 WeapProfMar_Greataxe 7913 3 1 0
19 WeapProfMar_Greatsword 7912 3 1 0
20 WeapProfMar_Halberd 7909 3 1 0
21 WeapProfMar_Handaxe 7919 3 1 0
22 WeapProfMar_Heavy_Flail 7917 3 1 0
23 WeapProfMar_Light_Flail 7905 3 1 0
24 WeapProfMar_Light_Hammer 7918 3 1 0
25 WeapProfMar_Longbow 7907 3 1 0
26 WeapProfMar_Longsword 7902 3 1 0
27 WeapProfMar_Rapier 7924 3 1 0
28 WeapProfMar_Scimitar 7925 3 1 0
29 WeapProfMar_Shortbow 7910 3 1 0
30 WeapProfMar_Shortsword 7901 3 1 0
31 WeapProfMar_Throwing_Axe 7931 3 1 0
32 WeapProfMar_Trident 7932 3 1 0
33 WeapProfMar_Warhammer 7906 3 1 0
34 WP_Light_Lance 7938 3 1 0
35 WP_Heavy_Pick 7939 3 1 0
36 WP_Light_Pick 7940 3 1 0
37 WP_Falchion 7943 3 1 0
38 WP_Maul 7947 3 1 0
39 WP_Kukri 7922 3 1 0
40 ACBonus 2869 3 2 0
41 SenseMagic 2870 3 7 1
42 DualBoost 2871 3 20 1
43 Evasion 206 3 9 0
44 ImprovedEvasion 212 3 17 0
45 SwordsageWeaponFocusDW 2195 2 1 0
46 SwordsageWeaponFocusDM 2196 2 1 0
47 SwordsageWeaponFocusSS 2197 2 1 0
48 SwordsageWeaponFocusSH 2198 2 1 0
49 SwordsageWeaponFocusSD 2199 2 1 0
50 SwordsageWeaponFocusTC 2200 2 1 0
51 SwordsageInsightfulStrikeDW 2201 2 4 0
52 SwordsageInsightfulStrikeDM 2202 2 4 0
53 SwordsageInsightfulStrikeSS 2203 2 4 0
54 SwordsageInsightfulStrikeSH 2204 2 4 0
55 SwordsageInsightfulStrikeSD 2205 2 4 0
56 SwordsageInsightfulStrikeTC 2206 2 4 0
57 SwordsageDefensiveStanceDW 2207 2 8 0
58 SwordsageDefensiveStanceDM 2208 2 8 0
59 SwordsageDefensiveStanceSS 2209 2 8 0
60 SwordsageDefensiveStanceSH 2210 2 8 0
61 SwordsageDefensiveStanceSD 2211 2 8 0
62 SwordsageDefensiveStanceTC 2212 2 8 0
63 **** **** **** **** ****
64 AdaptiveStyle 24075 0 -1 0
65 ExtraReadiedManeuver 4097 0 -1 0
66 VitalRecovery 3636 0 -1 0
67 StonePower 5294 0 -1 1
68 RisingPhoenix_FullAttack 5204 0 99 1
69 "Remember to move all ToB feats" **** **** **** ****
70 "outside the autoupdate range" **** **** **** ****
71 **** **** **** **** ****
72 ###cls_feat_allBaseClasses_BEGIN### **** **** **** ****
73 **Bio169Feats** **** **** **** ****
74 FEAT_HORSE_MENU 1089 3 1 1
75 PLAYER_TOOL_01 1106 1 99 1
76 PLAYER_TOOL_02 1107 1 99 1
77 PLAYER_TOOL_03 1108 1 99 1
78 PLAYER_TOOL_04 1109 1 99 1
79 PLAYER_TOOL_05 1110 1 99 1
80 PLAYER_TOOL_06 1111 1 99 1
81 PLAYER_TOOL_07 1112 1 99 1
82 PLAYER_TOOL_08 1113 1 99 1
83 PLAYER_TOOL_09 1114 1 99 1
84 PLAYER_TOOL_10 1115 1 99 1
85 **FeatsGrantedToAll** **** **** **** ****
86 FEAT_JUMP 2884 3 1 1
87 FEAT_CLIMB 3112 3 1 1
88 FEAT_POWER_ATTACK_SINGLE_RADIAL 3143 0 99 1
89 FEAT_POWER_ATTACK_FIVES_RADIAL 3144 0 99 1
90 FEAT_PRC_POWER_ATTACK_QUICKS_RADIAL 3179 0 99 1
91 ACP_QUICK_FEAT 3479 0 99 1
92 ACP_HEAVY_FEAT 3480 0 99 1
93 ACP_UNARMED_FEAT 3481 0 99 1
94 TeleportManagementRadial 4235 3 1 1
95 SWITCH_FEAT 2285 3 1 1
96 FEAT_READ_RECIPE 2919 3 1 1
97 FEAT_SPELLS_TOUCH_ATTACK 4092 3 1 1
98 FEAT_SPELLS_HOLD_CHARGE_TOGGLE 4095 3 1 1
99 EndSpellEffects 2468 3 1 1
100 CombatMove_RadialMaster 2898 3 1 1
101 CombatMove_RadialMaster2 5195 3 1 1
102 CombatMove_RadialMaster3 3415 3 1 1
103 **** **** **** **** ****
104 **GeneralActivatableFeats** **** **** **** ****
105 FEAT_ATTUNE_GEM 2472 0 -1 1
106 FEAT_INSCRIBE_RUNE 2462 0 -1 1
107 FEAT_CRAFT_SKULL_TALISMAN 3004 0 -1 1
108 FEAT_THRALL_TO_DEMON 2616 0 -1 1
109 FEAT_HOLYRADIANCE 3164 0 -1 1
110 FEAT_NIMBUSOFLIGHT 3165 0 -1 1
111 FEAT_MANYSHOT 3306 0 -1 1
112 FEAT_IMP_MANYSHOT 3350 0 -1 1
113 Pinpoint_Accuracy 3351 0 -1 1
114 FEAT_SERVHEAVEN 3355 0 -1 1
115 FEAT_DISCIPLE_OF_DARKNESS 4012 0 -1 1
116 FEAT_BLOOD_OF_THE_WARLORD 4608 0 -1 1
117 Cloak_Dance 4817 0 -1 1
118 Reckless_Offense 4816 0 -1 1
119 ZoneOfAnimation 2891 0 -1 1
120 FEAT_SPELLFIRE_WIELDER 4368 0 -1 1
121 FEAT_SPELLFIRE_INCREASE 4369 0 99 1
122 FEAT_SPELLFIRE_DECREASE 4370 0 99 1
123 FEAT_SPELLFIRE_QUICKSELECT 4371 0 99 1
124 FEAT_DISCIPLE_OF_THE_SUN 3127 0 -1 1
125 Dragonfire_Assault 1842 0 -1 1
126 Dragonfire_Channeling 1843 0 -1 1
127 Dragonfire_Inspiration 1844 0 -1 1
128 DauntingPresence 24025 0 -1 1
129 ProfaneLifeLeech 24026 0 -1 1
130 ProfaneAgony 5282 0 -1 1
131 SacredVitality 24027 0 -1 1
132 SacredVengeance 24028 0 -1 1
133 DeformityEyes 24029 0 -1 1
134 DeformityParasite 24031 0 -1 1
135 DarkSpeech 24033 0 -1 1
136 DarkWhispers 24034 0 -1 1
137 MastersWill 24035 0 -1 1
138 DeformityMadness 24036 0 -1 1
139 ReflexivePsychosis 24037 0 -1 1
140 ChosenOfEvil 24038 0 -1 1
141 Avenging_Strike 4297 0 -1 1
142 SnowflakeWardance 4489 0 -1 1
143 MasterWand 5312 0 -1 1
144 RecklessWandWielder 5313 0 -1 1
145 DoubleWandWielder 5315 0 -1 1
146 Wandstrike 5316 0 -1 1
147 Snap_Kick 4398 0 -1 1
148 HighSwordLowAxe 5288 0 -1 1
149 ScorpionsGrasp 5178 0 -1 1
150 WeaponAndTorch 5291 0 -1 1
151 ShieldCharge 3256 0 -1 1
152 ShieldSlam 3257 0 -1 1
153 AwesomeBlow 5370 0 -1 1
154 Spinning_Halberd 5287 0 -1 1
155 FEAT_RAY_CHARM_PERSON 2220 0 99 1
156 FEAT_RAY_CHARM_MONSTER 2221 0 99 1
157 FEAT_RAY_SLEEP 2222 0 99 1
158 FEAT_RAY_FLESH_TO_STONE 2223 0 99 1
159 FEAT_RAY_DISINTIGRATE 2224 0 99 1
160 FEAT_RAY_FEAR 2225 0 99 1
161 FEAT_RAY_SLOW 2226 0 99 1
162 FEAT_RAY_INFLICT_MODERATE_WOUNDS 2227 0 99 1
163 FEAT_WANDER_UNSEEN 5028 0 99 1
164 BonesOfTheEarth_Feat 2864 0 99 1
165 FEAT_MYSTIC_BACKLASH 24737 0 -1 1
166 FEAT_ACIDIC_SPLATTER 24738 0 -1 1
167 FEAT_FIERY_BURST 24739 0 -1 1
168 FEAT_STORM_BOLT 24740 0 -1 1
169 FEAT_WINTERS_BLAST 24741 0 -1 1
170 FEAT_CLAP_OF_THUNDER 24742 0 -1 1
171 FEAT_SICKENING_GRASP 24743 0 -1 1
172 FEAT_TOUCH_OF_HEALING 24744 0 -1 1
173 FEAT_DIMENSIONAL_JAUNT 24745 0 -1 1
174 FEAT_CLUTCH_OF_EARTH 24746 0 -1 1
175 FEAT_BORNE_ALOFT 24747 0 -1 1
176 FEAT_PROTECTIVE_WARD 24748 0 -1 1
177 FEAT_SHADOW_VEIL 24749 0 -1 1
178 FEAT_SUNLIGHT_EYES 24750 0 -1 1
179 FEAT_TOUCH_OF_DISTRACTION 24751 0 -1 1
180 FEAT_UMBRAL_SHROUD 24752 0 -1 1
181 FEAT_CHARNEL_MIASMA 24753 0 -1 1
182 FEAT_DROWNING_GLANCE 24754 0 -1 1
183 FEAT_INVISIBLE_NEEDLE 24755 0 -1 1
184 FEAT_SUMMON_ELEMENTAL 24756 0 -1 1
185 FEAT_DIMENSIONAL_REACH 24757 0 -1 1
186 FEAT_HURRICANE_BREATH 24758 0 -1 1
187 FEAT_MINOR_SHAPESHIFT 24759 0 -1 1
188 FEAT_FACECHANGER 24760 0 -1 1
189 **** **** **** **** ****
190 **Metabreath_and_Channeling** **** **** **** ****
191 FEAT_CLINGING_BREATH 4966 0 -1 1
192 FEAT_LINGERING_BREATH 4967 0 -1 1
193 FEAT_ENLARGE_BREATH 4968 0 -1 1
194 FEAT_HEIGHTEN_BREATH 4969 0 -1 1
195 FEAT_MAXIMIZE_BREATH 4970 0 -1 1
196 FEAT_SHAPE_BREATH 4972 0 -1 1
197 FEAT_SPREAD_BREATH 4973 0 -1 1
198 FEAT_TEMPEST_BREATH 4974 0 -1 1
199 FEAT_ENTANGLING_EXHALATION 4975 0 -1 1
200 FEAT_EXHALED_BARRIER 4976 0 -1 1
201 FEAT_EXHALED_IMMUNITY 4977 0 -1 1
202 **** **** **** **** ****
203 **DraconicAuras** **** **** **** ****
204 FEAT_BONUS_AURA_ENERGYACID 1828 0 -1 1
205 FEAT_BONUS_AURA_ENERGYCOLD 1829 0 -1 1
206 FEAT_BONUS_AURA_ENERGYELEC 1830 0 -1 1
207 FEAT_BONUS_AURA_ENERGYFIRE 1831 0 -1 1
208 FEAT_BONUS_AURA_TOUGHNESS 1894 0 -1 1
209 FEAT_BONUS_AURA_SENSES 1891 0 -1 1
210 FEAT_BONUS_AURA_PRESENCE 1885 0 -1 1
211 FEAT_BONUS_AURA_INSIGHT 1884 0 -1 1
212 FEAT_BONUS_AURA_RESOLVE 1890 0 -1 1
213 FEAT_BONUS_AURA_STAMINA 1892 0 -1 1
214 FEAT_BONUS_AURA_SWIFTNESS 1893 0 -1 1
215 FEAT_BONUS_AURA_RESISTACID 1886 0 -1 1
216 FEAT_BONUS_AURA_RESISTCOLD 1887 0 -1 1
217 FEAT_BONUS_AURA_RESISTELEC 1888 0 -1 1
218 FEAT_BONUS_AURA_RESISTFIRE 1889 0 -1 1
219 FEAT_BONUS_AURA_MAGICPOWER 1840 0 -1 1
220 FEAT_SECOND_AURA_POWER 1853 0 99 1
221 FEAT_SECOND_AURA_ENERGYSHLD 1854 0 99 1
222 FEAT_SECOND_AURA_TOUGHNESS 1855 0 99 1
223 FEAT_SECOND_AURA_SENSES 1856 0 99 1
224 FEAT_SECOND_AURA_VIGOR 1857 0 99 1
225 FEAT_SECOND_AURA_RESISTANCE 1858 0 99 1
226 FEAT_SECOND_AURA_PRESENCE 1859 0 99 1
227 FEAT_SECOND_AURA_INSIGHT 1860 0 99 1
228 FEAT_SECOND_AURA_RESOLVE 1861 0 99 1
229 FEAT_SECOND_AURA_STAMINA 1862 0 99 1
230 FEAT_SECOND_AURA_SWIFTNESS 1863 0 99 1
231 FEAT_SECOND_AURA_RESISTACID 1864 0 99 1
232 FEAT_SECOND_AURA_RESISTCOLD 1865 0 99 1
233 FEAT_SECOND_AURA_RESISTELEC 1866 0 99 1
234 FEAT_SECOND_AURA_RESISTFIRE 1867 0 99 1
235 FEAT_SECOND_AURA_MAGICPOWER 1841 0 99 1
236 FEAT_SECOND_AURA_ENERGYACID 1824 0 99 1
237 FEAT_SECOND_AURA_ENERGYCOLD 1825 0 99 1
238 FEAT_SECOND_AURA_ENERGYELEC 1826 0 99 1
239 FEAT_SECOND_AURA_ENERGYFIRE 1827 0 99 1
240 FEAT_SECOND_AURA_ENERGY 1836 0 99 1
241 **** **** **** **** ****
242 **PsionicFeats** **** **** **** ****
243 Psionic_Focus 4818 0 99 1
244 Invest_Armour 3643 0 -1 1
245 Mental_Leap 4809 0 -1 1
246 Psionic_Fist 4800 0 -1 1
247 Greater_Psionic_Fist 4821 0 -1 1
248 Psionic_Weapon 4822 0 -1 1
249 Greater_Psionic_Weapon 4823 0 -1 1
250 Psionic_Shot 4824 0 -1 1
251 Greater_Psionic_Shot 4825 0 -1 1
252 Psionic_Meditation 4827 0 -1 1
253 Unavoidable_Strike 4830 0 -1 1
254 Wounding_Attack 4832 0 -1 1
255 Deep_Impact 4852 0 -1 1
256 Fell_Shot 4853 0 -1 1
257 Strength_of_Two 4965 0 -1 1
258 **** **** **** **** ****
259 **IncarnumFeats** **** **** **** ****
260 InvestEssentiaConversation 8800 0 99 1
261 HealingSoul 8882 0 99 1
262 MidnightAugmentation 8884 0 99 1
263 PsycarnumBlade 8887 0 99 1
264 DivineSoultouch 8891 0 99 1
265 PsycarnumInfusion 8896 0 99 1
266 **** **** **** **** ****
267 **BindingFeats** **** **** **** ****
268 BindVestige 9131 0 -1 1
269 ExpelVestige 9136 0 -1 1
270 MalphasArcaneEye 9040 0 99 1
271 SavnokCallArmor 9043 0 99 1
272 AndromaliusSee_Invisibility 9048 0 99 1
273 FocalorAuraSadness 9049 0 99 1
274 KarsusSenses 9052 0 99 1
275 **** **** **** **** ****
276 **RacialFeats** **** **** **** ****
277 FEAT_ASHERATI_BODY_DAZZLE 5213 0 99 1
278 FEAT_ASHERATI_BODY_LAMP 5214 0 99 1
279 FEAT_URDINNIR_STONESKIN 4644 0 99 1
280 FEAT_AVARIEL_DIVE 4645 0 99 1
281 FEAT_AYUAN_FEAR 4646 0 99 1
282 FEAT_AYUAN_ENTANGLE 4647 0 99 1
283 FEAT_AYUAN_DARKNESS 4648 0 99 1
284 FEAT_AYUAN_NEUTRALIZE_POISON 4649 0 99 1
285 FEAT_AASIMAR_LIGHT 4650 0 99 1
286 FEAT_TIEFLING_DARK 4651 0 99 1
287 FEAT_SVIRF_BLIND_DEAF 4652 0 99 1
288 FEAT_SVIRF_BLUR 4653 0 99 1
289 FEAT_SVIRF_DISGUISE 4654 0 99 1
290 FEAT_SVIRF_REVERT 4655 0 99 1
291 FEAT_RAK_DISGUISE 4656 0 99 1
292 FEAT_RAK_CHANGE_SHAPE 4657 0 99 1
293 FEAT_PYUAN_CHARM 4658 0 99 1
294 FEAT_PYUAN_DARKNESS 4659 0 99 1
295 FEAT_PYUAN_ENTANGLE 4660 0 99 1
296 FEAT_PYUAN_FEAR 4661 0 99 1
297 FEAT_PIXIE_INVIS 4662 0 99 1
298 FEAT_PIXIE_CONFUSE 4663 0 99 1
299 FEAT_PIXIE_ENTANGLE 4664 0 99 1
300 FEAT_PIXIE_DISPEL_MAGIC 4665 0 99 1
301 FEAT_PIXIE_POLYMORPH 4666 0 99 1
302 FEAT_PIXIE_REVERT 4667 0 99 1
303 FEAT_MINOTAUR_CHARGE 4668 0 99 1
304 FEAT_ILLITHID_CHARM 4669 0 99 1
305 FEAT_ILLITHID_BLAST 4670 0 99 1
306 FEAT_ILLITHID_SUCKBRAIN 4671 0 99 1
307 FEAT_GITHZERAI_DAZE 4672 0 99 1
308 FEAT_GITHYANKI_DAZE 4673 0 99 1
309 FEAT_GITHYANKI_BLUR 4674 0 99 1
310 FEAT_FEYRI_CHARMPERSON 4675 0 99 1
311 FEAT_FEYRI_CLAIRAUDIENCE 4676 0 99 1
312 FEAT_FEYRI_DARKNESS 4677 0 99 1
313 FEAT_FEYRI_ENERVATION 4678 0 99 1
314 FEAT_FEYRI_ALTER 4679 0 99 1
315 FEAT_FEYRI_REVERT 4680 0 99 1
316 FEAT_DUERGAR_INVIS 4681 0 99 1
317 FEAT_DROW_DARKNESS 4682 0 99 1
318 FEAT_DROW_FAERIE_FIRE 4683 0 99 1
319 BROWNIE_RAKSHASA_HIPS 433 0 99 1
320 FEAT_WGNOME_SILENCE 4555 0 99 1
321 FEAT_WGNOME_MAGEHAND 4519 0 99 1
322 FEAT_HOUND_AID 4574 0 99 1
323 FEAT_HOUND_AURAMENACE 4548 0 99 1
324 FEAT_HOUND_CONTFLAME 4514 0 99 1
325 FEAT_HOUND_DETECTEVIL 4618 0 99 1
326 FEAT_HOUND_DISGUISE 4513 0 99 1
327 FEAT_HOUND_MAGICCIRCLE 4515 0 99 1
328 FEAT_HOUND_TELEPORT 4516 0 99 1
329 FEAT_RACE_ENERGYRAY 4856 0 99 1
330 FEAT_RACE_ENERGYRAYSONIC 4520 0 99 1
331 FEAT_ELAN_RESISTANCE 4521 0 99 1
332 FEAT_ELAN_RESILIANCE 4522 0 99 1
333 FEAT_PSIRACE_STOMP 4524 0 99 1
334 FEAT_MAENAD_OUTBURST 4525 0 99 1
335 FEAT_XEPH_BURST 4526 0 99 1
336 FEAT_ZENYTH_TRUESTRIKE 4536 0 99 1
337 FEAT_TULADH_MAGIC_CIRCL 4533 0 99 1
338 FEAT_NATHRI_EXP_RETREAT 4534 0 99 1
339 FEAT_BLADELING_RAZOR_STORM 4539 0 99 1
340 FEAT_KAPAK_SALIVA 4546 0 99 1
341 FEAT_IRDA_FLARE 4551 0 99 1
342 FEAT_ZAKYA_CHILLTOUCH 4570 0 99 1
343 FEAT_ZAKYA_TRUESTRIKE 4557 0 99 1
344 FEAT_ZAKYA_VAMPTOUCH 4558 0 99 1
345 FEAT_MINOR_CHANGE_SHAPE 4560 0 99 1
346 FEAT_CHANGELING_CHANGE_SHAPE 4561 0 99 1
347 FEAT_IRDA_CHANGE_SHAPE 4562 0 99 1
348 FEAT_QUICK_CHANGE_SHAPE 4563 0 99 1
349 FEAT_SHIFTER_SHIFTING 4566 0 99 1
350 FEAT_RAK_SHADOW_JUMP 3307 0 99 1
351 FEAT_NIXIE_CHARM_PERSON 4597 0 99 1
352 FEAT_NIXIE_WATERBREATHING 4641 0 99 1
353 FEAT_NYMPH_DIMENSION_DOOR 4755 0 99 1
354 FEAT_NYMPH_STUNNING_GLANCE 4684 0 99 1
355 FEAT_NYMPH_BLINDING_BEAUTY 4685 0 99 1
356 FEAT_GRIG_PYROTECHNICS 4686 0 99 1
357 FEAT_GRIG_INVIS 4687 0 99 1
358 FEAT_GRIG_ENTANGLE 4635 0 99 1
359 FEAT_BRALANI_LIGHTNING_BOLT 4995 0 99 1
360 FEAT_BRALANI_CURE_SERIOUS 4996 0 99 1
361 FEAT_BRALANI_BLUR 4997 0 99 1
362 FEAT_BRALANI_CHARM_PERSON 4998 0 99 1
363 FEAT_BRALANI_MIRROR_IMAGE 4999 0 99 1
364 FEAT_BRALANI_GUST_OF_WIND 4978 0 99 1
365 FEAT_TOUCH_OF_LUCK 4634 0 99 1
366 FEAT_FORESTLORD_TREEWALK 4633 0 99 1
367 FEAT_TROGLODYTE_STENCH 23549 0 99 1
368 Skarn_spines 5180 0 99 1
369 Killoren_Aspect_H 5209 0 99 1
370 Killoren_Aspect_D 5210 0 99 1
371 Killoren_Aspect_A 5211 0 99 1
372 FrostFolk_IceBlast 5372 0 99 1
373 Uldra_RayFrost 5373 0 99 1
374 Uldra_Fatigue 5374 0 99 1
375 Marrulurk_DA 2930 0 99 1
376 Marrulurk_NauseatingBreath 5375 0 99 1
377 ExtaminaarCharmAnimal 5379 0 99 1
378 Marrusault_Howl 3308 0 99 1
379 FEAT_HYBSIL_MIRROR_IMAGE 5382 0 99 1
380 FEAT_HYBSIL_DANCLIGHTS 5383 0 99 1
381 FEAT_HYBSIL_JUMP 5384 0 99 1
382 FEAT_WILDREN_FURY 5386 0 99 1
383 Turlemoi_RockThrowing 5419 0 99 1
384 Arkamoi_ArcaneMastermind 5424 0 99 1
385 Muckdweller_Squirt 5425 0 99 1
386 Aranea_AlternateForm 5426 0 99 1
387 Aranea_Web 5427 0 99 1
388 Mephling_breath 5429 0 99 1
389 FEAT_FOG_CLOUD_BREATH 5434 0 99 1
390 **** **** **** **** ****
391 **BonusDomains** **** **** **** ****
392 FEAT_CHECK_DOMAIN_SLOTS 2000 0 99 1
393 FEAT_CAST_DOMAIN_LEVEL_ONE 2049 0 99 1
394 FEAT_CAST_DOMAIN_LEVEL_TWO 2050 0 99 1
395 FEAT_CAST_DOMAIN_LEVEL_THREE 2051 0 99 1
396 FEAT_CAST_DOMAIN_LEVEL_FOUR 2052 0 99 1
397 FEAT_CAST_DOMAIN_LEVEL_FIVE 2053 0 99 1
398 FEAT_CAST_DOMAIN_LEVEL_SIX 2054 0 99 1
399 FEAT_CAST_DOMAIN_LEVEL_SEVEN 2055 0 99 1
400 FEAT_CAST_DOMAIN_LEVEL_EIGHT 2056 0 99 1
401 FEAT_CAST_DOMAIN_LEVEL_NINE 2057 0 99 1
402 Strength_Domain_Power 307 0 99 1
403 Protection_Domain_Power 308 0 99 1
404 Death_Domain_Power 310 0 99 1
405 Air_Domain_Power 311 0 99 1
406 Destruction_Domain_Power 313 0 99 1
407 Earth_Domain_Power 314 0 99 1
408 Fire_Domain_Power 316 0 99 1
409 Plant_Domain_Power 321 0 99 1
410 Sun_Domain_Power 322 0 99 1
411 Travel_Domain_Power 323 0 99 1
412 Trickery_Domain_Power 324 0 99 1
413 Water_Domain_Power 325 0 99 1
414 FEAT_ORC_DOMAIN 4041 0 99 1
415 FEAT_SLIME_DOMAIN 4043 0 99 1
416 FEAT_CHARM_DOMAIN 4045 0 99 1
417 FEAT_FAMILY_DOMAIN 4051 0 99 1
418 FEAT_HALFLING_DOMAIN 4052 0 99 1
419 FEAT_ILLUSION_DOMAIN 4053 0 99 0
420 FEAT_HATRED_DOMAIN 4054 0 99 1
421 FEAT_NOBILITY_DOMAIN 4055 0 99 1
422 FEAT_SCALEYKIND_DOMAIN 4057 0 99 1
423 FEAT_RENEWAL_DOMAIN 4060 0 99 1
424 FEAT_SPIDER_DOMAIN 4061 0 99 1
425 FEAT_BLIGHTBRINGER 2250 0 99 1
426 **** **** **** **** ****
427 **Templates** **** **** **** ****
428 Celestial_Smite_Evil 22601 0 99 1
429 Fiendish_Smite_Good 22603 0 99 1
430 Half_Celestial_Smite_Evil 22605 0 99 1
431 Half_Celestial_Protection_from_Evil 22606 0 99 1
432 Half_Celestial_Bless 22607 0 99 1
433 Half_Celestial_Aid 22608 0 99 1
434 Half_Celestial_Detect_Evil 22609 0 99 1
435 Half_Celestial_Cure_Serious_Wounds 22610 0 99 1
436 Half_Celestial_Neutralize_Poison 22611 0 99 1
437 Half_Celestial_HolySmite **** 0 99 1
438 Half_Celestial_Remove_Disease 22613 0 99 1
439 Half_Celestial_DispelEvil **** 0 99 1
440 Half_Celestial_Holy_Word 22615 0 99 1
441 Half_Celestial_HolyAura 22616 0 99 1
442 Half_Celestial_Hallow **** 0 99 1
443 Half_Celestial_Mass_Charm 22618 0 99 1
444 Half_Celestial_Summon_Creature_IX 22619 0 99 1
445 Half_Celestial_Resurrection 22620 0 99 1
446 Half_Celestial_Daylight 22621 0 99 1
447 Half_Fiendish_Smite_Good 22624 0 99 1
448 Half_Fiendish_Darkness 22625 0 99 1
449 Half_Fiendish_Desecrate **** 0 99 1
450 Half_Fiendish_Unholy_Blight **** 0 99 1
451 Half_Fiendish_Poison 22628 0 99 1
452 Half_Fiendish_Contagion 22629 0 99 1
453 Half_Fiendish_Blasphemy 22630 0 99 1
454 Half_Fiendish_Unholy_Aura **** 0 99 1
455 Half_Fiendish_Unhallow **** 0 99 1
456 Half_Fiendish_Horrid_Wilting 22633 0 99 1
457 Half_Fiendish_Summon_Creature_IX 22634 0 99 1
458 Half_Fiendish_Destruction 22635 0 99 1
459 Lich_Fear_Aura 22637 0 99 1
460 Lich_Paralyzing_Touch 22638 0 99 1
461 Lich_Appearance 22639 0 99 1
462 Demilich_Alter_Self 22641 0 99 1
463 Demilich_Astral_Projection **** 0 99 1
464 Demilich_Create_Greater_Undead 22643 0 99 1
465 Demilich_Create_Undead 22644 0 99 1
466 Demilich_Death_Knell **** 0 99 1
467 Demilich_Enervation 22646 0 99 1
468 Demilich_Greater_Dispel_Magic 22647 0 99 1
469 Demilich_Harm 22648 0 99 1
470 Demilich_Summon_Creature_I 22649 0 99 1
471 Demilich_Summon_Creature_II 22650 0 99 1
472 Demilich_Summon_Creature_III 22651 0 99 1
473 Demilich_Summon_Creature_IV 22652 0 99 1
474 Demilich_Summon_Creature_V 22653 0 99 1
475 Demilich_Summon_Creature_VI 22654 0 99 1
476 Demilich_Summon_Creature_VII 22655 0 99 1
477 Demilich_Summon_Creature_VIII 22656 0 99 1
478 Demilich_Summon_Creature_IX 22657 0 99 1
479 Demilich_Telekinesis **** 0 99 1
480 Demilich_Weird 22659 0 99 1
481 Demilich_Greater_Planar_Ally 22660 0 99 1
482 HalfDragon_Breath_Weapon 22662 0 99 1
483 Earth_Strike 5328 0 99 1
484 BloodedOne_War_Cry 5377 0 99 1
485 RethDekala_VilefireBlast 5409 0 99 1
486 RethDekala_MartialSpirit 5410 0 99 1
487 RethDekala_ThicketOfBlades 5411 0 99 1
488 RethDekala_DauntingStrike 5412 0 99 1
489 RethDekala_DeathFromAbove 5413 0 99 1
490 RethDekala_DisarmingStrike 5414 0 99 1
491 RethDekala_EntanglingBlade 5415 0 99 1
492 RethDekala_WallOfBlades 5416 0 99 1
493 RethDekala_RecoverManeuvers 5417 0 99 1
494 ArchlichTurnUndead 22701 0 99 1
495 FEAT_ANIMATE_DEAD 3574 0 99 1
496 FEAT_PROJECTION 3579 0 99 1
497 FEAT_END_PROJECTION 3575 0 99 1
498 **** **** **** **** ****
499 Saint_Bless 22702 0 99 1
500 Saint_Guidance_Placeholder **** **** **** ****
501 Saint_Resistance 22704 0 99 1
502 Saint_Virtue 22705 0 99 1
503 Saint_Protective_Aura 22706 0 99 1
504 **** **** **** **** ****
505 **WeaponsOfLegacy** **** **** **** ****
506 BBB_Darkvision 22710 0 99 1
507 BBB_Longstrider 22711 0 99 1
508 BBB_Lesser_Restoration 22712 0 99 1
509 BBB_Teleport_SelfOnly 22713 0 99 1
510 BBB_Protection_from_Evil 22714 0 99 1
511 BBB_Drowseeker 22715 0 99 1
512 BBB_ShockingShot 22716 0 99 1
513 BBB_PierceTheBlackHeart 22717 0 99 1
514 Steadfast_vigor 22718 0 99 1
515 Steadfast_slow 22719 0 99 1
516 Flay_SnakeSting 22720 0 99 1
517 Flay_WhipWrap 22721 0 99 1
518 CrimsonRuination_FrozenFate 22722 0 99 1
519 Devious_DetectThoughts 22723 0 99 1
520 SimpleBow_TrueSeeing 22724 0 99 1
521 SimpleBow_Prescience 22725 0 99 1
522 SimpleBow_Focus 22726 0 99 1
523 Aradros_Extend 22727 0 99 1
524 Aradros_Survive 22728 0 99 1
525 Guurgal_Force 22729 0 99 1
526 Guurgal_Rage 22730 0 99 1
527 DivSpark_Fear 22731 0 99 1
528 DivSpark_Light 22732 0 99 1
529 Wargirds_Haste 22733 0 99 1
530 Wargirds_Stoneskin 22734 0 99 1
531 DesertWind_FierySlash 22735 0 99 1
532 DesertWind_HowlingWind 22736 0 99 1
533 DesertWind_FanFlames 22737 0 99 1
534 DesertWind_DustDesert 22738 0 99 1
535 Mindsplinter_VirtueDenied 22739 0 99 1
536 Mindsplinter_KissOfDeath 22740 0 99 1
537 Mindsplinter_BattleShriek 22741 0 99 1
538 Mindsplinter_RuinousHowl 22742 0 99 1
539 NotchedSpear_ParliamentOfFishes 22743 0 99 1
540 NotchedSpear_ConcealmentKraken 22744 0 99 1
541 NotchedSpear_ScionSea 22745 0 99 1
542 NotchedSpear_CommandSeaChildren 22746 0 99 1
543 Ur_SwiftStride 22747 0 99 1
544 Ur_HealingTotem 22748 0 99 1
545 Ur_SavageTransformation 22749 0 99 1
546 FlamecastersBolt_MarkTarget 22750 0 99 1
547 FlamecastersBolt_Morale 22751 0 99 1
548 FlamecastersBolt_Fireball 22752 0 99 1
549 StalkersBow_StalkersInsight 22753 0 99 1
550 StalkersBow_Ethereal 22754 0 99 1
551 Exordius_Guidance 22755 0 99 1
552 Exordius_Cure 22756 0 99 1
553 Exordius_Dismissal 22757 0 99 1
554 Caladbolg_Imprison 22758 0 99 1
555 HammerWitches_Detect 22759 0 99 1
556 HammerWitches_Spellbreaker 22760 0 99 1
557 HammerWitches_AMF 22761 0 99 1
558 HammerWitches_Dispel 22762 0 99 1
559 HammerWitches_Mantle 22763 0 99 1
560 SlingOfTheDireWind_StunningStone 22764 0 99 1
561 SlingOfTheDireWind_GustOfWind 22765 0 99 1
562 SlingOfTheDireWind_WindWall 22766 0 99 1
563 Treebrother_Shillelagh 22767 0 99 1
564 Treebrother_Charm_Plant 22768 0 99 1
565 Treebrother_Entangle 22769 0 99 1
566 Treebrother_Owls_Insight 22770 0 99 1
567 Treebrother_Changestaff 22771 0 99 1
568 FullMoonsTrick_Rage 22772 0 99 1
569 FullMoonsTrick_Invis 22773 0 99 1
570 FiendkillersFlail_Darkvis 22774 0 99 1
571 FiendkillersFlail_Detect 22775 0 99 1
572 ScalesBalance_Detect 22776 0 99 1
573 ScalesBalance_Cure 22777 0 99 1
574 ScalesBalance_Knell 22778 0 99 1
575 ScalesBalance_Enerv 22779 0 99 1
576 ScalesBalance_Heal 22780 0 99 1
577 ScalesBalance_Finger 22781 0 99 1
578 ShishiO_Charm 22782 0 99 1
579 ShishiO_Summon 22783 0 99 1
580 ShishiO_Poly 22784 0 99 1
581 ShishiO_Shout 22785 0 99 1
582 Dymondheart_ShedBolts 22786 0 99 1
583 Dymondheart_Deflect 22787 0 99 1
584 Dymondheart_Daylight 22788 0 99 1
585 Dymondheart_Cure 22789 0 99 1
586 Dymondheart_Banish 22790 0 99 1
587 Sunsword_Daylight 22791 0 99 1
588 Sunsword_Death_Ward 22792 0 99 1
589 Sunsword_Banish 22793 0 99 1
590 Sunsword_Undeath 22794 0 99 1
591 Blackrazor_Detect 22795 0 99 1
592 Blackrazor_Knell 22796 0 99 1
593 Blackrazor_Haste 22797 0 99 1
594 Ramethene_Detect 22798 0 99 1
595 Ramethene_Smite 22799 0 99 1
596 Ramethene_Resist_Elements 22800 0 99 1
597 Ramethene_Cloudkill 22801 0 99 1
598 Ramethene_SuddenMaximize 22802 0 99 1
599 Ramethene_Horrid_Wilting 22803 0 99 1
600 Wyrmbane_Cause_Fear 22804 0 99 1
601 Wyrmbane_Lightning_Bolt 22805 0 99 1
602 Wyrmbane_Sudden_Emp 22806 0 99 1
603 Wyrmbane_Breath_Lightning 22807 0 99 1
604 Whelm_Detect_Giant 22808 0 99 1
605 Whelm_Locate_Object 22809 0 99 1
606 Whelm_Detect_Goblin 22810 0 99 1
607 Ravenkind_Dancing_Lights 22811 0 99 1
608 Ravenkind_Light 22812 0 99 1
609 Ravenkind_Flare 22813 0 99 1
610 Ravenkind_Detect_Undead 22814 0 99 1
611 Ravenkind_Halt_Undead 22815 0 99 1
612 Ravenkind_Cure_Light_Wounds 22816 0 99 1
613 Ravenkind_Daylight 22817 0 99 1
614 Ravenkind_Death_Ward 22818 0 99 1
615 Ravenkind_Break_Enchantment 22819 0 99 1
616 Ravenkind_Mass_Heal 22820 0 99 1
617 LastCitadel_LeadingTheAttack 22821 0 99 1
618 LastCitadel_Prayer 22822 0 99 1
619 LastCitadel_Remove_Fear 22823 0 99 1
620 LastCitadel_Cure_Critical_Wounds 22824 0 99 1
621 LastCitadel_Blade_Barrier 22825 0 99 1
622 LastCitadel_Heal 22826 0 99 1
623 Unfettered_ChargingMinotaur 22827 0 99 1
624 Unfettered_ENLARGE_PERSON 22828 0 99 1
625 Unfettered_Etherealness 22829 0 99 1
626 Unfettered_Stoneskin 22830 0 99 1
627 Unfettered_Mordenkainens_Sword 22831 0 99 1
628 Hillcrusher_Earthen_Might 22832 0 99 1
629 Hillcrusher_Soften_Earth 22833 0 99 1
630 Hillcrusher_Fangs_of_Stone 22834 0 99 1
631 Hillcrusher_Raise_the_Earth 22835 0 99 1
632 Hillcrusher_Shake_the_Earth 22836 0 99 1
633 DesertWindToB_BurningBlade 22837 0 99 1
634 DesertWindToB_FanTheFlames 22838 0 99 1
635 DesertWindToB_WyrmsFlame 22839 0 99 1
636 Faithful_Detect_Evil 22840 0 99 1
637 Faithful_Lesser_Restoration 22841 0 99 1
638 Faithful_Restoration 22842 0 99 1
639 Faithful_Resiliency 22843 0 99 1
640 Faithful_ImmortalFortitude 22844 0 99 1
641 SupernalClarity_SapphireNightmareBlade 22845 0 99 1
642 SupernalClarity_PsychicPoise 22846 0 99 1
643 SupernalClarity_Haste 22847 0 99 1
644 SupernalClarity_Freeeeeedom 22848 0 99 1
645 SupernalClarity_Time_Stop 22849 0 99 1
646 Kamate_SteelWind 22850 0 99 1
647 Kamate_ShockingGrasp 22851 0 99 1
648 Kamate_Lightning_Bolt 22852 0 99 1
649 Kamate_Chain_Lightning 22853 0 99 1
650 Kamate_True_Strike 22854 0 99 1
651 Eventide_CometThrow 22855 0 99 1
652 Eventide_BafflingDefense 22856 0 99 1
653 Eventide_Improved_Invisibility 22857 0 99 1
654 Umbral_Invisibility 22858 0 99 1
655 Umbral_Shadowstep 22859 0 99 1
656 TigerFang_FrenziedCharge 22860 0 99 1
657 TigerFang_BattleFever 22861 0 99 1
658 TigerFang_Haste 22862 0 99 1
659 Bullybasher_KnockSilly 22863 0 99 1
660 Bullybasher_StoneGathering 22864 0 99 1
661 Bullybasher_LightningPunch 22865 0 99 1
662 Lorestealer_Read_Magic 22866 0 99 1
663 Lorestealer_DetectMagic 22867 0 99 1
664 Lorestealer_Axecasting 22868 0 99 1
665 Durindana_Daylight 22869 0 99 1
666 Durindana_Death_Ward 22870 0 99 1
667 Durindana_Hallow 22871 0 99 1
668 Durindana_Dazzle 22872 0 99 1
669 Thaas_Detect_Demon 22873 0 99 1
670 Thaas_ObstructSummoning 22874 0 99 1
671 Thaas_Banishment 22875 0 99 1
672 Thaas_Teleport 22876 0 99 1
673 Quickspur_Entropic_Shield 22877 0 99 1
674 Quickspur_Resist_Elements 22878 0 99 1
675 Quickspur_PhantomSteed 22879 0 99 1
676 Quickspur_Blur 22880 0 99 1
677 Quickspur_Stoneskin 22881 0 99 1
678 BES_FIRE_OF_THE_HEART 22882 0 99 1
679 BES_ENTHRALLING_LIGHT 22883 0 99 1
680 BES_COLOR_SPRAY 22884 0 99 1
681 BES_BLINDING_FLASH 22885 0 99 1
682 BES_SHOOTING_STARS 22886 0 99 1
683 BES_GLITTERING_MOTES 22887 0 99 1
684 BES_TWINKLE 22888 0 99 1
685 BES_SILVER_STARLIGHT 22889 0 99 1
686 BES_STARLIGHT_DISPELLING 22890 0 99 1
687 BES_TALES_IN_THE_SKY 22891 0 99 1
688 BES_CALL_DOWN_A_STAR 22892 0 99 1
689 ###cls_feat_allBaseClasses_END### **** **** **** ****
690 **** **** **** **** ****
691 ####START_OF_TOB_SPELLBOOK_RESERVE **** **** **** ****
692 Swordsage_BlisteringFlourish 8209 0 99 1
693 Swordsage_BurningBlade 8210 0 99 1
694 Swordsage_BurningBrand 8211 0 99 1
695 Swordsage_DeathMark 8212 0 99 1
696 Swordsage_DesertTempest 8213 0 99 1
697 Swordsage_DistractingEmber 8214 0 99 1
698 Swordsage_DragonsFlame 8215 0 99 1
699 Swordsage_FanTheFlames 8216 0 99 1
700 Swordsage_FieryAssault 8217 0 99 1
701 Swordsage_FireRiposte 8218 0 99 1
702 Swordsage_Firesnake 8219 0 99 1
703 Swordsage_FlamesBlessing 8220 0 99 1
704 Swordsage_FlashingSun 8221 0 99 1
705 Swordsage_HatchlingsFlame 8222 0 99 1
706 Swordsage_HolocaustCloak 8223 0 99 1
707 Swordsage_InfernoBlade 8224 0 99 1
708 Swordsage_InfernoBlast 8225 0 99 1
709 Swordsage_LeapingFlame 8226 0 99 1
710 Swordsage_LingeringInferno 8227 0 99 1
711 Swordsage_RingOfFire 8228 0 99 1
712 Swordsage_RisingPhoenix 8229 0 99 1
713 Swordsage_SalamanderCharge 8230 0 99 1
714 Swordsage_SearingBlade 8231 0 99 1
715 Swordsage_SearingCharge 8232 0 99 1
716 Swordsage_WindStride 8233 0 99 1
717 Swordsage_WyrmsFlame 8234 0 99 1
718 Swordsage_ZephyrDance 8235 0 99 1
719 Swordsage_AuraOfChaos 8236 0 99 1
720 Swordsage_AuraOfPerfectOrder 8237 0 99 1
721 Swordsage_AuraOfTriumph 8238 0 99 1
722 Swordsage_AuraOfTyranny 8239 0 99 1
723 Swordsage_CastigatingStrike 8240 0 99 1
724 Swordsage_CrusadersStrike 8241 0 99 1
725 Swordsage_DauntingStrike 8242 0 99 1
726 Swordsage_DefensiveRebuke 8243 0 99 1
727 Swordsage_DivineSurge 8244 0 99 1
728 Swordsage_DivineSurgeGreater 8245 0 99 1
729 Swordsage_DoomCharge 8246 0 99 1
730 Swordsage_EntanglingBlade 8247 0 99 1
731 Swordsage_Foehammer 8248 0 99 1
732 Swordsage_ImmortalFortitude 8249 0 99 1
733 Swordsage_IronGuardsGlare 8250 0 99 1
734 Swordsage_LawBearer 8251 0 99 1
735 Swordsage_MartialSpirit 8252 0 99 1
736 Swordsage_RadiantCharge 8253 0 99 1
737 Swordsage_RallyingStrike 8254 0 99 1
738 Swordsage_RevitalizingStrike 8255 0 99 1
739 Swordsage_ShieldBlock 8256 0 99 1
740 Swordsage_ShieldCounter 8257 0 99 1
741 Swordsage_StrikeOfRighteousVitality 8258 0 99 1
742 Swordsage_ThicketOfBlades 8259 0 99 1
743 Swordsage_TideOfChaos 8260 0 99 1
744 Swordsage_VanguardStrike 8261 0 99 1
745 Swordsage_ActionBeforeThought 8262 0 99 1
746 Swordsage_AvalancheOfBlades 8263 0 99 1
747 Swordsage_BoundingAssault 8264 0 99 1
748 Swordsage_DiamondDefense 8265 0 99 1
749 Swordsage_DiamondNightmareBlade 8266 0 99 1
750 Swordsage_DisruptingBlow 8267 0 99 1
751 Swordsage_EmeraldRazor 8268 0 99 1
752 Swordsage_HearingTheAir 8269 0 99 1
753 Swordsage_InsightfulStrike 8270 0 99 1
754 Swordsage_InsightfulStrikeGreater 8271 0 99 1
755 Swordsage_MindOverBody 8272 0 99 1
756 Swordsage_MindStrike 8273 0 99 1
757 Swordsage_MomentOfAlacrity 8274 0 99 1
758 Swordsage_MomentOfPerfectMind 8275 0 99 1
759 Swordsage_PearlOfBlackDoubt 8276 0 99 1
760 Swordsage_QuicksilverMotion 8277 0 99 1
761 Swordsage_RapidCounter 8278 0 99 1
762 Swordsage_RubyNightmareBlade 8279 0 99 1
763 Swordsage_SapphireNightmareBlade 8280 0 99 1
764 Swordsage_StanceOfAlacrity 8281 0 99 1
765 Swordsage_StanceOfClarity 8282 0 99 1
766 Swordsage_TimeStandsStill 8283 0 99 1
767 Swordsage_AbsoluteSteel 8284 0 99 1
768 Swordsage_AdamantineHurricane 8285 0 99 1
769 Swordsage_DancingBladeForm 8286 0 99 1
770 Swordsage_DazingStrike 8287 0 99 1
771 Swordsage_DisarmingStrike 8288 0 99 1
772 Swordsage_ExorcismOfSteel 8289 0 99 1
773 Swordsage_FinishingMove 8290 0 99 1
774 Swordsage_IronHeartEndurance 8291 0 99 1
775 Swordsage_IronHeartFocus 8292 0 99 1
776 Swordsage_IronHeartSurge 8293 0 99 1
777 Swordsage_LightningRecovery 8294 0 99 1
778 Swordsage_LightningThrow 8295 0 99 1
779 Swordsage_ManticoreParry 8296 0 99 1
780 Swordsage_MithralTornado 8297 0 99 1
781 Swordsage_PunishingStance 8298 0 99 1
782 Swordsage_ScythingBlade 8299 0 99 1
783 Swordsage_SteelWind 8300 0 99 1
784 Swordsage_SteelyStrike 8301 0 99 1
785 Swordsage_StrikeOfPerfectClarity 8302 0 99 1
786 Swordsage_SupremeBladeParry 8303 0 99 1
787 Swordsage_WallOfBlades 8304 0 99 1
788 Swordsage_BafflingDefense 8305 0 99 1
789 Swordsage_BallistaThrow 8306 0 99 1
790 Swordsage_CleverPositioning 8307 0 99 1
791 Swordsage_CometThrow 8308 0 99 1
792 Swordsage_CounterCharge 8309 0 99 1
793 Swordsage_DevastatingThrow 8310 0 99 1
794 Swordsage_FeignedOpening 8311 0 99 1
795 Swordsage_FoolsStrike 8312 0 99 1
796 Swordsage_GhostlyDefense 8313 0 99 1
797 Swordsage_GiantKillingStyle 8314 0 99 1
798 Swordsage_HydraSlayingStrike 8315 0 99 1
799 Swordsage_MightyThrow 8316 0 99 1
800 Swordsage_MirroredPursuit 8317 0 99 1
801 Swordsage_ScorpionParry 8318 0 99 1
802 Swordsage_ShiftingDefense 8319 0 99 1
803 Swordsage_SoaringThrow 8320 0 99 1
804 Swordsage_StalkingShadow 8321 0 99 1
805 Swordsage_StepOfTheWind 8322 0 99 1
806 Swordsage_StrikeOfTheBrokenShield 8323 0 99 1
807 Swordsage_TornadoThrow 8324 0 99 1
808 Swordsage_AssassinsStance 8325 0 99 1
809 Swordsage_BalanceOnTheSky 8326 0 99 1
810 Swordsage_BloodlettingStrike 8327 0 99 1
811 Swordsage_ChildOfShadow 8328 0 99 1
812 Swordsage_ClingingShadowStrike 8329 0 99 1
813 Swordsage_CloakOfDeception 8330 0 99 1
814 Swordsage_DanceOfTheSpider 8331 0 99 1
815 Swordsage_DeathInTheDark 8332 0 99 1
816 Swordsage_DrainVitality 8333 0 99 1
817 Swordsage_EnervatingShadowStrike 8334 0 99 1
818 Swordsage_FiveShadowCreepingIceEnervationStrike 8335 0 99 1
819 Swordsage_GhostBlade 8336 0 99 1
820 Swordsage_HandOfDeath 8337 0 99 1
821 Swordsage_IslandOfBlades 8338 0 99 1
822 Swordsage_ObscuringShadowVeil 8339 0 99 1
823 Swordsage_OneWithShadow 8340 0 99 1
824 Swordsage_ShadowBladeTechnique 8341 0 99 1
825 Swordsage_ShadowBlink 8342 0 99 1
826 Swordsage_ShadowGarrote 8343 0 99 1
827 Swordsage_ShadowJaunt 8344 0 99 1
828 Swordsage_ShadowNoose 8345 0 99 1
829 Swordsage_ShadowStride 8346 0 99 1
830 Swordsage_StalkerInTheNight 8347 0 99 1
831 Swordsage_StepOfTheDancingMoth 8348 0 99 1
832 Swordsage_StrengthDrainingStrike 8349 0 99 1
833 Swordsage_AdamantineBones 8350 0 99 1
834 Swordsage_AncientMountainHammer 8351 0 99 1
835 Swordsage_BonesplittingStrike 8352 0 99 1
836 Swordsage_Bonecrusher 8353 0 99 1
837 Swordsage_BoulderRoll 8354 0 99 1
838 Swordsage_ChargingMinotaur 8355 0 99 1
839 Swordsage_ColossusStrike 8356 0 99 1
840 Swordsage_CrushingVise 8357 0 99 1
841 Swordsage_CrushingWeightOfTheMountain 8358 0 99 1
842 Swordsage_EarthstrikeQuake 8359 0 99 1
843 Swordsage_ElderMountainHammer 8360 0 99 1
844 Swordsage_GiantsStance 8361 0 99 1
845 Swordsage_IronBones 8362 0 99 1
846 Swordsage_IrresistibleMountainStrike 8363 0 99 1
847 Swordsage_MountainAvalanche 8364 0 99 1
848 Swordsage_MountainHammer 8365 0 99 1
849 Swordsage_MountainTombstoneStrike 8366 0 99 1
850 Swordsage_OverwhelmingMountainStrike 8367 0 99 1
851 Swordsage_RootsOfTheMountain 8368 0 99 1
852 Swordsage_StoneBones 8369 0 99 1
853 Swordsage_StoneDragonsFury 8370 0 99 1
854 Swordsage_StoneVise 8371 0 99 1
855 Swordsage_StonefootStance 8372 0 99 1
856 Swordsage_StrengthOfStone 8373 0 99 1
857 Swordsage_BloodInTheWater 8374 0 99 1
858 Swordsage_ClawAtTheMoon 8375 0 99 1
859 Swordsage_DancingMongoose 8376 0 99 1
860 Swordsage_DeathFromAbove 8377 0 99 1
861 Swordsage_FeralDeathBlow 8378 0 99 1
862 Swordsage_FleshRipper 8379 0 99 1
863 Swordsage_FountainOfBlood 8380 0 99 1
864 Swordsage_GirallonWindmillFleshRip 8381 0 99 1
865 Swordsage_HamstringAttack 8382 0 99 1
866 Swordsage_HuntersSense 8383 0 99 1
867 Swordsage_LeapingDragonStance 8384 0 99 1
868 Swordsage_PouncingCharge 8385 0 99 1
869 Swordsage_PreyOnTheWeak 8386 0 99 1
870 Swordsage_RabidBearStrike 8387 0 99 1
871 Swordsage_RabidWolfStrike 8388 0 99 1
872 Swordsage_RagingMongoose 8389 0 99 1
873 Swordsage_SoaringRaptorStrike 8390 0 99 1
874 Swordsage_SuddenLeap 8391 0 99 1
875 Swordsage_SwoopingDragonStrike 8392 0 99 1
876 Swordsage_WolfClimbsTheMountain 8393 0 99 1
877 Swordsage_WolfFangStrike 8394 0 99 1
878 Swordsage_WolfPackTactics 8395 0 99 1
879 Swordsage_WolverineStance 8396 0 99 1
880 Swordsage_BattleLeadersCharge 8397 0 99 1
881 Swordsage_BolsteringVoice 8398 0 99 1
882 Swordsage_ClarionCall 8399 0 99 1
883 Swordsage_CoveringStrike 8400 0 99 1
884 Swordsage_DouseTheFlames 8401 0 99 1
885 Swordsage_FlankingManeuver 8402 0 99 1
886 Swordsage_LeadingTheAttack 8403 0 99 1
887 Swordsage_LeadingTheCharge 8404 0 99 1
888 Swordsage_LionsRoar 8405 0 99 1
889 Swordsage_OrderForgedFromChaos 8406 0 99 1
890 Swordsage_PressTheAdvantage 8407 0 99 1
891 Swordsage_SwarmTactics 8408 0 99 1
892 Swordsage_SwarmingAssault 8409 0 99 1
893 Swordsage_TacticalStrike 8410 0 99 1
894 Swordsage_TacticsOfTheWolf 8411 0 99 1
895 Swordsage_WarLeadersCharge 8412 0 99 1
896 Swordsage_WarMastersCharge 8413 0 99 1
897 Swordsage_WhiteRavenHammer 8414 0 99 1
898 Swordsage_WhiteRavenStrike 8415 0 99 1
899 Swordsage_WhiteRavenTactics 8416 0 99 1
900 **** **** **** **** ****
901 ####END_OF_TOB_SPELLBOOK_RESERVE **** **** **** ****

View File

@@ -1,965 +0,0 @@
2DA V2.0
FeatLabel FeatIndex List GrantedOnLevel OnMenu
0 **Class_feats** **** **** **** ****
1 ImpCombatCasting 696 3 1 0
2 WeapProfSim 46 3 1 0
3 WeapProfSim_Dart 7914 3 1 0
4 WeapProfSim_Light_Mace 7908 3 1 0
5 WeapProfSim_Morningstar 7923 3 1 0
6 WeapProfSim_Shortspear 7927 3 1 0
7 WeapProfSim_Sickle 7929 3 1 0
8 WeapProfSim_Sling 7930 3 1 0
9 WP_Goad 7949 3 1 0
10 WP_Heavy_Mace 7946 3 1 0
11 WP_Katar 7945 3 1 0
12 WP_Sap 7944 3 1 0
13 ArmProfLgt 3 3 1 0
14 ArmProfMed 4 3 1 0
15 Shield 32 3 1 0
16 WeapProfMar 45 3 1 0
17 WeapProfMar_Battleaxe 7903 3 1 0
18 WeapProfMar_Greataxe 7913 3 1 0
19 WeapProfMar_Greatsword 7912 3 1 0
20 WeapProfMar_Halberd 7909 3 1 0
21 WeapProfMar_Handaxe 7919 3 1 0
22 WeapProfMar_Heavy_Flail 7917 3 1 0
23 WeapProfMar_Light_Flail 7905 3 1 0
24 WeapProfMar_Light_Hammer 7918 3 1 0
25 WeapProfMar_Longbow 7907 3 1 0
26 WeapProfMar_Longsword 7902 3 1 0
27 WeapProfMar_Rapier 7924 3 1 0
28 WeapProfMar_Scimitar 7925 3 1 0
29 WeapProfMar_Shortbow 7910 3 1 0
30 WeapProfMar_Shortsword 7901 3 1 0
31 WeapProfMar_Throwing_Axe 7931 3 1 0
32 WeapProfMar_Trident 7932 3 1 0
33 WeapProfMar_Warhammer 7906 3 1 0
34 WP_Light_Lance 7938 3 1 0
35 WP_Heavy_Pick 7939 3 1 0
36 WP_Light_Pick 7940 3 1 0
37 WP_Falchion 7943 3 1 0
38 WP_Maul 7947 3 1 0
39 WP_Kukri 7922 3 1 0
40 ReadyManeuver 1960 3 1 1
41 RecoverManeuvers 1973 3 1 1
42 **** **** **** **** ****
43 **** **** **** **** ****
44 **** **** **** **** ****
45 **** **** **** **** ****
46 **** **** **** **** ****
47 **** **** **** **** ****
48 BattleClarity 3529 3 1 0
49 WeaponAptitude 3538 3 1 1
50 WeaponAptitudeOptions 24437 3 1 1
51 UncannyDodge1 195 3 2 0
52 BattleArdor 3539 3 3 0
53 UncannyDodge2 251 3 6 0
54 WEAPON_SPECIALIZATION_PROFICIENCY 24423 3 6 0
55 BattleCunning 3546 3 7 0
56 BattleSkill 3547 3 11 0
57 BattleMastery 3564 3 99 0
58 StanceMastery 3565 3 20 0
59 Expertise 389 1 -1 0
60 BlindFight 408 1 -1 0
61 GreatFort 14 1 -1 0
62 IronWill 22 1 -1 0
63 LightningReflexes 24 1 -1 0
64 ImprovedInitiative 377 1 -1 0
65 Diehard 3297 1 -1 0
66 Endurance 2568 1 -1 0
67 AdaptiveStyle 24075 1 -1 0
68 Aptitude_Weapon_Focus_1 2123 0 -1 0
69 Aptitude_Weapon_Specialization_1 2125 0 -1 0
70 Aptitude_Epic_Weapon_Focus_1 2124 0 -1 0
71 Aptitude_Epic_Weapon_Specialization_1 2126 0 -1 0
72 Aptitude_Sanctify_Martial_Strike_1 2128 0 -1 0
73 Aptitude_Vile_Martial_Strike_1 2129 0 -1 0
74 Aptitude_Improved_Critical_1 2127 0 -1 0
75 Aptitude_Overwhelming_Critical_1 24424 0 -1 0
76 Aptitude_Devastating_Critical_1 24425 0 -1 0
77 Aptitude_Weapon_Of_Choice_1 24426 0 -1 0
78 Aptitude_Weapon_Focus_2 24427 0 -1 0
79 Aptitude_Weapon_Specialization_2 24429 0 -1 0
80 Aptitude_Epic_Weapon_Focus_2 24428 0 -1 0
81 Aptitude_Epic_Weapon_Specialization_2 24430 0 -1 0
82 Aptitude_Sanctify_Martial_Strike_2 24432 0 -1 0
83 Aptitude_Vile_Martial_Strike_2 24433 0 -1 0
84 Aptitude_Improved_Critical_2 24431 0 -1 0
85 Aptitude_Overwhelming_Critical_2 24434 0 -1 0
86 Aptitude_Devastating_Critical_2 24435 0 -1 0
87 Aptitude_Weapon_Of_Choice_2 24436 0 -1 0
88 WeapSpeClub 47 0 -1 0
89 WeapSpeDagger 128 0 -1 0
90 WeapSpeDart 129 0 -1 0
91 WeapSpeHXBow 130 0 -1 0
92 WeapSpeLgXBow 131 0 -1 0
93 WeapSpeLgMace 132 0 -1 0
94 WeapSpeMorn 133 0 -1 0
95 WeapSpeStaff 134 0 -1 0
96 WeapSpeSpear 135 0 -1 0
97 WeapSpeSickle 136 0 -1 0
98 WeapSpeSling 137 0 -1 0
99 WeapSpeUnArm 138 0 -1 0
100 WeapSpeLongBow 139 0 -1 0
101 WeapSpeShortBow 140 0 -1 0
102 WeapSpeShortSword 141 0 -1 0
103 WeapSpeRapier 142 0 -1 0
104 WeapSpeScim 143 0 -1 0
105 WeapSpeLSw 144 0 -1 0
106 WeapSpeGSw 145 0 -1 0
107 WeapSpeHAxe 146 0 -1 0
108 WeapSpeTAxe 147 0 -1 0
109 WeapSpeBAxe 148 0 -1 0
110 WeapSpeGAxe 149 0 -1 0
111 WeapSpeHalb 150 0 -1 0
112 WeapSpeLgHam 151 0 -1 0
113 WeapSpeLgFlail 152 0 -1 0
114 WeapSpeWHam 153 0 -1 0
115 WeapSpeHFlail 154 0 -1 0
116 WeapSpeKama 155 0 -1 0
117 WeapSpeKukri 156 0 -1 0
118 WeapSpeShur 158 0 -1 0
119 WeapSpeScy 159 0 -1 0
120 WeapSpeKatana 160 0 -1 0
121 WeapSpeBSw 161 0 -1 0
122 WeapSpeDMace 163 0 -1 0
123 WeapSpeDAxe 164 0 -1 0
124 WeapSpe2Sw 165 0 -1 0
125 FEAT_WEAPON_SPECIALIZATION_TRIDENT 1073 0 -1 0
126 VitalRecovery 3636 1 -1 0
127 StonePower 5294 0 -1 1
128 RisingPhoenix_FullAttack 5204 0 99 1
129 "Remember to move all ToB feats" **** **** **** ****
130 "outside the autoupdate range" **** **** **** ****
131 **** **** **** **** ****
132 ###cls_feat_allBaseClasses_BEGIN### **** **** **** ****
133 **Bio169Feats** **** **** **** ****
134 FEAT_HORSE_MENU 1089 3 1 1
135 PLAYER_TOOL_01 1106 1 99 1
136 PLAYER_TOOL_02 1107 1 99 1
137 PLAYER_TOOL_03 1108 1 99 1
138 PLAYER_TOOL_04 1109 1 99 1
139 PLAYER_TOOL_05 1110 1 99 1
140 PLAYER_TOOL_06 1111 1 99 1
141 PLAYER_TOOL_07 1112 1 99 1
142 PLAYER_TOOL_08 1113 1 99 1
143 PLAYER_TOOL_09 1114 1 99 1
144 PLAYER_TOOL_10 1115 1 99 1
145 **FeatsGrantedToAll** **** **** **** ****
146 FEAT_JUMP 2884 3 1 1
147 FEAT_CLIMB 3112 3 1 1
148 FEAT_POWER_ATTACK_SINGLE_RADIAL 3143 0 99 1
149 FEAT_POWER_ATTACK_FIVES_RADIAL 3144 0 99 1
150 FEAT_PRC_POWER_ATTACK_QUICKS_RADIAL 3179 0 99 1
151 ACP_QUICK_FEAT 3479 0 99 1
152 ACP_HEAVY_FEAT 3480 0 99 1
153 ACP_UNARMED_FEAT 3481 0 99 1
154 TeleportManagementRadial 4235 3 1 1
155 SWITCH_FEAT 2285 3 1 1
156 FEAT_READ_RECIPE 2919 3 1 1
157 FEAT_SPELLS_TOUCH_ATTACK 4092 3 1 1
158 FEAT_SPELLS_HOLD_CHARGE_TOGGLE 4095 3 1 1
159 EndSpellEffects 2468 3 1 1
160 CombatMove_RadialMaster 2898 3 1 1
161 CombatMove_RadialMaster2 5195 3 1 1
162 CombatMove_RadialMaster3 3415 3 1 1
163 **** **** **** **** ****
164 **GeneralActivatableFeats** **** **** **** ****
165 FEAT_ATTUNE_GEM 2472 0 -1 1
166 FEAT_INSCRIBE_RUNE 2462 0 -1 1
167 FEAT_CRAFT_SKULL_TALISMAN 3004 0 -1 1
168 FEAT_THRALL_TO_DEMON 2616 0 -1 1
169 FEAT_HOLYRADIANCE 3164 0 -1 1
170 FEAT_NIMBUSOFLIGHT 3165 0 -1 1
171 FEAT_MANYSHOT 3306 0 -1 1
172 FEAT_IMP_MANYSHOT 3350 0 -1 1
173 Pinpoint_Accuracy 3351 0 -1 1
174 FEAT_SERVHEAVEN 3355 0 -1 1
175 FEAT_DISCIPLE_OF_DARKNESS 4012 0 -1 1
176 FEAT_BLOOD_OF_THE_WARLORD 4608 0 -1 1
177 Cloak_Dance 4817 0 -1 1
178 Reckless_Offense 4816 0 -1 1
179 ZoneOfAnimation 2891 0 -1 1
180 FEAT_SPELLFIRE_WIELDER 4368 0 -1 1
181 FEAT_SPELLFIRE_INCREASE 4369 0 99 1
182 FEAT_SPELLFIRE_DECREASE 4370 0 99 1
183 FEAT_SPELLFIRE_QUICKSELECT 4371 0 99 1
184 FEAT_DISCIPLE_OF_THE_SUN 3127 0 -1 1
185 Dragonfire_Assault 1842 0 -1 1
186 Dragonfire_Channeling 1843 0 -1 1
187 Dragonfire_Inspiration 1844 0 -1 1
188 DauntingPresence 24025 0 -1 1
189 ProfaneLifeLeech 24026 0 -1 1
190 ProfaneAgony 5282 0 -1 1
191 SacredVitality 24027 0 -1 1
192 SacredVengeance 24028 0 -1 1
193 DeformityEyes 24029 0 -1 1
194 DeformityParasite 24031 0 -1 1
195 DarkSpeech 24033 0 -1 1
196 DarkWhispers 24034 0 -1 1
197 MastersWill 24035 0 -1 1
198 DeformityMadness 24036 0 -1 1
199 ReflexivePsychosis 24037 0 -1 1
200 ChosenOfEvil 24038 0 -1 1
201 Avenging_Strike 4297 0 -1 1
202 SnowflakeWardance 4489 0 -1 1
203 MasterWand 5312 0 -1 1
204 RecklessWandWielder 5313 0 -1 1
205 DoubleWandWielder 5315 0 -1 1
206 Wandstrike 5316 0 -1 1
207 Snap_Kick 4398 0 -1 1
208 HighSwordLowAxe 5288 0 -1 1
209 ScorpionsGrasp 5178 0 -1 1
210 WeaponAndTorch 5291 0 -1 1
211 ShieldCharge 3256 0 -1 1
212 ShieldSlam 3257 0 -1 1
213 AwesomeBlow 5370 0 -1 1
214 Spinning_Halberd 5287 0 -1 1
215 FEAT_RAY_CHARM_PERSON 2220 0 99 1
216 FEAT_RAY_CHARM_MONSTER 2221 0 99 1
217 FEAT_RAY_SLEEP 2222 0 99 1
218 FEAT_RAY_FLESH_TO_STONE 2223 0 99 1
219 FEAT_RAY_DISINTIGRATE 2224 0 99 1
220 FEAT_RAY_FEAR 2225 0 99 1
221 FEAT_RAY_SLOW 2226 0 99 1
222 FEAT_RAY_INFLICT_MODERATE_WOUNDS 2227 0 99 1
223 FEAT_WANDER_UNSEEN 5028 0 99 1
224 BonesOfTheEarth_Feat 2864 0 99 1
225 FEAT_MYSTIC_BACKLASH 24737 0 -1 1
226 FEAT_ACIDIC_SPLATTER 24738 0 -1 1
227 FEAT_FIERY_BURST 24739 0 -1 1
228 FEAT_STORM_BOLT 24740 0 -1 1
229 FEAT_WINTERS_BLAST 24741 0 -1 1
230 FEAT_CLAP_OF_THUNDER 24742 0 -1 1
231 FEAT_SICKENING_GRASP 24743 0 -1 1
232 FEAT_TOUCH_OF_HEALING 24744 0 -1 1
233 FEAT_DIMENSIONAL_JAUNT 24745 0 -1 1
234 FEAT_CLUTCH_OF_EARTH 24746 0 -1 1
235 FEAT_BORNE_ALOFT 24747 0 -1 1
236 FEAT_PROTECTIVE_WARD 24748 0 -1 1
237 FEAT_SHADOW_VEIL 24749 0 -1 1
238 FEAT_SUNLIGHT_EYES 24750 0 -1 1
239 FEAT_TOUCH_OF_DISTRACTION 24751 0 -1 1
240 FEAT_UMBRAL_SHROUD 24752 0 -1 1
241 FEAT_CHARNEL_MIASMA 24753 0 -1 1
242 FEAT_DROWNING_GLANCE 24754 0 -1 1
243 FEAT_INVISIBLE_NEEDLE 24755 0 -1 1
244 FEAT_SUMMON_ELEMENTAL 24756 0 -1 1
245 FEAT_DIMENSIONAL_REACH 24757 0 -1 1
246 FEAT_HURRICANE_BREATH 24758 0 -1 1
247 FEAT_MINOR_SHAPESHIFT 24759 0 -1 1
248 FEAT_FACECHANGER 24760 0 -1 1
249 **** **** **** **** ****
250 **Metabreath_and_Channeling** **** **** **** ****
251 FEAT_CLINGING_BREATH 4966 0 -1 1
252 FEAT_LINGERING_BREATH 4967 0 -1 1
253 FEAT_ENLARGE_BREATH 4968 0 -1 1
254 FEAT_HEIGHTEN_BREATH 4969 0 -1 1
255 FEAT_MAXIMIZE_BREATH 4970 0 -1 1
256 FEAT_SHAPE_BREATH 4972 0 -1 1
257 FEAT_SPREAD_BREATH 4973 0 -1 1
258 FEAT_TEMPEST_BREATH 4974 0 -1 1
259 FEAT_ENTANGLING_EXHALATION 4975 0 -1 1
260 FEAT_EXHALED_BARRIER 4976 0 -1 1
261 FEAT_EXHALED_IMMUNITY 4977 0 -1 1
262 **** **** **** **** ****
263 **DraconicAuras** **** **** **** ****
264 FEAT_BONUS_AURA_ENERGYACID 1828 0 -1 1
265 FEAT_BONUS_AURA_ENERGYCOLD 1829 0 -1 1
266 FEAT_BONUS_AURA_ENERGYELEC 1830 0 -1 1
267 FEAT_BONUS_AURA_ENERGYFIRE 1831 0 -1 1
268 FEAT_BONUS_AURA_TOUGHNESS 1894 0 -1 1
269 FEAT_BONUS_AURA_SENSES 1891 0 -1 1
270 FEAT_BONUS_AURA_PRESENCE 1885 0 -1 1
271 FEAT_BONUS_AURA_INSIGHT 1884 0 -1 1
272 FEAT_BONUS_AURA_RESOLVE 1890 0 -1 1
273 FEAT_BONUS_AURA_STAMINA 1892 0 -1 1
274 FEAT_BONUS_AURA_SWIFTNESS 1893 0 -1 1
275 FEAT_BONUS_AURA_RESISTACID 1886 0 -1 1
276 FEAT_BONUS_AURA_RESISTCOLD 1887 0 -1 1
277 FEAT_BONUS_AURA_RESISTELEC 1888 0 -1 1
278 FEAT_BONUS_AURA_RESISTFIRE 1889 0 -1 1
279 FEAT_BONUS_AURA_MAGICPOWER 1840 0 -1 1
280 FEAT_SECOND_AURA_POWER 1853 0 99 1
281 FEAT_SECOND_AURA_ENERGYSHLD 1854 0 99 1
282 FEAT_SECOND_AURA_TOUGHNESS 1855 0 99 1
283 FEAT_SECOND_AURA_SENSES 1856 0 99 1
284 FEAT_SECOND_AURA_VIGOR 1857 0 99 1
285 FEAT_SECOND_AURA_RESISTANCE 1858 0 99 1
286 FEAT_SECOND_AURA_PRESENCE 1859 0 99 1
287 FEAT_SECOND_AURA_INSIGHT 1860 0 99 1
288 FEAT_SECOND_AURA_RESOLVE 1861 0 99 1
289 FEAT_SECOND_AURA_STAMINA 1862 0 99 1
290 FEAT_SECOND_AURA_SWIFTNESS 1863 0 99 1
291 FEAT_SECOND_AURA_RESISTACID 1864 0 99 1
292 FEAT_SECOND_AURA_RESISTCOLD 1865 0 99 1
293 FEAT_SECOND_AURA_RESISTELEC 1866 0 99 1
294 FEAT_SECOND_AURA_RESISTFIRE 1867 0 99 1
295 FEAT_SECOND_AURA_MAGICPOWER 1841 0 99 1
296 FEAT_SECOND_AURA_ENERGYACID 1824 0 99 1
297 FEAT_SECOND_AURA_ENERGYCOLD 1825 0 99 1
298 FEAT_SECOND_AURA_ENERGYELEC 1826 0 99 1
299 FEAT_SECOND_AURA_ENERGYFIRE 1827 0 99 1
300 FEAT_SECOND_AURA_ENERGY 1836 0 99 1
301 **** **** **** **** ****
302 **PsionicFeats** **** **** **** ****
303 Psionic_Focus 4818 0 99 1
304 Invest_Armour 3643 0 -1 1
305 Mental_Leap 4809 0 -1 1
306 Psionic_Fist 4800 0 -1 1
307 Greater_Psionic_Fist 4821 0 -1 1
308 Psionic_Weapon 4822 0 -1 1
309 Greater_Psionic_Weapon 4823 0 -1 1
310 Psionic_Shot 4824 0 -1 1
311 Greater_Psionic_Shot 4825 0 -1 1
312 Psionic_Meditation 4827 0 -1 1
313 Unavoidable_Strike 4830 0 -1 1
314 Wounding_Attack 4832 0 -1 1
315 Deep_Impact 4852 0 -1 1
316 Fell_Shot 4853 0 -1 1
317 Strength_of_Two 4965 0 -1 1
318 **** **** **** **** ****
319 **IncarnumFeats** **** **** **** ****
320 InvestEssentiaConversation 8800 0 99 1
321 HealingSoul 8882 0 99 1
322 MidnightAugmentation 8884 0 99 1
323 PsycarnumBlade 8887 0 99 1
324 DivineSoultouch 8891 0 99 1
325 PsycarnumInfusion 8896 0 99 1
326 **** **** **** **** ****
327 **BindingFeats** **** **** **** ****
328 BindVestige 9131 0 -1 1
329 ExpelVestige 9136 0 -1 1
330 MalphasArcaneEye 9040 0 99 1
331 SavnokCallArmor 9043 0 99 1
332 AndromaliusSee_Invisibility 9048 0 99 1
333 FocalorAuraSadness 9049 0 99 1
334 KarsusSenses 9052 0 99 1
335 **** **** **** **** ****
336 **RacialFeats** **** **** **** ****
337 FEAT_ASHERATI_BODY_DAZZLE 5213 0 99 1
338 FEAT_ASHERATI_BODY_LAMP 5214 0 99 1
339 FEAT_URDINNIR_STONESKIN 4644 0 99 1
340 FEAT_AVARIEL_DIVE 4645 0 99 1
341 FEAT_AYUAN_FEAR 4646 0 99 1
342 FEAT_AYUAN_ENTANGLE 4647 0 99 1
343 FEAT_AYUAN_DARKNESS 4648 0 99 1
344 FEAT_AYUAN_NEUTRALIZE_POISON 4649 0 99 1
345 FEAT_AASIMAR_LIGHT 4650 0 99 1
346 FEAT_TIEFLING_DARK 4651 0 99 1
347 FEAT_SVIRF_BLIND_DEAF 4652 0 99 1
348 FEAT_SVIRF_BLUR 4653 0 99 1
349 FEAT_SVIRF_DISGUISE 4654 0 99 1
350 FEAT_SVIRF_REVERT 4655 0 99 1
351 FEAT_RAK_DISGUISE 4656 0 99 1
352 FEAT_RAK_CHANGE_SHAPE 4657 0 99 1
353 FEAT_PYUAN_CHARM 4658 0 99 1
354 FEAT_PYUAN_DARKNESS 4659 0 99 1
355 FEAT_PYUAN_ENTANGLE 4660 0 99 1
356 FEAT_PYUAN_FEAR 4661 0 99 1
357 FEAT_PIXIE_INVIS 4662 0 99 1
358 FEAT_PIXIE_CONFUSE 4663 0 99 1
359 FEAT_PIXIE_ENTANGLE 4664 0 99 1
360 FEAT_PIXIE_DISPEL_MAGIC 4665 0 99 1
361 FEAT_PIXIE_POLYMORPH 4666 0 99 1
362 FEAT_PIXIE_REVERT 4667 0 99 1
363 FEAT_MINOTAUR_CHARGE 4668 0 99 1
364 FEAT_ILLITHID_CHARM 4669 0 99 1
365 FEAT_ILLITHID_BLAST 4670 0 99 1
366 FEAT_ILLITHID_SUCKBRAIN 4671 0 99 1
367 FEAT_GITHZERAI_DAZE 4672 0 99 1
368 FEAT_GITHYANKI_DAZE 4673 0 99 1
369 FEAT_GITHYANKI_BLUR 4674 0 99 1
370 FEAT_FEYRI_CHARMPERSON 4675 0 99 1
371 FEAT_FEYRI_CLAIRAUDIENCE 4676 0 99 1
372 FEAT_FEYRI_DARKNESS 4677 0 99 1
373 FEAT_FEYRI_ENERVATION 4678 0 99 1
374 FEAT_FEYRI_ALTER 4679 0 99 1
375 FEAT_FEYRI_REVERT 4680 0 99 1
376 FEAT_DUERGAR_INVIS 4681 0 99 1
377 FEAT_DROW_DARKNESS 4682 0 99 1
378 FEAT_DROW_FAERIE_FIRE 4683 0 99 1
379 BROWNIE_RAKSHASA_HIPS 433 0 99 1
380 FEAT_WGNOME_SILENCE 4555 0 99 1
381 FEAT_WGNOME_MAGEHAND 4519 0 99 1
382 FEAT_HOUND_AID 4574 0 99 1
383 FEAT_HOUND_AURAMENACE 4548 0 99 1
384 FEAT_HOUND_CONTFLAME 4514 0 99 1
385 FEAT_HOUND_DETECTEVIL 4618 0 99 1
386 FEAT_HOUND_DISGUISE 4513 0 99 1
387 FEAT_HOUND_MAGICCIRCLE 4515 0 99 1
388 FEAT_HOUND_TELEPORT 4516 0 99 1
389 FEAT_RACE_ENERGYRAY 4856 0 99 1
390 FEAT_RACE_ENERGYRAYSONIC 4520 0 99 1
391 FEAT_ELAN_RESISTANCE 4521 0 99 1
392 FEAT_ELAN_RESILIANCE 4522 0 99 1
393 FEAT_PSIRACE_STOMP 4524 0 99 1
394 FEAT_MAENAD_OUTBURST 4525 0 99 1
395 FEAT_XEPH_BURST 4526 0 99 1
396 FEAT_ZENYTH_TRUESTRIKE 4536 0 99 1
397 FEAT_TULADH_MAGIC_CIRCL 4533 0 99 1
398 FEAT_NATHRI_EXP_RETREAT 4534 0 99 1
399 FEAT_BLADELING_RAZOR_STORM 4539 0 99 1
400 FEAT_KAPAK_SALIVA 4546 0 99 1
401 FEAT_IRDA_FLARE 4551 0 99 1
402 FEAT_ZAKYA_CHILLTOUCH 4570 0 99 1
403 FEAT_ZAKYA_TRUESTRIKE 4557 0 99 1
404 FEAT_ZAKYA_VAMPTOUCH 4558 0 99 1
405 FEAT_MINOR_CHANGE_SHAPE 4560 0 99 1
406 FEAT_CHANGELING_CHANGE_SHAPE 4561 0 99 1
407 FEAT_IRDA_CHANGE_SHAPE 4562 0 99 1
408 FEAT_QUICK_CHANGE_SHAPE 4563 0 99 1
409 FEAT_SHIFTER_SHIFTING 4566 0 99 1
410 FEAT_RAK_SHADOW_JUMP 3307 0 99 1
411 FEAT_NIXIE_CHARM_PERSON 4597 0 99 1
412 FEAT_NIXIE_WATERBREATHING 4641 0 99 1
413 FEAT_NYMPH_DIMENSION_DOOR 4755 0 99 1
414 FEAT_NYMPH_STUNNING_GLANCE 4684 0 99 1
415 FEAT_NYMPH_BLINDING_BEAUTY 4685 0 99 1
416 FEAT_GRIG_PYROTECHNICS 4686 0 99 1
417 FEAT_GRIG_INVIS 4687 0 99 1
418 FEAT_GRIG_ENTANGLE 4635 0 99 1
419 FEAT_BRALANI_LIGHTNING_BOLT 4995 0 99 1
420 FEAT_BRALANI_CURE_SERIOUS 4996 0 99 1
421 FEAT_BRALANI_BLUR 4997 0 99 1
422 FEAT_BRALANI_CHARM_PERSON 4998 0 99 1
423 FEAT_BRALANI_MIRROR_IMAGE 4999 0 99 1
424 FEAT_BRALANI_GUST_OF_WIND 4978 0 99 1
425 FEAT_TOUCH_OF_LUCK 4634 0 99 1
426 FEAT_FORESTLORD_TREEWALK 4633 0 99 1
427 FEAT_TROGLODYTE_STENCH 23549 0 99 1
428 Skarn_spines 5180 0 99 1
429 Killoren_Aspect_H 5209 0 99 1
430 Killoren_Aspect_D 5210 0 99 1
431 Killoren_Aspect_A 5211 0 99 1
432 FrostFolk_IceBlast 5372 0 99 1
433 Uldra_RayFrost 5373 0 99 1
434 Uldra_Fatigue 5374 0 99 1
435 Marrulurk_DA 2930 0 99 1
436 Marrulurk_NauseatingBreath 5375 0 99 1
437 ExtaminaarCharmAnimal 5379 0 99 1
438 Marrusault_Howl 3308 0 99 1
439 FEAT_HYBSIL_MIRROR_IMAGE 5382 0 99 1
440 FEAT_HYBSIL_DANCLIGHTS 5383 0 99 1
441 FEAT_HYBSIL_JUMP 5384 0 99 1
442 FEAT_WILDREN_FURY 5386 0 99 1
443 Turlemoi_RockThrowing 5419 0 99 1
444 Arkamoi_ArcaneMastermind 5424 0 99 1
445 Muckdweller_Squirt 5425 0 99 1
446 Aranea_AlternateForm 5426 0 99 1
447 Aranea_Web 5427 0 99 1
448 Mephling_breath 5429 0 99 1
449 FEAT_FOG_CLOUD_BREATH 5434 0 99 1
450 **** **** **** **** ****
451 **BonusDomains** **** **** **** ****
452 FEAT_CHECK_DOMAIN_SLOTS 2000 0 99 1
453 FEAT_CAST_DOMAIN_LEVEL_ONE 2049 0 99 1
454 FEAT_CAST_DOMAIN_LEVEL_TWO 2050 0 99 1
455 FEAT_CAST_DOMAIN_LEVEL_THREE 2051 0 99 1
456 FEAT_CAST_DOMAIN_LEVEL_FOUR 2052 0 99 1
457 FEAT_CAST_DOMAIN_LEVEL_FIVE 2053 0 99 1
458 FEAT_CAST_DOMAIN_LEVEL_SIX 2054 0 99 1
459 FEAT_CAST_DOMAIN_LEVEL_SEVEN 2055 0 99 1
460 FEAT_CAST_DOMAIN_LEVEL_EIGHT 2056 0 99 1
461 FEAT_CAST_DOMAIN_LEVEL_NINE 2057 0 99 1
462 Strength_Domain_Power 307 0 99 1
463 Protection_Domain_Power 308 0 99 1
464 Death_Domain_Power 310 0 99 1
465 Air_Domain_Power 311 0 99 1
466 Destruction_Domain_Power 313 0 99 1
467 Earth_Domain_Power 314 0 99 1
468 Fire_Domain_Power 316 0 99 1
469 Plant_Domain_Power 321 0 99 1
470 Sun_Domain_Power 322 0 99 1
471 Travel_Domain_Power 323 0 99 1
472 Trickery_Domain_Power 324 0 99 1
473 Water_Domain_Power 325 0 99 1
474 FEAT_ORC_DOMAIN 4041 0 99 1
475 FEAT_SLIME_DOMAIN 4043 0 99 1
476 FEAT_CHARM_DOMAIN 4045 0 99 1
477 FEAT_FAMILY_DOMAIN 4051 0 99 1
478 FEAT_HALFLING_DOMAIN 4052 0 99 1
479 FEAT_ILLUSION_DOMAIN 4053 0 99 0
480 FEAT_HATRED_DOMAIN 4054 0 99 1
481 FEAT_NOBILITY_DOMAIN 4055 0 99 1
482 FEAT_SCALEYKIND_DOMAIN 4057 0 99 1
483 FEAT_RENEWAL_DOMAIN 4060 0 99 1
484 FEAT_SPIDER_DOMAIN 4061 0 99 1
485 FEAT_BLIGHTBRINGER 2250 0 99 1
486 **** **** **** **** ****
487 **Templates** **** **** **** ****
488 Celestial_Smite_Evil 22601 0 99 1
489 Fiendish_Smite_Good 22603 0 99 1
490 Half_Celestial_Smite_Evil 22605 0 99 1
491 Half_Celestial_Protection_from_Evil 22606 0 99 1
492 Half_Celestial_Bless 22607 0 99 1
493 Half_Celestial_Aid 22608 0 99 1
494 Half_Celestial_Detect_Evil 22609 0 99 1
495 Half_Celestial_Cure_Serious_Wounds 22610 0 99 1
496 Half_Celestial_Neutralize_Poison 22611 0 99 1
497 Half_Celestial_HolySmite **** 0 99 1
498 Half_Celestial_Remove_Disease 22613 0 99 1
499 Half_Celestial_DispelEvil **** 0 99 1
500 Half_Celestial_Holy_Word 22615 0 99 1
501 Half_Celestial_HolyAura 22616 0 99 1
502 Half_Celestial_Hallow **** 0 99 1
503 Half_Celestial_Mass_Charm 22618 0 99 1
504 Half_Celestial_Summon_Creature_IX 22619 0 99 1
505 Half_Celestial_Resurrection 22620 0 99 1
506 Half_Celestial_Daylight 22621 0 99 1
507 Half_Fiendish_Smite_Good 22624 0 99 1
508 Half_Fiendish_Darkness 22625 0 99 1
509 Half_Fiendish_Desecrate **** 0 99 1
510 Half_Fiendish_Unholy_Blight **** 0 99 1
511 Half_Fiendish_Poison 22628 0 99 1
512 Half_Fiendish_Contagion 22629 0 99 1
513 Half_Fiendish_Blasphemy 22630 0 99 1
514 Half_Fiendish_Unholy_Aura **** 0 99 1
515 Half_Fiendish_Unhallow **** 0 99 1
516 Half_Fiendish_Horrid_Wilting 22633 0 99 1
517 Half_Fiendish_Summon_Creature_IX 22634 0 99 1
518 Half_Fiendish_Destruction 22635 0 99 1
519 Lich_Fear_Aura 22637 0 99 1
520 Lich_Paralyzing_Touch 22638 0 99 1
521 Lich_Appearance 22639 0 99 1
522 Demilich_Alter_Self 22641 0 99 1
523 Demilich_Astral_Projection **** 0 99 1
524 Demilich_Create_Greater_Undead 22643 0 99 1
525 Demilich_Create_Undead 22644 0 99 1
526 Demilich_Death_Knell **** 0 99 1
527 Demilich_Enervation 22646 0 99 1
528 Demilich_Greater_Dispel_Magic 22647 0 99 1
529 Demilich_Harm 22648 0 99 1
530 Demilich_Summon_Creature_I 22649 0 99 1
531 Demilich_Summon_Creature_II 22650 0 99 1
532 Demilich_Summon_Creature_III 22651 0 99 1
533 Demilich_Summon_Creature_IV 22652 0 99 1
534 Demilich_Summon_Creature_V 22653 0 99 1
535 Demilich_Summon_Creature_VI 22654 0 99 1
536 Demilich_Summon_Creature_VII 22655 0 99 1
537 Demilich_Summon_Creature_VIII 22656 0 99 1
538 Demilich_Summon_Creature_IX 22657 0 99 1
539 Demilich_Telekinesis **** 0 99 1
540 Demilich_Weird 22659 0 99 1
541 Demilich_Greater_Planar_Ally 22660 0 99 1
542 HalfDragon_Breath_Weapon 22662 0 99 1
543 Earth_Strike 5328 0 99 1
544 BloodedOne_War_Cry 5377 0 99 1
545 RethDekala_VilefireBlast 5409 0 99 1
546 RethDekala_MartialSpirit 5410 0 99 1
547 RethDekala_ThicketOfBlades 5411 0 99 1
548 RethDekala_DauntingStrike 5412 0 99 1
549 RethDekala_DeathFromAbove 5413 0 99 1
550 RethDekala_DisarmingStrike 5414 0 99 1
551 RethDekala_EntanglingBlade 5415 0 99 1
552 RethDekala_WallOfBlades 5416 0 99 1
553 RethDekala_RecoverManeuvers 5417 0 99 1
554 ArchlichTurnUndead 22701 0 99 1
555 FEAT_ANIMATE_DEAD 3574 0 99 1
556 FEAT_PROJECTION 3579 0 99 1
557 FEAT_END_PROJECTION 3575 0 99 1
558 **** **** **** **** ****
559 Saint_Bless 22702 0 99 1
560 Saint_Guidance_Placeholder **** **** **** ****
561 Saint_Resistance 22704 0 99 1
562 Saint_Virtue 22705 0 99 1
563 Saint_Protective_Aura 22706 0 99 1
564 **** **** **** **** ****
565 **WeaponsOfLegacy** **** **** **** ****
566 BBB_Darkvision 22710 0 99 1
567 BBB_Longstrider 22711 0 99 1
568 BBB_Lesser_Restoration 22712 0 99 1
569 BBB_Teleport_SelfOnly 22713 0 99 1
570 BBB_Protection_from_Evil 22714 0 99 1
571 BBB_Drowseeker 22715 0 99 1
572 BBB_ShockingShot 22716 0 99 1
573 BBB_PierceTheBlackHeart 22717 0 99 1
574 Steadfast_vigor 22718 0 99 1
575 Steadfast_slow 22719 0 99 1
576 Flay_SnakeSting 22720 0 99 1
577 Flay_WhipWrap 22721 0 99 1
578 CrimsonRuination_FrozenFate 22722 0 99 1
579 Devious_DetectThoughts 22723 0 99 1
580 SimpleBow_TrueSeeing 22724 0 99 1
581 SimpleBow_Prescience 22725 0 99 1
582 SimpleBow_Focus 22726 0 99 1
583 Aradros_Extend 22727 0 99 1
584 Aradros_Survive 22728 0 99 1
585 Guurgal_Force 22729 0 99 1
586 Guurgal_Rage 22730 0 99 1
587 DivSpark_Fear 22731 0 99 1
588 DivSpark_Light 22732 0 99 1
589 Wargirds_Haste 22733 0 99 1
590 Wargirds_Stoneskin 22734 0 99 1
591 DesertWind_FierySlash 22735 0 99 1
592 DesertWind_HowlingWind 22736 0 99 1
593 DesertWind_FanFlames 22737 0 99 1
594 DesertWind_DustDesert 22738 0 99 1
595 Mindsplinter_VirtueDenied 22739 0 99 1
596 Mindsplinter_KissOfDeath 22740 0 99 1
597 Mindsplinter_BattleShriek 22741 0 99 1
598 Mindsplinter_RuinousHowl 22742 0 99 1
599 NotchedSpear_ParliamentOfFishes 22743 0 99 1
600 NotchedSpear_ConcealmentKraken 22744 0 99 1
601 NotchedSpear_ScionSea 22745 0 99 1
602 NotchedSpear_CommandSeaChildren 22746 0 99 1
603 Ur_SwiftStride 22747 0 99 1
604 Ur_HealingTotem 22748 0 99 1
605 Ur_SavageTransformation 22749 0 99 1
606 FlamecastersBolt_MarkTarget 22750 0 99 1
607 FlamecastersBolt_Morale 22751 0 99 1
608 FlamecastersBolt_Fireball 22752 0 99 1
609 StalkersBow_StalkersInsight 22753 0 99 1
610 StalkersBow_Ethereal 22754 0 99 1
611 Exordius_Guidance 22755 0 99 1
612 Exordius_Cure 22756 0 99 1
613 Exordius_Dismissal 22757 0 99 1
614 Caladbolg_Imprison 22758 0 99 1
615 HammerWitches_Detect 22759 0 99 1
616 HammerWitches_Spellbreaker 22760 0 99 1
617 HammerWitches_AMF 22761 0 99 1
618 HammerWitches_Dispel 22762 0 99 1
619 HammerWitches_Mantle 22763 0 99 1
620 SlingOfTheDireWind_StunningStone 22764 0 99 1
621 SlingOfTheDireWind_GustOfWind 22765 0 99 1
622 SlingOfTheDireWind_WindWall 22766 0 99 1
623 Treebrother_Shillelagh 22767 0 99 1
624 Treebrother_Charm_Plant 22768 0 99 1
625 Treebrother_Entangle 22769 0 99 1
626 Treebrother_Owls_Insight 22770 0 99 1
627 Treebrother_Changestaff 22771 0 99 1
628 FullMoonsTrick_Rage 22772 0 99 1
629 FullMoonsTrick_Invis 22773 0 99 1
630 FiendkillersFlail_Darkvis 22774 0 99 1
631 FiendkillersFlail_Detect 22775 0 99 1
632 ScalesBalance_Detect 22776 0 99 1
633 ScalesBalance_Cure 22777 0 99 1
634 ScalesBalance_Knell 22778 0 99 1
635 ScalesBalance_Enerv 22779 0 99 1
636 ScalesBalance_Heal 22780 0 99 1
637 ScalesBalance_Finger 22781 0 99 1
638 ShishiO_Charm 22782 0 99 1
639 ShishiO_Summon 22783 0 99 1
640 ShishiO_Poly 22784 0 99 1
641 ShishiO_Shout 22785 0 99 1
642 Dymondheart_ShedBolts 22786 0 99 1
643 Dymondheart_Deflect 22787 0 99 1
644 Dymondheart_Daylight 22788 0 99 1
645 Dymondheart_Cure 22789 0 99 1
646 Dymondheart_Banish 22790 0 99 1
647 Sunsword_Daylight 22791 0 99 1
648 Sunsword_Death_Ward 22792 0 99 1
649 Sunsword_Banish 22793 0 99 1
650 Sunsword_Undeath 22794 0 99 1
651 Blackrazor_Detect 22795 0 99 1
652 Blackrazor_Knell 22796 0 99 1
653 Blackrazor_Haste 22797 0 99 1
654 Ramethene_Detect 22798 0 99 1
655 Ramethene_Smite 22799 0 99 1
656 Ramethene_Resist_Elements 22800 0 99 1
657 Ramethene_Cloudkill 22801 0 99 1
658 Ramethene_SuddenMaximize 22802 0 99 1
659 Ramethene_Horrid_Wilting 22803 0 99 1
660 Wyrmbane_Cause_Fear 22804 0 99 1
661 Wyrmbane_Lightning_Bolt 22805 0 99 1
662 Wyrmbane_Sudden_Emp 22806 0 99 1
663 Wyrmbane_Breath_Lightning 22807 0 99 1
664 Whelm_Detect_Giant 22808 0 99 1
665 Whelm_Locate_Object 22809 0 99 1
666 Whelm_Detect_Goblin 22810 0 99 1
667 Ravenkind_Dancing_Lights 22811 0 99 1
668 Ravenkind_Light 22812 0 99 1
669 Ravenkind_Flare 22813 0 99 1
670 Ravenkind_Detect_Undead 22814 0 99 1
671 Ravenkind_Halt_Undead 22815 0 99 1
672 Ravenkind_Cure_Light_Wounds 22816 0 99 1
673 Ravenkind_Daylight 22817 0 99 1
674 Ravenkind_Death_Ward 22818 0 99 1
675 Ravenkind_Break_Enchantment 22819 0 99 1
676 Ravenkind_Mass_Heal 22820 0 99 1
677 LastCitadel_LeadingTheAttack 22821 0 99 1
678 LastCitadel_Prayer 22822 0 99 1
679 LastCitadel_Remove_Fear 22823 0 99 1
680 LastCitadel_Cure_Critical_Wounds 22824 0 99 1
681 LastCitadel_Blade_Barrier 22825 0 99 1
682 LastCitadel_Heal 22826 0 99 1
683 Unfettered_ChargingMinotaur 22827 0 99 1
684 Unfettered_ENLARGE_PERSON 22828 0 99 1
685 Unfettered_Etherealness 22829 0 99 1
686 Unfettered_Stoneskin 22830 0 99 1
687 Unfettered_Mordenkainens_Sword 22831 0 99 1
688 Hillcrusher_Earthen_Might 22832 0 99 1
689 Hillcrusher_Soften_Earth 22833 0 99 1
690 Hillcrusher_Fangs_of_Stone 22834 0 99 1
691 Hillcrusher_Raise_the_Earth 22835 0 99 1
692 Hillcrusher_Shake_the_Earth 22836 0 99 1
693 DesertWindToB_BurningBlade 22837 0 99 1
694 DesertWindToB_FanTheFlames 22838 0 99 1
695 DesertWindToB_WyrmsFlame 22839 0 99 1
696 Faithful_Detect_Evil 22840 0 99 1
697 Faithful_Lesser_Restoration 22841 0 99 1
698 Faithful_Restoration 22842 0 99 1
699 Faithful_Resiliency 22843 0 99 1
700 Faithful_ImmortalFortitude 22844 0 99 1
701 SupernalClarity_SapphireNightmareBlade 22845 0 99 1
702 SupernalClarity_PsychicPoise 22846 0 99 1
703 SupernalClarity_Haste 22847 0 99 1
704 SupernalClarity_Freeeeeedom 22848 0 99 1
705 SupernalClarity_Time_Stop 22849 0 99 1
706 Kamate_SteelWind 22850 0 99 1
707 Kamate_ShockingGrasp 22851 0 99 1
708 Kamate_Lightning_Bolt 22852 0 99 1
709 Kamate_Chain_Lightning 22853 0 99 1
710 Kamate_True_Strike 22854 0 99 1
711 Eventide_CometThrow 22855 0 99 1
712 Eventide_BafflingDefense 22856 0 99 1
713 Eventide_Improved_Invisibility 22857 0 99 1
714 Umbral_Invisibility 22858 0 99 1
715 Umbral_Shadowstep 22859 0 99 1
716 TigerFang_FrenziedCharge 22860 0 99 1
717 TigerFang_BattleFever 22861 0 99 1
718 TigerFang_Haste 22862 0 99 1
719 Bullybasher_KnockSilly 22863 0 99 1
720 Bullybasher_StoneGathering 22864 0 99 1
721 Bullybasher_LightningPunch 22865 0 99 1
722 Lorestealer_Read_Magic 22866 0 99 1
723 Lorestealer_DetectMagic 22867 0 99 1
724 Lorestealer_Axecasting 22868 0 99 1
725 Durindana_Daylight 22869 0 99 1
726 Durindana_Death_Ward 22870 0 99 1
727 Durindana_Hallow 22871 0 99 1
728 Durindana_Dazzle 22872 0 99 1
729 Thaas_Detect_Demon 22873 0 99 1
730 Thaas_ObstructSummoning 22874 0 99 1
731 Thaas_Banishment 22875 0 99 1
732 Thaas_Teleport 22876 0 99 1
733 Quickspur_Entropic_Shield 22877 0 99 1
734 Quickspur_Resist_Elements 22878 0 99 1
735 Quickspur_PhantomSteed 22879 0 99 1
736 Quickspur_Blur 22880 0 99 1
737 Quickspur_Stoneskin 22881 0 99 1
738 BES_FIRE_OF_THE_HEART 22882 0 99 1
739 BES_ENTHRALLING_LIGHT 22883 0 99 1
740 BES_COLOR_SPRAY 22884 0 99 1
741 BES_BLINDING_FLASH 22885 0 99 1
742 BES_SHOOTING_STARS 22886 0 99 1
743 BES_GLITTERING_MOTES 22887 0 99 1
744 BES_TWINKLE 22888 0 99 1
745 BES_SILVER_STARLIGHT 22889 0 99 1
746 BES_STARLIGHT_DISPELLING 22890 0 99 1
747 BES_TALES_IN_THE_SKY 22891 0 99 1
748 BES_CALL_DOWN_A_STAR 22892 0 99 1
749 ###cls_feat_allBaseClasses_END### **** **** **** ****
750 **** **** **** **** ****
751 ####START_OF_TOB_SPELLBOOK_RESERVE **** **** **** ****
752 Warblade_BlisteringFlourish 8417 0 99 1
753 Warblade_BurningBlade 8418 0 99 1
754 Warblade_BurningBrand 8419 0 99 1
755 Warblade_DeathMark 8420 0 99 1
756 Warblade_DesertTempest 8421 0 99 1
757 Warblade_DistractingEmber 8422 0 99 1
758 Warblade_DragonsFlame 8423 0 99 1
759 Warblade_FanTheFlames 8424 0 99 1
760 Warblade_FieryAssault 8425 0 99 1
761 Warblade_FireRiposte 8426 0 99 1
762 Warblade_Firesnake 8427 0 99 1
763 Warblade_FlamesBlessing 8428 0 99 1
764 Warblade_FlashingSun 8429 0 99 1
765 Warblade_HatchlingsFlame 8430 0 99 1
766 Warblade_HolocaustCloak 8431 0 99 1
767 Warblade_InfernoBlade 8432 0 99 1
768 Warblade_InfernoBlast 8433 0 99 1
769 Warblade_LeapingFlame 8434 0 99 1
770 Warblade_LingeringInferno 8435 0 99 1
771 Warblade_RingOfFire 8436 0 99 1
772 Warblade_RisingPhoenix 8437 0 99 1
773 Warblade_SalamanderCharge 8438 0 99 1
774 Warblade_SearingBlade 8439 0 99 1
775 Warblade_SearingCharge 8440 0 99 1
776 Warblade_WindStride 8441 0 99 1
777 Warblade_WyrmsFlame 8442 0 99 1
778 Warblade_ZephyrDance 8443 0 99 1
779 Warblade_AuraOfChaos 8444 0 99 1
780 Warblade_AuraOfPerfectOrder 8445 0 99 1
781 Warblade_AuraOfTriumph 8446 0 99 1
782 Warblade_AuraOfTyranny 8447 0 99 1
783 Warblade_CastigatingStrike 8448 0 99 1
784 Warblade_CrusadersStrike 8449 0 99 1
785 Warblade_DauntingStrike 8450 0 99 1
786 Warblade_DefensiveRebuke 8451 0 99 1
787 Warblade_DivineSurge 8452 0 99 1
788 Warblade_DivineSurgeGreater 8453 0 99 1
789 Warblade_DoomCharge 8454 0 99 1
790 Warblade_EntanglingBlade 8455 0 99 1
791 Warblade_Foehammer 8456 0 99 1
792 Warblade_ImmortalFortitude 8457 0 99 1
793 Warblade_IronGuardsGlare 8458 0 99 1
794 Warblade_LawBearer 8459 0 99 1
795 Warblade_MartialSpirit 8460 0 99 1
796 Warblade_RadiantCharge 8461 0 99 1
797 Warblade_RallyingStrike 8462 0 99 1
798 Warblade_RevitalizingStrike 8463 0 99 1
799 Warblade_ShieldBlock 8464 0 99 1
800 Warblade_ShieldCounter 8465 0 99 1
801 Warblade_StrikeOfRighteousVitality 8466 0 99 1
802 Warblade_ThicketOfBlades 8467 0 99 1
803 Warblade_TideOfChaos 8468 0 99 1
804 Warblade_VanguardStrike 8469 0 99 1
805 Warblade_ActionBeforeThought 8470 0 99 1
806 Warblade_AvalancheOfBlades 8471 0 99 1
807 Warblade_BoundingAssault 8472 0 99 1
808 Warblade_DiamondDefense 8473 0 99 1
809 Warblade_DiamondNightmareBlade 8474 0 99 1
810 Warblade_DisruptingBlow 8475 0 99 1
811 Warblade_EmeraldRazor 8476 0 99 1
812 Warblade_HearingTheAir 8477 0 99 1
813 Warblade_InsightfulStrike 8478 0 99 1
814 Warblade_InsightfulStrikeGreater 8479 0 99 1
815 Warblade_MindOverBody 8480 0 99 1
816 Warblade_MindStrike 8481 0 99 1
817 Warblade_MomentOfAlacrity 8482 0 99 1
818 Warblade_MomentOfPerfectMind 8483 0 99 1
819 Warblade_PearlOfBlackDoubt 8484 0 99 1
820 Warblade_QuicksilverMotion 8485 0 99 1
821 Warblade_RapidCounter 8486 0 99 1
822 Warblade_RubyNightmareBlade 8487 0 99 1
823 Warblade_SapphireNightmareBlade 8488 0 99 1
824 Warblade_StanceOfAlacrity 8489 0 99 1
825 Warblade_StanceOfClarity 8490 0 99 1
826 Warblade_TimeStandsStill 8491 0 99 1
827 Warblade_AbsoluteSteel 8492 0 99 1
828 Warblade_AdamantineHurricane 8493 0 99 1
829 Warblade_DancingBladeForm 8494 0 99 1
830 Warblade_DazingStrike 8495 0 99 1
831 Warblade_DisarmingStrike 8496 0 99 1
832 Warblade_ExorcismOfSteel 8497 0 99 1
833 Warblade_FinishingMove 8498 0 99 1
834 Warblade_IronHeartEndurance 8499 0 99 1
835 Warblade_IronHeartFocus 8500 0 99 1
836 Warblade_IronHeartSurge 8501 0 99 1
837 Warblade_LightningRecovery 8502 0 99 1
838 Warblade_LightningThrow 8503 0 99 1
839 Warblade_ManticoreParry 8504 0 99 1
840 Warblade_MithralTornado 8505 0 99 1
841 Warblade_PunishingStance 8506 0 99 1
842 Warblade_ScythingBlade 8507 0 99 1
843 Warblade_SteelWind 8508 0 99 1
844 Warblade_SteelyStrike 8509 0 99 1
845 Warblade_StrikeOfPerfectClarity 8510 0 99 1
846 Warblade_SupremeBladeParry 8511 0 99 1
847 Warblade_WallOfBlades 8512 0 99 1
848 Warblade_BafflingDefense 8513 0 99 1
849 Warblade_BallistaThrow 8514 0 99 1
850 Warblade_CleverPositioning 8515 0 99 1
851 Warblade_CometThrow 8516 0 99 1
852 Warblade_CounterCharge 8517 0 99 1
853 Warblade_DevastatingThrow 8518 0 99 1
854 Warblade_FeignedOpening 8519 0 99 1
855 Warblade_FoolsStrike 8520 0 99 1
856 Warblade_GhostlyDefense 8521 0 99 1
857 Warblade_GiantKillingStyle 8522 0 99 1
858 Warblade_HydraSlayingStrike 8523 0 99 1
859 Warblade_MightyThrow 8524 0 99 1
860 Warblade_MirroredPursuit 8525 0 99 1
861 Warblade_ScorpionParry 8526 0 99 1
862 Warblade_ShiftingDefense 8527 0 99 1
863 Warblade_SoaringThrow 8528 0 99 1
864 Warblade_StalkingShadow 8529 0 99 1
865 Warblade_StepOfTheWind 8530 0 99 1
866 Warblade_StrikeOfTheBrokenShield 8531 0 99 1
867 Warblade_TornadoThrow 8532 0 99 1
868 Warblade_AssassinsStance 8533 0 99 1
869 Warblade_BalanceOnTheSky 8534 0 99 1
870 Warblade_BloodlettingStrike 8535 0 99 1
871 Warblade_ChildOfShadow 8536 0 99 1
872 Warblade_ClingingShadowStrike 8537 0 99 1
873 Warblade_CloakOfDeception 8538 0 99 1
874 Warblade_DanceOfTheSpider 8539 0 99 1
875 Warblade_DeathInTheDark 8540 0 99 1
876 Warblade_DrainVitality 8541 0 99 1
877 Warblade_EnervatingShadowStrike 8542 0 99 1
878 Warblade_FiveShadowCreepingIceEnervationStrike 8543 0 99 1
879 Warblade_GhostBlade 8544 0 99 1
880 Warblade_HandOfDeath 8545 0 99 1
881 Warblade_IslandOfBlades 8546 0 99 1
882 Warblade_ObscuringShadowVeil 8547 0 99 1
883 Warblade_OneWithShadow 8548 0 99 1
884 Warblade_ShadowBladeTechnique 8549 0 99 1
885 Warblade_ShadowBlink 8550 0 99 1
886 Warblade_ShadowGarrote 8551 0 99 1
887 Warblade_ShadowJaunt 8552 0 99 1
888 Warblade_ShadowNoose 8553 0 99 1
889 Warblade_ShadowStride 8554 0 99 1
890 Warblade_StalkerInTheNight 8555 0 99 1
891 Warblade_StepOfTheDancingMoth 8556 0 99 1
892 Warblade_StrengthDrainingStrike 8557 0 99 1
893 Warblade_AdamantineBones 8558 0 99 1
894 Warblade_AncientMountainHammer 8559 0 99 1
895 Warblade_BonesplittingStrike 8560 0 99 1
896 Warblade_Bonecrusher 8561 0 99 1
897 Warblade_BoulderRoll 8562 0 99 1
898 Warblade_ChargingMinotaur 8563 0 99 1
899 Warblade_ColossusStrike 8564 0 99 1
900 Warblade_CrushingVise 8565 0 99 1
901 Warblade_CrushingWeightOfTheMountain 8566 0 99 1
902 Warblade_EarthstrikeQuake 8567 0 99 1
903 Warblade_ElderMountainHammer 8568 0 99 1
904 Warblade_GiantsStance 8569 0 99 1
905 Warblade_IronBones 8570 0 99 1
906 Warblade_IrresistibleMountainStrike 8571 0 99 1
907 Warblade_MountainAvalanche 8572 0 99 1
908 Warblade_MountainHammer 8573 0 99 1
909 Warblade_MountainTombstoneStrike 8574 0 99 1
910 Warblade_OverwhelmingMountainStrike 8575 0 99 1
911 Warblade_RootsOfTheMountain 8576 0 99 1
912 Warblade_StoneBones 8577 0 99 1
913 Warblade_StoneDragonsFury 8578 0 99 1
914 Warblade_StoneVise 8579 0 99 1
915 Warblade_StonefootStance 8580 0 99 1
916 Warblade_StrengthOfStone 8581 0 99 1
917 Warblade_BloodInTheWater 8582 0 99 1
918 Warblade_ClawAtTheMoon 8583 0 99 1
919 Warblade_DancingMongoose 8584 0 99 1
920 Warblade_DeathFromAbove 8585 0 99 1
921 Warblade_FeralDeathBlow 8586 0 99 1
922 Warblade_FleshRipper 8587 0 99 1
923 Warblade_FountainOfBlood 8588 0 99 1
924 Warblade_GirallonWindmillFleshRip 8589 0 99 1
925 Warblade_HamstringAttack 8590 0 99 1
926 Warblade_HuntersSense 8591 0 99 1
927 Warblade_LeapingDragonStance 8592 0 99 1
928 Warblade_PouncingCharge 8593 0 99 1
929 Warblade_PreyOnTheWeak 8594 0 99 1
930 Warblade_RabidBearStrike 8595 0 99 1
931 Warblade_RabidWolfStrike 8596 0 99 1
932 Warblade_RagingMongoose 8597 0 99 1
933 Warblade_SoaringRaptorStrike 8598 0 99 1
934 Warblade_SuddenLeap 8599 0 99 1
935 Warblade_SwoopingDragonStrike 8600 0 99 1
936 Warblade_WolfClimbsTheMountain 8601 0 99 1
937 Warblade_WolfFangStrike 8602 0 99 1
938 Warblade_WolfPackTactics 8603 0 99 1
939 Warblade_WolverineStance 8604 0 99 1
940 Warblade_BattleLeadersCharge 8605 0 99 1
941 Warblade_BolsteringVoice 8606 0 99 1
942 Warblade_ClarionCall 8607 0 99 1
943 Warblade_CoveringStrike 8608 0 99 1
944 Warblade_DouseTheFlames 8609 0 99 1
945 Warblade_FlankingManeuver 8610 0 99 1
946 Warblade_LeadingTheAttack 8611 0 99 1
947 Warblade_LeadingTheCharge 8612 0 99 1
948 Warblade_LionsRoar 8613 0 99 1
949 Warblade_OrderForgedFromChaos 8614 0 99 1
950 Warblade_PressTheAdvantage 8615 0 99 1
951 Warblade_SwarmTactics 8616 0 99 1
952 Warblade_SwarmingAssault 8617 0 99 1
953 Warblade_TacticalStrike 8618 0 99 1
954 Warblade_TacticsOfTheWolf 8619 0 99 1
955 Warblade_WarLeadersCharge 8620 0 99 1
956 Warblade_WarMastersCharge 8621 0 99 1
957 Warblade_WhiteRavenHammer 8622 0 99 1
958 Warblade_WhiteRavenStrike 8623 0 99 1
959 Warblade_WhiteRavenTactics 8624 0 99 1
960 **** **** **** **** ****
961 ####END_OF_TOB_SPELLBOOK_RESERVE **** **** **** ****

File diff suppressed because it is too large Load Diff

View File

@@ -1,151 +0,0 @@
//::///////////////////////////////////////////////
//:: Name Forsaker
//:: FileName prc_forsaker.nss
//:: Created By: Stratosvarious
//:: Edited By: Fencas
//:://////////////////////////////////////////////
#include "prc_inc_combat"
#include "inc_dynconv"
#include "prc_class_const"
#include "prc_alterations"
#include "prc_ipfeat_const"
#include "nw_i0_spells"
void main()
{
object oPC = OBJECT_SELF;
object oItem;
object oArmor;
object oShield;
object oSkin = GetPCSkin(oPC);
int nSlot;
int nClass = GetLevelByClass(CLASS_TYPE_FORSAKER, oPC);
int nClassCheck;
int nBonus = nClass/2;
int nRegen = 1 + nClass/4;
int nSR = 10 + nClass;
int nEvent = GetCurrentlyRunningEvent();
// We aren't being called from any event, instead from EvalPRCFeats
if(nEvent == FALSE)
{
//Check if level up bonus has already been chosen and given for any of past Forsaker levels
for(nClassCheck=1; nClassCheck <= nClass; nClassCheck++)
{
if(!GetPersistantLocalInt(oPC, "ForsakerBoost"+IntToString(nClassCheck)))
{
//Level up box for stat bonus
AssignCommand(oPC, ClearAllActions(TRUE));
SetPersistantLocalInt(oPC,"ForsakerBoostCheck",nClassCheck);
StartDynamicConversation("prc_forsake_abil", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
}
}
//Fast healing 1 (+1 each 4 levels)
SetCompositeBonus(oSkin,"ForsakerFH",nRegen,ITEM_PROPERTY_REGENERATION);
//SR = 10 + Forsaker level
IPSafeAddItemProperty(oSkin, ItemPropertyBonusSpellResistance(GetSRByValue(nSR)), 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
//DR starting on level 2 = (level+1)/(Level/2)
if (nClass >=2) ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectDamageReduction((nClass+1),(nClass/2)),oPC);
//Natural AC increase by CON starting on level 3
if (nClass >= 3)
{
effect eEffect1 = EffectACIncrease(GetAbilityModifier(ABILITY_CONSTITUTION, oPC), AC_NATURAL_BONUS);
eEffect1 = ExtraordinaryEffect(eEffect1);
eEffect1 = TagEffect(eEffect1, "EffectToughDefense");
//Remove any prior bonus to avoid duplication
effect eCheckEffect = GetFirstEffect(oPC);
while (GetIsEffectValid(eCheckEffect))
{
if(GetEffectTag(eCheckEffect) == "EffectToughDefense") RemoveEffect(oPC, eCheckEffect);
eCheckEffect = GetNextEffect(oPC);
}
//Give player the bonus
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect1, oPC);
}
// For some reason, EVENT_ONPLAYEREQUIPITEM just works with weapons, so armors and shields should be checked elsewhere
if(!GetHasFeat(FEAT_VOWOFPOVERTY,oPC))
{
for (nSlot=0; nSlot < 13; nSlot++) //All but creatures slots
{
oItem=GetItemInSlot(nSlot, oPC);
//Check if it is magical
if(GetIsItemPropertyValid(GetFirstItemProperty(oItem)) && !(GetItemPropertyTag(GetFirstItemProperty(oItem)) == "Tag_PRC_OnHitKeeper"))
{
AssignCommand(oPC, ClearAllActions(TRUE));
AssignCommand(oPC, ActionUnequipItem(oItem));
FloatingTextStringOnCreature(GetName(oItem)+" is a magical item!", oPC, FALSE);
}
}
if(GetIsUnarmed(oPC) && (nClass >= 3)) //If it is unarmed, give DR bypass
{
ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectAttackIncrease(nBonus),oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,EffectAttackDecrease(nBonus),oPC);
//Remove last weapon(s) bonus
oItem = GetPCItemLastUnequipped();
if((IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem)))
{
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ATTACK_BONUS, -1, -1, 1, "", -1, DURATION_TYPE_TEMPORARY);
RemoveSpecificProperty(oItem, ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER, -1, -1, 1, "", -1, DURATION_TYPE_TEMPORARY);
}
}
}
// Hook in the events
AddEventScript(oPC, EVENT_SCRIPT_MODULE_ON_EQUIP_ITEM, "prc_forsaker", TRUE, FALSE);
}
// We are called from the OnPlayerEquipItem eventhook. Add OnHitCast: Unique Power to oPC's weapon
else if((nEvent == EVENT_SCRIPT_MODULE_ON_EQUIP_ITEM) && (!GetHasFeat(FEAT_VOWOFPOVERTY,oPC)))
{
oItem = GetPCItemLastEquipped();
//Check if the magic is JUST Sanctify
int iMagic = 0;
itemproperty eCheckIP = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(eCheckIP))
{
if(!(GetItemPropertyTag(eCheckIP) == "Sanctify1") && !(GetItemPropertyTag(eCheckIP) == "Sanctify2") && !(GetItemPropertyTag(eCheckIP) == "Sanctify3")
&& !(GetItemPropertyTag(eCheckIP) == "Sanctify4")) iMagic = 1;
eCheckIP = GetNextItemProperty(oItem);
}
//Check if weapons are magical
if(iMagic && (IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem)) &&
!(GetBaseItemType(oItem) == BASE_ITEM_SLING && GetItemPropertyType(GetFirstItemProperty(oItem)) == ITEM_PROPERTY_MIGHTY))
//Check if weapon is magical or not on allowed list
{
AssignCommand(oPC, ClearAllActions(TRUE));
AssignCommand(oPC, ActionUnequipItem(oItem));
FloatingTextStringOnCreature(GetName(oItem)+" is a magical item!", oPC, FALSE);
}
else
{
if(nClass>=3)
{
//Give bonus to weapon(s)
IPSafeAddItemProperty(oItem, ItemPropertyAttackBonus(nBonus), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
IPSafeAddItemProperty(oItem, ItemPropertyAttackPenalty(nBonus), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
//Remove unarmed bonus
effect eLoop = GetFirstEffect(oPC);
while(GetIsEffectValid(eLoop))
{
if(GetEffectType(eLoop) == EFFECT_TYPE_ATTACK_INCREASE
|| GetEffectType(eLoop) == EFFECT_TYPE_ATTACK_DECREASE) RemoveEffect(oPC,eLoop);
eLoop = GetNextEffect(oPC);
}
}
}
}
}

View File

@@ -1,237 +0,0 @@
//::///////////////////////////////////////////////
//:: Name Vow of Poverty
//:: FileName ft_vowofpoverty.nss
//:: Created By: Fencas
//:: Created On: 2024-12-02
//:: Based On: Stratovarius' Forsaker
//:://////////////////////////////////////////////
#include "prc_inc_combat"
#include "inc_dynconv"
#include "prc_class_const"
#include "prc_inc_clsfunc"
#include "prc_alterations"
#include "NW_I0_GENERIC"
#include "nw_i0_spells"
#include "inc_persist_loca"
effect VoPDamage(int nTotalEnhancement)
{
effect eDamage;
if (nTotalEnhancement>=15) eDamage = EffectDamageIncrease(DAMAGE_BONUS_15,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=14) eDamage = EffectDamageIncrease(DAMAGE_BONUS_14,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=13) eDamage = EffectDamageIncrease(DAMAGE_BONUS_13,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=12) eDamage = EffectDamageIncrease(DAMAGE_BONUS_12,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=11) eDamage = EffectDamageIncrease(DAMAGE_BONUS_11,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=10) eDamage = EffectDamageIncrease(DAMAGE_BONUS_10,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=9) eDamage = EffectDamageIncrease(DAMAGE_BONUS_9,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=8) eDamage = EffectDamageIncrease(DAMAGE_BONUS_8,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=7) eDamage = EffectDamageIncrease(DAMAGE_BONUS_7,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=6) eDamage = EffectDamageIncrease(DAMAGE_BONUS_6,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=5) eDamage = EffectDamageIncrease(DAMAGE_BONUS_5,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=4) eDamage = EffectDamageIncrease(DAMAGE_BONUS_4,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=3) eDamage = EffectDamageIncrease(DAMAGE_BONUS_3,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=2) eDamage = EffectDamageIncrease(DAMAGE_BONUS_2,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
else if (nTotalEnhancement>=1) eDamage = EffectDamageIncrease(DAMAGE_BONUS_1,DAMAGE_TYPE_BLUDGEONING || DAMAGE_TYPE_SLASHING || DAMAGE_TYPE_PIERCING);
return eDamage;
}
void main()
{
object oPC;
oPC = OBJECT_SELF;
object oItem;
object oArmor;
object oShield;
object oSkin = GetPCSkin(oPC);
int nEvent = GetCurrentlyRunningEvent();
int nLevel = GetCharacterLevel(oPC)-GetPersistantLocalInt(oPC,"VoPLevel1")+1;
int nACArmor = 4+nLevel/3;
int nACDeflection = nLevel/6;
int nACNatural = nLevel/8;
int nRegen = 1+(nLevel-17)/7;
int nDR = 5*(1+(nLevel-10)/9);
int nER = (10*(1+(nLevel-13)/7))-5;
int nResist = 0;//Resistance (Ex): At 7th level, an ascetic gains a +1 resistance bonus on all saving throws. This bonus increases to +2 at 13th level, and to +3 at 17th level.
if (nLevel >= 17) nResist = 1 + (nLevel - 7) / 5;
else if (nLevel >= 13) nResist = 2;
else if (nLevel >= 7) nResist = 1;
int nForsakerBonus = GetLevelByClass(CLASS_TYPE_FORSAKER, oPC)/2;
int nSlot, nLevelCheck, nExaltedStrike, nTotalEnhancement;
//Enhancement bonus for unarmed damage and weapons; consider the bigger, Forsaker or VoP
if(nLevel>=10) nExaltedStrike = 1+(nLevel-7)/3;
else if(nLevel>=4) nExaltedStrike = 1;
if(nForsakerBonus>=nExaltedStrike) nTotalEnhancement = nForsakerBonus;
else nTotalEnhancement = nExaltedStrike;
// We aren't being called from any event, instead from EvalPRCFeats
if(nEvent == FALSE)
{
//Check if level up bonus has already been chosen and given for any of past VoP levels
for(nLevelCheck=1; nLevelCheck <= nLevel; nLevelCheck++)
{
//Call stat boost dialogue for level 7 and each 4 levels after that
if (!GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) && (nLevelCheck-(nLevelCheck/4)*4 == 3) && (nLevelCheck >= 7) && (nLevelCheck <= 27))
{
AssignCommand(oPC, ClearAllActions(TRUE));
SetPersistantLocalInt(oPC,"VoPBoostCheck",nLevelCheck);
StartDynamicConversation("ft_vowpoverty_ab", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
}
//Applying stat boosts
if(GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) >= 10)
{
int stat = GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) - 10;
int value = 2 * (1 + (nLevel - nLevelCheck) / 4);
SetCompositeBonus(oSkin, "VoPBoostStat"+IntToString(stat), value, ITEM_PROPERTY_ABILITY_BONUS, stat);
}
//Call exalted feat for each even level
if (!GetPersistantLocalInt(oPC, "VoPFeat"+IntToString(nLevelCheck)) && (nLevelCheck-(nLevelCheck/2)*2 == 0))
{
AssignCommand(oPC, ClearAllActions(TRUE));
SetPersistantLocalInt(oPC,"VoPFeatCheck",nLevelCheck);
StartDynamicConversation("ft_vowpoverty_ft", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
}
}
//AC Armor +4 on 1st, then +1 each 3 levels
ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectACIncrease(nACArmor, AC_ARMOUR_ENCHANTMENT_BONUS)), oPC);
//Deflection Armor +1 each 6 levels
ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectACIncrease(nACDeflection, AC_DEFLECTION_BONUS)), oPC);
//Resistance (Ex): At 7th level, an ascetic gains a +1 resistance bonus on all saving throws. This bonus increases to +2 at 13th level, and to +3 at 17th level.
if (nLevel>=7)
{
SetCompositeBonus(oSkin, "VoPResist", nResist, ITEM_PROPERTY_SAVING_THROW_BONUS, SAVING_THROW_ALL);
}
//Natural Armor +1 each 8 levels
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(EffectACIncrease(nACNatural, AC_NATURAL_BONUS)), oPC);
//DR 5/Enhancement starting 10, +5 each 9 levels
if (nLevel >= 10) ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectDamageReduction(nDR,nTotalEnhancement)),oPC);
//Energy resistance 5 for acid, cold ,electrical, fire and sonic on 13th, than +10 each 7 levels
if (nLevel>=13)
{
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_ACID, nER, 0, FALSE), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_COLD, nER, 0, FALSE), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, nER, 0, FALSE), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_FIRE, nER, 0, FALSE), oPC);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectDamageResistance(DAMAGE_TYPE_SONIC, nER, 0, FALSE), oPC);
}
//Freedom of Movement at 14th
if (nLevel>=14) IPSafeAddItemProperty(oSkin, ItemPropertyFreeAction(), 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, TRUE, TRUE);
//Regeneration 1 at 17th, +1 at each 7 levels
if (nLevel>=17) SetCompositeBonus(oSkin, "VoPFH", nRegen, ITEM_PROPERTY_REGENERATION);
//True Seeing at 18th
if (nLevel>=18) IPSafeAddItemProperty(oSkin, ItemPropertyTrueSeeing(), 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, TRUE, TRUE);
// Exalted Strike - only applies to weapons or unarmed
effect eEffect1 = EffectAttackIncrease(nTotalEnhancement);
effect eEffect2 = VoPDamage(nTotalEnhancement);
effect eLink = EffectLinkEffects(eEffect1,eEffect2);
eLink = SupernaturalEffect(eLink);
eLink = TagEffect(eLink, "EffectExaltedStrike");
//Remove any prior bonus to avoid duplication
effect eCheckEffect = GetFirstEffect(oPC);
while (GetIsEffectValid(eCheckEffect))
{
if(GetEffectTag(eCheckEffect) == "EffectExaltedStrike") RemoveEffect(oPC, eCheckEffect);
eCheckEffect = GetNextEffect(oPC);
}
//Give player the bonus, regardless of the weapon
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
// For some reason, EVENT_ONPLAYEREQUIPITEM just works with weapons, so it is better to check all other items for magic elsewhere
for (nSlot=0; nSlot < 13; nSlot++) //All but creatures slots
{
oItem=GetItemInSlot(nSlot, oPC);
if (!(GetTag(oItem) == "xp1_mystrashand")
&& !(GetTag(oItem) == "H2_SenseiAmulet")
&& !(GetResRef(oItem) == "prc_sk_mblade_bs")
&& !(GetResRef(oItem) == "prc_sk_mblade_th")
&& !(GetResRef(oItem) == "prc_sk_mblade_ss")
&& !(GetResRef(oItem) == "prc_sk_mblade_ls"))
{
if((GetIsItemPropertyValid(GetFirstItemProperty(oItem)) && !(GetItemPropertyTag(GetFirstItemProperty(oItem)) == "Tag_PRC_OnHitKeeper")
&& !(nSlot == 4 || nSlot == 5)) //Check if it is magical (all items but on the hands)
|| (nSlot == 1 && GetBaseAC(oItem) >= 1) //Check if it is an armor (AC>0)
|| (nSlot == 5 && GetBaseItemType(oItem) == BASE_ITEM_SMALLSHIELD || //Check if it is a shield
GetBaseItemType(oItem) == BASE_ITEM_LARGESHIELD ||
GetBaseItemType(oItem) == BASE_ITEM_TOWERSHIELD))
{
AssignCommand(oPC, ClearAllActions(TRUE));
AssignCommand(oPC, ActionUnequipItem(oItem));
FloatingTextStringOnCreature(GetName(oItem)+" would break your vow!", oPC, FALSE);
}
}
}
//Remove bonus from unequiped weapons
oItem = GetPCItemLastUnequipped();
if(IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem)) IPRemoveAllItemProperties(oItem, DURATION_TYPE_PERMANENT);
AddEventScript(oPC, EVENT_SCRIPT_MODULE_ON_EQUIP_ITEM, "ft_vowofpoverty", TRUE, FALSE);
}
// We are called from the OnPlayerUnEquipItem eventhook. Remove OnHitCast: Unique Power from oPC's weapon
else if(nEvent == EVENT_SCRIPT_MODULE_ON_EQUIP_ITEM)
{
oItem = GetPCItemLastEquipped();
int iWeaponAllowed = GetBaseItemType(oItem) == BASE_ITEM_CLUB
|| GetBaseItemType(oItem) == BASE_ITEM_DAGGER
|| GetBaseItemType(oItem) == BASE_ITEM_DART
|| GetBaseItemType(oItem) == BASE_ITEM_HEAVYCROSSBOW
|| GetBaseItemType(oItem) == BASE_ITEM_LIGHTCROSSBOW
|| GetBaseItemType(oItem) == BASE_ITEM_LIGHTMACE
|| GetBaseItemType(oItem) == BASE_ITEM_MORNINGSTAR
|| GetBaseItemType(oItem) == BASE_ITEM_QUARTERSTAFF
|| GetBaseItemType(oItem) == BASE_ITEM_SICKLE
|| GetBaseItemType(oItem) == BASE_ITEM_SLING
|| GetBaseItemType(oItem) == BASE_ITEM_SHORTSPEAR
|| GetBaseItemType(oItem) == BASE_ITEM_BOLT
|| GetBaseItemType(oItem) == BASE_ITEM_GOAD
|| GetBaseItemType(oItem) == BASE_ITEM_KATAR
|| GetBaseItemType(oItem) == BASE_ITEM_HEAVY_MACE
|| GetBaseItemType(oItem) == BASE_ITEM_BULLET;
//Check if the magic is JUST Sanctify
int iMagic = 0;
itemproperty eCheckIP = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(eCheckIP))
{
if(!(GetItemPropertyTag(eCheckIP) == "Sanctify1") && !(GetItemPropertyTag(eCheckIP) == "Sanctify2") && !(GetItemPropertyTag(eCheckIP) == "Sanctify3")
&& !(GetItemPropertyTag(eCheckIP) == "Sanctify4")) iMagic = 1;
eCheckIP = GetNextItemProperty(oItem);
}
if (!(GetTag(oItem) == "xp1_mystrashand")
&& !(GetTag(oItem) == "H2_SenseiAmulet")
&& !(GetResRef(oItem) == "prc_sk_mblade_bs")
&& !(GetResRef(oItem) == "prc_sk_mblade_th")
&& !(GetResRef(oItem) == "prc_sk_mblade_ss")
&& !(GetResRef(oItem) == "prc_sk_mblade_ls"))
{
if((IPGetIsMeleeWeapon(oItem) || GetWeaponRanged(oItem)) && (iMagic || !iWeaponAllowed)) //Check if weapon is magical or not on allowed list
{
if(!(GetBaseItemType(oItem) == BASE_ITEM_SLING && GetItemPropertyType(GetFirstItemProperty(oItem)) == ITEM_PROPERTY_MIGHTY)) //Allow Mighty Bonus on Slings
{
AssignCommand(oPC, ClearAllActions(TRUE));
AssignCommand(oPC, ActionUnequipItem(oItem));
FloatingTextStringOnCreature(GetName(oItem)+" would break your vow!", oPC, FALSE);
}
}
}
}
}

View File

@@ -1,171 +0,0 @@
//::////////////////////////////////////////////////////////
//:: ;-. ,-. ,-. ,-.
//:: | ) | ) / ( )
//:: |-' |-< | ;-:
//:: | | \ \ ( )
//:: ' ' ' `-' `-'
//::///////////////////////////////////////////////////////
//::
/*
Impactscript for Shadow Servant.
(this is handled in the Familiar script)
Shadow Servant (Su): At 1st level, your shadow familiar permanently
transforms into a Medium shadow elemental. It loses all familiar
traits, but gains new abilities as your shadow servant.
Should your shadow servant die, you can summon a replacement after
24 hours pass. Your shadow servant cannot travel farther from you
than 30 feet + 10 feet for each of your master of shadow levels
(40 feet at 1st level and a maximum of 130 feet at 10th level). If
it is forcibly separated from you by more than this distance, the
servant dissipates instantly, and you must wait 24 hours to summon
a new one.
*/
//::
//:://////////////////////////////////////////////
//:: Script: mshadw_shadserv.nss
//:: Author: Jaysyn
//:: Created: 2025-11-11 19:25:58
//:://////////////////////////////////////////////
#include "prc_inc_json"
#include "prc_inc_spells"
const string SHADOW_SERVANT_RESREF = "prc_shadow_serv";
// Watch function: despawns Shadow Servant if master is dead or out of range
void ShadowServantWatch(object oShadow, object oPC)
{
if(DEBUG) DoDebug("mshadw_shadserv >> ShadowServantWatch: Starting function.");
int nMaster = GetLevelByClass(CLASS_TYPE_MASTER_OF_SHADOW, oPC);
float fRange = 30.0 + (nMaster * 10);
if (!GetIsObjectValid(oShadow) || !GetIsObjectValid(oPC)) return;
if (GetIsDead(oPC) ||
GetDistanceBetween(oShadow, oPC) > FeetToMeters(fRange))
{
DestroyObject(oShadow);
return;
}
DelayCommand(1.0, ShadowServantWatch(oShadow, oPC));
}
void main()
{
object oPC = OBJECT_SELF;
int nMaster = GetLevelByClass(CLASS_TYPE_MASTER_OF_SHADOW, oPC);
int nDexBonus = (nMaster >= 5 && (nMaster % 2)) ? (nMaster - 3) : 0;
float fRange = 30.0 + (nMaster * 10);
// Target location
location lTarget = PRCGetSpellTargetLocation();
// Distance check
if (GetDistanceBetweenLocations(GetLocation(oPC), lTarget) > FeetToMeters(fRange))
{
SendMessageToPC(oPC, "That location is too far away.");
return;
}
// Load template
json jShadow = TemplateToJson(SHADOW_SERVANT_RESREF, RESTYPE_UTC);
if (jShadow == JSON_NULL)
{
SendMessageToPC(oPC, "mshdw_shadserv: TemplateToJson failed <20> bad resref or resource missing.");
return;
}
// Original HD
int nOriginalHD = json_GetCreatureHD(jShadow);
if (nOriginalHD <= 0)
{
SendMessageToPC(oPC, "mshdw_shadserv: json_GetCreatureHD failed <20> template missing HD data.");
return;
}
//:: Add Hit Dice
int nHDToAdd = nMaster -1;
if (nHDToAdd < 0) nHDToAdd = 0;
jShadow = json_AddHitDice(jShadow, nHDToAdd);
if (jShadow == JSON_NULL)
{
SendMessageToPC(oPC, "mshdw_shadserv: json_AddHitDice failed - JSON became invalid.");
return;
}
//:: Update feats
jShadow = json_AddFeatsFromCreatureVars(jShadow, nOriginalHD);
if (jShadow == JSON_NULL)
{
SendMessageToPC(oPC, "mshdw_shadserv: json_AddFeatsFromCreatureVars failed <20> JSON became invalid.");
return;
}
//:: Update stats
jShadow = json_ApplyAbilityBoostFromHD(jShadow, nOriginalHD);
if (jShadow == JSON_NULL)
{
SendMessageToPC(oPC, "mshdw_shadserv: json_ApplyAbilityBoostFromHD failed <20> JSON became invalid.");
return;
}
//:: Bonus DEX from Shadow Servant class ability
jShadow = json_UpdateTemplateStats(jShadow, 0, nDexBonus);
// Size increase
if (nMaster > 2)
{
jShadow = json_AdjustCreatureSize(jShadow, 1, TRUE);
if (jShadow == JSON_NULL)
{
SendMessageToPC(oPC, "mshdw_shadserv: json_AdjustCreatureSize failed - JSON became invalid.");
return;
}
}
//:: One skill point per HD
jShadow = json_AdjustCreatureSkillByID(jShadow, SKILL_SPOT, nHDToAdd);
if (jShadow == JSON_NULL)
{
DoDebug("mdshdw_shadserv >> json_AdjustCreatureSkillByID failed <20> JSON became invalid.");
return;
}
object oShadow = JsonToObject(jShadow, lTarget);
effect eSummon = ExtraordinaryEffect(EffectSummonCreature("", VFX_FNF_SUMMON_UNDEAD, 0.0, 0, VFX_IMP_UNSUMMON, oShadow));
ApplyEffectAtLocation(DURATION_TYPE_PERMANENT, eSummon, lTarget);
if (!GetIsObjectValid(oShadow))
{
SendMessageToPC(oPC, "mshdw_shadserv: JsonToObject failed - could not create creature from edited template.");
return;
}
// Set faction to caster<65>s
ChangeFaction(oShadow, oPC);
SetLocalObject(oShadow, "ANIMATOR", oPC);
SetCurrentHitPoints(oShadow, GetMaxPossibleHP(oShadow));
effect eGhost = EffectVisualEffect(VFX_DUR_GHOST_TRANSPARENT);
eGhost = UnyieldingEffect(eGhost);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oShadow);
// Start watch loop
DelayCommand(6.1, ShadowServantWatch(oShadow, oPC));
}

View File

@@ -1,682 +0,0 @@
//:://////////////////////////////////////////////
//:: Alternate magic system gain evaluation script
//:: prc_amagsys_gain
//:://////////////////////////////////////////////
/** @file
This file determines if the given character
has gained new spells / powers / utterances /
whathaveyou since the last time it was run.
If so, it starts the relevant selection
conversations.
Add new classes to their respective magic
user type block, or if such doesn't exist
yet for the system the class belongs to,
make a new block for them at the end of main().
@author Ornedan
@date Created - 2006.12.14
*/
//:://////////////////////////////////////////////
//:: Updated for .35 by Jaysyn 2023/03/11
//:://////////////////////////////////////////////
#include "inc_dynconv"
#include "psi_inc_psifunc"
#include "inc_newspellbook"
#include "true_inc_trufunc"
#include "tob_inc_tobfunc"
#include "shd_inc_shdfunc"
#include "inv_inc_invfunc"
#include "prc_nui_lv_inc"
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
void CheckSpellbooks(object oPC);
void CheckPsionics(object oPC);
void CheckInvocations(object oPC);
void CheckToB(object oPC);
void CheckShadow(object oPC);
void CheckTruenaming(object oPC);
int CheckMissingPowers(object oPC, int nClass);
int CheckMissingSpells(object oPC, int nClass, int nMinLevel, int nMaxLevel);
int CheckMissingUtterances(object oPC, int nClass, int nLexicon);
int CheckMissingManeuvers(object oPC, int nClass);
int CheckMissingMysteries(object oPC, int nClass);
int CheckMissingInvocations(object oPC, int nClass);
void AMSCompatibilityCheck(object oPC);
//////////////////////////////////////////////////
/* Function definitions */
//////////////////////////////////////////////////
void main()
{
object oPC = OBJECT_SELF;
// Sanity checks - Shifted or polymorphed characters may have their hide fucked up, and might be missing access to their hide-feats
// @todo Shifting probably doesn't do this anymore, could be ditchable - Ornedan, 20061214
if(GetLocalInt(oPC, "nPCShifted"))
return;
effect eTest = GetFirstEffect(oPC);
while(GetIsEffectValid(eTest))
{
if(GetEffectType(eTest) == EFFECT_TYPE_POLYMORPH)
return;
eTest = GetNextEffect(oPC);
}
DelayCommand(0.0f, CheckSpellbooks(oPC));
}
// Handle new spellbooks
void CheckSpellbooks(object oPC)
{
if(GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oPC) > 0)
{
CheckMissingSpells(oPC, CLASS_TYPE_SUBLIME_CHORD, 4, 9);
if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_BARD, oPC))
{
CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 3);
}
if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_SORCERER))
{
CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 3);
}
if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_WARMAGE, oPC))
{
CheckMissingSpells(oPC, CLASS_TYPE_WARMAGE, 0, 3);
}
if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_DUSKBLADE, oPC))
{
CheckMissingSpells(oPC, CLASS_TYPE_DUSKBLADE, 0, 3);
}
if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_BEGUILER, oPC))
{
CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 3);
}
}
// Check all classes that might need a spellbook update
if(GetIsRHDSorcerer(oPC)) CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9);
if(GetIsRHDBard(oPC)) CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6);
if(!GetPRCSwitch(PRC_BARD_DISALLOW_NEWSPELLBOOK))
CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6);
if(!GetPRCSwitch(PRC_SORC_DISALLOW_NEWSPELLBOOK))
CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9);
CheckMissingSpells(oPC, CLASS_TYPE_SUEL_ARCHANAMACH, 1, 5);
CheckMissingSpells(oPC, CLASS_TYPE_FAVOURED_SOUL, 0, 9);
CheckMissingSpells(oPC, CLASS_TYPE_WARMAGE, 0, 9);
CheckMissingSpells(oPC, CLASS_TYPE_DREAD_NECROMANCER, 1, 9);
CheckMissingSpells(oPC, CLASS_TYPE_HEXBLADE, 1, 4);
CheckMissingSpells(oPC, CLASS_TYPE_DUSKBLADE, 0, 5);
CheckMissingSpells(oPC, CLASS_TYPE_JUSTICEWW, 1, 4);
CheckMissingSpells(oPC, CLASS_TYPE_KNIGHT_WEAVE, 1, 6);
CheckMissingSpells(oPC, CLASS_TYPE_ARCHIVIST, 0, 9);
CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 9);
CheckMissingSpells(oPC, CLASS_TYPE_HARPER, 1, 3);
CheckMissingSpells(oPC, CLASS_TYPE_CELEBRANT_SHARESS, 1, 4);
//CheckMissingSpells(oPC, CLASS_TYPE_ASSASSIN, 1, 4);
// Check psionics
DelayCommand(0.0f, CheckPsionics(oPC));
}
/* void CheckSpellbooks(object oPC)
{
if(GetIsRHDSorcerer(oPC) && CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9))
return;
if(GetIsRHDBard(oPC) && CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6))
return;
if(!GetPRCSwitch(PRC_BARD_DISALLOW_NEWSPELLBOOK) && CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6))
return;
if(!GetPRCSwitch(PRC_SORC_DISALLOW_NEWSPELLBOOK) && CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9))
return;
if(CheckMissingSpells(oPC, CLASS_TYPE_SUEL_ARCHANAMACH, 1, 5))
return;
if(CheckMissingSpells(oPC, CLASS_TYPE_FAVOURED_SOUL, 0, 9))
return;
// if(CheckMissingSpells(oPC, CLASS_TYPE_MYSTIC, 0, 9))
// return;
if(CheckMissingSpells(oPC, CLASS_TYPE_WARMAGE, 0, 9))
return;
if(CheckMissingSpells(oPC, CLASS_TYPE_DREAD_NECROMANCER, 1, 9))
return;
if(CheckMissingSpells(oPC, CLASS_TYPE_HEXBLADE, 1, 4))
return;
if(CheckMissingSpells(oPC, CLASS_TYPE_DUSKBLADE, 0, 5))
return;
if(CheckMissingSpells(oPC, CLASS_TYPE_JUSTICEWW, 1, 4))
return;
if(CheckMissingSpells(oPC, CLASS_TYPE_KNIGHT_WEAVE, 1, 6))
return;
// if(CheckMissingSpells(oPC, CLASS_TYPE_WITCH, 0, 9))
// return;
if(CheckMissingSpells(oPC, CLASS_TYPE_SUBLIME_CHORD, 4, 9))
return;
if(CheckMissingSpells(oPC, CLASS_TYPE_ARCHIVIST, 0, 9))
return;
if(CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 9))
return;
if(CheckMissingSpells(oPC, CLASS_TYPE_HARPER, 1, 3))
return;
// if(CheckMissingSpells(oPC, CLASS_TYPE_TEMPLAR, 0, 9))
// return;
if(CheckMissingSpells(oPC, CLASS_TYPE_ASSASSIN, 1, 4))
return;
if(CheckMissingSpells(oPC, CLASS_TYPE_CELEBRANT_SHARESS, 1, 4))
return;
DelayCommand(0.0f, CheckPsionics(oPC));
}
*/
// Handle psionics
void CheckPsionics(object oPC)
{
if(CheckMissingPowers(oPC, CLASS_TYPE_PSION))
return;
if(CheckMissingPowers(oPC, CLASS_TYPE_WILDER))
return;
if(CheckMissingPowers(oPC, CLASS_TYPE_PSYWAR))
return;
if(CheckMissingPowers(oPC, CLASS_TYPE_PSYCHIC_ROGUE))
return;
if(CheckMissingPowers(oPC, CLASS_TYPE_FIST_OF_ZUOKEN))
return;
if(CheckMissingPowers(oPC, CLASS_TYPE_WARMIND))
return;
//expanded knowledge
if(CheckMissingPowers(oPC, -1))
return;
//epic expanded knowledge
if(CheckMissingPowers(oPC, -2))
return;
DelayCommand(0.0f, CheckInvocations(oPC));
}
// Handle Invocations
void CheckInvocations(object oPC)
{
if(CheckMissingInvocations(oPC, CLASS_TYPE_DRAGONFIRE_ADEPT))
return;
if(CheckMissingInvocations(oPC, CLASS_TYPE_WARLOCK))
return;
if(CheckMissingInvocations(oPC, CLASS_TYPE_DRAGON_SHAMAN))
return;
//extra invocations
if(CheckMissingInvocations(oPC, CLASS_TYPE_INVALID))
return;
//epic extra invocations
if(CheckMissingInvocations(oPC, -2))
return;
DelayCommand(0.0f, CheckToB(oPC));
}
// Handle Tome of Battle
void CheckToB(object oPC)
{
if(CheckMissingManeuvers(oPC, CLASS_TYPE_CRUSADER))
return;
if(CheckMissingManeuvers(oPC, CLASS_TYPE_SWORDSAGE))
return;
if(CheckMissingManeuvers(oPC, CLASS_TYPE_WARBLADE))
return;
DelayCommand(0.0f, CheckShadow(oPC));
}
// Handle Shadowcasting
void CheckShadow(object oPC)
{
if(CheckMissingMysteries(oPC, CLASS_TYPE_SHADOWCASTER))
return;
if(CheckMissingMysteries(oPC, CLASS_TYPE_SHADOWSMITH))
return;
DelayCommand(0.0f, CheckTruenaming(oPC));
}
// Handle Truenaming - Three different Lexicons to check
void CheckTruenaming(object oPC)
{
if(CheckMissingUtterances(oPC, CLASS_TYPE_TRUENAMER, LEXICON_EVOLVING_MIND))
return;
if(CheckMissingUtterances(oPC, CLASS_TYPE_TRUENAMER, LEXICON_CRAFTED_TOOL))
return;
if(CheckMissingUtterances(oPC, CLASS_TYPE_TRUENAMER, LEXICON_PERFECTED_MAP))
return;
if(!GetIsDM(oPC))
DelayCommand(0.0f, AMSCompatibilityCheck(oPC));
}
int CheckMissingPowers(object oPC, int nClass)
{
int nLevel = GetLevelByClass(nClass, oPC);
if(!nLevel && nClass != -1 && nClass != -2)
return FALSE;
else if(nClass == -1 && !GetHasFeat(FEAT_EXPANDED_KNOWLEDGE_1))
return FALSE;
else if(nClass == -2 && !GetHasFeat(FEAT_EPIC_EXPANDED_KNOWLEDGE_1))
return FALSE;
int nCurrentPowers = GetPowerCount(oPC, nClass);
int nMaxPowers = GetMaxPowerCount(oPC, nClass);
if(nCurrentPowers < nMaxPowers)
{
if (nClass <= 0)
nClass = GetPrimaryPsionicClass(oPC);
if (!IsLevelUpNUIOpen(oPC))
OpenNUILevelUpWindow(nClass, oPC);
/*
// Mark the class for which the PC is to gain powers and start the conversation
SetLocalInt(oPC, "nClass", nClass);
StartDynamicConversation("psi_powconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
*/
return TRUE;
}
return FALSE;
}
int CheckMissingInvocations(object oPC, int nClass)
{
int nLevel = GetLevelByClass(nClass, oPC);
if(!nLevel && (nClass == CLASS_TYPE_DRAGONFIRE_ADEPT || nClass == CLASS_TYPE_WARLOCK || nClass == CLASS_TYPE_DRAGON_SHAMAN))
return FALSE;
else if(nClass == CLASS_TYPE_INVALID && !GetHasFeat(FEAT_EXTRA_INVOCATION_I))
return FALSE;
else if(nClass == -2 && !GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_I))
return FALSE;
int nCurrentInvocations = GetInvocationCount(oPC, nClass);
if(DEBUG) DoDebug("Current Invocations: " + IntToString(nCurrentInvocations));
int nMaxInvocations = GetMaxInvocationCount(oPC, nClass);
if(DEBUG) DoDebug("Max Invocations: " + IntToString(nMaxInvocations));
if(nCurrentInvocations < nMaxInvocations)
{
if (nClass == CLASS_TYPE_INVALID || nClass == -2)
nClass = GetPrimaryInvocationClass(oPC);
if (!IsLevelUpNUIOpen(oPC))
OpenNUILevelUpWindow(nClass, oPC);
/*
// Mark the class for which the PC is to gain invocations and start the conversation
SetLocalInt(oPC, "nClass", nClass);
StartDynamicConversation("inv_invokeconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
*/
return TRUE;
}
return FALSE;
}
void AddSpellsForLevel(int nClass, int nLevel)
{
object oPC = OBJECT_SELF;
object oSkin = GetPCSkin(oPC);
//object oToken = GetHideToken(oPC);
string sFile = GetFileForClass(nClass);
string sSpellbook;
int nSpellbookType = GetSpellbookTypeForClass(nClass);
if(nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS)
sSpellbook = "Spellbook"+IntToString(nClass);
else
sSpellbook = "Spellbook_Known_"+IntToString(nClass)+"_"+IntToString(nLevel);
// Create spells known persistant array if it is missing
int nSize = persistant_array_get_size(oPC, sSpellbook);
if (nSize < 0)
{
persistant_array_create(oPC, sSpellbook);
nSize = 0;
}
//check for learnable spells
object oToken_Class = GetObjectByTag("SpellLvl_" + IntToString(nClass) + "_Level_" + IntToString(nLevel));
int nSpells_Total = persistant_array_get_size(oToken_Class, "Lkup");
int i;
for(i = 0; i < nSpells_Total; i++)
{
int nSpellbookID = persistant_array_get_int(oToken_Class, "Lkup", i);
if(Get2DAString(sFile, "AL", nSpellbookID) != "1")
{
persistant_array_set_int(oPC, sSpellbook, nSize, nSpellbookID);
nSize++;
if(nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS)
{
int nIPFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", nSpellbookID));
int nFeatID = StringToInt(Get2DACache(sFile, "FeatID", nSpellbookID));
AddSpellUse(oPC, nSpellbookID, nClass, sFile, "NewSpellbookMem_" + IntToString(nClass), nSpellbookType, oSkin, nFeatID, nIPFeatID);
}
}
}
}
int CheckMissingSpells(object oPC, int nClass, int nMinLevel, int nMaxLevel)
{
int nLevel;
//:: Rakshasa cast as sorcerers
if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_RAKSHASA)
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_OUTSIDER, oPC);
//:: Aranea cast as sorcerers
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_ARANEA)
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_SHAPECHANGER, oPC);
//::Arkamoi cast as sorcerers
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_ARKAMOI)
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC);
//::Hobgoblin Warsouls cast as sorcerers
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_HOBGOBLIN_WARSOUL)
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC);
//:: Driders cast as sorcerers
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_DRIDER)
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_ABERRATION, oPC);
//:: Marrutact cast as 6/7 sorcerers
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_MARRUTACT)
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC);
//:: Redspawn Arcaniss cast as 3/4 sorcerers
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_REDSPAWN_ARCANISS)
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC);
//:: Gloura cast as bards
else if(nClass == CLASS_TYPE_BARD && !GetLevelByClass(CLASS_TYPE_BARD, oPC) && GetRacialType(oPC) == RACIAL_TYPE_GLOURA)
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC);
else
nLevel = nClass == CLASS_TYPE_SUBLIME_CHORD ? GetLevelByClass(nClass, oPC) : GetSpellslotLevel(nClass, oPC);
if (DEBUG) DoDebug("CheckMissingSpells 1 Class: " + IntToString(nClass));
if (DEBUG) DoDebug("CheckMissingSpells 1 Level: " + IntToString(nLevel));
if(!nLevel)
return FALSE;
if(nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_SORCERER)
{
if((GetLevelByClass(nClass, oPC) == nLevel) //no PrC
&& !(GetHasFeat(FEAT_DRACONIC_GRACE, oPC) || GetHasFeat(FEAT_DRACONIC_BREATH, oPC))) //no Draconic feats that apply
return FALSE;
}
else if(nClass == CLASS_TYPE_ARCHIVIST)
{
int nLastGainLevel = GetPersistantLocalInt(oPC, "LastSpellGainLevel");
nLevel = GetLevelByClass(CLASS_TYPE_ARCHIVIST, oPC);
//add cleric spells known for level 0
if(persistant_array_get_size(oPC, "Spellbook_Known_"+IntToString(CLASS_TYPE_ARCHIVIST)+"_0") < 5) // TODO: replace with GetSpellKnownCurrentCount
{
ActionDoCommand(AddSpellsForLevel(CLASS_TYPE_ARCHIVIST, 0));
}
if(nLastGainLevel < nLevel)
{
if (!IsLevelUpNUIOpen(oPC))
OpenNUILevelUpWindow(nClass, oPC);
/*
SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_ARCHIVIST);
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, TRUE, FALSE, oPC);
*/
return TRUE;
}
else
return FALSE;
}
if (DEBUG) DoDebug("CheckMissingSpells 2 Class: " + IntToString(nClass));
if (DEBUG) DoDebug("CheckMissingSpells 2 Level: " + IntToString(nLevel));
int i;
for(i = nMinLevel; i <= nMaxLevel; i++)
{
int nMaxSpells = GetSpellKnownMaxCount(nLevel, i, nClass, oPC);
if(nMaxSpells > 0)
{
int nCurrentSpells = GetSpellKnownCurrentCount(oPC, i, nClass);
int nSpellsAvailable = GetSpellUnknownCurrentCount(oPC, i, nClass);
if(nCurrentSpells < nMaxSpells && nSpellsAvailable > 0)
{
if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS && bKnowsAllClassSpells(nClass))
{
ActionDoCommand(AddSpellsForLevel(nClass, i));
}
else
{
if (!IsLevelUpNUIOpen(oPC))
OpenNUILevelUpWindow(nClass, oPC);
/*
// Mark the class for which the PC is to gain powers and start the conversation
SetLocalInt(oPC, "SpellGainClass", nClass);
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
SetLocalInt(oPC, "SpellbookMaxSpelllevel", nMaxLevel);
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
*/
return TRUE;
}
}
}
}
//Advanced Learning check
nLevel = GetLevelByClass(nClass, oPC);
int nALSpells = GetPersistantLocalInt(oPC, "AdvancedLearning_"+IntToString(nClass));
if(nClass == CLASS_TYPE_BEGUILER && nALSpells < (nLevel+1)/4)//one every 4 levels starting at 3.
{
if (!IsLevelUpNUIOpen(oPC))
OpenNUILevelUpWindow(nClass, oPC);
/*
// Mark the class for which the PC is to gain powers and start the conversation
SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_BEGUILER);
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
SetLocalInt(oPC, "AdvancedLearning", 1);
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
*/
return TRUE;
}
else if(nClass == CLASS_TYPE_DREAD_NECROMANCER && nALSpells < nLevel/4)//one every 4 levels
{
if (!IsLevelUpNUIOpen(oPC))
OpenNUILevelUpWindow(nClass, oPC);
/*
// Mark the class for which the PC is to gain powers and start the conversation
SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_DREAD_NECROMANCER);
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
SetLocalInt(oPC, "AdvancedLearning", 1);
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
*/
return TRUE;
}
else if(nClass == CLASS_TYPE_WARMAGE)
{
if((nLevel >= 40 && nALSpells < 9) ||// :/
(nLevel >= 36 && nLevel < 40 && nALSpells < 8) ||
(nLevel >= 32 && nLevel < 36 && nALSpells < 7) ||
(nLevel >= 28 && nLevel < 32 && nALSpells < 6) ||
(nLevel >= 24 && nLevel < 28 && nALSpells < 5) ||
(nLevel >= 16 && nLevel < 24 && nALSpells < 4) ||
(nLevel >= 11 && nLevel < 16 && nALSpells < 3) ||
(nLevel >= 6 && nLevel < 11 && nALSpells < 2) ||
(nLevel >= 3 && nLevel < 6 && nALSpells < 1))
{
if (!IsLevelUpNUIOpen(oPC))
OpenNUILevelUpWindow(nClass, oPC);
/*
// Mark the class for which the PC is to gain powers and start the conversation
SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_WARMAGE);
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
SetLocalInt(oPC, "AdvancedLearning", 1);
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
*/
return TRUE;
}
}
else if(nClass == CLASS_TYPE_NIGHTSTALKER && nALSpells < (nLevel+1)/6)//one every 6 levels starting at 5th
{
// Mark the class for which the PC is to gain powers and start the conversation
SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_NIGHTSTALKER);
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
SetLocalInt(oPC, "AdvancedLearning", 1);
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
return TRUE;
}
return FALSE;
}
int CheckMissingUtterances(object oPC, int nClass, int nLexicon)
{
int nLevel = GetLevelByClass(nClass, oPC);
if(!nLevel)
return FALSE;
int nCurrentUtterances = GetUtteranceCount(oPC, nClass, nLexicon);
int nMaxUtterances = GetMaxUtteranceCount(oPC, nClass, nLexicon);
if(DEBUG) DoDebug("CheckMissingUtterances(" + IntToString(nClass) + ", " + IntToString(nLexicon) + ", " + GetName(oPC) + ") = " + IntToString(nCurrentUtterances) + ", " + IntToString(nMaxUtterances));
if(nCurrentUtterances < nMaxUtterances)
{
if (!IsLevelUpNUIOpen(oPC))
OpenNUILevelUpWindow(nClass, oPC);
/*
// Mark the class for which the PC is to gain Utterances and start the conversation
SetLocalInt(oPC, "nClass", nClass);
StartDynamicConversation("true_utterconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
*/
return TRUE;
}
return FALSE;
}
int CheckMissingManeuvers(object oPC, int nClass)
{
int nLevel = GetLevelByClass(nClass, oPC);
if(!nLevel)
return FALSE;
int nCurrentManeuvers = GetManeuverCount(oPC, nClass, MANEUVER_TYPE_MANEUVER);
int nMaxManeuvers = GetMaxManeuverCount(oPC, nClass, MANEUVER_TYPE_MANEUVER);
int nCurrentStances = GetManeuverCount(oPC, nClass, MANEUVER_TYPE_STANCE);
int nMaxStances = GetMaxManeuverCount(oPC, nClass, MANEUVER_TYPE_STANCE);
if(nCurrentManeuvers < nMaxManeuvers || nCurrentStances < nMaxStances)
{
if (!IsLevelUpNUIOpen(oPC))
OpenNUILevelUpWindow(nClass, oPC);
/*
// Mark the class for which the PC is to gain powers and start the conversation
SetLocalInt(oPC, "nClass", nClass);
StartDynamicConversation("tob_moveconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
*/
return TRUE;
}
return FALSE;
}
int CheckMissingMysteries(object oPC, int nClass)
{
int nLevel = GetLevelByClass(nClass, oPC);
if(!nLevel)
return FALSE;
int nCurrentMysteries = GetMysteryCount(oPC, nClass);
int nMaxMysteries = GetMaxMysteryCount(oPC, nClass);
if(nCurrentMysteries < nMaxMysteries)
{
if (!IsLevelUpNUIOpen(oPC))
OpenNUILevelUpWindow(nClass, oPC);
/*
// Mark the class for which the PC is to gain powers and start the conversation
SetLocalInt(oPC, "nClass", nClass);
StartDynamicConversation("shd_mystconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
*/
return TRUE;
}
return FALSE;
}
//AMS Compatibility functions - xwarren:
void CopyAMSArray(object oPC, object oAMSToken, int nClass, string sArray, int nMin, int nMax, int nLoopSize = 100)
{
string sFile = GetFileForClass(nClass);
int i = nMin;
while(i < nMin + nLoopSize && i < nMax)
{
int nSpellbookID = persistant_array_get_int(oPC, sArray, i);
int nSpell = StringToInt(Get2DACache(sFile, "RealSpellID", nSpellbookID));
if(DEBUG) DoDebug("Copying spell "+IntToString(nSpell));
array_set_int(oAMSToken, sArray, i, nSpell);
i++;
}
if(i < nMax)
DelayCommand(0.0, CopyAMSArray(oPC, oAMSToken, nClass, sArray, i, nMax));
}
void DoBuckUpAMS(object oPC, int nClass, string sSpellbook, object oHideToken, object oAMSToken)
{
if(DEBUG) DoDebug("Creating buck-up copy of "+sSpellbook);
if(array_exists(oAMSToken, sSpellbook))
array_delete(oAMSToken, sSpellbook);
array_create(oAMSToken, sSpellbook);
int nSize = persistant_array_get_size(oPC, sSpellbook);
DelayCommand(0.0, CopyAMSArray(oPC, oAMSToken, nClass, sSpellbook, 0, nSize));
}
void AMSCompatibilityCheck(object oPC)
{
//Get an extra hide token with amagsys info
object oAMSToken = GetHideToken(oPC, TRUE);
object oHideToken = GetHideToken(oPC); //ebonfowl: no longer used but I'm leaving it to not have to edit other functions
int i;
for(i = 1; i <= 8; i++)
{
int nClass = GetClassByPosition(i, oPC);
string sSpellbook;
int nSpellbookType = GetSpellbookTypeForClass(nClass);
if(nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS)
{
sSpellbook = "Spellbook"+IntToString(nClass);
int nSize1 = persistant_array_get_size(oPC, sSpellbook);
int nSize2 = array_get_size(oAMSToken, sSpellbook);
if(nSize1 > nSize2)
DelayCommand(0.1f, DoBuckUpAMS(oPC, nClass, sSpellbook, oHideToken, oAMSToken));
}
else if(nSpellbookType == SPELLBOOK_TYPE_PREPARED)
{
int j;
for(j = 0; j <= 9; j++)
{
sSpellbook = "Spellbook_Known_"+IntToString(nClass)+"_"+IntToString(j);
int nSize1 = persistant_array_get_size(oPC, sSpellbook);
int nSize2 = array_get_size(oAMSToken, sSpellbook);
if(nSize1 > nSize2)
DelayCommand(0.1f, DoBuckUpAMS(oPC, nClass, sSpellbook, oHideToken, oAMSToken));
}
}
}
}

View File

@@ -1,596 +0,0 @@
//:://////////////////////////////////////////////
//:: Unarmed evaluation include
//:: prc_inc_unarmed
//:://////////////////////////////////////////////
/*
Handles attack bonus, damage and itemproperties
for creature weapons created based on class
and race abilities.
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
//////////////////////////////////////////////////
/* Constant declarations */
//////////////////////////////////////////////////
const int ITEM_PROPERTY_WOUNDING = 69;
const string CALL_UNARMED_FEATS = "CALL_UNARMED_FEATS";
const string CALL_UNARMED_FISTS = "CALL_UNARMED_FISTS";
const string UNARMED_CALLBACK = "UNARMED_CALLBACK";
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
// Determines the amount of unarmed damage a character can do
// ==========================================================
// oCreature a creature whose unarmed damage dice are
// being evaluated
//
// Returns one of the IP_CONST_MONSTERDAMAGE_* constants
int FindUnarmedDamage(object oCreature);
// Adds appropriate unarmed feats to the skin. Goes with UnarmedFists()
// ====================================================================
// oCreature a creature whose unarmed combat feats to handle
//
// Do not call this directly from your evaluation script. Instead, set
// the local variable CALL_UNARMED_FEATS on the creature to TRUE.
// This is done to avoid bugs from redundant calls to these functions.
void UnarmedFeats(object oCreature);
// Creates/strips a creature weapon and applies bonuses. Goes with UnarmedFeats()
// ==============================================================================
// oCreature a creature whose creature weapon to handle
//
// Do not call this directly from your evaluation script. Instead, set
// the local variable CALL_UNARMED_FISTS on the creature to TRUE.
// This is done to avoid bugs from redundant calls to these functions.
//
// If you are going to add properties to the creature weapons, hook
// your script for callback after this is evaluated by calling
// AddEventScript(oPC, CALLBACKHOOK_UNARMED, "your_script", FALSE, FALSE);
// When the callback is running, a local int UNARMED_CALLBACK will be
// set on OBJECT_SELF
void UnarmedFists(object oCreature);
/**
* Determines whether the given object is one of the PRC creature weapons based
* on it's resref and tag. Resref is tested first, then tag.
*
* @param oTest Object to test
* @return TRUE if the object is a PRC creature weapon, FALSE otherwise
*/
int GetIsPRCCreatureWeapon(object oTest);
/**
* Determines the average damage of a IP_CONST_MONSTERDAMAGE_*** constant.
* Used to compare different unarmed damages.
*
* @param iDamage IP_CONST_MONSTERDAMAGE_*** constant
* @return average damage of that constant
*/
float DamageAvg(int iDamage);
//#include "prc_alterations"
//#include "pnp_shft_poly"
//#include "prc_feat_const"
//#include "prc_ipfeat_const"
//#include "prc_class_const"
//#include "prc_racial_const"
//#include "prc_spell_const"
//#include "inc_utility"
#include "prc_inc_natweap"
//////////////////////////////////////////////////
/* Function defintions */
//////////////////////////////////////////////////
// Clean up any extras in the inventory.
void CleanExtraFists(object oCreature)
{
int nItemType;
object oItem = GetFirstItemInInventory(oCreature);
object oCWPB = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oCreature);
object oCWPL = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oCreature);
object oCWPR = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oCreature);
object oCSkin = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oCreature);
while(GetIsObjectValid(oItem))
{
nItemType = GetBaseItemType(oItem);
if(nItemType == BASE_ITEM_CBLUDGWEAPON ||
nItemType == BASE_ITEM_CPIERCWEAPON ||
nItemType == BASE_ITEM_CREATUREITEM ||
nItemType == BASE_ITEM_CSLASHWEAPON ||
nItemType == BASE_ITEM_CSLSHPRCWEAP
)
{
if(oItem != oCWPB &&
oItem != oCWPL &&
oItem != oCWPR &&
oItem != oCSkin
)
MyDestroyObject(oItem);
}
oItem = GetNextItemInInventory(oCreature);
}
}
int GetIsPRCCreatureWeapon(object oTest)
{
string sTest = GetStringUpperCase(GetResRef(oTest));
return // First, test ResRef
sTest == "PRC_UNARMED_B" ||
sTest == "PRC_UNARMED_S" ||
sTest == "PRC_UNARMED_P" ||
sTest == "PRC_UNARMED_SP" ||
sTest == "NW_IT_CREWPB010" || // Legacy item, should not be used anymore
// If resref doesn't match, try tag
(sTest = GetStringUpperCase(GetTag(oTest))) == "PRC_UNARMED_B" ||
sTest == "PRC_UNARMED_S" ||
sTest == "PRC_UNARMED_P" ||
sTest == "PRC_UNARMED_SP" ||
sTest == "NW_IT_CREWPB010"
;
}
// Remove the unarmed penalty effect
void RemoveUnarmedAttackEffects(object oCreature)
{
effect e = GetFirstEffect(oCreature);
while (GetIsEffectValid(e))
{
if (GetEffectSpellId(e) == SPELL_UNARMED_ATTACK_PEN)
RemoveEffect(oCreature, e);
e = GetNextEffect(oCreature);
}
}
// Add the unarmed penalty effect -- the DR piercing property gives an unwanted
// attack bonus. This clears it up.
void ApplyUnarmedAttackEffects(object oCreature)
{
object oCastingObject = CreateObject(OBJECT_TYPE_PLACEABLE, "x0_rodwonder", GetLocation(OBJECT_SELF));
AssignCommand(oCastingObject, ActionCastSpellAtObject(SPELL_UNARMED_ATTACK_PEN, oCreature, METAMAGIC_NONE, TRUE, 0, PROJECTILE_PATH_TYPE_DEFAULT, TRUE));
DestroyObject(oCastingObject, 6.0);
}
// Determines the amount of damage a character can do.
// IoDM: +1 dice at level 4, +2 dice at level 8
// Sacred Fist: Levels add to monk levels, or stand alone as monk levels.
// Shou: 1d6 at level 1, 1d8 at level 2, 1d10 at level 3, 2d6 at level 5
// Monk: 1d6 at level 1, 1d8 at level 4, 1d10 at level 8, 2d6 at level 12, 2d8 at level 16, 2d10 at level 20
// Frostrager: 1d6 at level 1, 1d8 at level 4
int FindUnarmedDamage(object oCreature)
{
int iDamage = 0;
int iMonk = GetLevelByClass(CLASS_TYPE_MONK, oCreature) + GetLocalInt(oCreature, "LiPengMonk");
int iShou = GetLevelByClass(CLASS_TYPE_SHOU, oCreature);
int iBrawler = GetLevelByClass(CLASS_TYPE_BRAWLER, oCreature);
int iSacredFist = GetLevelByClass(CLASS_TYPE_SACREDFIST, oCreature);
int iEnlightenedFist = GetLevelByClass(CLASS_TYPE_ENLIGHTENEDFIST, oCreature);
int iHenshin = GetLevelByClass(CLASS_TYPE_HENSHIN_MYSTIC, oCreature);
int iZuoken = GetLevelByClass(CLASS_TYPE_FIST_OF_ZUOKEN, oCreature);
int iShadowSunNinja = GetLevelByClass(CLASS_TYPE_SHADOW_SUN_NINJA, oCreature);
int iFrost = GetLevelByClass(CLASS_TYPE_FROSTRAGER, oCreature);
int iAscetic = GetLevelByClass(CLASS_TYPE_NINJA, oCreature);
int iRonove;
int iMonkDamage = 1;
int iShouDamage = 1;
int iBrawlerDamage = 1;
int iFrostDamage = 1;
int iSUSDamage = 1;
int iDieIncrease = 0;
int iSize;
if (GetHasSpellEffect(VESTIGE_RONOVE, oCreature) && GetLevelByClass(CLASS_TYPE_BINDER, oCreature)) iRonove = GetLocalInt(oCreature, "RonovesFists");
// if the creature is shifted, use model size
// otherwise, we want to stick to what the feats say they "should" be.
// No making pixies with Dragon Appearance for "huge" fist damage.
if( GetIsPolyMorphedOrShifted(oCreature)
|| GetPRCSwitch(PRC_APPEARANCE_SIZE))
{
iSize = PRCGetCreatureSize(oCreature) - CREATURE_SIZE_MEDIUM + 5; // medium is size 5 for us
}
else
{
// Determine creature size by feats.
iSize = 5; // medium is size 5 for us
if (GetHasFeat(FEAT_TINY, oCreature)) iSize = 3;
if (GetHasFeat(FEAT_SMALL, oCreature)) iSize = 4;
if (GetHasFeat(FEAT_LARGE, oCreature)) iSize = 6;
if (GetHasFeat(FEAT_HUGE, oCreature)) iSize = 7;
// include size changes
iSize += PRCGetCreatureSize(oCreature) - PRCGetCreatureSize(oCreature, PRC_SIZEMASK_NONE);
// cap if needed
if (iSize < 1) iSize = 1;
if (iSize > 9) iSize = 9;
}
// Sacred Fist cannot add their levels if they've broken their code.
if (GetHasFeat(FEAT_SF_CODE, oCreature)) iSacredFist = 0;
// several classes add their levels to the monk class,
// or use monk progression if the character has no monk levels
iMonk += iSacredFist + iHenshin + iEnlightenedFist + iShou + iZuoken + iShadowSunNinja;
// Superior Unarmed Strike
if (GetHasFeat(FEAT_SUPERIOR_UNARMED_STRIKE, oCreature))
{
iMonk += 4;
int nHD = GetHitDice(oCreature);
if (nHD >= 16) iSUSDamage = IP_CONST_MONSTERDAMAGE_2d6;
else if (nHD >= 12) iSUSDamage = IP_CONST_MONSTERDAMAGE_1d10;
else if (nHD >= 8) iSUSDamage = IP_CONST_MONSTERDAMAGE_1d8;
else if (nHD >= 4) iSUSDamage = IP_CONST_MONSTERDAMAGE_1d6;
else if (nHD >= 3) iSUSDamage = IP_CONST_MONSTERDAMAGE_1d4;
}
// Ascetic Stalker
if (GetHasFeat(FEAT_ASCETIC_STALKER, oCreature))
iMonk += iAscetic;
// In 3.0e, Monk progression stops after level 16:
if (iMonk > 16 && !GetPRCSwitch(PRC_3_5e_FIST_DAMAGE) ) iMonk = 16;
// in 3.5e, monk progression stops at 20.
else if(iMonk > 20) iMonk = 20;
// Ronove is in place of monk, does not stack
if (iRonove > iMonk) iMonk = iRonove;
// monks damage progesses every four levels, starts at 1d6
if (iMonk > 0)
iMonkDamage = iMonk / 4 + 3;
// For medium monks in 3.0e skip 2d8 and go to 1d20
if(iSize == 5 && iMonkDamage == 7 && !GetPRCSwitch(PRC_3_5e_FIST_DAMAGE) ) iMonkDamage = 8;
// Shou Disciple either adds its level to existing class or does its own damage, depending
// on which is better. Here we will determine how much damage the Shou Disciple does
// without stacking.
if (iShou > 0) iShouDamage = iShou + 2; // Lv. 1: 1d6, Lv. 2: 1d8, Lv. 3: 1d10
if (iShou > 3) iShouDamage--; // Lv. 4: 1d10, Lv. 5: 2d6
iShouDamage = StringToInt(Get2DACache("unarmed_dmg","size" + IntToString(iSize), iShouDamage));
// Frostrager does not stack with other damage types
if (iFrost > 0) iFrostDamage = IP_CONST_MONSTERDAMAGE_1d6; // Lv. 1: 1d6
if (iFrost > 3) iFrostDamage = IP_CONST_MONSTERDAMAGE_1d8; // Lv. 3: 1d8
// Brawler follows monk progression except for the last one (3d8)
if (iBrawler > 0) iBrawlerDamage = iBrawler / 6 + 3; // 1d6, 1d8, 1d10, 2d6, 2d8, 2d10
if (iBrawler >= 36) iBrawlerDamage += 2; // 3d8
// Monks and monk-like classes deal no additional damage when wearing any armor, at
// least in NWN. This is to reflect that. No shields too.
if (iMonkDamage > 1)
{
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oCreature);
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature);
int bShieldEq = GetBaseItemType(oShield) == BASE_ITEM_SMALLSHIELD ||
GetBaseItemType(oShield) == BASE_ITEM_LARGESHIELD ||
GetBaseItemType(oShield) == BASE_ITEM_TOWERSHIELD;
if (GetBaseAC(oArmor) > 0 || bShieldEq)
{
iMonkDamage = 1;
}
}
// Shou Disciples can wear light armor
if (iShouDamage > 1)
{
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oCreature);
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature);
int bShieldEq = GetBaseItemType(oShield) == BASE_ITEM_SMALLSHIELD ||
GetBaseItemType(oShield) == BASE_ITEM_LARGESHIELD ||
GetBaseItemType(oShield) == BASE_ITEM_TOWERSHIELD;
if (GetBaseAC(oArmor) > 3 || bShieldEq)
{
iShouDamage = 1;
}
}
// For Initiate of Draconic Mysteries
if (GetHasFeat(FEAT_INCREASE_DAMAGE2, oCreature)) iDieIncrease += 2;
else if (GetHasFeat(FEAT_INCREASE_DAMAGE1, oCreature)) iDieIncrease += 1;
/* //:: Expansion / Compression powers (Double dipping?)
int nExpansion = GetLocalInt(oCreature, "PRC_Power_Expansion_SizeIncrease");
int nCompression = GetLocalInt(oCreature, "PRC_Power_Compression_SizeReduction");
if (nExpansion)
{
iSize += nExpansion;
}
if (nCompression)
{
iSize -= nCompression;
} */
iMonkDamage += iDieIncrease;
iShouDamage += iDieIncrease;
iBrawlerDamage += iDieIncrease;
iFrostDamage += iDieIncrease;
iSUSDamage += iDieIncrease;
//FloatingTextStringOnCreature("prc_inc_unarmed: Size is: "+IntToString(iSize)+".", oCreature);
//FloatingTextStringOnCreature("prc_inc_unarmed: Pre 2DA Lookup >> iMonkDamage = "+IntToString(iMonkDamage)+".", oCreature);
// now, read the damage from the table in unarmed_dmg.2da
iMonkDamage = StringToInt(Get2DACache("unarmed_dmg","size" + IntToString(iSize), iMonkDamage));
iShouDamage = StringToInt(Get2DACache("unarmed_dmg","size" + IntToString(iSize), iShouDamage));
//FloatingTextStringOnCreature("prc_inc_unarmed: Post 2DA Lookup >> iMonkDamage = "+IntToString(iMonkDamage)+".", oCreature);
// Medium+ monks have some special values on the table in 3.0:
if (iSize >= 5 && !GetPRCSwitch(PRC_3_5e_FIST_DAMAGE))
{
if (iMonkDamage == IP_CONST_MONSTERDAMAGE_2d6) iMonkDamage = IP_CONST_MONSTERDAMAGE_1d12;
if (iMonkDamage == IP_CONST_MONSTERDAMAGE_2d10) iMonkDamage = IP_CONST_MONSTERDAMAGE_1d20;
}
iDamage = iMonkDamage;
// Future unarmed classes: if you do your own damage, add in "comparisons" below here.
iDamage = (DamageAvg(iShouDamage ) > DamageAvg(iDamage)) ? iShouDamage : iDamage;
iDamage = (DamageAvg(iFrostDamage ) > DamageAvg(iDamage)) ? iFrostDamage : iDamage;
iDamage = (DamageAvg(iSUSDamage ) > DamageAvg(iDamage)) ? iSUSDamage : iDamage;
if (DEBUG) DoDebug("prc_inc_unarmed: iDamage "+IntToString(iDamage));
return iDamage;
}
// Adds appropriate feats to the skin. Stolen from SoulTaker + expanded with overwhelming/devastating critical.
void UnarmedFeats(object oCreature)
{
// If we are polymorphed/shifted, do not mess with the creature weapon.
if (GetIsPolyMorphedOrShifted(oCreature)) return;
object oSkin = GetPCSkin(oCreature);
if (!GetHasFeat(FEAT_WEAPON_PROFICIENCY_CREATURE, oCreature))
AddItemProperty(DURATION_TYPE_PERMANENT,PRCItemPropertyBonusFeat(IP_CONST_FEAT_WEAPON_PROF_CREATURE),oSkin);
//only roll unarmed feats into creature feats when not using natural weapons
if(!GetIsUsingPrimaryNaturalWeapons(oCreature))
{
if (GetHasFeat(FEAT_WEAPON_FOCUS_UNARMED_STRIKE, oCreature) && !GetHasFeat(FEAT_WEAPON_FOCUS_CREATURE, oCreature))
AddItemProperty(DURATION_TYPE_PERMANENT,PRCItemPropertyBonusFeat(IP_CONST_FEAT_WeapFocCreature),oSkin);
if (GetHasFeat(FEAT_WEAPON_SPECIALIZATION_UNARMED_STRIKE, oCreature) && !GetHasFeat(FEAT_WEAPON_SPECIALIZATION_CREATURE, oCreature))
AddItemProperty(DURATION_TYPE_PERMANENT,PRCItemPropertyBonusFeat(IP_CONST_FEAT_WeapSpecCreature),oSkin);
if (GetHasFeat(FEAT_IMPROVED_CRITICAL_UNARMED_STRIKE, oCreature) && !GetHasFeat(FEAT_IMPROVED_CRITICAL_CREATURE, oCreature))
AddItemProperty(DURATION_TYPE_PERMANENT,PRCItemPropertyBonusFeat(IP_CONST_FEAT_ImpCritCreature),oSkin);
if (GetHasFeat(FEAT_EPIC_WEAPON_FOCUS_UNARMED, oCreature) && !GetHasFeat(FEAT_EPIC_WEAPON_FOCUS_CREATURE, oCreature))
AddItemProperty(DURATION_TYPE_PERMANENT,PRCItemPropertyBonusFeat(IP_CONST_FEAT_WeapEpicFocCreature),oSkin);
if (GetHasFeat(FEAT_EPIC_WEAPON_SPECIALIZATION_UNARMED, oCreature) && !GetHasFeat(FEAT_EPIC_WEAPON_SPECIALIZATION_CREATURE, oCreature))
AddItemProperty(DURATION_TYPE_PERMANENT,PRCItemPropertyBonusFeat(IP_CONST_FEAT_WeapEpicSpecCreature),oSkin);
if (GetHasFeat(FEAT_EPIC_OVERWHELMING_CRITICAL_UNARMED, oCreature) && !GetHasFeat(FEAT_EPIC_OVERWHELMING_CRITICAL_CREATURE, oCreature))
AddItemProperty(DURATION_TYPE_PERMANENT,PRCItemPropertyBonusFeat(IP_CONST_FEAT_OVERCRITICAL_CREATURE),oSkin);
if (GetHasFeat(FEAT_EPIC_DEVASTATING_CRITICAL_UNARMED, oCreature) && !GetHasFeat(FEAT_EPIC_DEVASTATING_CRITICAL_CREATURE, oCreature))
AddItemProperty(DURATION_TYPE_PERMANENT,PRCItemPropertyBonusFeat(IP_CONST_FEAT_DEVCRITICAL_CREATURE),oSkin);
}
}
// Creates/strips a creature weapon and applies bonuses. Large chunks stolen from SoulTaker.
void UnarmedFists(object oCreature)
{
// If we are polymorphed/shifted, do not mess with the creature weapon.
if (GetIsPolyMorphedOrShifted(oCreature)) return;
RemoveUnarmedAttackEffects(oCreature);
object oRighthand = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature);
object oLefthand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature);
object oWeapL = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oCreature);
// Clean up the mess of extra fists made on taking first level.
DelayCommand(6.0f, CleanExtraFists(oCreature));
// Determine the character's capacity to pierce DR.
// only applies when not using natural weapons
if(!GetIsUsingPrimaryNaturalWeapons(oCreature))
{
int iRace = GetRacialType(oCreature);
int iMonk = GetLevelByClass(CLASS_TYPE_MONK, oCreature) + GetLocalInt(oCreature, "LiPengMonk");
int iShou = GetLevelByClass(CLASS_TYPE_SHOU, oCreature);
int iSacFist = GetLevelByClass(CLASS_TYPE_SACREDFIST, oCreature);
int iHenshin = GetLevelByClass(CLASS_TYPE_HENSHIN_MYSTIC, oCreature);
int iIoDM = GetLevelByClass(CLASS_TYPE_INITIATE_DRACONIC, oCreature);
int iBrawler = GetLevelByClass(CLASS_TYPE_BRAWLER, oCreature);
int iZuoken = GetLevelByClass(CLASS_TYPE_FIST_OF_ZUOKEN, oCreature);
int iShadowSunNinja = GetLevelByClass(CLASS_TYPE_SHADOW_SUN_NINJA, oCreature);
int iAscetic = GetLevelByClass(CLASS_TYPE_NINJA, oCreature);
// Sacred Fists who break their code get no benefits.
if (GetHasFeat(FEAT_SF_CODE,oCreature)) iSacFist = 0;
// The monk adds all these classes.
int iMonkEq = iMonk + iShou + iSacFist + iHenshin + iZuoken + iShadowSunNinja;
// Ascetic Stalker
if (GetHasFeat(FEAT_ASCETIC_STALKER, oCreature))
iMonkEq += iAscetic;
// Determine the type of damage the character should do.
string sWeapType;
if (GetHasFeat(FEAT_CLAWDRAGON, oCreature))
sWeapType = "PRC_UNARMED_S";
else
sWeapType = "PRC_UNARMED_B";
// Equip the creature weapon.
if (!GetIsObjectValid(oWeapL) || GetTag(oWeapL) != sWeapType)
{
if (GetHasItem(oCreature, sWeapType))
{
oWeapL = GetItemPossessedBy(oCreature, sWeapType);
SetIdentified(oWeapL, TRUE);
AssignCommand(oCreature, ActionEquipItem(oWeapL, INVENTORY_SLOT_CWEAPON_L));
}
else
{
oWeapL = CreateItemOnObject(sWeapType, oCreature);
SetIdentified(oWeapL, TRUE);
AssignCommand(oCreature,ActionEquipItem(oWeapL, INVENTORY_SLOT_CWEAPON_L));
}
}
int iKi = (iMonkEq > 9) ? 1 : 0;
iKi = (iMonkEq > 12) ? 2 : iKi;
iKi = (iMonkEq > 15) ? 3 : iKi;
int iDragClaw = GetHasFeat(FEAT_CLAWDRAGON,oCreature) ? 1: 0;
iDragClaw = GetHasFeat(FEAT_CLAWENH2,oCreature) ? 2: iDragClaw;
iDragClaw = GetHasFeat(FEAT_CLAWENH3,oCreature) ? 3: iDragClaw;
int iBrawlEnh = iBrawler / 6;
int iEpicKi = GetHasFeat(FEAT_EPIC_IMPROVED_KI_STRIKE_4,oCreature) ? 1 : 0 ;
iEpicKi = GetHasFeat(FEAT_EPIC_IMPROVED_KI_STRIKE_5,oCreature) ? 2 : iEpicKi ;
// The total enhancement to the fist is the sum of all the enhancements above
int iEnh = iKi + iDragClaw + iBrawlEnh + iEpicKi;
// Strip the Fist.
itemproperty ip = GetFirstItemProperty(oWeapL);
while (GetIsItemPropertyValid(ip))
{
RemoveItemProperty(oWeapL, ip);
ip = GetNextItemProperty(oWeapL);
}
// Leave the fist blank if weapons are equipped. The only way a weapon will
// be equipped on the left hand is if there is a weapon in the right hand.
if (GetIsObjectValid(oRighthand)) return;
// Add glove bonuses.
object oItem = GetItemInSlot(INVENTORY_SLOT_ARMS,oCreature);
int iGloveEnh = 0;
if (GetIsObjectValid(oItem))
{
int iType = GetBaseItemType(oItem);
if (iType == BASE_ITEM_GLOVES)
{
ip = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(ip))
{
iType = GetItemPropertyType(ip);
switch (iType)
{
case ITEM_PROPERTY_DAMAGE_BONUS:
case ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP:
case ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP:
case ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT:
case ITEM_PROPERTY_ON_HIT_PROPERTIES:
case ITEM_PROPERTY_ONHITCASTSPELL:
case ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE:
case ITEM_PROPERTY_KEEN:
case ITEM_PROPERTY_MASSIVE_CRITICALS:
case ITEM_PROPERTY_POISON:
case ITEM_PROPERTY_REGENERATION_VAMPIRIC:
case ITEM_PROPERTY_WOUNDING:
case ITEM_PROPERTY_DECREASED_DAMAGE:
case ITEM_PROPERTY_DECREASED_ATTACK_MODIFIER:
DelayCommand(0.1, AddItemProperty(DURATION_TYPE_PERMANENT,ip,oWeapL));
break;
case ITEM_PROPERTY_ATTACK_BONUS:
int iCost = GetItemPropertyCostTableValue(ip);
iGloveEnh = (iCost>iGloveEnh) ? iCost:iGloveEnh;
iEnh = (iCost>iEnh) ? iCost:iEnh;
break;
}
ip = GetNextItemProperty(oItem);
}
// handles these seperately so as not to create "attack penalties vs. xxxx"
ip = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(ip))
{
iType = GetItemPropertyType(ip);
switch (iType)
{
case ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT:
case ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP:
case ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP:
if (GetItemPropertyCostTableValue(ip) > iEnh)
DelayCommand(0.1, AddItemProperty(DURATION_TYPE_PERMANENT,ip,oWeapL));
break;
}
ip = GetNextItemProperty(oItem);
}
}
}
// Add damage resistance penetration.
DelayCommand(0.1, AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyAttackBonus(iEnh), oWeapL));
// Cool VFX when striking unarmed
if (iMonkEq > 9)
//DelayCommand(0.1, AddItemProperty(DURATION_TYPE_PERMANENT, PRCItemPropertyBonusFeat(IP_CONST_FEAT_KI_STRIKE), oWeapL));
DelayCommand(0.1, IPSafeAddItemProperty(oWeapL, PRCItemPropertyBonusFeat(IP_CONST_FEAT_KI_STRIKE), 0.0f, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE));
// This adds creature weapon finesse and a penalty to offset the DR penetration attack bonus.
SetLocalInt(oCreature, "UnarmedEnhancement", iEnh);
SetLocalInt(oCreature, "UnarmedEnhancementGlove", iGloveEnh);
}
// Weapon finesse or intuitive attack?
SetLocalInt(oCreature, "UsingCreature", TRUE);
ExecuteScript("prc_intuiatk", oCreature);
DelayCommand(1.0f, DeleteLocalInt(oCreature, "UsingCreature"));
ApplyUnarmedAttackEffects(oCreature);
// Add the appropriate damage to the fist.
int iMonsterDamage = FindUnarmedDamage(oCreature);
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyMonsterDamage(iMonsterDamage),oWeapL);
// Add OnHitCast: Unique if necessary. Frostrager level 5 grants Rend too
if(GetHasFeat(FEAT_REND, oCreature) || GetLevelByClass(CLASS_TYPE_FROSTRAGER, oCreature) > 4)
IPSafeAddItemProperty(oWeapL,
ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1));
// Friendly message to remind players that certain things won't appear correct.
if (GetLocalInt(oCreature, "UnarmedSubSystemMessage") != TRUE
&& GetHasSpellEffect(SPELL_UNARMED_ATTACK_PEN, oCreature))
{
SetLocalInt(oCreature, "UnarmedSubSystemMessage", TRUE);
DelayCommand(3.001f, SendMessageToPC(oCreature, "This character uses the PRC's unarmed system. This system has been created to"));
DelayCommand(3.002f, SendMessageToPC(oCreature, "work around many Aurora engine bugs and limitations. Your attack roll may appear to be"));
DelayCommand(3.003f, SendMessageToPC(oCreature, "incorrect on the character's stats. However, the attack rolls should be correct in"));
DelayCommand(3.004f, SendMessageToPC(oCreature, "combat. Disregard any attack effects that seem extra: they are part of the workaround."));
DelayCommand(600.0f, DeleteLocalInt(oCreature, "UnarmedSubSystemMessage"));
}
}
float DamageAvg(int iDamage)
{
int iDie = StringToInt(Get2DACache("iprp_monstcost", "Die", iDamage));
int iNum = StringToInt(Get2DACache("iprp_monstcost", "NumDice", iDamage));
return IntToFloat(iNum * (iDie+1)) / 2;
}
//:: void main (){}

View File

@@ -1,530 +0,0 @@
#include "prc_nui_consts"
#include "inc_newspellbook"
#include "psi_inc_psifunc"
#include "inc_lookups"
#include "nw_inc_nui"
//
// GetCurrentSpellLevel
// Gets the current spell level the class can achieve at the current
// caster level (ranging from 0-9)
//
// Arguments:
// nClass:int the ClassID
// nLevel:int the caster level
//
// Returns:
// int the circle the class can achieve currently
//
int GetCurrentSpellLevel(int nClass, int nLevel);
//
// GetMaxSpellLevel
// Gets the highest possible circle the class can achieve (from 0-9)
//
// Arguments:
// nClass:int the ClassID
//
// Returns:
// int the highest circle that can be achieved
//
int GetMaxSpellLevel(int nClass);
//
// GetMinSpellLevel
// Gets the lowest possible circle the class can achieve (from 0-9)
//
// Arguments:
// nClass:int the ClassID
//
// Returns:
// int the lowest circle that can be achieved
//
int GetMinSpellLevel(int nClass);
//
// GetHighestLevelPossibleInClass
// Given a class Id this will determine what the max level of a class can be
// achieved
//
// Arguments:
// nClass:int the ClassID
//
// Returns:
// int the highest possible level the class can achieve
//
int GetHighestLevelPossibleInClass(int nClass);
//
// GetClassSpellbookFile
// Gets the class 2da spellbook/ability for the given class Id
//
// Arguments:
// nClass:int the classID
//
// Returns:
// string the 2da file name for the spell/abilities of the ClassID
//
string GetClassSpellbookFile(int nClass);
//
// GetBinderSpellToFeatDictionary
// Sets up the Binder Spell Dictionary that is used to match a binder's vestige
// to their feat. This is constructed based off the binder's known location of
// their feat and spell ranges in the base 2das respectivly. After constructing
// this it will be saved to the player locally as a cached result since we do
// not need to call this again.
//
// Argument:
// oPlayer:object the player
//
// Returns:
// json:Dictionary<String,Int> a dictionary of mapping between the SpellID
// and the FeatID of a vestige ability
//
json GetBinderSpellToFeatDictionary(object oPlayer=OBJECT_SELF);
//
// GetSpellLevelIcon
// Takes the spell circle int and gets the icon appropriate for it (i.e. 0 turns
// into "ir_cantrips"
//
// Arguments:
// spellLevel:int the spell level we want the icon for
//
// Returns:
// string the spell level icon
//
string GetSpellLevelIcon(int spellLevel);
//
// GetSpellLevelToolTip
// Gets the spell level tool tip text based on the int spell level provided (i.e.
// 0 turns into "Cantrips")
//
// Arguments:
// spellLevel:int the spell level we want the tooltip for
//
// Returns:
// string the spell level toop tip
//
string GetSpellLevelToolTip(int spellLevel);
//
// GetSpellIcon
// Gets the spell icon based off the spellId, or featId supplied
//
// Arguments:
// nClass:int the class Id
// featId:int the featId we can use the icon for
// spellId:int the spell Id we want the icon for
//
// Returns:
// json:String the string of the icon we want.
//
json GetSpellIcon(int spellId, int featId=0, int nClass=0);
string GetSpellName(int spellId, int realSpellID=0, int featId=0, int nClass=0);
//
// GreyOutButton
// Takes NUI Button along with it's width and height and greys it out it with a drawn
// colored rectangle to represent it's not been selected or not valid.
//
// Arguments:
// jButton:json the NUI Button
// w:float the width of the button
// h:float the height of the button
//
// Returns:
// json the NUI button greyed out
//
json GreyOutButton(json jButton, float w, float h);
//
// CreateGreyOutRectangle
// Creates a grey out rectangle for buttons
//
// Arguments:
// w:float the width of the button
// h:float the height of the button
//
// Returns:
// json the transparant black rectangle
//
json CreateGreyOutRectangle(float w, float h);
void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0, int nClass=0);
void ClearSpellDescriptionNUI(object oPlayer=OBJECT_SELF);
int GetCurrentSpellLevel(int nClass, int nLevel)
{
int currentLevel = nLevel;
// ToB doesn't have a concept of spell levels, but still match up to it
if(nClass == CLASS_TYPE_WARBLADE
|| nClass == CLASS_TYPE_SWORDSAGE
|| nClass == CLASS_TYPE_CRUSADER
|| nClass == CLASS_TYPE_SHADOWCASTER)
{
return 9;
}
// Binders don't really have a concept of spell level
if (nClass == CLASS_TYPE_BINDER
|| nClass == CLASS_TYPE_DRAGON_SHAMAN) // they can only reach 1st circle
return 1;
//Shadowsmith has no concept of spell levels
if (nClass == CLASS_TYPE_SHADOWSMITH)
return 2;
if (nClass == CLASS_TYPE_WARLOCK
|| nClass == CLASS_TYPE_DRAGONFIRE_ADEPT)
return 4;
// Spont casters have their own function
if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS
|| nClass == CLASS_TYPE_ARCHIVIST)
{
int maxLevel = GetMaxSpellLevelForCasterLevel(nClass, currentLevel);
return maxLevel;
}
else
{
// everyone else uses this
string spellLevel2da = GetAMSKnownFileName(nClass);
currentLevel = nLevel - 1; // Level is 1 off of the row in the 2da
if (nClass == CLASS_TYPE_FIST_OF_ZUOKEN
|| nClass == CLASS_TYPE_PSION
|| nClass == CLASS_TYPE_PSYWAR
|| nClass == CLASS_TYPE_WILDER
|| nClass == CLASS_TYPE_PSYCHIC_ROGUE
|| nClass == CLASS_TYPE_WARMIND)
currentLevel = GetManifesterLevel(OBJECT_SELF, nClass, TRUE) - 1;
int totalLevel = Get2DARowCount(spellLevel2da);
// in case we somehow go over bounds just don't :)
if (currentLevel >= totalLevel)
currentLevel = totalLevel - 1;
//Psionics have MaxPowerLevel as their column name
string columnName = "MaxPowerLevel";
//Invokers have MaxInvocationLevel
if (nClass == CLASS_TYPE_WARLOCK
|| nClass == CLASS_TYPE_DRAGON_SHAMAN
|| nClass == CLASS_TYPE_DRAGONFIRE_ADEPT)
columnName = "MaxInvocationLevel";
// Truenamers have 3 sets of utterances, ranging from 1-6, EvolvingMind covers the entire range
if (nClass == CLASS_TYPE_TRUENAMER)
{
columnName = "EvolvingMind";
spellLevel2da = "cls_true_maxlvl"; //has a different 2da we want to look at
}
if (nClass == CLASS_TYPE_BINDER)
{
columnName = "VestigeLvl";
spellLevel2da = "cls_bind_binder";
}
// ToB doesn't have a concept of this, but we don't care.
int maxLevel = StringToInt(Get2DACache(spellLevel2da, columnName, currentLevel));
return maxLevel;
}
}
int GetMinSpellLevel(int nClass)
{
// again sponts have their own function
if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS
|| nClass == CLASS_TYPE_ARCHIVIST)
{
return GetMinSpellLevelForCasterLevel(nClass, GetHighestLevelPossibleInClass(nClass));
}
else
{
if (nClass == CLASS_TYPE_FIST_OF_ZUOKEN
|| nClass == CLASS_TYPE_PSION
|| nClass == CLASS_TYPE_PSYWAR
|| nClass == CLASS_TYPE_WILDER
|| nClass == CLASS_TYPE_PSYCHIC_ROGUE
|| nClass == CLASS_TYPE_WARMIND
|| nClass == CLASS_TYPE_WARBLADE
|| nClass == CLASS_TYPE_SWORDSAGE
|| nClass == CLASS_TYPE_CRUSADER
|| nClass == CLASS_TYPE_WARLOCK
|| nClass == CLASS_TYPE_DRAGONFIRE_ADEPT
|| nClass == CLASS_TYPE_DRAGON_SHAMAN
|| nClass == CLASS_TYPE_SHADOWCASTER
|| nClass == CLASS_TYPE_SHADOWSMITH
|| nClass == CLASS_TYPE_BINDER)
return 1;
return GetCurrentSpellLevel(nClass, 1);
}
}
int GetMaxSpellLevel(int nClass)
{
if (nClass == CLASS_TYPE_WILDER
|| nClass == CLASS_TYPE_PSION)
return 9;
if (nClass == CLASS_TYPE_PSYCHIC_ROGUE
|| nClass == CLASS_TYPE_FIST_OF_ZUOKEN
|| nClass == CLASS_TYPE_WARMIND)
return 5;
if (nClass == CLASS_TYPE_PSYWAR)
return 6;
return GetCurrentSpellLevel(nClass, GetHighestLevelPossibleInClass(nClass));
}
int GetHighestLevelPossibleInClass(int nClass)
{
string sFile;
//sponts have their spells in the classes.2da
if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS
|| nClass == CLASS_TYPE_ARCHIVIST)
{
sFile = Get2DACache("classes", "SpellGainTable", nClass);
}
else
{
// everyone else uses this
sFile = GetAMSKnownFileName(nClass);
if (nClass == CLASS_TYPE_TRUENAMER)
{
sFile = "cls_true_maxlvl"; //has a different 2da we want to look at
}
if (nClass == CLASS_TYPE_BINDER)
{
sFile = "cls_bind_binder";
}
}
return Get2DARowCount(sFile);
}
string GetClassSpellbookFile(int nClass)
{
string sFile;
// Spontaneous casters use a specific file name structure
if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS
|| nClass == CLASS_TYPE_ARCHIVIST)
{
sFile = GetFileForClass(nClass);
}
// everyone else uses this structure
else
{
sFile = GetAMSDefinitionFileName(nClass);
if (nClass == CLASS_TYPE_BINDER)
{
sFile = "vestiges";
}
}
return sFile;
}
string GetSpellLevelIcon(int spellLevel)
{
switch (spellLevel)
{
case 0: return "ir_cantrips";
case 1: return "ir_level1";
case 2: return "ir_level2";
case 3: return "ir_level3";
case 4: return "ir_level4";
case 5: return "ir_level5";
case 6: return "ir_level6";
case 7: return "ir_level789";
case 8: return "ir_level789";
case 9: return "ir_level789";
}
return "";
}
string GetSpellLevelToolTip(int spellLevel)
{
switch (spellLevel)
{
case 0: return "Cantrips";
case 1: return "Level 1";
case 2: return "Level 2";
case 3: return "Level 3";
case 4: return "Level 4";
case 5: return "Level 5";
case 6: return "Level 6";
case 7: return "Level 7";
case 8: return "Level 8";
case 9: return "Level 9";
}
return "";
}
json GetSpellIcon(int spellId,int featId=0,int nClass=0)
{
// Binder's spells don't have the FeatID on the spells.2da, so we have to use
// the mapping we constructed to get it.
if (nClass == CLASS_TYPE_BINDER)
{
json binderDict = GetBinderSpellToFeatDictionary();
int nFeatID = JsonGetInt(JsonObjectGet(binderDict, IntToString(spellId)));
return JsonString(Get2DACache("feat", "Icon", featId));
}
if (featId)
return JsonString(Get2DACache("feat", "Icon", featId));
int masterSpellID = StringToInt(Get2DACache("spells", "Master", spellId));
// if this is a sub radial spell, then we use spell's icon instead
if (masterSpellID)
return JsonString(Get2DACache("spells", "IconResRef", spellId));
// the FeatID holds the accurate spell icon, not the SpellID
int nFeatID = StringToInt(Get2DACache("spells", "FeatID", spellId));
return JsonString(Get2DACache("feat", "Icon", nFeatID));
}
string GetSpellName(int spellId, int realSpellID=0, int featId=0, int nClass=0)
{
if ((nClass == CLASS_TYPE_SHADOWSMITH
|| nClass == CLASS_TYPE_SHADOWCASTER) && spellId)
return GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellId)));
if (nClass == CLASS_TYPE_TRUENAMER && featId)
return GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", featId)));
if (realSpellID)
return GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", realSpellID)));
if (spellId)
return GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellId)));
if (featId)
return GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", featId)));
return GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellId)));
}
json GetBinderSpellToFeatDictionary(object oPlayer=OBJECT_SELF)
{
// a dictionary of <SpellID, FeatID>
json binderDict = GetLocalJson(oPlayer, NUI_SPELLBOOK_BINDER_DICTIONARY_CACHE_VAR);
// if this hasn't been created, create it now.
if (binderDict == JsonNull())
binderDict = JsonObject();
else
return binderDict;
// the starting row for binder spells
int spellIndex = 19070;
// the starting row for binder feats
int featIndex = 9030;
//the end of the binder spells/feats
while (spellIndex <= 19156 && featIndex <= 9104)
{
// get the SpellID tied to the feat
int spellID = StringToInt(Get2DACache("feat", "SPELLID", featIndex));
// if the spellID matches the current index, then this is the spell
// attached to the feat
if (spellID == spellIndex)
{
binderDict = JsonObjectSet(binderDict, IntToString(spellID), JsonInt(featIndex));
// move to next spell/feat
featIndex++;
spellIndex++;
}
// else we have reached a subdial spell
else
{
// loop through until we reach back at spellID
while (spellIndex < spellID)
{
int masterSpell = StringToInt(Get2DACache("spells", "Master", spellIndex));
// add the sub radial to the dict, tied to the master's FeatID
int featId = JsonGetInt(JsonObjectGet(binderDict, IntToString(masterSpell)));
binderDict = JsonObjectSet(binderDict, IntToString(spellIndex), JsonInt(featId));
spellIndex++;
}
// some feats overlap the same FeatID, can cause this to get stuck.
// if it happens then move on
if (spellIndex > spellID)
featIndex++;
}
}
// cache the result
SetLocalJson(oPlayer, NUI_SPELLBOOK_BINDER_DICTIONARY_CACHE_VAR, binderDict);
return binderDict;
}
json GreyOutButton(json jButton, float w, float h)
{
json retValue = jButton;
json jBorders = JsonArray();
jBorders = JsonArrayInsert(jBorders, CreateGreyOutRectangle(w, h));
return NuiDrawList(jButton, JsonBool(FALSE), jBorders);
}
json CreateGreyOutRectangle(float w, float h)
{
// set the points of the button shape
json jPoints = JsonArray();
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
jPoints = JsonArrayInsert(jPoints, JsonFloat(h));
jPoints = JsonArrayInsert(jPoints, JsonFloat(w));
jPoints = JsonArrayInsert(jPoints, JsonFloat(h));
jPoints = JsonArrayInsert(jPoints, JsonFloat(w));
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
return NuiDrawListPolyLine(JsonBool(TRUE), NuiColor(0, 0, 0, 127), JsonBool(TRUE), JsonFloat(2.0), jPoints);
}
void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0, int nClass=0)
{
SetLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_FEATID_VAR, featID);
SetLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_SPELLID_VAR, spellId);
SetLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_REAL_SPELLID_VAR, realSpellId);
SetLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_CLASSID_VAR, nClass);
ExecuteScript("prc_nui_dsc_view", oPlayer);
}
void ClearSpellDescriptionNUI(object oPlayer=OBJECT_SELF)
{
DeleteLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_FEATID_VAR);
DeleteLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_SPELLID_VAR);
DeleteLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_REAL_SPELLID_VAR);
DeleteLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_CLASSID_VAR);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,165 +0,0 @@
//::///////////////////////////////////////////////
//:: OnPlayerChat eventscript
//:: prc_onplayerchat
//:://////////////////////////////////////////////
/*
A OnChat script that parses what is said and
uses any commands or NUI associated with
commands.
*/
//:://////////////////////////////////////////////
//:: Updated By: Rakiov
//:: Created On: 22.05.2005
//:://////////////////////////////////////////////
/*
PRC Chat Command Format:
~~command arg1 arg2 arg3 arg4 arg5
OR:
..command arg1 arg2 arg3 arg4 arg5
*/
#include "prc_alterations"
#include "prc_inc_chat"
#include "prc_inc_chat_dm"
#include "prc_inc_chat_pow"
#include "prc_inc_chat_shf"
#include "nw_inc_nui"
#include "prc_string_inc"
#include "prc_nui_sb_inc"
#include "prc_nui_consts"
#include "prc_nui_lv_inc"
const string CHAT_COMMAND_INDICATOR_1 = "~~";
const string CHAT_COMMAND_INDICATOR_2 = "..";
const int CHAT_COMMAND_INDICATOR_LENGHT = 2;
int GetIsChatCommand(string sString)
{
string sTest = GetStringLeft(sString, CHAT_COMMAND_INDICATOR_LENGHT);
if(sTest == CHAT_COMMAND_INDICATOR_1
|| sTest == CHAT_COMMAND_INDICATOR_2)
return TRUE;
return FALSE;
}
string RemoveChatCommandIndicator(string sString)
{
return GetStringRight(sString, GetStringLength(sString) - CHAT_COMMAND_INDICATOR_LENGHT);
}
void main()
{
object oPC = GetPCChatSpeaker();
string sChat = GetPCChatMessage();
if(GetIsChatCommand(sChat))
{
sChat = RemoveChatCommandIndicator(sChat);
SetPCChatVolume(TALKVOLUME_TELL); //Set volume for all chat commands
if(GetStringWord(sChat, 1) == "help")
{
if(GetStringWord(sChat, 2) == "")
{
HelpText(oPC, "=== HELP SUMMARY");
HelpText(oPC, "");
HelpText(oPC, "Chat commands start with ~~ or .. followed by the command name and then any parameters.");
HelpText(oPC, " For example '~~execute test_script' will run the script named 'test_script'.");
HelpText(oPC, "");
HelpText(oPC, "A hyphen in a command name indicates that the word may be abbreviated as short as the point where the hyphen is.");
HelpText(oPC, " For example, 'exec-ute' may be entered as 'execute', 'execu', or 'exec', but not as 'exe'.");
HelpText(oPC, "");
HelpText(oPC, "Typing '~~help' displays a summary of the available commands (what you're reading now).");
HelpText(oPC, "Typing '~~help <command-name>' displays more detailed information about the specified command.");
HelpText(oPC, "");
}
if (Debug_ProcessChatCommand_Help(oPC, sChat))
{}
else if (PowerAttack_ProcessChatCommand_Help(oPC, sChat))
{}
else if (PnPShifter_ProcessChatCommand_Help(oPC, sChat))
{}
}
else
{
if (Debug_ProcessChatCommand(oPC, sChat))
{}
else if (PowerAttack_ProcessChatCommand(oPC, sChat))
{}
else if (PnPShifter_ProcessChatCommand(oPC, sChat))
{}
else
SendMessageToPC(oPC, "Unrecognized chat command: " + sChat);
}
}
else if(GetLocalInt(oPC, PRC_CHAT_HOOK_ACTIVE))
{
SetPCChatVolume(TALKVOLUME_TELL);
SetLocalString(oPC, PRC_PLAYER_RESPONSE, sChat);
ExecuteScript(GetLocalString(oPC, PRC_CHAT_HOOK_SCRIPT), oPC);
_clear_chat_vars(oPC);
}
// get current player message and split it up into a list
string sCommand = GetPCChatMessage();
json sCommandSplit = StringSplit(sChat);
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(oPC, "PRC_PowerAttack_Level", paAmount);
ExecuteScript("prc_nui_pa_trggr", oPC);
// update the NUI so it is in sync
int nToken = NuiFindWindow(oPC, NUI_PRC_POWER_ATTACK_WINDOW);
if (nToken != 0)
{
NuiSetBind(oPC, nToken, NUI_PRC_PA_TEXT_BIND, JsonString(IntToString(paAmount)));
}
}
else
{
// if no param is given then open the NUI
ExecuteScript("prc_nui_pa_view", oPC);
}
// clear message from chat
SetPCChatMessage();
return;
}
// If the first word is /sb then we open the Spellbook NUI
if(firstWord == "/sb")
{
ExecuteScript("prc_nui_sb_view", oPC);
// clear message from chat
SetPCChatMessage();
return;
}
if (firstWord == "/lvl")
{
if (JsonGetLength(sCommandSplit) >= 2)
{
int classPos = StringToInt(JsonGetString(JsonArrayGet(sCommandSplit, 1)));
int nClass = GetClassByPosition(classPos, oPC);
OpenNUILevelUpWindow(nClass, oPC);
SetPCChatMessage();
return;
}
}
}
// Execute scripts hooked to this event for the player triggering it
ExecuteAllScriptsHookedToEvent(oPC, EVENT_ONPLAYERCHAT);
}

View File

@@ -1,147 +0,0 @@
/*
----------------
Pearl of Black Doubt
tob_dmnd_prlbdt
----------------
15/07/07 by Stratovarius
*/ /** @file
Pearl of Black Doubt
Diamond Mind (Stance)
Level: Swordsage 3, Warmage 3
Prerequisite: One Diamond Mind maneuver.
Initiation Action: 1 Swift Action
Range: Personal
Target: You
Duration: Stance
With every miss, your opponents become more uncertain,
their doubt growing like an irritating pearl in the mouth
of a helpless oyster.
You prey on your opponents' fear and lack of confidence.
Each failed attack against you reminds them that their
skill cannot hope to match yours.
When you enter this stance, you become more difficult to
hit with each successive attack that misses you. Each
time an opponent misses you with a melee attack, you
gain a +2 dodge bonus to AC. This bonus lasts until the
start of your next turn and is cumulative for the round.
The bonus applies to any attacks made by all opponents
until the beginning of your next turn.
*/
#include "x0_i0_match"
#include "tob_inc_move"
#include "tob_movehook"
////#include "prc_alterations"
#include "x0_i0_match"
#include "tob_inc_move"
#include "tob_movehook"
const float POBD_RADIUS_MELEE = 8.0;
int GetApproximateAPR(object oCreature)
{
int nBAB = GetBaseAttackBonus(oCreature);
int nAttacks = 1;
if (nBAB >= 6) nAttacks++;
if (nBAB >= 11) nAttacks++;
if (nBAB >= 16) nAttacks++;
if (GetHasEffect(EFFECT_TYPE_HASTE, oCreature))
{
nAttacks++;
}
return nAttacks;
}
void PoBDZeroRecursive(object oTarget)
{
if (GetHasSpellEffect(MOVE_DM_PEARL_BLACK_DOUBT, oTarget))
{
DeleteLocalInt(oTarget, "PearlOfBlackDoubtBonus");
DelayCommand(6.0, PoBDZeroRecursive(oTarget));
}
}
void PoBDACRecursive(object oTarget)
{
if (!GetHasSpellEffect(MOVE_DM_PEARL_BLACK_DOUBT, oTarget))
return;
if (!GetIsInCombat(oTarget))
{
DeleteLocalInt(oTarget, "PearlOfBlackDoubtBonus");
return;
}
int nTotalAPR = 0;
location lLoc = GetLocation(oTarget);
object oEnemy = GetFirstObjectInShape(SHAPE_SPHERE, 8.0, lLoc, TRUE, OBJECT_TYPE_CREATURE);
while (GetIsObjectValid(oEnemy))
{
if (GetIsEnemy(oTarget, oEnemy) && GetIsInCombat(oEnemy))
{
// Melee only: must be in range and not holding ranged weapon
object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oEnemy);
int nWeaponBase = GetBaseItemType(oWeapon);
if (nWeaponBase == BASE_ITEM_INVALID || !GetWeaponRanged(oWeapon))
{
nTotalAPR += GetApproximateAPR(oEnemy);
}
}
oEnemy = GetNextObjectInShape(SHAPE_SPHERE, 8.0, lLoc);
}
int nBonus = 0;
if (nTotalAPR > 0)
{
nBonus = 2 * nTotalAPR;
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(EffectACIncrease(nBonus)), oTarget, 6.0);
}
SetLocalInt(oTarget, "PearlOfBlackDoubtBonus", nBonus);
DelayCommand(1.0, PoBDACRecursive(oTarget));
}
void main()
{
if (!PreManeuverCastCode())
return;
object oInitiator = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
struct maneuver move = EvaluateManeuver(oInitiator, oTarget);
if (!move.bCanManeuver)
return;
object oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oInitiator);
IPSafeAddItemProperty(
oItem,
ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1),
9999.0,
X2_IP_ADDPROP_POLICY_KEEP_EXISTING,
FALSE,
FALSE
);
effect eDur = EffectVisualEffect(VFX_DUR_BLUESHIELDPROTECT);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(eDur), oTarget, 9999.0);
PoBDACRecursive(oInitiator);
PoBDZeroRecursive(oInitiator);
}