generated from Jaysyn/ModuleTemplate
2025/12/27
Hooked up new GUI module event. Hooked up NUI module event. Updated merge 2DAs. Updated PRC8 includes. Updated merge TLK.
This commit is contained in:
23
nasher.cfg
23
nasher.cfg
@@ -231,8 +231,16 @@ description = "PRC8 version of U1-3 - The Sinister Secret of Saltmarsh."
|
||||
filter = "prc_nui_sc_inc.nss"
|
||||
filter = "prc_nui_scd_inc.nss"
|
||||
filter = "prc_nui_consts.nss"
|
||||
filter = "nw_inc_nui"
|
||||
filter = "nw_inc_nui.nss"
|
||||
filter = "xchst_inc.nss"
|
||||
filter = "prc_nui_sbd_inc.nss"
|
||||
filter = "prc_nui_sb_inc.nss"
|
||||
filter = "prc_nui_lv_inc.nss"
|
||||
filter = "prc_nui_com_inc.nss"
|
||||
filter = "prc_inc_size.nss"
|
||||
filter = "prc_inc_json.nss"
|
||||
filter = "prc_inc_gff.nss"
|
||||
filter = "inc_infusion.nss"
|
||||
|
||||
[target]
|
||||
name = "tlk"
|
||||
@@ -252,6 +260,7 @@ description = "Merge hakpak for the PRC8 version of U1-3 - The Sinister Secret o
|
||||
include = "src/hakpak/salt_prc8_top/**/*"
|
||||
include = "src/include/**/*"
|
||||
filter = "bnd_inc_bndfunc.nss"
|
||||
filter = "bnd_inc_bndfunc.nss"
|
||||
filter = "bnd_vestig_const.nss"
|
||||
filter = "inc_2dacache.nss"
|
||||
filter = "inc_abil_damage.nss"
|
||||
@@ -462,8 +471,16 @@ description = "Merge hakpak for the PRC8 version of U1-3 - The Sinister Secret o
|
||||
filter = "prc_nui_sc_inc.nss"
|
||||
filter = "prc_nui_scd_inc.nss"
|
||||
filter = "prc_nui_consts.nss"
|
||||
filter = "nw_inc_nui"
|
||||
filter = "xchst_inc.nss"
|
||||
filter = "nw_inc_nui.nss"
|
||||
filter = "xchst_inc.nss"
|
||||
filter = "prc_nui_sbd_inc.nss"
|
||||
filter = "prc_nui_sb_inc.nss"
|
||||
filter = "prc_nui_lv_inc.nss"
|
||||
filter = "prc_nui_com_inc.nss"
|
||||
filter = "prc_inc_size.nss"
|
||||
filter = "prc_inc_json.nss"
|
||||
filter = "prc_inc_gff.nss"
|
||||
filter = "inc_infusion.nss"
|
||||
|
||||
[target.rules]
|
||||
"*" = "src/hakpak/salt_prc8_top/$ext"
|
||||
@@ -1 +1 @@
|
||||
nasher pack default --verbose
|
||||
nasher pack default --verbose -d
|
||||
@@ -16,7 +16,7 @@
|
||||
12 172 twobladedsword 2 5 0x1C010 1 2 WDbSw 0 1 1 1 it_bag iwdbsw 0 8 3 4 **** 1.5 10 255 1 8 2 2 1 100 1 2 1702 10 8 0 0 1 **** **** **** **** **** 4 0 0 5431 0 1 150 11 **** **** **** 50 50 50 99 1 127 655 165 693 89 745 531 943 **** ****
|
||||
13 167 greatsword 2 5 0x1C030 1 2 WSwGs 0 1 1 1 it_bag iwswgs 0 **** 3 3 **** 1.8 10 255 2 6 2 2 1 50 1 2 1693 9 8 0 0 1 **** **** **** **** **** 4 0 0 5427 0 1 150 11 **** **** **** 65 65 35 99 1 107 637 145 675 69 727 513 929 **** ****
|
||||
14 179 smallshield 2 2 0x00020 0 0 AShSw 0 1 1 1 it_bag iashsw 0 7 0 **** **** **** 10 255 **** **** **** **** 3 9 1 1 2287 16 8 0 6 0 32 4565 **** **** **** 3 1 -1 5443 0 1 60 **** **** **** 5 **** **** **** 7 1 **** **** **** **** **** **** **** **** **** ****
|
||||
15 180 torch 1 3 0x00020 1 0 it_torch 0 **** **** **** it_bag iit_torch_000 0 1 0 2 **** **** 0 255 **** **** **** **** 20 1 1 0.02 1725 17 8 0 20 4 **** **** **** **** **** **** 0 0 5444 0 1 1 **** **** **** **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||
15 180 torch 1 3 0x00020 1 0 it_torch 0 **** **** **** it_bag iit_torch_000 0 1 0 2 **** **** 0 255 **** **** **** **** 20 1 1 0.02 1725 17 8 0 20 4 **** **** **** **** **** **** 0 0 5444 0 1 1 **** **** **** **** **** **** **** 0 1 **** **** **** **** **** **** **** **** 1 ****
|
||||
16 335 armor 2 3 0x00002 0 3 AArCl 1 1 **** **** gifp iit_chest 0 **** 0 **** **** **** 0 255 **** **** **** **** 4 **** 1 1 **** 30 8 0 6 0 **** **** **** **** **** 2 0 0 **** 0 0 100 **** **** **** **** **** **** **** 10 1 **** **** **** **** **** **** **** **** **** ****
|
||||
17 182 helmet 2 2 0x00001 0 1 helm 0 1 **** **** it_bag ihelm 0 **** 0 **** **** **** 0 255 **** **** **** **** 5 3 1 1 1710 0 8 0 7 0 **** **** **** **** **** 4 0 0 5445 0 0 20 **** **** **** **** **** **** **** 5 1 **** **** **** **** **** **** **** **** **** ****
|
||||
18 515 greataxe 2 4 0x1C030 1 2 WAxGr 0 1 1 1 it_bag iwaxgr 0 **** 3 3 **** 1.4 10 255 1 12 1 3 1 20 1 2 1692 9 8 0 0 1 **** **** **** **** **** 4 0 0 5426 0 1 200 17 **** **** **** 100 100 0 73 1 111 641 149 679 73 731 517 932 **** ****
|
||||
@@ -46,10 +46,10 @@
|
||||
42 1536 kukri 1 2 0x1C030 1 2 WSpKu 0 1 1 1 it_bag iwspku 0 **** 3 1 **** 1.2 10 255 1 4 3 2 1 8 1 2 2284 8 8 0 0 1 **** **** **** **** **** 4 0 0 5442 0 1 30 18 **** **** **** 65 65 35 18 1 118 648 156 686 80 738 524 881 **** 1
|
||||
43 **** DELETED **** **** 0x00000 **** **** **** **** **** **** **** it_bag **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
44 1538 magicrod 1 3 0x00000 1 2 WMgRd 0 1 1 1 it_bag iwmgrd 0 **** **** **** **** **** 10 255 **** **** **** **** 8 1 1 1 1708 16 8 0 4 3 **** **** **** **** **** **** 0 0 66197 50 1 20 **** **** 1 **** **** **** **** 10 1 **** **** **** **** **** **** **** **** **** ****
|
||||
45 1539 magicstaff 1 5 0x1C010 1 2 WMgSt 0 1 1 1 it_bag iwmgst 0 4 2 3 **** 1.6 10 255 1 6 1 2 8 1 1 1 1709 15 8 3 3 3 **** **** **** **** **** 4 0 0 76436 50 1 40 4 **** **** **** 50 50 50 10 1 **** **** **** **** **** **** **** **** **** ****
|
||||
45 1539 magicstaff 1 5 0x1C010 1 2 WMgSt 0 1 1 1 it_bag iwmgst 0 4 2 3 **** 1.6 10 255 1 6 1 2 8 1 1 1 1709 15 8 3 3 3 **** **** **** **** **** 4 0 0 76436 50 1 40 4 **** **** **** 50 50 50 10 1 96 626 134 664 58 716 502 923 1 ****
|
||||
46 1540 magicwand 1 2 0x1C030 1 2 WMgWn 0 1 1 1 it_bag iwmgwn 0 1 2 1 **** **** 0 255 1 1 1 1 8 1 1 1 1707 16 1 1 10 3 **** **** **** **** **** **** 0 0 66196 50 1 10 4 **** 1 **** **** **** **** 10 1 **** **** **** **** **** **** **** **** **** ****
|
||||
47 1541 morningstar 1 3 0x1C030 1 2 WBlMs 0 1 1 1 it_bag iwblms 0 **** 5 3 **** 1.4 10 255 1 8 1 2 1 8 1 2 1671 11 8 0 0 1 **** **** **** **** **** 4 0 0 5412 0 1 80 3 **** **** **** 100 100 0 20 1 95 625 133 663 57 715 501 922 **** ****
|
||||
48 0 DELETED 2 2 0x1C030 0 2 WSpNn 0 1 1 1 it_bag **** 0 **** 0 2 **** **** 10 255 1 6 1 2 1 2 1 2 1700 30 8 0 0 **** **** **** **** **** **** 4 0 0 5397 0 1 20 **** **** **** **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||
48 0 DELETED 2 2 0x1C030 0 2 WSpNn 0 1 1 1 it_bag **** 0 **** 0 2 **** **** 10 255 1 6 1 2 **** 2 1 2 1700 30 8 0 0 **** **** **** **** **** **** 4 0 0 5397 0 1 20 **** **** **** **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||
49 1543 potions 1 2 0x00000 0 2 it_potion 0 **** **** **** it_potion_000 iit_potion 0 1 0 **** **** **** 10 255 **** **** **** **** 9 1 10 0.2 1719 24 1 0 8 2 **** **** **** **** **** **** 0 0 5455 0 2 1 **** **** 2 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||
50 1544 quarterstaff 1 4 0x1C010 1 2 WDbQs 0 1 1 1 it_bag iwdbqs 0 4 2 3 **** 1.6 10 255 1 6 1 2 1 1 1 2 1673 15 8 0 0 1 **** **** **** **** **** 4 0 0 5413 0 1 40 4 **** **** **** 50 50 50 99 1 96 626 134 664 58 716 502 923 1 ****
|
||||
51 1545 rapier 1 3 0x1C030 1 2 WSwRp 0 1 1 1 it_bag iwswrp 0 **** 1 3 **** 1.4 10 255 1 6 3 2 1 20 1 2 1688 7 8 0 0 1 **** **** **** **** **** 4 0 0 5418 0 1 30 18 **** **** **** 35 35 65 28 1 104 634 142 672 66 724 510 926 **** 3
|
||||
@@ -104,7 +104,7 @@
|
||||
100 **** RESERVED_poisons **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
101 76389 empty_potion 1 2 0x00000 0 2 it_potion 0 **** **** **** it_potion_000 iit_potion 0 1 0 **** **** **** 10 255 **** **** **** **** 9 1 1 0.2 86786 24 1 0 8 2 **** **** **** **** **** **** 0 0 5455 0 2 1 **** **** 2 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||
102 76390 blank_scroll 1 1 0x00000 0 0 IT_SCROLL 0 **** **** **** gi_scrl iit_scroll_002 0 1 0 **** **** **** 0 255 **** **** **** **** 10 1 1 0.36 86787 27 1 0 9 2 **** **** **** **** **** **** 0 0 5470 0 0 1 **** **** 2 **** **** **** **** 1 1 **** **** **** **** **** **** **** **** **** ****
|
||||
103 76391 blank_magicwand 1 2 0x00000 1 2 WMGWn 0 1 1 1 it_bag iwmgwn 0 **** **** **** **** **** 10 255 **** **** **** **** 8 1 1 1 86788 16 1 0 1 3 **** **** **** **** **** **** 0 0 66196 50 1 10 **** **** 1 **** **** **** **** 10 1 **** **** **** **** **** **** **** **** **** ****
|
||||
103 76391 blank_magicwand 1 2 0x1C030 1 2 WMGWn 0 1 1 1 it_bag iwmgwn 0 1 2 1 **** **** 10 255 1 1 1 1 8 1 1 1 86788 16 1 0 1 3 **** **** **** **** **** **** 0 0 66196 50 1 10 4 **** 1 **** **** **** **** 10 1 **** **** **** **** **** **** **** **** **** ****
|
||||
104 83365 crafted_potion 1 2 0x00000 0 2 it_potion 0 **** **** **** it_potion_000 iit_potion 0 1 0 **** **** **** 10 255 **** **** **** **** 9 1 10 0.2 1719 24 1 0 8 2 **** **** **** **** **** **** 0 0 5455 0 2 1 **** **** 2 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||
105 83364 crafted_scroll 1 1 0x00000 0 0 IT_SCROLL 0 **** **** **** gi_scrl iit_scroll_002 0 1 0 **** **** **** 0 255 **** **** **** **** 10 1 10 0.36 1718 27 1 0 9 2 **** **** **** **** **** **** 0 0 5470 0 0 1 **** **** 2 **** **** **** **** 1 1 **** **** **** **** **** **** **** **** **** ****
|
||||
106 83363 crafted_magicwand 1 2 0x1C030 1 2 WMGWn 0 1 1 1 it_bag iwmgwn 0 1 2 1 **** **** 0 255 1 1 1 1 8 1 1 1 1707 16 1 1 10 3 **** **** **** **** **** **** 0 0 66196 50 1 10 4 **** 1 **** **** **** **** 10 1 **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -126,7 +126,7 @@
|
||||
122 16807269 heavy_mace 1 3 0x1C030 1 2 wxblmh 0 1 1 1 it_bag iwxblmh 0 **** 2 3 **** 1.2 10 255 1 8 1 2 1 6 1 2 16807270 14 8 0 0 1 **** **** **** **** **** 4 0 0 16807271 0 1 80 2 **** **** **** 100 100 0 99 1 24609 24621 24633 24645 24657 24669 24681 24693 **** ****
|
||||
123 16807272 maul 2 4 0x1C030 1 2 wxblma 0 1 1 1 it_bag iwxblma 0 **** 2 3 **** 1.2 10 255 1 10 1 3 1 8 1 2 16807273 14 8 0 0 1 **** **** **** **** **** 4 0 0 16807274 0 1 200 12 **** **** **** 100 100 0 99 1 24610 24622 24634 24646 24658 24670 24682 24694 **** ****
|
||||
124 16807275 scimitar_double 2 5 0x1c010 1 2 wxdbsc 0 1 1 1 it_bag iwxdbsc 0 8 3 4 **** 1.5 10 255 1 6 3 2 1 63 1 2 16807276 10 8 0 0 1 **** **** **** **** **** 4 0 0 16807277 0 1 150 11 **** **** **** 50 50 50 99 1 24611 24623 24635 24647 24659 24671 24683 24695 **** ****
|
||||
125 16807284 goad 1 2 0x1C030 0 2 wspgd 0 1 1 1 it_bag iwspgd 0 **** 1 2 **** 1.1 10 255 1 6 1 2 1 6 1 2 16807285 8 8 0 0 1 **** **** **** **** **** 4 0 0 16807286 0 1 30 18 **** **** **** 35 35 65 22 1 24612 24624 24636 24348 24660 24672 24684 24596 **** 2
|
||||
125 16807284 goad 2 2 0x1C030 0 2 wspgd 0 1 1 1 it_bag iwspgd 0 **** 1 2 **** 1.1 10 255 1 6 1 2 1 6 1 2 16807285 8 8 0 0 1 **** **** **** **** **** 4 0 0 16807286 0 1 30 18 **** **** **** 35 35 65 22 1 24612 24624 24636 24348 24660 24672 24684 24596 **** 2
|
||||
126 16793718 eagleclaw 1 2 0x1C030 1 2 wswec 0 1 1 1 it_bag iwswec 0 **** 4 2 **** 1.2 10 255 1 6 3 2 1 20 1 2 16793719 8 8 0 0 1 **** **** **** **** **** 4 0 0 16793720 0 1 20 1 **** **** **** 35 35 65 19 1 24721 24722 24723 24724 24725 24726 24727 24728 **** 2
|
||||
127 **** padding **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
128 **** padding **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -250,11 +250,11 @@
|
||||
246 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
247 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
248 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
249 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
250 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
249 16989399 crafted_scepter 1 3 0x1C030 1 2 WMgRd 0 1 1 1 it_bag iwmgrd 0 **** 2 3 **** 1.2 10 255 1 6 1 2 8 10 1 1 16989400 16 8 0 4 3 **** **** **** **** **** **** 4 0 16989401 50 1 30 2 **** 1 **** 100 100 0 10 1 43 619 47 657 15 709 495 919 **** ****
|
||||
250 16989402 crafted_vial 1 2 0x00000 0 0 it_thnmisc 0 1 1 1 it_potion_000 iit_thnmisc_019 0 1 0 **** **** **** 0 255 **** **** **** **** 16 0 1 1 16989403 24 8 0 15 3 **** **** **** **** **** **** 0 0 5470 0 0 3 **** **** 1 **** **** **** **** 0 1 **** **** **** **** **** **** **** **** **** ****
|
||||
251 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
252 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
253 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
252 16989220 mundane_herb 1 1 0x00000 0 0 it_herb 0 **** **** **** it_bag iit_herb_000 0 1 0 **** **** **** 0 255 **** **** **** **** 16 1 1 0.36 16989221 2 1 0 9 2 **** **** **** **** **** **** 0 0 5470 0 0 0 **** **** 2 **** **** **** **** 1 1 **** **** **** **** **** **** **** **** **** ****
|
||||
253 16989222 infused_herb 1 1 0x00000 0 0 it_herb 0 **** **** **** it_bag iit_herb_254 0 1 0 **** **** **** 0 255 **** **** **** **** 16 1 10 0.36 16989223 2 1 0 9 2 **** **** **** **** **** **** 0 0 5470 0 0 0 **** **** 2 **** **** **** **** 1 1 **** **** **** **** **** **** **** **** **** ****
|
||||
254 **** ***WIKI_LAST_ROW*** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
255 **** USER **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
256 **** USER **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
|
||||
@@ -12,26 +12,26 @@
|
||||
8 Rogue 112195 16 17 4898 248 IR_ROGUE 6 CLS_ATK_2 CLS_FEAT_ROG CLS_SAVTHR_ROG CLS_SKILL_ROG CLS_BFEAT_ROG 8 **** **** 1 0 12 16 14 8 14 12 DEX 0X00 0X0 0 CLASS_TYPE_ROGUE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ROG 0 1 0 0 -1 8 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
9 Sorcerer 112196 18 19 4899 249 IR_SORCERER 4 CLS_ATK_3 CLS_FEAT_SORC CLS_SAVTHR_SORC CLS_SKILL_SORC CLS_BFEAT_SORC 2 CLS_SPGN_SORC CLS_SPKN_SORC 1 1 10 14 14 10 12 16 CHA 0X00 0X0 0 CLASS_TYPE_SORCERER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SORC 0 1 0 0 -1 9 131 **** 0 1 0 0 0 1 1 CHA Wiz_Sorc 1 1 1 0 0
|
||||
10 Wizard 112197 20 21 4900 250 IR_WIZARD 4 CLS_ATK_3 CLS_FEAT_WIZ CLS_SAVTHR_WIZ CLS_SKILL_WIZ CLS_BFEAT_WIZ 2 CLS_SPGN_WIZ **** 1 1 10 14 14 12 16 10 INT 0X00 0X0 0 CLASS_TYPE_WIZARD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WIZ 0 1 0 0 -1 10 209 **** 1 1 0 1 1 1 1 INT Wiz_Sorc 1 1 1 0 0
|
||||
11 Aberration 112198 525 525 4901 8154 IR_WIZARD 8 CLS_ATK_2 CLS_FEAT_ABER CLS_SAVTHR_WIZ CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 1 0 14 14 11 14 3 5 STR 0X00 0X0 0 CLASS_TYPE_ABERRATION 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ABER 0 0 0 0 -1 73 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
11 Aberration 112198 525 525 4901 8154 IR_WIZARD 8 CLS_ATK_2 CLS_FEAT_ABER CLS_SAVTHR_WIZ CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 1 0 14 14 11 14 3 5 STR 0X00 0X0 0 CLASS_TYPE_ABERRATION 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ABER 0 0 0 0 -1 73 0 **** **** **** **** **** **** **** **** **** Aberration **** **** **** **** ****
|
||||
12 Animal 112199 526 526 4902 8154 IR_WIZARD 8 CLS_ATK_2 CLS_FEAT_CREA CLS_SAVTHR_WILD CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 0 0 13 17 15 12 2 6 STR 0X00 0X0 0 CLASS_TYPE_ANIMAL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ANI 0 0 0 0 -1 74 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
13 Construct 112200 528 528 4903 8154 IR_WIZARD 10 CLS_ATK_2 CLS_FEAT_CREA CLS_SAVTHR_CONS CLS_SKILL_CREA CLS_BFEAT_BARB 0 **** **** 1 0 21 9 10 11 10 3 STR 0X00 0X0 0 CLASS_TYPE_CONSTRUCT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_CON 0 0 0 0 -1 75 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
14 Humanoid 112201 1763 1764 4904 8154 IR_WIZARD 8 CLS_ATK_2 CLS_FEAT_CREA CLS_SAVTHR_FIGHT CLS_SKILL_CREA CLS_BFEAT_BARB 6 **** **** 1 0 15 10 13 11 8 8 STR 0X00 0X0 0 CLASS_TYPE_HUMANOID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_HUM 0 0 0 0 -1 76 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
15 Monstrous 112202 536 536 4905 8154 IR_WIZARD 8 CLS_ATK_1 CLS_FEAT_MONHUM CLS_SAVTHR_BARD CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 1 0 19 10 15 10 7 8 STR 0X00 0X0 0 CLASS_TYPE_MONSTEROUS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_MON 0 0 0 0 -1 77 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
15 Monstrous 112202 536 536 4905 8154 IR_WIZARD 8 CLS_ATK_1 CLS_FEAT_MONHUM CLS_SAVTHR_BARD CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 1 0 19 10 15 10 7 8 STR 0X00 0X0 0 CLASS_TYPE_MONSTEROUS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_MON 0 0 0 0 -1 77 0 **** **** **** **** **** **** **** **** **** Monstrous **** **** **** **** ****
|
||||
16 Elemental 112203 539 539 4906 8154 IR_WIZARD 8 CLS_ATK_2 CLS_FEAT_CREA CLS_SAVTHR_FIGHT CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 1 0 17 8 13 11 4 11 STR 0X00 0X0 0 CLASS_TYPE_ELEMENTAL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ELE 0 0 0 0 -1 78 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
17 Fey 112204 540 540 4907 8154 IR_WIZARD 6 CLS_ATK_3 CLS_FEAT_FEY CLS_SAVTHR_BARD CLS_SKILL_FEY CLS_BFEAT_BARB 6 **** **** 1 0 10 15 11 15 14 18 DEX 0X00 0X0 0 CLASS_TYPE_FEY 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FEY 0 0 0 0 -1 79 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
17 Fey 112204 540 540 4907 8154 IR_WIZARD 6 CLS_ATK_3 CLS_FEAT_FEY CLS_SAVTHR_BARD CLS_SKILL_FEY CLS_BFEAT_BARB 6 **** **** 1 0 10 15 11 15 14 18 DEX 0X00 0X0 0 CLASS_TYPE_FEY 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FEY 0 0 0 0 -1 79 0 **** **** **** **** **** **** **** **** **** Fey **** **** **** **** ****
|
||||
18 Dragon 112205 529 529 4908 8154 IR_DRGNFIREADPT 12 CLS_ATK_1 CLS_FEAT_DRAG CLS_SAVTHR_MONK CLS_SKILL_DRAGON CLS_BFEAT_BARB 6 **** **** 1 0 13 10 13 10 11 10 STR 0X00 0X0 0 CLASS_TYPE_DRAGON 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DRAG 0 0 0 0 -1 80 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
19 Undead 112206 547 547 4909 8154 IR_WIZARD 12 CLS_ATK_3 CLS_FEAT_CREA CLS_SAVTHR_WIZ CLS_SKILL_CREA CLS_BFEAT_BARB 4 **** **** 1 0 10 12 10 10 10 11 STR 0X00 0X0 0 CLASS_TYPE_UNDEAD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_UNDEAD 0 0 0 0 -1 81 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
20 Commoner 112207 2291 2292 4910 8155 IR_WIZARD 4 CLS_ATK_3 CLS_FEAT_COMM CLS_SAVTHR_CONS CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 1 0 10 10 12 10 10 10 STR 0X00 0X0 0 CLASS_TYPE_COMMONER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 **** 0 0 0 0 -1 82 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
21 Beast 112208 527 527 4911 8154 IR_WIZARD 10 CLS_ATK_2 CLS_FEAT_CREA CLS_SAVTHR_WILD CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 0 0 16 13 16 3 12 8 STR 0X00 0X0 0 CLASS_TYPE_BEAST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BEAST 0 0 0 0 -1 83 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
22 Giant 112209 541 541 4912 8154 IR_WIZARD 8 CLS_ATK_2 CLS_FEAT_GIAN CLS_SAVTHR_FIGHT CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 1 0 25 8 19 10 6 17 STR 0X00 0X0 0 CLASS_TYPE_GIANT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_GIANT 0 0 0 0 -1 84 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
23 MagicBeast 112210 542 542 4913 8154 IR_WIZARD 10 CLS_ATK_1 CLS_FEAT_CREA CLS_SAVTHR_WILD CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 0 0 15 8 15 12 2 10 STR 0X00 0X0 0 CLASS_TYPE_MAGICAL_BEAST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_MAGBST 0 0 0 0 -1 85 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
24 Outsider 112211 4812 4812 4914 8154 IR_WIZARD 8 CLS_ATK_1 CLS_FEAT_OUTS CLS_SAVTHR_MONK CLS_SKILL_OUTS CLS_BFEAT_BARB 8 **** **** 1 0 15 10 13 13 10 12 STR 0X00 0X0 0 CLASS_TYPE_OUTSIDER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_OUTS 0 0 0 0 -1 86 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25 Shapechanger 112212 546 546 4915 8154 IR_WIZARD 8 CLS_ATK_2 CLS_FEAT_SHCHNG CLS_SAVTHR_MONK CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 1 0 15 11 17 10 10 10 STR 0X00 0X0 0 CLASS_TYPE_SHAPECHANGER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHAPE 0 0 0 0 -1 87 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
24 Outsider 112211 4812 4812 4914 8154 IR_WIZARD 8 CLS_ATK_1 CLS_FEAT_OUTS CLS_SAVTHR_MONK CLS_SKILL_OUTS CLS_BFEAT_BARB 8 **** **** 1 0 15 10 13 13 10 12 STR 0X00 0X0 0 CLASS_TYPE_OUTSIDER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_OUTS 0 0 0 0 -1 86 0 **** **** **** **** **** **** **** **** **** Outsider **** **** **** **** ****
|
||||
25 Shapechanger 112212 546 546 4915 8154 IR_WIZARD 8 CLS_ATK_2 CLS_FEAT_SHCHNG CLS_SAVTHR_MONK CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 1 0 15 11 17 10 10 10 STR 0X00 0X0 0 CLASS_TYPE_SHAPECHANGER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHAPE 0 0 0 0 -1 87 0 **** **** **** **** **** **** **** **** **** Shapechanger **** **** **** **** ****
|
||||
26 Vermin 112213 548 548 4916 8154 IR_WIZARD 8 CLS_ATK_2 CLS_FEAT_CREA CLS_SAVTHR_FIGHT CLS_SKILL_CREA CLS_BFEAT_BARB 2 **** **** 0 0 11 17 12 10 10 3 STR 0X00 0X0 0 CLASS_TYPE_VERMIN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_VERMIN 0 0 0 0 -1 88 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
27 Shadowdancer 112214 2944 2945 2946 2947 IR_X1_SHADOW 8 CLS_ATK_2 CLS_FEAT_SHADOW CLS_SAVTHR_ROG CLS_SKILL_SHADOW CLS_BFEAT_SHADOW 6 **** **** 1 0 12 16 14 8 14 12 DEX 0X00 0X0 0 CLASS_TYPE_SHADOWDANCER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHADOW 40 0 0 0 10 63 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
28 Harper 112215 2956 2957 2958 2959 IR_X1_HARPER 6 CLS_ATK_2 CLS_FEAT_HARPER CLS_SAVTHR_BARD CLS_SKILL_HARPER CLS_BFEAT_HARPER 4 CLS_SPGN_HARPER CLS_SPKN_HARPER 0 1 12 16 14 8 14 12 DEX 0X10 0X2 0 CLASS_TYPE_HARPER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_HARPER 5 0 0 0 5 64 130 **** **** **** **** **** **** **** **** **** Harper **** **** **** **** ****
|
||||
29 Arcane_Archer 112216 9003 9004 9005 9006 IR_ARCHER 8 CLS_ATK_1 CLS_FEAT_ARCHER CLS_SAVTHR_WILD CLS_SKILL_ARCHER CLS_BFEAT_ARCHER 4 **** **** 1 0 12 16 14 8 14 12 DEX 0X00 0X0 0 CLASS_TYPE_ARCANE_ARCHER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ARCHER 40 0 0 0 10 65 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
30 Assassin 112217 9007 9008 9009 16790386 IR_ASASIN 6 CLS_ATK_2 CLS_FEAT_ASASIN CLS_SAVTHR_ROG CLS_SKILL_ASASIN CLS_BFEAT_ASASIN 4 CLS_SPGN_ASASIN CLS_SPKN_ASASIN 1 1 12 16 14 8 14 12 DEX 0X09 0X2 0 CLASS_TYPE_ASSASSIN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ASASIN 40 0 0 0 10 66 131 **** **** **** **** **** **** **** **** **** Assassin **** **** **** **** ****
|
||||
30 Assassin 112217 9007 9008 9009 16790386 IR_ASASIN 6 CLS_ATK_2 CLS_FEAT_ASASIN CLS_SAVTHR_ROG CLS_SKILL_ASASIN CLS_BFEAT_ASASIN 4 CLS_SPGN_ASASIN **** 1 1 12 16 14 8 14 12 DEX 0X09 0X2 0 CLASS_TYPE_ASSASSIN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ASASIN 40 0 0 0 10 66 131 **** 1 1 0 0 1 1 1 INT Assassin 1 1 255 0 0
|
||||
31 Blackguard 112218 9011 9012 9013 16790387 IR_BLKGRD 10 CLS_ATK_1 CLS_FEAT_BLKGRD CLS_SAVTHR_FIGHT CLS_SKILL_BLKGRD CLS_BFEAT_BLKGRD 2 CLS_SPGN_BLKGRD **** 1 1 12 16 14 8 14 12 CON 0X09 0X2 0 CLASS_TYPE_BLACKGUARD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BLKGRD 40 0 0 0 10 67 0 **** 1 0 0 0 0 0 0 WIS Blackguard 1 1 255 0 0
|
||||
32 Champion_Torm 112219 9015 9016 9017 9018 IR_DIVCHA 10 CLS_ATK_1 CLS_FEAT_DIVCHA CLS_SAVTHR_WILD CLS_SKILL_DIVCHA CLS_BFEAT_DIVCHA 2 **** **** 0 0 12 16 14 8 14 12 CHA 0X10 0X2 0 CLASS_TYPE_DIVINE_CHAMPION 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DIVCHA 40 0 0 0 10 109 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
33 WeaponMaster 112220 9019 9019 9021 9022 IR_WM 10 CLS_ATK_1 CLS_FEAT_WM CLS_SAVTHR_ROG CLS_SKILL_WM CLS_BFEAT_WM 2 **** **** 1 0 12 16 14 8 14 12 STR 0X00 0X0 0 CLASS_TYPE_WEAPON_MASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WM 40 0 0 0 10 112 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -40,7 +40,7 @@
|
||||
36 Dwarven_Defender 112223 76418 76419 76420 76422 IR_DWDEF 12 CLS_ATK_1 CLS_FEAT_DWDEF CLS_SAVTHR_CLER CLS_SKILL_DWDEF CLS_BFEAT_DWDEF 2 **** **** 1 0 16 8 15 14 10 12 STR 0X05 0X1 0 CLASS_TYPE_DWARVEN_DEFENDER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DWDEF 40 0 0 0 10 89 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
37 Dragon_Disciple 112224 16832127 16832128 16832129 16832130 IR_DRAGOND 6 CLS_ATK_2 CLS_FEAT_DRADIS CLS_SAVTHR_CLER CLS_SKILL_DRADIS CLS_BFEAT_DRADIS 2 **** **** 1 0 14 8 14 16 10 14 STR 0X00 0X0 0 CLASS_TYPE_DRAGON_DISCIPLE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DRADIS 40 0 0 0 10 111 0 cls_stat_dradis **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
38 Ooze 112225 84438 84438 84437 8154 IR_CLERIC 10 CLS_ATK_2 CLS_FEAT_CLER CLS_SAVTHR_CLER CLS_SKILL_CLER CLS_BFEAT_CLER 0 **** **** 0 0 14 8 14 16 10 14 STR 0X00 0X0 0 CLASS_TYPE_OOZE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_OOZE 0 0 0 0 -1 75 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
39 Eye_of_Gruumsh 16790665 16824294 16824295 16824296 16824297 IR_GRUUMSH 12 CLS_ATK_1 CLS_FEAT_EOG CLS_SAVTHR_BARB CLS_SKILL_EOG CLS_BFEAT_EOG 2 **** **** 1 0 16 14 14 14 10 8 STR 0X0A 0X3 0 CLASS_TYPE_PRC_EYE_OF_GRUUMSH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_EOG 40 0 0 0 10 17 0 cls_stat_eog **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
39 Eye_of_Gruumsh 16790665 16824294 16824295 16824296 16824297 IR_GRUUMSH 12 CLS_ATK_1 CLS_FEAT_EOG CLS_SAVTHR_BARB CLS_SKILL_EOG CLS_BFEAT_EOG 2 **** **** 0 0 16 14 14 14 10 8 STR 0X0A 0X3 0 CLASS_TYPE_PRC_EYE_OF_GRUUMSH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_EOG 40 0 0 0 10 17 0 cls_stat_eog **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
40 Shou_Disciple 16790649 16823346 16823347 16823348 16823349 IR_SHOUDISC 10 CLS_ATK_1 CLS_FEAT_SHOU CLS_SAVTHR_WILD CLS_SKILL_SHOU CLS_BFEAT_SHOU 2 **** **** 0 0 12 16 14 8 14 12 DEX 0X00 0X0 0 CLASS_TYPE_SHOU 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHOU 5 0 0 0 5 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
41 Purple_Dragon_Knight 112226 111710 111711 111712 111713 IR_PDK 10 CLS_ATK_1 CLS_FEAT_PDK CLS_SAVTHR_FIGHT CLS_SKILL_PDK CLS_BFEAT_PDK 2 **** **** 0 0 12 16 14 8 14 12 STR 0X14 0X3 0 CLASS_TYPE_PDK 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_PDK 5 0 0 0 5 131 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
42 UrPriest 16790529 16835606 16835607 16835608 16835609 IR_WARLOCK 8 CLS_ATK_2 CLS_FEAT_URPRST CLS_SAVTHR_WIZ CLS_SKILL_URPRST CLS_BFEAT_URPRST 2 CLS_SPGN_BLIGHT **** 1 1 15 9 14 13 10 15 WIS 0X09 0X2 0 CLASS_TYPE_UR_PRIEST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_URPRST 40 0 0 0 10 10 0 **** 1 0 0 0 0 0 0 WIS Cleric 1 1 255 0 0
|
||||
@@ -65,7 +65,7 @@
|
||||
61 Hexblade 16790548 16823462 16823463 16823464 16823465 IR_ELDKNI 10 CLS_ATK_1 CLS_FEAT_HEXBL CLS_SAVTHR_CLER CLS_SKILL_HEXBL CLS_BFEAT_HEXBL 2 CLS_SPGN_HEXBL CLS_SPKN_HEXBL 1 1 14 14 14 10 12 14 CHA 0X08 0X2 0 CLASS_TYPE_HEXBLADE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_HEXBL 0 1 0 0 -1 5 131 **** **** **** **** **** **** **** **** **** Hexblade **** **** **** **** ****
|
||||
62 Duskblade 16790549 16824168 16824169 16824170 16824171 IR_HAVOCMAGE 8 CLS_ATK_1 CLS_FEAT_DUSKBL CLS_SAVTHR_CLER CLS_SKILL_DUSKBL CLS_BFEAT_DUSKBL 2 CLS_SPGN_DUSKBL CLS_SPKN_DUSKBL 1 1 15 12 14 10 15 10 STR 0X00 0X0 0 CLASS_TYPE_DUSKBLADE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DUSKBL 0 1 0 0 -1 5 131 **** **** **** **** **** **** **** **** **** Duskblade **** **** **** **** ****
|
||||
63 Scout 16790550 16822486 16822513 16822514 16822515 IR_ARCHER 8 CLS_ATK_2 CLS_FEAT_SCOUT CLS_SAVTHR_ROG CLS_SKILL_SCOUT CLS_BFEAT_SCOUT 8 **** **** 1 0 12 16 12 14 12 10 DEX 0X00 0X0 0 CLASS_TYPE_SCOUT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SCOUT 0 1 0 0 -1 7 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
64 Healer 16790551 16822656 16822657 16822658 16822659 IR_CBTMEDIC 8 CLS_ATK_3 CLS_FEAT_HEALER CLS_SAVTHR_CLER CLS_SKILL_HEALER CLS_BFEAT_HEALER 4 CLS_SPGN_HEALER **** 1 1 10 12 12 15 10 16 WIS 0X11 0X2 0 CLASS_TYPE_HEALER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_HEALER 0 1 0 0 -1 2 0 **** 1 0 0 0 0 0 0 WIS Healer 1 1 255 0 0
|
||||
64 Healer 16790551 16822656 16822657 16822658 16822659 IR_CBTMEDIC 8 CLS_ATK_3 CLS_FEAT_HEALER CLS_SAVTHR_CLER CLS_SKILL_HEALER CLS_BFEAT_HEALER 4 CLS_SPGN_HEALER **** 1 1 10 12 12 15 10 16 WIS 0X11 0X2 0 CLASS_TYPE_HEALER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_HEALER 0 1 0 0 -1 895 0 **** 1 0 0 0 0 0 0 WIS Healer 1 1 255 0 0
|
||||
65 Mage_Killer 16790552 16822219 16822220 16822221 16822222 IR_MAGEKILL 4 CLS_ATK_3 CLS_FEAT_MAGEK CLS_SAVTHR_WIZ CLS_SKILL_MAGEK CLS_BFEAT_MAGEK 2 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_MAGEKILLER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_MAGEK 40 0 1 0 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
66 Harper_Mage 16790553 16822223 16822224 16822225 16822226 IEF_HARPWIZ 4 CLS_ATK_3 CLS_FEAT_HMAGE CLS_SAVTHR_WIZ CLS_SKILL_HMAGE CLS_BFEAT_HMAGE 4 **** **** 0 0 12 16 14 8 14 12 INT 0X10 0X2 0 CLASS_TYPE_HARPERMAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_HMAGE 5 0 1 0 5 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
67 Spell_Sword 16790554 16822227 16822228 16822229 16822230 IR_SPELLS 8 CLS_ATK_1 CLS_FEAT_SPELLS CLS_SAVTHR_CLER CLS_SKILL_SPELLS CLS_BFEAT_SPELLS 2 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_SPELLSWORD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SPELLS 40 0 2 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -74,13 +74,13 @@
|
||||
70 Eldritch_Knight 16790557 16822308 16822309 16822310 16822311 IR_ELDKNI 6 CLS_ATK_1 CLS_FEAT_ELDKNI CLS_SAVTHR_FIGHT CLS_SKILL_ELDKNI CLS_BFEAT_ELDKNI 2 **** **** 1 0 14 13 14 10 14 13 INT 0X00 0X0 0 CLASS_TYPE_ELDRITCH_KNIGHT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ELDKNI 40 0 1 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
71 Elemental_Savant 16790558 16822312 16822313 16822314 16822315 IR_ELEMFIRE 4 CLS_ATK_3 CLS_FEAT_SAVANT CLS_SAVTHR_WIZ CLS_SKILL_SAVANT CLS_BFEAT_SAVANT 2 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_ELEMENTAL_SAVANT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SAVANT 40 0 1 0 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
72 Factotum 16790559 16823092 16823093 16823094 16823095 IR_BEGUIL 8 CLS_ATK_2 CLS_FEAT_FACTUM CLS_SAVTHR_ROG CLS_SKILL_FACTUM CLS_BFEAT_FACTUM 6 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_FACTOTUM 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FACTUM 20 1 0 0 -1 8 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
73 CelebrantSharess 16790560 16826321 16826322 16826323 16826324 IR_HEARTW 6 CLS_ATK_3 CLS_FEAT_SHARSS CLS_SAVTHR_WIZ CLS_SKILL_SHARSS CLS_BFEAT_SHARSS 6 CLS_SPGN_SHARSS CLS_SPKN_SHARSS 0 1 12 16 14 8 14 12 CHA 0X13 0X3 0 CLASS_TYPE_CELEBRANT_SHARESS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHARSS 40 0 0 0 10 10 0 **** **** **** **** **** **** **** **** **** Celebrant **** **** **** **** ****
|
||||
73 CelebrantSharess 16790560 16826321 16826322 16826323 16826324 IR_HEARTW 6 CLS_ATK_3 CLS_FEAT_SHARSS CLS_SAVTHR_WIZ CLS_SKILL_SHARSS CLS_BFEAT_SHARSS 6 CLS_SPGN_SHARSS CLS_SPKN_SHARSS 0 1 12 16 14 8 14 12 CHA 0X13 0X3 0 CLASS_TYPE_CELEBRANT_SHARESS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHARSS 40 0 0 0 10 10 0 **** 0 0 0 0 0 1 1 CHA Celebrant **** **** 255 0 ****
|
||||
74 CultistShatteredPeak 16790561 16789654 16789655 16789656 16789657 IR_SPARCDLST 6 CLS_ATK_2 CLS_FEAT_CULTST CLS_SAVTHR_RANG CLS_SKILL_CULTST CLS_BFEAT_CULTST 6 CLS_SPGN_CULTST **** 0 1 12 16 14 8 14 12 DEX 0X00 0X0 0 CLASS_TYPE_CULTIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_CULTST 5 0 0 0 5 64 130 **** 1 1 0 0 1 1 1 INT Cultist 1 1 255 0 0
|
||||
75 Forsaker 16790562 16847610 16847611 16847612 16847613 IC_LEGDREAD 12 CLS_ATK_1 CLS_FEAT_FORSAK CLS_SAVTHR_CLER CLS_SKILL_FORSAK CLS_BFEAT_FORSAK 2 **** **** 1 0 16 13 16 10 10 9 STR 0X00 0X0 0 CLASS_TYPE_FORSAKER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FORSAK 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
76 Incarnate 16790563 16836706 16836707 16836708 16836709 IR_PSION 6 CLS_ATK_3 CLS_FEAT_INCARN CLS_SAVTHR_CLER CLS_SKILL_INCARN CLS_BFEAT_INCARN 2 **** **** 1 0 10 14 14 12 16 10 INT 0X01 0X3 1 CLASS_TYPE_INCARNATE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_INCARN 0 1 0 0 -1 8 130 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
77 Soulborn 16790564 16836718 16836719 16836720 16836721 IR_SOULKNIFE 10 CLS_ATK_1 CLS_FEAT_SOULBN CLS_SAVTHR_FIGHT CLS_SKILL_SOULBN CLS_BFEAT_SOULBN 2 **** **** 1 0 16 13 16 10 10 9 STR 0X01 0X3 0 CLASS_TYPE_SOULBORN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SOULBN 0 1 0 0 -1 8 130 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
78 Totemist 16790565 16836722 16836723 16836724 16836725 IR_PSYWARRIOR 8 CLS_ATK_2 CLS_FEAT_TOTEM CLS_SAVTHR_RANG CLS_SKILL_TOTEM CLS_BFEAT_TOTEM 4 **** **** 1 0 16 13 16 10 10 9 STR 0X00 0X0 0 CLASS_TYPE_TOTEMIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_TOTEM 0 1 0 0 -1 8 130 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
79 Beguiler 16790566 16789870 16789871 16789872 16789873 IR_BEGUIL 6 CLS_ATK_3 CLS_FEAT_BEGUIL CLS_SAVTHR_WIZ CLS_SKILL_BEGUIL CLS_BFEAT_BEGUIL 6 CLS_SPGN_BEGUIL CLS_SPKN_BEGUIL 1 1 10 14 14 12 16 10 INT 0X00 0X0 0 CLASS_TYPE_BEGUILER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BEGUIL 20 1 0 0 -1 8 130 **** **** **** **** **** **** **** **** **** Beguiler **** **** **** **** ****
|
||||
79 Beguiler 16790566 16789870 16789871 16789872 16789873 IR_BEGUIL 6 CLS_ATK_3 CLS_FEAT_BEGUIL CLS_SAVTHR_WIZ CLS_SKILL_BEGUIL CLS_BFEAT_BEGUIL 6 CLS_SPGN_BEGUIL CLS_SPKN_BEGUIL 1 1 10 14 14 12 16 10 INT 0X00 0X0 0 CLASS_TYPE_BEGUILER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BEGUIL 20 1 0 0 -1 700 130 **** **** **** **** **** **** **** **** **** Beguiler **** **** **** **** ****
|
||||
80 Duelist 16790567 16822716 16822717 16822718 16822719 IR_DUEL 10 CLS_ATK_1 CLS_FEAT_DUEL CLS_SAVTHR_ROG CLS_SKILL_DUEL CLS_BFEAT_DUEL 4 **** **** 1 0 14 16 14 8 14 10 DEX 0X00 0X0 0 CLASS_TYPE_DUELIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DUEL 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
81 Hierophant 16790568 16822744 16822745 16822746 16822747 IR_HIERO 8 CLS_ATK_2 CLS_FEAT_HIERO CLS_SAVTHR_CLER CLS_SKILL_HIERO CLS_BFEAT_HIERO 2 **** **** 1 0 14 8 14 16 10 14 WIS 0X00 0X0 0 CLASS_TYPE_HIEROPHANT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_HIERO 5 0 0 0 5 2 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
82 RedAvenger 16790569 16822765 16822766 16822767 16822768 IR_REDAVNG 8 CLS_ATK_2 CLS_FEAT_REDAV CLS_SAVTHR_MONK CLS_SKILL_REDAV CLS_BFEAT_REDAV 4 **** **** 1 0 14 14 14 15 10 10 DEX 0X00 0X0 0 CLASS_TYPE_RED_AVENGER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_REDAV 40 0 0 0 10 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -97,12 +97,12 @@
|
||||
93 SublimeChord 16790580 16829452 16829453 16829454 16829455 IR_X1_HARPER 6 CLS_ATK_3 CLS_FEAT_SCHORD CLS_SAVTHR_WIZ CLS_SKILL_SCHORD CLS_BFEAT_SCHORD 4 CLS_SPGN_SCHORD CLS_SPKN_SCHORD 1 1 10 14 12 10 14 16 CHA 0X00 0X0 0 CLASS_TYPE_SUBLIME_CHORD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SCHORD 40 0 0 0 10 46 131 **** **** **** **** **** **** **** **** **** SublimeCh **** **** **** **** ****
|
||||
94 Artificer 16790581 16827101 16827102 16827103 16827104 **** 6 CLS_ATK_2 CLS_FEAT_ARTI CLS_SAVTHR_WIZ CLS_SKILL_ARTI CLS_BFEAT_ARTI 4 **** **** 0 0 10 14 12 10 16 14 CHA 0X00 0X0 0 CLASS_TYPE_ARTIFICER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ARTI 0 1 0 0 -1 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
95 Arcane_Duelist 16790582 16823520 16823521 16823522 16823523 IR_SPARCDLST 8 CLS_ATK_3 CLS_FEAT_ADST CLS_SAVTHR_BARD CLS_SKILL_ADST CLS_BFEAT_ADST 4 **** **** 1 0 12 16 14 8 14 12 CHA 0X00 0X0 0 CLASS_TYPE_ARCANE_DUELIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ADST 40 0 0 0 10 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
96 ForceMissileMage 16790583 16836426 16836427 16836428 16836429 IR_HAVOCMAGE 4 CLS_ATK_3 CLS_FEAT_FMM CLS_SAVTHR_ROG CLS_SKILL_FMM CLS_BFEAT_FMM 2 **** **** 1 0 12 14 14 10 12 15 CHA 0X00 0X0 0 CLASS_TYPE_FMM 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FMM 5 0 1 0 10 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
96 ForceMissileMage 16790583 16836426 16836427 16836428 16836429 IR_HAVOCMAGE 4 CLS_ATK_3 CLS_FEAT_FMM CLS_SAVTHR_ROG CLS_SKILL_FMM CLS_BFEAT_FMM 2 **** **** 1 0 12 14 14 10 12 15 INT 0X00 0X0 0 CLASS_TYPE_FMM 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FMM 5 0 1 0 5 31 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
97 WildMage 16790584 16836416 16836417 16836418 16836419 IR_WILDER 4 CLS_ATK_3 CLS_FEAT_WILDMG CLS_SAVTHR_ROG CLS_SKILL_WILDMG CLS_BFEAT_WILDMG 2 **** **** 1 0 12 14 14 10 12 15 CHA 0X04 0X0 0 CLASS_TYPE_WILD_MAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WILDMG 40 0 1 0 10 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
98 Shadowsmith 16790585 16847414 16847415 16847416 16847417 IR_TEMPUS 8 CLS_ATK_1 CLS_FEAT_SHDSMT CLS_SAVTHR_ROG CLS_SKILL_SHDSMT CLS_BFEAT_SHDSMT 6 **** **** 1 0 14 13 14 10 14 13 INT 0x00 0x0 0 CLASS_TYPE_SHADOWSMITH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHDSMT 40 0 0 0 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
99 Abjurant_Champion 16790586 16847652 16847653 16847654 16847655 IR_ELDKNI 10 CLS_ATK_1 CLS_FEAT_ABCHAM CLS_SAVTHR_WIZ CLS_SKILL_ABCHAM CLS_BFEAT_ABCHAM 2 **** **** 1 0 14 13 14 10 14 13 INT 0X00 0X0 0 CLASS_TYPE_ABJURANT_CHAMPION 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ABCHAM 5 0 1 0 5 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
99 Abjurant_Champion 16790586 16847652 16847653 16847654 16847655 IR_ELDKNI 10 CLS_ATK_1 CLS_FEAT_ABCHAM CLS_SAVTHR_WIZ CLS_SKILL_ABCHAM CLS_BFEAT_ABCHAM 2 **** **** 1 0 14 13 14 10 14 13 INT 0X00 0X0 0 CLASS_TYPE_ABJURANT_CHAMPION 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ABCHAM 5 0 1 0 5 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
100 Archmage 16790587 16825000 16825001 16825002 16825003 IR_EPICSPELL 4 CLS_ATK_3 CLS_FEAT_ARCH CLS_SAVTHR_WIZ CLS_SKILL_ARCH CLS_BFEAT_ARCH 2 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_ARCHMAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ARCH 5 0 2 0 5 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
101 Oozemaster 16790588 16825036 16825037 16825038 16825039 IR_GENSUMMON 8 CLS_ATK_2 CLS_FEAT_OOZE CLS_SAVTHR_FIGHT CLS_SKILL_OOZE CLS_BFEAT_OOZE 4 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_OOZEMASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_OOZE 40 0 2 2 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
101 Oozemaster 16790588 16825036 16825037 16825038 16825039 IR_GENSUMMON 8 CLS_ATK_2 CLS_FEAT_OOZE CLS_SAVTHR_FIGHT CLS_SKILL_OOZE CLS_BFEAT_OOZE 4 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_OOZEMASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_OOZEM 40 0 2 2 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
102 Psychic_Rogue 16790589 16835172 16835173 16835174 16835175 IR_PSYWARRIOR 6 CLS_ATK_2 CLS_FEAT_PSYROG CLS_SAVTHR_ROG CLS_SKILL_PSYROG CLS_BFEAT_PSYROG 6 **** **** 1 0 14 12 14 16 10 10 WIS 0X00 0X0 0 CLASS_TYPE_PSYROG 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_PSYROG 20 1 0 0 -1 7 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
103 Spelldancer 16790590 16835157 16835158 16835159 16835160 IR_HAVOCMAGE 6 CLS_ATK_3 CLS_FEAT_SPLDNC CLS_SAVTHR_BARD CLS_SKILL_SPLDNC CLS_BFEAT_SPLDNC 4 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_SPELLDANCER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SPLDNC 5 0 1 0 5 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
104 KnightoftheWeave 16790591 16835149 16835150 16835151 16835152 IR_MAGEKILL 8 CLS_ATK_2 CLS_FEAT_KNGTWV CLS_SAVTHR_DRU CLS_SKILL_KNGTWV CLS_BFEAT_KNGTWV 2 CLS_SPGN_KNGTWV CLS_SPKN_KNGTWV 0 1 12 16 14 8 14 12 INT 0X10 0X2 0 CLASS_TYPE_KNIGHT_WEAVE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_KNGTWV 40 0 0 0 10 10 0 **** **** **** **** **** **** **** **** **** KnightWeave **** **** **** **** ****
|
||||
@@ -113,7 +113,7 @@
|
||||
109 Umbral_Disciple 16790596 16837827 16837828 16837829 16837830 IR_ASASIN 6 CLS_ATK_2 CLS_FEAT_UMBRAL CLS_SAVTHR_BARD CLS_SKILL_UMBRAL CLS_BFEAT_UMBRAL 6 **** **** 1 0 12 16 14 8 14 12 DEX 0X00 0X0 0 CLASS_TYPE_UMBRAL_DISCIPLE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_UMBRAL 40 0 0 0 10 8 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
110 Alienist 16790597 16789710 16789711 16789712 16789713 IR_ALIEN 4 CLS_ATK_3 CLS_FEAT_ALIEN CLS_SAVTHR_WIZ CLS_SKILL_ALIEN CLS_BFEAT_ALIEN 2 **** **** 1 0 10 14 14 12 16 10 INT 0X00 0X0 0 CLASS_TYPE_ALIENIST 1 1 1 2 2 4 6 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ALIEN 40 0 1 0 10 10 0 cls_stat_alien **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
111 BlackBloodCultist 16790598 16823068 16823077 16823078 16823079 IR_WILDWOLF 12 CLS_ATK_2 CLS_FEAT_BBC CLS_SAVTHR_BARB CLS_SKILL_BBC CLS_BFEAT_BBC 4 **** **** 0 0 16 14 14 14 10 8 STR 0X0A 0X3 0 CLASS_TYPE_BLACK_BLOOD_CULTIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BBC 40 0 0 0 10 17 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
112 Warlock 16790599 16827934 16827935 16827936 16827937 IR_WARLOCK 6 CLS_ATK_2 CLS_FEAT_WARLOK CLS_SAVTHR_WIZ CLS_SKILL_WARLOK CLS_BFEAT_WARLOK 2 **** **** 1 0 12 14 14 10 12 15 CHA 0X14 0X3 1 CLASS_TYPE_WARLOCK 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WARLOK 0 1 0 0 -1 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
112 Warlock 16790599 16827934 16827935 16827936 16827937 IR_WARLOCK 6 CLS_ATK_2 CLS_FEAT_WARLOK CLS_SAVTHR_WIZ CLS_SKILL_WARLOK CLS_BFEAT_WARLOK 2 **** **** 1 1 12 14 14 10 12 15 CHA 0X14 0X3 1 CLASS_TYPE_WARLOCK 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WARLOK 0 1 0 0 -1 900 0 **** **** **** **** **** **** **** **** **** Warlock **** **** **** **** ****
|
||||
113 Fochlucan_Lyrist 16852476 16825142 16825143 16825144 16825145 IR_DRUID 6 CLS_ATK_1 CLS_FEAT_FOCLYR CLS_SAVTHR_BARD CLS_SKILL_FOCLYR CLS_BFEAT_FOCLYR 6 **** **** 1 0 10 12 12 14 12 16 CHA 0X02 0X0 0 CLASS_TYPE_FOCHLUCAN_LYRIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FOCLYR 40 0 1 1 10 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
114 Dragonsong_Lyrist 16790600 16825459 16825460 16825461 16825462 IR_DRSLYR 6 CLS_ATK_2 CLS_FEAT_DRSLYR CLS_SAVTHR_BARD CLS_SKILL_DRSLYR CLS_BFEAT_DRSLYR 4 **** **** 1 0 12 14 14 10 12 15 CHA 0X10 0X2 0 CLASS_TYPE_DRAGONSONG_LYRIST 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16 17 18 19 20 CLS_PRES_DSLYR 5 0 2 0 5 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
115 SpinemeldWarrior 16790601 16836998 16836999 16837000 16837001 IR_TEMPEST 10 CLS_ATK_1 CLS_FEAT_SPNMLD CLS_SAVTHR_FIGHT CLS_SKILL_SPNMLD CLS_BFEAT_SPNMLD 4 **** **** 1 0 16 14 14 14 10 8 STR 0X02 0X1 1 CLASS_TYPE_SPINEMELD_WARRIOR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SPNMLD 40 0 0 0 10 17 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -129,23 +129,23 @@
|
||||
125 Soulcaster 16790611 16837012 16837013 16837014 16837015 IR_MYSTIC 4 CLS_ATK_3 CLS_FEAT_SOULC CLS_SAVTHR_WIZ CLS_SKILL_SOULC CLS_BFEAT_SOULC 2 **** **** 1 0 10 11 11 16 16 10 INT 0X00 0X0 0 CLASS_TYPE_SOULCASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SOULC 40 0 1 0 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
126 Sacred_Fist 16790612 16825367 16825368 16825369 16825370 IR_SACREDFIST 8 CLS_ATK_1 CLS_FEAT_SACFIS CLS_SAVTHR_WILD CLS_SKILL_SACFIS CLS_BFEAT_SACFIS 4 **** **** 1 0 14 14 12 16 10 10 WIS 0X00 0X0 0 CLASS_TYPE_SACREDFIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SACFIS 40 0 0 1 10 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
127 Legendary_Dreadnought 16790613 16826086 16826087 16826088 16826089 IC_LEGDREAD 12 CLS_ATK_1 CLS_FEAT_LGDR CLS_SAVTHR_FIGHT CLS_SKILL_LGDR CLS_BFEAT_LGDR 2 **** **** 1 0 16 13 16 10 10 9 STR 0X00 0X0 0 CLASS_TYPE_LEGENDARY_DREADNOUGHT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_LGDR 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
128 Disciple_of_Baalzebul 16790614 16826094 16826095 16826096 16826097 IC_BAALZEBUL 6 CLS_ATK_2 CLS_FEAT_BAAL CLS_SAVTHR_BARD CLS_SKILL_BAAL CLS_BFEAT_BAAL 6 **** **** 1 0 12 14 14 10 12 15 CHA 0X09 0X2 0 CLASS_TYPE_DISC_BAALZEBUL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BAAL 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
128 Disciple_of_Baalzebul 16790614 16826094 16826095 16826096 16826097 IC_BAALZEBUL 6 CLS_ATK_2 CLS_FEAT_BAAL CLS_SAVTHR_BARD CLS_SKILL_BAAL CLS_BFEAT_BAAL 6 **** **** 1 0 12 14 14 10 12 15 CHA 0X09 0X2 0 CLASS_TYPE_DISC_BAALZEBUL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BAAL 40 0 0 0 10 4 0 cls_stat_baal **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
129 Mighty_Contender_of_Kord 16790615 16824935 16824936 16824937 16824938 IC_LEGDREAD 10 CLS_ATK_2 CLS_FEAT_KORD CLS_SAVTHR_CLER CLS_SKILL_KORD CLS_BFEAT_KORD 2 **** **** 1 0 14 8 14 16 10 14 WIS 0X00 0X0 0 CLASS_TYPE_MIGHTY_CONTENDER_KORD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_KORD 40 0 0 1 10 4 0 cls_stat_kord **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
130 Iaijutsu_Master 16790616 16826114 16826115 16826116 16826117 IC_IAIJUTSU 10 CLS_ATK_1 CLS_FEAT_IAIJ CLS_SAVTHR_ROG CLS_SKILL_IAIJ CLS_BFEAT_IAIJ 4 **** **** 1 0 16 13 16 10 10 9 CHA 0X05 0X1 0 CLASS_TYPE_IAIJUTSU_MASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_IAIJ 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
131 Disciple_of_Dispater 16790617 16826136 16826137 16826138 16826139 IR_BLKGRD 10 CLS_ATK_1 CLS_FEAT_DISP CLS_SAVTHR_MONK CLS_SKILL_DISP CLS_BFEAT_DISP 4 **** **** 1 0 16 13 16 10 10 9 CON 0X09 0X2 0 CLASS_TYPE_DISPATER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DISP 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
132 CW_Samurai 16790618 16826168 16826169 16826170 16826171 IR_SAMURAI 10 CLS_ATK_1 CLS_FEAT_CWSM CLS_SAVTHR_FIGHT CLS_SKILL_SAMUR CLS_BFEAT_CWSM 2 **** **** 0 0 16 13 16 10 10 9 STR 0X05 0X1 0 CLASS_TYPE_CW_SAMURAI 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_CWSM 20 1 0 0 -1 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
133 Ravager 16790619 16826156 16826157 16826158 16826159 IC_RAVA 10 CLS_ATK_1 CLS_FEAT_RAVA CLS_SAVTHR_FIGHT CLS_SKILL_RAVA CLS_BFEAT_RAVA 2 **** **** 1 0 16 13 16 10 10 9 STR 0X0A 0X3 0 CLASS_TYPE_RAVAGER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_RAVA 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
134 Runescarred_Berserker 16790620 16826187 16826188 16826189 16826190 IC_RUNE 10 CLS_ATK_1 CLS_FEAT_RUNE CLS_SAVTHR_FIGHT CLS_SKILL_RUNE CLS_BFEAT_RUNE 4 **** **** 1 0 16 13 16 10 10 9 STR 0X02 0X1 0 CLASS_TYPE_RUNESCARRED 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_RUNE 40 0 0 0 10 4 0 cls_stat_rune **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
133 Ravager 16790619 16826156 16826157 16826158 16826159 IC_RAVA 10 CLS_ATK_1 CLS_FEAT_RAVA CLS_SAVTHR_FIGHT CLS_SKILL_RAVA CLS_BFEAT_RAVA 2 **** **** 0 0 16 13 16 10 10 9 STR 0X0A 0X3 0 CLASS_TYPE_RAVAGER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_RAVA 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
134 Runescarred_Berserker 16790620 16826187 16826188 16826189 16826190 IC_RUNE 10 CLS_ATK_1 CLS_FEAT_RUNE CLS_SAVTHR_FIGHT CLS_SKILL_RUNE CLS_BFEAT_RUNE 4 **** **** 0 0 16 13 16 10 10 9 STR 0X02 0X1 0 CLASS_TYPE_RUNESCARRED 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_RUNE 40 0 0 0 10 4 0 cls_stat_rune **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
135 Talontar_Blightlord 16790621 16824917 16824918 16824919 16824920 IR_CLERIC 8 CLS_ATK_2 CLS_FEAT_BLTL CLS_SAVTHR_CLER CLS_SKILL_BLTL CLS_BFEAT_BLTL 2 **** **** 0 0 16 13 16 10 10 9 WIS 0X09 0X2 0 CLASS_TYPE_BLIGHTLORD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BLTL 40 0 0 1 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
136 Shadowcaster 16790622 16847394 16847395 16847396 16847397 IR_SHADADEPT 6 CLS_ATK_3 CLS_FEAT_SHDCST CLS_SAVTHR_CLER CLS_SKILL_SHDCST CLS_BFEAT_SHDCST 2 **** **** 1 0 10 10 14 12 16 14 CHA 0x00 0x0 0 CLASS_TYPE_SHADOWCASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHDCST 20 1 0 0 -1 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
137 ChildOfNight 16790623 16847398 16847399 16847400 16847401 IR_X1_SHADOW 6 CLS_ATK_3 CLS_FEAT_CHLDNT CLS_SAVTHR_WIZ CLS_SKILL_CHLDNT CLS_BFEAT_CHLDNT 2 **** **** 1 0 10 10 14 12 16 14 CHA 0x00 0x0 0 CLASS_TYPE_CHILD_OF_NIGHT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_CHLDNT 40 0 0 0 10 0 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
138 MasterofShadow 16790624 16847402 16847403 16847404 16847405 IR_MYSTIC 8 CLS_ATK_3 CLS_FEAT_MSTRSH CLS_SAVTHR_CLER CLS_SKILL_MSTRSH CLS_BFEAT_MSTRSH 2 **** **** 1 0 12 14 14 10 12 15 CHA 0x00 0x0 0 CLASS_TYPE_MASTER_OF_SHADOW 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_MSTRSH 40 0 0 0 10 0 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
139 Noctumancer 16790625 16847406 16847407 16847408 16847409 IR_NOCTM 4 CLS_ATK_3 CLS_FEAT_NOCTM CLS_SAVTHR_CLER CLS_SKILL_NOCTM CLS_BFEAT_NOCTM 2 **** **** 1 0 12 14 14 10 12 15 CHA 0x00 0x0 **** CLASS_TYPE_NOCTUMANCER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_NOCTM 40 0 1 0 10 0 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
140 Totem_Rager 16790626 16825977 16825978 16825979 16825980 IR_PSYWARRIOR 10 CLS_ATK_2 CLS_FEAT_TOTRAG CLS_SAVTHR_RANG CLS_SKILL_TOTRAG CLS_BFEAT_TOTRAG 4 **** **** 1 0 16 15 14 10 10 10 CON 0X00 0X0 0 CLASS_TYPE_TOTEM_RAGER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_TOTRAG 40 0 0 0 10 142 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
141 Ninja_CA 16790627 16832316 16832317 16832318 16832319 IR_NINJCA 6 CLS_ATK_2 CLS_FEAT_NINJCA CLS_SAVTHR_ROG CLS_SKILL_NINJCA CLS_BFEAT_NINJCA 6 **** **** 0 0 12 16 12 14 14 8 DEX 0X00 0X0 0 CLASS_TYPE_NINJA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_NINJCA 40 1 0 0 -1 7 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
141 Ninja_CA 16790627 16832316 16832317 16832318 16832319 IR_NINJCA 6 CLS_ATK_2 CLS_FEAT_NINJCA CLS_SAVTHR_ROG CLS_SKILL_NINJCA CLS_BFEAT_NINJCA 6 **** **** 0 0 12 16 12 14 14 8 DEX 0X00 0X0 0 CLASS_TYPE_NINJA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_NINJCA 0 1 0 0 -1 7 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
142 Shadowblade 16790628 16847410 16847411 16847412 16847413 IR_SHADOWBLADE 8 CLS_ATK_2 CLS_FEAT_SHDBLD CLS_SAVTHR_FIGHT CLS_SKILL_SHDBLD CLS_BFEAT_SHDBLD 2 **** **** 1 0 14 15 14 12 12 10 DEX 0X00 0X0 0 CLASS_TYPE_SHADOWBLADE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHDBLD 40 0 0 0 10 8 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
143 DragonShaman 16790629 16832703 16832704 16832705 16832706 IR_DRAGSHMN 10 CLS_ATK_2 CLS_FEAT_DRGSHM CLS_SAVTHR_CLER CLS_SKILL_DRGSHM CLS_BFEAT_DRGSHM 2 **** **** 1 0 12 14 16 10 14 10 CON 0X00 0X0 0 CLASS_TYPE_DRAGON_SHAMAN 1 1 3 4 5 6 7 8 9 10 11 12 12 14 15 16 17 18 19 20 CLS_PRES_DRGSHM 40 1 0 0 -1 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
144 Dragonfire_Adept 16790630 16832914 16832915 16832916 16832917 IR_DRGNFIREADPT 8 CLS_ATK_3 CLS_FEAT_DFA CLS_SAVTHR_CLER CLS_SKILL_DFA CLS_BFEAT_DFA 4 **** **** 1 0 10 14 16 12 10 14 CON 0X00 0X0 0 CLASS_TYPE_DRAGONFIRE_ADEPT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DFA 40 1 0 0 -1 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
143 DragonShaman 16790629 16832703 16832704 16832705 16832706 IR_DRAGSHMN 10 CLS_ATK_2 CLS_FEAT_DRGSHM CLS_SAVTHR_CLER CLS_SKILL_DRGSHM CLS_BFEAT_DRGSHM 2 **** **** 1 0 12 14 16 10 14 10 CON 0X00 0X0 0 CLASS_TYPE_DRAGON_SHAMAN 1 1 3 4 5 6 7 8 9 10 11 12 12 14 15 16 17 18 19 20 CLS_PRES_DRGSHM 40 1 0 0 -1 705 0 cls_stat_drgshm **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
144 Dragonfire_Adept 16790630 16832914 16832915 16832916 16832917 IR_DRGNFIREADPT 8 CLS_ATK_3 CLS_FEAT_DFA CLS_SAVTHR_CLER CLS_SKILL_DFA CLS_BFEAT_DFA 4 **** **** 1 1 10 14 16 12 10 14 CON 0X00 0X0 0 CLASS_TYPE_DRAGONFIRE_ADEPT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DFA 40 1 0 0 -1 1 0 **** **** **** **** **** **** **** **** **** Dragonfire **** **** **** **** ****
|
||||
145 Psion 16790631 16823566 16823567 16823568 16823569 IR_PSION 4 CLS_ATK_3 CLS_FEAT_PSION CLS_SAVTHR_WIZ CLS_SKILL_PSION CLS_BFEAT_PSION 2 **** **** 1 0 10 14 14 12 16 10 INT 0X00 0X0 0 CLASS_TYPE_PSION 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_PSION 0 1 0 0 -1 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
146 Psychic_Warrior 16790632 16823570 16823571 16823572 16823573 IR_PSYWARRIOR 8 CLS_ATK_2 CLS_FEAT_PSYWAR CLS_SAVTHR_FIGHT CLS_SKILL_PSYWAR CLS_BFEAT_PSYWAR 2 **** **** 1 0 14 12 14 16 10 10 WIS 0X00 0X0 0 CLASS_TYPE_PSYWAR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_PSYWAR 0 1 0 0 -1 2 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
147 Soulknife 16790633 16823574 16823575 16823576 16823577 IR_SOULKNIFE 10 CLS_ATK_2 CLS_FEAT_SOULKN CLS_SAVTHR_BARD CLS_SKILL_SOULKN CLS_BFEAT_SOULKN 4 **** **** 1 0 16 15 14 10 10 10 STR 0X00 0X0 0 CLASS_TYPE_SOULKNIFE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SOULKN 0 1 0 0 -1 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -181,14 +181,14 @@
|
||||
177 Frenzied_Berserker 16790662 16824216 16824217 16824218 16824219 IR_FREBZK 12 CLS_ATK_1 CLS_FEAT_FREBZK CLS_SAVTHR_BARB CLS_SKILL_FREBZK CLS_BFEAT_FREBZK 2 **** **** 1 0 16 14 14 14 10 8 STR 0X02 0X1 0 CLASS_TYPE_FRE_BERSERKER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FREBZK 40 0 0 0 10 17 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
178 Tempest 16790663 16824242 16824243 16824244 16824245 IR_TEMPEST 10 CLS_ATK_1 CLS_FEAT_TEMPST CLS_SAVTHR_BARB CLS_SKILL_TEMPST CLS_BFEAT_TEMPST 2 **** **** 1 0 10 16 12 10 16 10 DEX 0X00 0X0 0 CLASS_TYPE_TEMPEST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_TEMPST 40 0 0 0 10 7 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
179 Foe_Hunter 16790664 16824256 16824257 16824258 16824259 IR_FH 10 CLS_ATK_1 CLS_FEAT_FH CLS_SAVTHR_WILD CLS_SKILL_FH CLS_BFEAT_FH 2 **** **** 1 0 10 16 12 10 16 10 DEX 0X00 0X0 0 CLASS_TYPE_FOE_HUNTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FH 40 0 0 0 10 58 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
180 ***Eye_of_Gruumsh*** 16790665 16824294 16824295 16824296 16824297 IR_GRUUMSH 12 CLS_ATK_1 CLS_FEAT_EOG CLS_SAVTHR_BARB CLS_SKILL_EOG CLS_BFEAT_EOG 2 **** **** 0 0 16 14 14 14 10 8 STR 0X0A 0X3 0 CLASS_TYPE_PRC_EYE_OF_GRUUMSH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_EOG 40 0 0 0 10 17 0 cls_stat_eog **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
180 Verdant_Lord 16855246 16855247 16855248 16855249 16855250 IR_DRUID 8 CLS_ATK_1 CLS_FEAT_VLORD CLS_SAVTHR_DRU CLS_SKILL_VLORD CLS_BFEAT_VLORD 4 **** **** 1 0 14 13 13 16 10 10 WIS 0X10 0X2 0 CLASS_VERDANT_LORD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_VLORD 40 0 0 1 10 3 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
181 Orc_Warlord 16790666 16824312 16824313 16824314 16824315 IR_ORCWAR 12 CLS_ATK_1 CLS_FEAT_ORCWAR CLS_SAVTHR_MONK CLS_SKILL_ORCWAR CLS_BFEAT_ORCWAR 2 **** **** 1 0 16 14 14 14 10 8 STR 0X08 0X2 0 CLASS_TYPE_ORC_WARLORD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ORCWAR 5 0 0 0 5 17 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
182 Thrall_of_Grazzt 16790667 16824516 16824517 16824518 16824519 IR_TOG 6 CLS_ATK_3 CLS_FEAT_TOG CLS_SAVTHR_WIZ CLS_SKILL_TOG CLS_BFEAT_TOG 4 **** **** 1 0 12 16 14 8 14 12 INT 0X09 0X2 0 CLASS_TYPE_THRALL_OF_GRAZZT_A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_TOG_A 40 0 2 0 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
183 Necrocarnate 16790668 16838080 16838081 16838082 16838083 ir_truenecro 6 CLS_ATK_3 CLS_FEAT_NECRNM CLS_SAVTHR_WIZ CLS_SKILL_NECRNM CLS_BFEAT_BLANK 2 **** **** 1 0 12 16 14 8 14 12 INT 0X09 0X2 0 CLASS_TYPE_NECROCARNATE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_NECRNM 13 0 0 0 13 13 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
184 Eldritch_Disciple 16790669 16790013 16790014 16790015 16790016 IR_EDISC 8 CLS_ATK_2 CLS_FEAT_EDISC CLS_SAVTHR_CLER CLS_SKILL_EDISC CLS_BFEAT_EDISC 2 **** **** 1 0 14 8 14 16 10 14 WIS 0X00 0X0 0 CLASS_TYPE_ELDRITCH_DISCIPLE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_EDISC 40 0 0 1 10 2 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
185 Eldritch_Theurge 16790670 16790017 16790018 16790019 16790020 IR_ETHEUR 4 CLS_ATK_2 CLS_FEAT_ETHEUR CLS_SAVTHR_WIZ CLS_SKILL_ETHEUR CLS_BFEAT_ETHEUR 2 **** **** 1 0 10 14 14 12 16 10 INT 0X00 0X0 0 CLASS_TYPE_ELDRITCH_THEURGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ETHEUR 40 0 1 0 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
186 Ghost_Faced_Killer 16790671 16832352 16832353 16832354 16832355 IR_GFKILL_PRC 8 CLS_ATK_1 CLS_FEAT_GFKILL CLS_SAVTHR_FIGHT CLS_SKILL_GFKILL CLS_BFEAT_GFKILL 4 **** **** 1 0 16 13 16 10 10 9 STR 0X09 0X2 0 CLASS_TYPE_GHOST_FACED_KILLER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_GFKILL 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
187 DreadNecromancer 16790672 16847586 16847587 16847588 16847589 IR_PALEMA 6 CLS_ATK_3 CLS_FEAT_DNECRO CLS_SAVTHR_WIZ CLS_SKILL_DNECRO CLS_BFEAT_DNECRO 2 CLS_SPGN_DNECRO CLS_SPKN_DNECRO 1 1 10 14 12 10 14 16 CHA 0X08 0X2 0 CLASS_TYPE_DREAD_NECROMANCER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DNECRO 0 1 1 0 -1 10 130 **** **** **** **** **** **** **** **** **** DreadNecro **** **** **** **** ****
|
||||
187 DreadNecromancer 16790672 16847586 16847587 16847588 16847589 IR_PALEMA 6 CLS_ATK_3 CLS_FEAT_DNECRO CLS_SAVTHR_WIZ CLS_SKILL_DNECRO CLS_BFEAT_DNECRO 2 CLS_SPGN_DNECRO CLS_SPKN_DNECRO 1 1 10 14 12 10 14 16 CHA 0X08 0X2 0 CLASS_TYPE_DREAD_NECROMANCER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DNECRO 0 1 0 0 -1 10 130 **** **** **** **** **** **** 1 **** **** DreadNecro **** **** **** **** ****
|
||||
188 UltimateMagus **** 16790350 16790351 16790352 16790353 IR_EPICSPELL 4 CLS_ATK_3 CLS_FEAT_UM CLS_SAVTHR_WIZ CLS_SKILL_UM CLS_BFEAT_UM 2 **** **** 0 0 10 11 11 16 16 10 INT 0X00 0X0 0 CLASS_TYPE_MYSTIC_THEURGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_UM 40 0 2 0 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
189 ForestMaster 16790673 16793736 16793737 16793738 16793739 IR_DRUID 8 CLS_ATK_2 CLS_FEAT_FORMAS CLS_SAVTHR_DRU CLS_SKILL_FORMAS CLS_BFEAT_FORMAS 2 **** **** 0 0 14 13 13 16 10 10 WIS 0X00 0X0 0 CLASS_TYPE_FORESTMASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FORMAS 40 0 0 1 10 3 0 cls_stat_formas **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
190 Archivist 16790674 16789866 16789867 16789868 16789869 IR_ARCHIVIST 6 CLS_ATK_3 CLS_FEAT_ARCHV CLS_SAVTHR_CLER CLS_SKILL_ARCHV CLS_BFEAT_ARCHV 4 CLS_SPGN_ARCHV **** 1 1 10 14 14 12 16 10 INT 0X00 0X0 0 CLASS_TYPE_ARCHIVIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ARCHV 0 1 0 0 -1 10 65 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -198,9 +198,9 @@
|
||||
194 RubyKnightVindicator 16790678 16827167 16827168 16827169 16827170 IR_HEIRONEOUS 8 CLS_ATK_1 CLS_FEAT_RBYKNT CLS_SAVTHR_WIZ CLS_SKILL_RBYKNT CLS_BFEAT_RBYKNT 4 **** **** 1 0 12 16 14 8 14 12 DEX 0X00 0X0 0 CLASS_TYPE_RUBY_VINDICATOR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_RBYKNT 40 0 0 1 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
195 MasterOfNine 16790679 16847557 16847558 16847559 16847560 IR_PSYWARRIOR 8 CLS_ATK_2 CLS_FEAT_MONINE CLS_SAVTHR_WIZ CLS_SKILL_MONINE CLS_BFEAT_MONINE 6 **** **** 1 0 12 16 14 8 14 12 DEX 0X00 0X0 0 CLASS_TYPE_MASTER_OF_NINE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_MONINE 5 0 0 0 5 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
196 EternalBlade 16790680 16834750 16834751 16834752 16834753 IR_FH 10 CLS_ATK_1 CLS_FEAT_ETBL CLS_SAVTHR_FIGHT CLS_SKILL_ETBL CLS_BFEAT_ETBL 2 **** **** 1 0 16 13 16 10 10 9 STR 0X00 0X0 0 CLASS_TYPE_ETERNAL_BLADE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ETBL 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
197 ShadowSunNinja 16790681 16834778 16834779 16834780 16834781 IR_SHADADEPT 8 CLS_ATK_2 CLS_FEAT_SSN CLS_SAVTHR_MONK CLS_SKILL_SSN CLS_BFEAT_SSN 4 **** **** 0 0 16 13 16 10 10 9 STR 0X11 0X2 0 CLASS_TYPE_SHADOW_SUN_NINJA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SSN 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
197 ShadowSunNinja 16790681 16834778 16834779 16834780 16834781 IR_SHADADEPT 8 CLS_ATK_2 CLS_FEAT_SSN CLS_SAVTHR_MONK CLS_SKILL_SSN CLS_BFEAT_SSN 4 **** **** 1 0 16 13 16 10 10 9 STR 0X11 0X2 0 CLASS_TYPE_SHADOW_SUN_NINJA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SSN 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
198 WitchbornBinder 16790682 16838144 16838145 16838146 16838147 IR_WITCH 6 CLS_ATK_2 CLS_FEAT_WCHBRN CLS_SAVTHR_WIZ CLS_SKILL_WCHBRN CLS_BFEAT_WCHBRN 4 **** **** 1 0 10 14 14 10 12 16 CHA 0X00 0X0 0 CLASS_TYPE_WITCHBORN_BINDER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WCHBRN 40 0 0 0 10 6 2 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
199 Baelnorn 16790683 16829216 16829217 16829218 16829219 IR_BAELNORN 4 CLS_ATK_4 CLS_FEAT_BAELN CLS_SAVTHR_LICH CLS_SKILL_WIZ CLS_BFEAT_LICH 2 **** **** 1 0 13 13 13 13 13 13 CHA 0X11 0X2 0 CLASS_TYPE_BAELNORN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BAELN 4 0 0 0 4 10 0 cls_stat_baeln **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
199 Lion_of_Talisid 16855216 16855217 16855218 16855219 16855220 IR_LIONTALISID 8 CLS_ATK_2 CLS_FEAT_LOT CLS_SAVTHR_DRU CLS_SKILL_LOT CLS_BFEAT_LOT 4 **** **** 1 0 14 13 13 16 10 10 WIS 0X16 0X3 0 CLASS_TYPE_LION_OF_TALISID 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_LOT 40 0 0 1 10 3 0 **** **** **** **** **** **** **** **** **** **** **** **** 1 **** ****
|
||||
200 Disciple_of_Meph 16790684 16823016 16823017 16823018 16823019 IR_DISCMEPH 8 CLS_ATK_1 CLS_FEAT_MEPH CLS_SAVTHR_MONK CLS_SKILL_MEPH CLS_BFEAT_MEPH 4 **** **** 1 0 12 16 14 8 14 12 CHA 0X09 0X2 0 CLASS_TYPE_DISCIPLE_OF_MEPH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_MEPH 40 0 0 0 10 2 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
201 Soul_Eater 16790685 16832116 16832117 16832118 16832119 IR_SOULEATER 8 CLS_ATK_1 CLS_FEAT_SLEAT CLS_SAVTHR_MONK CLS_SKILL_SLEAT CLS_BFEAT_SLEAT 4 **** **** 1 0 14 16 10 12 14 10 INT 0X09 0X2 0 CLASS_TYPE_SOUL_EATER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SLEAT 40 0 0 0 10 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
202 Henshin_Mystic 16790686 16825076 16825078 16825079 16825080 IR_HNSHN 8 CLS_ATK_2 CLS_FEAT_HNSHN CLS_SAVTHR_MONK CLS_SKILL_HNSHN CLS_BFEAT_HNSHN 4 **** **** 1 0 14 14 14 15 10 10 WIS 0X05 0X1 0 CLASS_TYPE_HENSHIN_MYSTIC 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_HNSHN 40 0 0 0 10 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -208,7 +208,7 @@
|
||||
204 Enlightened_Fist 16790688 16829416 16829417 16829418 16829419 IR_SACREDFIST 8 CLS_ATK_2 CLS_FEAT_ENLFIS CLS_SAVTHR_BARD CLS_SKILL_ENLFIS CLS_BFEAT_ENLFIS 4 **** **** 1 0 10 14 12 14 16 10 DEX 0X00 0X0 0 CLASS_TYPE_ENLIGHTENEDFIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ENLFIS 40 0 1 0 10 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
205 Morninglord 16790689 16789624 16789625 16789626 16789627 IR_MORNING 8 CLS_ATK_2 CLS_FEAT_ML CLS_SAVTHR_CLER CLS_SKILL_ML CLS_BFEAT_ML 2 **** **** 0 0 14 8 14 16 10 14 CHA 0X11 0X2 0 CLASS_TYPE_MORNINGLORD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ML 40 0 0 1 10 2 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
206 IncarnumBlade 16790690 16838136 16838137 16838138 16838139 IR_CRUSADER 10 CLS_ATK_1 CLS_FEAT_IBLADE CLS_SAVTHR_FIGHT CLS_SKILL_IBLADE CLS_BFEAT_BLANK 2 **** **** 1 0 16 14 14 14 10 8 STR 0X01 0X3 0 CLASS_TYPE_INCARNUM_BLADE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_IBLADE 5 0 0 0 5 17 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
207 OAShaman 16790691 16827659 16827660 16827661 16827662 IR_CLERIC 6 CLS_ATK_2 CLS_FEAT_SHAMAN CLS_SAVTHR_WIZ CLS_SKILL_SHAMAN CLS_BFEAT_SHAMAN 4 CLS_SPGN_SHAMAN **** 1 1 10 13 12 16 13 12 WIS 0X00 0X0 0 CLASS_TYPE_SHAMAN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHAMAN 0 1 0 0 -1 2 0 **** 1 0 1 0 0 0 0 WIS Shaman 1 1 1 0 0
|
||||
207 OAShaman 16790691 16827659 16827660 16827661 16827662 IR_CLERIC 6 CLS_ATK_2 CLS_FEAT_SHAMAN CLS_SAVTHR_WIZ CLS_SKILL_SHAMAN CLS_BFEAT_SHAMAN 4 CLS_SPGN_SHAMAN **** 0 1 10 13 12 16 13 12 WIS 0X00 0X0 0 CLASS_TYPE_SHAMAN 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHAMAN 0 1 0 0 -1 2 0 **** 1 0 1 0 0 0 0 WIS Shaman 1 1 1 0 0
|
||||
208 Pyrokineticist 16790692 16827043 16827044 16827045 16827046 IR_BFZ 8 CLS_ATK_2 CLS_FEAT_PYRO CLS_SAVTHR_WILD CLS_SKILL_PYRO CLS_BFEAT_PYRO 2 **** **** 1 0 10 14 14 10 12 16 CHA 0X03 0X1 0 CLASS_TYPE_PYROKINETICIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_PYRO 40 0 0 0 10 9 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
209 Shadowmind 16790693 16829364 16829365 16829366 16829367 IR_TFSHAD 6 CLS_ATK_2 CLS_FEAT_SDMIND CLS_SAVTHR_BARD CLS_SKILL_SDMIND CLS_BFEAT_SDMIND 4 **** **** 1 0 10 11 11 16 16 10 INT 0X00 0X0 0 CLASS_TYPE_SHADOWMIND 1 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SDMIND 40 0 0 0 10 8 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
210 Psychic_Thurge 16790694 16823908 16823909 16823910 16823911 IR_PSYCHIC 4 CLS_ATK_3 CLS_FEAT_PSYCH CLS_SAVTHR_WIZ CLS_SKILL_PSYCH CLS_BFEAT_PSYCH 2 **** **** 1 0 10 11 11 16 16 10 INT 0X00 0X0 0 CLASS_TYPE_PSYCHIC_THEURGE 1 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_PSYCH 40 0 0 1 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -235,9 +235,9 @@
|
||||
231 BrimstoneSpeaker 16790715 16827554 16827555 16827556 16827557 IR_BRIMSTONE 8 CLS_ATK_2 CLS_FEAT_BRIMST CLS_SAVTHR_CLER CLS_SKILL_BRIMST CLS_BFEAT_BRIMST 2 **** **** 1 0 12 16 14 8 14 12 WIS 0X11 0X2 0 CLASS_TYPE_BRIMSTONE_SPEAKER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BRIMST 40 0 0 2 10 2 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
232 Shugenja **** 16825142 16825143 16825144 16825145 IR_HNSHN 6 CLS_ATK_3 CLS_FEAT_SHUGEN CLS_SAVTHR_WIZ CLS_SKILL_SHUGEN CLS_BFEAT_SHUGEN 4 **** **** 0 0 10 14 14 10 12 16 CHA 0X00 0X0 0 CLASS_TYPE_SHUGENJA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHUGEN 0 1 0 0 -1 0 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
233 Sohei 16790716 16827429 16827430 16827431 16827432 IR_FIGHTER 10 CLS_ATK_2 CLS_FEAT_SOHEI CLS_SAVTHR_CLER CLS_SKILL_SOHEI CLS_BFEAT_SOHEI 2 CLS_SPGN_SOHEI **** 1 1 16 10 13 14 13 10 STR 0X05 0X1 0 CLASS_TYPE_SOHEI 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SOHEI 0 1 0 0 -1 6 0 **** 1 0 0 0 0 0 0 WIS Sohei 1 4 255 0 0
|
||||
234 Crusader 16790717 16829702 16829703 16829704 16829705 IR_CRUSADER 10 CLS_ATK_1 CLS_FEAT_CRUSDR CLS_SAVTHR_FIGHT CLS_SKILL_CRUSDR CLS_BFEAT_CRUSDR 4 **** **** 1 0 16 14 14 10 12 10 STR 0X1E 0X3 1 CLASS_TYPE_CRUSADER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_CRUSDR 40 1 0 0 -1 6 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
235 Swordsage 16790718 16829706 16829707 16829708 16829709 IR_MONK 8 CLS_ATK_2 CLS_FEAT_SWDSGE CLS_SAVTHR_BARD CLS_SKILL_SWDSGE CLS_BFEAT_SWDSGE 6 **** **** 1 0 16 14 14 10 12 10 STR 0X00 0X0 0 CLASS_TYPE_SWORDSAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SWDSGE 40 1 0 0 -1 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
236 Warblade 16790719 16829710 16829711 16829712 16829713 IR_FIGHTER 12 CLS_ATK_1 CLS_FEAT_WARBLD CLS_SAVTHR_FIGHT CLS_SKILL_WARBLD CLS_BFEAT_WARBLD 4 **** **** 1 0 16 14 14 10 12 10 STR 0X00 0X0 0 CLASS_TYPE_WARBLADE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WARBLD 40 1 0 0 -1 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
234 Crusader 16790717 16829702 16829703 16829704 16829705 IR_CRUSADER 10 CLS_ATK_1 CLS_FEAT_CRUSDR CLS_SAVTHR_FIGHT CLS_SKILL_CRUSDR CLS_BFEAT_CRUSDR 4 **** **** 1 0 16 14 14 10 12 10 STR 0X1E 0X3 1 CLASS_TYPE_CRUSADER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_CRUSDR 0 1 0 0 -1 6 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
235 Swordsage 16790718 16829706 16829707 16829708 16829709 IR_MONK 8 CLS_ATK_2 CLS_FEAT_SWDSGE CLS_SAVTHR_BARD CLS_SKILL_SWDSGE CLS_BFEAT_SWDSGE 6 **** **** 1 0 16 14 14 10 12 10 STR 0X00 0X0 0 CLASS_TYPE_SWORDSAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SWDSGE 0 1 0 0 -1 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
236 Warblade 16790719 16829710 16829711 16829712 16829713 IR_FIGHTER 12 CLS_ATK_1 CLS_FEAT_WARBLD CLS_SAVTHR_FIGHT CLS_SKILL_WARBLD CLS_BFEAT_WARBLD 4 **** **** 1 0 16 14 14 10 12 10 STR 0X00 0X0 0 CLASS_TYPE_WARBLADE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WARBLD 0 1 0 0 -1 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
237 Warmage 16790720 16827604 16827605 16827606 16827607 IR_HAVOCMAGE 6 CLS_ATK_3 CLS_FEAT_WRMAGE CLS_SAVTHR_WIZ CLS_SKILL_WRMAGE CLS_BFEAT_WRMAGE 2 CLS_SPGN_WRMAGE CLS_SPKN_WRMAGE 1 1 10 14 12 10 14 16 INT 0X00 0X0 0 CLASS_TYPE_WARMAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WRMAGE 0 1 0 0 -1 10 130 **** **** **** **** **** **** **** **** **** Warmage **** **** **** **** ****
|
||||
238 Knight 16790721 16827632 16827633 16827634 16827635 IR_PALADIN 12 CLS_ATK_1 CLS_FEAT_KNIGHT CLS_SAVTHR_WIZ CLS_SKILL_KNIGHT CLS_BFEAT_KNIGHT 2 **** **** 1 0 16 10 16 10 10 12 STR 0X05 0X1 0 CLASS_TYPE_KNIGHT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_KNIGHT 20 1 0 0 -1 6 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
239 FistOfDalQuor 16790722 16827033 16827034 16827035 16827036 IR_SHOUDISC 10 CLS_ATK_2 CLS_FEAT_DALQUR CLS_SAVTHR_CLER CLS_SKILL_DALQUR CLS_BFEAT_DALQUR 2 **** **** 0 0 12 16 14 8 14 12 DEX 0X00 0X0 0 CLASS_TYPE_FIST_DAL_QUOR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DALQUR 5 0 0 0 5 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -216,7 +216,7 @@
|
||||
212 ImprovedEvasion 1946 6032 ife_evade **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_IMPROVED_EVASION 6 **** **** **** **** **** 0 1
|
||||
213 KiStrike 1947 6033 ife_kistrike **** **** **** **** **** **** **** **** **** **** 0 0 0 **** 1 **** 343 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_KI_STRIKE 6 **** **** **** **** **** 0 1
|
||||
214 DiamondBody 1948 6034 ife_dibod **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_DIAMOND_BODY 6 **** **** **** **** **** 0 1
|
||||
215 DiamondSoul 1949 6035 ife_disoul **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_DIAMOND_SOUL 6 **** **** **** **** **** 0 1
|
||||
215 DiamondSoul 1949 16793789 ife_disoul **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_DIAMOND_SOUL 6 **** **** **** **** **** 0 1
|
||||
216 PerfectSelf 1950 6036 ife_perfself **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_PERFECT_SELF 6 **** **** **** **** **** 0 1
|
||||
217 DivineGrace 1951 6037 ife_divgrace **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_DIVINE_GRACE 6 **** **** **** **** **** 0 1
|
||||
218 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6 **** **** **** **** **** 0 1
|
||||
@@ -424,8 +424,8 @@
|
||||
420 ArcaneDefenseIll 2820 2823 ife_X1ADIll **** **** **** **** **** **** **** **** 170 **** 0 0 1 **** **** **** **** 1 **** 7 **** **** **** **** **** **** **** **** **** **** FEAT_ARCANE_DEFENSE_ILLUSION 6 **** **** **** **** **** 0 1
|
||||
421 ArcaneDefenseNec 2821 2823 ife_X1ADNec **** **** **** **** **** **** **** **** 171 **** 0 0 1 **** **** **** **** 1 **** 7 **** **** **** **** **** **** **** **** **** **** FEAT_ARCANE_DEFENSE_NECROMANCY 6 **** **** **** **** **** 0 1
|
||||
422 ArcaneDefenseTra 2822 2823 ife_X1ADTra **** **** **** **** **** **** **** **** 172 **** 0 0 1 **** **** **** **** 1 **** 7 **** **** **** **** **** **** **** **** **** **** FEAT_ARCANE_DEFENSE_TRANSMUTATION 6 **** **** **** **** **** 0 1
|
||||
423 ExtraMusic 2824 2825 ife_X1ExMus **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** 11 **** **** **** FEAT_EXTRA_MUSIC 6 **** 1 1 **** **** 0 1
|
||||
424 LingeringSong 2826 2827 ife_X1LingSong **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** 11 **** **** **** FEAT_LINGERING_SONG 6 **** 1 1 **** **** 0 1
|
||||
423 ExtraMusic 2824 2825 ife_X1ExMus **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** 11 **** **** **** FEAT_EXTRA_MUSIC 6 **** 1 **** **** **** 0 1
|
||||
424 LingeringSong 2826 2827 ife_X1LingSong **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** 11 **** **** **** FEAT_LINGERING_SONG 6 **** 1 **** **** **** 0 1
|
||||
425 DirtyFighting 2803 2804 ife_X1DirFig 2 **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_DIRTY_FIGHTING 6 **** **** **** **** **** 0 1
|
||||
426 ResistDisease 2828 2829 ife_X1ResDis **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_RESIST_DISEASE 6 **** **** **** **** **** 0 1
|
||||
427 ResistEnergyCold 2830 2835 ife_X1ResCol **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 8 **** **** **** **** **** **** **** **** **** **** FEAT_RESIST_ENERGY_COLD 6 **** **** **** **** 8 0 1
|
||||
@@ -2352,7 +2352,7 @@
|
||||
2348 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
2349 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
2350 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
2351 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
2351 FEAT_MONK_ABUNDANT_STEP 16793787 16793788 is_dimdoor **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 17986 **** 1 1 **** **** **** **** **** **** **** **** **** **** **** FEAT_MONK_ABUNDANT_STEP 5 0 **** **** **** **** 0 1
|
||||
2352 FEAT_KIAI_SMITE_1 16826172 16826173 ife_x2kicrit **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2772 **** **** 10 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
2353 PRC_ATTACK 16837825 16837826 ife_x2kicrit **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 18671 **** **** -1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
2354 FE_Oozes 16790075 6079 ife_racehate **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** 5 **** **** **** **** **** **** **** **** **** **** FEAT_FAVORED_ENEMY_OOZE 6 **** **** **** **** **** 0 1
|
||||
@@ -2463,7 +2463,7 @@
|
||||
2459 TactileTrapsmith 16824612 16824613 ife_lightflex **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
||||
2460 AugmentHealing 16824614 16824615 ife_X1ResDis **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** 4 4 **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
||||
2461 DetectEvil 16827574 16827575 is_detect_evil **** **** **** **** **** **** **** **** **** **** 0 0 0 15 5 3201 **** 0.5 -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_DEATH_DOMAIN_POWER 6 **** **** **** **** **** 0 1
|
||||
2462 InscribeRune 16831916 16831917 ife_X2PlnrTurn **** **** **** 13 **** **** **** **** **** **** 0 0 1 **** **** 1621 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
2462 InscribeRune 16831916 16831917 ife_X2PlnrTurn **** **** **** 13 **** **** **** **** **** **** 0 0 1 **** **** 1621 **** 1 **** **** 1 **** **** **** **** **** 25 1 **** **** FEAT_INSCRIBE_RUNE 4 **** **** **** **** **** 0 0
|
||||
2463 RuneCraft 16831973 16831974 ife_legendaryart **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
||||
2464 RunePower 16831975 16831976 Ife_epMagmaBurst **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
||||
2465 ImprovedRunecasting 16831977 16831978 ife_dweomerthief **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1624 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 0
|
||||
@@ -2550,7 +2550,7 @@
|
||||
2546 FEAT_EPIC_SYMBIOSIS_3 16822293 16822256 ife_damred **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** 2547 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_SMBIOIS_1 4 **** **** **** **** **** 0 1
|
||||
2547 FEAT_EPIC_SYMBIOSIS_4 16822294 16822256 ife_damred **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_SMBIOIS_1 4 **** **** **** **** **** 0 1
|
||||
2548 SwiftAmbusher 16834560 16834561 ife_X2CritDLBow **** **** **** **** **** **** **** **** 345 3715 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
||||
2549 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 1
|
||||
2549 EPIC_FEAT_INSCRIBE_EPIC_RUNES 16989389 16989390 ife_X2PlnrTurn **** **** **** 19 **** **** **** **** 2462 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** 25 24 **** **** EPIC_FEAT_INSCRIBE_EPIC_RUNES 4 **** **** **** **** **** 1 0
|
||||
2550 FEAT_ES_TRANS_1 16822325 16822326 ife_rage **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** 2551 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ES_TRANS_1 4 **** **** **** **** **** 0 1
|
||||
2551 FEAT_ES_TRANS_2 16822327 16822326 ife_rage **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** 2552 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ES_TRANS_2 4 **** **** **** **** **** 0 1
|
||||
2552 FEAT_ES_TRANS_3 16822328 16822326 ife_rage **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ES_TRANS_3 4 **** **** **** **** **** 0 1
|
||||
@@ -2811,8 +2811,8 @@
|
||||
2807 ImprovedTrip 16834580 16834581 ife_X1ImpExp **** **** **** 13 **** **** **** **** 389 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
||||
2808 FEAT_ACROBATIC_CHARGE 16822731 16822735 ife_x2epicdodge **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1750 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ACROBATIC_CHARGE 4 **** **** **** **** **** 0 1
|
||||
2809 CurlingWaveStrike 16834582 16834583 ife_X2ImKiStrk5 **** **** 13 **** **** **** **** **** 2807 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
||||
2810 Bullrush 16834586 16834587 ife_X1Bull **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3476 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
2811 Overrun 16834588 16834589 ife_X1DivMig **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3477 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
2810 Bullrush 16834586 16834587 ife_X1Bull **** **** **** **** **** **** **** **** **** **** 0 0 0 22 1 3476 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
2811 Overrun 16834588 16834589 ife_X1DivMig **** **** **** **** **** **** **** **** **** **** 0 0 0 22 1 3477 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
2812 FEAT_ELABORATE_PARRY 16822736 16822737 ife_impparry **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ELABORATE_PARRY 4 **** **** **** **** **** 0 1
|
||||
2813 FEAT_EPIC_DUELIST 16822738 16822739 ife_epduel **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_DUELIST 4 **** **** **** **** **** 0 1
|
||||
2814 FEAT_BLAST_INFIDEL 16822748 16822749 ife_x2grsmt1 **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_BLAST_INFIDEL 4 **** **** **** **** **** 0 1
|
||||
@@ -2823,8 +2823,8 @@
|
||||
2819 FEAT_SPELLPOWER_6 16822756 16822759 ife_X1GFSPen **** **** **** **** **** **** **** **** 2818 **** 0 0 0 **** **** **** 2820 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELL_POWER_6 4 **** **** **** **** **** 0 1
|
||||
2820 FEAT_SPELLPOWER_8 16822757 16822759 ife_X1GFSPen **** **** **** **** **** **** **** **** 2819 **** 0 0 0 **** **** **** 2821 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELL_POWER_8 4 **** **** **** **** **** 0 1
|
||||
2821 FEAT_SPELLPOWER_10 16822758 16822759 ife_X1GFSPen **** **** **** **** **** **** **** **** 2820 **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELL_POWER_10 4 **** **** **** **** **** 0 1
|
||||
2822 Trip 16834590 16834591 ife_X1ImpExp **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3478 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
2823 Charge 16834592 16834593 ife_X2ImKiStrk5 **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3479 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
2822 Trip 16834590 16834591 ife_X1ImpExp **** **** **** **** **** **** **** **** **** **** 0 0 0 22 1 3478 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
2823 Charge 16834592 16834593 ife_X2ImKiStrk5 **** **** **** **** **** **** **** **** **** **** 0 0 0 22 1 3479 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
2824 UnsettlingEnchantment 16827143 16827144 ife_X2EpicRepu **** **** **** **** **** **** **** **** 168 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ALERTNESS 5 **** **** **** **** **** 0 1
|
||||
2825 SLA_I 16822760 16822761 ife_heiro_sla1 **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2036 **** 1 5 **** **** **** **** **** **** **** **** **** **** **** FEAT_SLA_I 4 **** **** **** **** **** 0 0
|
||||
2826 SLA_II 16822760 16822761 ife_heiro_sla2 **** **** **** **** **** **** **** **** 2825 **** 0 0 0 **** **** 2037 **** 1 5 **** **** **** **** **** **** **** **** **** **** **** FEAT_SLA_II 4 **** **** **** **** **** 0 0
|
||||
@@ -2919,7 +2919,7 @@
|
||||
2915 FEAT_PRESTIGE_SHIFTER_QUICKSLOTS1 16824336 16824348 ife_X2WShpDrag **** **** **** **** **** **** **** **** **** **** 0 0 0 10 1 1919 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_PRESTIGE_SHIFTER_QUICKSLOTS1 5 **** **** **** **** **** 0 1
|
||||
2916 FEAT_PRESTIGE_SHIFTER_QUICKSLOTS2 16824337 16824348 ife_X2WShpDrag **** **** **** **** **** **** **** **** **** **** 0 0 0 10 1 1920 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_PRESTIGE_SHIFTER_QUICKSLOTS2 5 **** **** **** **** **** 0 1
|
||||
2917 FEAT_PRESTIGE_SHIFTER_NATURALSPELL 16824368 16824369 ife_X2GWShp3 **** **** **** **** 13 **** **** **** **** **** 0 0 1 10 1 **** **** 1 **** **** **** 305 2900 **** **** **** **** **** **** **** FEAT_PRESTIGE_SHIFTER_NATURALSPELL 5 **** **** **** **** **** 0 1
|
||||
2918 Shifter_Black_List 16824371 16824372 ife_darkvis **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** Shifter_Black_List 6 **** **** **** **** **** 0 1
|
||||
2918 FEAT_ARCHETYPAL_FORM 16824371 16824372 ife_darkvis **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ARCHETYPAL_FORM 6 **** **** **** **** **** 0 1
|
||||
2919 ExamineRecipe 16824431 16824432 is_divine **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2250 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EXAMINE_RECIPE 4 **** **** **** **** **** 0 0
|
||||
2920 CraftConstruct 16823154 16823155 ife_craftconstr **** **** **** **** **** **** **** 99 2925 2926 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_CRAFT_CONSTRUCT 4 **** **** **** **** **** 0 1
|
||||
2921 FEAT_PRESTIGE_LICH_TOUCH 16823130 16823131 ife_X2DthMstTch **** **** **** **** **** **** **** **** **** **** 0 0 0 3 **** 1904 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_PRESTIGE_LICH_TOUCH 5 **** **** **** **** **** 0 1
|
||||
@@ -3036,26 +3036,26 @@
|
||||
3032 FEAT_OOZY_GLOB5 16825060 16825061 ife_x1precise **** **** **** **** **** **** **** **** **** **** 0 0 0 2 **** 2018 **** 1 25 **** 0 **** **** **** **** **** **** **** **** **** FEAT_OOZY_GLOB5 6 1 **** **** **** **** 0 1
|
||||
3033 IndiscernibleAnatomy 16825066 16825067 ife_x1sevade **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_INDISCERNIBLE_ANATOMY 6 **** **** **** **** **** 0 1
|
||||
3034 CharismaPenality 16825068 16825069 ife_x1spdrkbls **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_CHARISMA_PENALITY 6 **** **** **** **** **** 0 1
|
||||
3035 OneWithTheOoze 16825070 16825071 ife_x1sshad **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ONE_WITH_THE_OOZE 6 **** **** **** **** **** **** 1
|
||||
3035 OneWithTheOoze 16825070 16825071 ife_x1sshad **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ONE_WITH_THE_OOZE 6 **** **** **** **** **** 0 1
|
||||
3036 FEAT_SLIME_WAVE 16825072 16825073 is_burnhands **** **** **** **** **** **** **** **** **** **** 0 0 0 2 **** 2023 **** 1 10 **** 0 **** **** **** **** **** **** **** **** **** FEAT_SLIME_WAVE 6 0 **** **** **** **** 0 1
|
||||
3037 FEAT_SKILL_FOCUS_RIDE 16789534 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_RIDE **** **** **** **** **** **** **** 1
|
||||
3038 FEAT_EPIC_SKILL_FOCUS_RIDE 16789535 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 27 20 **** **** FEAT_EPIC_SKILL_FOCUS_RIDE **** **** 20 **** **** **** **** 1
|
||||
3039 FEAT_SKILL_FOCUS_JUMP 16789536 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_JUMP **** **** **** **** **** **** **** 1
|
||||
3040 FEAT_EPIC_SKILL_FOCUS_JUMP 16789565 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 28 20 **** **** FEAT_EPIC_SKILL_FOCUS_JUMP **** **** 20 **** **** **** **** 1
|
||||
3041 FEAT_SKILL_FOCUS_SENSE_MOTIVE 16789590 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_SENSE_MOTIVE **** **** **** **** **** **** **** 1
|
||||
3042 FEAT_EPIC_SKILL_FOCUS_SENSE_MOTIVE 16789591 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 30 20 **** **** FEAT_EPIC_SKILL_FOCUS_SENSE_MOTIVE **** **** 20 **** **** **** **** 1
|
||||
3043 FEAT_SKILL_FOCUS_MARTIAL_LORE 16789592 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_MARTIAL_LORE **** **** **** **** **** **** **** 1
|
||||
3044 FEAT_EPIC_SKILL_FOCUS_MARTIAL_LORE 16789593 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 31 20 **** **** FEAT_EPIC_SKILL_FOCUS_MARTIAL_LORE **** **** 20 **** **** **** **** 1
|
||||
3045 FEAT_SKILL_FOCUS_BALANCE 16834263 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_BALANCE **** **** **** **** **** **** **** 1
|
||||
3046 FEAT_EPIC_SKILL_FOCUS_BALANCE 16834264 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 32 20 **** **** FEAT_EPIC_SKILL_FOCUS_BALANCE **** **** 20 **** **** **** **** 1
|
||||
3047 FEAT_SKILL_FOCUS_CRAFT_POISON 16834265 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_CRAFT_POISON **** **** **** **** **** **** **** 1
|
||||
3048 FEAT_EPIC_SKILL_FOCUS_CRAFT_POISON 16834266 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 35 20 **** **** FEAT_EPIC_SKILL_FOCUS_CRAFT_POISON **** **** 20 **** **** **** **** 1
|
||||
3049 FEAT_SKILL_FOCUS_PSICRAFT 16834267 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_PSICRAFT **** **** **** **** **** **** **** 1
|
||||
3050 FEAT_EPIC_SKILL_FOCUS_PSICRAFT 16834268 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 36 20 **** **** FEAT_EPIC_SKILL_FOCUS_PSICRAFT **** **** 20 **** **** **** **** 1
|
||||
3051 FEAT_SKILL_FOCUS_CLIMB 16834269 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_CLIMB **** **** **** **** **** **** **** 1
|
||||
3052 FEAT_EPIC_SKILL_FOCUS_CLIMB 16834270 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 37 20 **** **** FEAT_EPIC_SKILL_FOCUS_CLIMB **** **** 20 **** **** **** **** 1
|
||||
3053 FEAT_SKILL_FOCUS_CRAFT_GENERAL 16834271 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_CRAFT_GENERAL **** **** **** **** **** **** **** 1
|
||||
3054 FEAT_EPIC_SKILL_FOCUS_CRAFT_GENERAL 16834272 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 38 20 **** **** FEAT_EPIC_SKILL_FOCUS_CRAFT_GENERAL **** **** 20 **** **** **** **** 1
|
||||
3037 FEAT_SKILL_FOCUS_RIDE 16789534 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_RIDE 6 **** **** **** **** **** 0 1
|
||||
3038 FEAT_EPIC_SKILL_FOCUS_RIDE 16789535 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 27 20 **** **** FEAT_EPIC_SKILL_FOCUS_RIDE 6 **** 20 **** **** **** 1 1
|
||||
3039 FEAT_SKILL_FOCUS_JUMP 16789536 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_JUMP 6 **** **** **** **** **** 0 1
|
||||
3040 FEAT_EPIC_SKILL_FOCUS_JUMP 16789565 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 28 20 **** **** FEAT_EPIC_SKILL_FOCUS_JUMP 6 **** 20 **** **** **** 1 1
|
||||
3041 FEAT_SKILL_FOCUS_SENSE_MOTIVE 16789590 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_SENSE_MOTIVE 6 **** **** **** **** **** 0 1
|
||||
3042 FEAT_EPIC_SKILL_FOCUS_SENSE_MOTIVE 16789591 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 30 20 **** **** FEAT_EPIC_SKILL_FOCUS_SENSE_MOTIVE 6 **** 20 **** **** **** 1 1
|
||||
3043 FEAT_SKILL_FOCUS_MARTIAL_LORE 16789592 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_MARTIAL_LORE 6 **** **** **** **** **** 0 1
|
||||
3044 FEAT_EPIC_SKILL_FOCUS_MARTIAL_LORE 16789593 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 31 20 **** **** FEAT_EPIC_SKILL_FOCUS_MARTIAL_LORE 6 **** 20 **** **** **** 1 1
|
||||
3045 FEAT_SKILL_FOCUS_BALANCE 16834263 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_BALANCE 6 **** **** **** **** **** 0 1
|
||||
3046 FEAT_EPIC_SKILL_FOCUS_BALANCE 16834264 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 32 20 **** **** FEAT_EPIC_SKILL_FOCUS_BALANCE 6 **** 20 **** **** **** 1 1
|
||||
3047 FEAT_SKILL_FOCUS_CRAFT_POISON 16834265 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_CRAFT_POISON 6 **** **** **** **** **** 0 1
|
||||
3048 FEAT_EPIC_SKILL_FOCUS_CRAFT_POISON 16834266 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 35 20 **** **** FEAT_EPIC_SKILL_FOCUS_CRAFT_POISON 6 **** 20 **** **** **** 1 1
|
||||
3049 FEAT_SKILL_FOCUS_PSICRAFT 16834267 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_PSICRAFT 6 **** **** **** **** **** 0 1
|
||||
3050 FEAT_EPIC_SKILL_FOCUS_PSICRAFT 16834268 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 36 20 **** **** FEAT_EPIC_SKILL_FOCUS_PSICRAFT 6 **** 20 **** **** **** 1 1
|
||||
3051 FEAT_SKILL_FOCUS_CLIMB 16834269 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_CLIMB 6 **** **** **** **** **** 0 1
|
||||
3052 FEAT_EPIC_SKILL_FOCUS_CLIMB 16834270 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 37 20 **** **** FEAT_EPIC_SKILL_FOCUS_CLIMB 6 **** 20 **** **** **** 1 1
|
||||
3053 FEAT_SKILL_FOCUS_CRAFT_GENERAL 16834271 424 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_CRAFT_GENERAL 6 **** **** **** **** **** 0 1
|
||||
3054 FEAT_EPIC_SKILL_FOCUS_CRAFT_GENERAL 16834272 4063 if_epic_iaijutsu **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** 15 **** **** **** **** **** **** 38 20 **** **** FEAT_EPIC_SKILL_FOCUS_CRAFT_GENERAL 6 **** 20 **** **** **** 1 1
|
||||
3055 FEAT_IMPROVED_TURNING 16790055 16790056 ife_xturn **** **** **** **** **** **** **** **** 294 **** 0 0 1 22 1 **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_IMPROVED_TURNING 6 0 **** **** **** **** 0 1
|
||||
3056 Hosp_XX 16823403 16823379 ic_hospitaler **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** 3057 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_HOSP_XX 4 0 **** **** **** **** **** 1
|
||||
3057 Hosp_XXI 16823404 16823379 ic_hospitaler **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** 3058 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_HOSP_XXI 4 0 **** **** **** **** **** 1
|
||||
@@ -3163,13 +3163,13 @@
|
||||
3159 FEAT_VERMINMASTERY 16825898 16825899 ife_animal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_VERMINMASTERY 6 **** **** **** **** **** 0 1
|
||||
3160 FEAT_MAGICALBEASTMASTERY 16825896 16825897 ife_animal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_MAGICALBEASTMASTERY 6 **** **** **** **** **** 0 1
|
||||
3161 Familiar 16825363 16825364 ife_familiar **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2189 **** 0.5 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SUMMON_FAMILIAR 6 **** **** **** **** **** 0 1
|
||||
3162 FEAT_RAVAGEGOLDENICE 16825902 16825903 ife_MagWeap **** **** **** **** **** 13 **** **** **** **** 0 0 0 **** **** 2190 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_RAVAGEGOLDENICE 6 **** **** **** **** **** 0 1
|
||||
3163 FEAT_STIGMATA 16825908 16825909 ife_layon **** **** **** **** **** **** **** **** 3165 **** 0 0 0 **** **** 2191 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_STIGMATA 6 **** **** **** **** **** 0 0
|
||||
3164 FEAT_HOLYRADIANCE 16825910 16825911 ife_holyrad **** **** **** **** **** **** 15 **** 3165 **** 0 0 1 **** **** 2196 **** 0.5 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HOLYRADIANCE 2 **** **** **** **** **** 0 1
|
||||
3165 FEAT_NIMBUSLIGHT 16825912 16825913 ife_nimlight **** **** **** **** **** **** **** **** **** **** 0 1 1 **** **** 2032 **** 0.5 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_NIMBUSLIGHT 2 **** **** **** **** **** 0 1
|
||||
3166 FEAT_INTUITIVE_ATTACK 16825914 16825915 ife_weppro_sim 1 **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_INTUITIVE_ATTACK 5 **** **** **** **** **** 0 1
|
||||
3167 FEAT_HAND_HEALER 16825916 16825917 ife_handheal **** **** **** **** **** **** 13 **** 299 **** 0 1 0 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_HAND_HEALER 5 **** **** **** **** **** 0 1
|
||||
3168 FEAT_EXALTED_TURNING 16825918 16825919 ife_exaturn **** **** **** **** **** **** **** **** 294 **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EXALTED_TURNING 1 **** **** **** **** **** 0 1
|
||||
3162 FEAT_RAVAGEGOLDENICE 16825902 16825903 ife_MagWeap **** **** **** **** **** 13 **** **** **** **** 0 0 1 **** **** 2190 **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_RAVAGEGOLDENICE 6 **** **** **** **** **** 0 1
|
||||
3163 FEAT_STIGMATA 16825908 16825909 ife_layon **** **** **** **** **** **** **** **** 3165 **** 0 0 1 **** **** 2191 **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_STIGMATA 6 **** **** **** **** **** 0 0
|
||||
3164 FEAT_HOLYRADIANCE 16825910 16825911 ife_holyrad **** **** **** **** **** **** 15 **** 3165 **** 0 0 1 **** **** 2196 **** 0.5 **** 97 1 **** **** **** **** **** **** **** **** **** FEAT_HOLYRADIANCE 2 **** **** **** **** **** 0 1
|
||||
3165 FEAT_NIMBUSLIGHT 16825912 16825913 ife_nimlight **** **** **** **** **** **** **** **** **** **** 0 1 1 **** **** 2032 **** 0.5 **** 97 1 **** **** **** **** **** **** **** **** **** FEAT_NIMBUSLIGHT 2 **** **** **** **** **** 0 1
|
||||
3166 FEAT_INTUITIVE_ATTACK 16825914 16825915 ife_weppro_sim 1 **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_INTUITIVE_ATTACK 5 **** **** **** **** **** 0 1
|
||||
3167 FEAT_HAND_HEALER 16825916 16825917 ife_handheal **** **** **** **** **** **** 13 **** 299 **** 0 1 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_HAND_HEALER 5 **** **** **** **** **** 0 1
|
||||
3168 FEAT_EXALTED_TURNING 16825918 16825919 ife_exaturn **** **** **** **** **** **** **** **** 294 **** 0 0 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_EXALTED_TURNING 1 **** **** **** **** **** 0 1
|
||||
3169 FEAT_SANCTIFY_MARTIAL_SICKLE 16825920 16823245 ife_X2WSDWAx **** **** **** **** **** **** 15 **** 98 **** 0 0 1 **** **** **** **** 0.5 **** 93 **** **** **** **** **** **** **** **** **** **** FEAT_SANCTIFY_MARTIAL_SICKLE 1 **** **** **** **** **** 0 1
|
||||
3170 FEAT_SANCTIFY_MARTIAL_DWARVENAXE 16825921 16823245 ife_X2WSDagg **** **** **** **** **** **** 15 **** 952 **** 0 0 1 **** **** **** **** 0.5 **** 93 **** **** **** **** **** **** **** **** **** **** FEAT_SANCTIFY_MARTIAL_DWARVENAXE 1 **** **** **** **** **** 0 1
|
||||
3171 FEAT_WEAPON_TEMPUS_SICKLE 16825923 16822945 ife_X2WpCh **** **** **** **** **** **** **** **** 98 **** 0 0 0 **** **** **** **** 0.5 **** 94 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_TEMPUS_SICKLE 1 **** **** **** **** **** 0 1
|
||||
@@ -3268,7 +3268,7 @@
|
||||
3264 SpellFocusEvil 16835611 16835614 ife_foc_spel **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 3 **** **** **** **** **** **** **** **** **** **** FEAT_SPELL_FOCUS_EVIL 4 **** **** **** **** **** 0 1
|
||||
3265 SpellFocusGood 16835612 16835614 ife_foc_spel **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 3 **** **** **** **** **** **** **** **** **** **** FEAT_SPELL_FOCUS_GOOD 4 **** **** **** **** **** 0 1
|
||||
3266 SpellFocusLawful 16835613 16835614 ife_foc_spel **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 3 **** **** **** **** **** **** **** **** **** **** FEAT_SPELL_FOCUS_LAWFUL 4 **** **** **** **** **** 0 1
|
||||
3267 FEAT_STEADFAST_DETERMINATION 16789862 16789863 ife_ironwil **** **** **** **** **** **** **** **** 2568 **** **** **** 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_STEADFAST_DETERMINATION 5 **** **** **** **** **** 0 1
|
||||
3267 FEAT_STEADFAST_DETERMINATION 16789862 16789863 ife_ironwil **** **** **** **** **** **** **** **** 2568 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_STEADFAST_DETERMINATION 5 **** **** **** **** **** 0 1
|
||||
3268 FEAT_WEAPON_TEMPUS_CLUB 16822946 16822945 ife_X2WpCh **** **** **** **** **** **** **** **** 43 **** 0 0 0 **** **** **** **** 0.5 **** 94 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_TEMPUS_CLUB 1 **** **** **** **** **** 0 1
|
||||
3269 FEAT_WEAPON_TEMPUS_DAGGER 16822947 16822945 ife_X2WpCh **** **** **** **** **** **** **** **** 90 **** 0 0 0 **** **** **** **** 0.5 **** 94 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_TEMPUS_DAGGER 1 **** **** **** **** **** 0 1
|
||||
3270 FEAT_WEAPON_TEMPUS_LIGHTMACE 16822948 16822945 ife_X2WpCh **** **** **** **** **** **** **** **** 94 **** 0 0 0 **** **** **** **** 0.5 **** 94 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_TEMPUS_LIGHTMACE 1 **** **** **** **** **** 0 1
|
||||
@@ -3356,7 +3356,7 @@
|
||||
3352 FEAT_KillingShot 16826000 16826001 ife_wepspec_Lbw 19 **** **** **** **** **** **** **** 3353 **** 0 0 1 **** **** 2207 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_KillingShot 6 0 **** **** **** **** 0 1
|
||||
3353 FEAT_PerfectShot 16825998 16825999 ife_wepspec_Lbw 6 **** **** **** **** **** **** **** 3351 **** 0 0 1 **** **** 2207 **** 0.5 **** **** **** 92 93 101 102 99 **** **** **** **** FEAT_PerfectShot 6 0 **** **** **** **** 0 1
|
||||
3354 FEAT_PerfectShot2 16825940 16825941 ife_wepspec_Lbw 6 **** **** **** **** **** **** **** 3353 **** 0 0 1 **** **** 2207 **** 0.5 **** **** **** 92 93 101 102 99 **** **** **** **** FEAT_PerfectShot2 6 0 **** **** **** **** 0 1
|
||||
3355 FEAT_SERVHEAVEN 16823344 16823345 ife_servheaven **** **** **** **** **** **** **** **** **** **** 0 1 1 **** **** 2033 **** **** 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SERVHEAVEN 2 **** **** **** **** **** 0 1
|
||||
3355 FEAT_SERVHEAVEN 16823344 16823345 ife_servheaven **** **** **** **** **** **** **** **** **** **** 0 1 1 **** **** 2033 **** **** 1 97 1 **** **** **** **** **** **** **** **** **** FEAT_SERVHEAVEN 2 **** **** **** **** **** 0 1
|
||||
3356 FEAT_RANGED_SMITE 16823346 16823347 ife_rangedsmite **** **** **** **** **** **** **** **** **** **** 0 1 0 **** **** 2034 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** FEAT_RANGED_SMITE 5 1 **** **** **** **** 0 1
|
||||
3357 FEAT_VILE_MARTIAL_CLUB 16825481 16825480 ife_X2WSClub **** **** **** **** **** **** 15 **** 43 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_CLUB 1 **** **** **** **** **** 0 1
|
||||
3358 FEAT_VILE_MARTIAL_DAGGER 16825482 16825480 ife_X2WSDagg **** **** **** **** **** **** 15 **** 90 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_DAGGER 1 **** **** **** **** **** 0 1
|
||||
@@ -3389,8 +3389,8 @@
|
||||
3385 FEAT_VILE_MARTIAL_LIGHTCROSSBOW 16825509 16825480 ife_X2WSLXB **** **** **** **** **** **** 15 **** 93 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_LIGHTCROSSBOW 1 **** **** **** **** **** 0 1
|
||||
3386 FEAT_VILE_MARTIAL_SLING 16825510 16825480 ife_X2WSSlng **** **** **** **** **** **** 15 **** 99 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_SLING 1 **** **** **** **** **** 0 1
|
||||
3387 FEAT_VILE_MARTIAL_LONGBOW 16825511 16825480 ife_X2WSLBow **** **** **** **** **** **** 15 **** 101 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_LONGBOW 1 **** **** **** **** **** 0 1
|
||||
3388 FEAT_SAC_VOW 16822845 16822846 ife_sacredvow **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SAC_VOW 6 **** **** **** **** **** 0 1
|
||||
3389 FEAT_VOW_OBED 16822847 16822848 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VOW_OBED 6 **** **** **** **** **** 0 1
|
||||
3388 FEAT_SAC_VOW 16822845 16822846 ife_sacredvow **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_SAC_VOW 6 **** **** **** **** **** 0 1
|
||||
3389 FEAT_VOW_OBED 16822847 16822848 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_VOW_OBED 6 **** **** **** **** **** 0 1
|
||||
3390 FEAT_EB_HAND 16822851 16822852 ife_X2BoneSk1 **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 95 **** **** **** **** **** **** **** **** **** **** FEAT_EB_HAND 6 **** **** **** **** **** 0 1
|
||||
3391 FEAT_EB_HEAD 16822853 16822854 ife_X2BoneSk1 **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 95 **** **** **** **** **** **** **** **** **** **** FEAT_EB_HEAD 6 **** **** **** **** **** 0 1
|
||||
3392 FEAT_EB_CHEST 16822855 16822856 ife_X2BoneSk1 **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 95 **** **** **** **** **** **** **** **** **** **** FEAT_EB_CHEST 6 **** **** **** **** **** 0 1
|
||||
@@ -3414,9 +3414,9 @@
|
||||
3410 OcAdept_FlSto 16789515 16789525 ife_petray **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1545 **** 1 2 **** 0 **** **** **** **** **** **** **** **** **** FEAT_PETRAY 6 **** **** **** **** **** 0 1
|
||||
3411 OcAdept_Dis 16789516 16789526 ife_disray **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1546 **** 1 2 **** 0 **** **** **** **** **** **** **** **** **** FEAT_DISRAY 6 **** **** **** **** **** 0 1
|
||||
3412 OcAdept_Death 16789517 16789527 ife_deathray **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1547 **** 1 2 **** 0 **** **** **** **** **** **** **** **** **** FEAT_DEATHRAY 6 **** **** **** **** **** 0 1
|
||||
3413 ChargeBullrush 16834594 16834595 ife_X2Epfighter **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3480 **** 0.5 -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
3414 GrappleBegin 16834584 16834585 ife_X2ImKiStrk4 **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3475 **** 0.5 -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
3415 CombatMove_RadialMaster3 16833148 16832298 ife_X2Epmonk **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3496 **** 0.5 -1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 **** **** **** **** **** 0 0
|
||||
3413 ChargeBullrush 16834594 16834595 ife_X2Epfighter **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3480 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
3414 GrappleBegin 16834584 16834585 ife_X2ImKiStrk4 **** **** **** **** **** **** **** **** **** **** 0 0 0 22 1 3475 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
3415 CombatMove_RadialMaster3 16833148 16832298 ife_X2Epmonk **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3496 **** 0.5 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 **** **** **** **** **** 0 0
|
||||
3416 FEAT_EPIC_SAMURAI 16789545 16789546 ife_X2Epfighter **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_SAMURAI 6 **** **** **** **** **** 1 1
|
||||
3417 Samur_AncestralDaisho 16789547 16789548 ife_wepspec_Kat **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1548 **** 0 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_ANCESTRAL_DAISHO 6 **** **** **** **** **** 0 1
|
||||
3418 Warpr_Rally 16789555 16789556 is_fear **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1549 **** 0 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_RALLY 6 **** **** **** **** **** 0 1
|
||||
@@ -4200,7 +4200,7 @@
|
||||
4196 SB_Brill_25 16823454 16823455 ife_X2WSLSwd **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1566 4197 0.5 14 **** 1 **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_SPECIALIZATION_LONGSWORD 1 **** **** **** **** **** 0 1
|
||||
4197 SB_Brill_27 16823454 16823455 ife_X2WSLSwd **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1566 4198 0.5 15 **** 1 **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_SPECIALIZATION_LONGSWORD 1 **** **** **** **** **** 0 1
|
||||
4198 SB_Brill_29 16823454 16823455 ife_X2WSLSwd **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1566 **** 0.5 16 **** 1 **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_SPECIALIZATION_LONGSWORD 1 **** **** **** **** **** 0 1
|
||||
4199 EXALTED_COMPANION 16822440 16822441 ife_animal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_BLARCH_REGEN_1 4 **** **** **** **** **** 0 1
|
||||
4199 EXALTED_COMPANION 16822440 16822441 ife_animal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_BLARCH_REGEN_1 4 **** **** **** **** **** 0 1
|
||||
4200 FEAT_BLARCH_POISON_BLOOD 16822397 16822398 ife_X2UsePoison **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2998 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_BLARCH_POISON_BLOOD 4 **** **** **** **** **** 0 1
|
||||
4201 FEAT_BLARCH_ACID_BLOOD 16822399 16822400 ife_X2UsePoison **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ACID_BLOOD 4 **** **** **** **** **** 0 1
|
||||
4202 FEAT_BLARCH_REGEN_1 16822401 16822402 ife_X1ResDis **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** 4203 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_BLARCH_REGEN_1 4 **** **** **** **** **** 0 1
|
||||
@@ -4318,7 +4318,7 @@
|
||||
4314 DEATHLESS_FRENZY 16824231 16824232 ife_endfre **** **** **** **** **** **** **** **** **** **** 0 0 0 0 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_DEATHLESS_FRENZY 1 **** **** **** **** **** 0 1
|
||||
4315 GREATER_TWO_WEAPON_FIGHTING 16824246 16824247 ife_gtwo_wep 15 **** **** **** **** **** **** **** 20 **** 0 0 1 **** 1 **** 4316 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_GREATER_TWO_WEAPON_FIGHTING 6 **** **** **** **** **** 0 1
|
||||
4316 SUPREME_TWO_WEAPON_FIGHTING 16824248 16824249 ife_gtwo_wep **** **** **** **** **** **** **** **** **** **** 0 0 0 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SUPREME_TWO_WEAPON_FIGHTING 6 **** **** **** **** **** 0 1
|
||||
4317 FEAT_TWO_WEAPON_DEFENSE_1 16824250 16824251 ife_ohparry **** **** 15 **** **** **** **** **** 41 **** 0 0 0 **** 1 **** 4318 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_TWO_WEAPON_DEFENSE 1 **** **** **** **** **** 0 1
|
||||
4317 FEAT_TWO_WEAPON_DEFENSE_1 16824250 16824251 ife_ohparry **** **** 15 **** **** **** **** **** 41 **** 0 0 1 **** 1 **** 4318 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_TWO_WEAPON_DEFENSE 1 **** **** **** **** **** 0 1
|
||||
4318 FEAT_TWO_WEAPON_DEFENSE_2 16825529 16824251 ife_ohparry 6 **** 17 **** **** **** **** **** 4317 **** 0 0 0 **** 1 **** 4319 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_TWO_WEAPON_DEFENSE 1 **** **** **** **** **** 0 1
|
||||
4319 FEAT_TWO_WEAPON_DEFENSE_3 16825530 16824251 ife_ohparry 11 **** 19 **** **** **** **** **** 4318 **** 0 0 0 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_TWO_WEAPON_DEFENSE 1 **** **** **** **** **** 0 1
|
||||
4320 PERFECT_TWO_WEAPON_FIGHTING 16824252 16824253 ife_gtwo_wep **** **** 25 **** **** **** **** **** 4315 **** 0 0 1 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_PERFECT_TWO_WEAPON_FIGHTING 6 **** **** **** **** **** 1 1
|
||||
@@ -4375,12 +4375,12 @@
|
||||
4371 FEAT_SPELLFIRE_QUICKSELECT 16824658 16824663 ife_spellf_quick **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3016 **** **** -1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_QUICKSELECT **** **** **** **** **** **** **** 0
|
||||
4372 FEAT_WEAPON_FOCUS_SPELLFIRE 16824674 16824686 ife_wepfoc_spf 1 **** **** **** **** **** **** **** 4368 **** 0 0 1 **** **** **** **** 1 **** 1 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_FOCUS_SPELLFIRE 1 **** **** **** **** **** 0 1
|
||||
4373 FEAT_EPIC_WEAPON_FOCUS_SPELLFIRE 16824685 16824687 ife_X2WFSpellf **** **** **** **** **** **** **** **** 4372 **** 0 0 1 **** **** **** **** 0.5 **** 10 **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_FOCUS_SPELLFIRE 1 **** **** **** **** **** 1 1
|
||||
4374 FEAT_SPELLFIRE_DRAIN_CHARGED 16824668 16824669 ife_spellf_drnc **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3033 **** **** -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_DRAIN_CHARGED **** **** **** **** **** **** **** 1
|
||||
4374 FEAT_SPELLFIRE_DRAIN_CHARGED 16824668 16824669 ife_spellf_drnc **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3033 **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_DRAIN_CHARGED **** **** **** **** **** **** **** 1
|
||||
4375 FEAT_SPELLFIRE_INCREASED_STORAGE 16824670 16824671 ife_spellf_store **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_INCREASED_STORAGE **** **** **** **** **** **** **** 1
|
||||
4376 FEAT_SPELLFIRE_IMPROVED_HEALING 16824672 16824673 ife_spellf_heali **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_IMPROVED_HEALING **** **** **** **** **** **** **** 1
|
||||
4377 FEAT_SPELLFIRE_RAPID_BLAST 16824675 16824676 ife_spellf_rapid **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3034 **** **** -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_RAPID_BLAST **** **** **** **** **** **** **** 1
|
||||
4378 FEAT_SPELLFIRE_DRAIN_PERMANENT 16824677 16824678 ife_spellf_drnp **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3037 **** **** -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_DRAIN_PERMANENT **** **** **** **** **** **** **** 1
|
||||
4379 FEAT_SPELLFIRE_CHARGE_ITEM 16824679 16824680 ife_spellf_charg **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3038 **** **** -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_CHARGE_ITEM **** **** **** **** **** **** **** 1
|
||||
4378 FEAT_SPELLFIRE_DRAIN_PERMANENT 16824677 16824678 ife_spellf_drnp **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3037 **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_DRAIN_PERMANENT **** **** **** **** **** **** **** 1
|
||||
4379 FEAT_SPELLFIRE_CHARGE_ITEM 16824679 16824680 ife_spellf_charg **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3038 **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_CHARGE_ITEM **** **** **** **** **** **** **** 1
|
||||
4380 FEAT_SPELLFIRE_CROWN 16824681 16824682 ife_spellf_crown **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3039 **** **** -1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_CROWN **** **** **** **** **** **** **** 0
|
||||
4381 FEAT_SPELLFIRE_MAELSTROM 16824683 16824684 ife_spellf_maels **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 3040 **** **** -1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SPELLFIRE_MAELSTROM **** **** **** **** **** **** **** 1
|
||||
4382 OotBI_RangedPrecision 16826378 16826379 ife_wepspec_Lbw **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2435 **** 1 -1 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||
@@ -4460,8 +4460,8 @@
|
||||
4456 minstrel_song_wisdom 16823470 16823487 ife_bardsong **** **** **** **** **** **** **** **** **** **** 0 0 0 23 **** 2154 **** 0.5 **** 105 1 **** **** **** **** **** **** **** **** **** FEAT_MINSTREL_SONG_WISDOM 5 **** **** **** **** **** 0 1
|
||||
4457 minstrel_song_charisma 16823471 16823488 ife_bardsong **** **** **** **** **** **** **** **** **** **** 0 0 0 23 **** 2155 **** 0.5 **** 105 1 **** **** **** **** **** **** **** **** **** FEAT_MINSTREL_SONG_CHARISMA 5 **** **** **** **** **** 0 1
|
||||
4458 minstrel_song_wound_whisp 16823111 16823489 ife_bardsong **** **** **** **** **** **** **** **** **** **** 0 0 0 23 **** 2156 **** 0.5 **** 105 1 **** **** **** **** **** **** **** **** **** FEAT_MINSTREL_SONG_WOUND_WHISP 5 **** **** **** **** **** 0 1
|
||||
4459 Warlock_Imbue_Item 16827950 16827951 ife_imbueitem **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2082 **** 0.5 -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_IMBUE_ITEM 6 1 **** **** **** **** 0 1
|
||||
4460 Warlock_Eldritch_Blast 16827948 16827949 inv_eldrtchblast **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2083 **** 0.5 -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_ELDRITCH_BLAST 6 1 **** **** **** **** 0 1
|
||||
4459 Warlock_Imbue_Item 16827950 16827951 ife_imbueitem **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2082 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_IMBUE_ITEM 6 1 **** **** **** **** 0 1
|
||||
4460 Warlock_Eldritch_Blast 16827948 16827949 inv_eldrtchblast **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2083 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ELDRITCH_BLAST 6 1 **** **** **** **** 0 1
|
||||
4461 Warlock_Resist_Acid 16827938 16827943 ife_X2EnrRsA1 **** **** **** **** **** **** **** **** **** **** 0 0 0 23 **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_WARLOCK_RESIST_ACID 5 **** **** **** **** **** 0 1
|
||||
4462 Warlock_Resist_Cold 16827939 16827943 ife_X2EnrRsC1 **** **** **** **** **** **** **** **** **** **** 0 0 0 23 **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_WARLOCK_RESIST_COLD 5 **** **** **** **** **** 0 1
|
||||
4463 Warlock_Resist_Elec 16827940 16827943 ife_X2EnrRsE1 **** **** **** **** **** **** **** **** **** **** 0 0 0 23 **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_WARLOCK_RESIST_ELEC 5 **** **** **** **** **** 0 1
|
||||
@@ -4855,8 +4855,8 @@
|
||||
4851 Metamorphic_Transfer_7_UNFINISHED **** **** ife_metamtrans_7 99 **** **** **** 13 **** **** **** 4850 **** 0 0 **** **** **** **** **** 0.5 **** 80 **** **** **** **** **** **** **** **** **** **** FEAT_METAMORPHIC_TRANSFER_7 6 **** **** **** **** **** 0 1
|
||||
4852 Deep_Impact 16826514 16826515 ife_deep_impact 5 13 **** **** **** **** **** **** 4822 **** 0 0 1 **** **** 2827 **** 1 -1 80 **** **** **** **** **** **** **** **** **** **** FEAT_DEEP_IMPACT 2 1 **** **** **** **** 0 1
|
||||
4853 Fell_Shot 16826516 16826517 ife_X1EnchArr 5 **** 13 **** **** **** **** **** 4824 27 0 0 1 **** **** 2828 **** 1 -1 80 **** **** **** **** **** **** **** **** **** **** FEAT_FELL_SHOT 2 1 **** **** **** **** 0 1
|
||||
4854 Soulblade_Warrior 16828177 16828178 ife_sk_free_draw **** **** **** **** **** **** **** **** 4559 4796 0 0 0 **** **** 2403 **** 0.5 -1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SOULBLADE_WARRIOR 5 **** **** **** **** **** 0 0
|
||||
4855 Spiritual_Force 16828179 16828180 ife_psych_strike **** **** **** **** **** **** **** **** 4559 4796 0 0 0 **** **** 2399 **** 0.5 -1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SPIRITUAL_FORCE 5 **** **** **** **** **** 0 0
|
||||
4854 Soulblade_Warrior 16828177 16828178 ife_sk_free_draw **** **** **** **** **** **** **** **** 4559 4796 0 0 1 **** **** 2403 **** 0.5 -1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SOULBLADE_WARRIOR 5 **** **** **** **** **** 0 0
|
||||
4855 Spiritual_Force 16828179 16828180 ife_psych_strike **** **** **** **** **** **** **** **** 4559 4796 0 0 1 **** **** 2399 **** 0.5 -1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SPIRITUAL_FORCE 5 **** **** **** **** **** 0 0
|
||||
4856 RacialEnergyRay 16823693 16823694 is_RayFrost **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1984 **** 1 -1 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||
4857 Epic_Psionic_Focus_1 16826551 16826519 ife_ep_psi_foc_1 **** **** **** **** **** **** **** **** 4818 **** 0 0 1 **** **** **** 4858 0.5 **** 80 **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_PSIONIC_FOCUS_1 6 **** **** **** **** **** 1 1
|
||||
4858 Epic_Psionic_Focus_2 16826552 16826519 ife_ep_psi_foc_2 **** **** **** **** **** **** **** **** 4857 **** 0 0 1 **** **** **** 4859 0.5 **** 80 **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_PSIONIC_FOCUS_2 6 **** **** **** **** **** 1 1
|
||||
@@ -5285,7 +5285,7 @@
|
||||
5281 SpiderfriendMagic 16834999 16835000 ife_web **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_BLADE_MEDITATION **** **** **** **** **** **** **** 1
|
||||
5282 ProfaneAgony 16834997 16834998 ife_prfnlflch **** **** **** **** **** **** **** **** 294 **** 0 0 1 **** **** 3792 **** 0.5 -1 **** **** 310 313 **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
5283 DivineIntercession 16834995 16834996 ife_telep_manag **** **** **** **** **** **** **** **** 294 **** 0 0 1 **** **** 3791 **** 0.5 -1 **** **** 324 323 **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
5284 InlindlSchool 16834993 16834994 ife_X2DCrtWhip **** **** **** 13 **** **** **** **** 389 42 **** **** 1 **** **** 2723 **** **** -1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_INLINDL_SCHOOL 2 **** **** **** **** **** 0 0
|
||||
5284 InlindlSchool 16834993 16834994 ife_X2DCrtWhip **** **** **** 13 **** **** **** **** 389 42 **** **** 1 22 1 2723 **** 0.5 **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_INLINDL_SCHOOL 2 1 **** **** **** **** 0 1
|
||||
5285 VaeSchool 16834991 16834992 ife_X2WpCh 7 **** **** **** **** **** **** **** 993 **** **** **** 1 **** **** **** **** **** **** **** **** 2807 4079 **** **** **** **** **** **** **** FEAT_SNAP_KICK **** **** **** **** **** **** **** 0
|
||||
5286 ThreeMountains 16834989 16834990 ife_X2DiviWrth **** 13 **** **** **** **** **** **** 2806 6 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SNAP_KICK **** **** **** **** **** **** **** 0
|
||||
5287 SpinningHalberd 16834987 16834988 ife_X2CritDHalb **** **** **** **** **** **** **** **** 112 **** 0 0 1 **** **** 2724 **** 0.5 -1 **** **** 41 374 **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
@@ -5313,7 +5313,7 @@
|
||||
5309 BowmanAdeptFocus 16827863 16827864 ife_X2WFLBow **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** 5310 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ADEPT_FOCUS 5 0 **** **** **** **** 0 0
|
||||
5310 BowmanSupremeFocus 16827865 16827866 ife_X2WFLBow **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SUPREME_FOCUS 5 0 **** **** **** **** 0 0
|
||||
5311 CrossbowSniper 16836399 16836400 ife_X2CritDHXB 1 **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** 92 93 **** **** **** **** **** **** **** FEAT_BLADE_MEDITATION **** **** **** **** **** **** **** 1
|
||||
5312 MasterWand 16836401 16836402 ife_X2CraftWand **** **** **** **** **** **** **** **** 946 **** 0 0 1 **** **** 3483 **** 0.5 -1 **** 1 **** **** **** **** **** 16 15 **** **** FEAT_SMITE_UNDEAD 6 **** **** **** **** **** 0 0
|
||||
5312 MasterWand 16836401 16836402 ife_X2CraftWand **** **** **** **** **** **** **** **** 946 **** 0 0 1 **** **** 3483 **** 0.5 -1 **** 1 **** **** **** **** **** 16 15 **** **** FEAT_MASTER_WAND 6 **** **** **** **** **** 1 0
|
||||
5313 RecklessWandWielder 16836403 16836404 ife_X2CraftWand **** **** **** **** **** **** **** **** 946 **** 0 0 1 **** **** 3484 **** 0.5 -1 **** 1 **** **** **** **** **** 19 1 **** **** FEAT_SMITE_UNDEAD 6 **** **** **** **** **** 0 0
|
||||
5314 WandMastery 16836405 16836406 ife_X2CraftWand **** **** **** **** **** **** **** **** 946 **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_HEX_SWIFT 5 0 **** **** **** **** 0 0
|
||||
5315 DoubleWandWielder 16836407 16836408 ife_X2CraftWand **** **** **** **** **** **** **** **** 946 41 0 0 1 **** **** 3485 **** 0.5 -1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 **** **** **** **** **** 0 0
|
||||
@@ -5350,18 +5350,18 @@
|
||||
5346 Font_Inspiration_8 16822324 16822316 ife_psitalent_8 **** **** **** 26 **** **** **** **** 5345 **** 0 0 1 **** **** **** 5347 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_PSIONIC_TALENT_8 6 **** **** **** **** **** 0 1
|
||||
5347 Font_Inspiration_9 16822360 16822316 ife_psitalent_9 **** **** **** 28 **** **** **** **** 5346 **** 0 0 1 **** **** **** 5348 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_PSIONIC_TALENT_9 6 **** **** **** **** **** 0 1
|
||||
5348 Font_Inspiration_10 16822361 16822316 ife_psitalent_10 **** **** **** 30 **** **** **** **** 5347 **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_PSIONIC_TALENT_10 6 **** **** **** **** **** 0 1
|
||||
5349 Factotum_Cunning_Insight_Attack 16822394 16822397 fot_magicaxe **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3895 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5350 Factotum_Cunning_Insight_Damage 16822395 16822397 fot_rage **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3896 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5351 Factotum_Cunning_Insight_Saves 16822396 16822397 fot_shield **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3897 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5352 Factotum_Cunning_Defense 16822398 16822399 fot_ironskins **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3898 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5353 Factotum_Cunning_Strike 16822400 16822401 fot_blackblade **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3899 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5354 Factotum_Cunning_Surge 16822402 16822403 fot_haste **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3900 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5355 Factotum_Cunning_Breach 16822404 16822405 fot_feeblemind **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3901 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5356 Factotum_Cunning_Dodge 16822406 16822453 fot_stoneflesh **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3902 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5357 Factotum_Cunning_Knowledge 16824532 16826316 fot_oracle **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3903 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5349 Factotum_Cunning_Insight_Attack 16822394 16822397 fot_magicaxe **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3895 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5350 Factotum_Cunning_Insight_Damage 16822395 16822397 fot_rage **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3896 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5351 Factotum_Cunning_Insight_Saves 16822396 16822397 fot_shield **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3897 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5352 Factotum_Cunning_Defense 16822398 16822399 fot_ironskins **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3898 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5353 Factotum_Cunning_Strike 16822400 16822401 fot_blackblade **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3899 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5354 Factotum_Cunning_Surge 16822402 16822403 fot_haste **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3900 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5355 Factotum_Cunning_Breach 16822404 16822405 fot_feeblemind **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3901 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5356 Factotum_Cunning_Dodge 16822406 16822453 fot_stoneflesh **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3902 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5357 Factotum_Cunning_Knowledge 16824532 16826316 fot_oracle **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3903 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5358 Factotum_Opportunistic_Piety_Heal 16826317 16826318 fot_regenerate **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3904 **** 1 10 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||
5359 Factotum_Opportunistic_Piety_Turn 16826319 16826320 fot_contundead **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3905 **** 1 10 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||
5360 FEAT_VOW_PURITY 16826325 16826326 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VOW_PURITY 6 **** **** **** **** **** 0 1
|
||||
5360 FEAT_VOW_PURITY 16826325 16826326 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_VOW_PURITY 6 **** **** **** **** **** 0 1
|
||||
5361 Sharess_Fascinate 16826327 16826934 ife_X1SDaze **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3907 **** 1 10 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||
5362 Sharess_Confuse 16826935 16826936 ife_X1HTym **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3908 **** 1 10 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||
5363 Sharess_Dominate 16826937 16826938 ife_X1HLHrt **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3909 **** 1 10 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||
@@ -5371,7 +5371,7 @@
|
||||
5367 VremyonniTraining 16789650 16789651 ife_sk_mast **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 **** **** **** **** **** 0 1
|
||||
5368 CultistShatteredPeak_SmiteMage 16789658 16789659 ife_X1ADAbj **** **** **** **** **** **** **** **** **** **** 0 0 **** **** **** 2339 **** 0.5 1 **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
5369 Forsaker_FastHealing 16824830 16847615 ife_divineheal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3913 **** 1 1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||
5370 AwesomeBlow 16833142 16833143 ife_wepspec_Bax **** 25 **** **** **** **** **** **** 2806 28 0 0 1 **** **** 2340 **** 0.5 -1 **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
5370 AwesomeBlow 16833142 16833143 ife_wepspec_Bax **** 25 **** **** **** **** **** **** 2806 28 0 0 1 22 1 2340 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SMITE_UNDEAD 6 1 **** **** **** **** 0 1
|
||||
5371 OversizedTWF 16790149 16790150 ife_twoweap **** 13 **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** **** **** 41 374 **** **** **** **** **** **** **** FEAT_OTWF 6 1 **** **** **** **** 0 1
|
||||
5372 FrostFolk_IceBlast 16790167 16790168 is_ConeCold **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3802 **** 1 -1 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||
5373 Uldra_RayFrost 894 6238 is_RayFrost **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3804 **** 1 3 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||
@@ -8194,7 +8194,7 @@
|
||||
8190 Crusader_BolsteringVoice 16837209 16830172 im_BolsterVoice **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 15993 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8191 Crusader_ClarionCall 16837210 16830174 im_ClarionCall **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 15994 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8192 Crusader_CoveringStrike 16837211 16830176 im_CoverStrike **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 15995 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8193 Crusader_DouseTheFlames 16837212 16830178 im_DouseTheFlames **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 15996 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8193 Crusader_DouseTheFlames 16837212 16830178 im_douse_flames **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 15996 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8194 Crusader_FlankingManeuver 16837213 16830180 im_FlankManeuver **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 15997 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8195 Crusader_LeadingTheAttack 16837214 16830182 im_LeadTheAttack **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 15998 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8196 Crusader_LeadingTheCharge 16837215 16830120 im_LeadTheCharge **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 15999 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
@@ -8402,7 +8402,7 @@
|
||||
8398 Swordsage_BolsteringVoice 16837420 16830172 im_BolsterVoice **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 16204 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8399 Swordsage_ClarionCall 16837421 16830174 im_ClarionCall **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 16205 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8400 Swordsage_CoveringStrike 16837422 16830176 im_CoverStrike **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 16206 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8401 Swordsage_DouseTheFlames 16837423 16830178 im_DouseTheFlames **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 16207 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8401 Swordsage_DouseTheFlames 16837423 16830178 im_douse_flames **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 16207 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8402 Swordsage_FlankingManeuver 16837424 16830180 im_FlankManeuver **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 16208 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8403 Swordsage_LeadingTheAttack 16837425 16830182 im_LeadTheAttack **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 16209 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8404 Swordsage_LeadingTheCharge 16837426 16830120 im_LeadTheCharge **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 16210 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
@@ -8610,7 +8610,7 @@
|
||||
8606 Warblade_BolsteringVoice 16837631 16830172 im_BolsterVoice **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 17637 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8607 Warblade_ClarionCall 16837632 16830174 im_ClarionCall **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 17638 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8608 Warblade_CoveringStrike 16837633 16830176 im_CoverStrike **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 17639 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8609 Warblade_DouseTheFlames 16837634 16830178 im_DouseTheFlames **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 17640 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8609 Warblade_DouseTheFlames 16837634 16830178 im_douse_flames **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 17640 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8610 Warblade_FlankingManeuver 16837635 16830180 im_FlankManeuver **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 17641 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8611 Warblade_LeadingTheAttack 16837636 16830182 im_LeadTheAttack **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 17642 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
8612 Warblade_LeadingTheCharge 16837637 16830120 im_LeadTheCharge **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 17643 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
@@ -10594,38 +10594,38 @@
|
||||
10590 Harper_Clairaudience_and_Clairvoyance 16831262 16826976 is_ClairAdVo **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4929 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10591 Harper_NONDETECTION 16831263 16829183 is_undet_align **** **** **** **** **** **** **** **** **** **** **** **** **** 13 **** 4930 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10592 Harper_UndetectableAlignment 16831264 16831997 is_undet_align **** **** **** **** **** **** **** **** **** **** **** **** **** 13 **** 4931 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10593 Assassin_ADDICTION 16831265 16829697 is_addiction **** **** **** **** **** **** **** **** **** **** **** **** **** 3 **** 4932 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10594 Assassin_ANGRY_ACHE 16831270 16829473 is_angry_ache **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 4937 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10595 Assassin_Blade_of_Blood 16831271 16826257 is_x2persblde **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 4938 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10596 Assassin_Disguise_Self_Radial_Master 16831274 16822661 is_Disguise **** **** **** **** **** **** **** **** **** **** **** **** **** 10 **** 4941 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10597 Assassin_Spell_Jump 16831280 16829170 is_jump **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4947 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10598 Assassin_Obscuring_Mist 16831281 16832076 is_X2CldBwld **** **** **** **** **** **** **** **** **** **** **** **** **** 6 **** 4948 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10599 Assassin_Sleep 16831282 6258 is_Sleep **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** 4949 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10600 Assassin_True_Strike 16831283 509 is_X1TruStr **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 4950 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10601 Assassin_Alter_Self_Radial_Master 16831284 16827969 is_PolySelf **** **** **** **** **** **** **** **** **** **** **** **** **** 10 **** 4951 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10602 Assassin_Cats_Grace 16831290 6109 is_CatGrace **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 4957 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10603 Assassin_Darkness 16831291 6132 is_Darkness **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4958 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10604 Assassin_Foxs_Cunning 16831292 6528 is_FoxCunng **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 4959 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10605 Assassin_IceKnife 16831293 16832232 is_shiver_tch **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 4960 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10606 Assassin_Invisibility 16831294 6187 is_Invisib **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 4961 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10607 Assassin_UndetectableAlignment 16831295 16831997 is_undet_align **** **** **** **** **** **** **** **** **** **** **** **** **** 13 **** 4962 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10608 Assassin_DeeperDarkness 16831296 16832054 is_Darkness **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4963 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10609 Assassin_DeepSlumber 16831297 16825813 is_sleep **** **** **** **** **** **** **** **** **** **** **** **** **** 11 **** 4964 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10610 Assassin_FalseLife 16831298 16825807 is_auravital **** **** **** **** **** **** **** **** **** **** **** **** **** 10 **** 4965 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10611 Assassin_Magic_Circle_against_Good 16831299 6494 is_CircGood **** **** **** **** **** **** **** **** **** **** **** **** **** 8 **** 4966 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10612 Assassin_MASOCHISM 16831300 16829695 is_masochism **** **** **** **** **** **** **** **** **** **** **** **** **** 10 **** 4967 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10613 Assassin_NONDETECTION 16831301 16829183 is_undet_align **** **** **** **** **** **** **** **** **** **** **** **** **** 13 **** 4968 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10614 Assassin_Clairaudience_and_Clairvoyance 16831302 16826976 is_ClairAdVo **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4969 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10615 Assassin_CursedBlade 16831303 16825823 is_x2blckblde **** **** **** **** **** **** **** **** **** **** **** **** **** 10 **** 4970 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10616 Assassin_DimensionDoor_RadialMaster 16831304 16825213 is_dimdoor **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4971 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10617 Assassin_FLESH_ARMOR 16831309 16829547 is_flesh_armor **** **** **** **** **** **** **** **** **** **** **** **** **** 10 **** 4976 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10618 Assassin_Freedom_of_Movement 16831310 6159 is_FreeMove **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 4977 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10619 Assassin_GLIBNESS 16831311 16828716 is_glibness **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4978 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10620 Assassin_HeartRipper 16831312 16832087 is_stop_hrt **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 4979 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10621 Assassin_Improved_Invisibility 16831313 6185 is_ImprInvis **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 4980 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10622 Assassin_LocateCreature 16831314 16826980 is_DomMon **** **** **** **** **** **** **** **** **** **** **** **** **** 6 **** 4981 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10623 Assassin_Poison 16831315 16826306 is_Poison **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 4982 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10624 Assassin_STOP_HEART 16831316 16829595 is_stop_hrt **** **** **** **** **** **** **** **** **** **** **** **** **** 3 **** 4983 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10593 SORCERER_REPAIR_MINOR_DAMAGE 16831276 16976379 is_CurMinW **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4940 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10594 SORCERER_REPAIR_LIGHT_DAMAGE 16831277 16976385 is_CurLgtW **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4941 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10595 SORCERER_REPAIR_MODERATE_DAMAGE 16831278 16976391 is_CurModW **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4942 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10596 SORCERER_REPAIR_SERIOUS_DAMAGE 16831279 16976397 is_CurSerW **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4943 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10597 SORCERER_REPAIR_CRITICAL_DAMAGE 16831280 16976403 is_CurCrWnds **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4944 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10598 SORCERER_SPIRIT_WORM 16831281 16990523 is_GhoulTch **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 4946 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10599 SORCERER_CHASING_PERFECTION 16831282 16990494 fot_strengthone **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 4947 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10600 SORCERER_FORCE_MISSILES 16831283 16990489 is_X1LesMis **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 4948 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
10601 SORCERER_ADRENALINE_SURGE 16831284 16976361 is_mbullstr **** **** **** **** **** **** **** **** **** **** **** **** **** 10 **** 4949 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10602 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10603 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10604 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10605 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10606 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10607 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10608 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10609 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10610 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10611 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10612 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10613 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10614 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10615 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10616 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10617 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10618 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10619 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10620 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10621 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10622 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10623 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10624 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
10625 Blackguard_Cure_Light_Wounds 16831317 6128 is_CurLgtW **** **** **** **** **** **** **** **** **** **** **** **** **** 5 **** 4984 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10626 Blackguard_Empowered_Cure_Light_Wounds 16831318 6128 is_CurLgtW **** **** **** **** **** **** **** **** **** **** **** **** **** 5 **** 4985 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
10627 Blackguard_Maximized_Cure_Light_Wounds 16831319 6128 is_CurLgtW **** **** **** **** **** **** **** **** **** **** **** **** **** 5 **** 4986 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
@@ -13248,7 +13248,7 @@
|
||||
13244 DreadNecromancer_Necrotic_Termination 16841609 16829213 is_Nec_Term **** **** **** **** **** **** **** **** **** **** **** **** **** 3 **** 7973 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
13245 DreadNecromancer_PlagueOfUndead 16841610 16847585 is_AnimDead **** **** **** **** **** **** **** **** **** **** **** **** **** 15 **** 7974 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
13246 DreadNecromancer_Wail_of_the_Banshee 16841611 6521 is_WailBansh **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** 7975 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
13247 ****_Cure_Minor_Wounds 16841612 16827032 is_CurMinW **** **** **** **** **** **** **** **** **** **** **** **** **** 5 **** 7976 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
13247 DreadNecromancer_Spirit_Worm 16841612 is_GhoulTch is_GhoulTch **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 7976 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
13248 ****_Inflict_Minor_Wounds 16841613 1570 is_X1InfMin **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 7977 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** **** **** **** **** 0
|
||||
13249 ****_Light 16841614 6197 is_Light **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 7978 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
13250 ****_Read_Magic 16841615 16789529 is_ReadMagic **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 7979 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
@@ -17062,16 +17062,16 @@
|
||||
17058 Favoured_Soul_True_Resurrection 16846323 16828345 is_Resurrec **** **** **** **** **** **** **** **** **** **** **** **** **** 7 **** 12687 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17059 Favoured_Soul_Undeaths_Eternal_Foe 16846324 2372 is_X1UndFoe **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12688 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17060 Favoured_Soul_VileDeath 16846325 16847583 is_SlayLive **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 12689 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17061 Sohei_Bane 16846326 2664 is_X1Bane **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12690 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17062 Sohei_Exteneded_Bane 16846327 2664 is_X1Bane **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12691 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17063 Sohei_Silent_Bane 16846328 2664 is_X1Bane **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12692 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17064 Sohei_Still_Bane 16846329 2664 is_X1Bane **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12693 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17065 Sohei_Bless 16846330 6102 is_Bless **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12694 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17066 Sohei_Exteneded_Bless 16846331 6102 is_Bless **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12695 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17067 Sohei_Silent_Bless 16846332 6102 is_Bless **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12696 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17068 Sohei_Still_Bless 16846333 6102 is_Bless **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12697 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17069 Sohei_Bless_Weapon 16846334 3754 is_X2BlssWeap **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12698 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17070 Sohei_Exteneded_Bless_Weapon 16846335 3754 is_X2BlssWeap **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12699 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17061 Favoured_Soul_DetectMagic 16846326 16836771 is_detect_law **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 12690 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17062 Favoured_Soul_Desecrate 16846327 16838055 is_PrEvil **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 12691 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17063 Favoured_Soul_Enthrall 16846328 16835171 is_Sleep **** **** **** **** **** **** **** **** **** **** **** **** **** 1 **** 12692 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17064 Favoured_Soul_SPIRITUAL_WEAPON 16846329 16990526 is_X2PersBlde **** **** **** **** **** **** **** **** **** **** **** **** **** 15 **** 12693 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17065 Favoured_Soul_REGEN_LIGHT_WOUNDS 16846330 16990498 is_CurLgtW **** **** **** **** **** **** **** **** **** **** **** **** **** 5 **** 12694 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17066 Favoured_Soul_REGEN_MODERATE_WOUNDS 16846331 16990503 is_CurModW **** **** **** **** **** **** **** **** **** **** **** **** **** 5 **** 12695 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17067 Favoured_Soul_REGEN_SERIOUS_WOUNDS 16846332 16990508 is_CurSerW **** **** **** **** **** **** **** **** **** **** **** **** **** 5 **** 12696 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17068 Favoured_Soul_REGEN_CRITICAL_WOUNDS 16846333 16990513 is_CurCrWnds **** **** **** **** **** **** **** **** **** **** **** **** **** 5 **** 12697 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17069 Favoured_Soul_Hallow 16846334 16838045 is_CircEvil **** **** **** **** **** **** **** **** **** **** **** **** **** 8 **** 12698 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17070 Favoured_Soul_SPELL_CHASING_PERFECTION 16846335 16990494 fot_strengthone **** **** **** **** **** **** **** **** **** **** **** **** **** 7 **** 12699 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17071 Sohei_Silent_Bless_Weapon 16846336 3754 is_X2BlssWeap **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12700 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17072 Sohei_Still_Bless_Weapon 16846337 3754 is_X2BlssWeap **** **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 12701 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
17073 Sohei_Detect_Chaos 16846338 16831995 is_detect_chaos **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 12702 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** 0
|
||||
@@ -22701,7 +22701,7 @@
|
||||
22697 HalfDragonObscureSong 16838708 16838709 dradis_brass **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
22698 HalfDragonObscureStyx 16838710 16838711 dradis_blue **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
22699 HalfDragonObscureTarterian 16838712 16838713 dradis_crystal **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
22700 ArchlichMarker 16790395 16790396 ife_X2SpAniDed **** **** **** **** **** **** **** **** **** **** 0 0 0 5 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_TEMPLATE_ARCHLICH_MARKER 5 0 **** **** **** **** **** 1
|
||||
22700 ArchlichMarker 16790405 16790406 ife_X2SpAniDed **** **** **** **** **** **** **** **** **** **** 0 0 0 5 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_TEMPLATE_ARCHLICH_MARKER 5 0 **** **** **** **** 0 1
|
||||
22701 ArchlichTurnUndead 428 6085 ife_turn **** **** **** **** **** **** **** **** **** **** 0 0 0 **** 1 16381 **** 0.5 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_TEMPLATE_ARCHLICH_TURN_UNDEAD 6 **** **** **** **** **** 0 0
|
||||
22702 Saint_Bless 756 6102 is_Bless **** **** **** **** **** **** **** **** **** **** 0 0 0 9 **** 16382 **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_TEMPLATE_SAINT_SLA_BLESS 5 0 **** **** **** **** 0 0
|
||||
22703 Saint_Guidance_Placeholder **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0
|
||||
@@ -22709,7 +22709,7 @@
|
||||
22705 Saint_Virtue 939 6520 is_Virtue **** **** **** **** **** **** **** **** **** **** 0 0 0 9 **** 16385 **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_TEMPLATE_SAINT_SLA_VIRTUE 5 0 **** **** **** **** 0 0
|
||||
22706 Saint_Protective_Aura 16790401 16790402 ife_holyaura **** **** **** **** **** **** **** **** **** **** 0 0 0 9 **** 16386 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_TEMPLATE_SAINT_PROTECTIVE_AURA 5 0 **** **** **** **** 0 0
|
||||
22707 Saint_Holy_Power 16790403 16790404 ife_holyaura **** **** **** **** **** **** **** **** **** **** 0 0 0 9 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_TEMPLATE_SAINT_HOLY_POWER 5 0 **** **** **** **** 0 1
|
||||
22708 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
22708 Baelnorn_Marker 16793769 16793770 ife_X2SpAniDed **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_TEMPLATE_BAELNORN_MARKER 5 0 **** **** **** **** 0 1
|
||||
22709 **WeaponsOfLegacy** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
22710 BBB_Darkvision 16836478 16836479 is_DarkVis **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 16390 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HOUND_TELEPORT 5 0 **** **** **** **** 0 0
|
||||
22711 BBB_Longstrider 16836480 16836481 is_longstrider **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 16391 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HOUND_TELEPORT 5 0 **** **** **** **** 0 0
|
||||
@@ -24002,7 +24002,7 @@
|
||||
23998 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
23999 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 1
|
||||
24000 SkillFocusAlchemy 16847243 424 ife_X2BrewPotion **** **** **** **** **** **** **** **** **** **** **** 1 1 4 **** **** **** **** **** 4 **** **** **** **** **** **** **** **** **** **** FEAT_SKILL_FOCUS_ALCHEMY **** 0 **** **** **** **** **** 1
|
||||
24001 EpicSkillFocusAlchemy 16847245 4063 ife_X2BrewPotion **** **** **** **** **** **** **** **** **** **** **** 1 1 15 **** **** **** **** **** **** **** **** **** **** **** **** 34 20 **** **** FEAT_EPIC_SKILL_FOCUS_ALCHEMY **** 0 **** **** **** **** 1 1
|
||||
24001 EpicSkillFocusAlchemy 16847245 4063 ife_X2BrewPotion **** **** **** **** **** **** **** **** **** **** **** 1 1 15 **** **** **** **** **** 15 **** **** **** **** **** **** 34 20 **** **** FEAT_EPIC_SKILL_FOCUS_ALCHEMY **** 0 **** **** **** **** 1 1
|
||||
24002 MagicalArtisanMagicArmsAndArmor 16847247 16847257 ife_crftarmarmor **** **** **** **** **** **** **** **** 2926 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_MAGICAL_ARTISAN_CRAFT_MAGIC_ARMS **** 0 **** **** **** **** **** 1
|
||||
24003 MagicalArtisanCraftRod 16847248 16847257 ife_craft_rod **** **** **** **** **** **** **** **** 2927 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_MAGICAL_ARTISAN_CRAFT_ROD **** 0 **** **** **** **** **** 1
|
||||
24004 MagicalArtisanCraftStaff 16847249 16847257 ife_craft_staff **** **** **** **** **** **** **** **** 2928 **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_MAGICAL_ARTISAN_CRAFT_STAFF **** 0 **** **** **** **** **** 1
|
||||
@@ -24635,8 +24635,8 @@
|
||||
24631 FEAT_WEAPON_SPECIALIZATION_SAP 16834165 444 ife_wepspec_sap 4 **** **** **** **** **** **** **** 24607 24423 0 0 0 **** **** **** **** 1 **** 2 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_SPECIALIZATION_SAP 1 **** **** **** **** **** 0 1
|
||||
24632 FEAT_WEAPON_SPECIALIZATION_KATAR 16834174 444 ife_wepspec_ktr 4 **** **** **** **** **** **** **** 24608 24423 0 0 0 **** **** **** **** 1 **** 2 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_SPECIALIZATION_KATAR 1 **** **** **** **** **** 0 1
|
||||
24633 FEAT_WEAPON_SPECIALIZATION_HEAVY_MACE 16834183 444 ife_wepspec_hmc 4 **** **** **** **** **** **** **** 24609 24423 0 0 0 **** **** **** **** 1 **** 2 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_SPECIALIZATION_HAEVY_MACE 1 **** **** **** **** **** 0 1
|
||||
24634 FEAT_WEAPON_SPECIALIZATION_DBL_SCIMITAR 16834192 444 ife_wepspec_mau 4 **** **** **** **** **** **** **** 24610 24423 0 0 0 **** **** **** **** 1 **** 2 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_SPECIALIZATION_DBL_SCIMITAR 1 **** **** **** **** **** 0 1
|
||||
24635 FEAT_WEAPON_SPECIALIZATION_LIGHT_LANCE 16834201 444 ife_wepspec_dsc 4 **** **** **** **** **** **** **** 24611 24423 0 0 0 **** **** **** **** 1 **** 2 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_SPECIALIZATION_LIGHT_LANCE 1 **** **** **** **** **** 0 1
|
||||
24634 FEAT_WEAPON_SPECIALIZATION_MAUL 16834192 444 ife_wepspec_mau 4 **** **** **** **** **** **** **** 24610 24423 0 0 0 **** **** **** **** 1 **** 2 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_SPECIALIZATION_DBL_SCIMITAR 1 **** **** **** **** **** 0 1
|
||||
24635 FEAT_WEAPON_SPECIALIZATION_DBL_SCIMITAR 16834201 444 ife_wepspec_dsc 4 **** **** **** **** **** **** **** 24611 24423 0 0 0 **** **** **** **** 1 **** 2 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_SPECIALIZATION_LIGHT_LANCE 1 **** **** **** **** **** 0 1
|
||||
24636 FEAT_WEAPON_SPECIALIZATION_GOAD 16834210 444 ife_wepspec_goa 4 **** **** **** **** **** **** **** 24612 24423 0 0 0 **** **** **** **** 1 **** 2 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_SPECIALIZATION_GOAD 1 **** **** **** **** **** 0 1
|
||||
24637 FEAT_EPIC_WEAPON_SPECIALIZATION_LIGHT_LANCE 16834112 8456 ife_ews_lnc **** **** **** **** **** **** **** **** 24625 24613 0 0 0 **** **** **** **** 0.5 **** 11 **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_SPECIALIZATION_LIGHT_LANCE 1 **** **** **** **** **** 1 1
|
||||
24638 FEAT_EPIC_WEAPON_SPECIALIZATION_HEAVY_PICK 16834121 8456 ife_ews_hpck **** **** **** **** **** **** **** **** 24626 24614 0 0 0 **** **** **** **** 0.5 **** 11 **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_SPECIALIZATION_HEAVY_PICK 1 **** **** **** **** **** 1 1
|
||||
@@ -25601,47 +25601,47 @@
|
||||
25597 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25598 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25599 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25600 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25601 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25602 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25603 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25604 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25605 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25606 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25607 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25608 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25609 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25610 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25611 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25612 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25613 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25614 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25615 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25616 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25617 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25618 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25619 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25620 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25621 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25622 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25623 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25624 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25625 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25626 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25627 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25628 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25629 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25630 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25631 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25632 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25633 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25634 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25635 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25636 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25637 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25638 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25639 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25640 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25600 FEAT_EPIC_LION_OF_TALISID 16855221 16855222 ife_x2epdruid **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_LION_OF_TALISID 6 **** **** **** **** **** 1 0
|
||||
25601 FEAT_LION_OF_TALISID_SPELLCASTING_ARCHIVIST 16855223 16855236 IR_ARCHIVIST **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_ARCHIVIST 6 0 1 190 **** **** 0 0
|
||||
25602 FEAT_LION_OF_TALISID_SPELLCASTING_CLERIC 16855224 16855236 IR_CLERIC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_CLERIC 6 0 1 2 **** **** 0 0
|
||||
25603 FEAT_LION_OF_TALISID_SPELLCASTING_DRUID 16855225 16855236 IR_DRUID **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_DRUID 6 0 1 3 **** **** 0 0
|
||||
25604 FEAT_LION_OF_TALISID_SPELLCASTING_FAVOURED_SOUL 16855226 16855236 IR_SPELLFIRE **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_FAVOURED_SOUL 6 0 1 225 **** **** 0 0
|
||||
25605 FEAT_LION_OF_TALISID_SPELLCASTING_HEALER 16855227 16855236 IR_CBTMEDIC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_HEALER 6 0 1 64 **** **** 0 0
|
||||
25606 FEAT_LION_OF_TALISID_SPELLCASTING_JOWAW 16855228 16855236 IR_RANGER **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_JOWAW 6 0 1 157 **** **** 0 0
|
||||
25607 FEAT_LION_OF_TALISID_SPELLCASTING_KOTMC 16855229 16855236 IR_KOTMC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_KOTMC 6 0 1 167 **** **** 0 0
|
||||
25608 FEAT_LION_OF_TALISID_SPELLCASTING_NENTYAR_HUNTER 16855230 16855236 IR_RANGER **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_NENTYAR_HUNTER 6 0 1 246 **** **** 0 0
|
||||
25609 FEAT_LION_OF_TALISID_SPELLCASTING_RANGER 16855231 16855236 IR_RANGER **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_RANGER 6 0 1 7 **** **** 0 0
|
||||
25610 FEAT_LION_OF_TALISID_SPELLCASTING_OASHAMAN 16855232 16855236 IR_CLERIC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_OASHAMAN 6 0 1 207 **** **** 0 0
|
||||
25611 FEAT_LION_OF_TALISID_SPELLCASTING_SOHEI 16855233 16855236 IR_CLERIC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_SOHEI 6 0 1 233 **** **** 0 0
|
||||
25612 FEAT_LION_OF_TALISID_SPELLCASTING_SOL 16855234 16855236 IR_PALADIN **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_SOL 6 0 1 118 **** **** 0 0
|
||||
25613 FEAT_LION_OF_TALISID_SPELLCASTING_SPSHAMAN 16855235 16855236 IR_CLERIC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_LION_OF_TALISID_SPELLCASTING_SPSHAMAN 6 0 99 172 **** **** 0 0
|
||||
25614 FEAT_LOT_LIONS_COURAGE 16855237 16855238 ife_fearless **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.2 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_LOT_LIONS_COURAGE 6 **** **** **** **** **** 0 1
|
||||
25615 FEAT_LOT_LIONS_POUNCE 16855239 16855240 ife_X2GWShp3 **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_LOT_LIONS_POUNCE 5 **** **** **** **** **** 0 1
|
||||
25616 FEAT_LOT_LIONS_SWIFTNESS 16855241 16855242 ife_X2BldSpd **** **** **** **** **** **** **** **** **** **** 0 0 0 10 **** 17994 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_LOT_LIONS_SWIFTNESS 6 **** **** **** **** **** 0 0
|
||||
25617 FEAT_LOT_LEONALS_ROAR 16855243 16855244 ife_shout **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 17993 **** 1 3 **** 1 **** **** **** **** **** **** **** **** **** FEAT_LOT_LEONALS_ROAR 4 **** **** **** **** **** 0 1
|
||||
25618 FEAT_EPIC_VERDANT_LORD 16855251 16855252 ife_x2epdruid **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_VERDANT_LORD 6 **** **** **** **** **** 1 0
|
||||
25619 FEAT_VERDANT_LORD_SPELLCASTING_ARCHIVIST 16855253 16855268 IR_ARCHIVIST **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_ARCHIVIST 6 0 1 190 **** **** 0 0
|
||||
25620 FEAT_VERDANT_LORD_SPELLCASTING_CLERIC 16855254 16855268 IR_CLERIC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_CLERIC 6 0 1 2 **** **** 0 0
|
||||
25621 FEAT_VERDANT_LORD_SPELLCASTING_DRUID 16855255 16855268 IR_DRUID **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_DRUID 6 0 1 3 **** **** 0 0
|
||||
25622 FEAT_VERDANT_LORD_SPELLCASTING_FAVOURED_SOUL 16855256 16855268 IR_SPELLFIRE **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_FAVOURED_SOUL 6 0 1 225 **** **** 0 0
|
||||
25623 FEAT_VERDANT_LORD_SPELLCASTING_HEALER 16855257 16855268 IR_CBTMEDIC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_HEALER 6 0 1 64 **** **** 0 0
|
||||
25624 FEAT_VERDANT_LORD_SPELLCASTING_JOWAW 16855258 16855268 IR_RANGER **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_JOWAW 6 0 1 157 **** **** 0 0
|
||||
25625 FEAT_VERDANT_LORD_SPELLCASTING_KOTC 16855259 16855268 IR_CHALICE **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_KOTC 6 0 1 83 **** **** 0 0
|
||||
25626 FEAT_VERDANT_LORD_SPELLCASTING_KOTMC 16855260 16855268 IR_KOTMC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_KOTMC 6 0 1 167 **** **** 0 0
|
||||
25627 FEAT_VERDANT_LORD_SPELLCASTING_NENTYAR_HUNTER 16855261 16855268 IR_RANGER **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_NENTYAR_HUNTER 6 0 1 246 **** **** 0 0
|
||||
25628 FEAT_VERDANT_LORD_SPELLCASTING_PALADIN 16855262 16855268 IR_PALADIN **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_PALADIN 6 0 1 6 **** **** 0 0
|
||||
25629 FEAT_VERDANT_LORD_SPELLCASTING_RANGER 16855263 16855268 IR_RANGER **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_RANGER 6 0 1 7 **** **** 0 0
|
||||
25630 FEAT_VERDANT_LORD_SPELLCASTING_OASHAMAN 16855264 16855268 IR_CLERIC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_OASHAMAN 6 0 1 207 **** **** 0 0
|
||||
25631 FEAT_VERDANT_LORD_SPELLCASTING_SOHEI 16855265 16855268 IR_CLERIC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_SOHEI 6 0 1 233 **** **** 0 0
|
||||
25632 FEAT_VERDANT_LORD_SPELLCASTING_SOL 16855266 16855268 IR_PALADIN **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_SOL 6 0 1 118 **** **** 0 0
|
||||
25633 FEAT_VERDANT_LORD_SPELLCASTING_SPSHAMAN 16855267 16855268 IR_CLERIC **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** 125 **** **** **** **** **** **** **** **** **** **** FEAT_VERDANT_LORD_SPELLCASTING_SPSHAMAN 6 0 99 172 **** **** 0 0
|
||||
25634 FEAT_VL_EXPERT_INFUSION 16855269 16855270 ife_X2BrewPotion **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VL_EXPERT_INFUSION 6 0 **** **** **** **** 0 0
|
||||
25635 FEAT_VL_SUN_SUSTENANCE 16855271 16855272 ife_sunsust **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VL_SUN_SUSTENANCE 6 0 **** **** **** **** 0 0
|
||||
25636 FEAT_VL_SPONTANEITY 16855273 16855274 IR_DRUID **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VL_SPONTANEITY 6 0 **** **** **** **** 0 0
|
||||
25637 FEAT_VL_PLANT_FACILITY 16855275 16855276 IR_DRUID **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VL_PLANT_FACILITY 6 0 **** **** **** **** 0 0
|
||||
25638 FEAT_VL_WILD_SHAPE_TREANT 16855277 16855278 is_treeshape **** **** **** **** **** **** **** **** **** **** 0 0 0 10 1 17989 **** 0.5 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_VL_WILD_SHAPE_TREANT 6 0 **** **** **** **** 0 1
|
||||
25639 FEAT_VL_ANIMATE_TREE 16855279 16855280 is_treeshape **** **** **** **** **** **** **** **** **** **** 0 0 0 15 1 17990 **** 0.5 1 **** **** **** **** **** **** **** **** **** **** **** FEAT_VL_ANIMATE_TREE 6 0 **** **** **** **** 0 1
|
||||
25640 FEAT_VL_GAEAS_EMBRACE 16855281 16855282 IR_DRUID **** **** **** **** **** **** **** **** **** **** 0 0 0 **** 1 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VL_GAEAS_EMBRACE 6 0 **** **** **** **** 0 0
|
||||
25641 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25642 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25643 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -25901,53 +25901,53 @@
|
||||
25897 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25898 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25899 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25900 "## START PRC8 HIDDEN TALENT FEATS ##" **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25901 FEAT_HIDDEN_TALENT_BIOFEEDBACK 16990419 16823714 fot_protmagweap 999 **** **** **** **** **** 11 **** **** **** 0 0 1 12 **** 14479 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_BIOFEEDBACK 6 0 **** **** 1 **** 0 0
|
||||
25902 FEAT_HIDDEN_TALENT_BITE_WOLF 16990420 16824105 fot_bitewolf 999 **** **** **** **** **** 11 **** **** **** 0 0 1 10 **** 14421 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_BITE_WOLF 6 0 **** **** 1 **** 0 0
|
||||
25903 FEAT_HIDDEN_TALENT_BOLT 16990421 16823684 fot_minorseq 999 **** **** **** **** **** 11 **** **** **** 0 0 1 12 **** 14422 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_BOLT 6 0 **** **** 1 **** 0 0
|
||||
25904 FEAT_HIDDEN_TALENT_BURST 16990422 16823921 fot_exped 999 **** **** **** **** **** 11 **** **** **** 0 0 1 10 **** 14423 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_BURST 6 0 **** **** 1 **** 0 0
|
||||
25905 FEAT_HIDDEN_TALENT_CALLTOMIND 16990423 16823630 fot_knowalign 999 **** **** **** **** **** 11 **** **** **** 0 0 1 **** **** 14424 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CALLTOMIND 6 0 **** **** 1 **** 0 0
|
||||
25906 FEAT_HIDDEN_TALENT_CALL_WEAPONRY 16990424 16824111 fot_seeksword 999 **** **** **** **** **** 11 **** **** **** 0 0 1 9 **** 14425 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CALL_WEAPONRY 6 0 **** **** 1 **** 0 0
|
||||
25907 FEAT_HIDDEN_TALENT_CHAMELEON 16990425 16823642 fot_chameleon 999 **** **** **** **** **** 11 **** **** **** 0 0 1 10 **** 14482 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CHAMELEON 6 0 **** **** 1 **** 0 0
|
||||
25908 FEAT_HIDDEN_TALENT_CLAWS_BEAST 16990426 16824107 fot_clawbeast 999 **** **** **** **** **** 11 **** **** **** 0 0 1 10 **** 14427 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CLAWS_BEAST 6 0 **** **** 1 **** 0 0
|
||||
25909 FEAT_HIDDEN_TALENT_COMPRESSION 16990427 16824120 fot_compress 999 **** **** **** **** **** 11 **** **** **** 0 0 1 9 **** 14428 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_COMPRESSION 6 0 **** **** 1 **** 0 0
|
||||
25910 FEAT_HIDDEN_TALENT_CONCEALTHOUGHT 16990428 16823759 fot_nondetect 999 **** **** **** **** **** 11 **** **** **** 0 0 1 7 **** 14429 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CONCEALTHOUGHT 6 0 **** **** 1 **** 0 0
|
||||
25911 FEAT_HIDDEN_TALENT_CREATESOUND 16990429 16823869 fot_vocal 999 **** **** **** **** **** 11 **** **** **** 0 0 1 11 **** 14431 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CREATESOUND 6 1 **** **** 1 **** 0 0
|
||||
25912 FEAT_HIDDEN_TALENT_CRYSTALSHARD 16990430 16823632 fot_icestorm 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14432 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CRYSTALSHARD 6 1 **** **** 1 **** 0 0
|
||||
25913 FEAT_HIDDEN_TALENT_DAZE 16990431 16823650 fot_invisstalk 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14433 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DAZE 6 1 **** **** 1 **** 0 0
|
||||
25914 FEAT_HIDDEN_TALENT_DECELERATION 16990432 16823652 fot_Slow 999 **** **** **** **** **** 11 **** **** **** 0 0 1 1 **** 14434 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DECELERATION 6 1 **** **** 1 **** 0 0
|
||||
25915 FEAT_HIDDEN_TALENT_DEFPRECOG 16990433 16823708 fot_shield 999 **** **** **** **** **** 11 **** **** **** 0 0 1 13 **** 14435 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DEFPRECOG 6 0 **** **** 1 **** 0 0
|
||||
25916 FEAT_HIDDEN_TALENT_DEMORALIZE 16990434 16823686 fot_lowerres 999 **** **** **** **** **** 11 **** **** **** 0 0 1 8 **** 14436 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DEMORALIZE 6 0 **** **** 1 **** 0 0
|
||||
25917 FEAT_HIDDEN_TALENT_DISABLE 16990435 16823688 fot_enfeeble 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14438 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DISABLE 6 1 **** **** 1 **** 0 0
|
||||
25918 FEAT_HIDDEN_TALENT_DISSIPATINGTOUCH 16990436 16823656 fot_chilltouch 999 **** **** **** **** **** 11 **** **** **** 0 0 1 3 **** 14439 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DISSIPATINGTOUCH 6 1 **** **** 1 **** 0 0
|
||||
25919 FEAT_HIDDEN_TALENT_DISTRACT 16990437 16823690 fot_powerblind 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14440 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DISTRACT 6 1 **** **** 1 **** 0 0
|
||||
25920 FEAT_HIDDEN_TALENT_ELF_SIGHT 16990438 16823720 fot_infravis 999 **** **** **** **** **** 11 **** **** **** 0 0 1 10 **** 14370 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_ELF_SIGHT 6 0 **** **** 1 **** 0 0
|
||||
25921 FEAT_HIDDEN_TALENT_EMPATHY 16990439 16823761 fot_friends 999 **** **** **** **** **** 11 **** **** **** 0 0 1 **** **** 14441 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_EMPATHY 6 0 **** **** 1 **** 0 0
|
||||
25922 FEAT_HIDDEN_TALENT_EMPTYMIND 16990440 16823692 fot_detillusion 999 **** **** **** **** **** 11 **** **** **** 0 0 1 9 **** 14442 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_EMPTYMIND 6 0 **** **** 1 **** 0 0
|
||||
25923 FEAT_HIDDEN_TALENT_ENERGYRAY 16990441 16823694 fot_flamearrow 999 **** **** **** **** **** 11 **** **** **** 0 0 1 **** **** 14443 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_ENERGYRAY 6 1 **** **** 1 **** 0 0
|
||||
25924 FEAT_HIDDEN_TALENT_ENTANGLE 16990442 16823700 fot_entangle 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14448 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_ENTANGLE 6 1 **** **** 1 **** 0 0
|
||||
25925 FEAT_HIDDEN_TALENT_EXPANSION 16990443 16824128 fot_strength 999 **** **** **** **** **** 11 **** **** **** 0 0 1 9 **** 14449 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_EXPANSION 6 0 **** **** 1 **** 0 0
|
||||
25926 FEAT_HIDDEN_TALENT_FARHAND 16990444 16823763 fot_magicshort 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14450 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_FARHAND 6 0 **** **** 1 **** 0 0
|
||||
25927 FEAT_HIDDEN_TALENT_FORCESCREEN 16990445 16823658 fot_polyself 999 **** **** **** **** **** 11 **** **** **** 0 0 1 13 **** 14451 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_FORCESCREEN 6 0 **** **** 1 **** 0 0
|
||||
25928 FEAT_HIDDEN_TALENT_GREASE 16990446 16823702 fot_Grease 999 **** **** **** **** **** 11 **** **** **** 0 0 1 11 **** 14452 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_GREASE 6 1 **** **** 1 **** 0 0
|
||||
25929 FEAT_HIDDEN_TALENT_HAMMER 16990447 16823704 fot_hammer 999 **** **** **** **** **** 11 **** **** **** 0 0 1 10 **** 14453 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_HAMMER 6 1 **** **** 1 **** 0 0
|
||||
25930 FEAT_HIDDEN_TALENT_INERTIALARMOUR 16990448 16823660 fot_armor 999 **** **** **** **** **** 11 **** **** **** 0 0 1 9 **** 14454 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_INERTIALARMOUR 6 0 **** **** 1 **** 0 0
|
||||
25931 FEAT_HIDDEN_TALENT_MATTERAGITATION 16990449 16823765 fot_elementfire 999 **** **** **** **** **** 11 **** **** **** 0 0 1 3 **** 14455 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_MATTERAGITATION 6 1 **** **** 1 **** 0 0
|
||||
25932 FEAT_HIDDEN_TALENT_METAPHYSICAL_CLAW 16990450 16824134 fot_metaclaw 999 **** **** **** **** **** 11 **** **** **** 0 0 1 9 **** 14456 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_METAPHYSICAL_CLAW 6 0 **** **** 1 **** 0 0
|
||||
25933 FEAT_HIDDEN_TALENT_METAPHYSICAL_WEAPON 16990451 16824136 fot_protnormal 999 **** **** **** **** **** 11 **** **** **** 0 0 1 9 **** 14457 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_METAPHYSICAL_WEAPON 6 0 **** **** 1 **** 0 0
|
||||
25934 FEAT_HIDDEN_TALENT_MINDTHRUST 16990452 16823615 fot_skulltrap 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14458 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_MINDTHRUST 6 1 **** **** 1 **** 0 0
|
||||
25935 FEAT_HIDDEN_TALENT_MYLIGHT 16990453 16823706 fot_dawn 999 **** **** **** **** **** 11 **** **** **** 0 0 1 **** **** 14459 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_MYLIGHT 6 0 **** **** 1 **** 0 0
|
||||
25936 FEAT_HIDDEN_TALENT_OFFPRECOG 16990454 16823710 fot_snare 999 **** **** **** **** **** 11 **** **** **** 0 0 1 9 **** 14460 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_OFFPRECOG 6 0 **** **** 1 **** 0 0
|
||||
25937 FEAT_HIDDEN_TALENT_OFFPRESC 16990455 16823712 fot_sols 999 **** **** **** **** **** 11 **** **** **** 0 0 1 9 **** 14461 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_OFFPRESC 6 0 **** **** 1 **** 0 0
|
||||
25938 FEAT_HIDDEN_TALENT_PREVENOM 16990456 16824142 fot_grmalison 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14468 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_PREVENOM 6 0 **** **** 1 **** 0 0
|
||||
25939 FEAT_HIDDEN_TALENT_PREVENOM_WEAPON 16990457 16824144 fot_prevnmw 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14469 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_PREVENOM_WEAPON 6 0 **** **** 1 **** 0 0
|
||||
25940 FEAT_HIDDEN_TALENT_SKATE 16990458 16823767 fot_haste 999 **** **** **** **** **** 11 **** **** **** 0 0 1 10 **** 14470 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_SKATE 6 0 **** **** 1 **** 0 0
|
||||
25941 FEAT_HIDDEN_TALENT_STOMP 16990459 16823682 fot_stomp 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14471 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_STOMP 6 1 **** **** 1 **** 0 0
|
||||
25942 FEAT_HIDDEN_TALENT_SYNESTHETE 16990460 16823755 fot_physmirror 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14472 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_SYNESTHETE 6 0 **** **** 1 **** 0 0
|
||||
25943 FEAT_HIDDEN_TALENT_TELEMPATHICPRO 16990461 16823769 fot_charmanim 999 **** **** **** **** **** 11 **** **** **** 0 0 1 2 **** 14473 **** **** **** 120 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_TELEMPATHICPRO 6 0 **** **** 1 **** 0 0
|
||||
25944 FEAT_HIDDEN_TALENT_THICKSKIN 16990462 16823670 fot_barkskin 999 **** **** **** **** **** 11 **** **** **** 0 0 1 13 **** 14474 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_THICKSKIN 6 0 **** **** 1 **** 0 0
|
||||
25945 FEAT_HIDDEN_TALENT_VIGOR 16990463 16823672 fot_horror 999 **** **** **** **** **** 11 **** **** **** 0 0 1 9 **** 14475 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_VIGOR 6 0 **** **** 1 **** 0 0
|
||||
25946 FEAT_HIDDEN_TALENT_GRIP_IRON 16990464 16790301 fot_metaclaw 999 **** **** **** **** **** 11 **** **** **** 0 0 1 10 **** 15686 **** **** **** 120 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_GRIP_IRON 6 0 **** **** 1 **** 0 0
|
||||
25900 FEAT_HIDDEN_TALENT 16990417 16990418 ife_psifeats **** **** **** **** **** **** 11 **** **** **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT 6 0 **** **** 1 **** 0 1
|
||||
25901 FEAT_HIDDEN_TALENT_BIOFEEDBACK 16990419 16823714 fot_protmagweap 999 **** **** **** **** **** 11 **** **** **** 0 0 0 12 **** 14479 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_BIOFEEDBACK 6 0 **** **** **** **** 0 0
|
||||
25902 FEAT_HIDDEN_TALENT_BITE_WOLF 16990420 16824105 fot_bitewolf 999 **** **** **** **** **** 11 **** **** **** 0 0 0 10 **** 14421 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_BITE_WOLF 6 0 **** **** **** **** 0 0
|
||||
25903 FEAT_HIDDEN_TALENT_BOLT 16990421 16823684 fot_minorseq 999 **** **** **** **** **** 11 **** **** **** 0 0 0 12 **** 14422 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_BOLT 6 0 **** **** **** **** 0 0
|
||||
25904 FEAT_HIDDEN_TALENT_BURST 16990422 16823921 fot_exped 999 **** **** **** **** **** 11 **** **** **** 0 0 0 10 **** 14423 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_BURST 6 0 **** **** **** **** 0 0
|
||||
25905 FEAT_HIDDEN_TALENT_CALLTOMIND 16990423 16823630 fot_knowalign 999 **** **** **** **** **** 11 **** **** **** 0 0 0 **** **** 14424 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CALLTOMIND 6 0 **** **** **** **** 0 0
|
||||
25906 FEAT_HIDDEN_TALENT_CALL_WEAPONRY 16990424 16824111 fot_seeksword 999 **** **** **** **** **** 11 **** **** **** 0 0 0 9 **** 14425 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CALL_WEAPONRY 6 0 **** **** **** **** 0 0
|
||||
25907 FEAT_HIDDEN_TALENT_CHAMELEON 16990425 16823642 fot_chameleon 999 **** **** **** **** **** 11 **** **** **** 0 0 0 10 **** 14482 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CHAMELEON 6 0 **** **** **** **** 0 0
|
||||
25908 FEAT_HIDDEN_TALENT_CLAWS_BEAST 16990426 16824107 fot_clawbeast 999 **** **** **** **** **** 11 **** **** **** 0 0 0 10 **** 14427 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CLAWS_BEAST 6 0 **** **** **** **** 0 0
|
||||
25909 FEAT_HIDDEN_TALENT_COMPRESSION 16990427 16824120 fot_compress 999 **** **** **** **** **** 11 **** **** **** 0 0 0 9 **** 14428 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_COMPRESSION 6 0 **** **** **** **** 0 0
|
||||
25910 FEAT_HIDDEN_TALENT_CONCEALTHOUGHT 16990428 16823759 fot_nondetect 999 **** **** **** **** **** 11 **** **** **** 0 0 0 7 **** 14429 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CONCEALTHOUGHT 6 0 **** **** **** **** 0 0
|
||||
25911 FEAT_HIDDEN_TALENT_CREATESOUND 16990429 16823869 fot_vocal 999 **** **** **** **** **** 11 **** **** **** 0 0 0 11 **** 14431 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CREATESOUND 6 1 **** **** **** **** 0 0
|
||||
25912 FEAT_HIDDEN_TALENT_CRYSTALSHARD 16990430 16823632 fot_icestorm 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14432 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_CRYSTALSHARD 6 1 **** **** **** **** 0 0
|
||||
25913 FEAT_HIDDEN_TALENT_DAZE 16990431 16823650 fot_invisstalk 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14433 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DAZE 6 1 **** **** **** **** 0 0
|
||||
25914 FEAT_HIDDEN_TALENT_DECELERATION 16990432 16823652 fot_Slow 999 **** **** **** **** **** 11 **** **** **** 0 0 0 1 **** 14434 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DECELERATION 6 1 **** **** **** **** 0 0
|
||||
25915 FEAT_HIDDEN_TALENT_DEFPRECOG 16990433 16823708 fot_shield 999 **** **** **** **** **** 11 **** **** **** 0 0 0 13 **** 14435 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DEFPRECOG 6 0 **** **** **** **** 0 0
|
||||
25916 FEAT_HIDDEN_TALENT_DEMORALIZE 16990434 16823686 fot_lowerres 999 **** **** **** **** **** 11 **** **** **** 0 0 0 8 **** 14436 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DEMORALIZE 6 0 **** **** **** **** 0 0
|
||||
25917 FEAT_HIDDEN_TALENT_DISABLE 16990435 16823688 fot_enfeeble 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14438 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DISABLE 6 1 **** **** **** **** 0 0
|
||||
25918 FEAT_HIDDEN_TALENT_DISSIPATINGTOUCH 16990436 16823656 fot_chilltouch 999 **** **** **** **** **** 11 **** **** **** 0 0 0 3 **** 14439 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DISSIPATINGTOUCH 6 1 **** **** **** **** 0 0
|
||||
25919 FEAT_HIDDEN_TALENT_DISTRACT 16990437 16823690 fot_powerblind 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14440 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_DISTRACT 6 1 **** **** **** **** 0 0
|
||||
25920 FEAT_HIDDEN_TALENT_ELF_SIGHT 16990438 16823720 fot_infravis 999 **** **** **** **** **** 11 **** **** **** 0 0 0 10 **** 14370 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_ELF_SIGHT 6 0 **** **** **** **** 0 0
|
||||
25921 FEAT_HIDDEN_TALENT_EMPATHY 16990439 16823761 fot_friends 999 **** **** **** **** **** 11 **** **** **** 0 0 0 **** **** 14441 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_EMPATHY 6 0 **** **** **** **** 0 0
|
||||
25922 FEAT_HIDDEN_TALENT_EMPTYMIND 16990440 16823692 fot_detillusion 999 **** **** **** **** **** 11 **** **** **** 0 0 0 9 **** 14442 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_EMPTYMIND 6 0 **** **** **** **** 0 0
|
||||
25923 FEAT_HIDDEN_TALENT_ENERGYRAY 16990441 16823694 fot_flamearrow 999 **** **** **** **** **** 11 **** **** **** 0 0 0 **** **** 14443 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_ENERGYRAY 6 1 **** **** **** **** 0 0
|
||||
25924 FEAT_HIDDEN_TALENT_ENTANGLE 16990442 16823700 fot_entangle 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14448 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_ENTANGLE 6 1 **** **** **** **** 0 0
|
||||
25925 FEAT_HIDDEN_TALENT_EXPANSION 16990443 16824128 fot_strength 999 **** **** **** **** **** 11 **** **** **** 0 0 0 9 **** 14449 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_EXPANSION 6 0 **** **** **** **** 0 0
|
||||
25926 FEAT_HIDDEN_TALENT_FARHAND 16990444 16823763 fot_magicshort 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14450 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_FARHAND 6 0 **** **** **** **** 0 0
|
||||
25927 FEAT_HIDDEN_TALENT_FORCESCREEN 16990445 16823658 fot_polyself 999 **** **** **** **** **** 11 **** **** **** 0 0 0 13 **** 14451 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_FORCESCREEN 6 0 **** **** **** **** 0 0
|
||||
25928 FEAT_HIDDEN_TALENT_GREASE 16990446 16823702 fot_Grease 999 **** **** **** **** **** 11 **** **** **** 0 0 0 11 **** 14452 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_GREASE 6 1 **** **** **** **** 0 0
|
||||
25929 FEAT_HIDDEN_TALENT_HAMMER 16990447 16823704 fot_hammer 999 **** **** **** **** **** 11 **** **** **** 0 0 0 10 **** 14453 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_HAMMER 6 1 **** **** **** **** 0 0
|
||||
25930 FEAT_HIDDEN_TALENT_INERTIALARMOUR 16990448 16823660 fot_armor 999 **** **** **** **** **** 11 **** **** **** 0 0 0 9 **** 14454 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_INERTIALARMOUR 6 0 **** **** **** **** 0 0
|
||||
25931 FEAT_HIDDEN_TALENT_MATTERAGITATION 16990449 16823765 fot_elementfire 999 **** **** **** **** **** 11 **** **** **** 0 0 0 3 **** 14455 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_MATTERAGITATION 6 1 **** **** **** **** 0 0
|
||||
25932 FEAT_HIDDEN_TALENT_METAPHYSICAL_CLAW 16990450 16824134 fot_metaclaw 999 **** **** **** **** **** 11 **** **** **** 0 0 0 9 **** 14456 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_METAPHYSICAL_CLAW 6 0 **** **** **** **** 0 0
|
||||
25933 FEAT_HIDDEN_TALENT_METAPHYSICAL_WEAPON 16990451 16824136 fot_protnormal 999 **** **** **** **** **** 11 **** **** **** 0 0 0 9 **** 14457 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_METAPHYSICAL_WEAPON 6 0 **** **** **** **** 0 0
|
||||
25934 FEAT_HIDDEN_TALENT_MINDTHRUST 16990452 16823615 fot_skulltrap 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14458 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_MINDTHRUST 6 1 **** **** **** **** 0 0
|
||||
25935 FEAT_HIDDEN_TALENT_MYLIGHT 16990453 16823706 fot_dawn 999 **** **** **** **** **** 11 **** **** **** 0 0 0 **** **** 14459 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_MYLIGHT 6 0 **** **** **** **** 0 0
|
||||
25936 FEAT_HIDDEN_TALENT_OFFPRECOG 16990454 16823710 fot_snare 999 **** **** **** **** **** 11 **** **** **** 0 0 0 9 **** 14460 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_OFFPRECOG 6 0 **** **** **** **** 0 0
|
||||
25937 FEAT_HIDDEN_TALENT_OFFPRESC 16990455 16823712 fot_sols 999 **** **** **** **** **** 11 **** **** **** 0 0 0 9 **** 14461 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_OFFPRESC 6 0 **** **** **** **** 0 0
|
||||
25938 FEAT_HIDDEN_TALENT_PREVENOM 16990456 16824142 fot_grmalison 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14468 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_PREVENOM 6 0 **** **** **** **** 0 0
|
||||
25939 FEAT_HIDDEN_TALENT_PREVENOM_WEAPON 16990457 16824144 fot_prevnmw 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14469 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_PREVENOM_WEAPON 6 0 **** **** **** **** 0 0
|
||||
25940 FEAT_HIDDEN_TALENT_SKATE 16990458 16823767 fot_haste 999 **** **** **** **** **** 11 **** **** **** 0 0 0 10 **** 14470 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_SKATE 6 0 **** **** **** **** 0 0
|
||||
25941 FEAT_HIDDEN_TALENT_STOMP 16990459 16823682 fot_stomp 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14471 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_STOMP 6 1 **** **** **** **** 0 0
|
||||
25942 FEAT_HIDDEN_TALENT_SYNESTHETE 16990460 16823755 fot_physmirror 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14472 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_SYNESTHETE 6 0 **** **** **** **** 0 0
|
||||
25943 FEAT_HIDDEN_TALENT_TELEMPATHICPRO 16990461 16823769 fot_charmanim 999 **** **** **** **** **** 11 **** **** **** 0 0 0 2 **** 14473 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_TELEMPATHICPRO 6 0 **** **** **** **** 0 0
|
||||
25944 FEAT_HIDDEN_TALENT_THICKSKIN 16990462 16823670 fot_barkskin 999 **** **** **** **** **** 11 **** **** **** 0 0 0 13 **** 14474 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_THICKSKIN 6 0 **** **** **** **** 0 0
|
||||
25945 FEAT_HIDDEN_TALENT_VIGOR 16990463 16823672 fot_horror 999 **** **** **** **** **** 11 **** **** **** 0 0 0 9 **** 14475 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_VIGOR 6 0 **** **** **** **** 0 0
|
||||
25946 FEAT_HIDDEN_TALENT_GRIP_IRON 16990464 16790301 fot_metaclaw 999 **** **** **** **** **** 11 **** **** **** 0 0 0 10 **** 15686 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HIDDEN_TALENT_GRIP_IRON 6 0 **** **** **** **** 0 0
|
||||
25947 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25948 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25949 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -25961,10 +25961,10 @@
|
||||
25957 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25958 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25959 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25960 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25961 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25962 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25963 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25960 FEAT_CREATE_INFUSION 16989216 16989217 ife_X2BrewPotion **** **** **** **** **** **** **** 3 **** **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** 7 4 **** **** FEAT_CREATE_INFUSION 4 0 **** **** **** **** 0 1
|
||||
25961 FEAT_MAGICAL_ARTISAN_CREATE_INFUSION 16989218 16847257 ife_X2BrewPotion **** **** **** **** **** **** **** **** 25960 **** 0 0 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_MAGICAL_ARTISAN_CREATE_INFUSION **** 0 **** **** **** **** 0 1
|
||||
25962 FEAT_CRAFT_SCEPTER 16989396 16989397 ife_craft_sceptr **** **** **** **** **** **** **** 9 **** **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** 7 4 **** **** FEAT_CRAFT_SCEPTER 4 0 **** **** **** **** 0 1
|
||||
25963 FEAT_MAGICAL_ARTISAN_CRAFT_SCEPTER 16989398 16847257 ife_craft_sceptr **** **** **** **** **** **** **** **** 25962 **** 0 0 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_MAGICAL_ARTISAN_CRAFT_SCEPTER **** 0 **** **** **** **** 0 1
|
||||
25964 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25965 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25966 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -25991,11 +25991,11 @@
|
||||
25987 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25988 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25989 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25990 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25991 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25992 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25993 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25994 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
25990 FEAT_INTRINSIC_ARMOR 16854438 16854439 ife_darkvis **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_INTRINSIC_ARMOR 6 **** **** **** **** **** 0 1
|
||||
25991 FEAT_INTRINSIC_WEAPON 16854440 16854441 ife_darkvis **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_INTRINSIC_WEAPON 6 **** **** **** **** **** 0 1
|
||||
25992 FEAT_PLANT_DEFIANCE 16990318 16990319 id_plant **** **** **** **** **** **** **** **** **** **** 0 0 1 **** 1 17991 **** 0.5 -1 **** 1 198 374 23580 **** **** **** **** **** **** FEAT_PLANT_DEFIANCE 6 **** **** **** **** **** 0 1
|
||||
25993 FEAT_PLANT_CONTROL 16990320 16990321 id_plant **** **** **** **** **** **** **** **** 25992 **** 0 0 1 **** 1 17992 **** 0.5 -1 **** 1 198 374 23580 **** **** **** **** **** **** FEAT_PLANT_CONTROL 6 **** **** **** **** **** 0 1
|
||||
25994 FEAT_FAV_COMPANIONS 16990316 16990317 ife_servheaven **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** 17995 **** **** 1 97 1 **** **** **** **** **** **** **** **** **** FEAT_FAV_COMPANIONS 2 **** **** **** **** **** 0 1
|
||||
25995 FEAT_EPIC_SWARM_OF_ARROWS 16990308 16990309 ife_X1HailArr **** **** 23 **** **** **** **** **** 27 30 0 0 1 2 **** 17996 **** 1 **** **** 1 101 102 **** **** **** **** **** **** **** FEAT_EPIC_SWARM_OF_ARROWS 5 0 **** **** **** **** 1 1
|
||||
25996 FEAT_EPIC_UP_PRIEST 16835620 16835621 ife_X2EpicChar **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_UR_PRIEST 6 **** **** **** **** **** 1 0
|
||||
25997 FEAT_INVESTIGATOR 16990414 16990415 ife_alertness **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_INVESTIGATOR 5 **** **** **** **** **** 0 1
|
||||
@@ -26003,13 +26003,13 @@
|
||||
25999 FEAT_MARTIAL_STALKER 16990314 16990315 IR_NINJA **** **** **** **** **** **** **** **** 2488 45 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_MARTIAL_STALKER 5 0 **** **** **** **** 0 0
|
||||
26000 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
26001 Bullybasher_GiantBearing 16977316 16977317 is_giantbearing **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 16553 **** 0.5 **** **** 1 **** **** **** **** **** **** **** **** **** WOL_BULLY_GIANT 6 0 **** **** **** **** 0 0
|
||||
26002 FEAT_VOWOFPOVERTY 16977318 16977319 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VOWOFPOVERTY 6 **** **** **** **** **** 0 0
|
||||
26003 FEAT_SANCTIFYKISTRIKE 16990535 16990536 ife_kistrike **** **** **** **** **** **** 15 **** 21 213 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SANCTIFYKISTRIKE 6 **** **** **** **** **** 0 0
|
||||
26004 FEAT_HOLYKISTRIKE 16990537 16990538 ife_kistrike **** **** **** **** **** **** 15 **** 21 26002 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_HOLYKISTRIKE 6 **** **** **** **** **** 0 0
|
||||
26005 FEAT_FISTOFHEAVENS 16990539 16990540 ife_kistrike **** **** **** **** 15 **** **** **** 21 26002 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_FISTOFHEAVENS 6 **** **** **** **** **** 0 0
|
||||
26006 FEAT_VOWABSTINENCE 16990541 16990542 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VOWABSTINENCE 6 **** **** **** **** **** 0 0
|
||||
26007 FEAT_VOWCHASTITY 16990543 16990544 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VOWCHASTITY 6 **** **** **** **** **** 0 0
|
||||
26008 FEAT_GIFTOFFAITH 16990545 16990546 ife_sacredvow **** **** **** **** 13 **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_GIFTOFFAITH 6 **** **** **** **** **** 0 0
|
||||
26002 FEAT_VOWOFPOVERTY 16977318 16977319 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_VOWOFPOVERTY 6 **** **** **** **** **** 0 0
|
||||
26003 FEAT_SANCTIFYKISTRIKE 16990535 16990536 ife_kistrike **** **** **** **** **** **** 15 **** 21 213 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_SANCTIFYKISTRIKE 6 **** **** **** **** **** 0 0
|
||||
26004 FEAT_HOLYKISTRIKE 16990537 16990538 ife_kistrike **** **** **** **** **** **** 15 **** 21 26003 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_HOLYKISTRIKE 6 **** **** **** **** **** 0 0
|
||||
26005 FEAT_FISTOFHEAVENS 16990539 16990540 ife_kistrike **** **** **** **** 15 **** **** **** 39 26003 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_FISTOFHEAVENS 6 **** **** **** **** **** 0 0
|
||||
26006 FEAT_VOWABSTINENCE 16990541 16990542 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_VOWABSTINENCE 6 **** **** **** **** **** 0 0
|
||||
26007 FEAT_VOWCHASTITY 16990543 16990544 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_VOWCHASTITY 6 **** **** **** **** **** 0 0
|
||||
26008 FEAT_GIFTOFFAITH 16990545 16990546 ife_sacredvow **** **** **** **** 13 **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_GIFTOFFAITH 6 **** **** **** **** **** 0 0
|
||||
26009 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
26010 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
26011 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
|
||||
@@ -137,3 +137,866 @@
|
||||
133 Fighter_Epic_Fiend_Vrock 90428 90429 4 STR 1000 **** **** 0 0 **** PackFTSumEFS PackSKSumEFS **** **** ****
|
||||
134 Fighter_Epic_Fiend_Cornugon 17027206 17027207 4 STR 1000 **** **** 0 0 **** PackFTSumEFS PackSKSumEFS **** **** ****
|
||||
135 Fighter_Epic_Fiend_Yugoloth 17027208 17027209 4 STR 1000 **** **** 0 0 **** PackFTSumEFS PackSKSumEFS **** **** ****
|
||||
136 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
137 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
138 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
139 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
140 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
141 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
142 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
143 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
144 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
145 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
146 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
147 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
148 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
149 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
150 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
151 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
152 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
153 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
154 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
155 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
156 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
157 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
158 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
159 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
160 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
161 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
162 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
163 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
164 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
165 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
166 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
167 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
168 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
169 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
170 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
171 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
172 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
173 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
174 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
175 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
176 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
177 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
178 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
179 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
180 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
181 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
182 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
183 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
184 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
185 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
186 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
187 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
188 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
189 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
190 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
191 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
192 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
193 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
194 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
195 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
196 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
197 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
198 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
199 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
200 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
201 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
202 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
203 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
204 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
205 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
206 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
207 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
208 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
209 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
210 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
211 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
212 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
213 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
214 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
215 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
216 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
217 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
218 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
219 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
220 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
221 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
222 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
223 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
224 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
225 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
226 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
227 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
228 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
229 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
230 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
231 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
232 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
233 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
234 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
235 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
236 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
237 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
238 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
239 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
240 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
241 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
242 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
243 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
244 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
245 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
246 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
247 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
248 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
249 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
250 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
251 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
252 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
253 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
254 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
255 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
256 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
257 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
258 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
259 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
260 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
261 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
262 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
263 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
264 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
265 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
266 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
267 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
268 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
269 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
270 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
271 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
272 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
273 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
274 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
275 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
276 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
277 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
278 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
279 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
280 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
281 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
282 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
283 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
284 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
285 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
286 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
287 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
288 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
289 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
290 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
291 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
292 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
293 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
294 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
295 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
296 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
297 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
298 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
299 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
300 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
301 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
302 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
303 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
304 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
305 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
306 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
307 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
308 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
309 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
310 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
311 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
312 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
313 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
314 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
315 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
316 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
317 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
318 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
319 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
320 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
321 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
322 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
323 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
324 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
325 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
326 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
327 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
328 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
329 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
330 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
331 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
332 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
333 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
334 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
335 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
336 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
337 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
338 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
339 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
340 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
341 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
342 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
343 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
344 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
345 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
346 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
347 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
348 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
349 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
350 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
351 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
352 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
353 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
354 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
355 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
356 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
357 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
358 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
359 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
360 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
361 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
362 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
363 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
364 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
365 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
366 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
367 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
368 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
369 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
370 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
371 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
372 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
373 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
374 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
375 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
376 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
377 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
378 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
379 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
380 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
381 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
382 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
383 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
384 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
385 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
386 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
387 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
388 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
389 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
390 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
391 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
392 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
393 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
394 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
395 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
396 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
397 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
398 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
399 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
400 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
401 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
402 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
403 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
404 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
405 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
406 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
407 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
408 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
409 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
410 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
411 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
412 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
413 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
414 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
415 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
416 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
417 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
418 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
419 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
420 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
421 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
422 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
423 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
424 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
425 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
426 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
427 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
428 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
429 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
430 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
431 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
432 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
433 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
434 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
435 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
436 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
437 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
438 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
439 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
440 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
441 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
442 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
443 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
444 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
445 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
446 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
447 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
448 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
449 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
450 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
451 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
452 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
453 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
454 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
455 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
456 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
457 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
458 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
459 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
460 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
461 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
462 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
463 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
464 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
465 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
466 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
467 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
468 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
469 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
470 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
471 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
472 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
473 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
474 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
475 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
476 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
477 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
478 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
479 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
480 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
481 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
482 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
483 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
484 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
485 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
486 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
487 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
488 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
489 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
490 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
491 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
492 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
493 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
494 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
495 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
496 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
497 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
498 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
499 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
500 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
501 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
502 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
503 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
504 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
505 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
506 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
507 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
508 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
509 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
510 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
511 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
512 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
513 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
514 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
515 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
516 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
517 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
518 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
519 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
520 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
521 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
522 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
523 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
524 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
525 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
526 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
527 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
528 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
529 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
530 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
531 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
532 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
533 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
534 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
535 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
536 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
537 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
538 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
539 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
540 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
541 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
542 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
543 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
544 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
545 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
546 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
547 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
548 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
549 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
550 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
551 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
552 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
553 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
554 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
555 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
556 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
557 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
558 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
559 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
560 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
561 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
562 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
563 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
564 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
565 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
566 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
567 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
568 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
569 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
570 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
571 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
572 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
573 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
574 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
575 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
576 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
577 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
578 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
579 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
580 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
581 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
582 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
583 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
584 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
585 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
586 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
587 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
588 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
589 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
590 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
591 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
592 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
593 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
594 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
595 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
596 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
597 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
598 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
599 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
600 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
601 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
602 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
603 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
604 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
605 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
606 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
607 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
608 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
609 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
610 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
611 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
612 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
613 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
614 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
615 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
616 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
617 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
618 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
619 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
620 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
621 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
622 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
623 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
624 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
625 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
626 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
627 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
628 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
629 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
630 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
631 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
632 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
633 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
634 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
635 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
636 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
637 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
638 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
639 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
640 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
641 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
642 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
643 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
644 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
645 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
646 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
647 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
648 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
649 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
650 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
651 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
652 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
653 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
654 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
655 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
656 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
657 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
658 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
659 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
660 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
661 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
662 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
663 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
664 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
665 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
666 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
667 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
668 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
669 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
670 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
671 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
672 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
673 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
674 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
675 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
676 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
677 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
678 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
679 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
680 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
681 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
682 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
683 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
684 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
685 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
686 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
687 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
688 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
689 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
690 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
691 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
692 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
693 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
694 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
695 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
696 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
697 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
698 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
699 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
700 Beguiler_Controller 16988617 16988618 79 INT 1000 **** **** **** **** **** packftbeg1 packskbeg1 packeqbeg1 0 1
|
||||
701 Beguiler_Investigator 16988619 16988620 79 INT 1000 **** **** **** **** **** packftbeg2 packskbeg2 packeqbeg2 0 1
|
||||
702 Beguiler_Trickster 16988621 16988622 79 INT 1000 **** **** **** **** **** packftbeg3 packskbeg3 packeqbeg3 0 1
|
||||
703 BeguilerReserve4 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
704 BeguilerReserve5 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
705 DragonShaman_Defender 16988627 16988628 143 CON 1000 **** **** **** **** **** packftdrgshm1 packskdrgshm1 packeqdrgshm1 0 1
|
||||
706 DragonShaman_Destroyer 16988629 16988630 143 STR 1000 **** **** **** **** **** packftdrgshm2 packskdrgshm2 packeqdrgshm2 0 1
|
||||
707 DragonShaman_SecondRank 16988631 16988632 143 CHA 1000 **** **** **** **** **** packftdrgshm3 packskdrgshm3 packeqdrgshm3 0 1
|
||||
708 DragonShamanReserve4 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
709 DragonShamanReserve5 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
710 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
711 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
712 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
713 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
714 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
715 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
716 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
717 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
718 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
719 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
720 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
721 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
722 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
723 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
724 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
725 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
726 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
727 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
728 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
729 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
730 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
731 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
732 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
733 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
734 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
735 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
736 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
737 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
738 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
739 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
740 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
741 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
742 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
743 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
744 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
745 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
746 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
747 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
748 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
749 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
750 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
751 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
752 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
753 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
754 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
755 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
756 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
757 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
758 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
759 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
760 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
761 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
762 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
763 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
764 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
765 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
766 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
767 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
768 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
769 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
770 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
771 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
772 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
773 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
774 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
775 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
776 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
777 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
778 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
779 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
780 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
781 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
782 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
783 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
784 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
785 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
786 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
787 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
788 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
789 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
790 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
791 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
792 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
793 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
794 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
795 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
796 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
797 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
798 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
799 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
800 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
801 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
802 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
803 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
804 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
805 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
806 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
807 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
808 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
809 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
810 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
811 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
812 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
813 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
814 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
815 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
816 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
817 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
818 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
819 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
820 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
821 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
822 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
823 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
824 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
825 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
826 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
827 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
828 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
829 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
830 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
831 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
832 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
833 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
834 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
835 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
836 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
837 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
838 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
839 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
840 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
841 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
842 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
843 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
844 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
845 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
846 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
847 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
848 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
849 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
850 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
851 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
852 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
853 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
854 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
855 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
856 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
857 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
858 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
859 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
860 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
861 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
862 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
863 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
864 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
865 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
866 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
867 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
868 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
869 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
870 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
871 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
872 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
873 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
874 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
875 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
876 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
877 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
878 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
879 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
880 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
881 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
882 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
883 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
884 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
885 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
886 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
887 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
888 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
889 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
890 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
891 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
892 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
893 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
894 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
895 Healer_Default 16988709 16988710 64 WIS 1000 **** **** **** **** packpsheal1 packftheal1 packskheal1 packeqheal1 0 1
|
||||
896 Healer_Reserve2 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
897 Healer_Reserve3 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
898 Healer_Reserve4 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
899 Healer_Reserve5 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
900 Warlock_Blaster_Default 16988717 16988718 112 CHA 1000 **** **** **** **** **** packftwr1 packftwr1 packeqwr1 0 1
|
||||
901 Warlock_RESERVE2 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
902 Warlock_RESERVE3 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
903 Warlock_RESERVE4 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
904 Warlock_RESERVE5 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
905 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
906 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
907 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
908 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
909 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
910 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
911 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
912 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
913 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
914 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
915 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
916 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
917 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
918 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
919 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
920 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
921 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
922 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
923 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
924 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
925 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
926 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
927 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
928 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
929 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
930 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
931 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
932 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
933 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
934 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
935 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
936 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
937 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
938 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
939 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
940 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
941 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
942 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
943 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
944 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
945 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
946 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
947 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
948 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
949 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
950 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
951 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
952 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
953 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
954 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
955 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
956 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
957 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
958 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
959 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
960 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
961 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
962 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
963 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
964 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
965 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
966 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
967 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
968 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
969 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
970 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
971 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
972 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
973 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
974 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
975 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
976 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
977 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
978 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
979 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
980 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
981 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
982 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
983 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
984 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
985 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
986 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
987 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
988 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
989 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
990 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
991 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
992 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
993 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
994 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
995 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
996 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
997 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
998 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
75 Aranea 158 159 160 161 162 158 159 160 161 162 **** **** **** **** **** ****
|
||||
76 Chitine 2 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
77 SpiretopDragon 3580 3631 3712 **** **** 3580 3631 3712 **** **** **** **** **** **** **** ****
|
||||
78 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
78 Jaebrin 6 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
79 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
80 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
81 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -155,7 +155,7 @@
|
||||
151 Arctic_Dwarf 2 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
152 Gold_Dwarf 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
153 Gray_Dwarf 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
154 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
154 EmptyVessel 6 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
155 Urdunnir 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
156 Wild_Dwarf 2 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
157 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -170,7 +170,7 @@
|
||||
166 Sun_Elf 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
167 Wild_Elf 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
168 Wood_Elf 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
169 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
169 Grey_Elf 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
170 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
171 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
172 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -186,7 +186,7 @@
|
||||
182 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
183 Half_Drow 4 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
184 Gray_Orc 5 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
185 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
185 Gargoyle 73 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
186 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
187 Orog 5 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
188 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@@ -234,7 +234,7 @@
|
||||
230 Deep_Imaskari 6 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
231 Troll 167 164 1058 1254 2500 165 2501 2502 2503 2504 **** **** **** **** **** ****
|
||||
232 Varag 390 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
233 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
233 HobgoblinWarsoul 391 390 **** **** **** 391 390 **** **** **** **** **** **** **** **** ****
|
||||
234 Troglodyte 452 451 453 869 870 451 452 453 869 870 **** **** **** **** **** ****
|
||||
235 Neraphim 155 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
236 Shadowswyft 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
49 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4 30 3 1 **** ****
|
||||
50 Drider Dr 3063 3063 16833081 108146 16833083 **** 406 4 4 4 6 6 6 30 9 RACE_FEAT_DRIDER 16833082 1 RACIAL_TYPE_DRIDER 110 9 1 drow **** **** **** 4 30 3 1 INT 268
|
||||
51 Wemic Wm 16826957 16826958 16826958 16826959 16826960 **** 467 8 2 0 -2 0 2 40 0 RACE_FEAT_WEMIC 16826961 1 RACIAL_TYPE_WEMIC 6 0 1 wemic **** **** **** 4 30 3 1 INT 274
|
||||
52 Plant Pl 16833077 16833077 16833078 16833079 16833080 **** 51 0 -2 0 0 0 2 0 **** **** 0 0 RACIAL_TYPE_PLANT 4 15 0.95 plant **** **** **** 4 30 3 1 INT 2355
|
||||
52 Plant Pl 16833077 16833077 16833078 16833079 16833080 **** 51 0 0 0 0 0 0 0 **** **** 0 0 RACIAL_TYPE_PLANT 4 15 0.95 plant **** **** **** 4 30 3 1 INT 2355
|
||||
53 Brownie Bw 16826962 16826962 16826963 16826964 16826965 **** 55 -6 10 2 2 2 2 30 8 RACE_FEAT_BROWNI 8160 1 RACIAL_TYPE_BROWNIE 20 8 1 brownie **** **** **** 4 30 3 1 INT 278
|
||||
54 Krinth Kr 16833149 16833149 16833150 16833149 16833151 **** 5 0 0 0 -2 0 2 30 4 RACE_FEAT_KRINTH 16833149 1 RACIAL_TYPE_KRINTH 20 4 1 krinth **** **** **** 4 30 3 1 INT 267
|
||||
55 Goliath Go 16833166 16833166 16833167 16833170 16833171 **** 5 4 -2 0 0 0 2 30 0 RACE_FEAT_GOL 16833166 1 RACIAL_TYPE_GOLIATH 20 0 1 goliath **** **** **** 4 30 3 1 INT 274
|
||||
@@ -78,7 +78,7 @@
|
||||
74 Muckdweller Mr 16836018 16836018 16836019 16836020 16836021 **** 206 -6 6 0 -2 -2 0 20 8 RACE_FEAT_MUCKD 8163 1 RACIAL_TYPE_MUCKDWELLER 15 8 1 muckdweller **** **** **** 4 30 3 1 INT 276
|
||||
75 Aranea Ae 16836006 16836006 16836007 16836008 16836009 **** 158 0 4 4 4 2 4 50 9 RACE_FEAT_ARANEA 8163 1 RACIAL_TYPE_ARANEA 15 9 1 aranea **** **** **** 4 30 3 1 INT 284
|
||||
76 Chitine Ch 16832294 16832294 16832295 16832296 16832297 **** 2 **** 2 2 -4 **** 2 30 8 RACE_FEAT_CHIT 16832294 1 RACIAL_TYPE_CHITINE 15 8 1 chitine **** **** **** 4 30 3 1 INT 274
|
||||
77 SpiretopDragon Sd 16835965 16835966 16835967 16835968 16835969 **** 375 -4 8 -4 -2 0 2 60 8 RACE_FEAT_SPDRAG 16835970 1 RACIAL_TYPE_SPIRETOPDRAGON 25 8 1 dragon **** **** **** 4 30 3 1 INT 272
|
||||
77 SpiretopDragon Sd 16835965 16835966 16835967 16835968 16835969 **** 375 -4 8 -4 -2 0 2 60 8 RACE_FEAT_SPDRAG 16835970 0 RACIAL_TYPE_SPIRETOPDRAGON 25 8 1 dragon **** **** **** 4 30 3 1 INT 272
|
||||
78 Jaebrin Ja 16852286 16852286 16852287 16852288 16852289 **** 6 -2 0 0 2 0 0 30 79 RACE_FEAT_JAEBRN 8163 1 RACIAL_TYPE_JAEBRIN 15 79 1 fey human **** **** 4 30 3 1 INT 278
|
||||
79 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
80 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -12,6 +12,7 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
//PRC8 Token pre-fix = 161838
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Constant definitions */
|
||||
@@ -21,23 +22,23 @@ const int DYNCONV_EXITED = -2;
|
||||
const int DYNCONV_ABORTED = -3;
|
||||
const int DYNCONV_SETUP_STAGE = -1;
|
||||
|
||||
const int DYNCONV_TOKEN_HEADER = 99;
|
||||
const int DYNCONV_TOKEN_REPLY_0 = 100;
|
||||
const int DYNCONV_TOKEN_REPLY_1 = 101;
|
||||
const int DYNCONV_TOKEN_REPLY_2 = 102;
|
||||
const int DYNCONV_TOKEN_REPLY_3 = 103;
|
||||
const int DYNCONV_TOKEN_REPLY_4 = 104;
|
||||
const int DYNCONV_TOKEN_REPLY_5 = 105;
|
||||
const int DYNCONV_TOKEN_REPLY_6 = 106;
|
||||
const int DYNCONV_TOKEN_REPLY_7 = 107;
|
||||
const int DYNCONV_TOKEN_REPLY_8 = 108;
|
||||
const int DYNCONV_TOKEN_REPLY_9 = 109;
|
||||
const int DYNCONV_TOKEN_EXIT = 110;
|
||||
const int DYNCONV_TOKEN_WAIT = 111;
|
||||
const int DYNCONV_TOKEN_NEXT = 112;
|
||||
const int DYNCONV_TOKEN_PREV = 113;
|
||||
const int DYNCONV_MIN_TOKEN = 99;
|
||||
const int DYNCONV_MAX_TOKEN = 113;
|
||||
const int DYNCONV_TOKEN_HEADER = 16183899;
|
||||
const int DYNCONV_TOKEN_REPLY_0 = 161838100;
|
||||
const int DYNCONV_TOKEN_REPLY_1 = 161838101;
|
||||
const int DYNCONV_TOKEN_REPLY_2 = 161838102;
|
||||
const int DYNCONV_TOKEN_REPLY_3 = 161838103;
|
||||
const int DYNCONV_TOKEN_REPLY_4 = 161838104;
|
||||
const int DYNCONV_TOKEN_REPLY_5 = 161838105;
|
||||
const int DYNCONV_TOKEN_REPLY_6 = 161838106;
|
||||
const int DYNCONV_TOKEN_REPLY_7 = 161838107;
|
||||
const int DYNCONV_TOKEN_REPLY_8 = 161838108;
|
||||
const int DYNCONV_TOKEN_REPLY_9 = 161838109;
|
||||
const int DYNCONV_TOKEN_EXIT = 161838110;
|
||||
const int DYNCONV_TOKEN_WAIT = 161838111;
|
||||
const int DYNCONV_TOKEN_NEXT = 161838112;
|
||||
const int DYNCONV_TOKEN_PREV = 161838113;
|
||||
const int DYNCONV_MIN_TOKEN = 16183899;
|
||||
const int DYNCONV_MAX_TOKEN = 161838113;
|
||||
|
||||
const int DYNCONV_STRREF_PLEASE_WAIT = 16824202; // "Please wait"
|
||||
const int DYNCONV_STRREF_PREVIOUS = 16824203; // "Previous"
|
||||
@@ -477,9 +478,28 @@ void _DynConvInternal_ExitedConvo(object oPC, int bAbort)
|
||||
DeleteLocalInt(oPC, DYNCONV_STAGE);
|
||||
DeleteLocalString(oPC, DYNCONV_SCRIPT);
|
||||
DeleteLocalString(oPC, "DynConv_HeaderText");
|
||||
int i;
|
||||
for(i = DYNCONV_MIN_TOKEN; i <= DYNCONV_MAX_TOKEN; i++)
|
||||
DeleteLocalString(oPC, GetTokenIDString(i));
|
||||
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_HEADER));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_REPLY_0));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_REPLY_1));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_REPLY_2));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_REPLY_3));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_REPLY_4));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_REPLY_5));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_REPLY_6));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_REPLY_7));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_REPLY_8));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_REPLY_9));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_EXIT));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_WAIT));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_NEXT));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_TOKEN_PREV));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_MIN_TOKEN));
|
||||
DeleteLocalString(oPC, GetTokenIDString(DYNCONV_MAX_TOKEN));
|
||||
|
||||
//int i;
|
||||
//for(i = DYNCONV_MIN_TOKEN; i <= DYNCONV_MAX_TOKEN; i++)
|
||||
//DeleteLocalString(oPC, GetTokenIDString(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,77 +47,78 @@ const string MES_CONTINGENCIES_YES2 = "The contingencies must expire to allo
|
||||
*/
|
||||
|
||||
//Primogenitors SpellID constants
|
||||
const int SPELL_EPIC_A_STONE = 0;//4007;
|
||||
const int SPELL_EPIC_ACHHEEL = 1;//4000;
|
||||
const int SPELL_EPIC_AL_MART = 2;//4002;
|
||||
const int SPELL_EPIC_ALLHOPE = 3;//4001;
|
||||
const int SPELL_EPIC_ANARCHY = 4;//4003;
|
||||
const int SPELL_EPIC_ANBLAST = 5;//4004;
|
||||
const int SPELL_EPIC_ANBLIZZ = 6;//4005;
|
||||
const int SPELL_EPIC_ARMY_UN = 7;//4006;
|
||||
const int SPELL_EPIC_BATTLEB = 999;//4008;
|
||||
const int SPELL_EPIC_CELCOUN = 8;//4009;
|
||||
const int SPELL_EPIC_CHAMP_V = 9;//4010;
|
||||
const int SPELL_EPIC_CON_RES =10;//4011;
|
||||
const int SPELL_EPIC_CON_REU =11;//4012;
|
||||
const int SPELL_EPIC_DEADEYE =12;//4013;
|
||||
const int SPELL_EPIC_DIREWIN =13;//4015;
|
||||
const int SPELL_EPIC_DREAMSC =14;//4017;
|
||||
const int SPELL_EPIC_DRG_KNI =15;//4016;
|
||||
const int SPELL_EPIC_DTHMARK =1000;//4014;
|
||||
const int SPELL_EPIC_DULBLAD =16;//4018;
|
||||
const int SPELL_EPIC_DWEO_TH =17;//4019;
|
||||
const int SPELL_EPIC_ENSLAVE =18;//4020;
|
||||
const int SPELL_EPIC_EP_M_AR =19;//4021;
|
||||
const int SPELL_EPIC_EP_RPLS =20;//4022;
|
||||
const int SPELL_EPIC_EP_SP_R =21;//4023;
|
||||
const int SPELL_EPIC_EP_WARD =22;//4024;
|
||||
const int SPELL_EPIC_ET_FREE =23;//4025;
|
||||
const int SPELL_EPIC_FIEND_W =24;//4026;
|
||||
const int SPELL_EPIC_FLEETNS =25;//4027;
|
||||
const int SPELL_EPIC_GEMCAGE =26;//4028;
|
||||
const int SPELL_EPIC_GODSMIT =27;//4029;
|
||||
const int SPELL_EPIC_GR_RUIN =28;//4030;
|
||||
const int SPELL_EPIC_GR_SP_RE=29;//4031;
|
||||
const int SPELL_EPIC_GR_TIME =30;//4032;
|
||||
const int SPELL_EPIC_HELBALL =31;//4034;
|
||||
const int SPELL_EPIC_HELSEND =1001;//4033;
|
||||
const int SPELL_EPIC_HERCALL =32;//4035;
|
||||
const int SPELL_EPIC_HERCEMP =33;//4036;
|
||||
const int SPELL_EPIC_IMPENET =34;//4037;
|
||||
const int SPELL_EPIC_LEECH_F =35;//4038;
|
||||
const int SPELL_EPIC_LEG_ART =1002;//4039;
|
||||
const int SPELL_EPIC_LIFE_FT =1003;//4040;
|
||||
const int SPELL_EPIC_MAGMA_B =36;//4041;
|
||||
const int SPELL_EPIC_MASSPEN =37;//4042;
|
||||
const int SPELL_EPIC_MORI = 38;//4043;
|
||||
const int SPELL_EPIC_MUMDUST =39;//4044;
|
||||
const int SPELL_EPIC_NAILSKY =40;//4045;
|
||||
const int SPELL_EPIC_NIGHTSU =1004;//4046;
|
||||
const int SPELL_EPIC_ORDER_R =41;//4047;
|
||||
const int SPELL_EPIC_PATHS_B =42;//4048;
|
||||
const int SPELL_EPIC_PEERPEN =43;//4049;
|
||||
const int SPELL_EPIC_PESTIL = 44;//4050;
|
||||
const int SPELL_EPIC_PIOUS_P =45;//4051;
|
||||
const int SPELL_EPIC_PLANCEL =46;//4052;
|
||||
const int SPELL_EPIC_PSION_S =47;//4053;
|
||||
const int SPELL_EPIC_RAINFIR =48;//4054;
|
||||
const int SPELL_EPIC_RISEN_R =1005;//4055;
|
||||
const int SPELL_EPIC_RUINN = 49;//4056; //NON_STANDARD
|
||||
const int SPELL_EPIC_SINGSUN =50;//4057;
|
||||
const int SPELL_EPIC_SP_WORM =51;//4058;
|
||||
const int SPELL_EPIC_STORM_M =52;//4059;
|
||||
const int SPELL_EPIC_SUMABER =53;//4060;
|
||||
const int SPELL_EPIC_SUP_DIS =54;//4061;
|
||||
const int SPELL_EPIC_SYMRUST =1006;//4062;
|
||||
const int SPELL_EPIC_THEWITH =55;//4063;
|
||||
const int SPELL_EPIC_TOLO_KW =56;//4064;
|
||||
const int SPELL_EPIC_TRANVIT =57;//4065;
|
||||
const int SPELL_EPIC_TWINF = 58;//4066;
|
||||
const int SPELL_EPIC_UNHOLYD =59;//4067;
|
||||
const int SPELL_EPIC_UNIMPIN =60;//4068;
|
||||
const int SPELL_EPIC_UNSEENW =61;//4069;
|
||||
const int SPELL_EPIC_WHIP_SH =62;//4070;
|
||||
const int SPELL_EPIC_A_STONE = 0;//4007;
|
||||
const int SPELL_EPIC_ACHHEEL = 1;//4000;
|
||||
const int SPELL_EPIC_AL_MART = 2;//4002;
|
||||
const int SPELL_EPIC_ALLHOPE = 3;//4001;
|
||||
const int SPELL_EPIC_ANARCHY = 4;//4003;
|
||||
const int SPELL_EPIC_ANBLAST = 5;//4004;
|
||||
const int SPELL_EPIC_ANBLIZZ = 6;//4005;
|
||||
const int SPELL_EPIC_ARMY_UN = 7;//4006;
|
||||
const int SPELL_EPIC_BATTLEB = 999;//4008;
|
||||
const int SPELL_EPIC_CELCOUN = 8;//4009;
|
||||
const int SPELL_EPIC_CHAMP_V = 9;//4010;
|
||||
const int SPELL_EPIC_CON_RES = 10;//4011;
|
||||
const int SPELL_EPIC_CON_REU = 11;//4012;
|
||||
const int SPELL_EPIC_DEADEYE = 12;//4013;
|
||||
const int SPELL_EPIC_DIREWIN = 13;//4015;
|
||||
const int SPELL_EPIC_DREAMSC = 14;//4017;
|
||||
const int SPELL_EPIC_DRG_KNI = 15;//4016;
|
||||
const int SPELL_EPIC_DTHMARK = 1000;//4014;
|
||||
const int SPELL_EPIC_DULBLAD = 16;//4018;
|
||||
const int SPELL_EPIC_DWEO_TH = 17;//4019;
|
||||
const int SPELL_EPIC_ENSLAVE = 18;//4020;
|
||||
const int SPELL_EPIC_EP_M_AR = 19;//4021;
|
||||
const int SPELL_EPIC_EP_RPLS = 20;//4022;
|
||||
const int SPELL_EPIC_EP_SP_R = 21;//4023;
|
||||
const int SPELL_EPIC_EP_WARD = 22;//4024;
|
||||
const int SPELL_EPIC_ET_FREE = 23;//4025;
|
||||
const int SPELL_EPIC_FIEND_W = 24;//4026;
|
||||
const int SPELL_EPIC_FLEETNS = 25;//4027;
|
||||
const int SPELL_EPIC_GEMCAGE = 26;//4028;
|
||||
const int SPELL_EPIC_GODSMIT = 27;//4029;
|
||||
const int SPELL_EPIC_GR_RUIN = 28;//4030;
|
||||
const int SPELL_EPIC_GR_SP_RE = 29;//4031;
|
||||
const int SPELL_EPIC_GR_TIME = 30;//4032;
|
||||
const int SPELL_EPIC_HELBALL = 31;//4034;
|
||||
const int SPELL_EPIC_HELSEND = 1001;//4033;
|
||||
const int SPELL_EPIC_HERCALL = 32;//4035;
|
||||
const int SPELL_EPIC_HERCEMP = 33;//4036;
|
||||
const int SPELL_EPIC_IMPENET = 34;//4037;
|
||||
const int SPELL_EPIC_LEECH_F = 35;//4038;
|
||||
const int SPELL_EPIC_LEG_ART = 1002;//4039;
|
||||
const int SPELL_EPIC_LIFE_FT = 1003;//4040;
|
||||
const int SPELL_EPIC_MAGMA_B = 36;//4041;
|
||||
const int SPELL_EPIC_MASSPEN = 37;//4042;
|
||||
const int SPELL_EPIC_MORI = 38;//4043;
|
||||
const int SPELL_EPIC_MUMDUST = 39;//4044;
|
||||
const int SPELL_EPIC_NAILSKY = 40;//4045;
|
||||
const int SPELL_EPIC_NIGHTSU = 1004;//4046;
|
||||
const int SPELL_EPIC_ORDER_R = 41;//4047;
|
||||
const int SPELL_EPIC_PATHS_B = 42;//4048;
|
||||
const int SPELL_EPIC_PEERPEN = 43;//4049;
|
||||
const int SPELL_EPIC_PESTIL = 44;//4050;
|
||||
const int SPELL_EPIC_PIOUS_P = 45;//4051;
|
||||
const int SPELL_EPIC_PLANCEL = 46;//4052;
|
||||
const int SPELL_EPIC_PSION_S = 47;//4053;
|
||||
const int SPELL_EPIC_RAINFIR = 48;//4054;
|
||||
//const int SPELL_EPIC_RISEN_R =1005;//4055;
|
||||
const int SPELL_EPIC_RISEN_R = 49;//4055;
|
||||
const int SPELL_EPIC_RUINN = 50;//4056; //NON_STANDARD
|
||||
const int SPELL_EPIC_SINGSUN = 51;//4057;
|
||||
const int SPELL_EPIC_SP_WORM = 52;//4058;
|
||||
const int SPELL_EPIC_STORM_M = 53;//4059;
|
||||
const int SPELL_EPIC_SUMABER = 54;//4060;
|
||||
const int SPELL_EPIC_SUP_DIS = 55;//4061;
|
||||
const int SPELL_EPIC_SYMRUST = 1006;//4062;
|
||||
const int SPELL_EPIC_THEWITH = 56;//4063;
|
||||
const int SPELL_EPIC_TOLO_KW = 57;//4064;
|
||||
const int SPELL_EPIC_TRANVIT = 58;//4065;
|
||||
const int SPELL_EPIC_TWINF = 59;//4066;
|
||||
const int SPELL_EPIC_UNHOLYD = 60;//4067;
|
||||
const int SPELL_EPIC_UNIMPIN = 61;//4068;
|
||||
const int SPELL_EPIC_UNSEENW = 62;//4069;
|
||||
const int SPELL_EPIC_WHIP_SH = 63;//4070;
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -26,7 +26,7 @@ int GetSpellFromAbrev(string sAbrev);
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
#include "inc_utility"
|
||||
//#include "inc_epicspelldef"
|
||||
#include "inc_epicspells"
|
||||
|
||||
// SEED FUNCTIONS
|
||||
|
||||
@@ -246,7 +246,7 @@ int GetSpellFromAbrev(string sAbrev)
|
||||
sAbrev = GetStringLowerCase(sAbrev);
|
||||
if(GetStringLeft(sAbrev, 8) == "epic_sp_")
|
||||
sAbrev = GetStringRight(sAbrev, GetStringLength(sAbrev)-8);
|
||||
if(DEBUG) DoDebug("sAbrew to check vs: " + sAbrev);
|
||||
if(DEBUG) DoDebug("sAbrev to check vs: " + sAbrev);
|
||||
int i = 0;
|
||||
string sLabel = GetStringLowerCase(Get2DACache("epicspells", "LABEL", i));
|
||||
while(sLabel != "")
|
||||
|
||||
@@ -303,11 +303,18 @@ int GetIsEpicShaman(object oPC)
|
||||
&& GetAbilityScore(oPC, ABILITY_WISDOM) > 18;
|
||||
}
|
||||
|
||||
int GetIsEpicSorcerer(object oPC)
|
||||
int GetIsEpicSorcerer(object oPC)
|
||||
{
|
||||
return GetHitDice(oPC) >= 21
|
||||
&& GetCasterLvl(CLASS_TYPE_SORCERER, oPC) > 17
|
||||
&& GetAbilityScore(oPC, ABILITY_CHARISMA) > 18;
|
||||
}
|
||||
|
||||
/* int GetIsEpicSorcerer(object oPC)
|
||||
{
|
||||
return GetPrCAdjustedCasterLevel(CLASS_TYPE_SORCERER, oPC, FALSE) > 17
|
||||
&& GetAbilityScore(oPC, ABILITY_CHARISMA) > 18;
|
||||
}
|
||||
} */
|
||||
|
||||
int GetIsEpicSublimeChord(object oPC)
|
||||
{
|
||||
|
||||
481
src/include/inc_infusion.nss
Normal file
481
src/include/inc_infusion.nss
Normal file
@@ -0,0 +1,481 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: ;-. ,-. ,-. ,-.
|
||||
//:: | ) | ) / ( )
|
||||
//:: |-' |-< | ;-:
|
||||
//:: | | \ \ ( )
|
||||
//:: ' ' ' `-' `-'
|
||||
//::///////////////////////////////////////////////
|
||||
//::
|
||||
/*
|
||||
Script: inc_infusion
|
||||
Author: Jaysyn
|
||||
Created: 2025-08-11 17:01:26
|
||||
|
||||
Description:
|
||||
Contains most functions related to the Create
|
||||
Infusion feat.
|
||||
|
||||
*/
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
#include "prc_inc_spells"
|
||||
|
||||
int GetMaxDivineSpellLevel(object oCaster, int nClass);
|
||||
int GetCastSpellCasterLevelFromItem(object oItem, int nSpellID);
|
||||
int GetIsClassSpell(object oCaster, int nSpellID, int nClass);
|
||||
int GetHasSpellOnClassList(object oCaster, int nSpellID);
|
||||
void InfusionSecondSave(object oUser, int nDC);
|
||||
|
||||
/**
|
||||
* @brief Finds the class index for which the given spell is available to the specified caster.
|
||||
*
|
||||
* This function iterates through all possible classes and returns the first class
|
||||
* index for which the specified spell is on the caster's spell list.
|
||||
*
|
||||
* @param oCaster The creature object to check.
|
||||
* @param nSpellID The spell ID to find the class for.
|
||||
*
|
||||
* @return The class index that has the spell on its class spell list for the caster,
|
||||
* or -1 if no matching class is found.
|
||||
*/
|
||||
int FindSpellCastingClass(object oCaster, int nSpellID)
|
||||
{
|
||||
int i = 0;
|
||||
int nClassFound = -1;
|
||||
int nClass;
|
||||
|
||||
// Only loop through caster's classes
|
||||
for (i = 0; i <= 8; i++)
|
||||
{
|
||||
nClass = GetClassByPosition(i, oCaster);
|
||||
if (nClass == CLASS_TYPE_INVALID) continue;
|
||||
|
||||
if (GetIsClassSpell(oCaster, nSpellID, nClass))
|
||||
{
|
||||
nClassFound = nClass;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return nClassFound;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Performs validation checks to determine if the caster can use a spell infusion from the specified item.
|
||||
*
|
||||
* This function verifies that the item is a valid infused herb, checks the caster's relevant class and ability scores,
|
||||
* confirms the caster is a divine spellcaster with the necessary caster level, and ensures the spell is on the caster's class spell list.
|
||||
*
|
||||
* @param oCaster The creature attempting to use the infusion.
|
||||
* @param oItem The infused herb item containing the spell.
|
||||
* @param nSpellID The spell ID of the infusion spell being cast.
|
||||
*
|
||||
* @return TRUE if all infusion use checks pass and the caster can use the infusion; FALSE otherwise.
|
||||
*/
|
||||
int DoInfusionUseChecks(object oCaster, object oItem, int nSpellID)
|
||||
{
|
||||
int bPnPHerbs = GetPRCSwitch(PRC_CREATE_INFUSION_OPTIONAL_HERBS);
|
||||
|
||||
if(GetBaseItemType(oItem) != BASE_ITEM_INFUSED_HERB)
|
||||
{
|
||||
FloatingTextStringOnCreature("Not casting from an Infused Herb", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int nItemSpellLvl = GetCastSpellCasterLevelFromItem(oItem, nSpellID);
|
||||
if (bPnPHerbs && nItemSpellLvl == -1)
|
||||
{
|
||||
FloatingTextStringOnCreature("Item has no spellcaster level.", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// **CRITICAL: Find the correct class that actually has the spell on its list**
|
||||
int nClassCaster = FindSpellCastingClass(oCaster, nSpellID);
|
||||
|
||||
if(DEBUG) DoDebug("nClassCaster is: " + IntToString(nClassCaster) + ".");
|
||||
|
||||
// Check for valid class
|
||||
if (nClassCaster == -1)
|
||||
{
|
||||
FloatingTextStringOnCreature("No valid class found for this spell.", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if(GetMaxDivineSpellLevel(oCaster, nClassCaster) < 1 )
|
||||
{
|
||||
FloatingTextStringOnCreature("You must be a divine spellcaster to activate an infusion.", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Must have spell on class list - (This will also double-check via the class)
|
||||
if (!GetHasSpellOnClassList(oCaster, nSpellID))
|
||||
{
|
||||
FloatingTextStringOnCreature("You must have a spell on one of your class spell lists to cast it from an infusion.", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Must meet ability requirement: Ability score >= 10 + spell level
|
||||
int nSpellLevel = PRCGetSpellLevelForClass(nSpellID, nClassCaster);
|
||||
int nClassAbility = GetAbilityScoreForClass(nClassCaster, oCaster);
|
||||
|
||||
if(DEBUG) DoDebug("inc_infusion >> DoInfusionUseChecks: nClassCaster is "+IntToString(nClassCaster)+".");
|
||||
if(DEBUG) DoDebug("inc_infusion >> DoInfusionUseChecks: Class nSpellLevel is "+IntToString(nSpellLevel)+".");
|
||||
if(DEBUG) DoDebug("inc_infusion >> DoInfusionUseChecks: nClassAbility is "+IntToString(nClassAbility)+".");
|
||||
|
||||
if (nClassAbility < 10 + nSpellLevel)
|
||||
{
|
||||
FloatingTextStringOnCreature("You must meet ability score requirement to cast spell from infusion.", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Must have a divine caster level at least equal to infusion's caster level
|
||||
int nDivineLvl = GetPrCAdjustedCasterLevelByType(TYPE_DIVINE, oCaster);
|
||||
|
||||
if(DEBUG) DoDebug("inc_infusion >> DoInfusionUseChecks: nDivineLvl is "+IntToString(nDivineLvl)+".");
|
||||
|
||||
if (nDivineLvl < nItemSpellLvl)
|
||||
{
|
||||
FloatingTextStringOnCreature("Your divine caster level is too low to cast this spell from an infusion.", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* int DoInfusionUseChecks(object oCaster, object oItem, int nSpellID)
|
||||
{
|
||||
int bPnPHerbs = GetPRCSwitch(PRC_CREATE_INFUSION_OPTIONAL_HERBS);
|
||||
|
||||
if(GetBaseItemType(oItem) != BASE_ITEM_INFUSED_HERB)
|
||||
{
|
||||
FloatingTextStringOnCreature("Not casting from an Infused Herb", oCaster);
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
int nItemSpellLvl = GetCastSpellCasterLevelFromItem(oItem, nSpellID);
|
||||
if (bPnPHerbs && nItemSpellLvl == -1)
|
||||
{
|
||||
FloatingTextStringOnCreature("Item has no spellcaster level.", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Find relevant class for the spell
|
||||
int nClassCaster = FindSpellCastingClass(oCaster, nSpellID);
|
||||
|
||||
if(DEBUG) DoDebug("nClassCaster is: "+IntToString(nClassCaster)+".");
|
||||
|
||||
if(GetMaxDivineSpellLevel(oCaster, nClassCaster) < 1 )
|
||||
{
|
||||
FloatingTextStringOnCreature("You must be a divine spellcaster to activate an infusion.", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Must have spell on class list
|
||||
if (!GetHasSpellOnClassList(oCaster, nSpellID))
|
||||
{
|
||||
FloatingTextStringOnCreature("You must have a spell on one of your class spell lists to cast it from an infusion.", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Must meet ability requirement: Ability score >= 10 + spell level
|
||||
int nSpellLevel = PRCGetSpellLevelForClass(nSpellID, nClassCaster);
|
||||
int nClassAbility = GetAbilityScoreForClass(nClassCaster, oCaster);
|
||||
|
||||
if(DEBUG) DoDebug("inc_infusion >> DoInfusionUseChecks: nClassCaster is "+IntToString(nClassCaster)+".");
|
||||
if(DEBUG) DoDebug("inc_infusion >> DoInfusionUseChecks: Class nSpellLevel is "+IntToString(nSpellLevel)+".");
|
||||
if(DEBUG) DoDebug("inc_infusion >> DoInfusionUseChecks: nClassAbility is "+IntToString(nClassAbility)+".");
|
||||
|
||||
if (nClassAbility < 10 + nSpellLevel)
|
||||
{
|
||||
FloatingTextStringOnCreature("You must meet ability score requirement to cast spell from infusion.", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Must have a divine caster level at least equal to infusion's caster level
|
||||
int nDivineLvl = GetPrCAdjustedCasterLevelByType(TYPE_DIVINE, oCaster);
|
||||
|
||||
if(DEBUG) DoDebug("inc_infusion >> DoInfusionUseChecks: nDivineLvl is "+IntToString(nDivineLvl)+".");
|
||||
|
||||
if (nDivineLvl < nItemSpellLvl)
|
||||
{
|
||||
FloatingTextStringOnCreature("Your divine caster level is too low to cast this spell from an infusion.", oCaster);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
*/
|
||||
/**
|
||||
* @brief Retrieves the maximum divine spell level known by the caster for a given class.
|
||||
*
|
||||
* This function checks the caster's local integers named "PRC_DivSpell1" through "PRC_DivSpell9"
|
||||
* in descending order to determine the highest divine spell level available.
|
||||
* It returns the highest spell level for which the corresponding local int is false (zero).
|
||||
*
|
||||
* @param oCaster The creature whose divine spell levels are being checked.
|
||||
* @param nClass The class index for which to check the divine spell level (currently unused).
|
||||
*
|
||||
* @return The highest divine spell level known by the caster (1 to 9).
|
||||
*/
|
||||
int GetMaxDivineSpellLevel(object oCaster, int nClass)
|
||||
{
|
||||
int i = 9;
|
||||
for (i; i > 0; i--)
|
||||
{
|
||||
if(!GetLocalInt(oCaster, "PRC_DivSpell"+IntToString(i)))
|
||||
return i;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the spell school of an herb based on its resref by looking it up in the craft_infusion.2da file.
|
||||
*
|
||||
* This function searches the "craft_infusion" 2DA for a row matching the herb's resref.
|
||||
* If found, it returns the corresponding spell school as an integer constant.
|
||||
* If not found or the SpellSchool column is missing/invalid, it returns -1.
|
||||
*
|
||||
* @param oHerb The herb object to check.
|
||||
*
|
||||
* @return The spell school constant corresponding to the herb's infusion spell school,
|
||||
* or -1 if the herb is invalid, not found, or the data is missing.
|
||||
*/
|
||||
int GetHerbsSpellSchool(object oHerb)
|
||||
{
|
||||
if (!GetIsObjectValid(oHerb)) return -1;
|
||||
|
||||
string sResref = GetResRef(oHerb);
|
||||
int nRow = 0;
|
||||
string sRowResref;
|
||||
|
||||
while (nRow < 200)
|
||||
{
|
||||
sRowResref = Get2DACache("craft_infusion", "Resref", nRow);
|
||||
if (sRowResref == "") break;
|
||||
if (sRowResref == sResref)
|
||||
{
|
||||
string sHerbSpellSchool = Get2DAString("craft_infusion", "SpellSchool", nRow);
|
||||
|
||||
if (sHerbSpellSchool == "A") return SPELL_SCHOOL_ABJURATION;
|
||||
else if (sHerbSpellSchool == "C") return SPELL_SCHOOL_CONJURATION;
|
||||
else if (sHerbSpellSchool == "D") return SPELL_SCHOOL_DIVINATION;
|
||||
else if (sHerbSpellSchool == "E") return SPELL_SCHOOL_ENCHANTMENT;
|
||||
else if (sHerbSpellSchool == "V") return SPELL_SCHOOL_EVOCATION;
|
||||
else if (sHerbSpellSchool == "I") return SPELL_SCHOOL_ILLUSION;
|
||||
else if (sHerbSpellSchool == "N") return SPELL_SCHOOL_NECROMANCY;
|
||||
else if (sHerbSpellSchool == "T") return SPELL_SCHOOL_TRANSMUTATION;
|
||||
else return SPELL_SCHOOL_GENERAL;
|
||||
|
||||
return -1;
|
||||
}
|
||||
nRow++;
|
||||
}
|
||||
return -1; // Not found
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the infusion spell level of an herb by matching its resref in the craft_infusion.2da file.
|
||||
*
|
||||
* This function searches the "craft_infusion" 2DA for a row matching the herb's resref.
|
||||
* If found, it returns the spell level from the SpellLevel column as an integer.
|
||||
* If not found or the column is missing, it returns -1.
|
||||
*
|
||||
* @param oHerb The herb object whose infusion spell level is to be retrieved.
|
||||
*
|
||||
* @return The spell level as an integer if found, or -1 if the herb is invalid, not found, or the column is missing.
|
||||
*/
|
||||
int GetHerbsInfusionSpellLevel(object oHerb)
|
||||
{
|
||||
if (!GetIsObjectValid(oHerb)) return -1;
|
||||
|
||||
string sResref = GetResRef(oHerb);
|
||||
int nRow = 0;
|
||||
string sRowResref;
|
||||
|
||||
// Brute-force loop <20> adjust limit if your 2DA has more than 500 rows
|
||||
while (nRow < 200)
|
||||
{
|
||||
sRowResref = Get2DACache("craft_infusion", "Resref", nRow);
|
||||
if (sRowResref == "") break; // End of valid rows
|
||||
if (sRowResref == sResref)
|
||||
{
|
||||
string sSpellLevelStr = Get2DAString("craft_infusion", "SpellLevel", nRow);
|
||||
return StringToInt(sSpellLevelStr);
|
||||
}
|
||||
nRow++;
|
||||
}
|
||||
return -1; // Not found
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Retrieves the caster level of a specific cast-spell item property from an item.
|
||||
*
|
||||
* This function iterates through the item properties of the given item, searching for an
|
||||
* ITEM_PROPERTY_CAST_SPELL_CASTER_LEVEL property that matches the specified spell ID.
|
||||
* If found, it returns the caster level value stored in the item property.
|
||||
*
|
||||
* @param oItem The item object to check.
|
||||
* @param nSpellID The spell ID to match against the item property.
|
||||
*
|
||||
* @return The caster level associated with the matching cast-spell item property,
|
||||
* or -1 if no matching property is found.
|
||||
*/
|
||||
int GetCastSpellCasterLevelFromItem(object oItem, int nSpellID)
|
||||
{
|
||||
int nFoundCL = -1;
|
||||
|
||||
itemproperty ip = GetFirstItemProperty(oItem);
|
||||
while (GetIsItemPropertyValid(ip))
|
||||
{
|
||||
int nType = GetItemPropertyType(ip);
|
||||
|
||||
// First preference: PRC's CASTER_LEVEL itemprop
|
||||
if (nType == ITEM_PROPERTY_CAST_SPELL_CASTER_LEVEL)
|
||||
{
|
||||
int nSubType = GetItemPropertySubType(ip);
|
||||
string sSpellIDStr = Get2DAString("iprp_spells", "SpellIndex", nSubType);
|
||||
int nSubSpellID = StringToInt(sSpellIDStr);
|
||||
|
||||
if (nSubSpellID == nSpellID)
|
||||
{
|
||||
return GetItemPropertyCostTableValue(ip); // Found exact CL
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback: vanilla CAST_SPELL property
|
||||
if (nType == ITEM_PROPERTY_CAST_SPELL && nFoundCL == -1)
|
||||
{
|
||||
int nSubType = GetItemPropertySubType(ip);
|
||||
string sSpellIDStr = Get2DAString("iprp_spells", "SpellIndex", nSubType);
|
||||
int nSubSpellID = StringToInt(sSpellIDStr);
|
||||
|
||||
if (nSubSpellID == nSpellID)
|
||||
{
|
||||
// Vanilla uses CostTableValue for *number of uses*, not CL,
|
||||
// so we<77>ll assume default caster level = spell level * 2 - 1
|
||||
int nSpellLevel = StringToInt(Get2DAString("spells", "Innate", nSubSpellID));
|
||||
nFoundCL = nSpellLevel * 2 - 1; // default NWN caster level rule
|
||||
}
|
||||
}
|
||||
|
||||
ip = GetNextItemProperty(oItem);
|
||||
}
|
||||
|
||||
return nFoundCL; // -1 if not found
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Checks if a given spell ID is present on the specified class's spell list for the caster.
|
||||
*
|
||||
* This function determines the spell level of the spell for the given class using PRCGetSpellLevelForClass.
|
||||
* If the spell level is -1, the spell is not on the class's spell list.
|
||||
* Otherwise, the spell is considered to be on the class spell list.
|
||||
*
|
||||
* @param oCaster The creature object casting or querying the spell.
|
||||
* @param nSpellID The spell ID to check.
|
||||
* @param nClass The class index to check the spell list against.
|
||||
*
|
||||
* @return TRUE if the spell is on the class's spell list; FALSE otherwise.
|
||||
*/
|
||||
int GetIsClassSpell(object oCaster, int nSpellID, int nClass)
|
||||
{
|
||||
if(DEBUG) DoDebug("inc_infusion >> GetIsClassSpell: nSpellID is: "+IntToString(nSpellID)+".");
|
||||
if(DEBUG) DoDebug("inc_infusion >> GetIsClassSpell: nClass is: "+IntToString(nClass)+".");
|
||||
|
||||
int nSpellLevel = PRCGetSpellLevelForClass(nSpellID, nClass);
|
||||
if (nSpellLevel == -1)
|
||||
{
|
||||
if(DEBUG) DoDebug("inc_infusion >> GetIsClassSpell: SpellLevel is "+IntToString(nSpellLevel)+".");
|
||||
if(DEBUG) DoDebug("inc_infusion >> GetIsClassSpell: Spell "+IntToString(nSpellID)+" is not in spelllist of "+IntToString(nClass)+".");
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Checks if the caster has the specified spell on any of their class spell lists.
|
||||
*
|
||||
* This function iterates through all classes the caster has (up to position 8),
|
||||
* and returns TRUE if the spell is found on any class's spell list.
|
||||
*
|
||||
* @param oCaster The creature object to check.
|
||||
* @param nSpellID The spell ID to search for.
|
||||
*
|
||||
* @return TRUE if the spell is present on at least one of the caster's class spell lists;
|
||||
* FALSE otherwise.
|
||||
*/
|
||||
int GetHasSpellOnClassList(object oCaster, int nSpellID)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i <= 8; i++)
|
||||
{
|
||||
int nClass = GetClassByPosition(i, oCaster);
|
||||
if (nClass == CLASS_TYPE_INVALID) continue;
|
||||
|
||||
if (GetIsClassSpell(oCaster, nSpellID, nClass))
|
||||
{
|
||||
if(DEBUG) DoDebug("inc_infusion >> GetHasSpellOnClassList: Class spell found.");
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
if(DEBUG) DoDebug("inc_infusion >> GetHasSpellOnClassList: Class spell not found.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Applies a poison nausea effect to the user when infusion use fails.
|
||||
*
|
||||
* This function performs an immediate Fortitude saving throw against poison DC based on infusion caster level.
|
||||
* If the user fails and is not immune to poison, an infusion nausea effect is applied, replacing any existing one.
|
||||
* A second saving throw is scheduled after 1 minute to attempt to remove the effect.
|
||||
*
|
||||
* @param oUser The creature who used the infusion and may be poisoned.
|
||||
* @param nInfusionCL The caster level of the infusion used, affecting the DC of the saving throw.
|
||||
*/
|
||||
void ApplyInfusionPoison(object oUser, int nInfusionCL)
|
||||
{
|
||||
int nDC = 10 + (nInfusionCL / 2);
|
||||
int bImmune = GetIsImmune(oUser, IMMUNITY_TYPE_POISON);
|
||||
|
||||
// First save immediately
|
||||
if (!bImmune && !PRCMySavingThrow(SAVING_THROW_FORT, oUser, nDC, SAVING_THROW_TYPE_POISON))
|
||||
{
|
||||
// Remove existing infusion poison nausea effect before applying new
|
||||
effect eOld = GetFirstEffect(oUser);
|
||||
while (GetIsEffectValid(eOld))
|
||||
{
|
||||
if (GetEffectTag(eOld) == "INFUSION_POISON_TAG")
|
||||
{
|
||||
RemoveEffect(oUser, eOld);
|
||||
break; // Assuming only one effect with this tag
|
||||
}
|
||||
eOld = GetNextEffect(oUser);
|
||||
}
|
||||
|
||||
effect eNausea = EffectNausea(oUser, 60.0f);
|
||||
|
||||
TagEffect(eNausea, "INFUSION_POISON_TAG");
|
||||
FloatingTextStringOnCreature("The infusion has made you nauseous.", oUser);
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eNausea, oUser, RoundsToSeconds(10));
|
||||
}
|
||||
|
||||
// Second save 1 minute later
|
||||
if (!bImmune)
|
||||
{
|
||||
DelayCommand(60.0, InfusionSecondSave(oUser, nDC));
|
||||
}
|
||||
}
|
||||
|
||||
void InfusionSecondSave(object oUser, int nDC)
|
||||
{
|
||||
if (!PRCMySavingThrow(SAVING_THROW_FORT, oUser, nDC, SAVING_THROW_TYPE_POISON))
|
||||
{
|
||||
FloatingTextStringOnCreature("The infusion has made you nauseous.", oUser);
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectNausea(oUser, 60.0f), oUser, RoundsToSeconds(10));
|
||||
}
|
||||
}
|
||||
|
||||
//:: void main (){}
|
||||
@@ -1643,7 +1643,60 @@ int GetIsMagicItem(object oItem)
|
||||
int FeatToIprop(int nFeat)
|
||||
{
|
||||
switch(nFeat)
|
||||
{//: Weapon Focus
|
||||
{
|
||||
//:: Weapon Proficiencies
|
||||
case FEAT_WEAPON_PROFICIENCY_SHORTSWORD: return IP_CONST_FEAT_WEAPON_PROFICIENCY_SHORTSWORD;
|
||||
case FEAT_WEAPON_PROFICIENCY_LONGSWORD: return IP_CONST_FEAT_WEAPON_PROFICIENCY_LONGSWORD;
|
||||
case FEAT_WEAPON_PROFICIENCY_BATTLEAXE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_BATTLEAXE;
|
||||
case FEAT_WEAPON_PROFICIENCY_BASTARD_SWORD: return IP_CONST_FEAT_WEAPON_PROFICIENCY_BASTARD_SWORD;
|
||||
case FEAT_WEAPON_PROFICIENCY_LIGHT_FLAIL: return IP_CONST_FEAT_WEAPON_PROFICIENCY_LIGHT_FLAIL;
|
||||
case FEAT_WEAPON_PROFICIENCY_WARHAMMER: return IP_CONST_FEAT_WEAPON_PROFICIENCY_WARHAMMER;
|
||||
case FEAT_WEAPON_PROFICIENCY_LONGBOW: return IP_CONST_FEAT_WEAPON_PROFICIENCY_LONGBOW;
|
||||
case FEAT_WEAPON_PROFICIENCY_LIGHT_MACE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_LIGHT_MACE;
|
||||
case FEAT_WEAPON_PROFICIENCY_HALBERD: return IP_CONST_FEAT_WEAPON_PROFICIENCY_HALBERD;
|
||||
case FEAT_WEAPON_PROFICIENCY_SHORTBOW: return IP_CONST_FEAT_WEAPON_PROFICIENCY_SHORTBOW;
|
||||
case FEAT_WEAPON_PROFICIENCY_TWO_BLADED_SWORD: return IP_CONST_FEAT_WEAPON_PROFICIENCY_TWO_BLADED_SWORD;
|
||||
case FEAT_WEAPON_PROFICIENCY_GREATSWORD: return IP_CONST_FEAT_WEAPON_PROFICIENCY_GREATSWORD;
|
||||
case FEAT_WEAPON_PROFICIENCY_GREATAXE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_GREATAXE;
|
||||
case FEAT_WEAPON_PROFICIENCY_DART: return IP_CONST_FEAT_WEAPON_PROFICIENCY_DART;
|
||||
case FEAT_WEAPON_PROFICIENCY_DIRE_MACE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_DIRE_MACE;
|
||||
case FEAT_WEAPON_PROFICIENCY_DOUBLE_AXE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_DOUBLE_AXE;
|
||||
case FEAT_WEAPON_PROFICIENCY_HEAVY_FLAIL: return IP_CONST_FEAT_WEAPON_PROFICIENCY_HEAVY_FLAIL;
|
||||
case FEAT_WEAPON_PROFICIENCY_LIGHT_HAMMER: return IP_CONST_FEAT_WEAPON_PROFICIENCY_LIGHT_HAMMER;
|
||||
case FEAT_WEAPON_PROFICIENCY_HANDAXE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_HANDAXE;
|
||||
case FEAT_WEAPON_PROFICIENCY_KAMA: return IP_CONST_FEAT_WEAPON_PROFICIENCY_KAMA;
|
||||
case FEAT_WEAPON_PROFICIENCY_KATANA: return IP_CONST_FEAT_WEAPON_PROFICIENCY_KATANA;
|
||||
case FEAT_WEAPON_PROFICIENCY_KUKRI: return IP_CONST_FEAT_WEAPON_PROFICIENCY_KUKRI;
|
||||
case FEAT_WEAPON_PROFICIENCY_MORNINGSTAR: return IP_CONST_FEAT_WEAPON_PROFICIENCY_MORNINGSTAR;
|
||||
case FEAT_WEAPON_PROFICIENCY_RAPIER: return IP_CONST_FEAT_WEAPON_PROFICIENCY_RAPIER;
|
||||
case FEAT_WEAPON_PROFICIENCY_SCIMITAR: return IP_CONST_FEAT_WEAPON_PROFICIENCY_SCIMITAR;
|
||||
case FEAT_WEAPON_PROFICIENCY_SCYTHE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_SCYTHE;
|
||||
case FEAT_WEAPON_PROFICIENCY_SHORTSPEAR: return IP_CONST_FEAT_WEAPON_PROFICIENCY_SHORTSPEAR;
|
||||
case FEAT_WEAPON_PROFICIENCY_SHURIKEN: return IP_CONST_FEAT_WEAPON_PROFICIENCY_SHURIKEN;
|
||||
case FEAT_WEAPON_PROFICIENCY_SICKLE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_SICKLE;
|
||||
case FEAT_WEAPON_PROFICIENCY_SLING: return IP_CONST_FEAT_WEAPON_PROFICIENCY_SLING;
|
||||
case FEAT_WEAPON_PROFICIENCY_THROWING_AXE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_THROWING_AXE;
|
||||
case FEAT_WEAPON_PROFICIENCY_TRIDENT: return IP_CONST_FEAT_WEAPON_PROFICIENCY_TRIDENT;
|
||||
case FEAT_WEAPON_PROFICIENCY_DWARVEN_WARAXE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_DWARVEN_WARAXE;
|
||||
case FEAT_WEAPON_PROFICIENCY_WHIP: return IP_CONST_FEAT_WEAPON_PROFICIENCY_WHIP;
|
||||
case FEAT_WEAPON_PROFICIENCY_ELVEN_LIGHTBLADE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_ELVEN_LIGHTBLADE;
|
||||
case FEAT_WEAPON_PROFICIENCY_ELVEN_THINBLADE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_ELVEN_THINBLADE;
|
||||
case FEAT_WEAPON_PROFICIENCY_ELVEN_COURTBLADE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_ELVEN_COURTBLADE;
|
||||
case FEAT_WEAPON_PROFICIENCY_LIGHT_LANCE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_LIGHT_LANCE;
|
||||
case FEAT_WEAPON_PROFICIENCY_HEAVY_PICK: return IP_CONST_FEAT_WEAPON_PROFICIENCY_HEAVY_PICK;
|
||||
case FEAT_WEAPON_PROFICIENCY_LIGHT_PICK: return IP_CONST_FEAT_WEAPON_PROFICIENCY_LIGHT_PICK;
|
||||
case FEAT_WEAPON_PROFICIENCY_SAI: return IP_CONST_FEAT_WEAPON_PROFICIENCY_SAI;
|
||||
case FEAT_WEAPON_PROFICIENCY_NUNCHAKU: return IP_CONST_FEAT_WEAPON_PROFICIENCY_NUNCHAKU;
|
||||
case FEAT_WEAPON_PROFICIENCY_FALCHION: return IP_CONST_FEAT_WEAPON_PROFICIENCY_FALCHION;
|
||||
case FEAT_WEAPON_PROFICIENCY_SAP: return IP_CONST_FEAT_WEAPON_PROFICIENCY_SAP;
|
||||
case FEAT_WEAPON_PROFICIENCY_KATAR: return IP_CONST_FEAT_WEAPON_PROFICIENCY_KATAR;
|
||||
case FEAT_WEAPON_PROFICIENCY_HEAVY_MACE: return IP_CONST_FEAT_WEAPON_PROFICIENCY_HEAVY_MACE;
|
||||
case FEAT_WEAPON_PROFICIENCY_MAUL: return IP_CONST_FEAT_WEAPON_PROFICIENCY_MAUL;
|
||||
case FEAT_WEAPON_PROFICIENCY_DOUBLE_SCIMITAR: return IP_CONST_FEAT_WEAPON_PROFICIENCY_DOUBLE_SCIMITAR;
|
||||
case FEAT_WEAPON_PROFICIENCY_GOAD: return IP_CONST_FEAT_WEAPON_PROFICIENCY_GOAD;
|
||||
case FEAT_WEAPON_PROFICIENCY_EAGLE_CLAW: return IP_CONST_FEAT_WEAPON_PROFICIENCY_EAGLE_CLAW;
|
||||
|
||||
//: Weapon Focus
|
||||
case FEAT_WEAPON_FOCUS_BASTARD_SWORD: return IP_CONST_FEAT_WEAPON_FOCUS_BASTARD_SWORD;
|
||||
case FEAT_WEAPON_FOCUS_BATTLE_AXE: return IP_CONST_FEAT_WEAPON_FOCUS_BATTLE_AXE;
|
||||
case FEAT_WEAPON_FOCUS_CLUB: return IP_CONST_FEAT_WEAPON_FOCUS_CLUB;
|
||||
|
||||
@@ -242,25 +242,27 @@ void SetupLookupStage(object oMod, int n)
|
||||
case 11: SetLkupStage(n, oMod, CLASS_TYPE_DRAGON_SHAMAN, "cls_inv_drgshm"); break;
|
||||
case 12: SetLkupStage(n, oMod, CLASS_TYPE_WARLOCK, "cls_inv_warlok"); break;
|
||||
case 13: SetLkupStage(n, oMod, CLASS_TYPE_ARCHIVIST, "cls_spell_archv"); break;
|
||||
case 14: SetLkupStage(n, oMod, CLASS_TYPE_ASSASSIN, "cls_spell_asasin"); break;
|
||||
case 15: SetLkupStage(n, oMod, CLASS_TYPE_BARD, "cls_spell_bard"); break;
|
||||
case 16: SetLkupStage(n, oMod, CLASS_TYPE_BEGUILER, "cls_spell_beguil"); break;
|
||||
case 17: SetLkupStage(n, oMod, CLASS_TYPE_DREAD_NECROMANCER, "cls_spell_dnecro"); break;
|
||||
case 18: SetLkupStage(n, oMod, CLASS_TYPE_DUSKBLADE, "cls_spell_duskbl"); break;
|
||||
case 19: SetLkupStage(n, oMod, CLASS_TYPE_FAVOURED_SOUL, "cls_spell_favsol"); break;
|
||||
case 20: SetLkupStage(n, oMod, CLASS_TYPE_HARPER, "cls_spell_harper"); break;
|
||||
case 21: SetLkupStage(n, oMod, CLASS_TYPE_HEXBLADE, "cls_spell_hexbl"); break;
|
||||
case 22: SetLkupStage(n, oMod, CLASS_TYPE_JUSTICEWW, "cls_spell_justww"); break;
|
||||
case 23: SetLkupStage(n, oMod, CLASS_TYPE_SORCERER, "cls_spell_sorc"); break;
|
||||
case 24: SetLkupStage(n, oMod, CLASS_TYPE_SUBLIME_CHORD, "cls_spell_schord"); break;
|
||||
case 25: SetLkupStage(n, oMod, CLASS_TYPE_SUEL_ARCHANAMACH, "cls_spell_suel"); break;
|
||||
case 26: SetLkupStage(n, oMod, CLASS_TYPE_VIGILANT, "cls_spell_vigil"); break;
|
||||
case 27: SetLkupStage(n, oMod, CLASS_TYPE_WARMAGE, "cls_spell_wrmage"); break;
|
||||
case 28: SetLkupStage(n, oMod, CLASS_TYPE_KNIGHT_WEAVE, "cls_spell_kngtwv"); break;
|
||||
case 29: SetLkupStage(n, oMod, CLASS_TYPE_PSYCHIC_ROGUE, "cls_psipw_psyrog"); break;
|
||||
case 30: SetLkupStage(n, oMod, CLASS_TYPE_SHADOWCASTER, "cls_myst_shdcst"); break;
|
||||
case 31: SetLkupStage(n, oMod, CLASS_TYPE_SHADOWSMITH, "cls_myst_shdsmt"); break;
|
||||
case 32: SetLkupStage(n, oMod, CLASS_TYPE_CELEBRANT_SHARESS, "cls_spell_sharss"); break;
|
||||
case 14: SetLkupStage(n, oMod, CLASS_TYPE_BARD, "cls_spell_bard"); break;
|
||||
case 15: SetLkupStage(n, oMod, CLASS_TYPE_BEGUILER, "cls_spell_beguil"); break;
|
||||
case 16: SetLkupStage(n, oMod, CLASS_TYPE_DREAD_NECROMANCER, "cls_spell_dnecro"); break;
|
||||
case 17: SetLkupStage(n, oMod, CLASS_TYPE_DUSKBLADE, "cls_spell_duskbl"); break;
|
||||
case 18: SetLkupStage(n, oMod, CLASS_TYPE_FAVOURED_SOUL, "cls_spell_favsol"); break;
|
||||
case 19: SetLkupStage(n, oMod, CLASS_TYPE_HARPER, "cls_spell_harper"); break;
|
||||
case 20: SetLkupStage(n, oMod, CLASS_TYPE_HEXBLADE, "cls_spell_hexbl"); break;
|
||||
case 21: SetLkupStage(n, oMod, CLASS_TYPE_JUSTICEWW, "cls_spell_justww"); break;
|
||||
case 22: SetLkupStage(n, oMod, CLASS_TYPE_SORCERER, "cls_spell_sorc"); break;
|
||||
case 23: SetLkupStage(n, oMod, CLASS_TYPE_SUBLIME_CHORD, "cls_spell_schord"); break;
|
||||
case 24: SetLkupStage(n, oMod, CLASS_TYPE_SUEL_ARCHANAMACH, "cls_spell_suel"); break;
|
||||
case 25: SetLkupStage(n, oMod, CLASS_TYPE_VIGILANT, "cls_spell_vigil"); break;
|
||||
case 26: SetLkupStage(n, oMod, CLASS_TYPE_WARMAGE, "cls_spell_wrmage"); break;
|
||||
case 27: SetLkupStage(n, oMod, CLASS_TYPE_KNIGHT_WEAVE, "cls_spell_kngtwv"); break;
|
||||
case 28: SetLkupStage(n, oMod, CLASS_TYPE_PSYCHIC_ROGUE, "cls_psipw_psyrog"); break;
|
||||
case 29: SetLkupStage(n, oMod, CLASS_TYPE_SHADOWCASTER, "cls_myst_shdcst"); break;
|
||||
case 30: SetLkupStage(n, oMod, CLASS_TYPE_SHADOWSMITH, "cls_myst_shdsmt"); break;
|
||||
case 31: SetLkupStage(n, oMod, CLASS_TYPE_CELEBRANT_SHARESS, "cls_spell_sharss"); break;
|
||||
|
||||
//:: These were all moved to the Bioware spellbooks -Jaysyn
|
||||
//case 14: SetLkupStage(n, oMod, CLASS_TYPE_ASSASSIN, "cls_spell_asasin"); break;
|
||||
//case 46: SetLkupStage(n, oMod, CLASS_TYPE_CULTIST_SHATTERED_PEAK, "cls_spell_cultst"); break;
|
||||
//case 40: SetLkupStage(n, oMod, CLASS_TYPE_NENTYAR_HUNTER, "cls_spell_hunter"); break;
|
||||
//case 28: SetLkupStage(n, oMod, CLASS_TYPE_SHADOWLORD, "cls_spell_tfshad"); break;
|
||||
@@ -528,7 +530,7 @@ int SpellToSpellbookID(int nSpell)
|
||||
int nOutSpellID = GetLocalInt(oWP, /*"PRC_GetRowFromSpellID_" + */IntToString(nSpell));
|
||||
if(nOutSpellID == 0)
|
||||
nOutSpellID = -1;
|
||||
//if(DEBUG) DoDebug("SpellToSpellbookID(" + IntToString(nSpell) + ", " + sFile + ") = " + IntToString(nOutSpellID));
|
||||
if(DEBUG) DoDebug("inc_lookup >> SpellToSpellbookID: (nSpell: " + IntToString(nSpell) + ") = nOutSpellID: " + IntToString(nOutSpellID));
|
||||
return nOutSpellID;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ Make cls_spcr_*.2da
|
||||
Make blank cls_spell_*.2da
|
||||
Add cls_spgn_*.2da to classes.2da
|
||||
Add class entry in prc_classes.2da
|
||||
Add the spellbook feat (#1999) to cls_feat_*.2da at the appropriate level
|
||||
Add the spellbook feat (#1999) to cls_feat_*.2da at the appropriate level (not needed for NWN:EE)
|
||||
Add class to PRCGetSpellSaveDC() in prc_add_spell_dc
|
||||
Add class to GetSpellbookTypeForClass() below
|
||||
Add class to GetAbilityScoreForClass() below
|
||||
@@ -20,6 +20,8 @@ Add class to GetCasterLvl() in prc_inc_spells
|
||||
Add Practiced Spellcaster feat to feat.2da and to PracticedSpellcasting() in prc_inc_castlvl
|
||||
Run the assemble_spellbooks.bat file
|
||||
Make the prc_* scripts in newspellbook. The filenames can be found under the spell entries for the class in spells.2da.
|
||||
Update the fileends for all relevant files in inc_switch_setup
|
||||
Delete prc_data in the \database\ folder before testing new spells.
|
||||
|
||||
Spont:
|
||||
Make cls_spgn_*.2da
|
||||
@@ -41,6 +43,8 @@ Add class to prc_amagsys_gain if(CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, Mi
|
||||
Add class to ExecuteScript("prc_amagsys_gain", oPC) list in EvalPRCFeats in prc_inc_function
|
||||
Run the assemble_spellbooks.bat file
|
||||
Make the prc_* scripts in newspellbook
|
||||
Update the fileends for all relevant files in inc_switch_setup
|
||||
Delete prc_data in the \database\ folder before testing new spells.
|
||||
|
||||
prc_classes.2da entry:
|
||||
Label - name for the class
|
||||
@@ -104,11 +108,10 @@ void ProcessPreparedSpellLevel(object oPC, int nClass, int nSpellLevel, int nLev
|
||||
//#include "prc_effect_inc" //access via prc_inc_core
|
||||
//#include "inc_lookups" //access via prc_inc_core
|
||||
#include "prc_inc_core"
|
||||
#include "inc_sp_gain_mem" //providing child access to prc_inc_core
|
||||
//Must load in this order.
|
||||
#include "inc_sp_gain_mem"
|
||||
//#include "prc_inc_castlvl" //access via prc_inc_core
|
||||
//#include "prc_inc_descrptr" //access via prc_inc_core
|
||||
|
||||
#include "inc_item_props"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Function definitions */
|
||||
@@ -119,6 +122,7 @@ int GetSpellbookTypeForClass(int nClass)
|
||||
switch(nClass)
|
||||
{
|
||||
case CLASS_TYPE_ARCHIVIST:
|
||||
case CLASS_TYPE_ASSASSIN:
|
||||
case CLASS_TYPE_BLACKGUARD:
|
||||
case CLASS_TYPE_BLIGHTER:
|
||||
case CLASS_TYPE_CLERIC:
|
||||
@@ -141,7 +145,6 @@ int GetSpellbookTypeForClass(int nClass)
|
||||
case CLASS_TYPE_VIGILANT:
|
||||
case CLASS_TYPE_WIZARD:
|
||||
return SPELLBOOK_TYPE_PREPARED;
|
||||
case CLASS_TYPE_ASSASSIN:
|
||||
case CLASS_TYPE_BARD:
|
||||
case CLASS_TYPE_BEGUILER:
|
||||
case CLASS_TYPE_CELEBRANT_SHARESS:
|
||||
@@ -559,7 +562,7 @@ int bKnowsAllClassSpells(int nClass)
|
||||
{
|
||||
//case CLASS_TYPE_WIZARD:
|
||||
case CLASS_TYPE_ARCHIVIST:
|
||||
case CLASS_TYPE_ASSASSIN:
|
||||
//case CLASS_TYPE_ASSASSIN:
|
||||
case CLASS_TYPE_BARD:
|
||||
case CLASS_TYPE_CELEBRANT_SHARESS:
|
||||
case CLASS_TYPE_CULTIST_SHATTERED_PEAK:
|
||||
@@ -580,7 +583,79 @@ int bKnowsAllClassSpells(int nClass)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
int GetSpellKnownMaxCount(int nLevel, int nSpellLevel, int nClass, object oPC)
|
||||
{
|
||||
// If the character doesn't have any spell slots available on for this level, it can't know any spells of that level either
|
||||
if(!GetSlotCount(nLevel, nSpellLevel, GetAbilityScoreForClass(nClass, oPC), nClass))
|
||||
{
|
||||
if(DEBUG) DoDebug("GetSpellKnownMaxCount: No slots available for " + IntToString(nClass) + " level " + IntToString(nLevel) + " circle " + IntToString(nSpellLevel));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nKnown;
|
||||
string sFile = Get2DACache("classes", "SpellKnownTable", nClass);
|
||||
string sKnown = Get2DACache(sFile, "SpellLevel" + IntToString(nSpellLevel), nLevel - 1);
|
||||
|
||||
if(DEBUG)
|
||||
{
|
||||
DoDebug("GetSpellKnownMaxCount Details:");
|
||||
DoDebug("- Class: " + IntToString(nClass));
|
||||
DoDebug("- Passed Level: " + IntToString(nLevel));
|
||||
DoDebug("- Base Class Level: " + IntToString(GetLevelByClass(nClass, oPC)));
|
||||
DoDebug("- Effective Level: " + IntToString(GetSpellslotLevel(nClass, oPC)));
|
||||
DoDebug("- Spell Level: " + IntToString(nSpellLevel));
|
||||
DoDebug("- SpellKnownTable: " + sFile);
|
||||
DoDebug("- MaxKnown from 2DA: " + sKnown);
|
||||
}
|
||||
|
||||
if(sKnown == "")
|
||||
{
|
||||
nKnown = -1;
|
||||
if(DEBUG) DoDebug("GetSpellKnownMaxCount: Problem getting known numbers");
|
||||
}
|
||||
else
|
||||
nKnown = StringToInt(sKnown);
|
||||
|
||||
if(nKnown == -1)
|
||||
return 0;
|
||||
|
||||
// COMPLETELY REWROTE THIS SECTION
|
||||
// Bard and Sorcerer logic for prestige class advancement
|
||||
if(nClass == CLASS_TYPE_SORCERER || nClass == CLASS_TYPE_BARD)
|
||||
{
|
||||
int baseClassLevel = GetLevelByClass(nClass, oPC);
|
||||
int effectiveLevel = GetSpellslotLevel(nClass, oPC);
|
||||
|
||||
// Debug the values we're checking
|
||||
if(DEBUG)
|
||||
{
|
||||
DoDebug("Spont caster check - Base level: " + IntToString(baseClassLevel) +
|
||||
", Effective level: " + IntToString(effectiveLevel));
|
||||
}
|
||||
|
||||
// If they have prestige class advancement OR special feats, they should get spells
|
||||
if(effectiveLevel > baseClassLevel ||
|
||||
GetHasFeat(FEAT_DRACONIC_GRACE, oPC) ||
|
||||
GetHasFeat(FEAT_DRACONIC_BREATH, oPC))
|
||||
{
|
||||
// Allow them to get spells - do nothing here, return nKnown at the end
|
||||
if(DEBUG) DoDebug("Spontaneous caster eligible for new spells");
|
||||
}
|
||||
else
|
||||
{
|
||||
// No advancement, no special feats - no new spells
|
||||
if(DEBUG) DoDebug("Spontaneous caster NOT eligible for new spells");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if(DEBUG) DoDebug("Final spell known count: " + IntToString(nKnown));
|
||||
return nKnown;
|
||||
}
|
||||
|
||||
|
||||
/* int GetSpellKnownMaxCount(int nLevel, int nSpellLevel, int nClass, object oPC)
|
||||
{
|
||||
// If the character doesn't have any spell slots available on for this level, it can't know any spells of that level either
|
||||
// @todo Check rules. There might be cases where this doesn't hold
|
||||
@@ -588,22 +663,9 @@ int GetSpellKnownMaxCount(int nLevel, int nSpellLevel, int nClass, object oPC)
|
||||
return 0;
|
||||
int nKnown;
|
||||
string sFile;
|
||||
// Bioware casters use their classes.2da-specified tables
|
||||
/*if( nClass == CLASS_TYPE_WIZARD
|
||||
|| nClass == CLASS_TYPE_SORCERER
|
||||
|| nClass == CLASS_TYPE_BARD
|
||||
|| nClass == CLASS_TYPE_CLERIC
|
||||
|| nClass == CLASS_TYPE_DRUID
|
||||
|| nClass == CLASS_TYPE_PALADIN
|
||||
|| nClass == CLASS_TYPE_RANGER)
|
||||
{*/
|
||||
sFile = Get2DACache("classes", "SpellKnownTable", nClass);
|
||||
/*}
|
||||
else
|
||||
{
|
||||
sFile = Get2DACache("classes", "FeatsTable", nClass);
|
||||
sFile = "cls_spkn" + GetStringRight(sFile, GetStringLength(sFile) - 8); // Hardcoded the cls_ part. It's not as if any class uses some other prefix - Ornedan, 20061231
|
||||
}*/
|
||||
|
||||
sFile = Get2DACache("classes", "SpellKnownTable", nClass);
|
||||
|
||||
|
||||
string sKnown = Get2DACache(sFile, "SpellLevel" + IntToString(nSpellLevel), nLevel - 1);
|
||||
if(DEBUG) DoDebug("GetSpellKnownMaxCount(" + IntToString(nLevel) + ", " + IntToString(nSpellLevel) + ", " + IntToString(nClass) + ", " + GetName(oPC) + ") = " + sKnown);
|
||||
@@ -626,6 +688,7 @@ int GetSpellKnownMaxCount(int nLevel, int nSpellLevel, int nClass, object oPC)
|
||||
}
|
||||
return nKnown;
|
||||
}
|
||||
*/
|
||||
|
||||
int GetSpellKnownCurrentCount(object oPC, int nSpellLevel, int nClass)
|
||||
{
|
||||
@@ -693,6 +756,44 @@ int GetSpellKnownCurrentCount(object oPC, int nSpellLevel, int nClass)
|
||||
}
|
||||
|
||||
int GetSpellUnknownCurrentCount(object oPC, int nSpellLevel, int nClass)
|
||||
{
|
||||
// Get the lookup token created by MakeSpellbookLevelLoop()
|
||||
string sTag = "SpellLvl_" + IntToString(nClass) + "_Level_" + IntToString(nSpellLevel);
|
||||
object oCache = GetObjectByTag(sTag);
|
||||
if(!GetIsObjectValid(oCache))
|
||||
{
|
||||
if(DEBUG) DoDebug("GetSpellUnknownCurrentCount: " + sTag + " is not valid");
|
||||
|
||||
// Add code to create the missing lookup object
|
||||
if(DEBUG) DoDebug("Attempting to create missing spell lookup token");
|
||||
ExecuteScript("prc_create_spellb", oPC);
|
||||
|
||||
// Try again after creating it
|
||||
oCache = GetObjectByTag(sTag);
|
||||
if(!GetIsObjectValid(oCache))
|
||||
{
|
||||
if(DEBUG) DoDebug("Still couldn't create spell lookup token");
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(DEBUG) DoDebug("Successfully created spell lookup token");
|
||||
}
|
||||
}
|
||||
|
||||
// Read the total number of spells on the given level and determine how many are already known
|
||||
int nTotal = array_get_size(oCache, "Lkup");
|
||||
int nKnown = GetSpellKnownCurrentCount(oPC, nSpellLevel, nClass);
|
||||
int nUnknown = nTotal - nKnown;
|
||||
|
||||
if(DEBUG) DoDebug("GetSpellUnknownCurrentCount(" + GetName(oPC) + ", " + IntToString(nSpellLevel) + ", " + IntToString(nClass) + ") = " + IntToString(nUnknown));
|
||||
if(DEBUG) DoDebug(" Total spells in lookup: " + IntToString(nTotal) + ", Known spells: " + IntToString(nKnown));
|
||||
|
||||
return nUnknown;
|
||||
}
|
||||
|
||||
|
||||
/* int GetSpellUnknownCurrentCount(object oPC, int nSpellLevel, int nClass)
|
||||
{
|
||||
// Get the lookup token created by MakeSpellbookLevelLoop()
|
||||
string sTag = "SpellLvl_" + IntToString(nClass) + "_Level_" + IntToString(nSpellLevel);
|
||||
@@ -709,7 +810,7 @@ int GetSpellUnknownCurrentCount(object oPC, int nSpellLevel, int nClass)
|
||||
|
||||
if(DEBUG) DoDebug("GetSpellUnknownCurrentCount(" + GetName(oPC) + ", " + IntToString(nSpellLevel) + ", " + IntToString(nClass) + ") = " + IntToString(nUnknown));
|
||||
return nUnknown;
|
||||
}
|
||||
} */
|
||||
|
||||
void AddSpellUse(object oPC, int nSpellbookID, int nClass, string sFile, string sArrayName, int nSpellbookType, object oSkin, int nFeatID, int nIPFeatID, string sIDX = "")
|
||||
{
|
||||
@@ -850,7 +951,7 @@ void SetupSpells(object oPC, int nClass)
|
||||
int nAbility = GetAbilityScoreForClass(nClass, oPC);
|
||||
int nSpellbookType = GetSpellbookTypeForClass(nClass);
|
||||
|
||||
if(DEBUG) DoDebug("SetupSpells\n"
|
||||
if(DEBUG) DoDebug("SetupSpells()\n"
|
||||
+ "nClass = " + IntToString(nClass) + "\n"
|
||||
+ "nSpellslotLevel = " + IntToString(nLevel) + "\n"
|
||||
+ "nAbility = " + IntToString(nAbility) + "\n"
|
||||
@@ -1178,7 +1279,7 @@ void CastSpontaneousSpell(int nClass, int bInstantSpell = FALSE)
|
||||
else if(GetLocalInt(OBJECT_SELF, "PRC_metamagic_state") == 1)
|
||||
SetLocalInt(OBJECT_SELF, "MetamagicFeatAdjust", 0);
|
||||
}
|
||||
|
||||
if (DEBUG) DoDebug("CastSpontaneousSpell(): nSpellLevel is: "+IntToString(nSpellLevel)+".");
|
||||
CheckSpontSlots(nClass, nSpellID, nSpellLevel);
|
||||
if(GetLocalInt(OBJECT_SELF, "NSB_Cast"))
|
||||
ActionDoCommand(CheckSpontSlots(nClass, nSpellID, nSpellLevel, TRUE));
|
||||
@@ -1330,6 +1431,8 @@ void NewSpellbookSpell(int nClass, int nSpellbookType, int nMetamagic = METAMAGI
|
||||
|
||||
string sFile = GetFileForClass(nClass);
|
||||
int nSpellLevel = StringToInt(Get2DACache(sFile, "Level", nSpellbookID));
|
||||
|
||||
if (DEBUG) DoDebug("inc_newspellbook >> NewSpellbookSpell(): nSpellbookType is: "+IntToString(nSpellbookType)+".");
|
||||
|
||||
// Make sure the caster has uses of this spell remaining
|
||||
// 2009-9-20: Add metamagic feat abilities. -N-S
|
||||
@@ -1371,13 +1474,14 @@ void NewSpellbookSpell(int nClass, int nSpellbookType, int nMetamagic = METAMAGI
|
||||
else if(nSpellLevel > 9)//now test the spell level
|
||||
{
|
||||
nMetamagic = METAMAGIC_NONE;
|
||||
ActionDoCommand(SendMessageToPC(oPC, "Modified spell level is to high! Casting spell without metamagic"));
|
||||
ActionDoCommand(SendMessageToPC(oPC, "Modified spell level is too high! Casting spell without metamagic"));
|
||||
nSpellLevel = nSpellSlotLevel;
|
||||
}
|
||||
else if(GetLocalInt(oPC, "PRC_metamagic_state") == 1)
|
||||
SetLocalInt(oPC, "MetamagicFeatAdjust", 0);
|
||||
}
|
||||
|
||||
|
||||
if (DEBUG) DoDebug("inc_newspellbook >> NewSpellbookSpell(): nSpellLevel is: "+IntToString(nSpellLevel)+".");
|
||||
CheckSpontSlots(nClass, nSpellID, nSpellLevel);
|
||||
if(GetLocalInt(oPC, "NSB_Cast"))
|
||||
ActionDoCommand(CheckSpontSlots(nClass, nSpellID, nSpellLevel, TRUE));
|
||||
@@ -1460,7 +1564,7 @@ void CheckPrepSlots(int nClass, int nSpellID, int nSpellbookID, int bIsAction =
|
||||
{
|
||||
DeleteLocalInt(OBJECT_SELF, "NSB_Cast");
|
||||
int nCount = persistant_array_get_int(OBJECT_SELF, "NewSpellbookMem_" + IntToString(nClass), nSpellbookID);
|
||||
if(DEBUG) DoDebug("NewSpellbookSpell: NewSpellbookMem_" + IntToString(nClass) + "[" + IntToString(nSpellbookID) + "] = " + IntToString(nCount));
|
||||
if(DEBUG) DoDebug("NewSpellbookSpell >> CheckPrepSlots: NewSpellbookMem_" + IntToString(nClass) + "[SpellbookID: " + IntToString(nSpellbookID) + "] = " + IntToString(nCount));
|
||||
if(nCount < 1)
|
||||
{
|
||||
string sSpellName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSpellID)));
|
||||
@@ -1486,7 +1590,7 @@ void CheckSpontSlots(int nClass, int nSpellID, int nSpellSlotLevel, int bIsActio
|
||||
{
|
||||
DeleteLocalInt(OBJECT_SELF, "NSB_Cast");
|
||||
int nCount = persistant_array_get_int(OBJECT_SELF, "NewSpellbookMem_" + IntToString(nClass), nSpellSlotLevel);
|
||||
if(DEBUG) DoDebug("NewSpellbookSpell: NewSpellbookMem_" + IntToString(nClass) + "[" + IntToString(nSpellSlotLevel) + "] = " + IntToString(nCount));
|
||||
if(DEBUG) DoDebug("NewSpellbookSpell >> CheckSpontSlots: NewSpellbookMem_" + IntToString(nClass) + "[SpellSlotLevel: " + IntToString(nSpellSlotLevel) + "] = " + IntToString(nCount));
|
||||
if(nCount < 1)
|
||||
{
|
||||
// "You have no castings of spells of level " + IntToString(nSpellLevel) + " remaining"
|
||||
@@ -1517,6 +1621,3 @@ void DoCleanUp(int nMetamagic)
|
||||
DeleteLocalInt(OBJECT_SELF, "NSB_SpellLevel");
|
||||
DeleteLocalInt(OBJECT_SELF, "NSB_SpellbookID");
|
||||
}
|
||||
|
||||
//:: Test Void
|
||||
//:: void main (){}
|
||||
@@ -7,8 +7,11 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
//:: Levels up an NPC according to variables set on NPC.
|
||||
void LevelUpSummon(object oSummon, int iTargetLvl);
|
||||
|
||||
// Get the master of oAssociate.
|
||||
object GetMasterNPC(object oAssociate=OBJECT_SELF);
|
||||
object GetMasterNPC(object oAssociate0 = OBJECT_SELF);
|
||||
|
||||
// Returns the associate type of the specified creature.
|
||||
// - Returns ASSOCIATE_TYPE_NONE if the creature is not the associate of anyone.
|
||||
@@ -75,7 +78,6 @@ void DestroySummon(object oSummon)
|
||||
DestroyObject(oSummon);
|
||||
}
|
||||
|
||||
|
||||
object CreateLocalNPC(object oMaster,int nAssociateType,string sTemplate,location loc,int Nth=1,string sTag="")
|
||||
{
|
||||
object oSummon=CreateObject(OBJECT_TYPE_CREATURE,sTemplate,loc,FALSE,sTag);
|
||||
@@ -111,7 +113,7 @@ object CreateLocalNextNPC(object oMaster,int nAssociateType,string sTemplate,loc
|
||||
SetLocalObject(oMaster, IntToString(nAssociateType)+"oHench"+IntToString(nCount), oSummon);
|
||||
SetLocalInt(oSummon, "iAssocNth", nCount);
|
||||
|
||||
SetAssociateState(NW_ASC_HAVE_MASTER,TRUE,oSummon);
|
||||
SetAssociateState(NW_ASC_HAVE_MASTER, TRUE, oSummon);
|
||||
SetAssociateState(NW_ASC_DISTANCE_2_METERS);
|
||||
SetAssociateState(NW_ASC_DISTANCE_4_METERS, FALSE);
|
||||
SetAssociateState(NW_ASC_DISTANCE_6_METERS, FALSE);
|
||||
@@ -122,6 +124,7 @@ object CreateLocalNextNPC(object oMaster,int nAssociateType,string sTemplate,loc
|
||||
return oSummon;
|
||||
|
||||
}
|
||||
|
||||
object GetMasterNPC(object oAssociate=OBJECT_SELF)
|
||||
{
|
||||
object oMaster = GetLocalObject(oAssociate, "oMaster");
|
||||
@@ -220,4 +223,173 @@ int GetAssociateHealMasterNPC()
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Levels up a summoned creature based on its master's total casting level,
|
||||
* while respecting configured HD limits and multiclass transition rules.
|
||||
* Should only be called on the NPC onSpawn event.
|
||||
*
|
||||
* This function:
|
||||
* - Retrieves the master<65>s total casting level and clamps it to the creature<72>s
|
||||
* minimum and maximum HD (iMinHD, iMaxHD).
|
||||
* - Repeatedly calls LevelUpHenchman() until the creature reaches that level,
|
||||
* switching classes when the creature's stored "ClassXStart" thresholds are met.
|
||||
*
|
||||
* Local variables recognized on the summoned creature:
|
||||
*
|
||||
* | Variable Name | Purpose |
|
||||
* |-----------------|-------------------------------------------------------------|
|
||||
* | iMinHD | Minimum HD allowed |
|
||||
* | iMaxHD | Maximum HD allowed |
|
||||
* | Class2Start | Level to begin second class progression |
|
||||
* | Class2 | Class type for second progression |
|
||||
* | Class2Package | Package for second progression |
|
||||
* | Class3Start | Level to begin third class progression |
|
||||
* | Class3 | Class type for third progression |
|
||||
* | Class3Package | Package for third progression |
|
||||
* | Class4Start | Level to begin fourth class progression |
|
||||
* | Class4 | Class type for fourth progression |
|
||||
* | Class4Package | Package for fourth progression |
|
||||
*
|
||||
* Behavior notes:
|
||||
* - Leveling continues until the creature reaches the master<65>s effective
|
||||
* casting level (bounded by iMinHD/iMaxHD).
|
||||
* - If LevelUpHenchman() returns 0, the creature shouts a failure message.
|
||||
* - CLASS_TYPE_INVALID causes the creature to level in its current class.
|
||||
*
|
||||
* @param oCreature The summoned creature being leveled. Defaults to OBJECT_SELF.
|
||||
*
|
||||
* @see LevelUpHenchman
|
||||
* @see GetLocalInt
|
||||
* @see GetHitDice
|
||||
*/
|
||||
void LevelUpSummon(object oSummon, int iTargetLvl)
|
||||
{
|
||||
int nCurrentHD = GetHitDice(oSummon);
|
||||
int iNewHD = nCurrentHD;
|
||||
|
||||
// Read multiclassing info from locals
|
||||
int iClass2Start = GetLocalInt(oSummon, "Class2Start");
|
||||
int iClass2 = GetLocalInt(oSummon, "Class2");
|
||||
int iClass2Package = GetLocalInt(oSummon, "Class2Package");
|
||||
|
||||
int iClass3Start = GetLocalInt(oSummon, "Class3Start");
|
||||
int iClass3 = GetLocalInt(oSummon, "Class3");
|
||||
int iClass3Package = GetLocalInt(oSummon, "Class3Package");
|
||||
|
||||
int iClass4Start = GetLocalInt(oSummon, "Class4Start");
|
||||
int iClass4 = GetLocalInt(oSummon, "Class4");
|
||||
int iClass4Package = GetLocalInt(oSummon, "Class4Package");
|
||||
|
||||
int iClass; // current class to level
|
||||
int iPackage; // package to use
|
||||
|
||||
// Main leveling loop
|
||||
while (nCurrentHD < iTargetLvl && nCurrentHD > 0)
|
||||
{
|
||||
// Determine which class and package to use
|
||||
if (iClass4Start != 0 && nCurrentHD >= iClass4Start)
|
||||
{
|
||||
iClass = iClass4;
|
||||
iPackage = iClass4Package;
|
||||
}
|
||||
else if (iClass3Start != 0 && nCurrentHD >= iClass3Start)
|
||||
{
|
||||
iClass = iClass3;
|
||||
iPackage = iClass3Package;
|
||||
}
|
||||
else if (iClass2Start != 0 && nCurrentHD >= iClass2Start)
|
||||
{
|
||||
iClass = iClass2;
|
||||
iPackage = iClass2Package;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Base class (first class in the sheet)
|
||||
iClass = CLASS_TYPE_INVALID; // keeps current
|
||||
iPackage = PACKAGE_INVALID;
|
||||
}
|
||||
|
||||
// Level up one HD
|
||||
iNewHD = LevelUpHenchman(oSummon, iClass, TRUE, iPackage);
|
||||
|
||||
if (iNewHD == 0)
|
||||
{
|
||||
SpeakString(GetName(oSummon) + " failed to level properly!", TALKVOLUME_SHOUT);
|
||||
break;
|
||||
}
|
||||
|
||||
nCurrentHD = iNewHD;
|
||||
}
|
||||
|
||||
// Force the creature to rest to memorize spells
|
||||
// PRCForceRest(oSummon);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* void LevelUpSummon(object oSummon, int iTargetLvl)
|
||||
{
|
||||
//get the default hit dice of the summon
|
||||
int nDefaultHD = GetHitDice(oSummon);
|
||||
|
||||
if (DEBUG) DoDebug("inc_npc >> LevelUpSummon: nDefaultHD = " +IntToString(nDefaultHD)+".");
|
||||
|
||||
if (DEBUG) DoDebug("inc_npc >> LevelUpSummon: iTargetLvl = " +IntToString(iTargetLvl)+".");
|
||||
|
||||
//get the multiclassing variables to see if we need to change classes from its base class
|
||||
int iClass2Start = GetLocalInt(oSummon, "Class2Start");
|
||||
int iClass2 = GetLocalInt(oSummon, "Class2");
|
||||
int iClass2Package = GetLocalInt(oSummon, "Class2Package");
|
||||
|
||||
int iClass3Start = GetLocalInt(oSummon, "Class3Start");
|
||||
int iClass3 = GetLocalInt(oSummon, "Class3");
|
||||
int iClass3Package = GetLocalInt(oSummon, "Class3Package");
|
||||
|
||||
int iClass4Start = GetLocalInt(oSummon, "Class4Start");
|
||||
int iClass4 = GetLocalInt(oSummon, "Class4");
|
||||
int iClass4Package = GetLocalInt(oSummon, "Class4Package");
|
||||
|
||||
//check for zero cause thats an error
|
||||
//if creatures are not leveling then best bet is they are not legal creatures
|
||||
while( (nDefaultHD < iTargetLvl) && (nDefaultHD > 0) )
|
||||
{
|
||||
//check the multiclassing numbers to change classes
|
||||
if( (iClass4Start != 0) && (nDefaultHD >= iClass4Start) )
|
||||
{
|
||||
//level up using the new class and Packageage
|
||||
nDefaultHD = LevelUpHenchman(oSummon, iClass4 ,TRUE, iClass4Package);
|
||||
|
||||
if(nDefaultHD == 0)
|
||||
SpeakString(GetName(oSummon) + " Failed on fourth class", TALKVOLUME_SHOUT);
|
||||
}
|
||||
else if( (iClass3Start != 0) && (nDefaultHD >= iClass3Start) )
|
||||
{
|
||||
//level up using the new class and Packageage
|
||||
nDefaultHD = LevelUpHenchman(oSummon, iClass3 ,TRUE, iClass3Package);
|
||||
|
||||
if(nDefaultHD == 0)
|
||||
SpeakString(GetName(oSummon) + " Failed on third class", TALKVOLUME_SHOUT);
|
||||
}
|
||||
else if( (iClass2Start != 0) && (nDefaultHD >= iClass2Start) )
|
||||
{
|
||||
//level up using the new class and Packageage
|
||||
nDefaultHD = LevelUpHenchman(oSummon, iClass2 ,TRUE, iClass2Package);
|
||||
|
||||
if(nDefaultHD == 0)
|
||||
SpeakString(GetName(oSummon) + " Failed on second class", TALKVOLUME_SHOUT);
|
||||
}
|
||||
else
|
||||
{
|
||||
//just level up using the class it already has
|
||||
nDefaultHD = LevelUpHenchman(oSummon, CLASS_TYPE_INVALID ,TRUE);
|
||||
|
||||
if(nDefaultHD == 0)
|
||||
SpeakString(GetName(oSummon) + " Failed to level properly", TALKVOLUME_SHOUT);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
//:: void main() {}
|
||||
@@ -3433,6 +3433,7 @@ int PrimoGetWeaponSize(object oItem)
|
||||
case BASE_ITEM_LIGHTFLAIL:
|
||||
case BASE_ITEM_KATANA:
|
||||
case BASE_ITEM_MAGICSTAFF:
|
||||
case BASE_ITEM_CRAFTED_SCEPTER:
|
||||
case BASE_ITEM_LONGSWORD:
|
||||
case BASE_ITEM_TRIDENT:
|
||||
case BASE_ITEM_MORNINGSTAR:
|
||||
|
||||
@@ -30,6 +30,7 @@ int GetDamageFromConstant(int nIPConst);
|
||||
void DoFrostRend(object oTarget, object oAttacker, object oWeapon);
|
||||
|
||||
#include "moi_inc_moifunc"
|
||||
#include "prc_inc_combat"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Function defintions */
|
||||
|
||||
@@ -17,9 +17,6 @@ Created: May 1, 2008
|
||||
|
||||
//:: Updated for .35 by Jaysyn 2023/03/11
|
||||
|
||||
//:: Test Void
|
||||
//void main (){}
|
||||
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Constants
|
||||
//:://////////////////////////////////////////////
|
||||
@@ -63,6 +60,14 @@ string GetMetaMagicString(int nMetaMagic);
|
||||
int GetMetaMagicFromFeat(int nFeat);
|
||||
int GetMetaMagicOfCaster(object oPC = OBJECT_SELF);
|
||||
|
||||
string GetFileForClass(int nClass);
|
||||
int GetSpellslotLevel(int nClass, object oPC);
|
||||
int GetSpellKnownMaxCount(int nLevel, int nSpellLevel, int nClass, object oPC);
|
||||
int GetSpellbookTypeForClass(int nClass);
|
||||
|
||||
#include "inc_pers_array"
|
||||
#include "inc_2dacache"
|
||||
|
||||
// name of the new spellbook file (cls_spell_*)
|
||||
string GetNSBDefinitionFileName(int nClass)
|
||||
{
|
||||
|
||||
@@ -44,6 +44,7 @@ void CreateSwitchNameArray();
|
||||
|
||||
#include "prc_inc_array" // Needs direct include instead of inc_utility
|
||||
#include "prc_inc_switch"
|
||||
#include "inc_2dacache"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Function definitions */
|
||||
@@ -221,9 +222,9 @@ void SetDefaultFileEnds()
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spcr_bard", 144);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spcr_beguil", 142);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spcr_blkgrd", 47);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spcr_dnecro", 137);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spcr_dnecro", 138);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spcr_duskbl", 69);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spcr_favsol", 290);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spcr_favsol", 300);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spcr_harper", 35);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spcr_healer", 77);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spcr_hexbl", 73);
|
||||
@@ -251,9 +252,9 @@ void SetDefaultFileEnds()
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_bard", 169);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_beguil", 119);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_blkgrd", 163);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_dnecro", 134);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_dnecro", 135);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_duskbl", 84);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_favsol", 363);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_favsol", 373);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_harper", 21);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_healer", 271);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_hexbl", 79);
|
||||
@@ -267,7 +268,7 @@ void SetDefaultFileEnds()
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_sod", 110);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_sohei", 131);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_sol", 114);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_sorc", 541);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_sorc", 550);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_suel", 160);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_templ", 95);
|
||||
SetPRCSwitch("PRC_FILE_END_cls_spell_tfshad", 70);
|
||||
@@ -335,7 +336,7 @@ void SetDefaultFileEnds()
|
||||
SetPRCSwitch("PRC_FILE_END_craft_golem", 40);
|
||||
SetPRCSwitch("PRC_FILE_END_craft_ring", 41);
|
||||
SetPRCSwitch("PRC_FILE_END_craft_weapon", 46);
|
||||
SetPRCSwitch("PRC_FILE_END_craft_wondrous", 115);
|
||||
SetPRCSwitch("PRC_FILE_END_craft_wondrous", 131);
|
||||
SetPRCSwitch("PRC_FILE_END_creaturesize", 5);
|
||||
SetPRCSwitch("PRC_FILE_END_creaturespeed", 8);
|
||||
SetPRCSwitch("PRC_FILE_END_crtemplates", 10);
|
||||
@@ -355,7 +356,7 @@ void SetDefaultFileEnds()
|
||||
SetPRCSwitch("PRC_FILE_END_des_crft_poison", 100);
|
||||
SetPRCSwitch("PRC_FILE_END_des_crft_props", 27);
|
||||
SetPRCSwitch("PRC_FILE_END_des_crft_scroll", 3999);
|
||||
SetPRCSwitch("PRC_FILE_END_des_crft_spells", 19348);
|
||||
SetPRCSwitch("PRC_FILE_END_des_crft_spells", 20000);
|
||||
SetPRCSwitch("PRC_FILE_END_des_crft_weapon", 29);
|
||||
SetPRCSwitch("PRC_FILE_END_des_cutconvdur", 26);
|
||||
SetPRCSwitch("PRC_FILE_END_des_feat2item", 1000);
|
||||
@@ -408,7 +409,7 @@ void SetDefaultFileEnds()
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_ammocost", 15);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_ammotype", 2);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_amount", 4);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_aoe", 7);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_aoe", 8);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_arcspell", 19);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_base1", -1);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_bladecost", 5);
|
||||
@@ -423,15 +424,15 @@ void SetDefaultFileEnds()
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_damvulcost", 7);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_decvalue1", 9);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_decvalue2", 9);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_feats", 24819);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_feats", 26999);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_immuncost", 7);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_immunity", 9);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_incvalue1", 9);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_incvalue2", 9);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_kitcost", 50);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_lightcost", 4);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_matcost", 77);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_material", 77);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_matcost", 145);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_material", 145);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_maxpp", 8);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_meleecost", 20);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_metamagic", 6);
|
||||
@@ -458,11 +459,11 @@ void SetDefaultFileEnds()
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_soakcost", 50);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_speed_dec", 9);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_speed_enh", 9);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_spellcost", 243);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_spellcost", 298);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_spellcstr", 42);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_spelllvcost", 9);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_spelllvlimm", 9);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_spells", 1456);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_spells", 1552);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_spellshl", 7);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_srcost", 99);
|
||||
SetPRCSwitch("PRC_FILE_END_iprp_staminacost", -1);
|
||||
@@ -492,9 +493,9 @@ void SetDefaultFileEnds()
|
||||
SetPRCSwitch("PRC_FILE_END_itmwizwands", 38);
|
||||
SetPRCSwitch("PRC_FILE_END_keymap", 70);
|
||||
SetPRCSwitch("PRC_FILE_END_lightcolor", 32);
|
||||
SetPRCSwitch("PRC_FILE_END_loadhints", 88);
|
||||
SetPRCSwitch("PRC_FILE_END_loadhints", 101);
|
||||
SetPRCSwitch("PRC_FILE_END_loadscreens", 259);
|
||||
SetPRCSwitch("PRC_FILE_END_masterfeats", 113);
|
||||
SetPRCSwitch("PRC_FILE_END_masterfeats", 125);
|
||||
SetPRCSwitch("PRC_FILE_END_materialcomp", 200);
|
||||
SetPRCSwitch("PRC_FILE_END_metamagic", 6);
|
||||
SetPRCSwitch("PRC_FILE_END_namefilter", 3);
|
||||
@@ -720,7 +721,7 @@ void SetDefaultFileEnds()
|
||||
SetPRCSwitch("PRC_FILE_END_polymorph", 155);
|
||||
SetPRCSwitch("PRC_FILE_END_portraits", 1300);
|
||||
SetPRCSwitch("PRC_FILE_END_prc_craft_alchem", 37);
|
||||
SetPRCSwitch("PRC_FILE_END_prc_craft_gen_it", 204);
|
||||
SetPRCSwitch("PRC_FILE_END_prc_craft_gen_it", 253);
|
||||
SetPRCSwitch("PRC_FILE_END_prc_craft_poison", 62);
|
||||
SetPRCSwitch("PRC_FILE_END_prc_domains", 59);
|
||||
SetPRCSwitch("PRC_FILE_END_prc_familiar", 10);
|
||||
@@ -767,7 +768,7 @@ void SetDefaultFileEnds()
|
||||
SetPRCSwitch("PRC_FILE_END_soundset", 453);
|
||||
SetPRCSwitch("PRC_FILE_END_soundsettype", 4);
|
||||
SetPRCSwitch("PRC_FILE_END_soundtypes", 1);
|
||||
SetPRCSwitch("PRC_FILE_END_spells", 19348);
|
||||
SetPRCSwitch("PRC_FILE_END_spells", 19400);
|
||||
//SetPRCSwitch("PRC_FILE_END_spellschools", 9);
|
||||
SetPRCSwitch("PRC_FILE_END_statescripts", 35);
|
||||
SetPRCSwitch("PRC_FILE_END_stringtokens", 92);
|
||||
@@ -866,6 +867,31 @@ void CreateSwitchNameArray()
|
||||
//if you add more switches, add them to this list
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_DEBUG);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_COMBAT_DEBUG);
|
||||
|
||||
//craft
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_DISABLE_CRAFT);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_TIMER_MULTIPLIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_TIMER_MAX);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_TIMER_MIN);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_BREW_POTION_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_SCRIBE_SCROLL_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_WAND_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_ROD_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_STAFF_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_BASE_ITEMS);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_BREWPOTION_MAXLEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_BREWPOTION_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_SCRIBESCROLL_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_CRAFTWAND_MAXLEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_CRAFTWAND_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_CREATEINFUSION_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_ARBITRARY);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_COST_SCALE);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_TIME_SCALE);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CREATE_INFUSION_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CREATE_INFUSION_OPTIONAL_HERBS);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_SCEPTER_CASTER_LEVEL);
|
||||
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_MATERIAL_COMPONENTS);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_DISABLE_COMPONENTS_SHOP);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PNP_TRUESEEING);
|
||||
@@ -876,6 +902,10 @@ void CreateSwitchNameArray()
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_BIOWARE_HARM);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_BIOWARE_NEUTRALIZE_POISON);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_BIOWARE_REMOVE_DISEASE);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_ALLOWED_TO_REMOVE_FRIENDLY_SPELLS);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_ALLOWED_TO_SEE_HOSTILE_SPELLS);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_BIO_UNLEARN);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_UNLEARN_SPELL_MAXNR);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_TIMESTOP_BIOWARE_DURATION);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_TIMESTOP_LOCAL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_TIMESTOP_NO_HOSTILE);
|
||||
@@ -992,7 +1022,7 @@ void CreateSwitchNameArray()
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_USES_PER_WEAPON_POISON_COUNT);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_USES_PER_WEAPON_POISON_DIE);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_POISON_ALLOW_CLEAN_IN_EQUIP);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_POISON_USE_INGREDIENST);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_POISON_USE_INGREDIENTS);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PSI_ASTRAL_CONSTRUCT_USE_2DA);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PSI_ASTRAL_CONSTRUCT_DUR_MOD);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PNP_RAPID_METABOLISM);
|
||||
@@ -1056,29 +1086,31 @@ void CreateSwitchNameArray()
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_LETOSCRIPT_UNICORN_SQL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_LETOSCRIPT_GETNEWESTBIC);
|
||||
|
||||
//craft
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_DISABLE_CRAFT);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_TIMER_MULTIPLIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_TIMER_MAX);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_TIMER_MIN);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_BREW_POTION_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_SCRIBE_SCROLL_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_WAND_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_ROD_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_STAFF_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_BASE_ITEMS);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_BREWPOTION_MAXLEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_BREWPOTION_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_SCRIBESCROLL_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_CRAFTWAND_MAXLEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_CRAFTWAND_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_ARBITRARY);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_COST_SCALE);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_TIME_SCALE);
|
||||
|
||||
//spells
|
||||
|
||||
//shifter
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPECHANGE);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_WILDSHAPE_ALLOWS_ARMS_SLOT);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_USECR);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_HUGE);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_LARGE);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_MEDIUM);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_SMALL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_TINY);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_OUTSIDER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_ELEMENTAL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_CONSTRUCT);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_UNDEAD);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_DRAGON);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_ABERRATION);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_OOZE);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_MAGICALBEAST);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_GIANT);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_VERMIN);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_BEAST);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_ANIMAL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_MONSTROUSHUMANOID);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_HUMANOID);
|
||||
|
||||
//general
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "prc_inc_clsfunc"
|
||||
#include "prc_inc_sp_tch"
|
||||
|
||||
int GetBlastDamageDices(object oInvoker, int nInvokerLevel)
|
||||
{
|
||||
|
||||
@@ -135,6 +135,9 @@ int GetHasInvocation(int nInvocation, object oCreature = OBJECT_SELF);
|
||||
/* Includes */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
int GetPrimaryInvocationClass(object oCreature = OBJECT_SELF);
|
||||
int GetInvocationPRCLevels(object oCaster);
|
||||
|
||||
#include "inc_item_props"
|
||||
#include "prc_x2_itemprop"
|
||||
#include "inc_lookups"
|
||||
|
||||
@@ -123,7 +123,7 @@ void DeleteLocalInvocation(object oObject, string sName);
|
||||
/* Includes */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
//#include "inv_inc_invfunc" //Access in parent
|
||||
#include "inv_inc_invfunc" //Access in parent
|
||||
#include "prc_spellf_inc"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
@@ -77,6 +77,15 @@ int PreInvocationCastCode()
|
||||
|
||||
int nContinue = !ExecuteScriptAndReturnInt("prespellcode", oInvoker);
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Block forsakers from using invocations
|
||||
//---------------------------------------------------------------------------
|
||||
if(GetLevelByClass(CLASS_TYPE_FORSAKER, oInvoker) > 0)
|
||||
{
|
||||
SendMessageToPC(oInvoker, "Forsakers cannot use invocations.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Break any spell require maintaining concentration
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -168,3 +177,4 @@ int PreInvocationCastCode()
|
||||
return nContinue;
|
||||
}
|
||||
|
||||
//:: void main (){}
|
||||
@@ -1170,7 +1170,10 @@ int GetMaxEssentiaCapacityFeat(object oMeldshaper)
|
||||
{
|
||||
int nMax = 1; // Always can invest one
|
||||
int nHD = GetHitDice(oMeldshaper);
|
||||
if (nHD >= 31) nMax = 5;
|
||||
if (nHD >= 61) nMax = 8;
|
||||
else if (nHD >= 51) nMax = 7;
|
||||
else if (nHD >= 41) nMax = 6;
|
||||
else if (nHD >= 31) nMax = 5;
|
||||
else if (nHD >= 18) nMax = 4;
|
||||
else if (nHD >= 12) nMax = 3;
|
||||
else if (nHD >= 6) nMax = 2;
|
||||
@@ -1182,7 +1185,7 @@ int GetMaxEssentiaCapacityFeat(object oMeldshaper)
|
||||
// Don't allow more than they have
|
||||
if (nMax > GetTotalUsableEssentia(oMeldshaper)) nMax = GetTotalUsableEssentia(oMeldshaper);
|
||||
|
||||
//if (DEBUG) DoDebug("GetMaxEssentiaCapacityFeat: nHD "+IntToString(nHD)+" nMax "+IntToString(nMax));
|
||||
if(DEBUG) DoDebug("GetMaxEssentiaCapacityFeat: nHD "+IntToString(nHD)+" nMax "+IntToString(nMax));
|
||||
return nMax;
|
||||
}
|
||||
|
||||
|
||||
623
src/include/nw_inc_gff.nss
Normal file
623
src/include/nw_inc_gff.nss
Normal file
@@ -0,0 +1,623 @@
|
||||
// This is a helper library for advanced use: It allows constructing arbitrary gff data.
|
||||
// You can then spawn your object via JsonToObject().
|
||||
//
|
||||
// The data format is the same as https://github.com/niv/neverwinter.nim@1.4.3+.
|
||||
//
|
||||
// Example:
|
||||
//
|
||||
// json j = GffCreateObject(OBJECT_TYPE_ITEM);
|
||||
// j = GffAddInt(j, "BaseItem", BASE_ITEM_BELT);
|
||||
// j = GffAddInt(j, "ModelPart1", 12);
|
||||
// j = GffAddLocString(j, "LocalizedName", "hi!");
|
||||
// object belt = JsonToObject(j, GetLocation(OBJECT_SELF));
|
||||
|
||||
|
||||
const string GFF_FIELD_TYPE_STRUCT = "struct";
|
||||
const string GFF_FIELD_TYPE_LIST = "list";
|
||||
const string GFF_FIELD_TYPE_BYTE = "byte";
|
||||
const string GFF_FIELD_TYPE_CHAR = "char";
|
||||
const string GFF_FIELD_TYPE_WORD = "word";
|
||||
const string GFF_FIELD_TYPE_SHORT = "short";
|
||||
const string GFF_FIELD_TYPE_DWORD = "dword";
|
||||
const string GFF_FIELD_TYPE_INT = "int";
|
||||
const string GFF_FIELD_TYPE_DWORD64 = "dword64";
|
||||
const string GFF_FIELD_TYPE_INT64 = "int64";
|
||||
const string GFF_FIELD_TYPE_FLOAT = "float";
|
||||
const string GFF_FIELD_TYPE_DOUBLE = "double";
|
||||
const string GFF_FIELD_TYPE_RESREF = "resref";
|
||||
const string GFF_FIELD_TYPE_STRING = "cexostring";
|
||||
const string GFF_FIELD_TYPE_LOC_STRING = "cexolocstring";
|
||||
|
||||
|
||||
// Create a empty object of the given type. You need to manually fill in all
|
||||
// GFF data with GffAddXXX. This will require understanding of the GFF file format
|
||||
// and what data fields each object type requires.
|
||||
json GffCreateObject(int nObjectType);
|
||||
// Create a combined area format(CAF) object. You need to manually create the ARE and GIT objects with their required data fields.
|
||||
json GffCreateArea(json jARE, json jGIT);
|
||||
|
||||
// Returns the OBJECT_TYPE_* of jGff.
|
||||
// Note: Will return 0 for invalid object types, including areas.
|
||||
int GffGetObjectType(json jGff);
|
||||
// Returns TRUE if jGff is a combined area format(CAF) object.
|
||||
int GffGetIsArea(json jGff);
|
||||
|
||||
// Returns TRUE if a field named sLabel of sType exists in jGff.
|
||||
// * sLabel: Can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
|
||||
// * sType: An optional GFF_FIELD_TYPE_*, leave empty to check if sLabel exists regardless of type.
|
||||
int GffGetFieldExists(json jGff, string sLabel, string sType = "");
|
||||
|
||||
|
||||
// Add a new field, will overwrite any existing fields with the same label even if the type is different.
|
||||
// Returns a json null value on error with GetJsonError() filled in.
|
||||
//
|
||||
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
|
||||
// For example, to add the tag of an area to an empty combined area format(CAF) object you can do the following:
|
||||
// json jArea = GffCreateArea(JsonObject(), JsonObject());
|
||||
// jArea = GffAddString(jArea, "ARE/value/Tag", "AREA_TAG");
|
||||
|
||||
json GffAddStruct(json jGff, string sLabel, json jStruct, int nType = -1);
|
||||
json GffAddList(json jGff, string sLabel, json jList);
|
||||
json GffAddByte(json jGff, string sLabel, int v);
|
||||
json GffAddChar(json jGff, string sLabel, int v);
|
||||
json GffAddWord(json jGff, string sLabel, int v);
|
||||
json GffAddShort(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffAddDword(json jGff, string sLabel, int v);
|
||||
json GffAddInt(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffAddDword64(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffAddInt64(json jGff, string sLabel, int v);
|
||||
json GffAddFloat(json jGff, string sLabel, float v);
|
||||
// Note: Only data of type float will fit, because that's all that NWScript supports.
|
||||
json GffAddDouble(json jGff, string sLabel, float v);
|
||||
json GffAddResRef(json jGff, string sLabel, string v);
|
||||
json GffAddString(json jGff, string sLabel, string v);
|
||||
json GffAddLocString(json jGff, string sLabel, string v, int nStrRef = -1);
|
||||
|
||||
|
||||
// Replace a field, the type must match and the field must exist.
|
||||
// Returns a json null value on error with GetJsonError() filled in.
|
||||
//
|
||||
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
|
||||
// For example, to replace the name of an area in a combined area format(CAF) object you can do the following:
|
||||
// json jArea = ObjectToStruct(GetFirstArea());
|
||||
// jArea = GffReplaceLocString(jArea, "ARE/value/Name", "New Area Name");
|
||||
|
||||
json GffReplaceStruct(json jGff, string sLabel, json jStruct);
|
||||
json GffReplaceList(json jGff, string sLabel, json jList);
|
||||
json GffReplaceByte(json jGff, string sLabel, int v);
|
||||
json GffReplaceChar(json jGff, string sLabel, int v);
|
||||
json GffReplaceWord(json jGff, string sLabel, int v);
|
||||
json GffReplaceShort(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffReplaceDword(json jGff, string sLabel, int v);
|
||||
json GffReplaceInt(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffReplaceDword64(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffReplaceInt64(json jGff, string sLabel, int v);
|
||||
json GffReplaceFloat(json jGff, string sLabel, float v);
|
||||
// Note: Only data of type float will fit, because that's all that NWScript supports.
|
||||
json GffReplaceDouble(json jGff, string sLabel, float v);
|
||||
json GffReplaceResRef(json jGff, string sLabel, string v);
|
||||
json GffReplaceString(json jGff, string sLabel, string v);
|
||||
json GffReplaceLocString(json jGff, string sLabel, string v, int nStrRef = -1);
|
||||
|
||||
|
||||
// Remove a field, the type must match and the field must exist.
|
||||
// Returns a json null value on error with GetJsonError() filled in.
|
||||
//
|
||||
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
|
||||
// For example, to remove all placeables from an area in a combined area format(CAF) object you can do the following:
|
||||
// json jArea = ObjectToStruct(GetFirstArea());
|
||||
// jArea = GffRemoveList(jArea, "GIT/value/Placeable List");
|
||||
|
||||
json GffRemoveStruct(json jGff, string sLabel);
|
||||
json GffRemoveList(json jGff, string sLabel);
|
||||
json GffRemoveByte(json jGff, string sLabel);
|
||||
json GffRemoveChar(json jGff, string sLabel);
|
||||
json GffRemoveWord(json jGff, string sLabel);
|
||||
json GffRemoveShort(json jGff, string sLabel);
|
||||
json GffRemoveDword(json jGff, string sLabel);
|
||||
json GffRemoveInt(json jGff, string sLabel);
|
||||
json GffRemoveDword64(json jGff, string sLabel);
|
||||
json GffRemoveInt64(json jGff, string sLabel);
|
||||
json GffRemoveFloat(json jGff, string sLabel);
|
||||
json GffRemoveDouble(json jGff, string sLabel);
|
||||
json GffRemoveResRef(json jGff, string sLabel);
|
||||
json GffRemoveString(json jGff, string sLabel);
|
||||
json GffRemoveLocString(json jGff, string sLabel);
|
||||
|
||||
|
||||
// Get a field's value as json object.
|
||||
// Returns a json null value on error with GetJsonError() filled in.
|
||||
//
|
||||
// Note: Json types do not implicitly convert between types, this means you cannot convert a JsonInt to a string with JsonGetString(), etc.
|
||||
// You may need to check the type with JsonGetType() and then do the appropriate cast yourself.
|
||||
// For GffGet*() functions the json type returned is noted in the function description.
|
||||
//
|
||||
// Example:
|
||||
// INCORRECT: string s = JsonGetString(GffGetInt());
|
||||
// CORRECT: string s = IntToString(JsonGetInt(GffGetInt()));
|
||||
//
|
||||
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
|
||||
// For example, to get the resref of an area in a combined area format(CAF) object you can do the following:
|
||||
// json jResRef = GffGetResRef(ObjectToStruct(GetFirstArea()), "ARE/value/ResRef");
|
||||
// if (jResRef != JsonNull())
|
||||
// {
|
||||
// string sResRef = JsonGetString(jResRef);
|
||||
// }
|
||||
// else
|
||||
// WriteTimestampedLogEntry("Failed to get area ResRef: " + JsonGetError(jResRef));
|
||||
|
||||
// Returns the struct as JsonObject() on success.
|
||||
json GffGetStruct(json jGff, string sLabel);
|
||||
// Returns a JsonArray() with all the list elements on success.
|
||||
json GffGetList(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetByte(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetChar(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetWord(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetShort(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetDword(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetInt(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetDword64(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetInt64(json jGff, string sLabel);
|
||||
// Returns a JsonFloat() on success.
|
||||
json GffGetFloat(json jGff, string sLabel);
|
||||
// Returns a JsonFloat() on success.
|
||||
json GffGetDouble(json jGff, string sLabel);
|
||||
// Returns a JsonString() on success.
|
||||
json GffGetResRef(json jGff, string sLabel);
|
||||
// Returns a JsonString() on success.
|
||||
json GffGetString(json jGff, string sLabel);
|
||||
// Returns a JsonObject() on success.
|
||||
// Key "0" will have a JsonString() with the string, if set.
|
||||
// Key "id" will have a JsonInt() with the strref, if set.
|
||||
json GffGetLocString(json jGff, string sLabel);
|
||||
|
||||
|
||||
// *** Internal Helper Functions
|
||||
json AddPatchOperation(json jPatchArray, string sOp, string sPath, json jValue)
|
||||
{
|
||||
json jOperation = JsonObject();
|
||||
jOperation = JsonObjectSet(jOperation, "op", JsonString(sOp));
|
||||
jOperation = JsonObjectSet(jOperation, "path", JsonString(sPath));
|
||||
jOperation = JsonObjectSet(jOperation, "value", jValue);
|
||||
return JsonArrayInsert(jPatchArray, jOperation);
|
||||
}
|
||||
|
||||
json GffAddField(json jGff, string sLabel, string sType, json jValue, int nType = -1)
|
||||
{
|
||||
json jField = JsonObject();
|
||||
jField = JsonObjectSet(jField, "type", JsonString(sType));
|
||||
jField = JsonObjectSet(jField, "value", jValue);
|
||||
if (sType == GFF_FIELD_TYPE_STRUCT && nType != -1)
|
||||
jField = JsonObjectSet(jField, "__struct_id", JsonInt(nType));
|
||||
|
||||
return JsonPatch(jGff, AddPatchOperation(JsonArray(), "add", "/" + sLabel, jField));
|
||||
}
|
||||
|
||||
json GffReplaceField(json jGff, string sLabel, string sType, json jValue)
|
||||
{
|
||||
json jPatch = JsonArray();
|
||||
jPatch = AddPatchOperation(jPatch, "test", "/" + sLabel + "/type", JsonString(sType));
|
||||
jPatch = AddPatchOperation(jPatch, "replace", "/" + sLabel + "/value", jValue);
|
||||
return JsonPatch(jGff, jPatch);
|
||||
}
|
||||
|
||||
json GffRemoveField(json jGff, string sLabel, string sType)
|
||||
{
|
||||
json jPatch = JsonArray();
|
||||
jPatch = AddPatchOperation(jPatch, "test", "/" + sLabel + "/type", JsonString(sType));
|
||||
jPatch = AddPatchOperation(jPatch, "remove", "/" + sLabel, JsonNull());
|
||||
return JsonPatch(jGff, jPatch);
|
||||
}
|
||||
|
||||
json GffGetFieldType(json jGff, string sLabel)
|
||||
{
|
||||
return JsonPointer(jGff, "/" + sLabel + "/type");
|
||||
}
|
||||
|
||||
json GffGetFieldValue(json jGff, string sLabel)
|
||||
{
|
||||
return JsonPointer(jGff, "/" + sLabel + "/value");
|
||||
}
|
||||
|
||||
json GffGetField(json jGff, string sLabel, string sType)
|
||||
{
|
||||
json jType = GffGetFieldType(jGff, sLabel);
|
||||
if (jType == JsonNull())
|
||||
return jType;
|
||||
else if (jType != JsonString(sType))
|
||||
return JsonNull("field type does not match");
|
||||
else
|
||||
return GffGetFieldValue(jGff, sLabel);
|
||||
}
|
||||
|
||||
json GffLocString(string v, int nStrRef = -1)
|
||||
{
|
||||
json jLocString = JsonObject();
|
||||
if (v != "")
|
||||
jLocString = JsonObjectSet(jLocString, "0", JsonString(v)); // english/any
|
||||
if (nStrRef != -1)
|
||||
jLocString = JsonObjectSet(jLocString, "id", JsonInt(nStrRef));
|
||||
|
||||
return jLocString;
|
||||
}
|
||||
//***
|
||||
|
||||
json GffCreateObject(int nObjectType)
|
||||
{
|
||||
string ot;
|
||||
if (nObjectType == OBJECT_TYPE_CREATURE) ot = "UTC ";
|
||||
else if (nObjectType == OBJECT_TYPE_ITEM) ot = "UTI ";
|
||||
else if (nObjectType == OBJECT_TYPE_TRIGGER) ot = "UTT ";
|
||||
else if (nObjectType == OBJECT_TYPE_DOOR) ot = "UTD ";
|
||||
else if (nObjectType == OBJECT_TYPE_WAYPOINT) ot = "UTW ";
|
||||
else if (nObjectType == OBJECT_TYPE_PLACEABLE) ot = "UTP ";
|
||||
else if (nObjectType == OBJECT_TYPE_STORE) ot = "UTM ";
|
||||
else if (nObjectType == OBJECT_TYPE_ENCOUNTER) ot = "UTE ";
|
||||
|
||||
if (ot == "") return JsonNull("invalid object type");
|
||||
|
||||
json ret = JsonObject();
|
||||
ret = JsonObjectSet(ret, "__data_type", JsonString(ot));
|
||||
return ret;
|
||||
}
|
||||
|
||||
json GffCreateArea(json jARE, json jGIT)
|
||||
{
|
||||
json jCAF = JsonObject();
|
||||
jCAF = JsonObjectSet(jCAF, "__data_type", JsonString("CAF "));
|
||||
jCAF = GffAddStruct(jCAF, "ARE", jARE, 0);
|
||||
jCAF = GffAddStruct(jCAF, "GIT", jGIT, 1);
|
||||
return jCAF;
|
||||
}
|
||||
|
||||
|
||||
int GffGetObjectType(json jGff)
|
||||
{
|
||||
json jDataType = JsonObjectGet(jGff, "__data_type");
|
||||
if (jDataType == JsonNull())
|
||||
return 0;
|
||||
else
|
||||
{
|
||||
string sObjectType = JsonGetString(jDataType);
|
||||
|
||||
if (sObjectType == "UTC ") return OBJECT_TYPE_CREATURE;
|
||||
else if (sObjectType == "UTI ") return OBJECT_TYPE_ITEM;
|
||||
else if (sObjectType == "UTT ") return OBJECT_TYPE_TRIGGER;
|
||||
else if (sObjectType == "UTD ") return OBJECT_TYPE_DOOR;
|
||||
else if (sObjectType == "UTW ") return OBJECT_TYPE_WAYPOINT;
|
||||
else if (sObjectType == "UTP ") return OBJECT_TYPE_PLACEABLE;
|
||||
else if (sObjectType == "UTM ") return OBJECT_TYPE_STORE;
|
||||
else if (sObjectType == "UTE ") return OBJECT_TYPE_ENCOUNTER;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int GffGetIsArea(json jGff)
|
||||
{
|
||||
return JsonObjectGet(jGff, "__data_type") == JsonString("CAF ");
|
||||
}
|
||||
|
||||
int GffGetFieldExists(json jGff, string sLabel, string sType = "")
|
||||
{
|
||||
json jFieldType = GffGetFieldType(jGff, sLabel);
|
||||
return sType == "" ? jFieldType != JsonNull() : jFieldType == JsonString(sType);
|
||||
}
|
||||
|
||||
|
||||
json GffAddStruct(json jGff, string sLabel, json jStruct, int nType = -1)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT, jStruct, nType);
|
||||
}
|
||||
|
||||
json GffAddList(json jGff, string sLabel, json jList)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_LIST, jList);
|
||||
}
|
||||
|
||||
json GffAddByte(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_BYTE, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddChar(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_CHAR, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddWord(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_WORD, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddShort(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_SHORT, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddDword(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DWORD, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddInt(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_INT, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddDword64(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddInt64(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_INT64, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddFloat(json jGff, string sLabel, float v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT, JsonFloat(v));
|
||||
}
|
||||
|
||||
json GffAddDouble(json jGff, string sLabel, float v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE, JsonFloat(v));
|
||||
}
|
||||
|
||||
json GffAddResRef(json jGff, string sLabel, string v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_RESREF, JsonString(v));
|
||||
}
|
||||
|
||||
json GffAddString(json jGff, string sLabel, string v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_STRING, JsonString(v));
|
||||
}
|
||||
|
||||
json GffAddLocString(json jGff, string sLabel, string v, int nStrRef = -1)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING, GffLocString(v, nStrRef));
|
||||
}
|
||||
|
||||
|
||||
json GffReplaceStruct(json jGff, string sLabel, json jStruct)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT, jStruct);
|
||||
}
|
||||
|
||||
json GffReplaceList(json jGff, string sLabel, json jList)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_LIST, jList);
|
||||
}
|
||||
|
||||
json GffReplaceByte(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_BYTE, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceChar(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_CHAR, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceWord(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_WORD, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceShort(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_SHORT, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceDword(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DWORD, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceInt(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_INT, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceDword64(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceInt64(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_INT64, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceFloat(json jGff, string sLabel, float v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT, JsonFloat(v));
|
||||
}
|
||||
|
||||
json GffReplaceDouble(json jGff, string sLabel, float v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE, JsonFloat(v));
|
||||
}
|
||||
|
||||
json GffReplaceResRef(json jGff, string sLabel, string v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_RESREF, JsonString(v));
|
||||
}
|
||||
|
||||
json GffReplaceString(json jGff, string sLabel, string v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_STRING, JsonString(v));
|
||||
}
|
||||
|
||||
json GffReplaceLocString(json jGff, string sLabel, string v, int nStrRef = -1)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING, GffLocString(v, nStrRef));
|
||||
}
|
||||
|
||||
|
||||
json GffRemoveStruct(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT);
|
||||
}
|
||||
|
||||
json GffRemoveList(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_LIST);
|
||||
}
|
||||
|
||||
json GffRemoveByte(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_BYTE);
|
||||
}
|
||||
|
||||
json GffRemoveChar(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_CHAR);
|
||||
}
|
||||
|
||||
json GffRemoveWord(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_WORD);
|
||||
}
|
||||
|
||||
json GffRemoveShort(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_SHORT);
|
||||
}
|
||||
|
||||
json GffRemoveDword(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DWORD);
|
||||
}
|
||||
|
||||
json GffRemoveInt(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_INT);
|
||||
}
|
||||
|
||||
json GffRemoveDword64(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64);
|
||||
}
|
||||
|
||||
json GffRemoveInt64(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_INT64);
|
||||
}
|
||||
|
||||
json GffRemoveFloat(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT);
|
||||
}
|
||||
|
||||
json GffRemoveDouble(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE);
|
||||
}
|
||||
|
||||
json GffRemoveResRef(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_RESREF);
|
||||
}
|
||||
|
||||
json GffRemoveString(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_STRING);
|
||||
}
|
||||
|
||||
json GffRemoveLocString(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING);
|
||||
}
|
||||
|
||||
|
||||
json GffGetStruct(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT);
|
||||
}
|
||||
|
||||
json GffGetList(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_LIST);
|
||||
}
|
||||
|
||||
json GffGetByte(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_BYTE);
|
||||
}
|
||||
|
||||
json GffGetChar(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_CHAR);
|
||||
}
|
||||
|
||||
json GffGetWord(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_WORD);
|
||||
}
|
||||
|
||||
json GffGetShort(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_SHORT);
|
||||
}
|
||||
|
||||
json GffGetDword(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DWORD);
|
||||
}
|
||||
|
||||
json GffGetInt(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_INT);
|
||||
}
|
||||
|
||||
json GffGetDword64(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64);
|
||||
}
|
||||
|
||||
json GffGetInt64(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_INT64);
|
||||
}
|
||||
|
||||
json GffGetFloat(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT);
|
||||
}
|
||||
|
||||
json GffGetDouble(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE);
|
||||
}
|
||||
|
||||
json GffGetResRef(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_RESREF);
|
||||
}
|
||||
|
||||
json GffGetString(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_STRING);
|
||||
}
|
||||
|
||||
json GffGetLocString(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -11,6 +11,8 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Brent, Andrew
|
||||
//:: Created On: November - May
|
||||
//::
|
||||
//:: Updated for .35 by Jaysyn 2023/03/10
|
||||
//:://////////////////////////////////////////////
|
||||
// :: MODS
|
||||
// April 23 2002: Removed animal parts. They were silly.
|
||||
@@ -22,64 +24,65 @@
|
||||
// Moved nymph cloak +4 to treasure bracket 6
|
||||
// Added Monk Enhancement items to random treasure
|
||||
|
||||
#include "prc_class_const"
|
||||
|
||||
// * ---------
|
||||
// * CONSTANTS
|
||||
// * ---------
|
||||
|
||||
|
||||
// * tweaking constants
|
||||
|
||||
// * SIX LEVEL RANGES
|
||||
int RANGE_1_MIN = 0;
|
||||
int RANGE_1_MAX = 5;
|
||||
int RANGE_2_MIN = 6;
|
||||
int RANGE_2_MAX = 8;
|
||||
const int RANGE_1_MIN = 0;
|
||||
const int RANGE_1_MAX = 5;
|
||||
const int RANGE_2_MIN = 6;
|
||||
const int RANGE_2_MAX = 8;
|
||||
|
||||
int RANGE_3_MIN = 9;
|
||||
int RANGE_3_MAX = 10;
|
||||
const int RANGE_3_MIN = 9;
|
||||
const int RANGE_3_MAX = 10;
|
||||
|
||||
int RANGE_4_MIN = 11;
|
||||
int RANGE_4_MAX = 13;
|
||||
const int RANGE_4_MIN = 11;
|
||||
const int RANGE_4_MAX = 13;
|
||||
|
||||
int RANGE_5_MIN = 14;
|
||||
int RANGE_5_MAX = 16;
|
||||
const int RANGE_5_MIN = 14;
|
||||
const int RANGE_5_MAX = 16;
|
||||
|
||||
int RANGE_6_MIN = 17;
|
||||
int RANGE_6_MAX = 100;
|
||||
const int RANGE_6_MIN = 17;
|
||||
const int RANGE_6_MAX = 100;
|
||||
|
||||
// * NUMBER OF ITEMS APPEARING
|
||||
int NUMBER_LOW_ONE = 100; int NUMBER_MED_ONE = 60; int NUMBER_HIGH_ONE = 40; int NUMBER_BOSS_ONE = 100;
|
||||
int NUMBER_LOW_TWO = 0; int NUMBER_MED_TWO = 30; int NUMBER_HIGH_TWO = 40; int NUMBER_BOSS_TWO = 0;
|
||||
int NUMBER_LOW_THREE = 0; int NUMBER_MED_THREE = 10; int NUMBER_HIGH_THREE = 20; int NUMBER_BOSS_THREE = 0;
|
||||
const int NUMBER_LOW_ONE = 100; const int NUMBER_MED_ONE = 60; const int NUMBER_HIGH_ONE = 40; const int NUMBER_BOSS_ONE = 100;
|
||||
const int NUMBER_LOW_TWO = 0; const int NUMBER_MED_TWO = 30; const int NUMBER_HIGH_TWO = 40; const int NUMBER_BOSS_TWO = 0;
|
||||
const int NUMBER_LOW_THREE = 0; const int NUMBER_MED_THREE = 10; const int NUMBER_HIGH_THREE = 20; const int NUMBER_BOSS_THREE = 0;
|
||||
|
||||
int NUMBER_BOOK_ONE = 75;
|
||||
int NUMBER_BOOK_TWO = 20;
|
||||
int NUMBER_BOOK_THREE = 5;
|
||||
const int NUMBER_BOOK_ONE = 75;
|
||||
const int NUMBER_BOOK_TWO = 20;
|
||||
const int NUMBER_BOOK_THREE = 5;
|
||||
|
||||
// * AMOUNT OF GOLD BY VALUE
|
||||
float LOW_MOD_GOLD = 0.5; float MEDIUM_MOD_GOLD = 1.0; float HIGH_MOD_GOLD = 3.0;
|
||||
const float LOW_MOD_GOLD = 0.5; const float MEDIUM_MOD_GOLD = 1.0; const float HIGH_MOD_GOLD = 3.0;
|
||||
// * FREQUENCY OF ITEM TYPE APPEARING BY TREASURE TYPE
|
||||
int LOW_PROB_BOOK = 1; int MEDIUM_PROB_BOOK = 1; int HIGH_PROB_BOOK =1;
|
||||
int LOW_PROB_ANIMAL = 0; int MEDIUM_PROB_ANIMAL = 0; int HIGH_PROB_ANIMAL = 0;
|
||||
int LOW_PROB_JUNK = 2; int MEDIUM_PROB_JUNK = 1; int HIGH_PROB_JUNK = 1;
|
||||
int LOW_PROB_GOLD = 43; int MEDIUM_PROB_GOLD = 38; int HIGH_PROB_GOLD = 15;
|
||||
int LOW_PROB_GEM = 9; int MEDIUM_PROB_GEM = 15; int HIGH_PROB_GEM = 15;
|
||||
int LOW_PROB_JEWEL = 4; int MEDIUM_PROB_JEWEL = 6; int HIGH_PROB_JEWEL = 15;
|
||||
int LOW_PROB_ARCANE = 3; int MEDIUM_PROB_ARCANE = 3; int HIGH_PROB_ARCANE = 3;
|
||||
int LOW_PROB_DIVINE = 3; int MEDIUM_PROB_DIVINE = 3; int HIGH_PROB_DIVINE = 3;
|
||||
int LOW_PROB_AMMO = 10; int MEDIUM_PROB_AMMO = 5; int HIGH_PROB_AMMO = 3;
|
||||
int LOW_PROB_KIT = 5; int MEDIUM_PROB_KIT = 5; int HIGH_PROB_KIT = 5;
|
||||
int LOW_PROB_POTION =17; int MEDIUM_PROB_POTION = 20; int HIGH_PROB_POTION= 9;
|
||||
int LOW_PROB_TABLE2 = 3; int MEDIUM_PROB_TABLE2 = 3; int HIGH_PROB_TABLE2= 30;
|
||||
const int LOW_PROB_BOOK = 1; const int MEDIUM_PROB_BOOK = 1; const int HIGH_PROB_BOOK =1;
|
||||
const int LOW_PROB_ANIMAL = 0; const int MEDIUM_PROB_ANIMAL = 0; const int HIGH_PROB_ANIMAL = 0;
|
||||
const int LOW_PROB_JUNK = 2; const int MEDIUM_PROB_JUNK = 1; const int HIGH_PROB_JUNK = 1;
|
||||
const int LOW_PROB_GOLD = 43; const int MEDIUM_PROB_GOLD = 38; const int HIGH_PROB_GOLD = 15;
|
||||
const int LOW_PROB_GEM = 9; const int MEDIUM_PROB_GEM = 15; const int HIGH_PROB_GEM = 15;
|
||||
const int LOW_PROB_JEWEL = 4; const int MEDIUM_PROB_JEWEL = 6; const int HIGH_PROB_JEWEL = 15;
|
||||
const int LOW_PROB_ARCANE = 3; const int MEDIUM_PROB_ARCANE = 3; const int HIGH_PROB_ARCANE = 3;
|
||||
const int LOW_PROB_DIVINE = 3; const int MEDIUM_PROB_DIVINE = 3; const int HIGH_PROB_DIVINE = 3;
|
||||
const int LOW_PROB_AMMO = 10; const int MEDIUM_PROB_AMMO = 5; const int HIGH_PROB_AMMO = 3;
|
||||
const int LOW_PROB_KIT = 5; const int MEDIUM_PROB_KIT = 5; const int HIGH_PROB_KIT = 5;
|
||||
const int LOW_PROB_POTION =17; const int MEDIUM_PROB_POTION = 20; const int HIGH_PROB_POTION= 9;
|
||||
const int LOW_PROB_TABLE2 = 3; const int MEDIUM_PROB_TABLE2 = 3; const int HIGH_PROB_TABLE2= 30;
|
||||
|
||||
|
||||
// * readability constants
|
||||
|
||||
int TREASURE_LOW = 1;
|
||||
int TREASURE_MEDIUM = 2;
|
||||
int TREASURE_HIGH = 3;
|
||||
int TREASURE_BOSS = 4;
|
||||
int TREASURE_BOOK = 5;
|
||||
const int TREASURE_LOW = 1;
|
||||
const int TREASURE_MEDIUM = 2;
|
||||
const int TREASURE_HIGH = 3;
|
||||
const int TREASURE_BOSS = 4;
|
||||
const int TREASURE_BOOK = 5;
|
||||
|
||||
|
||||
// * JUMP_LEVEL is used in a Specific item function
|
||||
@@ -88,7 +91,7 @@ int TREASURE_BOOK = 5;
|
||||
// * hit die for the purposes of the treasure evaluation.
|
||||
// * May 2002: Lowered JUMP_LEVEL from 3 to 2
|
||||
|
||||
int JUMP_LEVEL = 2;
|
||||
const int JUMP_LEVEL = 2;
|
||||
|
||||
|
||||
//* Declarations
|
||||
@@ -115,11 +118,13 @@ void dbSpeak(string s)
|
||||
//* made this function to help with debugging
|
||||
void dbCreateItemOnObject(string sItemTemplate, object oTarget = OBJECT_SELF, int nStackSize = 1)
|
||||
{
|
||||
/*
|
||||
if (sItemTemplate == "")
|
||||
{
|
||||
PrintString("blank item passed into dbCreateItemOnObject. Please report as bug to Brent.");
|
||||
}
|
||||
dbSpeak(sItemTemplate);
|
||||
*/
|
||||
|
||||
//sItemTemplate = GetStringLowerCase
|
||||
|
||||
@@ -129,13 +134,14 @@ void dbCreateItemOnObject(string sItemTemplate, object oTarget = OBJECT_SELF, in
|
||||
// * it creates more
|
||||
|
||||
string sRoot = GetSubString(sItemTemplate, 0, 6);
|
||||
dbSpeak("ROOT: " + sRoot);
|
||||
//dbSpeak("ROOT: " + sRoot);
|
||||
if (GetStringLowerCase(sRoot) == "nw_wth")
|
||||
{
|
||||
nStackSize = Random(30) + 1;
|
||||
}
|
||||
}
|
||||
object oItem = CreateItemOnObject(sItemTemplate, oTarget, nStackSize);
|
||||
/*
|
||||
if (GetIsObjectValid(oItem) == FALSE && sItemTemplate != "NW_IT_GOLD001")
|
||||
{
|
||||
|
||||
@@ -148,6 +154,7 @@ void dbCreateItemOnObject(string sItemTemplate, object oTarget = OBJECT_SELF, in
|
||||
PrintString("*******");
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
@@ -160,16 +167,16 @@ object GetLastOpener()
|
||||
{
|
||||
if (GetIsObjectValid(GetLastOpenedBy()) == TRUE)
|
||||
{
|
||||
dbSpeak("LastOpener: GetLastOpenedBy " + GetTag(GetLastOpenedBy()));
|
||||
//dbSpeak("LastOpener: GetLastOpenedBy " + GetTag(GetLastOpenedBy()));
|
||||
return GetLastOpenedBy();
|
||||
}
|
||||
else
|
||||
if (GetIsObjectValid(GetLastKiller()) == TRUE)
|
||||
{
|
||||
dbSpeak("LastOpener: GetLastAttacker");
|
||||
//dbSpeak("LastOpener: GetLastAttacker");
|
||||
return GetLastKiller();
|
||||
}
|
||||
dbSpeak("LastOpener: The Object is Invalid you weenie!");
|
||||
//dbSpeak("LastOpener: The Object is Invalid you weenie!");
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
|
||||
@@ -200,9 +207,9 @@ int GetRange(int nCategory, int nHD)
|
||||
case 1: nMin = RANGE_1_MIN; nMax = RANGE_1_MAX; break;
|
||||
}
|
||||
|
||||
dbSpeak("nMin = " + IntToString(nMin));
|
||||
dbSpeak("nMax = " + IntToString(nMax));
|
||||
dbSpeak("GetRange.nHD = " + IntToString(nHD));
|
||||
//dbSpeak("nMin = " + IntToString(nMin));
|
||||
//dbSpeak("nMax = " + IntToString(nMax));
|
||||
//dbSpeak("GetRange.nHD = " + IntToString(nHD));
|
||||
if (nHD >= nMin && nHD <= nMax)
|
||||
{
|
||||
return TRUE;
|
||||
@@ -312,7 +319,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
{
|
||||
sRes = "NW_IT_BOOK0" + IntToString(nBook1);
|
||||
}
|
||||
dbSpeak("Create book");
|
||||
//dbSpeak("Create book");
|
||||
dbCreateItemOnObject(sRes, oTarget);
|
||||
}
|
||||
|
||||
@@ -327,7 +334,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
case 2: sRes = "NW_IT_MMIDMISC05"; break;
|
||||
case 3: sRes = "NW_IT_MMIDMISC06"; break;
|
||||
}
|
||||
dbSpeak("animal");
|
||||
//dbSpeak("animal");
|
||||
dbCreateItemOnObject(sRes, oTarget);
|
||||
}
|
||||
|
||||
@@ -346,7 +353,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
case 5: sRes = "NW_IT_MPOTION022"; break; // spirits
|
||||
case 6: sRes = "NW_IT_TORCH001"; break; //torch
|
||||
}
|
||||
dbSpeak("CreateJunk");
|
||||
//dbSpeak("CreateJunk");
|
||||
dbCreateItemOnObject(sRes, oTarget);
|
||||
}
|
||||
// *
|
||||
@@ -392,7 +399,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
{
|
||||
nAmount = 1;
|
||||
}
|
||||
dbSpeak("gold");
|
||||
//dbSpeak("gold");
|
||||
dbCreateItemOnObject("NW_IT_GOLD001", oTarget, nAmount);
|
||||
}
|
||||
void CreateGem(object oTarget, object oAdventurer, int nTreasureType, int nModifier = 0)
|
||||
@@ -476,7 +483,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
case 8: sGem = "nw_it_gem012"; break;
|
||||
}
|
||||
}
|
||||
dbSpeak("Create Gem");
|
||||
//dbSpeak("Create Gem");
|
||||
dbCreateItemOnObject(sGem, oTarget, 1);
|
||||
}
|
||||
void CreateJewel(object oTarget, object oAdventurer, int nTreasureType, int nModifier = 0)
|
||||
@@ -547,7 +554,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
case 5: case 6: sJewel = "nw_it_mneck022"; break;
|
||||
}
|
||||
}
|
||||
dbSpeak("Create Jewel");
|
||||
//dbSpeak("Create Jewel");
|
||||
|
||||
dbCreateItemOnObject(sJewel, oTarget, 1);
|
||||
|
||||
@@ -697,7 +704,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
case 7: sScroll = "nw_it_spdvscr702"; break;
|
||||
}
|
||||
}
|
||||
dbSpeak("Divine Scroll");
|
||||
//dbSpeak("Divine Scroll");
|
||||
|
||||
dbCreateItemOnObject(sScroll, oTarget, 1);
|
||||
|
||||
@@ -784,7 +791,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
case 20: sAmmo = "nw_wammbu007"; break;
|
||||
}
|
||||
}
|
||||
dbSpeak("ammo");
|
||||
//dbSpeak("ammo");
|
||||
dbCreateItemOnObject(sAmmo, oTarget, Random(30) + 1); // create up to 30 of the specified ammo type
|
||||
}
|
||||
|
||||
@@ -935,7 +942,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Create Trapkit");
|
||||
//dbSpeak("Create Trapkit");
|
||||
dbCreateItemOnObject(sKit, oTarget, 1);
|
||||
|
||||
}
|
||||
@@ -1001,7 +1008,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Create Healing Kit");
|
||||
//dbSpeak("Create Healing Kit");
|
||||
|
||||
dbCreateItemOnObject(sKit, oTarget, 1);
|
||||
|
||||
@@ -1076,7 +1083,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Create Lockpick");
|
||||
//dbSpeak("Create Lockpick");
|
||||
|
||||
dbCreateItemOnObject(sKit, oTarget, 1);
|
||||
|
||||
@@ -1213,7 +1220,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
case 29: sPotion = "nw_it_mpotion006"; break;
|
||||
}
|
||||
}
|
||||
dbSpeak("Create Potion");
|
||||
//dbSpeak("Create Potion");
|
||||
dbCreateItemOnObject(sPotion, oTarget, 1);
|
||||
}
|
||||
//::///////////////////////////////////////////////
|
||||
@@ -1476,7 +1483,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
case 30: sItem = "nw_it_mneck018"; break;
|
||||
}
|
||||
}
|
||||
dbSpeak("Create Misc");
|
||||
//dbSpeak("Create Misc");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
}
|
||||
@@ -1536,7 +1543,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
else
|
||||
if (GetLevelByClass(CLASS_TYPE_MONK, oAdventurer)>= 1)
|
||||
{
|
||||
dbSpeak("in monk function");
|
||||
//dbSpeak("in monk function");
|
||||
if (nSpecific == 0)
|
||||
{
|
||||
CreateGenericMonkWeapon(oTarget, oAdventurer);
|
||||
@@ -1631,7 +1638,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Generic Rod staff wand");
|
||||
//dbSpeak("Generic Rod staff wand");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
}
|
||||
@@ -1747,7 +1754,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
case 13: sItem = "nw_waxmhn011"; break;
|
||||
}
|
||||
}
|
||||
dbSpeak("Generic Monk Weapon");
|
||||
//dbSpeak("Generic Monk Weapon");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
}
|
||||
@@ -1888,7 +1895,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Specific Monk Weapon");
|
||||
//dbSpeak("Specific Monk Weapon");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
|
||||
@@ -2004,7 +2011,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Generic Druid weapon");
|
||||
//dbSpeak("Generic Druid weapon");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
|
||||
@@ -2082,7 +2089,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("specific druid weapon");
|
||||
//dbSpeak("specific druid weapon");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
|
||||
@@ -2168,7 +2175,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Generic Wizard or Sorcerer Weapon");
|
||||
//dbSpeak("Generic Wizard or Sorcerer Weapon");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
|
||||
@@ -2241,7 +2248,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Specific Wizard or Sorcerer Weapon");
|
||||
//dbSpeak("Specific Wizard or Sorcerer Weapon");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
|
||||
@@ -2410,7 +2417,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
|
||||
}
|
||||
}
|
||||
dbSpeak("Create Generic SImple; Specific = " + IntToString(nModifier));
|
||||
//dbSpeak("Create Generic SImple; Specific = " + IntToString(nModifier));
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
}
|
||||
@@ -2594,7 +2601,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
|
||||
}
|
||||
|
||||
dbSpeak("Create Generic Martial");
|
||||
//dbSpeak("Create Generic Martial");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
}
|
||||
@@ -2726,7 +2733,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Create generic exotic");
|
||||
//dbSpeak("Create generic exotic");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
}
|
||||
@@ -2825,7 +2832,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Create Generic light");
|
||||
//dbSpeak("Create Generic light");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
}
|
||||
@@ -2952,7 +2959,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Create Generic medium");
|
||||
//dbSpeak("Create Generic medium");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
}
|
||||
@@ -3058,7 +3065,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
}
|
||||
|
||||
}
|
||||
dbSpeak("Create Generic heavy");
|
||||
// dbSpeak("Create Generic heavy");
|
||||
|
||||
dbCreateItemOnObject(sItem, oTarget, 1);
|
||||
}
|
||||
@@ -4007,7 +4014,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
// * if nSpecific is = 1 then spawn in 'named' items at the higher levels
|
||||
void CreateTable2Item(object oTarget, object oAdventurer, int nSpecific=0)
|
||||
{
|
||||
dbSpeak("In CreateTable2Item");
|
||||
//dbSpeak("In CreateTable2Item");
|
||||
string sItem = "";
|
||||
int nProbMisc = 0;
|
||||
int nProbClass = 0;
|
||||
@@ -4042,9 +4049,12 @@ int GetNumberOfItems(int nTreasureType)
|
||||
|
||||
|
||||
//* SETUP probabilities based on Class
|
||||
if ( nClass == CLASS_TYPE_FIGHTER || nClass == CLASS_TYPE_PALADIN || nSpecialRanger == 1)
|
||||
if ( nClass == CLASS_TYPE_FIGHTER || nClass == CLASS_TYPE_PALADIN || nSpecialRanger == 1
|
||||
|| nClass == CLASS_TYPE_ANTI_PALADIN || nClass == CLASS_TYPE_BRAWLER || nClass == CLASS_TYPE_CRUSADER
|
||||
|| nClass == CLASS_TYPE_DUSKBLADE || nClass == CLASS_TYPE_KNIGHT || nClass == CLASS_TYPE_MARSHAL
|
||||
|| nClass == CLASS_TYPE_PSYWAR || nClass == CLASS_TYPE_SOHEI)
|
||||
{
|
||||
dbSpeak("I am fighter or paladin or heavy ranger");
|
||||
//dbSpeak("I am fighter or paladin or heavy ranger");
|
||||
nProbMisc = 20;
|
||||
nProbClass = 0;
|
||||
nProbRodStaffWand = 5;
|
||||
@@ -4058,7 +4068,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
else
|
||||
if (nClass == CLASS_TYPE_WIZARD || nClass == CLASS_TYPE_SORCERER)
|
||||
{
|
||||
dbSpeak("I am wizard or sorcerer");
|
||||
//dbSpeak("I am wizard or sorcerer");
|
||||
nProbMisc = 40;
|
||||
nProbClass = 30;
|
||||
nProbRodStaffWand = 15;
|
||||
@@ -4070,9 +4080,10 @@ int GetNumberOfItems(int nTreasureType)
|
||||
nProbHeavy = 2;
|
||||
}
|
||||
else
|
||||
if (nClass == CLASS_TYPE_BARBARIAN || nSpecialRanger == 2)
|
||||
if (nClass == CLASS_TYPE_BARBARIAN || nSpecialRanger == 2 || nClass == CLASS_TYPE_BOWMAN
|
||||
|| nClass == CLASS_TYPE_HEXBLADE || nClass == CLASS_TYPE_WARBLADE)
|
||||
{
|
||||
dbSpeak("I am barbarian or light ranger");
|
||||
//dbSpeak("I am barbarian or light ranger");
|
||||
|
||||
nProbMisc = 20;
|
||||
nProbClass = 0;
|
||||
@@ -4085,9 +4096,97 @@ int GetNumberOfItems(int nTreasureType)
|
||||
nProbHeavy = 3;
|
||||
}
|
||||
else
|
||||
if (nClass == CLASS_TYPE_ARCHIVIST || nClass == CLASS_TYPE_DRAGON_SHAMAN || nClass == CLASS_TYPE_FAVOURED_SOUL
|
||||
|| nClass == CLASS_TYPE_MYSTIC || nClass == CLASS_TYPE_WARMAGE || nClass == CLASS_TYPE_TEMPLAR)
|
||||
{
|
||||
//type 1
|
||||
nProbMisc = 25;
|
||||
nProbClass = 0;
|
||||
nProbRodStaffWand = 15;
|
||||
nProbSimple = 15;
|
||||
nProbMartial = 8;
|
||||
nProbExotic = 6;
|
||||
nProbLight = 15;
|
||||
nProbMedium = 10;
|
||||
nProbHeavy = 6;
|
||||
}
|
||||
else
|
||||
if (nClass == CLASS_TYPE_NOBLE || nClass == CLASS_TYPE_SWASHBUCKLER || nClass == CLASS_TYPE_SWORDSAGE
|
||||
|| nClass == CLASS_TYPE_ULTIMATE_RANGER)
|
||||
{
|
||||
//type 2
|
||||
nProbMisc = 27;
|
||||
nProbClass = 0;
|
||||
nProbRodStaffWand = 5;
|
||||
nProbSimple = 15;
|
||||
nProbMartial = 20;
|
||||
nProbExotic = 10;
|
||||
nProbLight = 10;
|
||||
nProbMedium = 8;
|
||||
nProbHeavy = 5;
|
||||
}
|
||||
else
|
||||
if (nClass == CLASS_TYPE_BEGUILER || nClass == CLASS_TYPE_DREAD_NECROMANCER || nClass == CLASS_TYPE_HEALER
|
||||
|| nClass == CLASS_TYPE_SCOUT || nClass == CLASS_TYPE_SHAMAN || nClass == CLASS_TYPE_SOULKNIFE
|
||||
|| nClass == CLASS_TYPE_TRUENAMER || nClass == CLASS_TYPE_WARLOCK || nClass == CLASS_TYPE_WILDER)
|
||||
{
|
||||
//type 3
|
||||
nProbMisc = 45;
|
||||
nProbClass = 0;
|
||||
nProbRodStaffWand = 7;
|
||||
nProbSimple = 15;
|
||||
nProbMartial = 5;
|
||||
nProbExotic = 5;
|
||||
nProbLight = 15;
|
||||
nProbMedium = 4;
|
||||
nProbHeavy = 4;
|
||||
}
|
||||
else
|
||||
if (nClass == CLASS_TYPE_DRAGONFIRE_ADEPT || nClass == CLASS_TYPE_PSION || nClass == CLASS_TYPE_WITCH)
|
||||
{
|
||||
//type 4
|
||||
nProbMisc = 50;
|
||||
nProbClass = 0;
|
||||
nProbRodStaffWand = 10;
|
||||
nProbSimple = 20;
|
||||
nProbMartial = 5;
|
||||
nProbExotic = 5;
|
||||
nProbLight = 4;
|
||||
nProbMedium = 3;
|
||||
nProbHeavy = 3;
|
||||
}
|
||||
else
|
||||
if (nClass == CLASS_TYPE_NINJA)
|
||||
{
|
||||
//type 5
|
||||
nProbMisc = 45;
|
||||
nProbClass = 0;
|
||||
nProbRodStaffWand = 2;
|
||||
nProbSimple = 12;
|
||||
nProbMartial = 6;
|
||||
nProbExotic = 26;
|
||||
nProbLight = 3;
|
||||
nProbMedium = 3;
|
||||
nProbHeavy = 3;
|
||||
}
|
||||
else
|
||||
if (nClass == CLASS_TYPE_CW_SAMURAI || nClass == CLASS_TYPE_SAMURAI)
|
||||
{
|
||||
//type 6
|
||||
nProbMisc = 25;
|
||||
nProbClass = 0;
|
||||
nProbRodStaffWand = 5;
|
||||
nProbSimple = 5;
|
||||
nProbMartial = 10;
|
||||
nProbExotic = 20;
|
||||
nProbLight = 10;
|
||||
nProbMedium = 20;
|
||||
nProbHeavy = 5;
|
||||
}
|
||||
else
|
||||
if (nClass == CLASS_TYPE_CLERIC)
|
||||
{
|
||||
dbSpeak("I am cleric");
|
||||
//dbSpeak("I am cleric");
|
||||
|
||||
nProbMisc = 20;
|
||||
nProbClass = 10;
|
||||
@@ -4102,7 +4201,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
else
|
||||
if (nClass == CLASS_TYPE_DRUID)
|
||||
{
|
||||
dbSpeak("I am druid");
|
||||
//dbSpeak("I am druid");
|
||||
|
||||
nProbMisc = 20;
|
||||
nProbClass = 25;
|
||||
@@ -4117,7 +4216,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
else
|
||||
if (nClass == CLASS_TYPE_MONK)
|
||||
{
|
||||
dbSpeak("I am monk");
|
||||
//dbSpeak("I am monk");
|
||||
nProbMisc = 20;
|
||||
nProbClass = 50;
|
||||
nProbRodStaffWand = 2;
|
||||
@@ -4129,9 +4228,9 @@ int GetNumberOfItems(int nTreasureType)
|
||||
nProbHeavy = 4;
|
||||
}
|
||||
else
|
||||
if (nClass == CLASS_TYPE_ROGUE)
|
||||
if (nClass == CLASS_TYPE_ROGUE || nClass == CLASS_TYPE_PSYCHIC_ROGUE)
|
||||
{
|
||||
dbSpeak("I am rogue");
|
||||
//dbSpeak("I am rogue");
|
||||
|
||||
nProbMisc = 25;
|
||||
nProbClass = 10;
|
||||
@@ -4146,7 +4245,7 @@ int GetNumberOfItems(int nTreasureType)
|
||||
else
|
||||
if (nClass == CLASS_TYPE_BARD)
|
||||
{
|
||||
dbSpeak("I am bard");
|
||||
//dbSpeak("I am bard");
|
||||
|
||||
nProbMisc = 25;
|
||||
nProbClass = 5;
|
||||
@@ -4158,11 +4257,11 @@ int GetNumberOfItems(int nTreasureType)
|
||||
nProbMedium = 5;
|
||||
nProbHeavy = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
dbSpeak("No Valid Class");
|
||||
}
|
||||
dbSpeak("Table2Item: After Class Distribution");
|
||||
//else
|
||||
//{
|
||||
// dbSpeak("No Valid Class");
|
||||
//}
|
||||
//dbSpeak("Table2Item: After Class Distribution");
|
||||
//* Create Items based on Probabilities
|
||||
int nRandom = d100();
|
||||
if (nRandom <= nProbMisc)
|
||||
@@ -4219,10 +4318,10 @@ int GetNumberOfItems(int nTreasureType)
|
||||
if (nSpecific == 0) CreateGenericHeavyArmor(oTarget, oAdventurer);
|
||||
else CreateSpecificHeavyArmor(oTarget, oAdventurer);
|
||||
}
|
||||
else
|
||||
{
|
||||
dbSpeak("Generic Generic or Specific; error: 3524");
|
||||
}
|
||||
//else
|
||||
//{
|
||||
// dbSpeak("Generic Generic or Specific; error: 3524");
|
||||
//}
|
||||
}
|
||||
|
||||
//::///////////////////////////////////////////////
|
||||
@@ -4251,12 +4350,12 @@ int GetNumberOfItems(int nTreasureType)
|
||||
void GenerateTreasure(int nTreasureType, object oLastOpener, object oCreateOn)
|
||||
{
|
||||
|
||||
dbSpeak("*********************NEW TREASURE*************************");
|
||||
//dbSpeak("*********************NEW TREASURE*************************");
|
||||
|
||||
// * abort treasure if no one opened the container
|
||||
if (GetIsObjectValid(oLastOpener) == FALSE)
|
||||
{
|
||||
dbSpeak("Aborted. No valid Last Opener");
|
||||
//dbSpeak("Aborted. No valid Last Opener");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -4334,7 +4433,7 @@ void GenerateTreasure(int nTreasureType, object oLastOpener, object oCreateOn)
|
||||
nProbTable2 = HIGH_PROB_TABLE2;
|
||||
}
|
||||
else if (nTreasureType == TREASURE_BOSS)
|
||||
{ dbSpeak("boss");
|
||||
{ //dbSpeak("boss");
|
||||
nProbTable2 = 100;
|
||||
nSpecific = 1;
|
||||
}
|
||||
@@ -4345,7 +4444,7 @@ void GenerateTreasure(int nTreasureType, object oLastOpener, object oCreateOn)
|
||||
nProbDivine = 4;
|
||||
}
|
||||
|
||||
dbSpeak("Generate Treasure nSpecific = " + IntToString(nSpecific));
|
||||
//dbSpeak("Generate Treasure nSpecific = " + IntToString(nSpecific));
|
||||
|
||||
for (i = 1; i <= nNumberItems; i++)
|
||||
{
|
||||
@@ -4376,8 +4475,8 @@ void GenerateTreasure(int nTreasureType, object oLastOpener, object oCreateOn)
|
||||
{
|
||||
CreateTable2Item(oCreateOn, oLastOpener, nSpecific); // * Weapons, Armor, Misc - Class based
|
||||
}
|
||||
else
|
||||
dbSpeak("other stuff");
|
||||
//else
|
||||
// dbSpeak("other stuff");
|
||||
|
||||
|
||||
|
||||
@@ -4385,23 +4484,23 @@ void GenerateTreasure(int nTreasureType, object oLastOpener, object oCreateOn)
|
||||
}
|
||||
void GenerateLowTreasure(object oLastOpener, object oCreateOn=OBJECT_INVALID)
|
||||
{
|
||||
//GenerateTreasure(TREASURE_LOW, oLastOpener, oCreateOn);
|
||||
GenerateTreasure(TREASURE_LOW, oLastOpener, oCreateOn);
|
||||
}
|
||||
void GenerateMediumTreasure(object oLastOpener, object oCreateOn=OBJECT_INVALID)
|
||||
{
|
||||
//GenerateTreasure(TREASURE_MEDIUM, oLastOpener, oCreateOn);
|
||||
GenerateTreasure(TREASURE_MEDIUM, oLastOpener, oCreateOn);
|
||||
}
|
||||
void GenerateHighTreasure(object oLastOpener, object oCreateOn=OBJECT_INVALID)
|
||||
{
|
||||
//GenerateTreasure(TREASURE_HIGH, oLastOpener, oCreateOn);
|
||||
GenerateTreasure(TREASURE_HIGH, oLastOpener, oCreateOn);
|
||||
}
|
||||
void GenerateBossTreasure(object oLastOpener, object oCreateOn=OBJECT_INVALID)
|
||||
{
|
||||
//GenerateTreasure(TREASURE_BOSS, oLastOpener, oCreateOn);
|
||||
GenerateTreasure(TREASURE_BOSS, oLastOpener, oCreateOn);
|
||||
}
|
||||
void GenerateBookTreasure(object oLastOpener, object oCreateOn=OBJECT_INVALID)
|
||||
{
|
||||
//GenerateTreasure(TREASURE_BOOK, oLastOpener, oCreateOn);
|
||||
GenerateTreasure(TREASURE_BOOK, oLastOpener, oCreateOn);
|
||||
}
|
||||
//::///////////////////////////////////////////////
|
||||
//:: GenerateNPCTreasure
|
||||
@@ -4443,23 +4542,23 @@ void GenerateNPCTreasure(int nTreasureValue=1, object oTreasureGetter=OBJECT_SEL
|
||||
// if a creature
|
||||
if (Random(100)+1 >= 75)
|
||||
{
|
||||
//GenerateTreasure(TREASURE_LOW, oTreasureGetter, oKiller);
|
||||
GenerateTreasure(TREASURE_LOW, oTreasureGetter, oKiller);
|
||||
}
|
||||
}
|
||||
else
|
||||
if (nTreasureValue == 2)
|
||||
{
|
||||
//GenerateTreasure(TREASURE_MEDIUM, oTreasureGetter, oKiller);
|
||||
GenerateTreasure(TREASURE_MEDIUM, oTreasureGetter, oKiller);
|
||||
}
|
||||
else
|
||||
if (nTreasureValue == 3)
|
||||
{
|
||||
//GenerateTreasure(TREASURE_HIGH, oTreasureGetter, oKiller);
|
||||
GenerateTreasure(TREASURE_HIGH, oTreasureGetter, oKiller);
|
||||
}
|
||||
else
|
||||
if (nTreasureValue == 4)
|
||||
{
|
||||
//GenerateBossTreasure(oKiller, oTreasureGetter);
|
||||
GenerateBossTreasure(oKiller, oTreasureGetter);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4518,6 +4617,47 @@ void ShoutDisturbed()
|
||||
}
|
||||
}
|
||||
|
||||
int nGetIsBaseClass(int nClass)
|
||||
{
|
||||
return (nClass <= CLASS_TYPE_WIZARD ||
|
||||
nClass == CLASS_TYPE_ANTI_PALADIN ||
|
||||
nClass == CLASS_TYPE_ARCHIVIST ||
|
||||
nClass == CLASS_TYPE_BEGUILER ||
|
||||
nClass == CLASS_TYPE_BOWMAN ||
|
||||
nClass == CLASS_TYPE_BRAWLER ||
|
||||
nClass == CLASS_TYPE_CRUSADER ||
|
||||
nClass == CLASS_TYPE_DRAGON_SHAMAN ||
|
||||
nClass == CLASS_TYPE_DRAGONFIRE_ADEPT ||
|
||||
nClass == CLASS_TYPE_DREAD_NECROMANCER ||
|
||||
nClass == CLASS_TYPE_DUSKBLADE ||
|
||||
nClass == CLASS_TYPE_FAVOURED_SOUL ||
|
||||
nClass == CLASS_TYPE_HEALER ||
|
||||
nClass == CLASS_TYPE_HEXBLADE ||
|
||||
nClass == CLASS_TYPE_KNIGHT ||
|
||||
nClass == CLASS_TYPE_MARSHAL ||
|
||||
nClass == CLASS_TYPE_MYSTIC ||
|
||||
nClass == CLASS_TYPE_NINJA ||
|
||||
nClass == CLASS_TYPE_NOBLE ||
|
||||
nClass == CLASS_TYPE_PSION ||
|
||||
nClass == CLASS_TYPE_PSYWAR ||
|
||||
nClass == CLASS_TYPE_PSYCHIC_ROGUE ||
|
||||
nClass == CLASS_TYPE_SAMURAI ||
|
||||
nClass == CLASS_TYPE_CW_SAMURAI ||
|
||||
nClass == CLASS_TYPE_SCOUT ||
|
||||
nClass == CLASS_TYPE_SHAMAN ||
|
||||
nClass == CLASS_TYPE_SOHEI ||
|
||||
nClass == CLASS_TYPE_SOULKNIFE ||
|
||||
nClass == CLASS_TYPE_SWASHBUCKLER ||
|
||||
nClass == CLASS_TYPE_SWORDSAGE ||
|
||||
nClass == CLASS_TYPE_TRUENAMER ||
|
||||
nClass == CLASS_TYPE_ULTIMATE_RANGER ||
|
||||
nClass == CLASS_TYPE_WARBLADE ||
|
||||
nClass == CLASS_TYPE_WARLOCK ||
|
||||
nClass == CLASS_TYPE_WARMAGE ||
|
||||
nClass == CLASS_TYPE_WILDER ||
|
||||
nClass == CLASS_TYPE_WITCH ||
|
||||
nClass == CLASS_TYPE_TEMPLAR);
|
||||
}
|
||||
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Determine Class to Use
|
||||
@@ -4536,35 +4676,96 @@ int nDetermineClassToUse(object oCharacter)
|
||||
{
|
||||
int nClass;
|
||||
int nTotal = GetHitDice(oCharacter);
|
||||
dbSpeak("Hit dice " + IntToString(nTotal));
|
||||
//dbSpeak("Hit dice " + IntToString(nTotal));
|
||||
if (nTotal < 1)
|
||||
{
|
||||
nTotal = 1;
|
||||
}
|
||||
/*
|
||||
float fTotal = IntToFloat(nTotal);
|
||||
if (GetIsObjectValid(oCharacter) == FALSE)
|
||||
{
|
||||
dbSpeak("DetermineClassToUse: This character is invalid");
|
||||
}
|
||||
//if (GetIsObjectValid(oCharacter) == FALSE)
|
||||
//{
|
||||
// dbSpeak("DetermineClassToUse: This character is invalid");
|
||||
//}
|
||||
|
||||
int nClass1 = GetClassByPosition(1, oCharacter);
|
||||
int nState1 = FloatToInt((IntToFloat(GetLevelByClass(nClass1, oCharacter)) / fTotal) * 100);
|
||||
dbSpeak("Level 1 Class Level = " + IntToString(GetLevelByClass(nClass1,oCharacter)));
|
||||
//dbSpeak("Level 1 Class Level = " + IntToString(GetLevelByClass(nClass1,oCharacter)));
|
||||
|
||||
PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 1 " + IntToString(nState1));
|
||||
dbSpeak("State 1 " + IntToString(nState1));
|
||||
//PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 1 " + IntToString(nState1));
|
||||
//dbSpeak("State 1 " + IntToString(nState1));
|
||||
int nClass2 = GetClassByPosition(2, oCharacter);
|
||||
int nState2 = FloatToInt((IntToFloat(GetLevelByClass(nClass2, oCharacter)) / fTotal) * 100) + nState1;
|
||||
PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 2 " + IntToString(nState2));
|
||||
//PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 2 " + IntToString(nState2));
|
||||
|
||||
int nClass3 = GetClassByPosition(3, oCharacter);
|
||||
int nState3 = FloatToInt((IntToFloat(GetLevelByClass(nClass3, oCharacter)) / fTotal) * 100) + nState2;
|
||||
PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 3 " + IntToString(nState3));
|
||||
//PrintString("GENERIC SCRIPT DEBUG STRING ********** " + GetTag(oCharacter) + "Class 3 " + IntToString(nState3));
|
||||
*/
|
||||
int nClass1 = GetClassByPosition(1, oCharacter);
|
||||
int nClass2 = GetClassByPosition(2, oCharacter);
|
||||
int nClass3 = GetClassByPosition(3, oCharacter);
|
||||
int nClass4 = GetClassByPosition(4, oCharacter);
|
||||
int nClass5 = GetClassByPosition(5, oCharacter);
|
||||
int nClass6 = GetClassByPosition(6, oCharacter);
|
||||
int nClass7 = GetClassByPosition(7, oCharacter);
|
||||
int nClass8 = GetClassByPosition(8, oCharacter);
|
||||
|
||||
int nState1 = GetLevelByClass(nClass1, oCharacter) * 100 / nTotal;
|
||||
int nState2 = GetLevelByClass(nClass2, oCharacter) * 100 / nTotal + nState1;
|
||||
int nState3 = GetLevelByClass(nClass3, oCharacter) * 100 / nTotal + nState2;
|
||||
int nState4 = GetLevelByClass(nClass4, oCharacter) * 100 / nTotal + nState3;
|
||||
int nState5 = GetLevelByClass(nClass5, oCharacter) * 100 / nTotal + nState4;
|
||||
int nState6 = GetLevelByClass(nClass6, oCharacter) * 100 / nTotal + nState5;
|
||||
int nState7 = GetLevelByClass(nClass7, oCharacter) * 100 / nTotal + nState6;
|
||||
|
||||
// nState8 will always be 100 if there is an eigth class, or 0 if there isn't
|
||||
//int nState8 = GetLevelByClass(nClass3, oCharacter) * 100 / nTotal + nState7;
|
||||
|
||||
// correct for unrecognized classes - assumes the first class will be a non-prestige player class
|
||||
if(nClass2 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass2))
|
||||
{
|
||||
nClass2 = CLASS_TYPE_INVALID;
|
||||
nState1 = nState2;
|
||||
}
|
||||
if(nClass3 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass3))
|
||||
{
|
||||
nClass3 = CLASS_TYPE_INVALID;
|
||||
nState1 = nState3;
|
||||
}
|
||||
if(nClass4 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass4))
|
||||
{
|
||||
nClass4 = CLASS_TYPE_INVALID;
|
||||
nState1 = nState4;
|
||||
}
|
||||
if(nClass5 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass5))
|
||||
{
|
||||
nClass5 = CLASS_TYPE_INVALID;
|
||||
nState1 = nState5;
|
||||
}
|
||||
if(nClass6 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass6))
|
||||
{
|
||||
nClass6 = CLASS_TYPE_INVALID;
|
||||
nState1 = nState6;
|
||||
}
|
||||
if(nClass7 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass7))
|
||||
{
|
||||
nClass7 = CLASS_TYPE_INVALID;
|
||||
nState1 = nState7;
|
||||
}
|
||||
if(nClass8 != CLASS_TYPE_INVALID && !nGetIsBaseClass(nClass8))
|
||||
{
|
||||
nClass8 = CLASS_TYPE_INVALID;
|
||||
if(nClass7 != CLASS_TYPE_INVALID)
|
||||
nState7 = 100;
|
||||
else nState1 = 100;
|
||||
}
|
||||
|
||||
int nUseClass = d100();
|
||||
PrintString("GENERIC SCRIPT DEBUG STRING ********** " + "D100 Roll " +IntToString(nUseClass));
|
||||
//PrintString("GENERIC SCRIPT DEBUG STRING ********** " + "D100 Roll " +IntToString(nUseClass));
|
||||
|
||||
|
||||
dbSpeak("Before comparison : " + IntToString(nClass1));
|
||||
//dbSpeak("Before comparison : " + IntToString(nClass1));
|
||||
if(nUseClass <= nState1)
|
||||
{
|
||||
nClass = nClass1;
|
||||
@@ -4575,11 +4776,16 @@ int nDetermineClassToUse(object oCharacter)
|
||||
}
|
||||
else
|
||||
{
|
||||
nClass = nClass3;
|
||||
// might be possible to end up here by accident because of a rounding error
|
||||
// so just in case...
|
||||
if(nClass3 == CLASS_TYPE_INVALID) nClass = nClass1;
|
||||
else nClass = nClass3;
|
||||
}
|
||||
dbSpeak("Class from determineClass " + IntToString(nClass));
|
||||
|
||||
//dbSpeak("Class from determineClass " + IntToString(nClass));
|
||||
return nClass;
|
||||
}
|
||||
|
||||
|
||||
//:: Test Void
|
||||
//void main () {}
|
||||
|
||||
|
||||
@@ -10,9 +10,586 @@ void ShifterCheck(object oPC);
|
||||
#include "pnp_shft_main"
|
||||
#include "prc_inc_shifting"
|
||||
|
||||
//::////////////////Begin Werewolf//////////////////
|
||||
const string PRC_PNP_SHIFTING = "PRC_Shift";
|
||||
|
||||
////////////////Begin Werewolf//////////////////
|
||||
void LycanthropePoly(object oPC, int nPoly)
|
||||
{
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
||||
effect ePoly = SupernaturalEffect(EffectPolymorph(nPoly));
|
||||
|
||||
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||
int bArmsSlotAllowed = GetPRCSwitch(PRC_WILDSHAPE_ALLOWS_ARMS_SLOT);
|
||||
|
||||
int bWeapon = StringToInt(Get2DACache("polymorph","MergeW",nPoly)) == 1;
|
||||
int bArmor = StringToInt(Get2DACache("polymorph","MergeA",nPoly)) == 1;
|
||||
int bItems = StringToInt(Get2DACache("polymorph","MergeI",nPoly)) == 1;
|
||||
|
||||
object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||||
object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
|
||||
object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,oPC);
|
||||
object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oPC);
|
||||
object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,oPC);
|
||||
object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
|
||||
object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,oPC);
|
||||
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
|
||||
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
|
||||
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
||||
object oGlovesOld = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);
|
||||
|
||||
if (GetIsObjectValid(oShield))
|
||||
{
|
||||
int nShieldType = GetBaseItemType(oShield);
|
||||
if (nShieldType != BASE_ITEM_LARGESHIELD &&
|
||||
nShieldType != BASE_ITEM_SMALLSHIELD &&
|
||||
nShieldType != BASE_ITEM_TOWERSHIELD)
|
||||
{
|
||||
oShield = OBJECT_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
ShifterCheck(oPC);
|
||||
ClearAllActions();
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, oPC);
|
||||
|
||||
object oWeaponNewRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
|
||||
object oWeaponNewLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
||||
object oWeaponNewBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
|
||||
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
||||
|
||||
//:: Weapon & Armor merge block
|
||||
object oMergeWeaponSource = OBJECT_INVALID;
|
||||
object oMergeArmorSource = OBJECT_INVALID;
|
||||
|
||||
//:: Determine Weapon Merge Source
|
||||
if (bWeapon)
|
||||
{
|
||||
if (bMonkGloves)
|
||||
{
|
||||
if (GetIsObjectValid(oGlovesOld))
|
||||
oMergeWeaponSource = oGlovesOld;
|
||||
}
|
||||
else
|
||||
{
|
||||
//:: Always attempt to merge melee weapon to creature weapon
|
||||
oMergeWeaponSource = oWeaponOld; // even if empty, ensures proper state
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//:: Weapon not requested, but arms-slot allowed monk gloves can merge via armor branch
|
||||
if (bMonkGloves && bArmsSlotAllowed && GetIsObjectValid(oGlovesOld))
|
||||
oMergeWeaponSource = oGlovesOld;
|
||||
}
|
||||
|
||||
//:: Determine Armor Merge Source
|
||||
if (bArmor && GetIsObjectValid(oArmorNew))
|
||||
{
|
||||
if (!bMonkGloves)
|
||||
{
|
||||
if (bArmsSlotAllowed && GetIsObjectValid(oGlovesOld))
|
||||
oMergeArmorSource = oGlovesOld;
|
||||
|
||||
if (GetIsObjectValid(oShield)) IPWildShapeCopyItemProperties(oShield, oArmorNew);
|
||||
if (GetIsObjectValid(oHelmetOld)) IPWildShapeCopyItemProperties(oHelmetOld, oArmorNew);
|
||||
if (GetIsObjectValid(oArmorOld)) IPWildShapeCopyItemProperties(oArmorOld, oArmorNew);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetIsObjectValid(oShield)) IPWildShapeCopyItemProperties(oShield, oArmorNew);
|
||||
if (GetIsObjectValid(oHelmetOld)) IPWildShapeCopyItemProperties(oHelmetOld, oArmorNew);
|
||||
if (GetIsObjectValid(oArmorOld)) IPWildShapeCopyItemProperties(oArmorOld, oArmorNew);
|
||||
}
|
||||
}
|
||||
else if (bArmor && !GetIsObjectValid(oArmorNew) && DEBUG)
|
||||
{
|
||||
DoDebug("LycanthropePoly: MergeA set, but oArmorNew invalid.");
|
||||
}
|
||||
|
||||
//:: Apply Weapon Merge
|
||||
if (GetIsObjectValid(oMergeWeaponSource) || bWeapon)
|
||||
{
|
||||
//:: Always attempt to merge weapon properties even if source is OBJECT_INVALID
|
||||
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oMergeWeaponSource, oWeaponNewLeft, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oMergeWeaponSource, oWeaponNewRight, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oMergeWeaponSource, oWeaponNewBite, TRUE);
|
||||
}
|
||||
|
||||
//:: Apply Armor Merge
|
||||
if (GetIsObjectValid(oMergeArmorSource))
|
||||
{
|
||||
if (GetIsObjectValid(oArmorNew)) IPWildShapeCopyItemProperties(oMergeArmorSource, oArmorNew);
|
||||
}
|
||||
|
||||
//:: General item merge block
|
||||
if (bItems && GetIsObjectValid(oArmorNew))
|
||||
{
|
||||
if (GetIsObjectValid(oRing1Old)) IPWildShapeCopyItemProperties(oRing1Old, oArmorNew);
|
||||
if (GetIsObjectValid(oRing2Old)) IPWildShapeCopyItemProperties(oRing2Old, oArmorNew);
|
||||
if (GetIsObjectValid(oAmuletOld)) IPWildShapeCopyItemProperties(oAmuletOld, oArmorNew);
|
||||
if (GetIsObjectValid(oCloakOld)) IPWildShapeCopyItemProperties(oCloakOld, oArmorNew);
|
||||
if (GetIsObjectValid(oBootsOld)) IPWildShapeCopyItemProperties(oBootsOld, oArmorNew);
|
||||
if (GetIsObjectValid(oBeltOld)) IPWildShapeCopyItemProperties(oBeltOld, oArmorNew);
|
||||
}
|
||||
}
|
||||
//::////////////////End Werewolf//////////////////
|
||||
|
||||
|
||||
/* //::////////////////Begin Werewolf//////////////////
|
||||
const string PRC_PNP_SHIFTING = "PRC_Shift";
|
||||
|
||||
void LycanthropePoly(object oPC, int nPoly)
|
||||
{
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
||||
effect ePoly = SupernaturalEffect(EffectPolymorph(nPoly));
|
||||
|
||||
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||
int bArmsSlotAllowed = GetPRCSwitch(PRC_WILDSHAPE_ALLOWS_ARMS_SLOT);
|
||||
|
||||
int bWeapon = StringToInt(Get2DACache("polymorph","MergeW",nPoly)) == 1;
|
||||
int bArmor = StringToInt(Get2DACache("polymorph","MergeA",nPoly)) == 1;
|
||||
int bItems = StringToInt(Get2DACache("polymorph","MergeI",nPoly)) == 1;
|
||||
|
||||
object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||||
object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
|
||||
object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,oPC);
|
||||
object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oPC);
|
||||
object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,oPC);
|
||||
object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
|
||||
object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,oPC);
|
||||
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
|
||||
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
|
||||
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
||||
object oGlovesOld = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);
|
||||
|
||||
if (GetIsObjectValid(oShield))
|
||||
{
|
||||
int nShieldType = GetBaseItemType(oShield);
|
||||
if (nShieldType != BASE_ITEM_LARGESHIELD &&
|
||||
nShieldType != BASE_ITEM_SMALLSHIELD &&
|
||||
nShieldType != BASE_ITEM_TOWERSHIELD)
|
||||
{
|
||||
oShield = OBJECT_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
ShifterCheck(oPC);
|
||||
ClearAllActions();
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, oPC);
|
||||
|
||||
object oWeaponNewRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
|
||||
object oWeaponNewLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
||||
object oWeaponNewBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
|
||||
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
||||
|
||||
//:: Weapon & Armor merge block
|
||||
object oMergeWeaponSource = OBJECT_INVALID;
|
||||
object oMergeArmorSource = OBJECT_INVALID;
|
||||
|
||||
// ---- Determine Weapon Merge Source ----
|
||||
if (bWeapon)
|
||||
{
|
||||
if (bMonkGloves)
|
||||
{
|
||||
if (GetIsObjectValid(oGlovesOld))
|
||||
oMergeWeaponSource = oGlovesOld;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetIsObjectValid(oWeaponOld))
|
||||
oMergeWeaponSource = oWeaponOld;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bMonkGloves && bArmsSlotAllowed && GetIsObjectValid(oGlovesOld))
|
||||
oMergeWeaponSource = oGlovesOld;
|
||||
}
|
||||
|
||||
// ---- Determine Armor Merge Source ----
|
||||
if (bArmor && GetIsObjectValid(oArmorNew))
|
||||
{
|
||||
if (!bMonkGloves)
|
||||
{
|
||||
if (bArmsSlotAllowed && GetIsObjectValid(oGlovesOld))
|
||||
oMergeArmorSource = oGlovesOld;
|
||||
|
||||
if (GetIsObjectValid(oShield)) IPWildShapeCopyItemProperties(oShield, oArmorNew);
|
||||
if (GetIsObjectValid(oHelmetOld)) IPWildShapeCopyItemProperties(oHelmetOld, oArmorNew);
|
||||
if (GetIsObjectValid(oArmorOld)) IPWildShapeCopyItemProperties(oArmorOld, oArmorNew);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetIsObjectValid(oShield)) IPWildShapeCopyItemProperties(oShield, oArmorNew);
|
||||
if (GetIsObjectValid(oHelmetOld)) IPWildShapeCopyItemProperties(oHelmetOld, oArmorNew);
|
||||
if (GetIsObjectValid(oArmorOld)) IPWildShapeCopyItemProperties(oArmorOld, oArmorNew);
|
||||
}
|
||||
}
|
||||
else if (bArmor && !GetIsObjectValid(oArmorNew) && DEBUG)
|
||||
{
|
||||
DoDebug("LycanthropePoly: MergeA set, but oArmorNew invalid.");
|
||||
}
|
||||
|
||||
// ---- Apply Weapon Merge ----
|
||||
if (GetIsObjectValid(oMergeWeaponSource))
|
||||
{
|
||||
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oMergeWeaponSource, oWeaponNewLeft, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oMergeWeaponSource, oWeaponNewRight, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oMergeWeaponSource, oWeaponNewBite, TRUE);
|
||||
}
|
||||
|
||||
// ---- Apply Armor Merge ----
|
||||
if (GetIsObjectValid(oMergeArmorSource))
|
||||
{
|
||||
if (GetIsObjectValid(oArmorNew)) IPWildShapeCopyItemProperties(oMergeArmorSource, oArmorNew);
|
||||
}
|
||||
|
||||
//:: General item merge block
|
||||
if (bItems && GetIsObjectValid(oArmorNew))
|
||||
{
|
||||
if (GetIsObjectValid(oRing1Old)) IPWildShapeCopyItemProperties(oRing1Old, oArmorNew);
|
||||
if (GetIsObjectValid(oRing2Old)) IPWildShapeCopyItemProperties(oRing2Old, oArmorNew);
|
||||
if (GetIsObjectValid(oAmuletOld)) IPWildShapeCopyItemProperties(oAmuletOld, oArmorNew);
|
||||
if (GetIsObjectValid(oCloakOld)) IPWildShapeCopyItemProperties(oCloakOld, oArmorNew);
|
||||
if (GetIsObjectValid(oBootsOld)) IPWildShapeCopyItemProperties(oBootsOld, oArmorNew);
|
||||
if (GetIsObjectValid(oBeltOld)) IPWildShapeCopyItemProperties(oBeltOld, oArmorNew);
|
||||
}
|
||||
}
|
||||
//::////////////////End Werewolf////////////////// */
|
||||
|
||||
|
||||
/* //::////////////////Begin Werewolf//////////////////
|
||||
const string PRC_PNP_SHIFTING = "PRC_Shift";
|
||||
|
||||
void LycanthropePoly(object oPC, int nPoly)
|
||||
{
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
||||
effect ePoly = SupernaturalEffect(EffectPolymorph(nPoly));
|
||||
|
||||
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||
int bArmsSlotAllowed = GetPRCSwitch(PRC_WILDSHAPE_ALLOWS_ARMS_SLOT);
|
||||
|
||||
int bWeapon = StringToInt(Get2DACache("polymorph","MergeW",nPoly)) == 1;
|
||||
int bArmor = StringToInt(Get2DACache("polymorph","MergeA",nPoly)) == 1;
|
||||
int bItems = StringToInt(Get2DACache("polymorph","MergeI",nPoly)) == 1;
|
||||
|
||||
object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||||
object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
|
||||
object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,oPC);
|
||||
object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oPC);
|
||||
object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,oPC);
|
||||
object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
|
||||
object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,oPC);
|
||||
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
|
||||
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
|
||||
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
||||
object oGlovesOld = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);
|
||||
|
||||
if (GetIsObjectValid(oShield))
|
||||
{
|
||||
int nShieldType = GetBaseItemType(oShield);
|
||||
if (nShieldType != BASE_ITEM_LARGESHIELD &&
|
||||
nShieldType != BASE_ITEM_SMALLSHIELD &&
|
||||
nShieldType != BASE_ITEM_TOWERSHIELD)
|
||||
{
|
||||
oShield = OBJECT_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
ShifterCheck(oPC);
|
||||
ClearAllActions();
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, oPC);
|
||||
|
||||
object oWeaponNewRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
|
||||
object oWeaponNewLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
||||
object oWeaponNewBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
|
||||
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
||||
|
||||
//:: Weapon merge block
|
||||
if (bWeapon)
|
||||
{
|
||||
object oMergeSource = OBJECT_INVALID;
|
||||
|
||||
// Priority: monk gloves override if worn and arms-slot not allowed
|
||||
if (bMonkGloves && !bArmsSlotAllowed)
|
||||
{
|
||||
if (GetIsObjectValid(oGlovesOld))
|
||||
oMergeSource = oGlovesOld;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Otherwise use main-hand weapon if it exists
|
||||
if (GetIsObjectValid(oWeaponOld))
|
||||
oMergeSource = oWeaponOld;
|
||||
}
|
||||
|
||||
// Apply merge to creature weapons if we have a source
|
||||
if (GetIsObjectValid(oMergeSource))
|
||||
{
|
||||
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oMergeSource, oWeaponNewLeft, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oMergeSource, oWeaponNewRight, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oMergeSource, oWeaponNewBite, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
//:: Armor merge block
|
||||
if (bArmor && GetIsObjectValid(oArmorNew))
|
||||
{
|
||||
if (GetIsObjectValid(oShield)) IPWildShapeCopyItemProperties(oShield, oArmorNew);
|
||||
if (GetIsObjectValid(oHelmetOld)) IPWildShapeCopyItemProperties(oHelmetOld, oArmorNew);
|
||||
if (GetIsObjectValid(oArmorOld)) IPWildShapeCopyItemProperties(oArmorOld, oArmorNew);
|
||||
|
||||
// Arms-slot allowed -> apply gloves & bracers to creature weapons
|
||||
if (bArmsSlotAllowed && GetIsObjectValid(oGlovesOld))
|
||||
{
|
||||
if (DEBUG) DoDebug("LycanthropePoly: Arms-slot allowed -> applying gloves/bracers to creature weapons from armor branch.");
|
||||
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewLeft, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewRight, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewBite, TRUE);
|
||||
}
|
||||
}
|
||||
else if (bArmor && !GetIsObjectValid(oArmorNew) && DEBUG)
|
||||
{
|
||||
DoDebug("LycanthropePoly: MergeA set, but oArmorNew invalid.");
|
||||
}
|
||||
|
||||
//:: General item merge block
|
||||
if (bItems && GetIsObjectValid(oArmorNew))
|
||||
{
|
||||
if (GetIsObjectValid(oRing1Old)) IPWildShapeCopyItemProperties(oRing1Old, oArmorNew);
|
||||
if (GetIsObjectValid(oRing2Old)) IPWildShapeCopyItemProperties(oRing2Old, oArmorNew);
|
||||
if (GetIsObjectValid(oAmuletOld)) IPWildShapeCopyItemProperties(oAmuletOld, oArmorNew);
|
||||
if (GetIsObjectValid(oCloakOld)) IPWildShapeCopyItemProperties(oCloakOld, oArmorNew);
|
||||
if (GetIsObjectValid(oBootsOld)) IPWildShapeCopyItemProperties(oBootsOld, oArmorNew);
|
||||
if (GetIsObjectValid(oBeltOld)) IPWildShapeCopyItemProperties(oBeltOld, oArmorNew);
|
||||
}
|
||||
}
|
||||
//::////////////////End Werewolf//////////////////
|
||||
*/
|
||||
|
||||
/* //::////////////////Begin Werewolf//////////////////
|
||||
const string PRC_PNP_SHIFTING = "PRC_Shift";
|
||||
|
||||
void LycanthropePoly(object oPC, int nPoly)
|
||||
{
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
||||
effect ePoly = SupernaturalEffect(EffectPolymorph(nPoly));
|
||||
|
||||
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||
int bArmsSlotAllowed = GetPRCSwitch(PRC_WILDSHAPE_ALLOWS_ARMS_SLOT);
|
||||
|
||||
int bWeapon = StringToInt(Get2DACache("polymorph","MergeW",nPoly)) == 1;
|
||||
int bArmor = StringToInt(Get2DACache("polymorph","MergeA",nPoly)) == 1;
|
||||
int bItems = StringToInt(Get2DACache("polymorph","MergeI",nPoly)) == 1;
|
||||
|
||||
object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||||
object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
|
||||
object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,oPC);
|
||||
object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oPC);
|
||||
object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,oPC);
|
||||
object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
|
||||
object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,oPC);
|
||||
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
|
||||
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
|
||||
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
||||
object oGlovesOld = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);
|
||||
|
||||
if (GetIsObjectValid(oShield))
|
||||
{
|
||||
int nShieldType = GetBaseItemType(oShield);
|
||||
if (nShieldType != BASE_ITEM_LARGESHIELD &&
|
||||
nShieldType != BASE_ITEM_SMALLSHIELD &&
|
||||
nShieldType != BASE_ITEM_TOWERSHIELD)
|
||||
{
|
||||
oShield = OBJECT_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
ShifterCheck(oPC);
|
||||
ClearAllActions();
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, oPC);
|
||||
|
||||
object oWeaponNewRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
|
||||
object oWeaponNewLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
||||
object oWeaponNewBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
|
||||
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
||||
|
||||
//:: Weapon merge block
|
||||
//:: Only blocked if monk gloves are equipped AND arms-slot merge is NOT allowed
|
||||
if (bWeapon && !bMonkGloves)
|
||||
{
|
||||
if (GetIsObjectValid(oWeaponOld))
|
||||
{
|
||||
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oWeaponOld, oWeaponNewLeft, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oWeaponOld, oWeaponNewRight, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oWeaponOld, oWeaponNewBite, TRUE);
|
||||
}
|
||||
}
|
||||
else if (bWeapon && bMonkGloves && !bArmsSlotAllowed)
|
||||
{
|
||||
if (DEBUG) DoDebug("LycanthropePoly: Monk gloves overriding weapon merge (arms slot NOT allowed).");
|
||||
if (GetIsObjectValid(oGlovesOld))
|
||||
{
|
||||
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewLeft, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewRight, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewBite, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//:: Armor merge block
|
||||
//:: Apply armor and gloves (if arms-slot allowed)
|
||||
|
||||
if (bArmor && GetIsObjectValid(oArmorNew))
|
||||
{
|
||||
if (GetIsObjectValid(oShield)) IPWildShapeCopyItemProperties(oShield, oArmorNew);
|
||||
if (GetIsObjectValid(oHelmetOld)) IPWildShapeCopyItemProperties(oHelmetOld, oArmorNew);
|
||||
if (GetIsObjectValid(oArmorOld)) IPWildShapeCopyItemProperties(oArmorOld, oArmorNew);
|
||||
|
||||
if (bArmsSlotAllowed && bMonkGloves && GetIsObjectValid(oGlovesOld))
|
||||
{
|
||||
if (DEBUG) DoDebug("LycanthropePoly: Arms-slot allowed -> applying gloves to creature weapons from armor branch.");
|
||||
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewLeft, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewRight, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewBite, TRUE);
|
||||
}
|
||||
}
|
||||
else if (bArmor && !GetIsObjectValid(oArmorNew) && DEBUG)
|
||||
{
|
||||
DoDebug("LycanthropePoly: MergeA set, but oArmorNew invalid.");
|
||||
}
|
||||
|
||||
//:: General item merge block
|
||||
if (bItems && GetIsObjectValid(oArmorNew))
|
||||
{
|
||||
if (GetIsObjectValid(oRing1Old)) IPWildShapeCopyItemProperties(oRing1Old, oArmorNew);
|
||||
if (GetIsObjectValid(oRing2Old)) IPWildShapeCopyItemProperties(oRing2Old, oArmorNew);
|
||||
if (GetIsObjectValid(oAmuletOld)) IPWildShapeCopyItemProperties(oAmuletOld, oArmorNew);
|
||||
if (GetIsObjectValid(oCloakOld)) IPWildShapeCopyItemProperties(oCloakOld, oArmorNew);
|
||||
if (GetIsObjectValid(oBootsOld)) IPWildShapeCopyItemProperties(oBootsOld, oArmorNew);
|
||||
if (GetIsObjectValid(oBeltOld)) IPWildShapeCopyItemProperties(oBeltOld, oArmorNew);
|
||||
}
|
||||
}
|
||||
//::////////////////End Werewolf////////////////// */
|
||||
|
||||
|
||||
/* //::////////////////Begin Werewolf//////////////////
|
||||
const string PRC_PNP_SHIFTING = "PRC_Shift";
|
||||
|
||||
void LycanthropePoly(object oPC, int nPoly)
|
||||
{
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
||||
effect ePoly = SupernaturalEffect(EffectPolymorph(nPoly));
|
||||
|
||||
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||
int bArmsSlotAllowed = GetPRCSwitch(PRC_WILDSHAPE_ALLOWS_ARMS_SLOT);
|
||||
|
||||
int bWeapon = StringToInt(Get2DACache("polymorph","MergeW",nPoly)) == 1;
|
||||
int bArmor = StringToInt(Get2DACache("polymorph","MergeA",nPoly)) == 1;
|
||||
int bItems = StringToInt(Get2DACache("polymorph","MergeI",nPoly)) == 1;
|
||||
|
||||
object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||||
object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
|
||||
object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,oPC);
|
||||
object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oPC);
|
||||
object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,oPC);
|
||||
object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
|
||||
object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,oPC);
|
||||
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
|
||||
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
|
||||
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
||||
object oGlovesOld = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);
|
||||
|
||||
if (GetIsObjectValid(oShield))
|
||||
{
|
||||
int nShieldType = GetBaseItemType(oShield);
|
||||
if (nShieldType != BASE_ITEM_LARGESHIELD &&
|
||||
nShieldType != BASE_ITEM_SMALLSHIELD &&
|
||||
nShieldType != BASE_ITEM_TOWERSHIELD)
|
||||
{
|
||||
oShield = OBJECT_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
ShifterCheck(oPC);
|
||||
ClearAllActions();
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, oPC);
|
||||
|
||||
object oWeaponNewRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
|
||||
object oWeaponNewLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
||||
object oWeaponNewBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
|
||||
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
||||
|
||||
//:: Weapon merge block
|
||||
//:: Only blocked if monk gloves are equipped AND arms-slot merge is NOT allowed
|
||||
if (bWeapon && !bMonkGloves)
|
||||
{
|
||||
if (GetIsObjectValid(oWeaponOld))
|
||||
{
|
||||
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oWeaponOld, oWeaponNewLeft, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oWeaponOld, oWeaponNewRight, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oWeaponOld, oWeaponNewBite, TRUE);
|
||||
}
|
||||
}
|
||||
else if (bWeapon && bMonkGloves && !bArmsSlotAllowed)
|
||||
{
|
||||
if (DEBUG) DoDebug("LycanthropePoly: Monk gloves overriding weapon merge (arms slot NOT allowed).");
|
||||
if (GetIsObjectValid(oGlovesOld))
|
||||
{
|
||||
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewLeft, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewRight, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewBite, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//:: Armor merge block
|
||||
//:: Apply armor and gloves (if arms-slot allowed)
|
||||
|
||||
if (bArmor && GetIsObjectValid(oArmorNew))
|
||||
{
|
||||
if (GetIsObjectValid(oShield)) IPWildShapeCopyItemProperties(oShield, oArmorNew);
|
||||
if (GetIsObjectValid(oHelmetOld)) IPWildShapeCopyItemProperties(oHelmetOld, oArmorNew);
|
||||
if (GetIsObjectValid(oArmorOld)) IPWildShapeCopyItemProperties(oArmorOld, oArmorNew);
|
||||
|
||||
if (bArmsSlotAllowed && bMonkGloves && GetIsObjectValid(oGlovesOld))
|
||||
{
|
||||
if (DEBUG) DoDebug("LycanthropePoly: Arms-slot allowed -> applying gloves to creature weapons from armor branch.");
|
||||
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewLeft, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewRight, TRUE);
|
||||
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewBite, TRUE);
|
||||
}
|
||||
}
|
||||
else if (bArmor && !GetIsObjectValid(oArmorNew) && DEBUG)
|
||||
{
|
||||
DoDebug("LycanthropePoly: MergeA set, but oArmorNew invalid.");
|
||||
}
|
||||
|
||||
//:: General item merge block
|
||||
if (bItems && GetIsObjectValid(oArmorNew))
|
||||
{
|
||||
if (GetIsObjectValid(oRing1Old)) IPWildShapeCopyItemProperties(oRing1Old, oArmorNew);
|
||||
if (GetIsObjectValid(oRing2Old)) IPWildShapeCopyItemProperties(oRing2Old, oArmorNew);
|
||||
if (GetIsObjectValid(oAmuletOld)) IPWildShapeCopyItemProperties(oAmuletOld, oArmorNew);
|
||||
if (GetIsObjectValid(oCloakOld)) IPWildShapeCopyItemProperties(oCloakOld, oArmorNew);
|
||||
if (GetIsObjectValid(oBootsOld)) IPWildShapeCopyItemProperties(oBootsOld, oArmorNew);
|
||||
if (GetIsObjectValid(oBeltOld)) IPWildShapeCopyItemProperties(oBeltOld, oArmorNew);
|
||||
}
|
||||
}
|
||||
//::////////////////End Werewolf////////////////// */
|
||||
|
||||
|
||||
/* ////////////////Begin Werewolf//////////////////
|
||||
|
||||
void LycanthropePoly(object oPC, int nPoly)
|
||||
{
|
||||
@@ -84,7 +661,7 @@ void LycanthropePoly(object oPC, int nPoly)
|
||||
|
||||
}
|
||||
|
||||
////////////////End Werewolf//////////////////
|
||||
////////////////End Werewolf////////////////// */
|
||||
|
||||
void ShifterCheck(object oPC)
|
||||
{
|
||||
@@ -246,4 +823,6 @@ void DoTail(object oPC, int nTailType)
|
||||
SetCreatureTailType(nTailType, oPC);
|
||||
//override any stored default appearance
|
||||
SetPersistantLocalInt(oPC, "AppearanceStoredTail", nTailType);
|
||||
}
|
||||
}
|
||||
|
||||
//::void main (){}
|
||||
@@ -513,6 +513,8 @@ int PRCGetSpellSaveDC(int nSpellID = -1, int nSchool = -1, object oCaster = OBJE
|
||||
|
||||
if(nClass == CLASS_TYPE_BARD)
|
||||
nDC += StringToInt(Get2DACache("Spells", "Bard", nSpellID));
|
||||
else if(nClass == CLASS_TYPE_ASSASSIN)
|
||||
nDC += StringToInt(Get2DACache("Spells", "Assassin", nSpellID));
|
||||
else if(nClass == CLASS_TYPE_CLERIC || nClass == CLASS_TYPE_UR_PRIEST || nClass == CLASS_TYPE_OCULAR)
|
||||
nDC += StringToInt(Get2DACache("Spells", "Cleric", nSpellID));
|
||||
else if(nClass == CLASS_TYPE_DRUID)
|
||||
|
||||
@@ -54,11 +54,11 @@ int SPGetPenetrAOE(object oCaster = OBJECT_SELF, int nCasterLvl = 0);
|
||||
/* Includes */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
//#include "prc_inc_spells"
|
||||
#include "prc_inc_spells"
|
||||
//#include "prc_alterations"
|
||||
//#include "prcsp_archmaginc"
|
||||
//#include "prc_inc_racial"
|
||||
|
||||
#include "inc_2dacache"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Function definitions */
|
||||
|
||||
@@ -143,7 +143,7 @@ const int CLASS_TYPE_MASTER_HARPER = 176;
|
||||
const int CLASS_TYPE_FRE_BERSERKER = 177;
|
||||
const int CLASS_TYPE_TEMPEST = 178;
|
||||
const int CLASS_TYPE_FOE_HUNTER = 179;
|
||||
//:: Free = 180
|
||||
const int CLASS_TYPE_VERDANT_LORD = 180;
|
||||
const int CLASS_TYPE_ORC_WARLORD = 181;
|
||||
const int CLASS_TYPE_THRALL_OF_GRAZZT_A = 182;
|
||||
const int CLASS_TYPE_NECROCARNATE = 183;
|
||||
@@ -162,7 +162,7 @@ const int CLASS_TYPE_MASTER_OF_NINE = 195;
|
||||
const int CLASS_TYPE_ETERNAL_BLADE = 196;
|
||||
const int CLASS_TYPE_SHADOW_SUN_NINJA = 197;
|
||||
const int CLASS_TYPE_WITCHBORN_BINDER = 198;
|
||||
const int CLASS_TYPE_BAELNORN = 199;
|
||||
const int CLASS_TYPE_LION_OF_TALISID = 199;
|
||||
const int CLASS_TYPE_DISCIPLE_OF_MEPH = 200;
|
||||
const int CLASS_TYPE_SOUL_EATER = 201;
|
||||
const int CLASS_TYPE_HENSHIN_MYSTIC = 202;
|
||||
@@ -236,6 +236,7 @@ const int CLASS_TYPE_WITCH = -1;
|
||||
const int CLASS_TYPE_TEMPLAR = -1;
|
||||
const int CLASS_TYPE_MYSTIC = -1;
|
||||
const int CLASS_TYPE_NOBLE = -1;
|
||||
const int CLASS_TYPE_BAELNORN = -2;
|
||||
|
||||
|
||||
//void main (){}
|
||||
@@ -444,6 +444,7 @@ int Get2DALineFromItemprop(string sFile, itemproperty ip, object oItem)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ITEM_PROPERTY_ECHOBLADE: return 46; break;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
@@ -1529,7 +1530,12 @@ void ApplyItemProps(object oItem, string sFile, int nLine)
|
||||
break; //no more itemprops, no gaps, assuming no errors
|
||||
}
|
||||
if(sFile != "craft_weapon" && sFile != "craft_armour")
|
||||
SetName(oItem, GetStringByStrRef(StringToInt(Get2DACache(sFile, "Name", nLine))));
|
||||
{
|
||||
SetName(oItem, GetStringByStrRef(StringToInt(Get2DACache(sFile, "Name", nLine))));
|
||||
string sDescRef = Get2DACache(sFile, "CraftedDescription", nLine);
|
||||
if(sDescRef != "")
|
||||
SetDescription(oItem, GetStringByStrRef(StringToInt(sDescRef)));
|
||||
}
|
||||
}
|
||||
|
||||
//Partly ripped off the lexicon :P
|
||||
@@ -1620,7 +1626,8 @@ string GetCrafting2DA(object oItem)
|
||||
(nBase == BASE_ITEM_BOOTS) ||
|
||||
(nBase == BASE_ITEM_GLOVES) ||
|
||||
(nBase == BASE_ITEM_BRACER) ||
|
||||
(nBase == BASE_ITEM_CLOAK))
|
||||
(nBase == BASE_ITEM_CLOAK) ||
|
||||
(nBase == BASE_ITEM_CRAFTED_VIAL))
|
||||
)
|
||||
return "craft_wondrous";
|
||||
|
||||
@@ -1657,19 +1664,28 @@ int GetCraftingFeat(object oItem)
|
||||
if(nBase == BASE_ITEM_RING) return FEAT_FORGE_RING;
|
||||
|
||||
//routing bioware feats through this convo
|
||||
if((nBase == BASE_ITEM_CRAFTED_SCEPTER) ||
|
||||
(nBase == BASE_ITEM_CRAFTED_SCEPTER)
|
||||
)
|
||||
return FEAT_CRAFT_SCEPTER;
|
||||
|
||||
if((nBase == BASE_ITEM_MAGICROD) ||
|
||||
(nBase == BASE_ITEM_CRAFTED_ROD)
|
||||
)
|
||||
return FEAT_CRAFT_ROD;
|
||||
|
||||
if((nBase == BASE_ITEM_MAGICSTAFF) ||
|
||||
(nBase == BASE_ITEM_CRAFTED_STAFF)
|
||||
)
|
||||
return FEAT_CRAFT_STAFF;
|
||||
|
||||
if((nBase == BASE_ITEM_MAGICWAND) ||
|
||||
(nBase == BASE_ITEM_BLANK_WAND)
|
||||
)
|
||||
return FEAT_CRAFT_WAND;
|
||||
|
||||
if(nBase == BASE_ITEM_BLANK_POTION) return FEAT_BREW_POTION;
|
||||
|
||||
if(nBase == BASE_ITEM_BLANK_SCROLL) return FEAT_SCRIBE_SCROLL;
|
||||
|
||||
if(((nBase == BASE_ITEM_HELMET) ||
|
||||
@@ -1678,7 +1694,8 @@ int GetCraftingFeat(object oItem)
|
||||
(nBase == BASE_ITEM_BOOTS) ||
|
||||
(nBase == BASE_ITEM_GLOVES) ||
|
||||
(nBase == BASE_ITEM_BRACER) ||
|
||||
(nBase == BASE_ITEM_CLOAK))
|
||||
(nBase == BASE_ITEM_CLOAK) ||
|
||||
(nBase == BASE_ITEM_CRAFTED_VIAL))
|
||||
)
|
||||
return FEAT_CRAFT_WONDROUS;
|
||||
|
||||
|
||||
@@ -75,6 +75,14 @@ void DeathlessFrenzyCheck(object oTarget);
|
||||
// * PRC Version of a Bioware function to disable include loops
|
||||
void PRCRemoveSpellEffects(int nSpell_ID, object oCaster, object oTarget);
|
||||
|
||||
|
||||
/**
|
||||
* Target is immune to gaze attacks
|
||||
*
|
||||
* @return the Gaze Immunity effect
|
||||
*/
|
||||
effect EffectGazeImmune();
|
||||
|
||||
/**
|
||||
* Dazzles the target: -1 Attack, Search, Spot, and VFX
|
||||
*
|
||||
@@ -82,6 +90,9 @@ void PRCRemoveSpellEffects(int nSpell_ID, object oCaster, object oTarget);
|
||||
*/
|
||||
effect EffectDazzle();
|
||||
|
||||
//ebonfowl: adding this function to check if a target is already shaken
|
||||
int GetIsShaken(object oTarget);
|
||||
|
||||
/**
|
||||
* Shaken effect: -2 to attack, all skills and saving throws
|
||||
*
|
||||
@@ -170,14 +181,11 @@ effect EffectAbilityBasedSkillIncrease(int iAbility, int iIncrease = 1);
|
||||
*/
|
||||
effect EffectAbilityBasedSkillDecrease(int iAbility, int iDecrease = 1);
|
||||
|
||||
//ebonfowl: adding this function to check if a target is already shaken
|
||||
int GetIsShaken(object oTarget);
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Include section */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
#include "prc_inc_castlvl" // get prc_racial_const, prc_inc_nwscript, prc_inc_newip
|
||||
#include "inc_epicspelldef"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Internal functions */
|
||||
@@ -261,6 +269,8 @@ object GetObjectToApplyNewEffect(string sTag, object oPC, int nStripEffects = TR
|
||||
SetCreatureAppearanceType(oWP, APPEARANCE_TYPE_INVISIBLE_HUMAN_MALE);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oWP);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneGhost(), oWP);
|
||||
AssignCommand(oWP, ActionUseSkill(SKILL_HIDE, oWP));
|
||||
|
||||
}
|
||||
//remove previous effects
|
||||
if(nStripEffects)
|
||||
@@ -583,7 +593,8 @@ effect PRCEffectHeal(int nHP, object oTarget)
|
||||
return EffectHeal(nHP);
|
||||
}
|
||||
|
||||
effect EffectAbilityBasedSkillIncrease(int iAbility, int iIncrease = 1){
|
||||
effect EffectAbilityBasedSkillIncrease(int iAbility, int iIncrease = 1)
|
||||
{
|
||||
effect eReturn;
|
||||
switch(iAbility)
|
||||
{
|
||||
@@ -639,7 +650,8 @@ effect EffectAbilityBasedSkillIncrease(int iAbility, int iIncrease = 1){
|
||||
return eReturn;
|
||||
}
|
||||
|
||||
effect EffectAbilityBasedSkillDecrease(int iAbility, int iDecrease = 1){
|
||||
effect EffectAbilityBasedSkillDecrease(int iAbility, int iDecrease = 1)
|
||||
{
|
||||
effect eReturn;
|
||||
switch(iAbility)
|
||||
{
|
||||
@@ -695,7 +707,8 @@ effect EffectAbilityBasedSkillDecrease(int iAbility, int iDecrease = 1){
|
||||
return eReturn;
|
||||
}
|
||||
|
||||
effect EffectDamageImmunityAll(){
|
||||
effect EffectDamageImmunityAll()
|
||||
{
|
||||
effect eReturn = EffectDamageImmunityIncrease(DAMAGE_TYPE_ACID, 100);
|
||||
eReturn = EffectLinkEffects(eReturn, EffectDamageImmunityIncrease(DAMAGE_TYPE_BLUDGEONING, 100));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 100));
|
||||
@@ -712,7 +725,8 @@ effect EffectDamageImmunityAll(){
|
||||
return eReturn;
|
||||
}
|
||||
|
||||
effect EffectImmunityMiscAll(){
|
||||
effect EffectImmunityMiscAll()
|
||||
{
|
||||
effect eReturn = EffectImmunity(IMMUNITY_TYPE_ABILITY_DECREASE);
|
||||
eReturn = EffectLinkEffects(eReturn, EffectImmunity(IMMUNITY_TYPE_BLINDNESS));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectImmunity(IMMUNITY_TYPE_DEAFNESS));
|
||||
@@ -732,6 +746,47 @@ effect EffectImmunityMiscAll(){
|
||||
return eReturn;
|
||||
}
|
||||
|
||||
//:: Immunity to all gaze attacks
|
||||
effect EffectGazeImmune()
|
||||
{
|
||||
|
||||
effect eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_CHARM);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_CONFUSION);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_DAZE);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_DEATH);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_DESTROY_CHAOS);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_DESTROY_EVIL);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_DESTROY_GOOD);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_DESTROY_LAW);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_DOMINATE);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_DOOM);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_FEAR);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_PARALYSIS);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_PETRIFY);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_STUNNED);
|
||||
|
||||
eReturn = TagEffect(eReturn, "PRCGazeImmune");
|
||||
|
||||
return eReturn;
|
||||
}
|
||||
|
||||
//:: Immunity to all perification attacks
|
||||
effect EffectPetrificationImmune()
|
||||
{
|
||||
effect eReturn = EffectSpellImmunity(SPELLABILITY_TOUCH_PETRIFY);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_BREATH_PETRIFY);
|
||||
eReturn = EffectSpellImmunity(SPELL_FLESH_TO_STONE);
|
||||
eReturn = EffectSpellImmunity(SPELL_STONEHOLD);
|
||||
eReturn = EffectSpellImmunity(SPELL_EPIC_A_STONE);
|
||||
eReturn = EffectSpellImmunity(POWER_CRYSTALLIZE);
|
||||
eReturn = EffectSpellImmunity(MELD_BASILISK_MASK);
|
||||
eReturn = EffectSpellImmunity(SPELLABILITY_GAZE_PETRIFY);
|
||||
|
||||
eReturn = TagEffect(eReturn, "PRCPetrificationImmune");
|
||||
|
||||
return eReturn;
|
||||
}
|
||||
|
||||
int GetIsShaken(object oTarget)
|
||||
{
|
||||
effect eEffect = GetFirstEffect(oTarget);
|
||||
@@ -747,4 +802,13 @@ int GetIsShaken(object oTarget)
|
||||
eEffect = GetNextEffect(oTarget);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
// Forward declarations for size change effects
|
||||
// Implementations are in prc_inc_size
|
||||
effect EffectSizeChange(object oTarget, int nObjectType, int bEnlarge, int nChanges);
|
||||
void DelayedSetVisualTransform(int nExpectedGeneration, object oTarget, int nTransform, float fValue);
|
||||
void DelaySetVisualTransform(float fDelay, object oTarget, string sGenerationName, int nTransform, float fValue);
|
||||
|
||||
//:: Test void
|
||||
//::void main() {}
|
||||
@@ -4,6 +4,11 @@
|
||||
//:: PRC Options Conversation
|
||||
const int FEAT_OPTIONS_CONVERSATION = 2285;
|
||||
|
||||
//;; Builder Feats
|
||||
const int FEAT_ARCHETYPAL_FORM = 2918;
|
||||
const int FEAT_INTRINSIC_ARMOR = 25990;
|
||||
const int FEAT_INTRINSIC_WEAPON = 25991;
|
||||
|
||||
//:: Missing Bioware Feats
|
||||
const int FEAT_EPIC_PLANAR_TURNING = 854;
|
||||
|
||||
@@ -152,6 +157,9 @@ const int FEAT_EPIC_DIAMOND_DRAGON = 25115;
|
||||
const int FEAT_EPIC_CRUSADER = 25116;
|
||||
const int FEAT_EPIC_SWORDSAGE = 25117;
|
||||
const int FEAT_EPIC_WARBLADE = 25118;
|
||||
const int FEAT_EPIC_LION_OF_TALISID = 25600;
|
||||
const int FEAT_EPIC_VERDANT_LORD = 25618;
|
||||
|
||||
|
||||
//:: Vile Martial Strike Expansion
|
||||
const int FEAT_VILE_MARTIAL_EAGLE_CLAW = 24800;
|
||||
@@ -195,6 +203,31 @@ const int FEAT_CHARMING_THE_ARROW = 25998;
|
||||
//:: Skill Based Feats
|
||||
const int FEAT_JUMP = 2884;
|
||||
|
||||
//:: Lion of Talisid
|
||||
const int FEAT_LOT_LIONS_COURAGE = 25614;
|
||||
const int FEAT_LOT_LIONS_POUNCE = 25615;
|
||||
const int FEAT_LOT_LIONS_SWIFTNESS = 25616;
|
||||
const int FEAT_LOT_LEONALS_ROAR = 25617;
|
||||
|
||||
//::: Verdant Lord
|
||||
const int FEAT_VL_EXPERT_INFUSION = 25634;
|
||||
const int FEAT_VL_SUN_SUSTENANCE = 25635;
|
||||
const int FEAT_VL_SPONTANEITY = 25636;
|
||||
const int FEAT_VL_PLANT_FACILITY = 25637;
|
||||
const int FEAT_VL_WILD_SHAPE_TREANT = 25638;
|
||||
const int FEAT_VL_ANIMATE_TREE = 25639;
|
||||
const int FEAT_VL_GAEAS_EMBRACE = 25640;
|
||||
|
||||
//:: Masters of the Wild feats
|
||||
const int FEAT_CREATE_INFUSION = 25960;
|
||||
const int FEAT_MAGICAL_ARTISAN_CREATE_INFUSION = 25961;
|
||||
const int FEAT_PLANT_DEFIANCE = 25992;
|
||||
const int FEAT_PLANT_CONTROL = 25993;
|
||||
|
||||
//:: Lost Empires of Faerun feats
|
||||
const int FEAT_CRAFT_SCEPTER = 25962;
|
||||
const int FEAT_MAGICAL_ARTISAN_CRAFT_SCEPTER = 25963;
|
||||
|
||||
//:: Racial Feats
|
||||
const int FEAT_WEMIC_JUMP_8 = 4518;
|
||||
const int FEAT_URDINNIR_STONESKIN = 4644;
|
||||
@@ -782,6 +815,9 @@ const int FEAT_SUEL_IGNORE_SPELL_FAILURE = 2398;
|
||||
const int FEAT_SUEL_EXTENDED_SPELL = 2399;
|
||||
const int FEAT_SUEL_DISPELLING_STRIKE = 2400;
|
||||
|
||||
//:: Druid
|
||||
const int FEAT_SPONT_SUMMON = 2372;
|
||||
|
||||
//Passive Feats
|
||||
const int FEAT_ETERNAL_FREEDOM = 4298;
|
||||
const int FEAT_INTUITIVE_ATTACK = 3166;
|
||||
@@ -1286,6 +1322,7 @@ const int FEAT_SOMATIC_WEAPONRY = 5186;
|
||||
|
||||
// Forgotten Realms Campaign Setting
|
||||
const int FEAT_INSCRIBE_RUNE = 2462;
|
||||
const int EPIC_FEAT_INSCRIBE_EPIC_RUNES = 2549;
|
||||
|
||||
// Miniature Handbook
|
||||
const int FEAT_SHIELDMATE = 3258;
|
||||
@@ -1538,18 +1575,19 @@ const int FEAT_SELVETARMS_BLESSING = 2447;
|
||||
const int FEAT_RANGER_DUAL = 374;
|
||||
const int FEAT_CAMOUFLAGE = 4486;
|
||||
|
||||
//Exalted Feat
|
||||
const int FEAT_SAC_VOW = 3388;
|
||||
const int FEAT_VOW_OBED = 3389;
|
||||
const int FEAT_EXALTED_TURNING = 3168;
|
||||
const int FEAT_HAND_HEALER = 3167;
|
||||
const int FEAT_NIMBUSLIGHT = 3165;
|
||||
const int FEAT_HOLYRADIANCE = 3164;
|
||||
const int FEAT_STIGMATA = 3163;
|
||||
const int FEAT_SERVHEAVEN = 3355;
|
||||
const int FEAT_RANGED_SMITE = 3356;
|
||||
const int FEAT_VOW_PURITY = 5360;
|
||||
const int FEAT_VOWOFPOVERTY = 26001;
|
||||
//:: Exalted Feats
|
||||
const int FEAT_SAC_VOW = 3388;
|
||||
const int FEAT_VOW_OBED = 3389;
|
||||
const int FEAT_EXALTED_TURNING = 3168;
|
||||
const int FEAT_HAND_HEALER = 3167;
|
||||
const int FEAT_NIMBUSLIGHT = 3165;
|
||||
const int FEAT_HOLYRADIANCE = 3164;
|
||||
const int FEAT_STIGMATA = 3163;
|
||||
const int FEAT_SERVHEAVEN = 3355;
|
||||
const int FEAT_RANGED_SMITE = 3356;
|
||||
const int FEAT_VOW_PURITY = 5360;
|
||||
const int FEAT_VOWOFPOVERTY = 26002;
|
||||
const int FEAT_FAV_COMPANIONS = 25994;
|
||||
|
||||
//Vile Feat
|
||||
const int FEAT_LICHLOVED = 3395;
|
||||
@@ -1868,12 +1906,12 @@ const int FEAT_SANCTIFY_MARTIAL_SICKLE = 3169;
|
||||
const int FEAT_SANCTIFY_MARTIAL_MINDBLADE = 3623;
|
||||
const int FEAT_SANCTIFY_MARTIAL_WHIP = 3596;
|
||||
const int FEAT_SANCTIFY_MARTIAL_TRIDENT = 3597;
|
||||
const int FEAT_SANCTIFYKISTRIKE = 26002;
|
||||
const int FEAT_HOLYKISTRIKE = 26003;
|
||||
const int FEAT_FISTOFHEAVENS = 26004;
|
||||
const int FEAT_VOWABSTINENCE = 26005;
|
||||
const int FEAT_VOWCHASTITY = 26006;
|
||||
const int FEAT_GIFTOFFAITH = 26007;
|
||||
const int FEAT_SANCTIFYKISTRIKE = 26003;
|
||||
const int FEAT_HOLYKISTRIKE = 26004;
|
||||
const int FEAT_FISTOFHEAVENS = 26005;
|
||||
const int FEAT_VOWABSTINENCE = 26006;
|
||||
const int FEAT_VOWCHASTITY = 26007;
|
||||
const int FEAT_GIFTOFFAITH = 26008;
|
||||
|
||||
//heartwarder
|
||||
const int FEAT_CHARISMA_INC1 = 3230;
|
||||
@@ -3189,6 +3227,8 @@ const int FEAT_ETHEREAL = 4167;
|
||||
const int FEAT_TEMPLATE_ARCHLICH_MARKER = 22700;
|
||||
const int FEAT_TEMPLATE_ARCHLICH_TURN_UNDEAD = 22701;
|
||||
|
||||
const int FEAT_TEMPLATE_BAELNORN_MARKER = 22708;
|
||||
|
||||
const int FEAT_TEMPLATE_CELESTIAL_SMITE_EVIL = 22601;
|
||||
const int FEAT_TEMPLATE_CELESTIAL_MARKER = 22602;
|
||||
const int FEAT_TEMPLATE_FIENDISH_SMITE_GOOD = 22603;
|
||||
@@ -3695,6 +3735,9 @@ const int FEAT_EPIC_ARTIFICER = 4072;
|
||||
//////////////// END INFUSIONS /////////////////
|
||||
//////////////////////////////////////////////////*/
|
||||
|
||||
//:: Monk
|
||||
const int FEAT_MONK_ABUNDANT_STEP = 2351;
|
||||
|
||||
//Justice of Weald and Woe
|
||||
const int FEAT_LUCKY_SHOT = 24021;
|
||||
|
||||
@@ -3933,6 +3976,8 @@ const int FEAT_OPPORTUNISTIC_PIETY_HEAL = 5358;
|
||||
const int FEAT_OPPORTUNISTIC_PIETY_TURN = 5359;
|
||||
|
||||
// Combat Maneuver Feats
|
||||
const int FEAT_CM_CHARGE = 2823;
|
||||
const int FEAT_CM_GRAPPLE = 3414;
|
||||
const int FEAT_CURLING_WAVE_STRIKE = 2809;
|
||||
const int FEAT_SIDESTEP_CHARGE = 3505;
|
||||
const int FEAT_POWERFUL_CHARGE = 3506;
|
||||
@@ -6203,6 +6248,38 @@ const int FEAT_SHINING_BLADE_SPELLCASTING_VASSAL = 19587;
|
||||
const int FEAT_SWIFT_WING_SPELLCASTING_VASSAL = 19588;
|
||||
const int FEAT_WARPRIEST_SPELLCASTING_VASSAL = 19589;
|
||||
|
||||
//:: Lion of Talisid marker feats
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_ARCHIVIST = 25601;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_CLERIC = 25602;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_DRUID = 25603;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_FAVOURED_SOUL = 25604;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_HEALER = 25605;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_JOWAW = 25606;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_KOTMC = 25607;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_NENTYAR_HUNTER = 25608;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_RANGER = 25609;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_OASHAMAN = 25610;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_SOHEI = 25611;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_SOL = 25612;
|
||||
const int FEAT_LION_OF_TALISID_SPELLCASTING_SPSHAMAN = 25613;
|
||||
|
||||
//:: Verdant Lord marker feats
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_ARCHIVIST = 25619;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_CLERIC = 25620;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_DRUID = 25621;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_FAVOURED_SOUL = 25622;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_HEALER = 25623;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_JOWAW = 25624;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_KOTC = 25625;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_KOTMC = 25626;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_NENTYAR_HUNTER = 25627;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_PALADIN = 25628;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_RANGER = 25629;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_OASHAMAN = 25630;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_SOHEI = 25631;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_SOL = 25632;
|
||||
const int FEAT_VERDANT_LORD_SPELLCASTING_SPSHAMAN = 25633;
|
||||
|
||||
//:: No spellcasting or invoking marker feats
|
||||
const int FEAT_ASMODEUS_SPELLCASTING_NONE = 19590;
|
||||
const int FEAT_TIAMAT_SPELLCASTING_NONE = 19591;
|
||||
@@ -6210,6 +6287,7 @@ const int FEAT_DSONG_SPELLCASTING_NONE = 19592;
|
||||
const int FEAT_OLLAM_SPELLCASTING_NONE = 19593;
|
||||
|
||||
//:: PRC8 Hidden Talent Feats
|
||||
const int FEAT_HIDDEN_TALENT = 25900;
|
||||
const int FEAT_HIDDEN_TALENT_BIOFEEDBACK = 25901;
|
||||
const int FEAT_HIDDEN_TALENT_BITE_WOLF = 25902;
|
||||
const int FEAT_HIDDEN_TALENT_BOLT = 25903;
|
||||
|
||||
@@ -400,5 +400,4 @@ int GetBestAvailableSpell(object oTarget)
|
||||
if(nBestSpell == 99999) nBestSpell = GetBestL1Spell(oTarget, nBestSpell);
|
||||
if(nBestSpell == 99999) nBestSpell = GetBestL0Spell(oTarget, nBestSpell);
|
||||
return nBestSpell;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -124,6 +124,8 @@ void ApplyBreath(struct breath BreathUsed, location lTargetArea, int bLinger = F
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
#include "prc_alterations"
|
||||
#include "prcsp_archmaginc"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Internal functions */
|
||||
|
||||
@@ -575,8 +575,8 @@ int PRCGetCasterLevel(object oCaster = OBJECT_SELF)
|
||||
iReturnLevel = GetLevelByClass(CLASS_TYPE_SHAPECHANGER);
|
||||
|
||||
}
|
||||
// Casting as a bard but don't have any levels in the class
|
||||
if(iCastingClass == CLASS_TYPE_BARD && !GetLevelByClass(CLASS_TYPE_BARD, oCaster))
|
||||
// Casting as a bard but don't have any levels in the class //:: Double-dipping?
|
||||
/* if(iCastingClass == CLASS_TYPE_BARD && !GetLevelByClass(CLASS_TYPE_BARD, oCaster))
|
||||
{
|
||||
int nRace = GetRacialType(oCaster);
|
||||
|
||||
@@ -584,7 +584,7 @@ int PRCGetCasterLevel(object oCaster = OBJECT_SELF)
|
||||
//otherwise use RHD instead of bard levels
|
||||
if(nRace == RACIAL_TYPE_GLOURA)
|
||||
iReturnLevel = GetLevelByClass(CLASS_TYPE_FEY);
|
||||
}
|
||||
} */
|
||||
|
||||
//Spell Rage ability
|
||||
if(GetHasSpellEffect(SPELL_SPELL_RAGE, oCaster)
|
||||
@@ -960,8 +960,10 @@ int GetArcanePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
}
|
||||
//:: End Bard Arcane PrC casting calculations
|
||||
|
||||
if(nCastingClass == CLASS_TYPE_BARD && nRace == RACIAL_TYPE_GLOURA && !GetLevelByClass(CLASS_TYPE_BARD, oCaster))
|
||||
if(nCastingClass == CLASS_TYPE_BARD || nCastingClass == CLASS_TYPE_BARD && nRace == RACIAL_TYPE_GLOURA && !GetLevelByClass(CLASS_TYPE_BARD, oCaster))
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_inc_castlvl >> Found Fey RHD caster (not bard)");
|
||||
|
||||
if(GetHasFeat(FEAT_ABCHAMP_SPELLCASTING_FEY, oCaster))
|
||||
nArcane += GetLevelByClass(CLASS_TYPE_ABJURANT_CHAMPION, oCaster);
|
||||
|
||||
@@ -1065,7 +1067,10 @@ int GetArcanePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nArcane += GetLevelByClass(CLASS_TYPE_UNSEEN_SEER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VIRTUOSO_SPELLCASTING_FEY, oCaster))
|
||||
{
|
||||
nArcane += GetLevelByClass(CLASS_TYPE_VIRTUOSO, oCaster);
|
||||
if(DEBUG) DoDebug("prc_inc_castlvl >> Found Fey + Virtuoso PrC. Arcane caster level is "+IntToString(nArcane)+".");
|
||||
}
|
||||
|
||||
if(GetHasFeat(FEAT_WWOC_SPELLCASTING_FEY, oCaster))
|
||||
nArcane += GetLevelByClass(CLASS_TYPE_WAR_WIZARD_OF_CORMYR, oCaster);
|
||||
@@ -1143,8 +1148,8 @@ int GetArcanePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
if(GetHasFeat(FEAT_DIABOLIST_SPELLCASTING_ASSASSIN, oCaster))
|
||||
nArcane += GetLevelByClass(CLASS_TYPE_DIABOLIST, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_DHEART_SPELLCASTING_ASSASSIN, oCaster))
|
||||
nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster);
|
||||
//if(GetHasFeat(FEAT_DHEART_SPELLCASTING_ASSASSIN, oCaster))
|
||||
//nArcane += GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_EKNIGHT_SPELLCASTING_ASSASSIN, oCaster))
|
||||
nArcane += GetLevelByClass(CLASS_TYPE_ELDRITCH_KNIGHT, oCaster);
|
||||
@@ -3817,6 +3822,9 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_ARCHIVIST, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_ARCHIVIST, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oCaster);
|
||||
|
||||
/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_ARCHIVIST, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */
|
||||
|
||||
@@ -3851,7 +3859,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_ARCHIVIST, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_ARCHIVIST, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_BFZ_SPELLCASTING_ARCHIVIST, oCaster))
|
||||
nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2;
|
||||
@@ -4143,7 +4154,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_CLERIC, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_CLERIC, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_CLERIC, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster);
|
||||
@@ -4182,7 +4196,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_CLERIC, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_CLERIC, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_BFZ_SPELLCASTING_CLERIC, oCaster))
|
||||
nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2;
|
||||
@@ -4253,7 +4270,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_DRUID, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_DRUID, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oCaster);
|
||||
|
||||
// if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_DRUID, oCaster))
|
||||
// nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster);
|
||||
@@ -4295,9 +4315,12 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_DRUID, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); */
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_DRUID, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_BFZ_SPELLCASTING_DRUID, oCaster))
|
||||
/* if(GetHasFeat(FEAT_BFZ_SPELLCASTING_DRUID, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_BFZ, oCaster + 1) / 2 */
|
||||
|
||||
// if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_DRUID, oCaster))
|
||||
@@ -4365,10 +4388,13 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_FAVOURED_SOUL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_FAVOURED_SOUL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oCaster);
|
||||
|
||||
// if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_FAVOURED_SOUL, oCaster))
|
||||
// nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster);
|
||||
if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_FAVOURED_SOUL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_FAVOURED_SOUL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster);
|
||||
@@ -4404,7 +4430,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_FAVOURED_SOUL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_FAVOURED_SOUL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_BFZ_SPELLCASTING_FAVOURED_SOUL, oCaster))
|
||||
nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2;
|
||||
@@ -4474,6 +4503,9 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_HEALER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_HEALER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oCaster);
|
||||
|
||||
/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_HEALER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */
|
||||
|
||||
@@ -4514,7 +4546,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); */
|
||||
|
||||
/* if(GetHasFeat(FEAT_BFZ_SPELLCASTING_HEALER, oCaster))
|
||||
nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; */
|
||||
nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2; */
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_HEALER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_BRIMSTONE_SPEAKER_SPELLCASTING_HEALER, oCaster))
|
||||
nDivine += (GetLevelByClass(CLASS_TYPE_BRIMSTONE_SPEAKER, oCaster) + 1) / 2;
|
||||
@@ -4581,6 +4616,9 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_JUSTICEWW, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_JOWAW, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oCaster);
|
||||
|
||||
// if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_JUSTICEWW, oCaster))
|
||||
// nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster);
|
||||
|
||||
@@ -4618,7 +4656,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_JUSTICEWW, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_JOWAW, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_BFZ_SPELLCASTING_JUSTICEWW, oCaster))
|
||||
nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2;
|
||||
@@ -4719,6 +4760,9 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
|
||||
if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_KNIGHT_CHALICE, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_KOTC, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_KNIGHT_CHALICE, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
@@ -4791,6 +4835,9 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_KOTMC, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oCaster);
|
||||
|
||||
/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */
|
||||
|
||||
@@ -4823,6 +4870,9 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
|
||||
if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_KOTMC, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_KNIGHT_MIDDLECIRCLE, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
@@ -4896,7 +4946,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */
|
||||
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_NENTYAR_HUNTER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_NENTYAR_HUNTER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oCaster);
|
||||
|
||||
/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_NENTYAR_HUNTER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */
|
||||
@@ -4933,6 +4986,9 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
|
||||
if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_NENTYAR_HUNTER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_NENTYAR_HUNTER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_NENTYAR_HUNTER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster); */
|
||||
@@ -5135,6 +5191,9 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
|
||||
if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_PALADIN, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_PALADIN, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_PALADIN, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
@@ -5207,7 +5266,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster); */
|
||||
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_RANGER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_RANGER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_MORNINGLORD_SPELLCASTING_RANGER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_MORNINGLORD, oCaster);
|
||||
@@ -5240,7 +5302,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_RANGER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_RANGER, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_BFZ_SPELLCASTING_RANGER, oCaster))
|
||||
nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2;
|
||||
@@ -5311,7 +5376,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HIEROPHANT, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_OASHAMAN, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_OASHAMAN, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SHAMAN, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_OASHAMAN, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster);
|
||||
@@ -5350,7 +5418,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_OASHAMAN, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_OASHAMAN, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_BFZ_SPELLCASTING_OASHAMAN, oCaster))
|
||||
nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2;
|
||||
@@ -5524,6 +5595,9 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_SOHEI, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_SOHEI, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oCaster);
|
||||
|
||||
// if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_SOHEI, oCaster))
|
||||
// nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster);
|
||||
|
||||
@@ -5561,7 +5635,10 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_SOHEI, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_SOHEI, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_BFZ_SPELLCASTING_SOHEI, oCaster))
|
||||
nDivine += (GetLevelByClass(CLASS_TYPE_BFZ, oCaster) + 1) / 2;
|
||||
@@ -5631,6 +5708,9 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
if(GetHasFeat(FEAT_HOSPITALER_SPELLCASTING_SOL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_HOSPITALER, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_LION_OF_TALISID_SPELLCASTING_SOL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_LION_OF_TALISID, oCaster);
|
||||
|
||||
/* if(GetHasFeat(FEAT_MASTER_OF_SHROUDS_SPELLCASTING_SOL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_MASTER_OF_SHROUDS, oCaster); */
|
||||
|
||||
@@ -5663,6 +5743,9 @@ int GetDivinePRCLevels(object oCaster, int nCastingClass = CLASS_TYPE_INVALID)
|
||||
|
||||
if(GetHasFeat(FEAT_SWIFT_WING_SPELLCASTING_SOL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_SWIFT_WING, oCaster);
|
||||
|
||||
if(GetHasFeat(FEAT_VERDANT_LORD_SPELLCASTING_SOL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_VERDANT_LORD, oCaster);
|
||||
|
||||
/* if(GetHasFeat(FEAT_TENEBROUS_APOSTATE_SPELLCASTING_SOL, oCaster))
|
||||
nDivine += GetLevelByClass(CLASS_TYPE_TENEBROUS_APOSTATE, oCaster);
|
||||
|
||||
@@ -16,6 +16,7 @@ Command summary:
|
||||
*/
|
||||
|
||||
#include "prc_inc_chat"
|
||||
#include "inc_persist_loca"
|
||||
|
||||
const string CMD_POWER_ATTACK = "pow-erattack";
|
||||
|
||||
|
||||
@@ -380,6 +380,7 @@ int Vile_Feat(int iTypeWeap)
|
||||
case BASE_ITEM_BASTARDSWORD: return GetHasFeat(FEAT_VILE_MARTIAL_BASTARDSWORD);
|
||||
case BASE_ITEM_BATTLEAXE: return GetHasFeat(FEAT_VILE_MARTIAL_BATTLEAXE);
|
||||
case BASE_ITEM_CLUB: return GetHasFeat(FEAT_VILE_MARTIAL_CLUB);
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return GetHasFeat(FEAT_VILE_MARTIAL_CLUB);
|
||||
case BASE_ITEM_DAGGER: return GetHasFeat(FEAT_VILE_MARTIAL_DAGGER);
|
||||
case BASE_ITEM_DART: return GetHasFeat(FEAT_VILE_MARTIAL_DART);
|
||||
case BASE_ITEM_DIREMACE: return GetHasFeat(FEAT_VILE_MARTIAL_DIREMACE);
|
||||
@@ -402,6 +403,7 @@ int Vile_Feat(int iTypeWeap)
|
||||
case BASE_ITEM_LONGSWORD: return GetHasFeat(FEAT_VILE_MARTIAL_LONGSWORD);
|
||||
case BASE_ITEM_MORNINGSTAR: return GetHasFeat(FEAT_VILE_MARTIAL_MORNINGSTAR);
|
||||
case BASE_ITEM_QUARTERSTAFF: return GetHasFeat(FEAT_VILE_MARTIAL_QUARTERSTAFF);
|
||||
case BASE_ITEM_MAGICSTAFF: return GetHasFeat(FEAT_VILE_MARTIAL_QUARTERSTAFF);
|
||||
case BASE_ITEM_RAPIER: return GetHasFeat(FEAT_VILE_MARTIAL_RAPIER);
|
||||
case BASE_ITEM_SCIMITAR: return GetHasFeat(FEAT_VILE_MARTIAL_SCIMITAR);
|
||||
case BASE_ITEM_SCYTHE: return GetHasFeat(FEAT_VILE_MARTIAL_SCYTHE);
|
||||
@@ -425,7 +427,7 @@ int Vile_Feat(int iTypeWeap)
|
||||
GetHasFeat(FEAT_VILE_MARTIAL_RAPIER) ||
|
||||
GetHasFeat(FEAT_VILE_MARTIAL_ELVEN_THINBLADE));
|
||||
|
||||
case BASE_ITEM_ELVEN_COURTBLADE: return GetHasFeat(FEAT_VILE_MARTIAL_GREATSWORD ||
|
||||
case BASE_ITEM_ELVEN_COURTBLADE: return (GetHasFeat(FEAT_VILE_MARTIAL_GREATSWORD) ||
|
||||
GetHasFeat(FEAT_VILE_MARTIAL_ELVEN_COURTBLADE));
|
||||
|
||||
case BASE_ITEM_DOUBLE_SCIMITAR: return GetHasFeat(FEAT_VILE_MARTIAL_DBL_SCIMITAR);
|
||||
@@ -460,6 +462,7 @@ int GetSanctifedMartialFeat(int iTypeWeap)
|
||||
case BASE_ITEM_BASTARDSWORD: return FEAT_SANCTIFY_MARTIAL_BASTARDSWORD;
|
||||
case BASE_ITEM_BATTLEAXE: return FEAT_SANCTIFY_MARTIAL_BATTLEAXE;
|
||||
case BASE_ITEM_CLUB: return FEAT_SANCTIFY_MARTIAL_CLUB;
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return FEAT_SANCTIFY_MARTIAL_CLUB;
|
||||
case BASE_ITEM_DAGGER: return FEAT_SANCTIFY_MARTIAL_DAGGER;
|
||||
case BASE_ITEM_DART: return FEAT_SANCTIFY_MARTIAL_DART;
|
||||
case BASE_ITEM_DIREMACE: return FEAT_SANCTIFY_MARTIAL_DIREMACE;
|
||||
@@ -482,6 +485,7 @@ int GetSanctifedMartialFeat(int iTypeWeap)
|
||||
case BASE_ITEM_LONGSWORD: return FEAT_SANCTIFY_MARTIAL_LONGSWORD;
|
||||
case BASE_ITEM_MORNINGSTAR: return FEAT_SANCTIFY_MARTIAL_MORNINGSTAR;
|
||||
case BASE_ITEM_QUARTERSTAFF: return FEAT_SANCTIFY_MARTIAL_QUARTERSTAFF;
|
||||
case BASE_ITEM_MAGICSTAFF: return FEAT_SANCTIFY_MARTIAL_QUARTERSTAFF;
|
||||
case BASE_ITEM_RAPIER: return FEAT_SANCTIFY_MARTIAL_RAPIER;
|
||||
case BASE_ITEM_SCIMITAR: return FEAT_SANCTIFY_MARTIAL_SCIMITAR;
|
||||
case BASE_ITEM_SCYTHE: return FEAT_SANCTIFY_MARTIAL_SCYTHE;
|
||||
@@ -533,6 +537,7 @@ int Sanctify_Feat(int iTypeWeap)
|
||||
case BASE_ITEM_BASTARDSWORD: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_BASTARDSWORD);
|
||||
case BASE_ITEM_BATTLEAXE: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_BATTLEAXE);
|
||||
case BASE_ITEM_CLUB: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_CLUB);
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_CLUB);
|
||||
case BASE_ITEM_DAGGER: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_DAGGER);
|
||||
case BASE_ITEM_DART: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_DART);
|
||||
case BASE_ITEM_DIREMACE: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_DIREMACE);
|
||||
@@ -555,6 +560,7 @@ int Sanctify_Feat(int iTypeWeap)
|
||||
case BASE_ITEM_LONGSWORD: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_LONGSWORD);
|
||||
case BASE_ITEM_MORNINGSTAR: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_MORNINGSTAR);
|
||||
case BASE_ITEM_QUARTERSTAFF: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_QUARTERSTAFF);
|
||||
case BASE_ITEM_MAGICSTAFF: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_QUARTERSTAFF);
|
||||
case BASE_ITEM_RAPIER: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_RAPIER);
|
||||
case BASE_ITEM_SCIMITAR: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_SCIMITAR);
|
||||
case BASE_ITEM_SCYTHE: return GetHasFeat(FEAT_SANCTIFY_MARTIAL_SCYTHE);
|
||||
|
||||
@@ -1082,6 +1082,7 @@ int GetIsTwoHandedMeleeWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_HEAVYFLAIL: return TRUE;
|
||||
case BASE_ITEM_SCYTHE: return TRUE;
|
||||
case BASE_ITEM_QUARTERSTAFF: return TRUE;
|
||||
//case BASE_ITEM_MAGICSTAFF: return TRUE;
|
||||
case BASE_ITEM_ELVEN_COURTBLADE: return TRUE;
|
||||
case BASE_ITEM_MAUL: return TRUE;
|
||||
case BASE_ITEM_FALCHION: return TRUE;
|
||||
@@ -1093,7 +1094,7 @@ int GetIsTwoHandedMeleeWeapon(object oWeap)
|
||||
{
|
||||
return GetIsTwoHandedMeleeWeaponType(GetBaseItemType(oWeap));
|
||||
}
|
||||
|
||||
|
||||
int GetIsCreatureWeaponType(int iWeaponType)
|
||||
{
|
||||
// any of the three creature weapon types that produce bludgeoning, piercing or slashing damage
|
||||
@@ -1130,6 +1131,7 @@ int GetIsSimpleWeaponType(int iWeaponType)
|
||||
{
|
||||
case BASE_ITEM_MORNINGSTAR: return 1;
|
||||
case BASE_ITEM_QUARTERSTAFF: return 1;
|
||||
case BASE_ITEM_MAGICSTAFF: return 1;
|
||||
case BASE_ITEM_SHORTSPEAR: return 1;
|
||||
case BASE_ITEM_HEAVYCROSSBOW: return 1;
|
||||
case BASE_ITEM_INVALID: return 1;
|
||||
@@ -1139,8 +1141,8 @@ int GetIsSimpleWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_CSLSHPRCWEAP: return 1;
|
||||
case BASE_ITEM_GLOVES: return 1;
|
||||
case BASE_ITEM_BRACER: return 1;
|
||||
|
||||
case BASE_ITEM_CLUB: return 2;
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return 1;
|
||||
|
||||
case BASE_ITEM_DAGGER: return 2;
|
||||
case BASE_ITEM_LIGHTMACE: return 2;
|
||||
case BASE_ITEM_SICKLE: return 2;
|
||||
@@ -1204,6 +1206,7 @@ int GetIsDoubleSidedWeaponType(int iWeaponType)
|
||||
return ( iWeaponType == BASE_ITEM_DIREMACE
|
||||
|| iWeaponType == BASE_ITEM_DOUBLEAXE
|
||||
|| iWeaponType == BASE_ITEM_TWOBLADEDSWORD
|
||||
|| iWeaponType == BASE_ITEM_DOUBLE_SCIMITAR
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1276,6 +1279,19 @@ struct WeaponFeat GetAllFeatsOfWeaponType(int iWeaponType)
|
||||
sFeat.VileMartialStrike = FEAT_VILE_MARTIAL_CLUB;
|
||||
break;
|
||||
}
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: {
|
||||
sFeat.Focus = FEAT_WEAPON_FOCUS_CLUB;
|
||||
sFeat.Specialization = FEAT_WEAPON_SPECIALIZATION_CLUB;
|
||||
sFeat.EpicFocus = FEAT_EPIC_WEAPON_FOCUS_CLUB;
|
||||
sFeat.EpicSpecialization = FEAT_EPIC_WEAPON_SPECIALIZATION_CLUB;
|
||||
sFeat.ImprovedCritical = FEAT_IMPROVED_CRITICAL_CLUB;
|
||||
sFeat.OverwhelmingCritical = FEAT_EPIC_OVERWHELMING_CRITICAL_CLUB;
|
||||
sFeat.DevastatingCritical = FEAT_EPIC_DEVASTATING_CRITICAL_CLUB;
|
||||
sFeat.WeaponOfChoice = FEAT_WEAPON_OF_CHOICE_CLUB;
|
||||
sFeat.SanctifyMartialStrike = FEAT_SANCTIFY_MARTIAL_CLUB;
|
||||
sFeat.VileMartialStrike = FEAT_VILE_MARTIAL_CLUB;
|
||||
break;
|
||||
}
|
||||
case BASE_ITEM_DAGGER: {
|
||||
sFeat.Focus = FEAT_WEAPON_FOCUS_DAGGER;
|
||||
sFeat.Specialization = FEAT_WEAPON_SPECIALIZATION_DAGGER;
|
||||
@@ -1562,6 +1578,19 @@ struct WeaponFeat GetAllFeatsOfWeaponType(int iWeaponType)
|
||||
sFeat.VileMartialStrike = FEAT_VILE_MARTIAL_QUARTERSTAFF;
|
||||
break;
|
||||
}
|
||||
case BASE_ITEM_MAGICSTAFF: {
|
||||
sFeat.Focus = FEAT_WEAPON_FOCUS_STAFF;
|
||||
sFeat.Specialization = FEAT_WEAPON_SPECIALIZATION_STAFF;
|
||||
sFeat.EpicFocus = FEAT_EPIC_WEAPON_FOCUS_QUARTERSTAFF;
|
||||
sFeat.EpicSpecialization = FEAT_EPIC_WEAPON_SPECIALIZATION_QUARTERSTAFF;
|
||||
sFeat.ImprovedCritical = FEAT_IMPROVED_CRITICAL_STAFF;
|
||||
sFeat.OverwhelmingCritical = FEAT_EPIC_OVERWHELMING_CRITICAL_QUARTERSTAFF;
|
||||
sFeat.DevastatingCritical = FEAT_EPIC_DEVASTATING_CRITICAL_QUARTERSTAFF;
|
||||
sFeat.WeaponOfChoice = FEAT_WEAPON_OF_CHOICE_QUARTERSTAFF;
|
||||
sFeat.SanctifyMartialStrike = FEAT_SANCTIFY_MARTIAL_QUARTERSTAFF;
|
||||
sFeat.VileMartialStrike = FEAT_VILE_MARTIAL_QUARTERSTAFF;
|
||||
break;
|
||||
}
|
||||
case BASE_ITEM_RAPIER: {
|
||||
sFeat.Focus = FEAT_WEAPON_FOCUS_RAPIER;
|
||||
sFeat.Specialization = FEAT_WEAPON_SPECIALIZATION_RAPIER;
|
||||
@@ -8074,7 +8103,12 @@ void AttackLoopLogic(object oDefender, object oAttacker,
|
||||
if (DEBUG) DoDebug("entered AttackLoopLogic: bFirstAttack = " + IntToString(bFirstAttack) + ", cleave = " + IntToString(bIsCleaveAttack) + ", current action = " + GetActionName(iAction));
|
||||
if (DEBUG) DoDebug("AttackLoopLogic: iMainAttacks = " + IntToString(iMainAttacks) + ", iOffHandAttacks = " + IntToString(iOffHandAttacks) + ", iBonusAttacks = " + IntToString(iBonusAttacks));
|
||||
|
||||
int bIsRangedAttack = sAttackVars.bIsRangedWeapon || sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED_SPELL || sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED;
|
||||
//int bIsRangedAttack = sAttackVars.bIsRangedWeapon || sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED_SPELL || sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED;
|
||||
|
||||
int bIsRangedAttack = sAttackVars.bIsRangedWeapon ||
|
||||
sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED_SPELL ||
|
||||
sAttackVars.iTouchAttackType == TOUCH_ATTACK_RANGED ||
|
||||
GetLocalInt(oAttacker, "WhirlingBlade");
|
||||
|
||||
// check for valid target etc., but only if it is not a cleave or circle kick (in this case we checked all of this before)
|
||||
if (!bIsCleaveAttack)
|
||||
|
||||
@@ -273,6 +273,7 @@ void TigerBlooded(object oInitiator, object oTarget);
|
||||
|
||||
#include "prc_inc_combat"
|
||||
#include "prc_inc_sp_tch"
|
||||
#include "prc_feat_const"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Internal functions */
|
||||
@@ -1140,6 +1141,9 @@ void DoCharge(object oPC, object oTarget, int nDoAttack = TRUE, int nGenerateAoO
|
||||
nPounce = TRUE;
|
||||
if (GetHasSpellEffect(VESTIGE_CHUPOCLOPS, oPC) && GetLocalInt(oPC, "ExploitVestige") != VESTIGE_CHUPOCLOPS_POUNCE)
|
||||
nPounce = TRUE;
|
||||
//:: Lion of Talisid
|
||||
if(GetHasFeat(FEAT_LOT_LIONS_POUNCE, oPC))
|
||||
nPounce = TRUE;
|
||||
|
||||
// Checks for a White Raven Stance
|
||||
// If it exists, +1 damage/initiator level
|
||||
@@ -1318,7 +1322,29 @@ int DoTrip(object oPC, object oTarget, int nExtraBonus, int nGenerateAoO = TRUE,
|
||||
DelayCommand(0.0, PerformAttack(oTarget, oPC, eNone, 0.0, 0, 0, 0, "Improved Trip Free Attack Hit", "Improved Trip Free Attack Miss"));
|
||||
}
|
||||
}
|
||||
else // If you fail, enemy gets a counter trip attempt, using Strength
|
||||
else // If you fail, enemy gets a counter trip attempt, using Strength
|
||||
{
|
||||
if(!nCounterTrip)
|
||||
{
|
||||
nTargetStat = GetAbilityModifier(ABILITY_STRENGTH, oTarget) + GetCombatMoveCheckBonus(oTarget, COMBAT_MOVE_TRIP, FALSE, TRUE);
|
||||
FloatingTextStringOnCreature("You have failed on your Trip attempt",oPC, FALSE);
|
||||
// Roll counter trip attempt
|
||||
nTargetCheck = nTargetStat + nTargetBonus + d20();
|
||||
nPCCheck = nPCStat + nPCBonus + d20();
|
||||
// If counters aren't allowed, don't knock em down
|
||||
// Its down here to allow the text message to go through
|
||||
SendMessageToPC(oPC, "Enemy Counter Trip Check: "+IntToString(nPCCheck)+" vs "+IntToString(nTargetCheck));
|
||||
|
||||
SetLocalInt(oPC, "TripDifference", nTargetCheck - nPCCheck);
|
||||
DelayCommand(2.0, DeleteLocalInt(oPC, "TripDifference"));
|
||||
}
|
||||
if (nTargetCheck >= nPCCheck && nCounterTrip)
|
||||
{
|
||||
// Knock em down
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ExtraordinaryEffect(EffectKnockdown()), oPC, 6.0);
|
||||
}
|
||||
}
|
||||
/* else // If you fail, enemy gets a counter trip attempt, using Strength
|
||||
{
|
||||
nTargetStat = GetAbilityModifier(ABILITY_STRENGTH, oTarget) + GetCombatMoveCheckBonus(oTarget, COMBAT_MOVE_TRIP, FALSE, TRUE);
|
||||
FloatingTextStringOnCreature("You have failed on your Trip attempt",oPC, FALSE);
|
||||
@@ -1335,7 +1361,7 @@ int DoTrip(object oPC, object oTarget, int nExtraBonus, int nGenerateAoO = TRUE,
|
||||
}
|
||||
SetLocalInt(oPC, "TripDifference", nTargetCheck - nPCCheck);
|
||||
DelayCommand(2.0, DeleteLocalInt(oPC, "TripDifference"));
|
||||
}
|
||||
} */
|
||||
}
|
||||
else
|
||||
FloatingTextStringOnCreature("You have failed on your Trip attempt",oPC, FALSE);
|
||||
@@ -1938,10 +1964,21 @@ void TigerBlooded(object oInitiator, object oTarget)
|
||||
int DoDisarm(object oPC, object oTarget, int nExtraBonus = 0, int nGenerateAoO = TRUE, int nCounter = TRUE)
|
||||
{
|
||||
object oTargetWep = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
|
||||
|
||||
int bNoDisarm = GetHasFeat(FEAT_INTRINSIC_WEAPON, oTarget);
|
||||
|
||||
string sName = GetName(oTarget);
|
||||
|
||||
if(bNoDisarm)
|
||||
{
|
||||
FloatingTextStringOnCreature(sName+" is wielding an intrinsic weapon", oPC, FALSE);
|
||||
AssignCommand(oPC, ActionAttack(oTarget));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!GetIsObjectValid(oTargetWep) || GetPlotFlag(oTargetWep) || (!GetIsCreatureDisarmable(oTarget) && !GetPRCSwitch(PRC_PNP_DISARM)) || GetLocalInt(oTarget, "TigerFangDisarm"))
|
||||
{
|
||||
FloatingTextStringOnCreature("Target is not a legal target", oPC, FALSE);
|
||||
FloatingTextStringOnCreature(sName+" is not a legal target", oPC, FALSE);
|
||||
AssignCommand(oPC, ActionAttack(oTarget));
|
||||
return FALSE;
|
||||
}
|
||||
@@ -2312,7 +2349,10 @@ void DoShieldCharge(object oPC, object oTarget, int nSlam = FALSE)
|
||||
if(GetLevelByClass(CLASS_TYPE_CELEBRANT_SHARESS, oPC) >= 5)
|
||||
nPounce = TRUE;
|
||||
if(GetRacialType(oPC) == RACIAL_TYPE_MARRUSAULT)
|
||||
nPounce = TRUE;
|
||||
nPounce = TRUE;
|
||||
//:: Lion of Talisid
|
||||
if(GetHasFeat(FEAT_LOT_LIONS_POUNCE, oPC))
|
||||
nPounce = TRUE;
|
||||
|
||||
// Checks for a White Raven Stance
|
||||
// If it exists, +1 damage/initiator level
|
||||
|
||||
@@ -133,6 +133,7 @@ const int METAMAGIC_QUICKEN_LEVEL = 4;
|
||||
#include "prc_inc_damage"
|
||||
#include "prc_inc_sb_const" // Spell Book Constants
|
||||
#include "x0_i0_position"
|
||||
#include "inc_newspellbook"
|
||||
|
||||
/*
|
||||
access to prc_inc_nwscript via prc_inc_damage
|
||||
@@ -410,6 +411,8 @@ int PRCGetSpellLevelForClass(int nSpell, int nClass)
|
||||
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)
|
||||
@@ -462,7 +465,7 @@ int PRCGetSpellLevelForClass(int nSpell, int nClass)
|
||||
return nSpellLevel;
|
||||
}
|
||||
|
||||
// returns the spelllevel of nSpell as it can be cast by oCreature
|
||||
// returns the spell circle level of nSpell as it can be cast by oCreature
|
||||
int PRCGetSpellLevel(object oCreature, int nSpell)
|
||||
{
|
||||
/*if (!PRCGetHasSpell(nSpell, oCreature))
|
||||
@@ -605,7 +608,7 @@ int PRCGetHasSpell(int nRealSpellID, object oCreature = OBJECT_SELF)
|
||||
if(nSpellbookType == SPELLBOOK_TYPE_PREPARED)
|
||||
{
|
||||
nCount = persistant_array_get_int(oCreature, "NewSpellbookMem_" + IntToString(nClass), j);
|
||||
if(DEBUG) DoDebug("PRCGetHasSpell: NewSpellbookMem_" + IntToString(nClass) + "[" + IntToString(j) + "] = " + IntToString(nCount));
|
||||
if(DEBUG) DoDebug("prc_inc_core >> PRCGetHasSpell: NewSpellbookMem_" + IntToString(nClass) + "[" + IntToString(j) + "] = " + IntToString(nCount));
|
||||
if(nCount > 0)
|
||||
{
|
||||
nUses += nCount;
|
||||
@@ -615,7 +618,7 @@ int PRCGetHasSpell(int nRealSpellID, object oCreature = OBJECT_SELF)
|
||||
{
|
||||
nSpellLevel = StringToInt(Get2DACache(sFile, "Level", j));
|
||||
nCount = persistant_array_get_int(oCreature, "NewSpellbookMem_" + IntToString(nClass), nSpellLevel);
|
||||
if(DEBUG) DoDebug("PRCGetHasSpell: NewSpellbookMem_" + IntToString(nClass) + "[" + IntToString(j) + "] = " + IntToString(nCount));
|
||||
if(DEBUG) DoDebug("prc_inc_core >> PRCGetHasSpell: NewSpellbookMem_" + IntToString(nClass) + "[" + IntToString(j) + "] = " + IntToString(nCount));
|
||||
if(nCount > 0)
|
||||
{
|
||||
nUses += nCount;
|
||||
|
||||
@@ -169,8 +169,8 @@ int GetSubschoolFlags(int nSpellID);
|
||||
/* Includes */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
#include "inc_2dacache" // already has access via inc_utility
|
||||
//#include "inc_utility"
|
||||
#include "inc_2dacache"
|
||||
#include "inc_utility"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Function definitions */
|
||||
|
||||
@@ -49,6 +49,8 @@ const int BRILLIANCE_SLOT_3 = 3919;
|
||||
//////////////////////////////////////////////////
|
||||
/* Function definitions */
|
||||
//////////////////////////////////////////////////
|
||||
void TriggerInspiration(object oPC, int nCombat);
|
||||
|
||||
|
||||
void PrepareArcDilSpell(object oPC, int nSpell)
|
||||
{
|
||||
@@ -188,7 +190,8 @@ void SetInspiration(object oPC)
|
||||
for(i = FEAT_FONT_INSPIRATION_1; i <= FEAT_FONT_INSPIRATION_10; i++)
|
||||
if(GetHasFeat(i, oPC)) nFont++;
|
||||
|
||||
nInspiration += nFont * (1 + nFont + 1) / 2;
|
||||
//nInspiration += nFont * (1 + nFont + 1) / 2;
|
||||
nInspiration += nFont * (nFont + 1) / 2;
|
||||
SetLocalInt(oPC, "InspirationPool", nInspiration);
|
||||
FloatingTextStringOnCreature("Encounter begins with "+IntToString(nInspiration)+" inspiration", oPC, FALSE);
|
||||
}
|
||||
@@ -201,6 +204,8 @@ void ClearInspiration(object oPC)
|
||||
|
||||
int ExpendInspiration(object oPC, int nCost)
|
||||
{
|
||||
if (nCost <= 0) return FALSE;
|
||||
|
||||
int nInspiration = GetLocalInt(oPC, "InspirationPool");
|
||||
if (nInspiration >= nCost)
|
||||
{
|
||||
@@ -261,6 +266,21 @@ void FactotumTriggerAbil(object oPC, int nAbil)
|
||||
IPSafeAddItemProperty(oSkin, ipIP, 60.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
|
||||
}
|
||||
|
||||
void TriggerInspiration(object oPC, int nCombat)
|
||||
{
|
||||
SetLocalInt(oPC, "InspirationHBRunning", TRUE);
|
||||
DelayCommand(0.249, DeleteLocalInt(oPC, "InspirationHBRunning"));
|
||||
int nCurrent = GetIsInCombat(oPC);
|
||||
// We just entered combat
|
||||
if (nCurrent == TRUE && nCombat == FALSE)
|
||||
SetInspiration(oPC);
|
||||
else if (nCurrent == FALSE && nCombat == TRUE) // Just left combat
|
||||
ClearInspiration(oPC);
|
||||
|
||||
DelayCommand(0.25, TriggerInspiration(oPC, nCurrent));
|
||||
}
|
||||
|
||||
|
||||
/*void AddCunningBrillianceAbility(object oPC, int nAbil)
|
||||
{
|
||||
if (DEBUG) DoDebug("AddCunningBrillianceAbility "+IntToString(nAbil));
|
||||
|
||||
@@ -23,11 +23,14 @@ const int FEAT_TYPE_IMPROVED_CRITICAL = 5;
|
||||
const int FEAT_TYPE_OVERWHELMING_CRITICAL = 6;
|
||||
const int FEAT_TYPE_DEVASTATING_CRITICAL = 7;
|
||||
const int FEAT_TYPE_WEAPON_OF_CHOICE = 8;
|
||||
const int FEAT_TYPE_WEAPON_PROFICIENCY = 9;
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Function prototypes */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
int GetProficiencyFeatOfWeaponType(int iWeaponType);
|
||||
|
||||
/**
|
||||
* Returns the appropriate weapon feat given a weapon type.
|
||||
*
|
||||
@@ -210,10 +213,86 @@ int GetFeatOfWeaponType(int iWeaponType, int iFeatType)
|
||||
case FEAT_TYPE_OVERWHELMING_CRITICAL: return GetOverwhelmingCriticalFeatOfWeaponType(iWeaponType);
|
||||
case FEAT_TYPE_DEVASTATING_CRITICAL: return GetDevastatingCriticalFeatOfWeaponType(iWeaponType);
|
||||
case FEAT_TYPE_WEAPON_OF_CHOICE: return GetWeaponOfChoiceFeatOfWeaponType(iWeaponType);
|
||||
case FEAT_TYPE_WEAPON_PROFICIENCY: return GetProficiencyFeatOfWeaponType(iWeaponType);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int GetProficiencyFeatOfWeaponType(int iWeaponType)
|
||||
{
|
||||
switch(iWeaponType)
|
||||
{
|
||||
case BASE_ITEM_CBLUDGWEAPON:
|
||||
case BASE_ITEM_CPIERCWEAPON:
|
||||
case BASE_ITEM_CSLASHWEAPON:
|
||||
case BASE_ITEM_CSLSHPRCWEAP: return FEAT_WEAPON_PROFICIENCY_CREATURE;
|
||||
case BASE_ITEM_INVALID: return FEAT_IMPROVED_UNARMED_STRIKE;
|
||||
|
||||
case BASE_ITEM_BASTARDSWORD: return FEAT_WEAPON_PROFICIENCY_BASTARD_SWORD;
|
||||
case BASE_ITEM_BATTLEAXE: return FEAT_WEAPON_PROFICIENCY_BATTLEAXE;
|
||||
case BASE_ITEM_CLUB: return FEAT_WEAPON_PROFICIENCY_CLUB;
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return FEAT_WEAPON_PROFICIENCY_CLUB;
|
||||
case BASE_ITEM_DAGGER: return FEAT_WEAPON_PROFICIENCY_DAGGER;
|
||||
case BASE_ITEM_DART: return FEAT_WEAPON_PROFICIENCY_DART;
|
||||
case BASE_ITEM_DIREMACE: return FEAT_WEAPON_PROFICIENCY_DIRE_MACE;
|
||||
case BASE_ITEM_DOUBLEAXE: return FEAT_WEAPON_PROFICIENCY_DOUBLE_AXE;
|
||||
case BASE_ITEM_DWARVENWARAXE: return FEAT_WEAPON_PROFICIENCY_DWARVEN_WARAXE;
|
||||
case BASE_ITEM_GREATAXE: return FEAT_WEAPON_PROFICIENCY_GREATAXE;
|
||||
case BASE_ITEM_GREATSWORD: return FEAT_WEAPON_PROFICIENCY_GREATSWORD;
|
||||
case BASE_ITEM_HALBERD: return FEAT_WEAPON_PROFICIENCY_HALBERD;
|
||||
case BASE_ITEM_HANDAXE: return FEAT_WEAPON_PROFICIENCY_HANDAXE;
|
||||
case BASE_ITEM_HEAVYCROSSBOW: return FEAT_WEAPON_PROFICIENCY_HEAVY_XBOW;
|
||||
case BASE_ITEM_HEAVYFLAIL: return FEAT_WEAPON_PROFICIENCY_HEAVY_FLAIL;
|
||||
case BASE_ITEM_KAMA: return FEAT_WEAPON_PROFICIENCY_KAMA;
|
||||
case BASE_ITEM_KATANA: return FEAT_WEAPON_PROFICIENCY_KATANA;
|
||||
case BASE_ITEM_KUKRI: return FEAT_WEAPON_PROFICIENCY_KUKRI;
|
||||
case BASE_ITEM_LIGHTCROSSBOW: return FEAT_WEAPON_PROFICIENCY_LIGHT_XBOW;
|
||||
case BASE_ITEM_LIGHTFLAIL: return FEAT_WEAPON_PROFICIENCY_LIGHT_FLAIL;
|
||||
case BASE_ITEM_LIGHTHAMMER: return FEAT_WEAPON_PROFICIENCY_LIGHT_HAMMER;
|
||||
case BASE_ITEM_LIGHTMACE: return FEAT_WEAPON_PROFICIENCY_LIGHT_MACE;
|
||||
case BASE_ITEM_LONGBOW: return FEAT_WEAPON_PROFICIENCY_LONGBOW;
|
||||
case BASE_ITEM_LONGSWORD: return FEAT_WEAPON_PROFICIENCY_LONGSWORD;
|
||||
case BASE_ITEM_MORNINGSTAR: return FEAT_WEAPON_PROFICIENCY_MORNINGSTAR;
|
||||
case BASE_ITEM_QUARTERSTAFF: return FEAT_WEAPON_PROFICIENCY_QUARTERSTAFF;
|
||||
case BASE_ITEM_MAGICSTAFF: return FEAT_WEAPON_PROFICIENCY_QUARTERSTAFF;
|
||||
case BASE_ITEM_RAPIER: return FEAT_WEAPON_PROFICIENCY_RAPIER;
|
||||
case BASE_ITEM_SCIMITAR: return FEAT_WEAPON_PROFICIENCY_SCIMITAR;
|
||||
case BASE_ITEM_SCYTHE: return FEAT_WEAPON_PROFICIENCY_SCYTHE;
|
||||
case BASE_ITEM_SHORTBOW: return FEAT_WEAPON_PROFICIENCY_SHORTBOW;
|
||||
case BASE_ITEM_SHORTSPEAR: return FEAT_WEAPON_PROFICIENCY_SHORTSPEAR;
|
||||
case BASE_ITEM_SHORTSWORD: return FEAT_WEAPON_PROFICIENCY_SHORTSWORD;
|
||||
case BASE_ITEM_SHURIKEN: return FEAT_WEAPON_PROFICIENCY_SHURIKEN;
|
||||
case BASE_ITEM_SICKLE: return FEAT_WEAPON_PROFICIENCY_SICKLE;
|
||||
case BASE_ITEM_SLING: return FEAT_WEAPON_PROFICIENCY_SLING;
|
||||
case BASE_ITEM_THROWINGAXE: return FEAT_WEAPON_PROFICIENCY_THROWING_AXE;
|
||||
case BASE_ITEM_TRIDENT: return FEAT_WEAPON_PROFICIENCY_TRIDENT;
|
||||
case BASE_ITEM_TWOBLADEDSWORD: return FEAT_WEAPON_PROFICIENCY_TWO_BLADED_SWORD;
|
||||
case BASE_ITEM_WARHAMMER: return FEAT_WEAPON_PROFICIENCY_WARHAMMER;
|
||||
case BASE_ITEM_WHIP: return FEAT_WEAPON_PROFICIENCY_WHIP;
|
||||
|
||||
//:: new item types
|
||||
case BASE_ITEM_DOUBLE_SCIMITAR: return FEAT_WEAPON_PROFICIENCY_DOUBLE_SCIMITAR;
|
||||
case BASE_ITEM_EAGLE_CLAW: return FEAT_WEAPON_PROFICIENCY_EAGLE_CLAW;
|
||||
case BASE_ITEM_ELVEN_COURTBLADE: return FEAT_WEAPON_PROFICIENCY_ELVEN_COURTBLADE;
|
||||
case BASE_ITEM_ELVEN_LIGHTBLADE: return FEAT_WEAPON_PROFICIENCY_ELVEN_LIGHTBLADE;
|
||||
case BASE_ITEM_ELVEN_THINBLADE: return FEAT_WEAPON_PROFICIENCY_ELVEN_THINBLADE;
|
||||
case BASE_ITEM_FALCHION: return FEAT_WEAPON_PROFICIENCY_FALCHION;
|
||||
case BASE_ITEM_GOAD: return FEAT_WEAPON_PROFICIENCY_GOAD;
|
||||
case BASE_ITEM_HEAVY_MACE: return FEAT_WEAPON_PROFICIENCY_HEAVY_MACE;
|
||||
case BASE_ITEM_HEAVY_PICK: return FEAT_WEAPON_PROFICIENCY_HEAVY_PICK;
|
||||
case BASE_ITEM_KATAR: return FEAT_WEAPON_PROFICIENCY_KATAR;
|
||||
case BASE_ITEM_LIGHT_LANCE: return FEAT_WEAPON_PROFICIENCY_LIGHT_LANCE;
|
||||
case BASE_ITEM_LIGHT_PICK: return FEAT_WEAPON_PROFICIENCY_LIGHT_PICK;
|
||||
case BASE_ITEM_MAUL: return FEAT_WEAPON_PROFICIENCY_MAUL;
|
||||
case BASE_ITEM_NUNCHAKU: return FEAT_WEAPON_PROFICIENCY_NUNCHAKU;
|
||||
case BASE_ITEM_SAI: return FEAT_WEAPON_PROFICIENCY_SAI;
|
||||
case BASE_ITEM_SAP: return FEAT_WEAPON_PROFICIENCY_SAP;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int GetFocusFeatOfWeaponType(int iWeaponType)
|
||||
{
|
||||
switch(iWeaponType)
|
||||
@@ -226,6 +305,7 @@ int GetFocusFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_BASTARDSWORD: return FEAT_WEAPON_FOCUS_BASTARD_SWORD;
|
||||
case BASE_ITEM_BATTLEAXE: return FEAT_WEAPON_FOCUS_BATTLE_AXE;
|
||||
case BASE_ITEM_CLUB: return FEAT_WEAPON_FOCUS_CLUB;
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return FEAT_WEAPON_FOCUS_CLUB;
|
||||
case BASE_ITEM_DAGGER: return FEAT_WEAPON_FOCUS_DAGGER;
|
||||
case BASE_ITEM_DART: return FEAT_WEAPON_FOCUS_DART;
|
||||
case BASE_ITEM_DIREMACE: return FEAT_WEAPON_FOCUS_DIRE_MACE;
|
||||
@@ -248,6 +328,7 @@ int GetFocusFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_LONGSWORD: return FEAT_WEAPON_FOCUS_LONG_SWORD;
|
||||
case BASE_ITEM_MORNINGSTAR: return FEAT_WEAPON_FOCUS_MORNING_STAR;
|
||||
case BASE_ITEM_QUARTERSTAFF: return FEAT_WEAPON_FOCUS_STAFF;
|
||||
case BASE_ITEM_MAGICSTAFF: return FEAT_WEAPON_FOCUS_STAFF;
|
||||
case BASE_ITEM_RAPIER: return FEAT_WEAPON_FOCUS_RAPIER;
|
||||
case BASE_ITEM_SCIMITAR: return FEAT_WEAPON_FOCUS_SCIMITAR;
|
||||
case BASE_ITEM_SCYTHE: return FEAT_WEAPON_FOCUS_SCYTHE;
|
||||
@@ -296,6 +377,7 @@ int GetSpecializationFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_BASTARDSWORD: return FEAT_WEAPON_SPECIALIZATION_BASTARD_SWORD;
|
||||
case BASE_ITEM_BATTLEAXE: return FEAT_WEAPON_SPECIALIZATION_BATTLE_AXE;
|
||||
case BASE_ITEM_CLUB: return FEAT_WEAPON_SPECIALIZATION_CLUB;
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return FEAT_WEAPON_SPECIALIZATION_CLUB;
|
||||
case BASE_ITEM_DAGGER: return FEAT_WEAPON_SPECIALIZATION_DAGGER;
|
||||
case BASE_ITEM_DART: return FEAT_WEAPON_SPECIALIZATION_DART;
|
||||
case BASE_ITEM_DIREMACE: return FEAT_WEAPON_SPECIALIZATION_DIRE_MACE;
|
||||
@@ -318,6 +400,7 @@ int GetSpecializationFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_LONGSWORD: return FEAT_WEAPON_SPECIALIZATION_LONG_SWORD;
|
||||
case BASE_ITEM_MORNINGSTAR: return FEAT_WEAPON_SPECIALIZATION_MORNING_STAR;
|
||||
case BASE_ITEM_QUARTERSTAFF: return FEAT_WEAPON_SPECIALIZATION_STAFF;
|
||||
case BASE_ITEM_MAGICSTAFF: return FEAT_WEAPON_SPECIALIZATION_STAFF;
|
||||
case BASE_ITEM_RAPIER: return FEAT_WEAPON_SPECIALIZATION_RAPIER;
|
||||
case BASE_ITEM_SCIMITAR: return FEAT_WEAPON_SPECIALIZATION_SCIMITAR;
|
||||
case BASE_ITEM_SCYTHE: return FEAT_WEAPON_SPECIALIZATION_SCYTHE;
|
||||
@@ -366,6 +449,7 @@ int GetEpicFocusFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_BASTARDSWORD: return FEAT_EPIC_WEAPON_FOCUS_BASTARDSWORD;
|
||||
case BASE_ITEM_BATTLEAXE: return FEAT_EPIC_WEAPON_FOCUS_BATTLEAXE;
|
||||
case BASE_ITEM_CLUB: return FEAT_EPIC_WEAPON_FOCUS_CLUB;
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return FEAT_EPIC_WEAPON_FOCUS_CLUB;
|
||||
case BASE_ITEM_DAGGER: return FEAT_EPIC_WEAPON_FOCUS_DAGGER;
|
||||
case BASE_ITEM_DART: return FEAT_EPIC_WEAPON_FOCUS_DART;
|
||||
case BASE_ITEM_DIREMACE: return FEAT_EPIC_WEAPON_FOCUS_DIREMACE;
|
||||
@@ -388,6 +472,7 @@ int GetEpicFocusFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_LONGSWORD: return FEAT_EPIC_WEAPON_FOCUS_LONGSWORD;
|
||||
case BASE_ITEM_MORNINGSTAR: return FEAT_EPIC_WEAPON_FOCUS_MORNINGSTAR;
|
||||
case BASE_ITEM_QUARTERSTAFF: return FEAT_EPIC_WEAPON_FOCUS_QUARTERSTAFF;
|
||||
case BASE_ITEM_MAGICSTAFF: return FEAT_EPIC_WEAPON_FOCUS_QUARTERSTAFF;
|
||||
case BASE_ITEM_RAPIER: return FEAT_EPIC_WEAPON_FOCUS_RAPIER;
|
||||
case BASE_ITEM_SCIMITAR: return FEAT_EPIC_WEAPON_FOCUS_SCIMITAR;
|
||||
case BASE_ITEM_SCYTHE: return FEAT_EPIC_WEAPON_FOCUS_SCYTHE;
|
||||
@@ -436,6 +521,7 @@ int GetEpicSpecializationFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_BASTARDSWORD: return FEAT_EPIC_WEAPON_SPECIALIZATION_BASTARDSWORD;
|
||||
case BASE_ITEM_BATTLEAXE: return FEAT_EPIC_WEAPON_SPECIALIZATION_BATTLEAXE;
|
||||
case BASE_ITEM_CLUB: return FEAT_EPIC_WEAPON_SPECIALIZATION_CLUB;
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return FEAT_EPIC_WEAPON_SPECIALIZATION_CLUB;
|
||||
case BASE_ITEM_DAGGER: return FEAT_EPIC_WEAPON_SPECIALIZATION_DAGGER;
|
||||
case BASE_ITEM_DART: return FEAT_EPIC_WEAPON_SPECIALIZATION_DART;
|
||||
case BASE_ITEM_DIREMACE: return FEAT_EPIC_WEAPON_SPECIALIZATION_DIREMACE;
|
||||
@@ -458,7 +544,8 @@ int GetEpicSpecializationFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_LONGSWORD: return FEAT_EPIC_WEAPON_SPECIALIZATION_LONGSWORD;
|
||||
case BASE_ITEM_MORNINGSTAR: return FEAT_EPIC_WEAPON_SPECIALIZATION_MORNINGSTAR;
|
||||
case BASE_ITEM_QUARTERSTAFF: return FEAT_EPIC_WEAPON_SPECIALIZATION_QUARTERSTAFF;
|
||||
case BASE_ITEM_RAPIER: return FEAT_EPIC_WEAPON_SPECIALIZATION_RAPIER;
|
||||
case BASE_ITEM_MAGICSTAFF: return FEAT_EPIC_WEAPON_SPECIALIZATION_QUARTERSTAFF;
|
||||
case BASE_ITEM_RAPIER: return FEAT_EPIC_WEAPON_SPECIALIZATION_RAPIER;
|
||||
case BASE_ITEM_SCIMITAR: return FEAT_EPIC_WEAPON_SPECIALIZATION_SCIMITAR;
|
||||
case BASE_ITEM_SCYTHE: return FEAT_EPIC_WEAPON_SPECIALIZATION_SCYTHE;
|
||||
case BASE_ITEM_SHORTBOW: return FEAT_EPIC_WEAPON_SPECIALIZATION_SHORTBOW;
|
||||
@@ -506,6 +593,7 @@ int GetImprovedCriticalFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_BASTARDSWORD: return FEAT_IMPROVED_CRITICAL_BASTARD_SWORD;
|
||||
case BASE_ITEM_BATTLEAXE: return FEAT_IMPROVED_CRITICAL_BATTLE_AXE;
|
||||
case BASE_ITEM_CLUB: return FEAT_IMPROVED_CRITICAL_CLUB;
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return FEAT_IMPROVED_CRITICAL_CLUB;
|
||||
case BASE_ITEM_DAGGER: return FEAT_IMPROVED_CRITICAL_DAGGER;
|
||||
case BASE_ITEM_DART: return FEAT_IMPROVED_CRITICAL_DART;
|
||||
case BASE_ITEM_DIREMACE: return FEAT_IMPROVED_CRITICAL_DIRE_MACE;
|
||||
@@ -528,6 +616,7 @@ int GetImprovedCriticalFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_LONGSWORD: return FEAT_IMPROVED_CRITICAL_LONG_SWORD;
|
||||
case BASE_ITEM_MORNINGSTAR: return FEAT_IMPROVED_CRITICAL_MORNING_STAR;
|
||||
case BASE_ITEM_QUARTERSTAFF: return FEAT_IMPROVED_CRITICAL_STAFF;
|
||||
case BASE_ITEM_MAGICSTAFF: return FEAT_IMPROVED_CRITICAL_STAFF;
|
||||
case BASE_ITEM_RAPIER: return FEAT_IMPROVED_CRITICAL_RAPIER;
|
||||
case BASE_ITEM_SCIMITAR: return FEAT_IMPROVED_CRITICAL_SCIMITAR;
|
||||
case BASE_ITEM_SCYTHE: return FEAT_IMPROVED_CRITICAL_SCYTHE;
|
||||
@@ -576,6 +665,7 @@ int GetOverwhelmingCriticalFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_BASTARDSWORD: return FEAT_EPIC_OVERWHELMING_CRITICAL_BASTARDSWORD;
|
||||
case BASE_ITEM_BATTLEAXE: return FEAT_EPIC_OVERWHELMING_CRITICAL_BATTLEAXE;
|
||||
case BASE_ITEM_CLUB: return FEAT_EPIC_OVERWHELMING_CRITICAL_CLUB;
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return FEAT_EPIC_OVERWHELMING_CRITICAL_CLUB;
|
||||
case BASE_ITEM_DAGGER: return FEAT_EPIC_OVERWHELMING_CRITICAL_DAGGER;
|
||||
case BASE_ITEM_DART: return FEAT_EPIC_OVERWHELMING_CRITICAL_DART;
|
||||
case BASE_ITEM_DIREMACE: return FEAT_EPIC_OVERWHELMING_CRITICAL_DIREMACE;
|
||||
@@ -598,6 +688,7 @@ int GetOverwhelmingCriticalFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_LONGSWORD: return FEAT_EPIC_OVERWHELMING_CRITICAL_LONGSWORD;
|
||||
case BASE_ITEM_MORNINGSTAR: return FEAT_EPIC_OVERWHELMING_CRITICAL_MORNINGSTAR;
|
||||
case BASE_ITEM_QUARTERSTAFF: return FEAT_EPIC_OVERWHELMING_CRITICAL_QUARTERSTAFF;
|
||||
case BASE_ITEM_MAGICSTAFF: return FEAT_EPIC_OVERWHELMING_CRITICAL_QUARTERSTAFF;
|
||||
case BASE_ITEM_RAPIER: return FEAT_EPIC_OVERWHELMING_CRITICAL_RAPIER;
|
||||
case BASE_ITEM_SCIMITAR: return FEAT_EPIC_OVERWHELMING_CRITICAL_SCIMITAR;
|
||||
case BASE_ITEM_SCYTHE: return FEAT_EPIC_OVERWHELMING_CRITICAL_SCYTHE;
|
||||
@@ -646,6 +737,7 @@ int GetDevastatingCriticalFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_BASTARDSWORD: return FEAT_EPIC_DEVASTATING_CRITICAL_BASTARDSWORD;
|
||||
case BASE_ITEM_BATTLEAXE: return FEAT_EPIC_DEVASTATING_CRITICAL_BATTLEAXE;
|
||||
case BASE_ITEM_CLUB: return FEAT_EPIC_DEVASTATING_CRITICAL_CLUB;
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return FEAT_EPIC_DEVASTATING_CRITICAL_CLUB;
|
||||
case BASE_ITEM_DAGGER: return FEAT_EPIC_DEVASTATING_CRITICAL_DAGGER;
|
||||
case BASE_ITEM_DART: return FEAT_EPIC_DEVASTATING_CRITICAL_DART;
|
||||
case BASE_ITEM_DIREMACE: return FEAT_EPIC_DEVASTATING_CRITICAL_DIREMACE;
|
||||
@@ -668,6 +760,7 @@ int GetDevastatingCriticalFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_LONGSWORD: return FEAT_EPIC_DEVASTATING_CRITICAL_LONGSWORD;
|
||||
case BASE_ITEM_MORNINGSTAR: return FEAT_EPIC_DEVASTATING_CRITICAL_MORNINGSTAR;
|
||||
case BASE_ITEM_QUARTERSTAFF: return FEAT_EPIC_DEVASTATING_CRITICAL_QUARTERSTAFF;
|
||||
case BASE_ITEM_MAGICSTAFF: return FEAT_EPIC_DEVASTATING_CRITICAL_QUARTERSTAFF;
|
||||
case BASE_ITEM_RAPIER: return FEAT_EPIC_DEVASTATING_CRITICAL_RAPIER;
|
||||
case BASE_ITEM_SCIMITAR: return FEAT_EPIC_DEVASTATING_CRITICAL_SCIMITAR;
|
||||
case BASE_ITEM_SCYTHE: return FEAT_EPIC_DEVASTATING_CRITICAL_SCYTHE;
|
||||
@@ -711,6 +804,7 @@ int GetWeaponOfChoiceFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_BASTARDSWORD: return FEAT_WEAPON_OF_CHOICE_BASTARDSWORD;
|
||||
case BASE_ITEM_BATTLEAXE: return FEAT_WEAPON_OF_CHOICE_BATTLEAXE;
|
||||
case BASE_ITEM_CLUB: return FEAT_WEAPON_OF_CHOICE_CLUB;
|
||||
case BASE_ITEM_CRAFTED_SCEPTER: return FEAT_WEAPON_OF_CHOICE_CLUB;
|
||||
case BASE_ITEM_DAGGER: return FEAT_WEAPON_OF_CHOICE_DAGGER;
|
||||
case BASE_ITEM_DIREMACE: return FEAT_WEAPON_OF_CHOICE_DIREMACE;
|
||||
case BASE_ITEM_DOUBLEAXE: return FEAT_WEAPON_OF_CHOICE_DOUBLEAXE;
|
||||
@@ -729,6 +823,7 @@ int GetWeaponOfChoiceFeatOfWeaponType(int iWeaponType)
|
||||
case BASE_ITEM_LONGSWORD: return FEAT_WEAPON_OF_CHOICE_LONGSWORD;
|
||||
case BASE_ITEM_MORNINGSTAR: return FEAT_WEAPON_OF_CHOICE_MORNINGSTAR;
|
||||
case BASE_ITEM_QUARTERSTAFF: return FEAT_WEAPON_OF_CHOICE_QUARTERSTAFF;
|
||||
case BASE_ITEM_MAGICSTAFF: return FEAT_WEAPON_OF_CHOICE_QUARTERSTAFF;
|
||||
case BASE_ITEM_RAPIER: return FEAT_WEAPON_OF_CHOICE_RAPIER;
|
||||
case BASE_ITEM_SCIMITAR: return FEAT_WEAPON_OF_CHOICE_SCIMITAR;
|
||||
case BASE_ITEM_SCYTHE: return FEAT_WEAPON_OF_CHOICE_SCYTHE;
|
||||
@@ -787,6 +882,7 @@ int GetWeaponSize(object oWeapon)
|
||||
case BASE_ITEM_GREATAXE:
|
||||
case BASE_ITEM_HEAVYFLAIL:
|
||||
case BASE_ITEM_QUARTERSTAFF:
|
||||
//case BASE_ITEM_MAGICSTAFF:
|
||||
case BASE_ITEM_SCYTHE:
|
||||
case BASE_ITEM_SHORTSPEAR:
|
||||
case BASE_ITEM_ELVEN_COURTBLADE:
|
||||
@@ -823,6 +919,7 @@ int PRCLargeWeaponCheck(int iBaseType, int nSize)
|
||||
case BASE_ITEM_GREATAXE:
|
||||
case BASE_ITEM_HEAVYFLAIL:
|
||||
case BASE_ITEM_QUARTERSTAFF:
|
||||
//case BASE_ITEM_MAGICSTAFF:
|
||||
case BASE_ITEM_SCYTHE:
|
||||
case BASE_ITEM_SHORTSPEAR:
|
||||
case BASE_ITEM_ELVEN_COURTBLADE:
|
||||
@@ -834,4 +931,6 @@ int PRCLargeWeaponCheck(int iBaseType, int nSize)
|
||||
}
|
||||
}
|
||||
return sTest != "" && sTest != IntToString(nSize);
|
||||
}
|
||||
}
|
||||
|
||||
//::void main(){}
|
||||
@@ -108,8 +108,8 @@ void SetupCharacterData(object oPC)
|
||||
case CLASS_TYPE_ALIENIST: sScript = "prc_alienist"; break;
|
||||
case CLASS_TYPE_ARCANE_DUELIST: sScript = "prc_arcduel"; break;
|
||||
case CLASS_TYPE_ARCHIVIST: sScript = "prc_archivist"; iData |= 0x01; break;
|
||||
case CLASS_TYPE_ASSASSIN: iData |= 0x03; break;
|
||||
case CLASS_TYPE_BAELNORN: sScript = "prc_baelnorn"; break;
|
||||
case CLASS_TYPE_ASSASSIN: break;
|
||||
//case CLASS_TYPE_BAELNORN: sScript = "prc_baelnorn"; break;
|
||||
case CLASS_TYPE_BARD: iData |= 0x07; break;
|
||||
case CLASS_TYPE_BATTLESMITH: sScript = "prc_battlesmith"; break;
|
||||
case CLASS_TYPE_BEGUILER: iData |= 0x03; break;
|
||||
@@ -121,7 +121,7 @@ void SetupCharacterData(object oPC)
|
||||
case CLASS_TYPE_BLIGHTLORD: sScript = "prc_blightlord"; break;
|
||||
case CLASS_TYPE_BLOODCLAW_MASTER: sScript = "tob_bloodclaw"; break;
|
||||
case CLASS_TYPE_BONDED_SUMMONNER: sScript = "prc_bondedsumm"; break;
|
||||
case CLASS_TYPE_CELEBRANT_SHARESS: iData |= 0x03; break;
|
||||
case CLASS_TYPE_CELEBRANT_SHARESS: iData |= 0x07; break;
|
||||
case CLASS_TYPE_CHILD_OF_NIGHT: sScript = "shd_childnight"; break;
|
||||
case CLASS_TYPE_COC: sScript = "prc_coc"; break;
|
||||
case CLASS_TYPE_COMBAT_MEDIC: sScript = "prc_cbtmed"; break;
|
||||
@@ -180,6 +180,7 @@ void SetupCharacterData(object oPC)
|
||||
case CLASS_TYPE_LASHER: sScript = "prc_lasher"; break;
|
||||
case CLASS_TYPE_LEGENDARY_DREADNOUGHT: sScript = "prc_legendread"; break;
|
||||
case CLASS_TYPE_LICH: sScript = "pnp_lich_level"; break;
|
||||
case CLASS_TYPE_LION_OF_TALISID: sScript = "prc_lot"; break;
|
||||
case CLASS_TYPE_MAGEKILLER: sScript = "prc_magekill"; break;
|
||||
case CLASS_TYPE_MASTER_HARPER: sScript = "prc_masterh"; break;
|
||||
case CLASS_TYPE_MASTER_OF_NINE: sScript = "tob_masterofnine"; break;
|
||||
@@ -245,6 +246,7 @@ void SetupCharacterData(object oPC)
|
||||
case CLASS_TYPE_TOTEM_RAGER: sScript = "moi_totemrager"; break;
|
||||
case CLASS_TYPE_TRUENAMER: sScript = "true_truenamer"; iData |= 0x01; break;
|
||||
case CLASS_TYPE_VASSAL: sScript = "prc_vassal"; break;
|
||||
case CLASS_TYPE_VERDANT_LORD: sScript = "prc_verdantlord"; break;
|
||||
case CLASS_TYPE_VIGILANT: sScript = "prc_vigilant"; break;
|
||||
case CLASS_TYPE_WARBLADE: sScript = "tob_warblade"; iData |= 0x01; break;
|
||||
case CLASS_TYPE_WARCHIEF: sScript = "prc_warchief"; break;
|
||||
@@ -429,7 +431,7 @@ void EvalPRCFeats(object oPC)
|
||||
ExecuteScript("moi_events", oPC);
|
||||
|
||||
if (GetIsBinder(oPC))
|
||||
ExecuteScript("bnd_events", oPC);
|
||||
ExecuteScript("bnd_events", oPC);
|
||||
|
||||
// check if character with crafting feat has appropriate base item in her inventory
|
||||
// x - moved from prc_onhb_indiv.nss
|
||||
@@ -2264,6 +2266,8 @@ void FeatSpecialUsePerDay(object oPC)
|
||||
FeatUsePerDay(oPC, FEAT_FM_FOREST_DOMINION, ABILITY_CHARISMA, 3);
|
||||
FeatUsePerDay(oPC, FEAT_SOD_DEATH_TOUCH, -1, (GetLevelByClass(CLASS_TYPE_SLAYER_OF_DOMIEL, oPC)+4)/4);
|
||||
FeatUsePerDay(oPC, FEAT_SUEL_DISPELLING_STRIKE, -1, (GetLevelByClass(CLASS_TYPE_SUEL_ARCHANAMACH, oPC) + 2) / 4);
|
||||
FeatUsePerDay(oPC, FEAT_PLANT_CONTROL, ABILITY_CHARISMA, 3);
|
||||
FeatUsePerDay(oPC, FEAT_PLANT_DEFIANCE, ABILITY_CHARISMA, 3);
|
||||
FeatDiabolist(oPC);
|
||||
FeatAlaghar(oPC);
|
||||
ShadowShieldUses(oPC);
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#include "prc_feat_const"
|
||||
#include "inc_item_props"
|
||||
#include "prc_inc_spells"
|
||||
|
||||
const string BRUTAL_STRIKE_MODE_VAR = "PRC_BRUTAL_STRIKE_MODE";
|
||||
|
||||
|
||||
@@ -36,6 +36,8 @@ void CheckForPnPHolyAvenger(object oItem);
|
||||
|
||||
#include "inc_utility"
|
||||
#include "prc_inc_newip"
|
||||
#include "prc_inc_castlvl"
|
||||
#include "inc_newspellbook"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
1993
src/include/prc_inc_json.nss
Normal file
1993
src/include/prc_inc_json.nss
Normal file
File diff suppressed because it is too large
Load Diff
@@ -16,26 +16,28 @@ const int MATERIAL_TYPE_UNKNOWN = 0;
|
||||
const int MATERIAL_TYPE_BONE = 1;
|
||||
const int MATERIAL_TYPE_CERAMIC = 2;
|
||||
const int MATERIAL_TYPE_CRYSTAL = 3;
|
||||
const int MATERIAL_TYPE_FABRIC = 4;
|
||||
const int MATERIAL_TYPE_FIBER = 4;
|
||||
const int MATERIAL_TYPE_LEATHER = 5;
|
||||
const int MATERIAL_TYPE_METAL = 6;
|
||||
const int MATERIAL_TYPE_PAPER = 7;
|
||||
const int MATERIAL_TYPE_ROPE = 8;
|
||||
const int MATERIAL_TYPE_STONE = 9;
|
||||
const int MATERIAL_TYPE_WOOD = 10;
|
||||
const int MATERIAL_TYPE_BOTANICAL = 11;
|
||||
|
||||
const string MATERIAL_TYPE_NAME_INVALID = "";
|
||||
const string MATERIAL_TYPE_NAME_UNKNOWN = "Unknown";
|
||||
const string MATERIAL_TYPE_NAME_BONE = "Bone";
|
||||
const string MATERIAL_TYPE_NAME_CERAMIC = "Ceramic";
|
||||
const string MATERIAL_TYPE_NAME_CRYSTAL = "Crystal";
|
||||
const string MATERIAL_TYPE_NAME_FABRIC = "Fabric";
|
||||
const string MATERIAL_TYPE_NAME_FIBER = "Fiber";
|
||||
const string MATERIAL_TYPE_NAME_LEATHER = "Leather";
|
||||
const string MATERIAL_TYPE_NAME_METAL = "Metal";
|
||||
const string MATERIAL_TYPE_NAME_PAPER = "Paper";
|
||||
const string MATERIAL_TYPE_NAME_ROPE = "Rope";
|
||||
const string MATERIAL_TYPE_NAME_STONE = "Stone";
|
||||
const string MATERIAL_TYPE_NAME_WOOD = "Wood";
|
||||
const string MATERIAL_TYPE_NAME_BOTANICAL = "Bontanical";
|
||||
|
||||
//:: Material Itemproperty Constants
|
||||
//::////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -163,7 +165,8 @@ const int IP_MATERIAL_OBSIDIAN = 140;
|
||||
const int IP_MATERIAL_BAMBOO = 141;
|
||||
const int IP_MATERIAL_POTTERY = 142;
|
||||
const int IP_MATERIAL_GLASSTEEL = 143;
|
||||
const int IP_NUM_MATERIALS = 143;
|
||||
const int IP_MATERIAL_HERB = 144;
|
||||
const int IP_NUM_MATERIALS = 144;
|
||||
|
||||
const string IP_MATERIAL_NAME_INVALID = "";
|
||||
const string IP_MATERIAL_NAME_UNKNOWN = "Unknown";
|
||||
@@ -288,6 +291,7 @@ const string IP_MATERIAL_NAME_OBSIDIAN = "Obsidian";
|
||||
const string IP_MATERIAL_NAME_BAMBOO = "Bamboo";
|
||||
const string IP_MATERIAL_NAME_POTTERY = "Pottery";
|
||||
const string IP_MATERIAL_NAME_GLASSTEEL = "Glassteel";
|
||||
const string IP_MATERIAL_NAME_HERB = "Herbs";
|
||||
|
||||
//::///////////////////////////////////////////////////////////////
|
||||
// GetMaterialName( int iMaterialType, int bLowerCase = FALSE)
|
||||
@@ -426,8 +430,9 @@ string GetMaterialName( int iMaterialType, int bLowerCase = FALSE)
|
||||
case IP_MATERIAL_ROPE_GIANT_HAIR: sName = IP_MATERIAL_NAME_ROPE_GIANT_HAIR; break;
|
||||
case IP_MATERIAL_OBSIDIAN: sName = IP_MATERIAL_NAME_OBSIDIAN; break;
|
||||
case IP_MATERIAL_BAMBOO: sName = IP_MATERIAL_NAME_BAMBOO; break;
|
||||
case IP_MATERIAL_POTTERY: sName = IP_MATERIAL_NAME_POTTERY; break;
|
||||
case IP_MATERIAL_GLASSTEEL: sName = IP_MATERIAL_NAME_GLASSTEEL; break;
|
||||
case IP_MATERIAL_POTTERY: sName = IP_MATERIAL_NAME_POTTERY; break;
|
||||
case IP_MATERIAL_GLASSTEEL: sName = IP_MATERIAL_NAME_GLASSTEEL; break;
|
||||
case IP_MATERIAL_HERB: sName = IP_MATERIAL_NAME_HERB; break;
|
||||
|
||||
default: return "";
|
||||
}
|
||||
@@ -573,6 +578,7 @@ int GetIPMaterial( string sMaterialName)
|
||||
else if( sMaterialName == GetStringUpperCase(IP_MATERIAL_NAME_BAMBOO)) return IP_MATERIAL_BAMBOO;
|
||||
else if( sMaterialName == GetStringUpperCase(IP_MATERIAL_NAME_POTTERY)) return IP_MATERIAL_POTTERY;
|
||||
else if( sMaterialName == GetStringUpperCase(IP_MATERIAL_NAME_GLASSTEEL)) return IP_MATERIAL_GLASSTEEL;
|
||||
else if( sMaterialName == GetStringUpperCase(IP_MATERIAL_NAME_HERB)) return IP_MATERIAL_HERB;
|
||||
|
||||
return IP_MATERIAL_INVALID;
|
||||
}
|
||||
@@ -806,6 +812,9 @@ int GetMaterialType(int nMaterial)
|
||||
|| nMaterial == IP_MATERIAL_DRAKE_IVORY )
|
||||
return MATERIAL_TYPE_BONE;
|
||||
|
||||
else if ( nMaterial == IP_MATERIAL_HERB )
|
||||
return MATERIAL_TYPE_BOTANICAL;
|
||||
|
||||
else if ( nMaterial == IP_MATERIAL_ELUKIAN_CLAY
|
||||
|| nMaterial == IP_MATERIAL_POTTERY )
|
||||
return MATERIAL_TYPE_CERAMIC;
|
||||
@@ -814,7 +823,7 @@ int GetMaterialType(int nMaterial)
|
||||
|| nMaterial == IP_MATERIAL_COTTON
|
||||
|| nMaterial == IP_MATERIAL_SILK
|
||||
|| nMaterial == IP_MATERIAL_WOOL )
|
||||
return MATERIAL_TYPE_FABRIC;
|
||||
return MATERIAL_TYPE_FIBER;
|
||||
|
||||
else if ( nMaterial == IP_MATERIAL_GEM
|
||||
|| nMaterial == IP_MATERIAL_GEM_ALEXANDRITE
|
||||
|
||||
@@ -1,9 +1,68 @@
|
||||
//:: prc_inc_nat_hb
|
||||
//::
|
||||
//:: void main(){}
|
||||
|
||||
|
||||
void DoNaturalWeaponHB(object oPC = OBJECT_SELF);
|
||||
|
||||
#include "prc_inc_combat"
|
||||
#include "prc_inc_template"
|
||||
|
||||
object GetProperTarget(object oPC, object oTarget)
|
||||
/**
|
||||
* Finds a valid enemy target in melee range when the original target is invalid.
|
||||
* Now includes input validation, LOS checks, configurable radius, and target priority.
|
||||
*
|
||||
* @param oPC The creature seeking a new target
|
||||
* @param oTarget The original (invalid) target
|
||||
* @param fRadius Search radius in meters (optional, defaults to melee range)
|
||||
* @return A valid enemy target or OBJECT_INVALID if none found
|
||||
*/
|
||||
object GetProperTarget(object oPC, object oTarget, float fRadius = MELEE_RANGE_METERS)
|
||||
{
|
||||
// Input validation
|
||||
if(!GetIsObjectValid(oPC))
|
||||
{
|
||||
DoDebug("GetProperTarget(): Invalid oPC parameter");
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
|
||||
// Use target list system for better target selection
|
||||
PurgeTargetList(oPC);
|
||||
|
||||
location lPC = GetLocation(oPC);
|
||||
object oTest = MyFirstObjectInShape(SHAPE_SPHERE, fRadius, lPC, TRUE, OBJECT_TYPE_CREATURE);
|
||||
|
||||
while(GetIsObjectValid(oTest))
|
||||
{
|
||||
// Basic validation checks
|
||||
if(oTest != oPC && // Not self
|
||||
GetIsEnemy(oPC, oTest) && // Is enemy
|
||||
GetIsInMeleeRange(oPC, oTest) && // In melee range
|
||||
!GetIsDead(oTest) && // Is alive
|
||||
LineOfSightObject(oPC, oTest)) // Has line of sight
|
||||
{
|
||||
// Add to target list with priority based on distance (nearest first)
|
||||
AddToTargetList(oTest, oPC, INSERTION_BIAS_DISTANCE, FALSE);
|
||||
}
|
||||
|
||||
oTest = MyNextObjectInShape(SHAPE_SPHERE, fRadius, lPC, TRUE, OBJECT_TYPE_CREATURE);
|
||||
}
|
||||
|
||||
// Get the highest priority target (nearest enemy)
|
||||
object oBestTarget = GetTargetListHead(oPC);
|
||||
PurgeTargetList(oPC);
|
||||
|
||||
if(GetIsObjectValid(oBestTarget))
|
||||
{
|
||||
DoDebug("GetProperTarget(): Selected target " + GetName(oBestTarget) +
|
||||
" for " + GetName(oPC));
|
||||
return oBestTarget;
|
||||
}
|
||||
|
||||
// No valid target found
|
||||
DoDebug("GetProperTarget(): No valid target found for " + GetName(oPC));
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
/* object GetProperTarget(object oPC, object oTarget)
|
||||
{
|
||||
location lTarget = GetLocation(oPC);
|
||||
// Use the function to get the closest creature as a target
|
||||
@@ -21,7 +80,7 @@ object GetProperTarget(object oPC, object oTarget)
|
||||
}
|
||||
|
||||
return oTarget;
|
||||
}
|
||||
} */
|
||||
|
||||
void DoNaturalAttack(object oWeapon)
|
||||
{
|
||||
@@ -289,59 +348,72 @@ void DoOverflowOnhandAttack(int nAttackMod)
|
||||
);
|
||||
}
|
||||
|
||||
void DoNaturalWeaponHB(object oPC = OBJECT_SELF)
|
||||
/* void DoNaturalWeaponHB(object oPC = OBJECT_SELF)
|
||||
{
|
||||
//not in combat, abort
|
||||
if(!GetIsInCombat(oPC))
|
||||
return;
|
||||
|
||||
// if(DEBUG) DoDebug("entered DoNaturalWeaponHB");
|
||||
if(DEBUG) DoDebug("prc_inc_nat_hb: entered DoNaturalWeaponHB");
|
||||
|
||||
float fDelay = 0.1 + IntToFloat(Random(10))/100.0;
|
||||
|
||||
//no natural weapons, abort
|
||||
//in a different form, abort for now fix it later
|
||||
if(array_exists(oPC, ARRAY_NAT_SEC_WEAP_RESREF)
|
||||
&& !GetIsPolyMorphedOrShifted(oPC))
|
||||
if(array_exists(oPC, ARRAY_NAT_SEC_WEAP_RESREF)
|
||||
&& !GetIsPolyMorphedOrShifted(oPC))
|
||||
{
|
||||
DoDebug("prc_inc_nat_hb >> DoNaturalWeaponHB: creature has natural secondary weapons");
|
||||
UpdateSecondaryWeaponSizes(oPC);
|
||||
int i;
|
||||
while(i < array_get_size(oPC, ARRAY_NAT_SEC_WEAP_RESREF))
|
||||
{
|
||||
// DoDebug("DoNaturalWeaponHB: creature has natural secondary weapons");
|
||||
UpdateSecondaryWeaponSizes(oPC);
|
||||
int i;
|
||||
while(i < array_get_size(oPC, ARRAY_NAT_SEC_WEAP_RESREF))
|
||||
string sResRef = array_get_string(oPC, ARRAY_NAT_SEC_WEAP_RESREF, i);
|
||||
if(sResRef != "")
|
||||
{
|
||||
//get the resref to use
|
||||
string sResRef = array_get_string(oPC, ARRAY_NAT_SEC_WEAP_RESREF, i);
|
||||
//if null, move to next
|
||||
if(sResRef != "")
|
||||
// Get stored weapon object, or create if doesn't exist
|
||||
object oWeapon = GetLocalObject(oPC, "NAT_SEC_WEAP_" + sResRef);
|
||||
|
||||
if(!GetIsObjectValid(oWeapon))
|
||||
{
|
||||
//get the created item
|
||||
object oWeapon = GetObjectByTag(sResRef);
|
||||
DoDebug("prc_inc_nat_hb >> DoNaturalWeaponHB: creating and storing creature weapon " + sResRef);
|
||||
oWeapon = CreateItemOnObject(sResRef, oPC);
|
||||
|
||||
if(!GetIsObjectValid(oWeapon))
|
||||
{
|
||||
object oLimbo = GetObjectByTag("HEARTOFCHAOS");
|
||||
location lLimbo = GetLocation(oLimbo);
|
||||
if(!GetIsObjectValid(oLimbo))
|
||||
lLimbo = GetStartingLocation();
|
||||
oWeapon = CreateObject(OBJECT_TYPE_ITEM, sResRef, lLimbo);
|
||||
DoDebug("prc_inc_nat_hb >> DoNaturalWeaponHB: ERROR - CreateItemOnObject FAILED for " + sResRef);
|
||||
}
|
||||
else
|
||||
{
|
||||
DoDebug("prc_inc_nat_hb >> DoNaturalWeaponHB: SUCCESS - weapon created, tag=" + GetTag(oWeapon) + ", name=" + GetName(oWeapon));
|
||||
SetIdentified(oWeapon, TRUE);
|
||||
SetLocalObject(oPC, "NAT_SEC_WEAP_" + sResRef, oWeapon);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DoDebug("prc_inc_nat_hb >> DoNaturalWeaponHB: using stored creature weapon object");
|
||||
}
|
||||
|
||||
// DoDebug(COLOR_WHITE + "DoNaturalWeaponHB: scheduling a secondary natural attack with "+GetName(oWeapon)+" at delay "+FloatToString(fDelay));
|
||||
//do the attack within a delay
|
||||
/*
|
||||
// motu99: commented this out; AssignCommand ist not needed, because OBJECT_SELF is oPC - using AssignCommand will only degrade performance
|
||||
AssignCommand(oPC, DelayCommand(fDelay, DoNaturalAttack(oWeapon)));
|
||||
*/
|
||||
|
||||
// Double-check validity before scheduling
|
||||
if(GetIsObjectValid(oWeapon))
|
||||
{
|
||||
DoDebug("prc_inc_nat_hb >> DoNaturalWeaponHB: scheduling a secondary natural attack with "+GetName(oWeapon)+" at delay "+FloatToString(fDelay));
|
||||
DelayCommand(fDelay, DoNaturalAttack(oWeapon));
|
||||
|
||||
//calculate the delay to use next time
|
||||
fDelay += 2.05;
|
||||
if(fDelay > 6.0)
|
||||
fDelay -= 6.0;
|
||||
fDelay -= 6.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
DoDebug("prc_inc_nat_hb >> DoNaturalWeaponHB: ERROR - weapon object is INVALID, cannot schedule attack");
|
||||
}
|
||||
i++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int iMod = 5; // motu99: added check for monk weapon
|
||||
if(GetHasMonkWeaponEquipped(oPC)) iMod = 3;
|
||||
@@ -357,10 +429,10 @@ void DoNaturalWeaponHB(object oPC = OBJECT_SELF)
|
||||
for(i = 0; i < nOverflowAttackCount; i++)
|
||||
{
|
||||
// DoDebug(COLOR_WHITE + "DoNaturalWeaponHB(): scheduling a scripted overflow attack with attack mod "+IntToString(nAttackPenalty)+" at delay "+FloatToString(fDelay));
|
||||
/*
|
||||
|
||||
// motu99: see comment above why this is commented out
|
||||
AssignCommand(oPC, DelayCommand(fDelay, DoOverflowOnhandAttack(nAttackPenalty)));
|
||||
*/
|
||||
//AssignCommand(oPC, DelayCommand(fDelay, DoOverflowOnhandAttack(nAttackPenalty)));
|
||||
|
||||
DelayCommand(fDelay, DoOverflowOnhandAttack(nAttackPenalty));
|
||||
|
||||
//calculate the delay to use
|
||||
@@ -399,6 +471,128 @@ void DoNaturalWeaponHB(object oPC = OBJECT_SELF)
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
void DoNaturalWeaponHB(object oPC = OBJECT_SELF)
|
||||
{
|
||||
//not in combat, abort
|
||||
if(!GetIsInCombat(oPC))
|
||||
return;
|
||||
|
||||
if(DEBUG) DoDebug("prc_inc_nat_hb: entered DoNaturalWeaponHB");
|
||||
|
||||
float fDelay = 0.1 + IntToFloat(Random(10))/100.0;
|
||||
|
||||
//no natural weapons, abort
|
||||
//in a different form, abort for now fix it later
|
||||
if(array_exists(oPC, ARRAY_NAT_SEC_WEAP_RESREF)
|
||||
&& !GetIsPolyMorphedOrShifted(oPC))
|
||||
{
|
||||
DoDebug("prc_inc_nat_hb >> DoNaturalWeaponHB: creature has natural secondary weapons");
|
||||
UpdateSecondaryWeaponSizes(oPC);
|
||||
int i;
|
||||
while(i < array_get_size(oPC, ARRAY_NAT_SEC_WEAP_RESREF))
|
||||
{
|
||||
//get the resref to use
|
||||
string sResRef = array_get_string(oPC, ARRAY_NAT_SEC_WEAP_RESREF, i);
|
||||
//if null, move to next
|
||||
if(sResRef != "")
|
||||
{
|
||||
//get the created item
|
||||
object oWeapon = GetObjectByTag(sResRef);
|
||||
if(!GetIsObjectValid(oWeapon))
|
||||
{
|
||||
object oLimbo = GetObjectByTag("HEARTOFCHAOS");
|
||||
location lLimbo = GetLocation(oLimbo);
|
||||
if(!GetIsObjectValid(oLimbo))
|
||||
lLimbo = GetStartingLocation();
|
||||
oWeapon = CreateObject(OBJECT_TYPE_ITEM, sResRef, lLimbo);
|
||||
DoDebug(PRC_TEXT_WHITE + "prc_inc_nat_hb >> DoNaturalWeaponHB: creature weapon object found!!!");
|
||||
}
|
||||
|
||||
// Check for enhancements after creating the weapon object
|
||||
int nEnhance = GetLocalInt(oPC, "PRC_NAT_WEAPON_ENHANCE");
|
||||
if(nEnhance > 0)
|
||||
{
|
||||
|
||||
DoDebug(PRC_TEXT_WHITE + "prc_inc_nat_hb >> DoNaturalWeaponHB: Applying enhancement.");
|
||||
float fDuration = GetLocalFloat(oPC, "PRC_NAT_WEAPON_ENH_DUR");
|
||||
IPSafeAddItemProperty(oWeapon, ItemPropertyEnhancementBonus(nEnhance), fDuration, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, TRUE);
|
||||
}
|
||||
|
||||
if(DEBUG) DoDebug("prc_inc_nat_hb >> DoNaturalWeaponHB: scheduling a secondary natural attack with "+GetName(oWeapon)+" at delay "+FloatToString(fDelay));
|
||||
//do the attack within a delay
|
||||
// motu99: commented this out; AssignCommand ist not needed, because OBJECT_SELF is oPC - using AssignCommand will only degrade performance
|
||||
//AssignCommand(oPC, DelayCommand(fDelay, DoNaturalAttack(oWeapon)));
|
||||
|
||||
DelayCommand(fDelay, DoNaturalAttack(oWeapon));
|
||||
|
||||
//calculate the delay to use next time
|
||||
fDelay += 2.05;
|
||||
if(fDelay > 6.0)
|
||||
fDelay -= 6.0;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
int iMod = 5; // motu99: added check for monk weapon
|
||||
if(GetHasMonkWeaponEquipped(oPC)) iMod = 3;
|
||||
|
||||
// check for overflow (main hand) attacks
|
||||
int nOverflowAttackCount = GetLocalInt(oPC, "OverflowBaseAttackCount");
|
||||
if(nOverflowAttackCount)
|
||||
{
|
||||
int i;
|
||||
// the first overflow attack would be the seventh main hand attack, at an AB of -30
|
||||
int nAttackPenalty = -6 * iMod; // -30 for normal bab, -18 for monks
|
||||
// DoDebug("DoNaturalWeaponHB(): number of scripted overflow attacks: "+IntToString(nOverflowAttackCount));
|
||||
for(i = 0; i < nOverflowAttackCount; i++)
|
||||
{
|
||||
// DoDebug(COLOR_WHITE + "DoNaturalWeaponHB(): scheduling a scripted overflow attack with attack mod "+IntToString(nAttackPenalty)+" at delay "+FloatToString(fDelay));
|
||||
|
||||
// motu99: see comment above why this is commented out
|
||||
// AssignCommand(oPC, DelayCommand(fDelay, DoOverflowOnhandAttack(nAttackPenalty)));
|
||||
|
||||
DelayCommand(fDelay, DoOverflowOnhandAttack(nAttackPenalty));
|
||||
|
||||
//calculate the delay to use
|
||||
fDelay += 2.05;
|
||||
if(fDelay > 6.0)
|
||||
fDelay -= 6.0;
|
||||
//calculate new attack penalty
|
||||
nAttackPenalty -= iMod; // motu99: usually -5, for monks -3 (unarmed or kama)
|
||||
}
|
||||
}
|
||||
|
||||
// motu99: this is only here for debugging in order to test PerformAttackRound()
|
||||
// must be deleted after debugging!!!
|
||||
//if (GetPRCSwitch(PRC_PNP_TRUESEEING)) DelayCommand(0.01, DoOffhandAttackRound());
|
||||
|
||||
|
||||
// check for overflow offhand attacks
|
||||
int nOffhandAttackCount = GetLocalInt(oPC, "OffhandOverflowAttackCount");
|
||||
// if (DEBUG) DoDebug("DoNaturalWeaponHB: number of scripted offhand attacks = "+IntToString(nOffhandAttackCount));
|
||||
if(nOffhandAttackCount)
|
||||
{
|
||||
int i;
|
||||
int nAttackPenalty = -2 * iMod; // offhand attacks always come at -5 per additional attack (but for monks we assume -3)
|
||||
for(i = 0; i < nOffhandAttackCount; i++)
|
||||
{
|
||||
// DoDebug(COLOR_WHITE + "DoNaturalWeaponHB(): scheduling a scripted offhand attack with attack mod "+IntToString(nAttackPenalty)+" at delay "+FloatToString(fDelay));
|
||||
|
||||
DelayCommand(fDelay, DoOffhandAttack(nAttackPenalty));
|
||||
|
||||
//calculate the delay to use
|
||||
fDelay += 2.05;
|
||||
if(fDelay > 6.0)
|
||||
fDelay -= 6.0;
|
||||
//calculate new attack penalty
|
||||
nAttackPenalty -= iMod;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* motu99's test functions. Not actually used by PRC scripts
|
||||
|
||||
@@ -277,6 +277,32 @@ void ClearNaturalWeapons(object oPC)
|
||||
array_delete(oPC, ARRAY_NAT_PRI_WEAP_ATTACKS);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds a natural primary weapon to a creature (PC/NPC).
|
||||
*
|
||||
* This function manages a creature's natural primary weapons by storing their
|
||||
* resource references and attack counts in persistent arrays. If the weapon
|
||||
* being added is the first natural weapon, it may automatically become the
|
||||
* creature's active primary natural weapon, unless the creature is a Monk or
|
||||
* Brawler. Optionally, the weapon can be forced to become the active primary
|
||||
* weapon regardless of class.
|
||||
*
|
||||
* @param oPC The creature object to which the natural weapon will be added.
|
||||
* @param sResRef The resource reference string of the natural weapon.
|
||||
* @param nCount (Optional) The number of attacks this natural weapon provides.
|
||||
* Default is 1.
|
||||
* @param nForceUse (Optional) If TRUE, forces this weapon to become the active
|
||||
* primary natural weapon regardless of the creature's class.
|
||||
* Default is FALSE.
|
||||
*
|
||||
* @details
|
||||
* - Creates persistent arrays for weapon references and attack counts if they
|
||||
* do not already exist.
|
||||
* - Checks if the weapon is already present to avoid duplicates.
|
||||
* - Adds the weapon and attack count to the arrays.
|
||||
* - Sets the primary natural weapon index to this weapon if it is the first
|
||||
* natural weapon added, unless the creature is a Monk or Brawler.
|
||||
*/
|
||||
void AddNaturalPrimaryWeapon(object oPC, string sResRef, int nCount = 1, int nForceUse = FALSE)
|
||||
{
|
||||
int nFirstNaturalWeapon = FALSE;
|
||||
|
||||
@@ -572,7 +572,10 @@ int GetMaxEssentiaCapacity(object oMeldshaper, int nClass, int nMeld)
|
||||
{
|
||||
int nMax = 1; // Always can invest one
|
||||
int nHD = GetHitDice(oMeldshaper);
|
||||
if (nHD >= 31) nMax = 5;
|
||||
if (nHD >= 61) nMax = 8;
|
||||
else if (nHD >= 51) nMax = 7;
|
||||
else if (nHD >= 41) nMax = 6;
|
||||
else if (nHD >= 31) nMax = 5;
|
||||
else if (nHD >= 18) nMax = 4;
|
||||
else if (nHD >= 12) nMax = 3;
|
||||
else if (nHD >= 6) nMax = 2;
|
||||
|
||||
@@ -808,7 +808,24 @@ int GetIsOnHitCastSpell(object oSpellTarget = OBJECT_INVALID, object oSpellCastI
|
||||
if (DEBUG) DoDebug("GetIsOnHitCastSpell: item "+GetName(oSpellCastItem)+" is armor; attacker = "+GetName(oAttacker)+", defender = "+GetName(oDefender));
|
||||
}
|
||||
// is the spell type item a weapon?
|
||||
else if (iWeaponType == StringToInt(Get2DACache("baseitems", "WeaponType", iBaseType)))
|
||||
int nWT = StringToInt(Get2DACache("baseitems", "WeaponType", iBaseType));
|
||||
if (nWT > 0)
|
||||
{
|
||||
if (oSpellTarget == OBJECT_INVALID)
|
||||
oSpellTarget = PRCGetSpellTargetObject(oSpellOrigin);
|
||||
|
||||
oAttacker = oSpellOrigin;
|
||||
oDefender = oSpellTarget;
|
||||
|
||||
if (DEBUG) DoDebug("GetIsOnHitCastSpell: item "+GetName(oSpellCastItem)+" is weapon [WT="+IntToString(nWT)+"]; attacker="+GetName(oAttacker)+", defender="+GetName(oDefender));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DEBUG) DoDebug("GetIsOnHitCastSpell: item "+GetName(oSpellCastItem)+" is neither weapon nor armor; returning FALSE");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* else if (iWeaponType == StringToInt(Get2DACache("baseitems", "WeaponType", iBaseType)))
|
||||
{
|
||||
// determine the target, if not already given
|
||||
if (oSpellTarget == OBJECT_INVALID)
|
||||
@@ -823,7 +840,7 @@ int GetIsOnHitCastSpell(object oSpellTarget = OBJECT_INVALID, object oSpellCastI
|
||||
{
|
||||
if (DEBUG) DoDebug("GetIsOnHitCastSpell: item "+GetName(oSpellCastItem)+" is neither weapon nor armor; returning FALSE");
|
||||
return FALSE;
|
||||
}
|
||||
} */
|
||||
|
||||
|
||||
// the spell origin must possess the item that cast the spell (at least for the aurora engine, in prc_inc_combat that may differ)
|
||||
|
||||
@@ -1370,7 +1370,9 @@ void _prc_inc_shifting_ShiftIntoTemplateAux(object oShifter, int nShifterType, o
|
||||
if(GetIsObjectValid(oShifterCWpR)) MyDestroyObject(oShifterCWpR);
|
||||
if(GetIsObjectValid(oShifterCWpL)) MyDestroyObject(oShifterCWpL);
|
||||
if(GetIsObjectValid(oShifterCWpB)) MyDestroyObject(oShifterCWpB);
|
||||
oShifterCWpR = oShifterCWpL = oShifterCWpR = OBJECT_INVALID;
|
||||
oShifterCWpR = OBJECT_INVALID;
|
||||
oShifterCWpL = OBJECT_INVALID;
|
||||
oShifterCWpB = OBJECT_INVALID;
|
||||
|
||||
// Copy the template's weapons and assign equipping
|
||||
|
||||
|
||||
154
src/include/prc_inc_size.nss
Normal file
154
src/include/prc_inc_size.nss
Normal file
@@ -0,0 +1,154 @@
|
||||
#include "prc_inc_util"
|
||||
#include "prc_inc_spells"
|
||||
#include "prc_inc_function"
|
||||
|
||||
// Wrapper function for delayed visual transform with generation tracking
|
||||
void DelayedSetVisualTransform(int nExpectedGeneration, object oTarget, int nTransform, float fValue)
|
||||
{
|
||||
// Read current generation at execution time, not when scheduled
|
||||
if (nExpectedGeneration != GetLocalInt(oTarget, "PRC_SIZE_GENERATION"))
|
||||
{
|
||||
// Generation has changed, don't apply the transform
|
||||
return;
|
||||
}
|
||||
SetObjectVisualTransform(oTarget, nTransform, fValue);
|
||||
}
|
||||
|
||||
// Main wrapper function that handles generation tracking
|
||||
void DelaySetVisualTransform(float fDelay, object oTarget, string sGenerationName, int nTransform, float fValue)
|
||||
{
|
||||
int nExpectedGeneration = GetLocalInt(oTarget, sGenerationName);
|
||||
DelayCommand(fDelay, DelayedSetVisualTransform(nExpectedGeneration, oTarget, nTransform, fValue));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a size change effect that can enlarge or reduce a creature
|
||||
*
|
||||
* @param oTarget Object to affect
|
||||
* @param nObjectType Object type filter (OBJECT_TYPE_CREATURE, etc.)
|
||||
* @param bEnlarge TRUE to enlarge, FALSE to reduce
|
||||
* @param nChanges Number of size categories to change (0 = reset to original)
|
||||
* @return The size change effect
|
||||
*/
|
||||
|
||||
effect EffectSizeChange(object oTarget, int nObjectType, int bEnlarge, int nChanges)
|
||||
{
|
||||
effect eBlank;
|
||||
|
||||
// Increment generation for any size change
|
||||
int nGeneration = PRC_NextGeneration(GetLocalInt(oTarget, "PRC_SIZE_GENERATION"));
|
||||
SetLocalInt(oTarget, "PRC_SIZE_GENERATION", nGeneration);
|
||||
|
||||
// Store original size if not already stored - READ ACTUAL CURRENT SCALE
|
||||
if(GetLocalFloat(oTarget, "PRC_ORIGINAL_SIZE") == 0.0f)
|
||||
{
|
||||
float fCurrentScale = GetObjectVisualTransform(oTarget, OBJECT_VISUAL_TRANSFORM_SCALE);
|
||||
SetLocalFloat(oTarget, "PRC_ORIGINAL_SIZE", fCurrentScale);
|
||||
}
|
||||
|
||||
// Reset to original size
|
||||
if(nChanges == 0)
|
||||
{
|
||||
float fOriginalSize = GetLocalFloat(oTarget, "PRC_ORIGINAL_SIZE");
|
||||
DelaySetVisualTransform(0.0f, oTarget, "PRC_SIZE_GENERATION", OBJECT_VISUAL_TRANSFORM_SCALE, fOriginalSize);
|
||||
// DON'T delete PRC_ORIGINAL_SIZE here - keep it for future casts
|
||||
return eBlank;
|
||||
}
|
||||
|
||||
// Get the original scale
|
||||
float fOriginalScale = GetLocalFloat(oTarget, "PRC_ORIGINAL_SIZE");
|
||||
|
||||
// Calculate scale factor relative to original size
|
||||
float fScale = fOriginalScale;
|
||||
if(bEnlarge)
|
||||
fScale = fOriginalScale * pow(1.5f, IntToFloat(nChanges));
|
||||
else
|
||||
fScale = fOriginalScale * pow(0.5f, IntToFloat(nChanges));
|
||||
|
||||
// Create the effect link with sanctuary VFX
|
||||
effect eReturn = EffectLinkEffects(EffectVisualEffect(VFX_DUR_SANCTUARY),
|
||||
EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
|
||||
|
||||
if(bEnlarge)
|
||||
{
|
||||
eReturn = EffectLinkEffects(eReturn, EffectAttackDecrease(nChanges));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectAbilityDecrease(ABILITY_DEXTERITY, 2 * nChanges));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectAbilityIncrease(ABILITY_STRENGTH, 2 * nChanges));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectACDecrease(nChanges));
|
||||
eReturn = TagEffect(eReturn, "PRC_SIZE_INCREASE");
|
||||
}
|
||||
else
|
||||
{
|
||||
eReturn = EffectLinkEffects(eReturn, EffectAttackIncrease(nChanges));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectAbilityIncrease(ABILITY_DEXTERITY, 2 * nChanges));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectAbilityDecrease(ABILITY_STRENGTH, 2 * nChanges));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectACIncrease(nChanges));
|
||||
eReturn = TagEffect(eReturn, "PRC_SIZE_DECREASE");
|
||||
}
|
||||
|
||||
// Apply visual transform using wrapper
|
||||
DelaySetVisualTransform(0.0f, oTarget, "PRC_SIZE_GENERATION", OBJECT_VISUAL_TRANSFORM_SCALE, fScale);
|
||||
|
||||
return eReturn;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* effect EffectSizeChange(object oTarget, int nObjectType, int bEnlarge, int nChanges)
|
||||
{
|
||||
effect eBlank;
|
||||
|
||||
// Increment generation for any size change
|
||||
int nGeneration = PRC_NextGeneration(GetLocalInt(oTarget, "PRC_SIZE_GENERATION"));
|
||||
SetLocalInt(oTarget, "PRC_SIZE_GENERATION", nGeneration);
|
||||
|
||||
// Store original size if not already stored (fixed check)
|
||||
if(GetLocalFloat(oTarget, "PRC_ORIGINAL_SIZE") == 0.0f)
|
||||
{
|
||||
SetLocalFloat(oTarget, "PRC_ORIGINAL_SIZE", 1.0f);
|
||||
}
|
||||
|
||||
// Reset to original size
|
||||
if(nChanges == 0)
|
||||
{
|
||||
float fOriginalSize = GetLocalFloat(oTarget, "PRC_ORIGINAL_SIZE");
|
||||
DelaySetVisualTransform(0.0f, oTarget, "PRC_SIZE_GENERATION", OBJECT_VISUAL_TRANSFORM_SCALE, fOriginalSize);
|
||||
DeleteLocalFloat(oTarget, "PRC_ORIGINAL_SIZE");
|
||||
return eBlank;
|
||||
}
|
||||
|
||||
// Calculate scale factor using pow() for multi-step changes
|
||||
float fScale = 1.0f;
|
||||
if(bEnlarge)
|
||||
fScale = pow(1.5f, IntToFloat(nChanges)); // 1.5, 2.25, 3.375...
|
||||
else
|
||||
fScale = pow(0.5f, IntToFloat(nChanges)); // 0.5, 0.25, 0.125...
|
||||
|
||||
// Create the effect link based on enlarge/reduce
|
||||
effect eReturn;
|
||||
if(bEnlarge)
|
||||
{
|
||||
eReturn = EffectLinkEffects(EffectAttackDecrease(nChanges),
|
||||
EffectAbilityDecrease(ABILITY_DEXTERITY, 2 * nChanges));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectAbilityIncrease(ABILITY_STRENGTH, 2 * nChanges));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectACDecrease(nChanges));
|
||||
eReturn = TagEffect(eReturn, "PRC_SIZE_INCREASE");
|
||||
}
|
||||
else
|
||||
{
|
||||
eReturn = EffectLinkEffects(EffectAttackIncrease(nChanges),
|
||||
EffectAbilityIncrease(ABILITY_DEXTERITY, 2 * nChanges));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectAbilityDecrease(ABILITY_STRENGTH, 2 * nChanges));
|
||||
eReturn = EffectLinkEffects(eReturn, EffectACIncrease(nChanges));
|
||||
eReturn = TagEffect(eReturn, "PRC_SIZE_DECREASE");
|
||||
}
|
||||
|
||||
// Apply visual transform using wrapper
|
||||
DelaySetVisualTransform(0.0f, oTarget, "PRC_SIZE_GENERATION", OBJECT_VISUAL_TRANSFORM_SCALE, fScale);
|
||||
|
||||
return eReturn;
|
||||
}
|
||||
*/
|
||||
|
||||
//:: void main(){}
|
||||
@@ -115,11 +115,11 @@ int PerformJump(object oPC, location lLoc, int bDoKnockDown = TRUE)
|
||||
iBonus = 4;
|
||||
}
|
||||
}
|
||||
/*if (GetHasSpellEffect(MOVE_TC_LEAPING_DRAGON, oPC))
|
||||
if (GetHasSpellEffect(MOVE_TC_LEAPING_DRAGON, oPC))
|
||||
{
|
||||
bIsRunningJump = TRUE;
|
||||
iBonus = 10;
|
||||
} */
|
||||
//iBonus = 10; //:: This is granted in the stance.
|
||||
}
|
||||
// PnP rules are height * 6 for run and height * 2 for jump.
|
||||
// I can't get height so that is assumed to be 6.
|
||||
// Changed maxed jump distance because the NwN distance is rather short
|
||||
@@ -363,8 +363,11 @@ int PRCIsFlying(object oCreature)
|
||||
bFlying = TRUE;
|
||||
}
|
||||
if(!bFlying
|
||||
&& ((nWings > 0 && nWings < 79) || nWings == 90))//CEP and Project Q wing models
|
||||
bFlying = TRUE;
|
||||
&& ((nWings > 0 && nWings < 79)
|
||||
|| (nWings > 1959 && nWings < 1962)
|
||||
|| (nWings > 1962 && nWings < 1966)
|
||||
|| nWings == 90))//CEP and Project Q wing models
|
||||
bFlying = TRUE;
|
||||
|
||||
if (GetHasSpellEffect(MOVE_SH_BALANCE_SKY, oCreature))
|
||||
bFlying = TRUE;
|
||||
@@ -374,6 +377,12 @@ int PRCIsFlying(object oCreature)
|
||||
|
||||
if(GetRacialType(oCreature) == RACIAL_TYPE_GLOURA)
|
||||
bFlying = TRUE;
|
||||
|
||||
if(GetRacialType(oCreature) == RACIAL_TYPE_AVARIEL)
|
||||
bFlying = TRUE;
|
||||
|
||||
if(GetRacialType(oCreature) == RACIAL_TYPE_FEYRI)
|
||||
bFlying = TRUE;
|
||||
|
||||
if(GetRacialType(oCreature) == RACIAL_TYPE_SPIRETOPDRAGON)
|
||||
bFlying = TRUE;
|
||||
|
||||
@@ -20,6 +20,11 @@
|
||||
/* Function prototypes */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
//:: Calculates total Shield AC bonuses from all sources
|
||||
int GetTotalShieldACBonus(object oCreature);
|
||||
|
||||
//:: Handles psuedo-Foritifcation
|
||||
void DoFortification(object oPC = OBJECT_SELF, int nFortification = 25);
|
||||
|
||||
@@ -376,23 +381,53 @@ const int TYPE_DIVINE = -2;
|
||||
/* Function definitions */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Returns TRUE if nSpellID is a subradial spell, FALSE otherwise
|
||||
int GetIsSubradialSpell(int nSpellID)
|
||||
{
|
||||
string sMaster = Get2DACache("spells", "Master", nSpellID);
|
||||
|
||||
// If the Master column is numeric, this spell is a subradial of that master
|
||||
if (sMaster != "" && sMaster != "****")
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// Returns the masterspell SpellID for a subradial spell.
|
||||
int GetMasterSpellFromSubradial(int nSpellID)
|
||||
{
|
||||
string sMaster = Get2DAString("spells", "Master", nSpellID);
|
||||
|
||||
if (sMaster != "****")
|
||||
{
|
||||
return StringToInt(sMaster);
|
||||
}
|
||||
|
||||
return -1; // No master
|
||||
}
|
||||
|
||||
|
||||
|
||||
int GetPrCAdjustedClassLevel(int nClass, object oCaster = OBJECT_SELF)
|
||||
{
|
||||
int iTemp;
|
||||
// is it arcane, divine or neither?
|
||||
if(GetIsArcaneClass(nClass, oCaster) && nClass != CLASS_TYPE_SUBLIME_CHORD)
|
||||
{
|
||||
if (GetPrimaryArcaneClass(oCaster) == nClass) // adjust for any PrCs
|
||||
if (GetPrimaryArcaneClass(oCaster) == nClass) // adjust for any PrCs
|
||||
iTemp = GetArcanePRCLevels(oCaster, nClass);
|
||||
}
|
||||
else if(GetIsDivineClass(nClass, oCaster))
|
||||
{
|
||||
if (GetPrimaryDivineClass(oCaster) == nClass) // adjust for any PrCs
|
||||
iTemp = GetDivinePRCLevels(oCaster, nClass);
|
||||
if (GetPrimaryDivineClass(oCaster) == nClass) // adjust for any PrCs
|
||||
iTemp = GetDivinePRCLevels(oCaster, nClass);
|
||||
}
|
||||
else // a non-caster class or a PrC
|
||||
{
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
// add the caster class levels
|
||||
return iTemp += GetLevelByClass(nClass, oCaster);
|
||||
@@ -412,7 +447,9 @@ int GetPrCAdjustedCasterLevelByType(int nClassType, object oCaster = OBJECT_SELF
|
||||
{
|
||||
int nClassLvl;
|
||||
int nClass1, nClass2, nClass3, nClass4, nClass5, nClass6, nClass7, nClass8;
|
||||
int nClass1Lvl, nClass2Lvl, nClass3Lvl, nClass4Lvl, nClass5Lvl, nClass6Lvl, nClass7Lvl, nClass8Lvl;
|
||||
int nClass1Lvl = 0, nClass2Lvl = 0, nClass3Lvl = 0, nClass4Lvl = 0,
|
||||
nClass5Lvl = 0, nClass6Lvl = 0, nClass7Lvl = 0, nClass8Lvl = 0;
|
||||
|
||||
|
||||
nClass1 = GetClassByPosition(1, oCaster);
|
||||
nClass2 = GetClassByPosition(2, oCaster);
|
||||
@@ -974,11 +1011,16 @@ int PRCMySavingThrow(int nSavingThrow, object oTarget, int nDC, int nSaveType =
|
||||
// Plague Resistant gives a +4 bonus on disease saves
|
||||
if(GetHasFeat(FEAT_PLAGUE_RESISTANT, oTarget))
|
||||
nDC -= 4;
|
||||
// Racial +2 vs disease saves
|
||||
if(GetHasFeat(FEAT_RACE_HARDINESS_VS_DISEASE, oTarget))
|
||||
nDC -= 2;
|
||||
// +4/+2 bonus on saves against disease, done here
|
||||
if(GetLevelByClass(CLASS_TYPE_DREAD_NECROMANCER, oTarget) > 13)
|
||||
nDC -= 4;
|
||||
else if(GetLevelByClass(CLASS_TYPE_DREAD_NECROMANCER, oTarget) > 3)
|
||||
nDC -= 2;
|
||||
|
||||
|
||||
}
|
||||
else if(nSaveType == SAVING_THROW_TYPE_POISON)
|
||||
{
|
||||
@@ -2223,6 +2265,78 @@ int GetControlledCelestialTotalHD(object oPC = OBJECT_SELF)
|
||||
return nTotalHD;
|
||||
}
|
||||
|
||||
//:: Calculates total Shield AC bonuses from all sources
|
||||
int GetTotalShieldACBonus(object oCreature)
|
||||
{
|
||||
int nShieldBonus = 0;
|
||||
object oItem;
|
||||
|
||||
// Check left hand for shield
|
||||
oItem = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature);
|
||||
if (GetIsObjectValid(oItem))
|
||||
{
|
||||
int nBaseItem = GetBaseItemType(oItem);
|
||||
if (nBaseItem == BASE_ITEM_SMALLSHIELD ||
|
||||
nBaseItem == BASE_ITEM_LARGESHIELD ||
|
||||
nBaseItem == BASE_ITEM_TOWERSHIELD)
|
||||
{
|
||||
nShieldBonus += GetItemACValue(oItem);
|
||||
if(DEBUG) DoDebug("prc_inc_spells >> GetTotalShieldACBonus: Found Shield AC, bonus = " + IntToString(nShieldBonus)+".");
|
||||
}
|
||||
}
|
||||
|
||||
// Check creature weapon slots for shield AC bonus
|
||||
oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oCreature);
|
||||
if (GetIsObjectValid(oItem))
|
||||
nShieldBonus += GetItemACValue(oItem);
|
||||
|
||||
oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oCreature);
|
||||
if (GetIsObjectValid(oItem))
|
||||
nShieldBonus += GetItemACValue(oItem);
|
||||
|
||||
oItem = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oCreature);
|
||||
if (GetIsObjectValid(oItem))
|
||||
nShieldBonus += GetItemACValue(oItem);
|
||||
|
||||
// Add shield AC bonuses from magical effects
|
||||
effect eEffect = GetFirstEffect(oCreature);
|
||||
while (GetIsEffectValid(eEffect))
|
||||
{
|
||||
int nACType = GetEffectInteger(eEffect, 0);
|
||||
int nACAmount = GetEffectInteger(eEffect, 1);
|
||||
|
||||
if(GetEffectType(eEffect) == EFFECT_TYPE_AC_INCREASE && nACType == AC_SHIELD_ENCHANTMENT_BONUS)
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_inc_spells >> GetTotalShieldACBonus: Found Shield AC effect, bonus = " + IntToString(nACAmount)+".");
|
||||
nShieldBonus += nACAmount;
|
||||
}
|
||||
|
||||
eEffect = GetNextEffect(oCreature);
|
||||
}
|
||||
return nShieldBonus;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Add shield AC bonuses from magical effects
|
||||
/* effect eEffect = GetFirstEffect(oCreature);
|
||||
while (GetIsEffectValid(eEffect))
|
||||
{
|
||||
if (GetEffectType(eEffect) == EFFECT_TYPE_AC_INCREASE &&
|
||||
GetEffectInteger(eEffect, 1) == AC_SHIELD_ENCHANTMENT_BONUS)
|
||||
{
|
||||
int nMod = GetEffectInteger(eEffect, 0);
|
||||
int nType = GetEffectInteger(eEffect, 1);
|
||||
nShieldBonus += GetEffectInteger(eEffect, 0);
|
||||
string s = "Found AC effect: bonus = " + IntToString(nMod) + ", type = " + IntToString(nType);
|
||||
SendMessageToPC(GetFirstPC(), s);
|
||||
}
|
||||
eEffect = GetNextEffect(oCreature);
|
||||
}
|
||||
|
||||
return nShieldBonus;
|
||||
}*/
|
||||
//
|
||||
//:: Handles psuedo-Foritifcation
|
||||
void DoFortification(object oPC = OBJECT_SELF, int nFortification = 25)
|
||||
{
|
||||
@@ -2275,7 +2389,7 @@ void DoFortification(object oPC = OBJECT_SELF, int nFortification = 25)
|
||||
IPSafeAddItemProperty(oHide, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_BACKSTAB));
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
// wrapper for DecrementRemainingSpellUses, works for newspellbook 'fake' spells too
|
||||
// should also find and decrement metamagics for newspellbooks
|
||||
|
||||
@@ -70,11 +70,13 @@
|
||||
43 PRC_CRAFTING_BASE_ITEMS int 1
|
||||
44 PRC_XP_USE_SIMPLE_LA int 1
|
||||
45 PRC_XP_USE_SIMPLE_RACIAL_HD int 1
|
||||
46 PRC_CREATE_INFUSION_CASTER_LEVEL int 1
|
||||
47 PRC_CREATE_INFUSION_OPTIONAL_HERBS int 0
|
||||
*/
|
||||
|
||||
/* This variable MUST be updated with every new version of the PRC!!! */
|
||||
|
||||
const string PRC_VERSION = "PRC 3.9.0";
|
||||
const string PRC_VERSION = "PRC8 4.76";
|
||||
|
||||
/* This variable MUST be updated every time 'assemble_spellbooks.bat' is run!!! */
|
||||
|
||||
@@ -89,11 +91,11 @@
|
||||
* This allows material components in NWN through the materialcomp.2da
|
||||
* Just put the SpellID and UTC resref in, MINUS the .utc on the end.
|
||||
* This also requires the names of the items, formatted like so ("" included): "Object Name"
|
||||
*
|
||||
*
|
||||
* Set switch to 2 to activate this
|
||||
* Deducts gold instead of requiring material components
|
||||
* Put the gold value in the Cost column
|
||||
|
||||
|
||||
* Set switch to 3 to activate both at the same time
|
||||
* WARNING: This will slow spellcasting down due to 2da reads and inventory loops
|
||||
*/
|
||||
@@ -127,7 +129,7 @@ const string PRC_BIOWARE_NEUTRALIZE_POISON = "PRC_BIOWARE_NEUTRALIZE_P
|
||||
/** Remove the cap PRC added to this spell */
|
||||
const string PRC_BIOWARE_REMOVE_DISEASE = "PRC_BIOWARE_REMOVE_DISEASE";
|
||||
|
||||
/**
|
||||
/**
|
||||
* This replaces the 3.0 Spell Focus bonuses with the 3.5 edition ones
|
||||
*/
|
||||
const string PRC_35_SPELL_FOCUS = "PRC_35_SPELL_FOCUS";
|
||||
@@ -261,8 +263,8 @@ const string PRC_165_DEATH_IMMUNITY = "PRC_165_DEATH_IMMUNITY";
|
||||
|
||||
/*
|
||||
* PRC_ACTIVATE_MAX_SPELL_DC_CAP: activate a max cap on DC casted by creature/player
|
||||
* PRC_SET_MAX_SPELL_DC_CAP: the max value ex: 99
|
||||
*
|
||||
* PRC_SET_MAX_SPELL_DC_CAP: the max value ex: 99
|
||||
*
|
||||
*/
|
||||
const string PRC_ACTIVATE_MAX_SPELL_DC_CAP = "PRC_ACTIVATE_MAX_SPELL_DC_CAP";
|
||||
const string PRC_SET_MAX_SPELL_DC_CAP = "PRC_SET_MAX_SPELL_DC_CAP";
|
||||
@@ -289,8 +291,8 @@ const string PRC_DC_BASE_OVERRIDE = "PRC_DC_BASE_OVERRIDE";
|
||||
const string PRC_DC_ADJUSTMENT = "PRC_DC_ADJUSTMENT";
|
||||
|
||||
/*
|
||||
* By default when calculating caster level for characters with PrCs, the highest class rule will
|
||||
* be used (ie. Bard 2/Wizard 4/Elemental Savant 6 - Wizard is the highest arcane class so levels
|
||||
* By default when calculating caster level for characters with PrCs, the highest class rule will
|
||||
* be used (ie. Bard 2/Wizard 4/Elemental Savant 6 - Wizard is the highest arcane class so levels
|
||||
* form PrC will be added to that class, and the caster level will be 2 for Bard and 10 for Wizard).
|
||||
* When this is set, the first class rule will be used (with the same character caster level would
|
||||
* be 8 for Bard and 4 for Wizard).
|
||||
@@ -570,12 +572,12 @@ const string PRC_SOUL_EATER_MAX_SLAVES = "PRC_SOUL_EATER_MAX_SLAVES";
|
||||
* For the Psionic Slayer prestige class, this switch limits the Favored Enemy selection
|
||||
* to the Aberration racial type.
|
||||
*
|
||||
* This switch is provided to allow builders to more closely represent the Pen and Paper
|
||||
* This switch is provided to allow builders to more closely represent the Pen and Paper
|
||||
* Illithid Slayer class, instead of the broader Open Game License "Slayer" class.
|
||||
*
|
||||
* Type: Int
|
||||
* Type: Int
|
||||
* Values: 0 [Default] (Favored Enemy racial type is not limited)
|
||||
* 1 (Favored Enemy race is limited to Aberration only)
|
||||
* 1 (Favored Enemy race is limited to Aberration only)
|
||||
*/
|
||||
const string PRC_PSIONIC_SLAYER_FAV_ENEMY_ABERRATION_ONLY = "PRC_PSIONIC_SLAYER_FAV_ENEMY_ABERRATION_ONLY";
|
||||
|
||||
@@ -583,20 +585,20 @@ const string PRC_PSIONIC_SLAYER_FAV_ENEMY_ABERRATION_ONLY = "PRC_PSIONIC_S
|
||||
* For the Psionic Slayer prestige class, this switch requires a character to make a "kill"
|
||||
* of a specific type of creature before the class becomes available.
|
||||
*
|
||||
* Use of this switch requires that the module builder add a "Psionic Slayer Kill Token"
|
||||
* (included in the PRC Items) to the designated creature.
|
||||
* Use of this switch requires that the module builder add a "Psionic Slayer Kill Token"
|
||||
* (included in the PRC Items) to the designated creature.
|
||||
*
|
||||
* Alternately, a script or item can be made that will run the script "prc_psysly_killt"
|
||||
* Alternately, a script or item can be made that will run the script "prc_psysly_killt"
|
||||
* on the PC. This script will set the flag that allows the target PC to take the Psionic Slayer Class.
|
||||
* Example code:
|
||||
* ExecuteScript("prc_psysly_killt", oPC); // Where oPC is an player charcter object
|
||||
* Example code:
|
||||
* ExecuteScript("prc_psysly_killt", oPC); // Where oPC is an player charcter object
|
||||
*
|
||||
* This switch is provided to allow builders to more closely represent the Pen and Paper
|
||||
* This switch is provided to allow builders to more closely represent the Pen and Paper
|
||||
* Illithid Slayer class, instead of the broader Open Game License "Slayer" class.
|
||||
*
|
||||
* Type: Int
|
||||
* Type: Int
|
||||
* Values: 0 [Default] (Kill Token / Script NOT required for taking the Psionic Slayer Class)
|
||||
* 1 (Kill Token / Script REQUIRED before the Psionic Slayer Class is available to take)
|
||||
* 1 (Kill Token / Script REQUIRED before the Psionic Slayer Class is available to take)
|
||||
*/
|
||||
const string PRC_PSIONIC_SLAYER_REQUIRE_KILL_TOKEN = "PRC_PSIONIC_SLAYER_REQUIRE_KILL_TOKEN";
|
||||
|
||||
@@ -605,19 +607,19 @@ const string PRC_PSIONIC_SLAYER_REQUIRE_KILL_TOKEN = "PRC_PSIONIC_SLAYER_R
|
||||
* By default the Werewolf class uses the Bioware Polymorph effect to perfrom its
|
||||
* Hybrid Form Shapchange.
|
||||
*
|
||||
* This switch allows the Werewolf class to be toggled to use the PRC Shifter
|
||||
* Shapchange code instead.
|
||||
* This switch allows the Werewolf class to be toggled to use the PRC Shifter
|
||||
* Shapchange code instead.
|
||||
*
|
||||
* Type: Int
|
||||
* Type: Int
|
||||
* Values: 0 [Default] (Werewolf Hybrid Shapchange uses Bioware Polymorph)
|
||||
* 1 (Werewolf Hybrid Shapchange uses PRC Shifter shape change code)
|
||||
* 1 (Werewolf Hybrid Shapchange uses PRC Shifter shape change code)
|
||||
*/
|
||||
const string PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPCHANGE = "PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPCHANGE";
|
||||
const string PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPECHANGE = "PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPECHANGE";
|
||||
|
||||
/**
|
||||
* Sets the max bonus for the PnP Shifter shifting systems
|
||||
*
|
||||
* Type: Int
|
||||
* Type: Int
|
||||
* Values: any greater than 0
|
||||
*/
|
||||
const string PRC_PNP_SHIFTER_BONUS = "PRC_PNP_SHIFTER_BONUS";
|
||||
@@ -781,7 +783,7 @@ const string PRC_STAFF_CASTER_LEVEL = "PRC_STAFF_CASTER_LEVEL";
|
||||
/**
|
||||
* [DEFUNCT]
|
||||
* A wand must be equipped before it can cast a spell
|
||||
*
|
||||
*
|
||||
* Any value above 0 turns off the requirement to have a wand equipped to use it
|
||||
*
|
||||
* This switch is defunct, wands must *always* be equipped to use them.
|
||||
@@ -929,7 +931,7 @@ const string PRC_PNP_FAMILIAR_FEEDING = "PRC_PNP_FAMILIAR_FEEDING
|
||||
|
||||
/**
|
||||
* Use PRC henchmen-familiars instead of BioWare's - this will allow
|
||||
* new classes to have familiars, but summoned creatures will no longer
|
||||
* new classes to have familiars, but summoned creatures will no longer
|
||||
* be 'true' familiars (ie. can't possess PRC familiar)
|
||||
*/
|
||||
const string PRC_FAMILIARS = "PRC_FAMILIARS";
|
||||
@@ -1112,7 +1114,7 @@ const string PRC_SPELL_ALIGNMENT_RESTRICT = "PRC_SPELL_ALIGNMENT_REST
|
||||
* Disable registration of custom cohorts
|
||||
*/
|
||||
const string PRC_DISABLE_REGISTER_COHORTS = "PRC_DISABLE_REGISTER_COHORTS";
|
||||
|
||||
|
||||
/*
|
||||
* Disable cohorts starting with gear
|
||||
*/
|
||||
@@ -1142,19 +1144,19 @@ const string PRC_SPELL_ALIGNMENT_RESTRICT = "PRC_SPELL_ALIGNMENT_REST
|
||||
* Medium armor is a 25% speed reduction, Heavy is a 33% reduction
|
||||
*/
|
||||
const string PRC_PNP_ARMOR_SPEED = "PRC_PNP_ARMOR_SPEED";
|
||||
|
||||
|
||||
/*
|
||||
* Applies a 99% speed boost when out of combat
|
||||
* Warning that it will likely cause PCs to be overly speedy when combat starts
|
||||
* Potential problem causer
|
||||
*/
|
||||
const string PRC_FAST_TRAVEL_SPEED = "PRC_FAST_TRAVEL_SPEED";
|
||||
|
||||
|
||||
/*
|
||||
* Applys a Discipline bonus equal to BAB to all characters if turned on
|
||||
* Bonus only applies to characters with 0 ranks in Discipline
|
||||
*/
|
||||
const string PRC_PNP_KNOCKDOWN = "PRC_PNP_KNOCKDOWN";
|
||||
const string PRC_PNP_KNOCKDOWN = "PRC_PNP_KNOCKDOWN";
|
||||
|
||||
/*
|
||||
* by Bioware rules, PCs have approximatly a 7th faster movement than NPCs
|
||||
@@ -1202,8 +1204,11 @@ const string PRC_SPELL_ALIGNMENT_RESTRICT = "PRC_SPELL_ALIGNMENT_REST
|
||||
*/
|
||||
const string PRC_APPEARNCE_CHANGE_DISABLE = "PRC_APPEARNCE_CHANGE_DISABLE";
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Allow "Monk" gloves to merge with a creature weapons when Wildshaped.
|
||||
* Will also merge bracers with creature hides when Wildshaped.
|
||||
*/
|
||||
const string PRC_WILDSHAPE_ALLOWS_ARMS_SLOT = "PRC_WILDSHAPE_ALLOWS_ARMS_SLOT";
|
||||
|
||||
/******************************************************************************\
|
||||
* Death/Bleeding system *
|
||||
@@ -1221,7 +1226,7 @@ const string PRC_PNP_DEATH_ENABLE = "PRC_PNP_DEATH_ENA
|
||||
* if FALSE, dont bleed just die
|
||||
* By PnP this would be 1 round, or 6 seconds
|
||||
*/
|
||||
const string PRC_DEATH_OR_BLEED = "PRC_DEATH_OR_BLEED";
|
||||
const string PRC_DEATH_OR_BLEED = "PRC_DEATH_OR_BLEED";
|
||||
|
||||
/*
|
||||
* Damage when bleeding
|
||||
@@ -1314,7 +1319,7 @@ const string PRC_ACP_DELAY = "PRC_ACP_DELAY";
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* File End switches
|
||||
* File End switches
|
||||
******************************************************************************/
|
||||
|
||||
/**
|
||||
@@ -1488,10 +1493,10 @@ const string PRC_POISON_IS_FOOD_SCRIPT_NAME = "PRC_POISON_IS_FOOD_SCRIP
|
||||
const string PRC_POISON_ALLOW_CLEAN_IN_EQUIP = "PRC_POISON_ALLOW_CLEAN_IN_EQUIP";
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* Default: crafting requires only gold and xp
|
||||
*/
|
||||
const string PRC_CRAFT_POISON_USE_INGREDIENST = "PRC_CRAFT_POISON_USE_INGREDIENST";
|
||||
const string PRC_CRAFT_POISON_USE_INGREDIENTS = "PRC_CRAFT_POISON_USE_INGREDIENTS";
|
||||
|
||||
/******************************************************************************\
|
||||
* PRGT system switches *
|
||||
@@ -1540,10 +1545,10 @@ const string PRC_PSI_ASTRAL_CONSTRUCT_DUR_MOD = "PRC_PSI_ASTRAL_CONSTRUCT
|
||||
|
||||
/**
|
||||
* If this is set, The Astral Seed power will attempt to use the provided string as
|
||||
* the ResRef to create the Astral Seed object instead of the of the phylactery
|
||||
* the ResRef to create the Astral Seed object instead of the of the phylactery
|
||||
* ResRef("x2_plc_phylact").
|
||||
* May be used by builders to create an object that CAN be destroyed, or has other traits,
|
||||
* as desired.
|
||||
* as desired.
|
||||
* Type: String
|
||||
* Values: "" [Default] (Blank, or not set: Use default phylactery ResRef for Astral Seed)
|
||||
* STRING (Entered String will be used as the ResRef of created Astral Seed object)
|
||||
@@ -1551,14 +1556,14 @@ const string PRC_PSI_ASTRAL_CONSTRUCT_DUR_MOD = "PRC_PSI_ASTRAL_CONSTRUCT
|
||||
const string PRC_PSI_ASTRAL_SEED_RESREF = "PRC_PSI_ASTRAL_SEED_RESREF";
|
||||
|
||||
/**
|
||||
* By default the Astral Seed power respawns the player, and then makes them immobile for
|
||||
* By default the Astral Seed power respawns the player, and then makes them immobile for
|
||||
* 24-game-hours.
|
||||
* If this switch is set, it will adjust the imobility time period; shortening it, lengthing it, or
|
||||
* If this switch is set, it will adjust the imobility time period; shortening it, lengthing it, or
|
||||
* effectively eliminating it.
|
||||
* Type: Int
|
||||
* Values: 0 [Default] (Not set: Use default 24 hour duration)
|
||||
* -1 (Any negative value will result in a fixed duratoion of 2 seconds, which effectively eliminates the wait period)
|
||||
* 1 (Any potitive value: multiply duration by the value provided and then divide result by 1000.
|
||||
* 1 (Any potitive value: multiply duration by the value provided and then divide result by 1000.
|
||||
* Values less than 1000 will shorten the duration, values higher than 1000 will lengthen it.)
|
||||
*/
|
||||
const string PRC_PSI_ASTRAL_SEED_RESPAWN_DELAY_X1000 = "PRC_PSI_ASTRAL_SEED_RESPAWN_DELAY_X1000";
|
||||
@@ -1569,7 +1574,7 @@ const string PRC_PSI_ASTRAL_SEED_RESPAWN_DELAY_X1000 = "PRC_PSI_ASTRAL_SE
|
||||
* If this flag is set, the XP loss is completely eliminated. The standard PRC event hook script
|
||||
* of "prc_pw_astralseed" may be used to script any additional effects to occure upon Astral Seed
|
||||
* respawning, including scripting specific XP loss amount.
|
||||
* Type: Int
|
||||
* Type: Int
|
||||
* Values: 0 [Default] (Not set: lose 1 level worth of XP upon Astral Seed respawn)
|
||||
* 1 (Any potitive value: Remove all XP loss from Astral Seed respawn)
|
||||
*/
|
||||
@@ -1906,7 +1911,7 @@ const string PRC_CRAFT_TIMER_MAX = "PRC_CRAFT_TIMER_MAX";
|
||||
*/
|
||||
const string PRC_CRAFT_TIMER_MIN = "PRC_CRAFT_TIMER_MIN";
|
||||
|
||||
/**
|
||||
/*
|
||||
* These three switches modify Bioware crafting so that the items produced have the
|
||||
* casterlevel of the spellcaster who created them. Normally under Bioware, it is possible
|
||||
* for a level 3 caster to produce level 9 items and for a level 40 caster to only produce
|
||||
@@ -1952,6 +1957,23 @@ const string PRC_CRAFT_ROD_CASTER_LEVEL = "PRC_CRAFT_ROD_CASTER_LEVE
|
||||
*/
|
||||
const string PRC_CRAFT_STAFF_CASTER_LEVEL = "PRC_CRAFT_STAFF_CASTER_LEVEL";
|
||||
|
||||
/*
|
||||
* As above, except it applies to scepters
|
||||
*/
|
||||
const string PRC_CRAFT_SCEPTER_CASTER_LEVEL = "PRC_CRAFT_SCEPTER_CASTER_LEVEL";
|
||||
|
||||
/*
|
||||
* As above, except it applies to herbal infusions
|
||||
*/
|
||||
const string PRC_CREATE_INFUSION_CASTER_LEVEL = "PRC_CREATE_INFUSION_CASTER_LEVEL";
|
||||
|
||||
/*
|
||||
* Builder's Option: Enables the optional PnP herbs for creating infusions.
|
||||
* Each herb is keyed to a spell circle level & spell school as shown on pg. 33
|
||||
* of the Master's of the Wild sourcebook.
|
||||
*/
|
||||
const string PRC_CREATE_INFUSION_OPTIONAL_HERBS = "PRC_CREATE_INFUSION_OPTIONAL_HERBS";
|
||||
|
||||
/*
|
||||
* Characters with a crafting feat always have the appropriate base item in their inventory
|
||||
*/
|
||||
@@ -1961,45 +1983,59 @@ const string PRC_CRAFTING_BASE_ITEMS = "PRC_CRAFTING_BASE_ITEMS";
|
||||
* Max level of spells brewed into potions
|
||||
* defaults to 3
|
||||
*/
|
||||
const string X2_CI_BREWPOTION_MAXLEVEL = "X2_CI_BREWPOTION_MAXLEVEL";
|
||||
//const string X2_CI_BREWPOTION_MAXLEVEL = "X2_CI_BREWPOTION_MAXLEVEL";
|
||||
const string PRC_X2_BREWPOTION_MAXLEVEL = "PRC_X2_BREWPOTION_MAXLEVEL";
|
||||
|
||||
/*
|
||||
* cost modifier of spells brewed into poitions
|
||||
* defaults to 50
|
||||
*/
|
||||
const string X2_CI_BREWPOTION_COSTMODIFIER = "X2_CI_BREWPOTION_COSTMODIFIER";
|
||||
const string PRC_X2_BREWPOTION_COSTMODIFIER = "PRC_X2_BREWPOTION_COSTMODIFIER";
|
||||
|
||||
/*
|
||||
* cost modifier of spells scribed into scrolls
|
||||
* defaults to 25
|
||||
*/
|
||||
const string X2_CI_SCRIBESCROLL_COSTMODIFIER = "X2_CI_SCRIBESCROLL_COSTMODIFIER";
|
||||
const string PRC_X2_SCRIBESCROLL_COSTMODIFIER = "PRC_X2_SCRIBESCROLL_COSTMODIFIER";
|
||||
|
||||
/*
|
||||
* cost modifier of spells infused into herbs
|
||||
* defaults to 25
|
||||
*/
|
||||
const string PRC_X2_CREATEINFUSION_COSTMODIFIER = "PRC_X2_CREATEINFUSION_COSTMODIFIER";
|
||||
|
||||
/*
|
||||
* Max level of spells crafted into wands
|
||||
* defaults to 4
|
||||
*/
|
||||
const string X2_CI_CRAFTWAND_MAXLEVEL = "X2_CI_CRAFTWAND_MAXLEVEL";
|
||||
const string PRC_X2_CRAFTWAND_MAXLEVEL = "PRC_X2_CRAFTWAND_MAXLEVEL";
|
||||
|
||||
/*
|
||||
* cost modifier of spells crafted into wands
|
||||
* defaults to 750
|
||||
*/
|
||||
const string X2_CI_CRAFTWAND_COSTMODIFIER = "X2_CI_CRAFTWAND_COSTMODIFIER";
|
||||
const string PRC_X2_CRAFTWAND_COSTMODIFIER = "PRC_X2_CRAFTWAND_COSTMODIFIER";
|
||||
|
||||
/*
|
||||
* cost modifier of spells crafted into rods
|
||||
* note that adding a second spell costs 75% and 3 or more costs 50%
|
||||
* defaults to 750
|
||||
*/
|
||||
const string X2_CI_CRAFTROD_COSTMODIFIER = "X2_CI_CRAFTROD_COSTMODIFIER";
|
||||
const string PRC_X2_CRAFTROD_COSTMODIFIER = "PRC_X2_CRAFTROD_COSTMODIFIER";
|
||||
|
||||
/*
|
||||
* cost modifier of spells crafted into scepters
|
||||
* note that adding a second spell costs 75%
|
||||
* defaults to 750
|
||||
*/
|
||||
const string PRC_X2_CRAFTSCEPTER_COSTMODIFIER = "PRC_X2_CRAFTSCEPTER_COSTMODIFIER";
|
||||
|
||||
/*
|
||||
* cost modifier of spells crafted into staffs
|
||||
* note that adding a second spell costs 75% and 3 or more costs 50%
|
||||
* defaults to 750
|
||||
*/
|
||||
const string X2_CI_CRAFTSTAFF_COSTMODIFIER = "X2_CI_CRAFTSTAFF_COSTMODIFIER";
|
||||
const string PRC_X2_CRAFTSTAFF_COSTMODIFIER = "PRC_X2_CRAFTSTAFF_COSTMODIFIER";
|
||||
|
||||
/**
|
||||
* Allows the use of arbitrary itemproperties and uses NWN item costs
|
||||
@@ -2321,7 +2357,7 @@ const string PRC_XP_GIVE_XP_TO_NPCS = "PRC_XP_GIVE_XP_TO_NPCS";
|
||||
/**
|
||||
* Setting this switch will turn off the messages about being too far awy to gain XP
|
||||
*/
|
||||
const string PRC_XP_DISABLE_SPAM = "PRC_XP_DISABLE_SPAM";
|
||||
const string PRC_XP_DISABLE_SPAM = "PRC_XP_DISABLE_SPAM";
|
||||
|
||||
/**
|
||||
* PCs must be in the same area as the CR to gain XP.
|
||||
@@ -2880,13 +2916,13 @@ const string PRC_PERFECTED_MAP_MULTIPLIER = "PRC_PERFECTED_MAP_MULTIP
|
||||
\******************************************************************************/
|
||||
|
||||
/**
|
||||
* Sets how many seconds it takes to contact a vestige.
|
||||
* Sets how many seconds it takes to contact a vestige.
|
||||
* Any number less than 6 is ignored
|
||||
*/
|
||||
const string PRC_CONTACT_VESTIGE_TIMER = "PRC_CONTACT_VESTIGE_TIMER";
|
||||
|
||||
/**
|
||||
* Sets how many seconds it takes to bind a vestige.
|
||||
* Sets how many seconds it takes to bind a vestige.
|
||||
* Any number less than 12 is ignored
|
||||
*/
|
||||
const string PRC_BIND_VESTIGE_TIMER = "PRC_BIND_VESTIGE_TIMER";
|
||||
@@ -2920,6 +2956,20 @@ const string PRC_PW_SECURITY_CD_CHECK = "PRC_PW_SECURITY_CD_CHECK";
|
||||
*/
|
||||
const string PRC_DEBUG = "PRC_DEBUG";
|
||||
|
||||
/******************************************************************************\
|
||||
* Duration NUI Switches *
|
||||
\******************************************************************************/
|
||||
|
||||
/**
|
||||
* Toggles allowing player to remove friendly PC spells on player through Duration NUI
|
||||
* instead of just their own spells.
|
||||
*/
|
||||
const string PRC_ALLOWED_TO_REMOVE_FRIENDLY_SPELLS = "PRC_ALLOWED_TO_REMOVE_FRIENDLY_SPELLS";
|
||||
/**
|
||||
* Toggles allowing players to see the duration of hostile spells on them.
|
||||
*/
|
||||
const string PRC_ALLOWED_TO_SEE_HOSTILE_SPELLS = "PRC_ALLOWED_TO_SEE_HOSTILE_SPELLS";
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -10,21 +10,12 @@
|
||||
//:://////////////////////////////////////////////
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "prc_spell_const"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Function prototypes */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//gets the number of class levels that count for turning
|
||||
int GetTurningClassLevel(object oCaster = OBJECT_SELF, int nTurnType = SPELL_TURN_UNDEAD);
|
||||
|
||||
@@ -191,6 +182,20 @@ int GetIsTurnOrRebuke(object oTarget, int nTurnType, int nTargetRace)
|
||||
|
||||
break;
|
||||
}
|
||||
case SPELL_PLANT_DEFIANCE:
|
||||
{
|
||||
if(nTargetRace == RACIAL_TYPE_PLANT)
|
||||
nReturn = ACTION_TURN;
|
||||
|
||||
break;
|
||||
}
|
||||
case SPELL_PLANT_CONTROL:
|
||||
{
|
||||
if(nTargetRace == RACIAL_TYPE_PLANT)
|
||||
nReturn = ACTION_REBUKE;
|
||||
|
||||
break;
|
||||
}
|
||||
case SPELL_TURN_PLANT:
|
||||
{
|
||||
// Plant domain rebukes or commands plants
|
||||
@@ -383,6 +388,13 @@ int GetTurningClassLevel(object oCaster = OBJECT_SELF, int nTurnType = SPELL_TUR
|
||||
|
||||
if (nTurnType == SPELL_OPPORTUNISTIC_PIETY_TURN)
|
||||
return GetLevelByClass(CLASS_TYPE_FACTOTUM, oCaster);
|
||||
|
||||
if (nTurnType == SPELL_PLANT_DEFIANCE || nTurnType == SPELL_PLANT_CONTROL)
|
||||
{
|
||||
int nDivineLvl = GetPrCAdjustedCasterLevelByType(TYPE_DIVINE, oCaster);
|
||||
|
||||
return nDivineLvl;
|
||||
}
|
||||
|
||||
//Baelnorn & Archlich adds all class levels.
|
||||
if(GetLevelByClass(CLASS_TYPE_BAELNORN, oCaster) || GetHasFeat(FEAT_TEMPLATE_ARCHLICH_MARKER, oCaster)) //:: Archlich
|
||||
|
||||
@@ -91,6 +91,107 @@ float DamageAvg(int iDamage);
|
||||
/* Function defintions */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
// StepDie: increases a damage die by 'nSteps' steps according to d20 SRD progression
|
||||
// Increment the unarmed damage by nSteps
|
||||
int StepDie(int nDamage, int nSteps)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < nSteps; i++)
|
||||
{
|
||||
switch (nDamage)
|
||||
{
|
||||
// 1-dice increments
|
||||
case IP_CONST_MONSTERDAMAGE_1d2: nDamage = IP_CONST_MONSTERDAMAGE_1d3; break;
|
||||
case IP_CONST_MONSTERDAMAGE_1d3: nDamage = IP_CONST_MONSTERDAMAGE_1d4; break;
|
||||
case IP_CONST_MONSTERDAMAGE_1d4: nDamage = IP_CONST_MONSTERDAMAGE_1d6; break;
|
||||
case IP_CONST_MONSTERDAMAGE_1d6: nDamage = IP_CONST_MONSTERDAMAGE_1d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_1d8: nDamage = IP_CONST_MONSTERDAMAGE_1d10; break;
|
||||
case IP_CONST_MONSTERDAMAGE_1d10: nDamage = IP_CONST_MONSTERDAMAGE_1d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_1d12: nDamage = IP_CONST_MONSTERDAMAGE_2d8; break;
|
||||
|
||||
// 2-dice increments
|
||||
//case IP_CONST_MONSTERDAMAGE_2d3: nDamage = IP_CONST_MONSTERDAMAGE_2d4; break;
|
||||
case IP_CONST_MONSTERDAMAGE_2d4: nDamage = IP_CONST_MONSTERDAMAGE_2d6; break;
|
||||
case IP_CONST_MONSTERDAMAGE_2d6: nDamage = IP_CONST_MONSTERDAMAGE_2d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_2d8: nDamage = IP_CONST_MONSTERDAMAGE_2d10; break;
|
||||
case IP_CONST_MONSTERDAMAGE_2d10: nDamage = IP_CONST_MONSTERDAMAGE_2d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_2d12: nDamage = IP_CONST_MONSTERDAMAGE_3d10; break;
|
||||
|
||||
// 3-dice increments
|
||||
case IP_CONST_MONSTERDAMAGE_3d4: nDamage = IP_CONST_MONSTERDAMAGE_3d6; break;
|
||||
case IP_CONST_MONSTERDAMAGE_3d6: nDamage = IP_CONST_MONSTERDAMAGE_3d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_3d8: nDamage = IP_CONST_MONSTERDAMAGE_3d10; break;
|
||||
case IP_CONST_MONSTERDAMAGE_3d10: nDamage = IP_CONST_MONSTERDAMAGE_3d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_3d12: nDamage = IP_CONST_MONSTERDAMAGE_4d8; break;
|
||||
|
||||
// 4-dice increments
|
||||
case IP_CONST_MONSTERDAMAGE_4d4: nDamage = IP_CONST_MONSTERDAMAGE_4d6; break;
|
||||
case IP_CONST_MONSTERDAMAGE_4d6: nDamage = IP_CONST_MONSTERDAMAGE_4d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_4d8: nDamage = IP_CONST_MONSTERDAMAGE_4d10; break;
|
||||
case IP_CONST_MONSTERDAMAGE_4d10: nDamage = IP_CONST_MONSTERDAMAGE_4d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_4d12: nDamage = IP_CONST_MONSTERDAMAGE_5d8; break;
|
||||
|
||||
// 5-dice increments
|
||||
case IP_CONST_MONSTERDAMAGE_5d4: nDamage = IP_CONST_MONSTERDAMAGE_5d6; break;
|
||||
case IP_CONST_MONSTERDAMAGE_5d6: nDamage = IP_CONST_MONSTERDAMAGE_5d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_5d8: nDamage = IP_CONST_MONSTERDAMAGE_5d10; break;
|
||||
case IP_CONST_MONSTERDAMAGE_5d10: nDamage = IP_CONST_MONSTERDAMAGE_5d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_5d12: nDamage = IP_CONST_MONSTERDAMAGE_6d10; break;
|
||||
|
||||
// 6-dice increments
|
||||
//case IP_CONST_MONSTERDAMAGE_6d4: nDamage = IP_CONST_MONSTERDAMAGE_6d6; break;
|
||||
case IP_CONST_MONSTERDAMAGE_6d6: nDamage = IP_CONST_MONSTERDAMAGE_6d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_6d8: nDamage = IP_CONST_MONSTERDAMAGE_6d10; break;
|
||||
case IP_CONST_MONSTERDAMAGE_6d10: nDamage = IP_CONST_MONSTERDAMAGE_6d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_6d12: nDamage = IP_CONST_MONSTERDAMAGE_7d10; break;
|
||||
|
||||
// 7-dice increments
|
||||
case IP_CONST_MONSTERDAMAGE_7d4: nDamage = IP_CONST_MONSTERDAMAGE_7d6; break;
|
||||
case IP_CONST_MONSTERDAMAGE_7d6: nDamage = IP_CONST_MONSTERDAMAGE_7d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_7d8: nDamage = IP_CONST_MONSTERDAMAGE_7d10; break;
|
||||
case IP_CONST_MONSTERDAMAGE_7d10: nDamage = IP_CONST_MONSTERDAMAGE_7d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_7d12: nDamage = IP_CONST_MONSTERDAMAGE_9d10; break;
|
||||
|
||||
// 8-dice increments
|
||||
//case IP_CONST_MONSTERDAMAGE_8d4: nDamage = IP_CONST_MONSTERDAMAGE_8d6; break;
|
||||
case IP_CONST_MONSTERDAMAGE_8d6: nDamage = IP_CONST_MONSTERDAMAGE_8d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_8d8: nDamage = IP_CONST_MONSTERDAMAGE_8d10; break;
|
||||
case IP_CONST_MONSTERDAMAGE_8d10: nDamage = IP_CONST_MONSTERDAMAGE_8d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_8d12: nDamage = IP_CONST_MONSTERDAMAGE_10d10; break;
|
||||
|
||||
// 9-dice increments
|
||||
//case IP_CONST_MONSTERDAMAGE_9d4: nDamage = IP_CONST_MONSTERDAMAGE_9d6; break;
|
||||
case IP_CONST_MONSTERDAMAGE_9d6: nDamage = IP_CONST_MONSTERDAMAGE_9d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_9d8: nDamage = IP_CONST_MONSTERDAMAGE_9d10; break;
|
||||
case IP_CONST_MONSTERDAMAGE_9d10: nDamage = IP_CONST_MONSTERDAMAGE_9d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_9d12: nDamage = IP_CONST_MONSTERDAMAGE_6d20; break;
|
||||
|
||||
// 10-dice increments
|
||||
//case IP_CONST_MONSTERDAMAGE_10d4: nDamage = IP_CONST_MONSTERDAMAGE_10d6; break;
|
||||
case IP_CONST_MONSTERDAMAGE_10d6: nDamage = IP_CONST_MONSTERDAMAGE_10d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_10d8: nDamage = IP_CONST_MONSTERDAMAGE_10d10; break;
|
||||
case IP_CONST_MONSTERDAMAGE_10d10: nDamage = IP_CONST_MONSTERDAMAGE_10d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_10d12: nDamage = IP_CONST_MONSTERDAMAGE_7d20; break;
|
||||
|
||||
// d20 increments
|
||||
case IP_CONST_MONSTERDAMAGE_1d20: nDamage = IP_CONST_MONSTERDAMAGE_3d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_2d20: nDamage = IP_CONST_MONSTERDAMAGE_4d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_3d20: nDamage = IP_CONST_MONSTERDAMAGE_8d8; break;
|
||||
case IP_CONST_MONSTERDAMAGE_4d20: nDamage = IP_CONST_MONSTERDAMAGE_8d12; break;
|
||||
case IP_CONST_MONSTERDAMAGE_5d20: nDamage = IP_CONST_MONSTERDAMAGE_9d12; break; //:: Everything breaks down here
|
||||
case IP_CONST_MONSTERDAMAGE_6d20: nDamage = IP_CONST_MONSTERDAMAGE_1d20; break;
|
||||
case IP_CONST_MONSTERDAMAGE_7d20: nDamage = IP_CONST_MONSTERDAMAGE_8d20; break;
|
||||
case IP_CONST_MONSTERDAMAGE_8d20: nDamage = IP_CONST_MONSTERDAMAGE_9d20; break;
|
||||
case IP_CONST_MONSTERDAMAGE_9d20: nDamage = IP_CONST_MONSTERDAMAGE_10d20; break;
|
||||
|
||||
default: break; // top tier or unknown
|
||||
}
|
||||
}
|
||||
|
||||
return nDamage;
|
||||
}
|
||||
|
||||
|
||||
// Clean up any extras in the inventory.
|
||||
void CleanExtraFists(object oCreature)
|
||||
{
|
||||
@@ -168,12 +269,169 @@ void ApplyUnarmedAttackEffects(object oCreature)
|
||||
}
|
||||
|
||||
// Determines the amount of damage a character can do.
|
||||
// IoDM: +1 dice at level 4, +2 dice at level 8
|
||||
// IoDM: +1 die 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 = 0;
|
||||
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");
|
||||
|
||||
//:: Determine creature size
|
||||
if( GetIsPolyMorphedOrShifted(oCreature) || GetPRCSwitch(PRC_APPEARANCE_SIZE))
|
||||
{
|
||||
iSize = PRCGetCreatureSize(oCreature) - CREATURE_SIZE_MEDIUM + 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
iSize = 5; // medium
|
||||
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;
|
||||
iSize += PRCGetCreatureSize(oCreature) - PRCGetCreatureSize(oCreature, PRC_SIZEMASK_NONE);
|
||||
if (iSize < 1) iSize = 1;
|
||||
if (iSize > 9) iSize = 9;
|
||||
}
|
||||
|
||||
// Sacred Fist code break protection
|
||||
if (GetHasFeat(FEAT_SF_CODE, oCreature)) iSacredFist = 0;
|
||||
|
||||
// Combine monk-like 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;
|
||||
|
||||
// Cap monk progression
|
||||
if (iMonk > 16 && !GetPRCSwitch(PRC_3_5e_FIST_DAMAGE)) iMonk = 16;
|
||||
else if (iMonk > 20) iMonk = 20;
|
||||
|
||||
// Ronove replacement
|
||||
if (iRonove > iMonk) iMonk = iRonove;
|
||||
|
||||
// Monk damage calculation (2DA row)
|
||||
if (iMonk > 0) iMonkDamage = iMonk / 4 + 3;
|
||||
if (iSize == 5 && iMonkDamage == 7 && !GetPRCSwitch(PRC_3_5e_FIST_DAMAGE))
|
||||
iMonkDamage = 8;
|
||||
|
||||
// Shou Disciple base damage
|
||||
if (iShou > 0)
|
||||
{
|
||||
int nRow;
|
||||
if (iShou == 1) nRow = 3;
|
||||
else if (iShou == 2) nRow = 4;
|
||||
else if (iShou == 3) nRow = 5;
|
||||
else if (iShou == 4) nRow = 5;
|
||||
else if (iShou == 5) nRow = 6;
|
||||
else nRow = 3;
|
||||
|
||||
if (nRow > 6) nRow = 6;
|
||||
|
||||
iShouDamage = StringToInt(Get2DACache("unarmed_dmg", "size" + IntToString(iSize), nRow));
|
||||
}
|
||||
|
||||
// Frostrager
|
||||
if (iFrost > 0) iFrostDamage = IP_CONST_MONSTERDAMAGE_1d6;
|
||||
if (iFrost > 3) iFrostDamage = IP_CONST_MONSTERDAMAGE_1d8;
|
||||
|
||||
// Brawler
|
||||
if (iBrawler > 0) iBrawlerDamage = iBrawler / 6 + 3;
|
||||
if (iBrawler >= 36) iBrawlerDamage += 2;
|
||||
|
||||
// Armor/shield penalties
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// Determine IoDM die increase
|
||||
if (GetHasFeat(FEAT_INCREASE_DAMAGE2, oCreature)) iDieIncrease = 2;
|
||||
else if (GetHasFeat(FEAT_INCREASE_DAMAGE1, oCreature)) iDieIncrease = 1;
|
||||
|
||||
// Lookup monk damage in 2DA
|
||||
iMonkDamage = StringToInt(Get2DACache("unarmed_dmg","size" + IntToString(iSize), iMonkDamage));
|
||||
|
||||
// 3.0e monk special cases
|
||||
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;
|
||||
}
|
||||
|
||||
// Apply IoDM die increase last, after 2DA lookups
|
||||
if (iMonkDamage > 0) iMonkDamage = StepDie(iMonkDamage, iDieIncrease);
|
||||
if (iShouDamage > 0) iShouDamage = StepDie(iShouDamage, iDieIncrease);
|
||||
if (iBrawlerDamage > 0) iBrawlerDamage = StepDie(iBrawlerDamage, iDieIncrease);
|
||||
if (iFrostDamage > 0) iFrostDamage = StepDie(iFrostDamage, iDieIncrease);
|
||||
if (iSUSDamage > 0) iSUSDamage = StepDie(iSUSDamage, iDieIncrease);
|
||||
|
||||
// Select best damage
|
||||
iDamage = iMonkDamage;
|
||||
iDamage = (DamageAvg(iShouDamage ) > DamageAvg(iDamage)) ? iShouDamage : iDamage;
|
||||
iDamage = (DamageAvg(iFrostDamage ) > DamageAvg(iDamage)) ? iFrostDamage : iDamage;
|
||||
iDamage = (DamageAvg(iSUSDamage ) > DamageAvg(iDamage)) ? iSUSDamage : iDamage;
|
||||
iDamage = (DamageAvg(iBrawlerDamage) > DamageAvg(iDamage)) ? iBrawlerDamage : iDamage;
|
||||
|
||||
if (DEBUG) DoDebug("prc_inc_unarmed: iDamage "+IntToString(iDamage));
|
||||
|
||||
return iDamage;
|
||||
}
|
||||
|
||||
|
||||
/* int FindUnarmedDamage(object oCreature)
|
||||
{
|
||||
int iDamage = 0;
|
||||
int iMonk = GetLevelByClass(CLASS_TYPE_MONK, oCreature) + GetLocalInt(oCreature, "LiPengMonk");
|
||||
@@ -195,36 +453,30 @@ int FindUnarmedDamage(object oCreature)
|
||||
int iDieIncrease = 0;
|
||||
int iSize;
|
||||
|
||||
if (GetHasSpellEffect(VESTIGE_RONOVE, oCreature) && GetLevelByClass(CLASS_TYPE_BINDER, oCreature)) iRonove = GetLocalInt(oCreature, "RonovesFists");
|
||||
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))
|
||||
// Determine creature size
|
||||
if( GetIsPolyMorphedOrShifted(oCreature) || GetPRCSwitch(PRC_APPEARANCE_SIZE))
|
||||
{
|
||||
iSize = PRCGetCreatureSize(oCreature) - CREATURE_SIZE_MEDIUM + 5; // medium is size 5 for us
|
||||
iSize = PRCGetCreatureSize(oCreature) - CREATURE_SIZE_MEDIUM + 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Determine creature size by feats.
|
||||
iSize = 5; // medium is size 5 for us
|
||||
iSize = 5; // medium
|
||||
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.
|
||||
// Sacred Fist code break protection
|
||||
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
|
||||
// Combine monk-like levels
|
||||
iMonk += iSacredFist + iHenshin + iEnlightenedFist + iShou + iZuoken + iShadowSunNinja;
|
||||
|
||||
// Superior Unarmed Strike
|
||||
@@ -232,49 +484,66 @@ int FindUnarmedDamage(object oCreature)
|
||||
{
|
||||
iMonk += 4;
|
||||
int nHD = GetHitDice(oCreature);
|
||||
if (nHD >= 16) iSUSDamage = IP_CONST_MONSTERDAMAGE_2d6;
|
||||
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;
|
||||
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;
|
||||
// Cap monk progression
|
||||
if (iMonk > 16 && !GetPRCSwitch(PRC_3_5e_FIST_DAMAGE)) iMonk = 16;
|
||||
else if (iMonk > 20) iMonk = 20;
|
||||
|
||||
// Ronove is in place of monk, does not stack
|
||||
// Ronove replacement
|
||||
if (iRonove > iMonk) iMonk = iRonove;
|
||||
|
||||
// monks damage progesses every four levels, starts at 1d6
|
||||
if (iMonk > 0)
|
||||
iMonkDamage = iMonk / 4 + 3;
|
||||
// Monk damage calculation
|
||||
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;
|
||||
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
|
||||
//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));
|
||||
|
||||
if (iShou > 0)
|
||||
{
|
||||
// Determine 2DA row for Shou progression
|
||||
int nRow;
|
||||
if (iShou == 1) nRow = 3; // monk1
|
||||
else if (iShou == 2) nRow = 4; // monk2
|
||||
else if (iShou == 3) nRow = 5; // monk3
|
||||
else if (iShou == 4) nRow = 6; // monk4
|
||||
else if (iShou == 5) nRow = 7; // monk5
|
||||
else if (iShou == 6) nRow = 8; // monk6
|
||||
else if (iShou == 7) nRow = 9; // monk7
|
||||
else nRow = 10; // monk8+
|
||||
|
||||
nRow += iDieIncrease;
|
||||
if (nRow > 10) nRow = 10; // clamp to max row
|
||||
|
||||
// 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
|
||||
// Lookup damage in unarmed_damage.2da using size column
|
||||
iShouDamage = StringToInt(Get2DACache("unarmed_dmg","size" + IntToString(iSize), nRow));
|
||||
}
|
||||
|
||||
// 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.
|
||||
// Frostrager
|
||||
if (iFrost > 0) iFrostDamage = IP_CONST_MONSTERDAMAGE_1d6;
|
||||
if (iFrost > 3) iFrostDamage = IP_CONST_MONSTERDAMAGE_1d8;
|
||||
|
||||
// Brawler
|
||||
if (iBrawler > 0) iBrawlerDamage = iBrawler / 6 + 3;
|
||||
if (iBrawler >= 36) iBrawlerDamage += 2;
|
||||
|
||||
// Armor/shield penalties
|
||||
if (iMonkDamage > 1)
|
||||
{
|
||||
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oCreature);
|
||||
@@ -284,13 +553,10 @@ int FindUnarmedDamage(object oCreature)
|
||||
GetBaseItemType(oShield) == BASE_ITEM_TOWERSHIELD;
|
||||
|
||||
if (GetBaseAC(oArmor) > 0 || bShieldEq)
|
||||
{
|
||||
iMonkDamage = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// Shou Disciples can wear light armor
|
||||
if (iShouDamage > 1)
|
||||
if (iShouDamage > 1)
|
||||
{
|
||||
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oCreature);
|
||||
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature);
|
||||
@@ -299,53 +565,31 @@ int FindUnarmedDamage(object oCreature)
|
||||
GetBaseItemType(oShield) == BASE_ITEM_TOWERSHIELD;
|
||||
|
||||
if (GetBaseAC(oArmor) > 3 || bShieldEq)
|
||||
{
|
||||
iShouDamage = 1;
|
||||
}
|
||||
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
|
||||
int nExpansion = GetLocalInt(oCreature, "PRC_Power_Expansion_SizeIncrease");
|
||||
int nCompression = GetLocalInt(oCreature, "PRC_Power_Compression_SizeReduction");
|
||||
|
||||
if (nExpansion)
|
||||
{
|
||||
iSize += nExpansion;
|
||||
}
|
||||
|
||||
if (nCompression)
|
||||
{
|
||||
iSize -= nCompression;
|
||||
}
|
||||
// IoDM die increase
|
||||
if (GetHasFeat(FEAT_INCREASE_DAMAGE2, oCreature)) iDieIncrease += 2;
|
||||
else if (GetHasFeat(FEAT_INCREASE_DAMAGE1, oCreature)) iDieIncrease += 1;
|
||||
|
||||
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
|
||||
// Lookup final monk damage in 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:
|
||||
// 3.0e monk special cases
|
||||
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;
|
||||
}
|
||||
|
||||
// Select best damage
|
||||
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;
|
||||
@@ -354,6 +598,8 @@ int FindUnarmedDamage(object oCreature)
|
||||
|
||||
return iDamage;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// Adds appropriate feats to the skin. Stolen from SoulTaker + expanded with overwhelming/devastating critical.
|
||||
void UnarmedFeats(object oCreature)
|
||||
@@ -426,13 +672,13 @@ void UnarmedFists(object 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;
|
||||
|
||||
int iMonkEq = iMonk + iShou + iSacFist + iHenshin + iZuoken + iShadowSunNinja;
|
||||
|
||||
// Ascetic Stalker
|
||||
if (GetHasFeat(FEAT_ASCETIC_STALKER, oCreature))
|
||||
iMonkEq += iAscetic;
|
||||
iMonkEq += iAscetic;
|
||||
|
||||
// Determine the type of damage the character should do.
|
||||
string sWeapType;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Weapon Restriction System Include
|
||||
//:: prc_inc_restwpn.nss
|
||||
//:: prc_inc_wpnrest.nss
|
||||
//::///////////////////////////////////////////////
|
||||
/*
|
||||
Functions to support PnP Weapon Proficiency and
|
||||
@@ -15,6 +15,56 @@
|
||||
#include "inc_item_props"
|
||||
#include "prc_x2_itemprop"
|
||||
|
||||
//:: Detects if "monk" gloves are being equipped & set a
|
||||
//:: variable if TRUE for use with other functions
|
||||
void DetectMonkGloveEquip(object oItem)
|
||||
{
|
||||
int nItemType = GetBaseItemType(oItem);
|
||||
|
||||
object oPC = GetItemPossessor(oItem);
|
||||
if (!GetIsObjectValid(oItem))
|
||||
{
|
||||
if (DEBUG) DoDebug("prc_inc_wpnrest >> DetectMonkGloveEquip(): Unable to determine item possessor");
|
||||
return;
|
||||
}
|
||||
|
||||
if(nItemType != BASE_ITEM_GLOVES && nItemType != BASE_ITEM_BRACER) {return;}
|
||||
|
||||
else if (nItemType == BASE_ITEM_BRACER)
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_inc_wpnrest >> DetectMonkGloveEquip(): Bracer found!");
|
||||
DeleteLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
itemproperty ipG = GetFirstItemProperty(oItem);
|
||||
|
||||
while(GetIsItemPropertyValid(ipG))
|
||||
{
|
||||
int nTypeG = GetItemPropertyType(ipG);
|
||||
|
||||
// Damage related properties we care about
|
||||
if(nTypeG == ITEM_PROPERTY_DAMAGE_BONUS
|
||||
|| nTypeG == ITEM_PROPERTY_ATTACK_BONUS
|
||||
|| nTypeG == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP
|
||||
|| nTypeG == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|
||||
|| nTypeG == ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT)
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_inc_wpnrest >> DetectMonkGloves(): Monk gloves found!");
|
||||
SetLocalInt(oPC, "WEARING_MONK_GLOVES", 1);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(DEBUG) DoDebug("prc_inc_wpnrest >> DetectMonkGloves(): Monk gloves not found! You should never see this.");
|
||||
DeleteLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* All of the following functions use the following parameters:
|
||||
*
|
||||
@@ -23,6 +73,69 @@
|
||||
* @param nHand The hand the weapon is wielded in. In the form of
|
||||
* ATTACK_BONUS_ONHAND or ATTACK_BONUS_OFFHAND.
|
||||
*/
|
||||
//:: returns TRUE if the wielded weapon works with the Swashbuckler's class abilities.
|
||||
int GetHasSwashbucklerWeapon(object oPC)
|
||||
{
|
||||
object oWeap = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||||
if (!GetIsObjectValid(oWeap)) return FALSE;
|
||||
|
||||
int nType = GetBaseItemType(oWeap);
|
||||
|
||||
switch (nType)
|
||||
{
|
||||
case BASE_ITEM_DAGGER:
|
||||
case BASE_ITEM_KATAR:
|
||||
case BASE_ITEM_HANDAXE:
|
||||
case BASE_ITEM_KAMA:
|
||||
case BASE_ITEM_KUKRI:
|
||||
case BASE_ITEM_LIGHTHAMMER:
|
||||
case BASE_ITEM_LIGHTMACE:
|
||||
case BASE_ITEM_LIGHT_PICK:
|
||||
case BASE_ITEM_RAPIER:
|
||||
case BASE_ITEM_SHORTSWORD:
|
||||
case BASE_ITEM_SICKLE:
|
||||
case BASE_ITEM_WHIP:
|
||||
case BASE_ITEM_SAI:
|
||||
case BASE_ITEM_SAP:
|
||||
case BASE_ITEM_NUNCHAKU:
|
||||
case BASE_ITEM_GOAD:
|
||||
case BASE_ITEM_ELVEN_LIGHTBLADE:
|
||||
case BASE_ITEM_ELVEN_THINBLADE:
|
||||
case BASE_ITEM_EAGLE_CLAW:
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// Iaijutsu Master allows katana
|
||||
if (GetLevelByClass(CLASS_TYPE_IAIJUTSU_MASTER, oPC) > 0)
|
||||
{
|
||||
if (nType == BASE_ITEM_KATANA) return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//:: returns TRUE if the wielded weapon works with the Champion of Corellon's Elegant Strike.
|
||||
int GetHasCorellonWeapon(object oPC)
|
||||
{
|
||||
object oWeap = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||||
if (!GetIsObjectValid(oWeap)) return FALSE;
|
||||
|
||||
int nType = GetBaseItemType(oWeap);
|
||||
|
||||
switch (nType)
|
||||
{
|
||||
case BASE_ITEM_SCIMITAR:
|
||||
case BASE_ITEM_LONGSWORD:
|
||||
case BASE_ITEM_RAPIER:
|
||||
case BASE_ITEM_ELVEN_COURTBLADE:
|
||||
case BASE_ITEM_ELVEN_LIGHTBLADE:
|
||||
case BASE_ITEM_ELVEN_THINBLADE:
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void DoRacialEquip(object oPC, int nBaseType);
|
||||
|
||||
//return if PC has proficiency in an item
|
||||
@@ -40,13 +153,31 @@ int IsProficient(object oPC, int nBaseItem)
|
||||
|
||||
case BASE_ITEM_CLUB:
|
||||
return GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_CLUB, oPC);
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_WIZARD, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_CLUB, oPC);
|
||||
|
||||
case BASE_ITEM_HEAVYCROSSBOW:
|
||||
return GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_WIZARD, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_HEAVY_XBOW, oPC);
|
||||
|
||||
case BASE_ITEM_LIGHTCROSSBOW:
|
||||
return GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_WIZARD, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_LIGHT_XBOW, oPC);
|
||||
|
||||
case BASE_ITEM_DAGGER:
|
||||
return GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DAGGER, oPC);
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_WIZARD, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DAGGER, oPC);
|
||||
|
||||
case BASE_ITEM_LONGSWORD:
|
||||
return GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oPC)
|
||||
@@ -152,10 +283,17 @@ int IsProficient(object oPC, int nBaseItem)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_ROGUE, oPC);
|
||||
|
||||
case BASE_ITEM_QUARTERSTAFF:
|
||||
return GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oPC)
|
||||
return GetHasFeat(FEAT_WEAPON_PROFICIENCY_QUARTERSTAFF, oPC)
|
||||
||GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_WIZARD, oPC);
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_WIZARD, oPC);
|
||||
|
||||
case BASE_ITEM_MAGICSTAFF:
|
||||
return GetHasFeat(FEAT_WEAPON_PROFICIENCY_QUARTERSTAFF, oPC)
|
||||
||GetHasFeat(FEAT_WEAPON_PROFICIENCY_SIMPLE, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_DRUID, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_WIZARD, oPC);
|
||||
|
||||
case BASE_ITEM_RAPIER:
|
||||
return GetHasFeat(FEAT_WEAPON_PROFICIENCY_RAPIER, oPC)
|
||||
|| GetHasFeat(FEAT_WEAPON_PROFICIENCY_MARTIAL, oPC)
|
||||
@@ -295,167 +433,185 @@ int GetWeaponProfFeatByType(int nBaseType)
|
||||
{
|
||||
switch(nBaseType)
|
||||
{
|
||||
case BASE_ITEM_SHORTSWORD:
|
||||
return FEAT_WEAPON_PROFICIENCY_SHORTSWORD;
|
||||
case BASE_ITEM_CLUB:
|
||||
return FEAT_WEAPON_PROFICIENCY_CLUB;
|
||||
|
||||
case BASE_ITEM_QUARTERSTAFF:
|
||||
return FEAT_WEAPON_PROFICIENCY_QUARTERSTAFF;
|
||||
|
||||
case BASE_ITEM_LONGSWORD:
|
||||
return FEAT_WEAPON_PROFICIENCY_LONGSWORD;
|
||||
case BASE_ITEM_MAGICSTAFF:
|
||||
return FEAT_WEAPON_PROFICIENCY_QUARTERSTAFF;
|
||||
|
||||
case BASE_ITEM_DAGGER:
|
||||
return FEAT_WEAPON_PROFICIENCY_DAGGER;
|
||||
|
||||
case BASE_ITEM_BATTLEAXE:
|
||||
return FEAT_WEAPON_PROFICIENCY_BATTLEAXE;
|
||||
case BASE_ITEM_HEAVYCROSSBOW:
|
||||
return FEAT_WEAPON_PROFICIENCY_HEAVY_XBOW;
|
||||
|
||||
case BASE_ITEM_BASTARDSWORD:
|
||||
return FEAT_WEAPON_PROFICIENCY_BASTARD_SWORD;
|
||||
case BASE_ITEM_LIGHTCROSSBOW:
|
||||
return FEAT_WEAPON_PROFICIENCY_LIGHT_XBOW;
|
||||
|
||||
case BASE_ITEM_SHORTSWORD:
|
||||
return FEAT_WEAPON_PROFICIENCY_SHORTSWORD;
|
||||
|
||||
case BASE_ITEM_LIGHTFLAIL:
|
||||
return FEAT_WEAPON_PROFICIENCY_LIGHT_FLAIL;
|
||||
case BASE_ITEM_LONGSWORD:
|
||||
return FEAT_WEAPON_PROFICIENCY_LONGSWORD;
|
||||
|
||||
case BASE_ITEM_WARHAMMER:
|
||||
return FEAT_WEAPON_PROFICIENCY_WARHAMMER;
|
||||
case BASE_ITEM_BATTLEAXE:
|
||||
return FEAT_WEAPON_PROFICIENCY_BATTLEAXE;
|
||||
|
||||
case BASE_ITEM_LONGBOW:
|
||||
return FEAT_WEAPON_PROFICIENCY_LONGBOW;
|
||||
case BASE_ITEM_BASTARDSWORD:
|
||||
return FEAT_WEAPON_PROFICIENCY_BASTARD_SWORD;
|
||||
|
||||
case BASE_ITEM_LIGHTMACE:
|
||||
return FEAT_WEAPON_PROFICIENCY_LIGHT_MACE;
|
||||
case BASE_ITEM_LIGHTFLAIL:
|
||||
return FEAT_WEAPON_PROFICIENCY_LIGHT_FLAIL;
|
||||
|
||||
case BASE_ITEM_HALBERD:
|
||||
return FEAT_WEAPON_PROFICIENCY_HALBERD;
|
||||
case BASE_ITEM_WARHAMMER:
|
||||
return FEAT_WEAPON_PROFICIENCY_WARHAMMER;
|
||||
|
||||
case BASE_ITEM_SHORTBOW:
|
||||
case BASE_ITEM_LONGBOW:
|
||||
return FEAT_WEAPON_PROFICIENCY_LONGBOW;
|
||||
|
||||
case BASE_ITEM_LIGHTMACE:
|
||||
return FEAT_WEAPON_PROFICIENCY_LIGHT_MACE;
|
||||
|
||||
case BASE_ITEM_HALBERD:
|
||||
return FEAT_WEAPON_PROFICIENCY_HALBERD;
|
||||
|
||||
case BASE_ITEM_SHORTBOW:
|
||||
return FEAT_WEAPON_PROFICIENCY_SHORTBOW;
|
||||
|
||||
case BASE_ITEM_TWOBLADEDSWORD:
|
||||
case BASE_ITEM_TWOBLADEDSWORD:
|
||||
return FEAT_WEAPON_PROFICIENCY_TWO_BLADED_SWORD;
|
||||
|
||||
case BASE_ITEM_GREATSWORD:
|
||||
case BASE_ITEM_GREATSWORD:
|
||||
return FEAT_WEAPON_PROFICIENCY_GREATSWORD;
|
||||
|
||||
case BASE_ITEM_GREATAXE:
|
||||
case BASE_ITEM_GREATAXE:
|
||||
return FEAT_WEAPON_PROFICIENCY_GREATAXE;
|
||||
|
||||
case BASE_ITEM_DART:
|
||||
case BASE_ITEM_DART:
|
||||
return FEAT_WEAPON_PROFICIENCY_DART;
|
||||
|
||||
case BASE_ITEM_DIREMACE:
|
||||
case BASE_ITEM_DIREMACE:
|
||||
return FEAT_WEAPON_PROFICIENCY_DIRE_MACE;
|
||||
|
||||
case BASE_ITEM_DOUBLEAXE:
|
||||
case BASE_ITEM_DOUBLEAXE:
|
||||
return FEAT_WEAPON_PROFICIENCY_DOUBLE_AXE;
|
||||
|
||||
case BASE_ITEM_HEAVYFLAIL:
|
||||
case BASE_ITEM_HEAVYFLAIL:
|
||||
return FEAT_WEAPON_PROFICIENCY_HEAVY_FLAIL;
|
||||
|
||||
case BASE_ITEM_LIGHTHAMMER:
|
||||
case BASE_ITEM_LIGHTHAMMER:
|
||||
return FEAT_WEAPON_PROFICIENCY_LIGHT_HAMMER;
|
||||
|
||||
case BASE_ITEM_HANDAXE:
|
||||
case BASE_ITEM_HANDAXE:
|
||||
return FEAT_WEAPON_PROFICIENCY_HANDAXE;
|
||||
|
||||
case BASE_ITEM_KAMA:
|
||||
case BASE_ITEM_KAMA:
|
||||
return FEAT_WEAPON_PROFICIENCY_KAMA;
|
||||
|
||||
case BASE_ITEM_KATANA:
|
||||
case BASE_ITEM_KATANA:
|
||||
return FEAT_WEAPON_PROFICIENCY_KATANA;
|
||||
|
||||
case BASE_ITEM_KUKRI:
|
||||
case BASE_ITEM_KUKRI:
|
||||
return FEAT_WEAPON_PROFICIENCY_KUKRI;
|
||||
|
||||
case BASE_ITEM_MORNINGSTAR:
|
||||
case BASE_ITEM_MORNINGSTAR:
|
||||
return FEAT_WEAPON_PROFICIENCY_MORNINGSTAR;
|
||||
|
||||
case BASE_ITEM_RAPIER:
|
||||
case BASE_ITEM_RAPIER:
|
||||
return FEAT_WEAPON_PROFICIENCY_RAPIER;
|
||||
|
||||
case BASE_ITEM_SCIMITAR:
|
||||
case BASE_ITEM_SCIMITAR:
|
||||
return FEAT_WEAPON_PROFICIENCY_SCIMITAR;
|
||||
|
||||
case BASE_ITEM_SCYTHE:
|
||||
case BASE_ITEM_SCYTHE:
|
||||
return FEAT_WEAPON_PROFICIENCY_SCYTHE;
|
||||
|
||||
case BASE_ITEM_SHORTSPEAR:
|
||||
case BASE_ITEM_SHORTSPEAR:
|
||||
return FEAT_WEAPON_PROFICIENCY_SHORTSPEAR;
|
||||
|
||||
case BASE_ITEM_SHURIKEN:
|
||||
case BASE_ITEM_SHURIKEN:
|
||||
return FEAT_WEAPON_PROFICIENCY_SHURIKEN;
|
||||
|
||||
case BASE_ITEM_SICKLE:
|
||||
case BASE_ITEM_SICKLE:
|
||||
return FEAT_WEAPON_PROFICIENCY_SICKLE;
|
||||
|
||||
case BASE_ITEM_SLING:
|
||||
case BASE_ITEM_SLING:
|
||||
return FEAT_WEAPON_PROFICIENCY_SLING;
|
||||
|
||||
case BASE_ITEM_THROWINGAXE:
|
||||
case BASE_ITEM_THROWINGAXE:
|
||||
return FEAT_WEAPON_PROFICIENCY_THROWING_AXE;
|
||||
|
||||
case BASE_ITEM_CSLASHWEAPON:
|
||||
case BASE_ITEM_CSLASHWEAPON:
|
||||
return FEAT_WEAPON_PROFICIENCY_CREATURE;
|
||||
|
||||
case BASE_ITEM_CPIERCWEAPON:
|
||||
case BASE_ITEM_CPIERCWEAPON:
|
||||
return FEAT_WEAPON_PROFICIENCY_CREATURE;
|
||||
|
||||
case BASE_ITEM_CBLUDGWEAPON:
|
||||
case BASE_ITEM_CBLUDGWEAPON:
|
||||
return FEAT_WEAPON_PROFICIENCY_CREATURE;
|
||||
|
||||
case BASE_ITEM_CSLSHPRCWEAP:
|
||||
case BASE_ITEM_CSLSHPRCWEAP:
|
||||
return FEAT_WEAPON_PROFICIENCY_CREATURE;
|
||||
|
||||
case BASE_ITEM_TRIDENT:
|
||||
case BASE_ITEM_TRIDENT:
|
||||
return FEAT_WEAPON_PROFICIENCY_TRIDENT;
|
||||
|
||||
case BASE_ITEM_DWARVENWARAXE:
|
||||
case BASE_ITEM_DWARVENWARAXE:
|
||||
return FEAT_WEAPON_PROFICIENCY_DWARVEN_WARAXE;
|
||||
|
||||
case BASE_ITEM_WHIP:
|
||||
case BASE_ITEM_WHIP:
|
||||
return FEAT_WEAPON_PROFICIENCY_WHIP;
|
||||
|
||||
case BASE_ITEM_ELVEN_LIGHTBLADE:
|
||||
case BASE_ITEM_ELVEN_LIGHTBLADE:
|
||||
return FEAT_WEAPON_PROFICIENCY_ELVEN_LIGHTBLADE;
|
||||
|
||||
case BASE_ITEM_ELVEN_THINBLADE:
|
||||
case BASE_ITEM_ELVEN_THINBLADE:
|
||||
return FEAT_WEAPON_PROFICIENCY_ELVEN_THINBLADE;
|
||||
|
||||
case BASE_ITEM_ELVEN_COURTBLADE:
|
||||
case BASE_ITEM_ELVEN_COURTBLADE:
|
||||
return FEAT_WEAPON_PROFICIENCY_ELVEN_COURTBLADE;
|
||||
|
||||
case BASE_ITEM_HEAVY_PICK:
|
||||
case BASE_ITEM_HEAVY_PICK:
|
||||
return FEAT_WEAPON_PROFICIENCY_HEAVY_PICK;
|
||||
|
||||
case BASE_ITEM_LIGHT_PICK:
|
||||
case BASE_ITEM_LIGHT_PICK:
|
||||
return FEAT_WEAPON_PROFICIENCY_LIGHT_PICK;
|
||||
|
||||
case BASE_ITEM_SAI:
|
||||
case BASE_ITEM_SAI:
|
||||
return FEAT_WEAPON_PROFICIENCY_SAI;
|
||||
|
||||
case BASE_ITEM_NUNCHAKU:
|
||||
case BASE_ITEM_NUNCHAKU:
|
||||
return FEAT_WEAPON_PROFICIENCY_NUNCHAKU;
|
||||
|
||||
case BASE_ITEM_FALCHION:
|
||||
case BASE_ITEM_FALCHION:
|
||||
return FEAT_WEAPON_PROFICIENCY_FALCHION;
|
||||
|
||||
case BASE_ITEM_SAP:
|
||||
case BASE_ITEM_SAP:
|
||||
return FEAT_WEAPON_PROFICIENCY_SAP;
|
||||
|
||||
case BASE_ITEM_KATAR:
|
||||
case BASE_ITEM_KATAR:
|
||||
return FEAT_WEAPON_PROFICIENCY_KATAR;
|
||||
|
||||
case BASE_ITEM_HEAVY_MACE:
|
||||
case BASE_ITEM_HEAVY_MACE:
|
||||
return FEAT_WEAPON_PROFICIENCY_HEAVY_MACE;
|
||||
|
||||
case BASE_ITEM_MAUL:
|
||||
case BASE_ITEM_MAUL:
|
||||
return FEAT_WEAPON_PROFICIENCY_MAUL;
|
||||
|
||||
case BASE_ITEM_DOUBLE_SCIMITAR:
|
||||
case BASE_ITEM_DOUBLE_SCIMITAR:
|
||||
return FEAT_WEAPON_PROFICIENCY_DOUBLE_SCIMITAR;
|
||||
|
||||
case BASE_ITEM_GOAD:
|
||||
case BASE_ITEM_GOAD:
|
||||
return FEAT_WEAPON_PROFICIENCY_GOAD;
|
||||
|
||||
case BASE_ITEM_EAGLE_CLAW:
|
||||
case BASE_ITEM_EAGLE_CLAW:
|
||||
return FEAT_WEAPON_PROFICIENCY_EAGLE_CLAW;
|
||||
|
||||
default:
|
||||
return FEAT_WEAPON_PROFICIENCY_SIMPLE;
|
||||
default:
|
||||
return FEAT_WEAPON_PROFICIENCY_SIMPLE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -720,6 +876,7 @@ int IsMeleeWeapon(int nBaseItemType)
|
||||
case BASE_ITEM_CLOAK:
|
||||
case BASE_ITEM_CRAFTED_ROD:
|
||||
case BASE_ITEM_CRAFTED_STAFF:
|
||||
case BASE_ITEM_CRAFTED_SCEPTER:
|
||||
case BASE_ITEM_CRAFTMATERIALMED:
|
||||
case BASE_ITEM_CRAFTMATERIALSML:
|
||||
case BASE_ITEM_CREATUREITEM:
|
||||
|
||||
@@ -262,7 +262,7 @@ const int IP_CONST_FEAT_WEAPON_PROFICIENCY_LIGHT_LANCE = 4638;
|
||||
const int IP_CONST_FEAT_WEAPON_PROFICIENCY_HEAVY_PICK = 4639;
|
||||
const int IP_CONST_FEAT_WEAPON_PROFICIENCY_LIGHT_PICK = 4640;
|
||||
const int IP_CONST_FEAT_WEAPON_PROFICIENCY_SAI = 4641;
|
||||
const int IP_CONST_FEAT_WEAPON_PROFICIENCY_NUNCHUKU = 4642;
|
||||
const int IP_CONST_FEAT_WEAPON_PROFICIENCY_NUNCHAKU = 4642;
|
||||
const int IP_CONST_FEAT_WEAPON_PROFICIENCY_FALCHION = 4643;
|
||||
const int IP_CONST_FEAT_WEAPON_PROFICIENCY_SAP = 4644;
|
||||
const int IP_CONST_FEAT_WEAPON_PROFICIENCY_KATAR = 4645;
|
||||
@@ -1206,11 +1206,12 @@ const int IP_CONST_FEAT_REGENERATION_5 = 24820;
|
||||
const int IP_CONST_FEAT_SCENT = 24821;
|
||||
const int IP_CONST_FEAT_GIANT_RACIAL_TYPE = 24822;
|
||||
|
||||
const int IP_CONST_FEAT_TEMPLATE_ARCHLICH_MARKER = 16401; //:: Archlich
|
||||
const int IP_CONST_FEAT_TEMPLATE_TURN_UNDEAD = 16402;
|
||||
const int IP_CONST_FEAT_TEMPLATE_PROJECTION = 24823;
|
||||
const int IP_CONST_FEAT_TEMPLATE_END_PROJECTION = 24824;
|
||||
const int IP_CONST_FEAT_TEMPLATE_ANIMATE_DEAD = 24825;
|
||||
const int IP_CONST_FEAT_TEMPLATE_ARCHLICH_MARKER = 16401; //:: Archlich
|
||||
const int IP_CONST_FEAT_TEMPLATE_TURN_UNDEAD = 16402;
|
||||
const int IP_CONST_FEAT_TEMPLATE_BAELNORN_MARKER = 16409; //:: Baelnorn
|
||||
const int IP_CONST_FEAT_TEMPLATE_PROJECTION = 24823;
|
||||
const int IP_CONST_FEAT_TEMPLATE_END_PROJECTION = 24824;
|
||||
const int IP_CONST_FEAT_TEMPLATE_ANIMATE_DEAD = 24825;
|
||||
const int IP_CONST_FEAT_TEMPLATE_SAINT_SLA_BLESS = 16403; //:: Saint
|
||||
//const int IP_CONST_FEAT_TEMPLATE_SAINT_SLA_GUIDANCE = 16404;
|
||||
const int IP_CONST_FEAT_TEMPLATE_SAINT_SLA_RESISTANCE = 16405;
|
||||
|
||||
@@ -29,6 +29,10 @@ const int BASE_ITEM_CRAFTED_STAFF = 201;
|
||||
const int BASE_ITEM_ELVEN_LIGHTBLADE = 202;
|
||||
const int BASE_ITEM_ELVEN_THINBLADE = 203;
|
||||
const int BASE_ITEM_ELVEN_COURTBLADE = 204;
|
||||
const int BASE_ITEM_CRAFTED_SCEPTER = 249;
|
||||
const int BASE_ITEM_CRAFTED_VIAL = 250;
|
||||
const int BASE_ITEM_MUNDANE_HERB = 252;
|
||||
const int BASE_ITEM_INFUSED_HERB = 253;
|
||||
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Player Health Const
|
||||
|
||||
615
src/include/prc_nui_com_inc.nss
Normal file
615
src/include/prc_nui_com_inc.nss
Normal file
@@ -0,0 +1,615 @@
|
||||
#include "prc_nui_consts"
|
||||
#include "inc_newspellbook"
|
||||
#include "psi_inc_psifunc"
|
||||
#include "inc_lookups"
|
||||
#include "nw_inc_nui"
|
||||
#include "tob_inc_tobfunc"
|
||||
|
||||
//
|
||||
// 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);
|
||||
|
||||
//
|
||||
// GetTrueClassType
|
||||
// Gets the true class Id for a provided class Id, mostly for RHD and for
|
||||
// ToB prestige classes
|
||||
//
|
||||
// Arguments:
|
||||
// nClass:int classId
|
||||
//
|
||||
// Returns:
|
||||
// int the true classId based off nClass
|
||||
//
|
||||
int GetTrueClassType(int nClass, object oPC=OBJECT_SELF);
|
||||
|
||||
void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0, int nClass=0);
|
||||
|
||||
void CallSpellUnlevelScript(object oPC, int nClass, int nLevel);
|
||||
void ClearSpellDescriptionNUI(object oPlayer=OBJECT_SELF);
|
||||
void RemoveIPFeat(object oPC, int ipFeatID);
|
||||
|
||||
void CallSpellUnlevelScript(object oPC, int nClass, int nLevel)
|
||||
{
|
||||
SetScriptParam("UnLevel_ClassChoice", IntToString(nClass));
|
||||
SetScriptParam("UnLevel_LevelChoice", IntToString(nLevel));
|
||||
ExecuteScript("prc_unlvl_script", oPC);
|
||||
}
|
||||
|
||||
void RemoveIPFeat(object oPC, int ipFeatID)
|
||||
{
|
||||
object oSkin = GetPCSkin(oPC);
|
||||
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)
|
||||
{
|
||||
if (GetItemPropertySubType(ipTest) == ipFeatID)
|
||||
{
|
||||
if(DEBUG) DoDebug("_ManeuverRecurseRemoveArray(): Removing bonus feat itemproperty:\n" + DebugIProp2Str(ipTest));
|
||||
// If so, remove it
|
||||
RemoveItemProperty(oSkin, ipTest);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ipTest = GetNextItemProperty(oSkin);
|
||||
}
|
||||
}
|
||||
|
||||
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));
|
||||
// however if no featId was found use the spell's icon instead
|
||||
if (!nFeatID)
|
||||
return JsonString(Get2DACache("spells", "IconResRef", 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);
|
||||
}
|
||||
|
||||
int GetTrueClassType(int nClass, object oPC=OBJECT_SELF)
|
||||
{
|
||||
if (nClass == CLASS_TYPE_JADE_PHOENIX_MAGE
|
||||
|| nClass == CLASS_TYPE_MASTER_OF_NINE
|
||||
|| nClass == CLASS_TYPE_DEEPSTONE_SENTINEL
|
||||
|| nClass == CLASS_TYPE_BLOODCLAW_MASTER
|
||||
|| nClass == CLASS_TYPE_RUBY_VINDICATOR
|
||||
|| nClass == CLASS_TYPE_ETERNAL_BLADE
|
||||
|| nClass == CLASS_TYPE_SHADOW_SUN_NINJA)
|
||||
{
|
||||
int trueClass = GetPrimaryBladeMagicClass(oPC);
|
||||
return trueClass;
|
||||
}
|
||||
|
||||
if ((nClass == CLASS_TYPE_SHAPECHANGER
|
||||
&& GetRacialType(oPC) == RACIAL_TYPE_ARANEA)
|
||||
|| (nClass == CLASS_TYPE_OUTSIDER
|
||||
&& GetRacialType(oPC) == RACIAL_TYPE_RAKSHASA)
|
||||
|| (nClass == CLASS_TYPE_ABERRATION
|
||||
&& GetRacialType(oPC) == RACIAL_TYPE_DRIDER)
|
||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPC) == RACIAL_TYPE_ARKAMOI)
|
||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPC) == RACIAL_TYPE_HOBGOBLIN_WARSOUL)
|
||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPC) == RACIAL_TYPE_REDSPAWN_ARCANISS)
|
||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPC) == RACIAL_TYPE_MARRUTACT))
|
||||
return CLASS_TYPE_SORCERER;
|
||||
if (nClass == CLASS_TYPE_FEY
|
||||
&& GetRacialType(oPC) == RACIAL_TYPE_GLOURA)
|
||||
return CLASS_TYPE_BARD;
|
||||
|
||||
return nClass;
|
||||
}
|
||||
|
||||
171
src/include/prc_nui_consts.nss
Normal file
171
src/include/prc_nui_consts.nss
Normal file
@@ -0,0 +1,171 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: NUI Constants
|
||||
//:: prc_nui_consts
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
This file holds all the constants used by the various PRC NUI scripts.
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Rakiov
|
||||
//:: Created On: 24.05.2005
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
const int NUI_PAYLOAD_BUTTON_LEFT_CLICK = 0;
|
||||
const int NUI_PAYLOAD_BUTTON_MIDDLE_CLICK = 1;
|
||||
const int NUI_PAYLOAD_BUTTON_RIGHT_CLICK = 2;
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// //
|
||||
// NUI Spellbook //
|
||||
// //
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
// This is the NUI Spellbook window ID
|
||||
const string PRC_SPELLBOOK_NUI_WINDOW_ID = "prcSpellbookNui";
|
||||
|
||||
// This is the base Id for the Class buttons in the NUI Spellbook, the ID will
|
||||
// have the ClassID attached to it (i.e. spellbookClassButton_123)
|
||||
const string PRC_SPELLBOOK_NUI_CLASS_BUTTON_BASEID = "spellbookClassButton_";
|
||||
|
||||
// This is the base Id for the Spell Circle buttons in the NUI Spellbook, the ID will
|
||||
// have the Circle attached to it (i.e. spellbookCircleButton__6)
|
||||
const string PRC_SPELLBOOK_NUI_CIRCLE_BUTTON_BASEID = "spellbookCircleButton_";
|
||||
|
||||
// This is the base Id for the Spell Buttons in the NUI Spellbook, the ID will
|
||||
// have the SpellbookId (the row of the class's spell's 2da or equivalent)
|
||||
// attached to it (i.e. spellbookSpellButton_6)
|
||||
const string PRC_SPELLBOOK_NUI_SPELL_BUTTON_BASEID = "spellbookSpellButton_";
|
||||
|
||||
// This is the base Id for the Meta Feat buttons in the NUI Spellbook, the ID will
|
||||
// have the FeatID attached to it (i.e. spellbookMetaButton_12345)
|
||||
const string PRC_SPELLBOOK_NUI_META_BUTTON_BASEID = "spellbookMetaButton_";
|
||||
|
||||
// This is the selected ClassID var used to store what class was selected to the Player
|
||||
// locally
|
||||
const string PRC_SPELLBOOK_SELECTED_CLASSID_VAR = "prcSpellbookSelectedClassID";
|
||||
|
||||
// This is the selected Circle var used to store what spell circle was selected
|
||||
// to the Player locally
|
||||
const string PRC_SPELLBOOK_SELECTED_CIRCLE_VAR = "prcSpellbookSelectedCircle";
|
||||
|
||||
// This is the Spellbook NUI geomeotry var, used to allow the location and sizing
|
||||
// of the NUI to be remembered if it is ever rerendered.
|
||||
const string PRC_SPELLBOOK_NUI_GEOMETRY_VAR = "sbNuiGeometry";
|
||||
|
||||
// This is the Selected SpellID Var, used to tell the OnTarget script what spell
|
||||
// we are using after manual targetting
|
||||
const string NUI_SPELLBOOK_SELECTED_SPELLID_VAR = "NUI_Spellbook_SpellId";
|
||||
|
||||
// This is the Selected FeatID Var, used to tell the OnTarget script what feat
|
||||
// we are using after manual targetting
|
||||
const string NUI_SPELLBOOK_SELECTED_FEATID_VAR = "NUI_Spellbook_FeatID";
|
||||
|
||||
// This is the Selected SubSpellID Var, used in conjuncture with the Selected FeatID
|
||||
// to allow radial spells to work (it needs the master spell's featID and the sub spell's
|
||||
// SpellID for it to work.
|
||||
const string NUI_SPELLBOOK_SELECTED_SUBSPELL_SPELLID_VAR = "NUI_Spellbook_SubSpellID";
|
||||
|
||||
// This is the OnTarget action var saved to the player locally to say if we are
|
||||
// using the NUI Spellbook spell or not.
|
||||
const string NUI_SPELLBOOK_ON_TARGET_ACTION_VAR = "ONPLAYERTARGET_ACTION";
|
||||
|
||||
// This is a Boolean to tell the target script if the selected feat is a persoanl feat
|
||||
// and can only be used on the executing object.
|
||||
const string NUI_SPELLBOOK_ON_TARGET_IS_PERSONAL_FEAT = "NUI_Spellbook_IsPersonalFeat";
|
||||
|
||||
const string NUI_SPELL_DESCRIPTION_WINDOW_ID = "NUI_Spell_Description";
|
||||
const string NUI_SPELL_DESCRIPTION_OK_BUTTON = "NUIDescriptionOKButton";
|
||||
|
||||
// This is the limit of how many spell buttons we can have in a row before we
|
||||
// need to start a new row on the NUI Spellbook.
|
||||
const int NUI_SPELLBOOK_SPELL_BUTTON_LENGTH = 9;
|
||||
|
||||
const string NUI_SPELLBOOK_BINDER_DICTIONARY_CACHE_VAR = "NUI_Spellbook_GetBinderSpellToFeatDictionaryCache";
|
||||
const string NUI_SPELLBOOK_CLASS_STANCES_CACHE_BASE_VAR = "NUI_Spellbook_GetToBStanceSpellListCache_";
|
||||
const string NUI_SPELLBOOK_CLASS_SHAPES_CACHE_BASE_VAR = "NUI_Spellbook_GetInvokerShapeSpellListCache_";
|
||||
const string NUI_SPELLBOOK_CLASS_ESSENCE_CACHE_BASE_VAR = "NUISpellbookClassEssence_";
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// //
|
||||
// NUI Power Attack //
|
||||
// //
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
// The Window ID for the Power Attack NUI
|
||||
const string NUI_PRC_POWER_ATTACK_WINDOW = "nui_prc_power_attack_window";
|
||||
|
||||
// LocalVar for the geometry of the Power Attack NUI window
|
||||
const string NUI_PRC_PA_GEOMETRY_VAR = "paNuiGeometry";
|
||||
|
||||
// Event For Left "-" button of the Power Attack NUI
|
||||
const string NUI_PRC_PA_LEFT_BUTTON_EVENT = "nui_prc_pa_left_button_event";
|
||||
// Event For Right "+" Button of the Power Attack NUI
|
||||
const string NUI_PRC_PA_RIGHT_BUTTON_EVENT = "nui_prc_pa_right_button_event";
|
||||
|
||||
// Bind for Text of the Power Attack NUI saying what the current Power Attack level is
|
||||
const string NUI_PRC_PA_TEXT_BIND = "nui_prc_pa_text_bind";
|
||||
// Left Button Enabled Bind for Power Attack NUI
|
||||
const string NUI_PRC_PA_LEFT_BUTTON_ENABLED_BIND = "leftButtonEnabled";
|
||||
// Right Button Enabled Bind for Power Attack NUI
|
||||
const string NUI_PRC_PA_RIGHT_BUTTON_ENABLED_BIND = "rightButtonEnabled";
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// //
|
||||
// NUI Level Up //
|
||||
// //
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
const string NUI_LEVEL_UP_WINDOW_ID = "prcLevelUpNui";
|
||||
|
||||
const string NUI_LEVEL_UP_SPELL_CIRCLE_BUTTON_BASEID = "NuiLevelUpCircleButton_";
|
||||
const string NUI_LEVEL_UP_SPELL_BUTTON_BASEID = "NuiLevelUpSpellButton_";
|
||||
const string NUI_LEVEL_UP_SPELL_DISABLED_BUTTON_BASEID = "NuiLevelUpDisabledSpellButton_";
|
||||
const string NUI_LEVEL_UP_SPELL_CHOSEN_BUTTON_BASEID = "NuiLevelUpChosenSpellButton_";
|
||||
const string NUI_LEVEL_UP_SPELL_CHOSEN_DISABLED_BUTTON_BASEID = "NuiLevelUpDisabledChosenSpellButton_";
|
||||
const string NUI_LEVEL_UP_DONE_BUTTON = "NuiLevelUpDoneButton";
|
||||
const string NUI_LEVEL_UP_RESET_BUTTON = "NuiLevelUpResetButton";
|
||||
|
||||
const string NUI_LEVEL_UP_SELECTED_CLASS_VAR = "NUILevelUpSelectedClass";
|
||||
const string NUI_LEVEL_UP_SELECTED_CIRCLE_VAR = "NUILevelUpSelectedCircle";
|
||||
const string NUI_LEVEL_UP_KNOWN_SPELLS_VAR = "NUILevelUpKnownSpells";
|
||||
const string NUI_LEVEL_UP_CHOSEN_SPELLS_VAR = "NUILevelUpChosenSpells";
|
||||
const string NUI_LEVEL_UP_EXPANDED_KNOW_LIST_VAR = "NUILevelUpExpKnowList";
|
||||
const string NUI_LEVEL_UP_POWER_LIST_VAR = "NUILevelUpPowerList";
|
||||
const string NUI_LEVEL_UP_DISCIPLINE_INFO_VAR = "GetDisciplineInfoObjectCache_";
|
||||
const string NUI_LEVEL_UP_SPELLID_LIST_VAR = "NUILevelUpSpellIDList_";
|
||||
const string NUI_LEVEL_UP_REMAINING_CHOICES_CACHE_VAR = "NUIRemainingChoicesCache";
|
||||
const string NUI_LEVEL_UP_RELEARN_LIST_VAR = "NUILevelUpRelearnList";
|
||||
const string NUI_LEVEL_UP_ARCHIVIST_NEW_SPELLS_LIST_VAR = "NUILevelUpArchivistNewSpellsList";
|
||||
|
||||
const string NUI_LEVEL_UP_EXPANDED_CHOICES_VAR = "NUIExpandedChoices";
|
||||
const string NUI_LEVEL_UP_EPIC_EXPANDED_CHOICES_VAR = "NUIEpicExpandedChoices";
|
||||
|
||||
const int NUI_LEVEL_UP_MANEUVER_PREREQ_LIMIT = 6;
|
||||
|
||||
const string NUI_LEVEL_UP_MANEUVER_TOTAL = "ManeuverTotal";
|
||||
const string NUI_LEVEL_UP_STANCE_TOTAL = "StanceTotal";
|
||||
|
||||
const string NUI_LEVEL_UP_SPELLBOOK_OBJECT_CACHE_VAR = "GetSpellListObjectCache_";
|
||||
const string NUI_LEVEL_UP_KNOWN_INVOCATIONS_CACHE_VAR = "GetInvokerKnownListObjectCache_";
|
||||
|
||||
const string NUI_SPELL_DESCRIPTION_FEATID_VAR = "NUISpellDescriptionFeatID";
|
||||
const string NUI_SPELL_DESCRIPTION_CLASSID_VAR = "NUISpellDescriptionClassID";
|
||||
const string NUI_SPELL_DESCRIPTION_SPELLID_VAR = "NUISpellDescriptionSpellID";
|
||||
const string NUI_SPELL_DESCRIPTION_REAL_SPELLID_VAR = "NUISpellDescriptionRealSpellID";
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// //
|
||||
// Spell Duration NUI //
|
||||
// //
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
const string DURATION_NUI_WINDOW_ID = "DurationNUI";
|
||||
const string NUI_DURATION_MANUALLY_OPENED_PARAM = "DurationNUIManuallyOpenedParam";
|
||||
const string NUI_DURATION_NO_LOOP_PARAM = "DurationNUINoLoopParam";
|
||||
const string NUI_DURATION_TRACKED_SPELLS = "durationNUI_trackedSpellList";
|
||||
const string NUI_SPELL_DURATION_BASE_BIND = "durationNUI_durationSpellId";
|
||||
const string NUI_SPELL_DURATION_SPELLID_BASE_CANCEL_BUTTON = "NuiDurationCancelButtonSpellID";
|
||||
3316
src/include/prc_nui_lv_inc.nss
Normal file
3316
src/include/prc_nui_lv_inc.nss
Normal file
File diff suppressed because it is too large
Load Diff
845
src/include/prc_nui_sb_inc.nss
Normal file
845
src/include/prc_nui_sb_inc.nss
Normal file
@@ -0,0 +1,845 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: PRC Spellbook Script
|
||||
//:: prc_nui_sb_inc
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
This is the script that handles some backend work for the PRC Spellbook
|
||||
NUI View
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Rakiov
|
||||
//:: Created On: 24.05.2005
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "prc_nui_com_inc"
|
||||
|
||||
//
|
||||
// GetSpellListForCircle
|
||||
// Gets the spell list for a specified class at the specified circle.
|
||||
//
|
||||
// Arguments:
|
||||
// oPlayer:object the player
|
||||
// nClass:int the ClassID
|
||||
// circle:int the circle we want to grab for
|
||||
//
|
||||
// Returns:
|
||||
// json:Array<int> a list of all the spellIDs of the given circle
|
||||
//
|
||||
json GetSpellListForCircle(object oPlayer, int nClass, int circle);
|
||||
|
||||
//
|
||||
// GetSupportedNUISpellbookClasses
|
||||
// Gets the list of support PRC classes that can use the NUi spellbook that
|
||||
// the player has.
|
||||
//
|
||||
// Arguments:
|
||||
// oPlayer:object the player this is being determined for
|
||||
//
|
||||
// Returns:
|
||||
// json:int list of class ids that have the player has that can use the
|
||||
// NUI spellbook.
|
||||
//
|
||||
json GetSupportedNUISpellbookClasses(object oPlayer);
|
||||
|
||||
//
|
||||
// IsSpellKnown
|
||||
// Returns whether the player with the given class, spell file, and spellbook id
|
||||
// knows the spell or not
|
||||
//
|
||||
// Arguments:
|
||||
// oPlayer;Object the player
|
||||
// nClass:int the class ID
|
||||
// spellId:int the spell ID to check
|
||||
//
|
||||
// Returns:
|
||||
// int:Boolean TRUE if spell is known, FALSE otherwise
|
||||
//
|
||||
int IsSpellKnown(object oPlayer, int nClass, int spellId);
|
||||
|
||||
//
|
||||
// IsClassAllowedToUseNUISpellbook
|
||||
// Takes a player and a classId and determines if thee class is allowed to
|
||||
// be using the NUI spellbook.
|
||||
//
|
||||
// Arguments:
|
||||
// oPlayer:Object the player
|
||||
// nClass:int the ClassID
|
||||
//
|
||||
// Returns:
|
||||
// int:Boolean TRUE if allowed to use the spellbook, FALSE otherwise
|
||||
//
|
||||
int IsClassAllowedToUseNUISpellbook(object oPlayer, int nClass);
|
||||
|
||||
//
|
||||
// CanClassUseMetamagicFeats
|
||||
// Given a class id determines if it is allowed to use the Metamagic feats
|
||||
//
|
||||
// Arguments:
|
||||
// nClass:int the ClassID
|
||||
//
|
||||
// Returns:
|
||||
// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise
|
||||
//
|
||||
int CanClassUseMetamagicFeats(int nClass);
|
||||
|
||||
//
|
||||
// CanClassUseSuddenMetamagicFeats
|
||||
// Given a class id determines if it is allowed to use the Sudden Metamagic feats
|
||||
//
|
||||
// Arguments:
|
||||
// nClass:int the ClassID
|
||||
//
|
||||
// Returns:
|
||||
// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise
|
||||
//
|
||||
int CanClassUseSuddenMetamagicFeats(int nClass);
|
||||
|
||||
//
|
||||
// CanClassUseMetaPsionicFeats
|
||||
// Given a class id determines if it is allowed to use the MetaPsionic feats
|
||||
//
|
||||
// Arguments:
|
||||
// nClass:int the ClassID
|
||||
//
|
||||
// Returns:
|
||||
// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise
|
||||
//
|
||||
int CanClassUseMetaPsionicFeats(int nClass);
|
||||
|
||||
//
|
||||
// CanClassUseMetaMysteryFeats
|
||||
// Given a class id determines if it is allowed to use the MetaMystery feats
|
||||
//
|
||||
// Arguments:
|
||||
// nClass:int the ClassID
|
||||
//
|
||||
// Returns:
|
||||
// int:Boolean TRUE if allowed to use the set of feats, FALSE otherwise
|
||||
//
|
||||
int CanClassUseMetaMysteryFeats(int nClass);
|
||||
|
||||
//
|
||||
// GetMetaMagicFeatList
|
||||
// Gets the list of MetaMagic featIDs
|
||||
//
|
||||
// Returns:
|
||||
// json:Array<int> the list of FeatIDs associated with the meta feats
|
||||
//
|
||||
json GetMetaMagicFeatList();
|
||||
|
||||
//
|
||||
// GetSuddenMetaMagicFeatList
|
||||
// Gets the list of Sudden MetaMagic featIDs
|
||||
//
|
||||
// Returns:
|
||||
// json:Array<int> the list of FeatIDs associated with the meta feats
|
||||
//
|
||||
json GetSuddenMetaMagicFeatList();
|
||||
|
||||
//
|
||||
// GetMetaPsionicFeatList
|
||||
// Gets the list of MetaPsionic featIDs
|
||||
//
|
||||
// Returns:
|
||||
// json:Array<int> the list of FeatIDs associated with the meta feats
|
||||
//
|
||||
json GetMetaPsionicFeatList();
|
||||
|
||||
//
|
||||
// GetMetaMagicMysteryList
|
||||
// Gets the list of MetaMystery featIDs
|
||||
//
|
||||
// Returns:
|
||||
// json:Array<int> the list of FeatIDs associated with the meta feats
|
||||
//
|
||||
json GetMetaMysteryFeatList();
|
||||
|
||||
//
|
||||
// GetTrueClassIfRHD
|
||||
// Checks to make sure if the provided RHD class and player's race
|
||||
// match up to give them their proper spell caster class (ie Glouras have
|
||||
// bard spells and thus should be treated like a bard class)
|
||||
//
|
||||
// Arguments:
|
||||
// oPlayer:object the player
|
||||
// nClass:int the ClassID
|
||||
//
|
||||
// Returns:
|
||||
// int the true ClassID to use, otherwise nClass
|
||||
//
|
||||
int GetTrueClassIfRHD(object oPlayer, int nClass);
|
||||
|
||||
//
|
||||
// ShouldAddSpell
|
||||
// Given a spellId and a class, determines if the spell should be added to the
|
||||
// spellbook (as some are added in it's own special row or for other reasons)
|
||||
//
|
||||
// Arguments:
|
||||
// nClass:int the ClassID
|
||||
// spellId:int the SpellID
|
||||
// oPlayer:object the player
|
||||
//
|
||||
// Returns:
|
||||
// int:Boolean TRUE if the spell should be added, FALSE otherwise
|
||||
//
|
||||
int ShouldAddSpell(int nClass, int spellId, object oPlayer=OBJECT_SELF);
|
||||
|
||||
//
|
||||
// GetToBStanceSpellList
|
||||
// Gets the ToB Stance Spell List for the given class
|
||||
//
|
||||
// Arguments:
|
||||
// nClass:int ClassID
|
||||
// oPlayer:object the player
|
||||
//
|
||||
// Returns:
|
||||
// json:Array<Int> the list of stances' SpellIDs
|
||||
//
|
||||
json GetToBStanceSpellList(int nClass, object oPlayer=OBJECT_SELF);
|
||||
|
||||
//
|
||||
// GetInvokerShapeSpellList
|
||||
// Gets the Invoker Shapes Spell List for the given class
|
||||
//
|
||||
// Arguments:
|
||||
// nClass:int ClassID
|
||||
// oPlayer:object the player
|
||||
//
|
||||
// Returns:
|
||||
// json:Array<Int> the list of shapes' SpellIDs
|
||||
//
|
||||
json GetInvokerShapeSpellList(int nClass, object oPlayer=OBJECT_SELF);
|
||||
|
||||
//
|
||||
// GetInvokerEssenceSpellList
|
||||
// Gets the Invoker Essences Spell List for the given class
|
||||
//
|
||||
// Arguments:
|
||||
// nClass:int ClassID
|
||||
// oPlayer:object the player
|
||||
//
|
||||
// Returns:
|
||||
// json:Array<Int> the list of essences' SpellIDs
|
||||
//
|
||||
json GetInvokerEssenceSpellList(int nClass, object oPlayer=OBJECT_SELF);
|
||||
|
||||
//
|
||||
// JsonArrayContainsInt
|
||||
// A helper function that takes a json array list and sees if the int item is within i
|
||||
//
|
||||
// Arguments:
|
||||
// list:json:Array<Int> the list of ints
|
||||
// item:int the item we are looking for
|
||||
//
|
||||
// Returns:
|
||||
// int:Boolean TRUE if item is found, FALSE otherwise
|
||||
//
|
||||
int JsonArrayContainsInt(json list, int item);
|
||||
|
||||
//
|
||||
// IsSpellbookNUIOpen
|
||||
// Checks to see if the Spellbook NUI is open on a given player.
|
||||
//
|
||||
// Arguments:
|
||||
// oPC:object the player
|
||||
//
|
||||
// Returns:
|
||||
// int:Boolean TRUE if window is open, FALSE otherwise
|
||||
//
|
||||
int IsSpellbookNUIOpen(object oPC);
|
||||
|
||||
json GetSpellListForCircle(object oPlayer, int nClass, int circle)
|
||||
{
|
||||
json retValue = JsonArray();
|
||||
string sFile = GetClassSpellbookFile(nClass);
|
||||
int totalSpells;
|
||||
json binderDictKeys;
|
||||
//Special case for Binder since they don't have their own spellbook 2da
|
||||
if (nClass == CLASS_TYPE_BINDER)
|
||||
{
|
||||
json binderDict = GetBinderSpellToFeatDictionary(oPlayer);
|
||||
|
||||
// we loop through the list of SpellIDs
|
||||
binderDictKeys = JsonObjectKeys(binderDict);
|
||||
totalSpells = JsonGetLength(binderDictKeys);
|
||||
}
|
||||
else
|
||||
totalSpells = Get2DARowCount(sFile);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < totalSpells; i++)
|
||||
{
|
||||
int currentSpell;
|
||||
if (nClass == CLASS_TYPE_BINDER)
|
||||
currentSpell = StringToInt(JsonGetString(JsonArrayGet(binderDictKeys, i)));
|
||||
else
|
||||
currentSpell = StringToInt(Get2DACache(sFile, "SpellID", i));
|
||||
|
||||
if (ShouldAddSpell(nClass, currentSpell, oPlayer))
|
||||
{
|
||||
string sSpellLevel = Get2DACache("spells", "Innate", currentSpell);
|
||||
int iSpellLevel = StringToInt(sSpellLevel);
|
||||
|
||||
if (nClass == CLASS_TYPE_BINDER && IsSpellKnown(oPlayer, nClass, currentSpell))
|
||||
{
|
||||
retValue = JsonArrayInsert(retValue, JsonInt(currentSpell));
|
||||
}
|
||||
else if ((iSpellLevel == circle && IntToString(iSpellLevel) == sSpellLevel))
|
||||
{
|
||||
// We add the spell if it is known and is not a radial master spell (since those don't work)
|
||||
if (IsSpellKnown(oPlayer, nClass, currentSpell))
|
||||
retValue = JsonArrayInsert(retValue, JsonInt(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return retValue;
|
||||
}
|
||||
|
||||
int ShouldAddSpell(int nClass, int spellId, object oPlayer=OBJECT_SELF)
|
||||
{
|
||||
int isRadialMasterSpell = StringToInt(Get2DACache("spells", "SubRadSpell1", spellId));
|
||||
// We don't add radial master spells
|
||||
if (isRadialMasterSpell)
|
||||
return FALSE;
|
||||
// we don't add essences and shapes
|
||||
if (nClass == CLASS_TYPE_WARLOCK
|
||||
|| nClass == CLASS_TYPE_DRAGONFIRE_ADEPT
|
||||
|| nClass == CLASS_TYPE_DRAGON_SHAMAN)
|
||||
{
|
||||
json ignoreList = GetInvokerShapeSpellList(nClass, oPlayer);
|
||||
if (JsonArrayContainsInt(ignoreList, spellId))
|
||||
return FALSE;
|
||||
ignoreList = GetInvokerEssenceSpellList(nClass, oPlayer);
|
||||
if (JsonArrayContainsInt(ignoreList, spellId))
|
||||
return FALSE;
|
||||
}
|
||||
// we don't add stances
|
||||
if (nClass == CLASS_TYPE_WARBLADE
|
||||
|| nClass == CLASS_TYPE_SWORDSAGE
|
||||
|| nClass == CLASS_TYPE_CRUSADER)
|
||||
{
|
||||
json ignoreList = GetToBStanceSpellList(nClass, oPlayer);
|
||||
if (JsonArrayContainsInt(ignoreList, spellId))
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
json GetSupportedNUISpellbookClasses(object oPlayer)
|
||||
{
|
||||
json retValue = JsonArray();
|
||||
int i = 1;
|
||||
while(i >= 1)
|
||||
{
|
||||
int classId = GetClassByPosition(i, oPlayer);
|
||||
if (classId != CLASS_TYPE_INVALID)
|
||||
{
|
||||
if (IsClassAllowedToUseNUISpellbook(oPlayer, classId))
|
||||
{
|
||||
classId = GetTrueClassIfRHD(oPlayer, classId);
|
||||
retValue = JsonArrayInsert(retValue, JsonInt(classId));
|
||||
}
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
i = -1;
|
||||
}
|
||||
}
|
||||
|
||||
return retValue;
|
||||
}
|
||||
|
||||
int IsSpellKnown(object oPlayer, int nClass, int spellId)
|
||||
{
|
||||
// special case for Binders since they don't have a spell book 2da.
|
||||
if (nClass == CLASS_TYPE_BINDER)
|
||||
{
|
||||
json binderDict = GetBinderSpellToFeatDictionary(oPlayer);
|
||||
int featID = JsonGetInt(JsonObjectGet(binderDict, IntToString(spellId)));
|
||||
return GetHasFeat(featID, oPlayer);
|
||||
}
|
||||
|
||||
int currentSpell = spellId;
|
||||
int masterSpell = StringToInt(Get2DACache("spells", "Master", currentSpell));
|
||||
if (masterSpell) // If this is not 0 then this is a radial spell, check the radial master
|
||||
currentSpell = masterSpell;
|
||||
|
||||
string sFeatID = Get2DACache("spells", "FeatID", currentSpell);
|
||||
int iFeatID = StringToInt(sFeatID);
|
||||
|
||||
if (IntToString(iFeatID) == sFeatID)
|
||||
return GetHasFeat(iFeatID, oPlayer);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int IsClassAllowedToUseNUISpellbook(object oPlayer, int nClass)
|
||||
{
|
||||
// This controls who can use the Spellbook NUI, if for some reason you don't
|
||||
// want a class to be allowed to use this you can comment out their line here
|
||||
|
||||
// Bard and Sorc are allowed if they took a PRC that makes them use the spellbook
|
||||
if ((nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_SORCERER)
|
||||
&& GetPrCAdjustedClassLevel(nClass, oPlayer) > GetLevelByClass(nClass, oPlayer))
|
||||
return TRUE;
|
||||
|
||||
// Arcane Spont
|
||||
if (nClass == CLASS_TYPE_BEGUILER
|
||||
|| nClass == CLASS_TYPE_CELEBRANT_SHARESS
|
||||
|| nClass == CLASS_TYPE_DREAD_NECROMANCER
|
||||
|| nClass == CLASS_TYPE_DUSKBLADE
|
||||
|| nClass == CLASS_TYPE_HARPER
|
||||
|| nClass == CLASS_TYPE_HEXBLADE
|
||||
|| nClass == CLASS_TYPE_KNIGHT_WEAVE
|
||||
|| nClass == CLASS_TYPE_SHADOWLORD
|
||||
|| nClass == CLASS_TYPE_SUBLIME_CHORD
|
||||
|| nClass == CLASS_TYPE_SUEL_ARCHANAMACH
|
||||
|| nClass == CLASS_TYPE_WARMAGE)
|
||||
return TRUE;
|
||||
|
||||
// Psionics
|
||||
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)
|
||||
return TRUE;
|
||||
|
||||
// Invokers
|
||||
if (nClass == CLASS_TYPE_WARLOCK
|
||||
|| nClass == CLASS_TYPE_DRAGON_SHAMAN
|
||||
|| nClass == CLASS_TYPE_DRAGONFIRE_ADEPT)
|
||||
return TRUE;
|
||||
|
||||
// Divine Spont
|
||||
if (nClass == CLASS_TYPE_ARCHIVIST //while technically prepared, they use the spont system of casting
|
||||
|| nClass == CLASS_TYPE_FAVOURED_SOUL
|
||||
|| nClass == CLASS_TYPE_JUSTICEWW)
|
||||
return TRUE;
|
||||
|
||||
// ToB Classes
|
||||
if (nClass == CLASS_TYPE_WARBLADE
|
||||
|| nClass == CLASS_TYPE_SWORDSAGE
|
||||
|| nClass == CLASS_TYPE_CRUSADER)
|
||||
return TRUE;
|
||||
|
||||
// Mystery Classes
|
||||
if (nClass == CLASS_TYPE_SHADOWCASTER
|
||||
|| nClass == CLASS_TYPE_SHADOWSMITH)
|
||||
return TRUE;
|
||||
|
||||
// Truenamers
|
||||
if (nClass == CLASS_TYPE_TRUENAMER)
|
||||
return TRUE;
|
||||
|
||||
// RHD Casters
|
||||
if ((nClass == CLASS_TYPE_SHAPECHANGER
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_ARANEA
|
||||
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||
|| (nClass == CLASS_TYPE_OUTSIDER
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_RAKSHASA
|
||||
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||
|| (nClass == CLASS_TYPE_ABERRATION
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_DRIDER
|
||||
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_ARKAMOI
|
||||
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_HOBGOBLIN_WARSOUL
|
||||
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_REDSPAWN_ARCANISS
|
||||
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_MARRUTACT
|
||||
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||
|| (nClass == CLASS_TYPE_FEY
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_GLOURA
|
||||
&& !GetLevelByClass(CLASS_TYPE_BARD)))
|
||||
return TRUE;
|
||||
|
||||
// Binders
|
||||
if (nClass == CLASS_TYPE_BINDER)
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int GetTrueClassIfRHD(object oPlayer, int nClass)
|
||||
{
|
||||
if (nClass == CLASS_TYPE_SHAPECHANGER
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_ARANEA)
|
||||
return CLASS_TYPE_SORCERER;
|
||||
if (nClass == CLASS_TYPE_OUTSIDER
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_RAKSHASA)
|
||||
return CLASS_TYPE_SORCERER;
|
||||
if (nClass == CLASS_TYPE_ABERRATION
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_DRIDER)
|
||||
return CLASS_TYPE_SORCERER;
|
||||
if (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_ARKAMOI)
|
||||
return CLASS_TYPE_SORCERER;
|
||||
if (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_HOBGOBLIN_WARSOUL)
|
||||
return CLASS_TYPE_SORCERER;
|
||||
if (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_REDSPAWN_ARCANISS)
|
||||
return CLASS_TYPE_SORCERER;
|
||||
if (nClass == CLASS_TYPE_MONSTROUS
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_MARRUTACT)
|
||||
return CLASS_TYPE_SORCERER;
|
||||
if (nClass == CLASS_TYPE_FEY
|
||||
&& GetRacialType(oPlayer) == RACIAL_TYPE_GLOURA)
|
||||
return CLASS_TYPE_BARD;
|
||||
|
||||
return nClass;
|
||||
}
|
||||
|
||||
int CanClassUseMetamagicFeats(int nClass)
|
||||
{
|
||||
// I don't want to spend the time looping through each class's
|
||||
// feat 2da so this is the list of all classes that are allowed to use the
|
||||
// Spellbook NUI and can use Metamagic
|
||||
return (nClass == CLASS_TYPE_BARD
|
||||
|| nClass == CLASS_TYPE_SORCERER
|
||||
|| nClass == CLASS_TYPE_BEGUILER
|
||||
|| nClass == CLASS_TYPE_DREAD_NECROMANCER
|
||||
|| nClass == CLASS_TYPE_DUSKBLADE
|
||||
|| nClass == CLASS_TYPE_HEXBLADE
|
||||
|| nClass == CLASS_TYPE_JUSTICEWW
|
||||
|| nClass == CLASS_TYPE_SUBLIME_CHORD
|
||||
|| nClass == CLASS_TYPE_SUEL_ARCHANAMACH
|
||||
|| nClass == CLASS_TYPE_FAVOURED_SOUL
|
||||
|| nClass == CLASS_TYPE_WARMAGE);
|
||||
}
|
||||
|
||||
int CanClassUseSuddenMetamagicFeats(int nClass)
|
||||
{
|
||||
// I don't want to spend the time looping through each class's
|
||||
// feat 2da so this is the list of all classes that are allowed to use the
|
||||
// Spellbook NUI and can use Sudden Metamagic
|
||||
return (nClass == CLASS_TYPE_SHADOWLORD
|
||||
|| nClass == CLASS_TYPE_ARCHIVIST
|
||||
|| nClass == CLASS_TYPE_BARD
|
||||
|| nClass == CLASS_TYPE_BEGUILER
|
||||
|| nClass == CLASS_TYPE_DREAD_NECROMANCER
|
||||
|| nClass == CLASS_TYPE_DUSKBLADE
|
||||
|| nClass == CLASS_TYPE_FAVOURED_SOUL
|
||||
|| nClass == CLASS_TYPE_HEXBLADE
|
||||
|| nClass == CLASS_TYPE_JUSTICEWW
|
||||
|| nClass == CLASS_TYPE_KNIGHT_WEAVE
|
||||
|| nClass == CLASS_TYPE_SUBLIME_CHORD
|
||||
|| nClass == CLASS_TYPE_SORCERER
|
||||
|| nClass == CLASS_TYPE_SUEL_ARCHANAMACH
|
||||
|| nClass == CLASS_TYPE_WARMAGE);
|
||||
}
|
||||
|
||||
int CanClassUseMetaPsionicFeats(int nClass)
|
||||
{
|
||||
// I don't want to spend the time looping through each class's
|
||||
// feat 2da so this is the list of all classes that are allowed to use the
|
||||
// Spellbook NUI and can use Metapsionics
|
||||
return (nClass == CLASS_TYPE_FIST_OF_ZUOKEN
|
||||
|| nClass == CLASS_TYPE_PSION
|
||||
|| nClass == CLASS_TYPE_PSYCHIC_ROGUE
|
||||
|| nClass == CLASS_TYPE_PSYWAR
|
||||
|| nClass == CLASS_TYPE_WARMIND
|
||||
|| nClass == CLASS_TYPE_WILDER);
|
||||
}
|
||||
|
||||
int CanClassUseMetaMysteryFeats(int nClass)
|
||||
{
|
||||
// I don't want to spend the time looping through each class's
|
||||
// feat 2da so this is the list of all classes that are allowed to use the
|
||||
// Spellbook NUI and can use Metamysteries
|
||||
return (nClass == CLASS_TYPE_SHADOWCASTER
|
||||
|| nClass == CLASS_TYPE_SHADOWSMITH);
|
||||
}
|
||||
|
||||
json GetMetaMagicFeatList()
|
||||
{
|
||||
json metaFeats = JsonArray();
|
||||
int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EXTEND_SPELL_ABILITY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EMPOWER_SPELL_ABILITY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_MAXIMIZE_SPELL_ABILITY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_QUICKEN_SPELL_ABILITY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_STILL_SPELL_ABILITY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SILENT_SPELL_ABILITY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
|
||||
return metaFeats;
|
||||
}
|
||||
|
||||
json GetSuddenMetaMagicFeatList()
|
||||
{
|
||||
json metaFeats = JsonArray();
|
||||
int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_EXTEND));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_EMPOWER));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_MAXIMIZE));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SUDDEN_WIDEN));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
|
||||
return metaFeats;
|
||||
}
|
||||
|
||||
json GetMetaPsionicFeatList()
|
||||
{
|
||||
json metaFeats = JsonArray();
|
||||
int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EXTEND_POWER));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EMPOWER_POWER));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_MAXIMIZE_POWER));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_QUICKEN_POWER));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_WIDEN_POWER));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_CHAIN_POWER));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_TWIN_POWER));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SPLIT_PSIONIC_RAY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
|
||||
return metaFeats;
|
||||
}
|
||||
|
||||
json GetMetaMysteryFeatList()
|
||||
{
|
||||
json metaFeats = JsonArray();
|
||||
int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EXTEND_MYSTERY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_EMPOWER_MYSTERY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_MAXIMIZE_MYSTERY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_QUICKEN_MYSTERY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_STILL_MYSTERY));
|
||||
metaFeats = JsonArrayInsert(metaFeats, JsonInt(spellId));
|
||||
|
||||
return metaFeats;
|
||||
}
|
||||
|
||||
json GetToBStanceSpellList(int nClass, object oPlayer=OBJECT_SELF)
|
||||
{
|
||||
// caching
|
||||
json stanceSpells = GetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_STANCES_CACHE_BASE_VAR + IntToString(nClass));
|
||||
if (stanceSpells == JsonNull())
|
||||
stanceSpells = JsonArray();
|
||||
else
|
||||
return stanceSpells;
|
||||
|
||||
string sFile = GetClassSpellbookFile(nClass);
|
||||
int totalRows = Get2DARowCount(sFile);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < totalRows; i++)
|
||||
{
|
||||
int Type = StringToInt(Get2DACache(sFile, "Type", i));
|
||||
if (Type == 1)
|
||||
{
|
||||
int spellId = StringToInt(Get2DACache(sFile, "SpellID", i));
|
||||
stanceSpells = JsonArrayInsert(stanceSpells, JsonInt(spellId));
|
||||
}
|
||||
}
|
||||
|
||||
SetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_STANCES_CACHE_BASE_VAR + IntToString(nClass), stanceSpells);
|
||||
return stanceSpells;
|
||||
}
|
||||
|
||||
json GetInvokerShapeSpellList(int nClass, object oPlayer=OBJECT_SELF)
|
||||
{
|
||||
// caching
|
||||
json shapeSpells = GetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_SHAPES_CACHE_BASE_VAR + IntToString(nClass));
|
||||
if (shapeSpells == JsonNull())
|
||||
shapeSpells = JsonArray();
|
||||
else
|
||||
return shapeSpells;
|
||||
|
||||
string sFile = GetClassSpellbookFile(nClass);
|
||||
int totalRows = Get2DARowCount(sFile);
|
||||
|
||||
if (nClass == CLASS_TYPE_WARLOCK)
|
||||
{
|
||||
// Add the ELdritch Blast shapes
|
||||
// TODO: Replace these magic SpellID ints with consts
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(INVOKE_ELDRITCH_BLAST));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18216)); // Eldritch Chain
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18245)); // Eldritch Cone
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18261)); // Eldritch Doom
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18172)); // Glaive
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18246)); // Eldritch Line
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(18173)); // Eldritch Spear
|
||||
}
|
||||
|
||||
if (nClass == CLASS_TYPE_DRAGON_SHAMAN)
|
||||
{
|
||||
// Add the Dragon Shaman Auras
|
||||
int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_ENERGY));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_ENERGYSHLD));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_INSIGHT));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_MAGICPOWER));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_POWER));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_PRESENCE));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_RESISTANCE));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_RESOLVE));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_SENSES));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_STAMINA));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_SWIFTNESS));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_TOUGHNESS));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_DRAGONSHAMAN_AURA_VIGOR));
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(spellId));
|
||||
}
|
||||
|
||||
if (nClass == CLASS_TYPE_DRAGONFIRE_ADEPT)
|
||||
{
|
||||
// Add Dragon Adept Breaths
|
||||
// TODO: Replace these magic SpellID ints with consts
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2102)); // Fire Cone
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2103)); // Fire Line
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2104)); // Frost Cone
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2105)); // Electric Line
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2106)); // Sickness Cone
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2108)); // Acid Cone
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2109)); // Acid Line
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2111)); // Slow Cone
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2112)); // Weakening Cone
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2115)); // Sleep Cone
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2116)); // Thunder Cone
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2117)); // Bahamut Line
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2118)); // Force Line
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2119)); // Paralyzation Line
|
||||
shapeSpells = JsonArrayInsert(shapeSpells, JsonInt(2120)); // Tiamat Breath
|
||||
}
|
||||
|
||||
|
||||
SetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_SHAPES_CACHE_BASE_VAR + IntToString(nClass), shapeSpells);
|
||||
return shapeSpells;
|
||||
}
|
||||
|
||||
json GetInvokerEssenceSpellList(int nClass, object oPlayer=OBJECT_SELF)
|
||||
{
|
||||
//caching
|
||||
json essenceSpells = GetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_ESSENCE_CACHE_BASE_VAR + IntToString(nClass));
|
||||
if (essenceSpells == JsonNull())
|
||||
essenceSpells = JsonArray();
|
||||
else
|
||||
return essenceSpells;
|
||||
|
||||
if (nClass == CLASS_TYPE_WARLOCK)
|
||||
{
|
||||
// Add Eldritch Essences
|
||||
// TODO: Replace these magic SpellID ints with consts
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18177)); // Hideous Blow
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18189)); // Baneful Abberation
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18190)); // Baneful Beast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18191)); // Baneful Construct
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18192)); // Baneful Dragon
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18193)); // Baneful Dwarf
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18194)); // Baneful Elemental
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18195)); // Baneful Elf
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18196)); // baneful Fey
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18197)); // Baneful Giant
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18198)); // Baneful Goblinoid
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18199)); // Baneful Gnome
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18200)); // Baneful Halfling
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18201)); // Baneful Human
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18202)); // Baneful Monsterous
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18203)); // Baneful Orc
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18204)); // Baneful Outsider
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18205)); // Baneful Plant
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18206)); // Baneful Reptilian
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18207)); // Baneful Shapechanger
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18208)); // Baneful Undead
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18209)); // Baneful Vermin
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18210)); // Beshadowed Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18240)); // Bewitching Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18257)); // Binding Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18211)); // Brimstone Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18175)); // Frightful Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18176)); // Hammer Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18183)); // Sickening Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HEALING_BLAST));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_BLAST));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_BLOW));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_CHAIN));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_CONE));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_DOOM));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_GLAIVE));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_LINE));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(INVOKE_HELLFIRE_SPEAR));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18220)); // Hellrime Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18177)); // Hideous Blow
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18249)); // Hindering Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18251)); // Noxious Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18253)); // Penetrating Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18267)); // Utterdark Blast
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(18255)); // Vitriolic Blast
|
||||
}
|
||||
|
||||
if (nClass == CLASS_TYPE_DRAGONFIRE_ADEPT)
|
||||
{
|
||||
// Add the Dragonfire Adept Shapes
|
||||
int spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_SHAPED_ADEPTBREATH));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_CLOUD_ADEPTBREATH));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(spellId));
|
||||
spellId = StringToInt(Get2DACache("feat", "SPELLID", FEAT_ENDURE_ADEPTBREATH));
|
||||
essenceSpells = JsonArrayInsert(essenceSpells, JsonInt(spellId));
|
||||
}
|
||||
|
||||
SetLocalJson(oPlayer, NUI_SPELLBOOK_CLASS_ESSENCE_CACHE_BASE_VAR + IntToString(nClass), essenceSpells);
|
||||
return essenceSpells;
|
||||
}
|
||||
|
||||
int JsonArrayContainsInt(json list, int item)
|
||||
{
|
||||
int totalCount = JsonGetLength(list);
|
||||
|
||||
int i;
|
||||
for (i = 0; i < totalCount; i++)
|
||||
{
|
||||
if (JsonGetInt(JsonArrayGet(list, i)) == item)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int IsSpellbookNUIOpen(object oPC)
|
||||
{
|
||||
int nPreviousToken = NuiFindWindow(oPC, PRC_SPELLBOOK_NUI_WINDOW_ID);
|
||||
if (nPreviousToken != 0)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
104
src/include/prc_nui_sbd_inc.nss
Normal file
104
src/include/prc_nui_sbd_inc.nss
Normal file
@@ -0,0 +1,104 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: PRC Spellbook Description NUI
|
||||
//:: prc_nui_sbd_inc
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
This is the view for the Spell Description NUI
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Rakiov
|
||||
//:: Created On: 29.05.2005
|
||||
//:://////////////////////////////////////////////
|
||||
#include "nw_inc_nui"
|
||||
#include "prc_nui_consts"
|
||||
#include "inc_2dacache"
|
||||
|
||||
//
|
||||
// CreateSpellDescriptionNUI
|
||||
// Creates a Spell Description NUI mimicing the description GUI of NWN
|
||||
//
|
||||
// Arguments:
|
||||
// oPlayer:Object the player object
|
||||
// featID:int the FeatID
|
||||
// spellId:int the SpellID
|
||||
// realSpellId:int the RealSpellID
|
||||
//
|
||||
void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0);
|
||||
|
||||
void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0)
|
||||
{
|
||||
// look for existing window and destroy
|
||||
int nPreviousToken = NuiFindWindow(oPlayer, NUI_SPELL_DESCRIPTION_WINDOW_ID);
|
||||
if(nPreviousToken != 0)
|
||||
{
|
||||
NuiDestroy(oPlayer, nPreviousToken);
|
||||
}
|
||||
|
||||
/* int nPreviousToken = NuiFindWindow(OBJECT_SELF, NUI_SPELL_DESCRIPTION_WINDOW_ID);
|
||||
if(nPreviousToken != 0)
|
||||
{
|
||||
NuiDestroy(OBJECT_SELF, nPreviousToken);
|
||||
} */
|
||||
|
||||
// in order of accuracy for names it goes RealSpellID > SpellID > FeatID
|
||||
string spellName;
|
||||
if (realSpellId)
|
||||
spellName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", realSpellId)));
|
||||
else if (spellId)
|
||||
spellName = GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellId)));
|
||||
else
|
||||
spellName = GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", featID)));
|
||||
// Descriptions and Icons are accuratly stored on the feat
|
||||
string spellDesc = GetStringByStrRef(StringToInt(Get2DACache("feat", "DESCRIPTION", featID)));
|
||||
string spellIcon = Get2DACache("feat", "ICON", featID);
|
||||
|
||||
json jRoot = JsonArray();
|
||||
json jGroup = JsonArray();
|
||||
|
||||
json jRow = JsonArray();
|
||||
|
||||
json jImage = NuiImage(JsonString(spellIcon), JsonInt(NUI_ASPECT_EXACT), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_TOP));
|
||||
jImage = NuiWidth(jImage, 32.0f);
|
||||
jRow = JsonArrayInsert(jRow, jImage);
|
||||
jRow = NuiCol(jRow);
|
||||
jGroup = JsonArrayInsert(jGroup, jRow);
|
||||
|
||||
jRow = JsonArray();
|
||||
json jText = NuiText(JsonString(spellDesc), FALSE, NUI_SCROLLBARS_AUTO);
|
||||
jRow = JsonArrayInsert(jRow, jText);
|
||||
jRow = NuiCol(jRow);
|
||||
jGroup = JsonArrayInsert(jGroup, jRow);
|
||||
|
||||
jGroup = NuiRow(jGroup);
|
||||
jGroup = NuiGroup(jGroup, TRUE, NUI_SCROLLBARS_NONE);
|
||||
jRoot = JsonArrayInsert(jRoot, jGroup);
|
||||
|
||||
jRow = JsonArray();
|
||||
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||
json jButton = NuiId(NuiButton(JsonString("OK")), NUI_SPELL_DESCRIPTION_OK_BUTTON);
|
||||
jButton = NuiWidth(jButton, 175.0f);
|
||||
jButton = NuiHeight(jButton, 48.0f);
|
||||
jRow = JsonArrayInsert(jRow, jButton);
|
||||
jRow = NuiRow(jRow);
|
||||
|
||||
jRoot = JsonArrayInsert(jRoot, jRow);
|
||||
jRoot = NuiCol(jRoot);
|
||||
|
||||
|
||||
// This is the main window with jRoot as the main pane. It includes titles and parameters (more on those later)
|
||||
json nui = NuiWindow(jRoot, JsonString(spellName), NuiBind("geometry"), NuiBind("resizable"), JsonBool(FALSE), NuiBind("closable"), NuiBind("transparent"), NuiBind("border"));
|
||||
|
||||
// finally create it and it'll return us a non-zero token.
|
||||
int nToken = NuiCreate(oPlayer, nui, NUI_SPELL_DESCRIPTION_WINDOW_ID);
|
||||
|
||||
// get the geometry of the window in case we opened this before and have a
|
||||
// preference for location
|
||||
json geometry = NuiRect(893.0f,346.0f, 426.0f, 446.0f);
|
||||
|
||||
// Set the binds to their default values
|
||||
NuiSetBind(oPlayer, nToken, "geometry", geometry);
|
||||
NuiSetBind(oPlayer, nToken, "resizable", JsonBool(FALSE));
|
||||
NuiSetBind(oPlayer, nToken, "closable", JsonBool(FALSE));
|
||||
NuiSetBind(oPlayer, nToken, "transparent", JsonBool(FALSE));
|
||||
NuiSetBind(oPlayer, nToken, "border", JsonBool(TRUE));
|
||||
}
|
||||
@@ -180,6 +180,24 @@ void RunImpactScript(object oPC, int nSpellID, int nEventType)
|
||||
DeleteLocalInt(oPC, PRC_SPELLID_OVERRIDE);
|
||||
}
|
||||
|
||||
//Returns true if the spell is one of the repair spells
|
||||
int IsRepair(int nSpellID)
|
||||
{
|
||||
return ((nSpellID >= SPELL_REPAIR_MINOR_DAMAGE) && (nSpellID <= SPELL_REPAIR_CRITICAL_DAMAGE));
|
||||
}
|
||||
|
||||
//Returns true if the spell is one of the mass repair spells
|
||||
int IsMassRepair(int nSpellID)
|
||||
{
|
||||
return ((nSpellID >= SPELL_MASS_REPAIR_LIGHT_DAMAGE) && (nSpellID <= SPELL_MASS_REPAIR_CRITICAL_DAMAGE));
|
||||
}
|
||||
|
||||
//Returns true if the spell is one of the mass inflict damage spells
|
||||
int IsMassInflictDamage(int nSpellID)
|
||||
{
|
||||
return ((nSpellID >= SPELL_MASS_INFLICT_LIGHT_DAMAGE) && (nSpellID <= SPELL_MASS_INFLICT_CRITICAL_DAMAGE));
|
||||
}
|
||||
|
||||
//Returns true if the spell is one of the cure spells
|
||||
int IsCure(int nSpellID)
|
||||
{
|
||||
|
||||
@@ -13,6 +13,9 @@ const int SPELL_BLACKLIGHT = 2091;
|
||||
const int SPELL_BARD_SONG = 411;
|
||||
const int SPELL_BARD_CURSE_SONG = 644;
|
||||
|
||||
//:: Monk
|
||||
const int SPELL_MONK_ABUNDANT_STEP = 17986;
|
||||
|
||||
//:: Epic Level Handbook
|
||||
const int SPELL_EPIC_SWARM_OF_ARROWS = 17996;
|
||||
|
||||
@@ -22,6 +25,9 @@ const int SPELL_BCM_RENDING_CLAWS = 17997;
|
||||
//:: Complete Warrior
|
||||
const int SPELL_RANGED_DISARM = 3493;
|
||||
|
||||
//:: Tome of Battle
|
||||
const int SPELL_TOB_SNAP_KICK = 3794;
|
||||
|
||||
//marshal
|
||||
const int SPELL_MINAUR_DEMFORT = 3500;
|
||||
const int SPELL_MINAUR_FORCEWILL = 3501;
|
||||
@@ -1289,20 +1295,128 @@ const int SPELL_SUMMON_CREATURE_IX_WATER = 3200;
|
||||
//:: Player's Handbook Spells
|
||||
const int SPELL_SPIRITUAL_WEAPON = 17249;
|
||||
|
||||
const int SPELL_SUMMON_NATURES_ALLY_1 = 17000;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_1_DIREBADGER = 17001;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_1_DIRERAT = 17002;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_1_DOG = 17003;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_1_HAWK = 17004;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_1_TINY_VIPER = 17005;
|
||||
|
||||
const int SPELL_SUMMON_NATURES_ALLY_2 = 17010;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_2_DIREBOAR = 17011;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_2_COOSHEE = 17012;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_2_WOLF = 17013;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_2_SMALL_VIPER = 17014;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_2_BLACKBEAR = 17015;
|
||||
|
||||
const int SPELL_SUMMON_NATURES_ALLY_3 = 17020;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_3_BROWNBEAR = 17021;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_3_DIREWOLK = 17022;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_3_LARGE_VIPER = 17023;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_3_LEOPARD = 17024;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_3_SATYR = 17025;
|
||||
|
||||
const int SPELL_SUMMON_NATURES_ALLY_4 = 17030;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_4_LION = 17031;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_4_POLAR_BEAR = 17032;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_4_DIRE_SPIDER = 17033;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_4_HUGE_VIPER = 17034;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_4_WEREBOAR = 17035;
|
||||
|
||||
const int SPELL_SUMMON_NATURES_ALLY_5 = 17040;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_5_MED_AIR = 17041;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_5_MED_EARTH = 17042;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_5_MED_FIRE = 17043;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_5_MED_WATER = 17044;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_5_DIRE_BEAR = 17045;
|
||||
|
||||
const int SPELL_SUMMON_NATURES_ALLY_6 = 17050;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_6_LG_AIR = 17051;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_6_LG_EARTH = 17052;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_6_LG_FIRE = 17053;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_6_LG_WATER = 17054;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_6_DIRETIGER = 17055;
|
||||
|
||||
const int SPELL_SUMMON_NATURES_ALLY_7 = 17060;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_7_BULETTE = 17061;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_7_INVSTALKER = 17062;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_7_PIXIE = 17063;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_7_GORGON = 17064;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_7_MANTICORE = 17065;
|
||||
|
||||
const int SPELL_SUMMON_NATURES_ALLY_8 = 17070;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_8_GR_AIR = 17071;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_8_GR_EARTH = 17072;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_8_GR_FIRE = 17073;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_8_GR_WATER = 17074;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_8_NYMPH = 17075;
|
||||
|
||||
const int SPELL_SUMMON_NATURES_ALLY_9 = 17080;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_9_ELD_AIR = 17081;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_9_ELD_EARTH = 17082;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_9_ELD_FIRE = 17083;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_9_ELD_WATER = 17084;
|
||||
const int SPELL_SUMMON_NATURES_ALLY_9_ARANEA = 17085;
|
||||
|
||||
//:: Player's Handbook II Spells
|
||||
const int SPELL_CHASING_PERFECTION = 2479;
|
||||
|
||||
//:: Spell Compendium Spells
|
||||
const int SPELL_SPIRIT_WORM = 17248;
|
||||
const int SPELL_FORCE_MISSILES = 2480;
|
||||
const int SPELL_FORCE_MISSILES = 2480;
|
||||
const int SPELL_REPAIR_MINOR_DAMAGE = 17094;
|
||||
const int SPELL_REPAIR_LIGHT_DAMAGE = 17095;
|
||||
const int SPELL_REPAIR_MODERATE_DAMAGE = 17096;
|
||||
const int SPELL_REPAIR_SERIOUS_DAMAGE = 17097;
|
||||
const int SPELL_REPAIR_CRITICAL_DAMAGE = 17098;
|
||||
const int SPELL_INFLICT_LIGHT_DAMAGE = 17100;
|
||||
const int SPELL_INFLICT_MODERATE_DAMAGE = 17101;
|
||||
const int SPELL_INFLICT_SERIOUS_DAMAGE = 17102;
|
||||
const int SPELL_INFLICT_CRITICAL_DAMAGE = 17103;
|
||||
const int SPELL_SPIRIT_WORM = 17248;
|
||||
|
||||
//:: Races of Eberron
|
||||
const int SPELL_MASS_REPAIR_LIGHT_DAMAGE = 17105;
|
||||
const int SPELL_MASS_REPAIR_MODERATE_DAMAGE = 17106;
|
||||
const int SPELL_MASS_REPAIR_SERIOUS_DAMAGE = 17107;
|
||||
const int SPELL_MASS_REPAIR_CRITICAL_DAMAGE = 17108;
|
||||
const int SPELL_MASS_INFLICT_LIGHT_DAMAGE = 17110;
|
||||
const int SPELL_MASS_INFLICT_MODERATE_DAMAGE = 17111;
|
||||
const int SPELL_MASS_INFLICT_SERIOUS_DAMAGE = 17112;
|
||||
const int SPELL_MASS_INFLICT_CRITICAL_DAMAGE = 17113;
|
||||
|
||||
//:: Masters of the Wild Spells
|
||||
const int SPELL_FORESTFOLD = 17090;
|
||||
const int SPELL_CREEPING_COLD = 17091;
|
||||
const int SPELL_GREATER_CREEPING_COLD = 17092;
|
||||
const int SPELL_CONTROL_PLANTS = 17237;
|
||||
const int SPELL_ADRENALINE_SURGE = 17238;
|
||||
const int SPELL_INVULNERABILITY_TO_ELEMENTS = 17239;
|
||||
const int SPELL_REGEN_RING = 17241;
|
||||
const int SPELL_REGEN_CIRCLE = 17242;
|
||||
const int SPELL_REGEN_LIGHT_WOUNDS = 17243;
|
||||
const int SPELL_REGEN_MODERATE_WOUNDS = 17244;
|
||||
const int SPELL_REGEN_SERIOUS_WOUNDS = 17245;
|
||||
const int SPELL_REGEN_CRITICAL_WOUNDS = 17246;
|
||||
const int SPELL_SPEED_WIND = 17247;
|
||||
const int SPELL_TORTISE_SHELL = 17250;
|
||||
const int SPELL_TORTISE_SHELL = 17250;
|
||||
|
||||
//:: Book of Exalted Deeds Spells
|
||||
const int SPELL_LEONALS_ROAR = 17240;
|
||||
|
||||
//:: Master of the Wild Feats
|
||||
const int SPELL_VL_WILD_SHAPE_TREANT = 17989;
|
||||
const int SPELL_VL_ANIMATE_TREE = 17990;
|
||||
const int SPELL_PLANT_DEFIANCE = 17991;
|
||||
const int SPELL_PLANT_CONTROL = 17992;
|
||||
|
||||
//:: Book of Exalted Deeds Feats
|
||||
const int SPELL_FOT_LEONALS_ROAR = 17993;
|
||||
const int SPELL_FOT_LIONS_SWIFTNESS = 17994;
|
||||
const int SPELL_FAVORED_OF_THE_COMPANIONS = 17995;
|
||||
|
||||
//:: Magic Item Compendium
|
||||
const int SPELL_AROMA_OF_CURDLED_DEATH = 17987;
|
||||
const int SPELL_ELIXIR_OF_THE_BEETLE = 17987;
|
||||
|
||||
//x
|
||||
const int SPELL_TENSERS_FLOATING_DISK = 3849;
|
||||
|
||||
@@ -299,6 +299,7 @@ int SpellfireDrainItem(object oPC, object oItem, int bCharged = TRUE, int bSingl
|
||||
{
|
||||
|
||||
if((nBase == BASE_ITEM_POTIONS) ||
|
||||
(nBase == BASE_ITEM_INFUSED_HERB) ||
|
||||
(nBase == BASE_ITEM_SCROLL) ||
|
||||
(nBase == BASE_ITEM_SPELLSCROLL) ||
|
||||
(nBase == BASE_ITEM_BLANK_POTION) ||
|
||||
@@ -382,6 +383,7 @@ void SpellfireDrain(object oPC, object oTarget, int bCharged = TRUE, int bExempt
|
||||
if(GetPRCSwitch(PRC_SPELLFIRE_DISALLOW_DRAIN_SCROLL_POTION) &&
|
||||
((nBase == BASE_ITEM_POTIONS) ||
|
||||
(nBase == BASE_ITEM_SCROLL) ||
|
||||
(nBase == BASE_ITEM_INFUSED_HERB) ||
|
||||
(nBase == BASE_ITEM_BLANK_POTION) ||
|
||||
(nBase == BASE_ITEM_BLANK_SCROLL)
|
||||
)
|
||||
@@ -485,7 +487,8 @@ void SpellfireChargeItem(object oPC, object oItem)
|
||||
AddSpellfireLevels(oPC, nNewCharges - 50);
|
||||
nNewCharges = 50;
|
||||
}
|
||||
SetItemCharges(oItem, nCharges + nExpend);
|
||||
//SetItemCharges(oItem, nCharges + nExpend);
|
||||
SetItemCharges(oItem, nNewCharges);
|
||||
//Assuming 50 is the maximum
|
||||
//refunding excess charges
|
||||
}
|
||||
@@ -525,3 +528,4 @@ void SpellfireCrown(object oPC)
|
||||
}
|
||||
}
|
||||
|
||||
//:: void main() {}
|
||||
74
src/include/prc_string_inc.nss
Normal file
74
src/include/prc_string_inc.nss
Normal file
@@ -0,0 +1,74 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: String Util
|
||||
//:: prc_string_inc
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
A util class for providing useful string functions.
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Created By: Rakiov
|
||||
//:: Created On: 22.05.2005
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "inc_utility"
|
||||
|
||||
//
|
||||
// StringSplit
|
||||
// Takes a string and splits it by " " into a json list of strings
|
||||
// i.e. "this is a test" returns
|
||||
// {
|
||||
// "this",
|
||||
// "is",
|
||||
// "a",
|
||||
// "test"
|
||||
// }
|
||||
//
|
||||
// Parameters:
|
||||
// string input the string input
|
||||
//
|
||||
// Returns:
|
||||
// json the json list of words
|
||||
//
|
||||
json StringSplit(string input);
|
||||
|
||||
json StringSplit(string input)
|
||||
{
|
||||
json retValue = JsonArray();
|
||||
|
||||
string subString = "";
|
||||
//trim any whitespace characters first
|
||||
string currString = PRCTrimString(input);
|
||||
|
||||
// loop until we process the whole string
|
||||
while(currString != "")
|
||||
{
|
||||
string currChar = GetStringLeft(currString, 1);
|
||||
if (currChar != "" && currChar != " ")
|
||||
{
|
||||
// if the current character isn't nothing or whitespace, then add it
|
||||
// to the current sub string.
|
||||
subString += currChar;
|
||||
}
|
||||
else
|
||||
{
|
||||
// otherwise if the substring is not empty, then add it to the list
|
||||
// of words to return
|
||||
if(subString != "")
|
||||
{
|
||||
retValue = JsonArrayInsert(retValue, JsonString(subString));
|
||||
subString = "";
|
||||
}
|
||||
}
|
||||
|
||||
// pop and move to next character
|
||||
currString = GetStringRight(currString, GetStringLength(currString)-1);
|
||||
}
|
||||
|
||||
// if there is any sub string left at the end of the loop, add it to the list
|
||||
if(subString != "")
|
||||
{
|
||||
retValue = JsonArrayInsert(retValue, JsonString(subString));
|
||||
}
|
||||
|
||||
return retValue;
|
||||
}
|
||||
@@ -18,6 +18,7 @@ const int TEMPLATE_CURST = 26;
|
||||
const int TEMPLATE_GRAVETOUCHED_GHOUL = 29;
|
||||
const int TEMPLATE_CRYPTSPAWN = 30;
|
||||
const int TEMPLATE_ARCHLICH = 99;
|
||||
const int TEMPLATE_BAELNORN = 100;
|
||||
const int TEMPLATE_LICH = 101;
|
||||
const int TEMPLATE_DEMILICH = 102;
|
||||
const int TEMPLATE_NECROPOLITAN = 105;
|
||||
|
||||
@@ -47,12 +47,10 @@ int GetWeaponFocusFeatItemProperty(int nFeatNumber)
|
||||
if(nItemProperty != -1) return nItemProperty;
|
||||
nItemProperty = GetFeatItemProperty(nFeatNumber, IP_CONST_FEAT_WEAPON_FOCUS_TRIDENT, IP_CONST_FEAT_WEAPON_FOCUS_TRIDENT);
|
||||
if(nItemProperty != -1) return nItemProperty;
|
||||
nItemProperty = GetFeatItemProperty(nFeatNumber, IP_CONST_FEAT_WEAPON_FOCUS_LIGHT_LANCE, IP_CONST_FEAT_WEAPON_FOCUS_GOAD);
|
||||
nItemProperty = GetFeatItemProperty(nFeatNumber, IP_CONST_FEAT_WEAPON_FOCUS_EAGLE_CLAW, IP_CONST_FEAT_WEAPON_FOCUS_GOAD);
|
||||
if(nItemProperty != -1) return nItemProperty;
|
||||
nItemProperty = GetFeatItemProperty(nFeatNumber, IP_CONST_FEAT_WEAPON_FOCUS_ELVEN_LIGHTBLADE, IP_CONST_FEAT_WEAPON_FOCUS_ELVEN_LIGHTBLADE);
|
||||
if(nItemProperty != -1) return nItemProperty;
|
||||
nItemProperty = GetFeatItemProperty(nFeatNumber, IP_CONST_FEAT_WEAPON_FOCUS_EAGLE_CLAW, IP_CONST_FEAT_WEAPON_FOCUS_EAGLE_CLAW);
|
||||
if(nItemProperty != -1) return nItemProperty;
|
||||
nItemProperty = GetFeatItemProperty(nFeatNumber, IP_CONST_FEAT_WEAPON_FOCUS_ELVEN_THINBLADE, IP_CONST_FEAT_WEAPON_FOCUS_ELVEN_THINBLADE);
|
||||
if(nItemProperty != -1) return nItemProperty;
|
||||
nItemProperty = GetFeatItemProperty(nFeatNumber, IP_CONST_FEAT_WEAPON_FOCUS_ELVEN_COURTBLADE, IP_CONST_FEAT_WEAPON_FOCUS_ELVEN_COURTBLADE);
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
//:: Created On: 2003-05-09
|
||||
//:: Last Updated On: 2003-10-14
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "prc_x2_itemprop"
|
||||
|
||||
struct craft_struct
|
||||
{
|
||||
@@ -44,22 +44,25 @@ const string X2_CI_CRAFTSKILL_CONV ="x2_p_craftskills";
|
||||
/* moved to be code switches
|
||||
|
||||
const int X2_CI_BREWPOTION_MAXLEVEL = 3; // Max Level for potions
|
||||
const int X2_CI_BREWPOTION_COSTMODIFIER = 50; // gp Brew Potion XPCost Modifier
|
||||
const int PRC_X2_BREWPOTION_COSTMODIFIER = 50; // gp Brew Potion XPCost Modifier
|
||||
|
||||
// Scribe Scroll related constants
|
||||
const int X2_CI_SCRIBESCROLL_COSTMODIFIER = 25; // Scribescroll Cost Modifier
|
||||
const int PRC_X2_SCRIBESCROLL_COSTMODIFIER = 25; // Scribescroll Cost Modifier
|
||||
|
||||
// Craft Wand related constants
|
||||
const int X2_CI_CRAFTWAND_MAXLEVEL = 4;
|
||||
const int X2_CI_CRAFTWAND_COSTMODIFIER = 750;
|
||||
const int PRC_X2_CRAFTWAND_MAXLEVEL = 4;
|
||||
const int PRC_X2_CRAFTWAND_COSTMODIFIER = 750;
|
||||
*/
|
||||
const int X2_CI_BREWPOTION_FEAT_ID = 944; // Brew Potion feat simulation
|
||||
const int X2_CI_SCRIBESCROLL_FEAT_ID = 945;
|
||||
const int X2_CI_CRAFTWAND_FEAT_ID = 946;
|
||||
const int X2_CI_CRAFTROD_FEAT_ID = 2927;
|
||||
const int X2_CI_CRAFTROD_EPIC_FEAT_ID = 3490;
|
||||
const int X2_CI_CRAFTSTAFF_FEAT_ID = 2928;
|
||||
const int X2_CI_CRAFTSTAFF_EPIC_FEAT_ID = 3491;
|
||||
const int X2_CI_BREWPOTION_FEAT_ID = 944; // Brew Potion feat simulation
|
||||
const int X2_CI_SCRIBESCROLL_FEAT_ID = 945;
|
||||
const int X2_CI_CRAFTWAND_FEAT_ID = 946;
|
||||
const int X2_CI_CRAFTROD_FEAT_ID = 2927;
|
||||
const int X2_CI_CRAFTROD_EPIC_FEAT_ID = 3490;
|
||||
const int X2_CI_CRAFTSTAFF_FEAT_ID = 2928;
|
||||
const int X2_CI_CRAFTSTAFF_EPIC_FEAT_ID = 3491;
|
||||
const int X2_CI_CREATEINFUSION_FEAT_ID = 25960;
|
||||
const int X2_CI_CRAFTSCEPTER_FEAT_ID = 25962;
|
||||
|
||||
const string X2_CI_BREWPOTION_NEWITEM_RESREF = "x2_it_pcpotion"; // ResRef for new potion item
|
||||
const string X2_CI_SCRIBESCROLL_NEWITEM_RESREF = "x2_it_pcscroll"; // ResRef for new scroll item
|
||||
const string X2_CI_CRAFTWAND_NEWITEM_RESREF = "x2_it_pcwand";
|
||||
@@ -185,6 +188,17 @@ int CheckAlternativeCrafting(object oPC, int nSpell, struct craft_cost_struct co
|
||||
// Returns the maximum of caster level used and other effective levels from emulating spells
|
||||
int GetAlternativeCasterLevel(object oPC, int nLevel);
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Create and Return an herbal infusion with an item property
|
||||
// matching nSpellID.
|
||||
// -----------------------------------------------------------------------------
|
||||
object CICreateInfusion(object oCreator, int nSpellID);
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Returns TRUE if the player successfully performed Create Infusion
|
||||
// -----------------------------------------------------------------------------
|
||||
int CICraftCheckCreateInfusion(object oSpellTarget, object oCaster, int nID = 0);
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Include section */
|
||||
//////////////////////////////////////////////////
|
||||
@@ -194,6 +208,7 @@ int GetAlternativeCasterLevel(object oPC, int nLevel);
|
||||
#include "prc_inc_newip"
|
||||
#include "prc_inc_spells"
|
||||
#include "prc_add_spell_dc"
|
||||
#include "inc_infusion"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Function definitions */
|
||||
@@ -261,7 +276,9 @@ int CIGetIsCraftFeatBaseItem(object oItem)
|
||||
nBt == BASE_ITEM_BLANK_SCROLL ||
|
||||
nBt == BASE_ITEM_BLANK_WAND ||
|
||||
nBt == BASE_ITEM_CRAFTED_ROD ||
|
||||
nBt == BASE_ITEM_CRAFTED_STAFF)
|
||||
nBt == BASE_ITEM_CRAFTED_STAFF ||
|
||||
nBt == BASE_ITEM_CRAFTED_SCEPTER ||
|
||||
nBt == BASE_ITEM_MUNDANE_HERB)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
@@ -287,7 +304,7 @@ object CICraftBrewPotion(object oCreator, int nSpellID )
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
|
||||
/* //just a tad retarded, don't you think? other crafting feats are not similarly restricted
|
||||
/* //just a tad silly, don't you think? other crafting feats are not similarly restricted
|
||||
//Uses per day
|
||||
int nUsesAllowed;
|
||||
|
||||
@@ -453,11 +470,159 @@ object CICraftCraftWand(object oCreator, int nSpellID )
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Georg, 2003-06-12
|
||||
// Create and Return a magic wand with an item property
|
||||
// matching nSpellID. Charges are set to d20 + casterlevel
|
||||
// capped at 50 max
|
||||
// Create and Return a magic scroll with an item property
|
||||
// matching nSpellID.
|
||||
// -----------------------------------------------------------------------------
|
||||
object CICraftScribeScroll(object oCreator, int nSpellID)
|
||||
{
|
||||
if (DEBUG) DoDebug("CICraftScribeScroll: Enter (nSpellID=" + IntToString(nSpellID) + ")");
|
||||
|
||||
// Keep original and compute one-step master (if subradial)
|
||||
int nSpellOriginal = nSpellID;
|
||||
int nSpellMaster = nSpellOriginal;
|
||||
if (GetIsSubradialSpell(nSpellOriginal))
|
||||
{
|
||||
nSpellMaster = GetMasterSpellFromSubradial(nSpellOriginal);
|
||||
if (DEBUG) DoDebug("CICraftScribeScroll: subradial detected original=" + IntToString(nSpellOriginal) + " master=" + IntToString(nSpellMaster));
|
||||
}
|
||||
|
||||
// Prefer iprp mapping for the original, fallback to master
|
||||
int nPropID = IPGetIPConstCastSpellFromSpellID(nSpellOriginal);
|
||||
int nSpellUsedForIP = nSpellOriginal;
|
||||
if (nPropID < 0)
|
||||
{
|
||||
if (DEBUG) DoDebug("CICraftScribeScroll: no iprp for original " + IntToString(nSpellOriginal) + ", trying master " + IntToString(nSpellMaster));
|
||||
nPropID = IPGetIPConstCastSpellFromSpellID(nSpellMaster);
|
||||
nSpellUsedForIP = nSpellMaster;
|
||||
}
|
||||
|
||||
// If neither original nor master has an iprp row, we can still try templates,
|
||||
// but most templates expect a matching iprp. Bail out now if nothing found.
|
||||
if (nPropID < 0)
|
||||
{
|
||||
if (DEBUG) DoDebug("CICraftScribeScroll: no iprp_spells entry for original/master -> aborting");
|
||||
FloatingTextStringOnCreature("This spell cannot be scribed (no item property mapping).", oCreator, FALSE);
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
|
||||
if (DEBUG) DoDebug("CICraftScribeScroll: using spell " + IntToString(nSpellUsedForIP) + " (iprp row " + IntToString(nPropID) + ") for item property");
|
||||
|
||||
// Material component check (based on resolved iprp row)
|
||||
string sMat = GetMaterialComponentTag(nPropID);
|
||||
if (sMat != "")
|
||||
{
|
||||
object oMat = GetItemPossessedBy(oCreator, sMat);
|
||||
if (oMat == OBJECT_INVALID)
|
||||
{
|
||||
FloatingTextStrRefOnCreature(83374, oCreator); // Missing material component
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyObject(oMat);
|
||||
}
|
||||
}
|
||||
|
||||
// Resolve class and scroll template
|
||||
int nClass = PRCGetLastSpellCastClass();
|
||||
string sClass = "";
|
||||
switch (nClass)
|
||||
{
|
||||
case CLASS_TYPE_WIZARD:
|
||||
case CLASS_TYPE_SORCERER: sClass = "Wiz_Sorc"; break;
|
||||
case CLASS_TYPE_CLERIC:
|
||||
case CLASS_TYPE_OCULAR:
|
||||
case CLASS_TYPE_UR_PRIEST: sClass = "Cleric"; break;
|
||||
case CLASS_TYPE_PALADIN: sClass = "Paladin"; break;
|
||||
case CLASS_TYPE_DRUID:
|
||||
case CLASS_TYPE_BLIGHTER: sClass = "Druid"; break;
|
||||
case CLASS_TYPE_RANGER: sClass = "Ranger"; break;
|
||||
case CLASS_TYPE_BARD: sClass = "Bard"; break;
|
||||
case CLASS_TYPE_ASSASSIN: sClass = "Assassin"; break;
|
||||
}
|
||||
|
||||
object oTarget = OBJECT_INVALID;
|
||||
string sResRef = "";
|
||||
|
||||
// Try to find a class-specific scroll template.
|
||||
if (sClass != "")
|
||||
{
|
||||
// Try original first (so if you made a subradial-specific template it will be used)
|
||||
sResRef = Get2DACache(X2_CI_2DA_SCROLLS, sClass, nSpellOriginal);
|
||||
if (sResRef == "")
|
||||
{
|
||||
// fallback to the spell that matched an iprp row (master or original)
|
||||
sResRef = Get2DACache(X2_CI_2DA_SCROLLS, sClass, nSpellUsedForIP);
|
||||
}
|
||||
if (sResRef != "")
|
||||
{
|
||||
oTarget = CreateItemOnObject(sResRef, oCreator);
|
||||
if (DEBUG) DoDebug("CICraftScribeScroll: created template " + sResRef + " for class " + sClass);
|
||||
// Ensure template uses the correct cast-spell property: replace the template's cast-spell IP with ours
|
||||
if (oTarget != OBJECT_INVALID)
|
||||
{
|
||||
itemproperty ipIter = GetFirstItemProperty(oTarget);
|
||||
while (GetIsItemPropertyValid(ipIter))
|
||||
{
|
||||
if (GetItemPropertyType(ipIter) == ITEM_PROPERTY_CAST_SPELL)
|
||||
{
|
||||
RemoveItemProperty(oTarget, ipIter);
|
||||
break;
|
||||
}
|
||||
ipIter = GetNextItemProperty(oTarget);
|
||||
}
|
||||
itemproperty ipSpell = ItemPropertyCastSpell(nPropID, IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ipSpell, oTarget);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If no template or sClass was empty, create generic scroll and add itemprop.
|
||||
if (oTarget == OBJECT_INVALID)
|
||||
{
|
||||
sResRef = "craft_scroll";
|
||||
oTarget = CreateItemOnObject(sResRef, oCreator);
|
||||
if (oTarget == OBJECT_INVALID)
|
||||
{
|
||||
WriteTimestampedLogEntry("CICraftScribeScroll: failed to create craft_scroll template.");
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
// Remove existing default IP and add correct one
|
||||
itemproperty ipFirst = GetFirstItemProperty(oTarget);
|
||||
if (GetIsItemPropertyValid(ipFirst))
|
||||
RemoveItemProperty(oTarget, ipFirst);
|
||||
|
||||
itemproperty ipSpell = ItemPropertyCastSpell(nPropID, IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ipSpell, oTarget);
|
||||
}
|
||||
|
||||
// Add PRC metadata (use the same spell that matched the iprp row so metadata and IP line up)
|
||||
if (GetPRCSwitch(PRC_SCRIBE_SCROLL_CASTER_LEVEL))
|
||||
{
|
||||
int nCasterLevel = GetAlternativeCasterLevel(oCreator, PRCGetCasterLevel(oCreator));
|
||||
itemproperty ipLevel = ItemPropertyCastSpellCasterLevel(nSpellUsedForIP, nCasterLevel);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ipLevel, oTarget);
|
||||
|
||||
itemproperty ipMeta = ItemPropertyCastSpellMetamagic(nSpellUsedForIP, PRCGetMetaMagicFeat());
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ipMeta, oTarget);
|
||||
|
||||
int nDC = PRCGetSpellSaveDC(nSpellUsedForIP, GetSpellSchool(nSpellUsedForIP), OBJECT_SELF);
|
||||
itemproperty ipDC = ItemPropertyCastSpellDC(nSpellUsedForIP, nDC);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ipDC, oTarget);
|
||||
}
|
||||
|
||||
if (oTarget == OBJECT_INVALID)
|
||||
{
|
||||
WriteTimestampedLogEntry("prc_x2_craft::CICraftScribeScroll failed - Resref: " + sResRef + " Class: " + sClass + "(" + IntToString(nClass) + ") " + " SpellID " + IntToString(nSpellID));
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
|
||||
if (DEBUG) DoDebug("CICraftScribeScroll: Success - created scroll " + sResRef + " for spell " + IntToString(nSpellUsedForIP));
|
||||
return oTarget;
|
||||
}
|
||||
|
||||
|
||||
/* object CICraftScribeScroll(object oCreator, int nSpellID)
|
||||
{
|
||||
int nPropID = IPGetIPConstCastSpellFromSpellID(nSpellID);
|
||||
object oTarget;
|
||||
@@ -491,6 +656,7 @@ object CICraftScribeScroll(object oCreator, int nSpellID)
|
||||
break;
|
||||
case CLASS_TYPE_CLERIC:
|
||||
case CLASS_TYPE_UR_PRIEST:
|
||||
case CLASS_TYPE_OCULAR:
|
||||
sClass = "Cleric";
|
||||
break;
|
||||
case CLASS_TYPE_PALADIN:
|
||||
@@ -506,6 +672,9 @@ object CICraftScribeScroll(object oCreator, int nSpellID)
|
||||
case CLASS_TYPE_BARD:
|
||||
sClass = "Bard";
|
||||
break;
|
||||
case CLASS_TYPE_ASSASSIN:
|
||||
sClass = "Assassin";
|
||||
break;
|
||||
}
|
||||
string sResRef;
|
||||
if (sClass != "")
|
||||
@@ -542,6 +711,7 @@ object CICraftScribeScroll(object oCreator, int nSpellID)
|
||||
}
|
||||
return oTarget;
|
||||
}
|
||||
*/
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Returns TRUE if the player used the last spell to brew a potion
|
||||
@@ -593,7 +763,7 @@ These dont work as IPs since they are hardcoded */
|
||||
// -------------------------------------------------------------------------
|
||||
// check if spell is below maxlevel for brew potions
|
||||
// -------------------------------------------------------------------------
|
||||
int nPotionMaxLevel = GetPRCSwitch(X2_CI_BREWPOTION_MAXLEVEL);
|
||||
int nPotionMaxLevel = GetPRCSwitch(PRC_X2_BREWPOTION_MAXLEVEL);
|
||||
if(nPotionMaxLevel == 0)
|
||||
nPotionMaxLevel = 3;
|
||||
|
||||
@@ -624,7 +794,7 @@ These dont work as IPs since they are hardcoded */
|
||||
// -------------------------------------------------------------------------
|
||||
// XP/GP Cost Calculation
|
||||
// -------------------------------------------------------------------------
|
||||
int nCostModifier = GetPRCSwitch(X2_CI_BREWPOTION_COSTMODIFIER);
|
||||
int nCostModifier = GetPRCSwitch(PRC_X2_BREWPOTION_COSTMODIFIER);
|
||||
if(nCostModifier == 0)
|
||||
nCostModifier = 50;
|
||||
int nCost = CIGetCraftGPCost(nLevel, nCostModifier, PRC_BREW_POTION_CASTER_LEVEL);
|
||||
@@ -698,7 +868,6 @@ These dont work as IPs since they are hardcoded */
|
||||
}
|
||||
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Returns TRUE if the player used the last spell to create a scroll
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -728,7 +897,7 @@ int CICraftCheckScribeScroll(object oSpellTarget, object oCaster, int nID = 0)
|
||||
// XP/GP Cost Calculation
|
||||
// -------------------------------------------------------------------------
|
||||
int nLevel = CIGetSpellInnateLevel(nID,TRUE);
|
||||
int nCostModifier = GetPRCSwitch(X2_CI_SCRIBESCROLL_COSTMODIFIER);
|
||||
int nCostModifier = GetPRCSwitch(PRC_X2_SCRIBESCROLL_COSTMODIFIER);
|
||||
if(nCostModifier == 0)
|
||||
nCostModifier = 25;
|
||||
int nCost = CIGetCraftGPCost(nLevel, nCostModifier, PRC_SCRIBE_SCROLL_CASTER_LEVEL);
|
||||
@@ -884,7 +1053,7 @@ These dont work as IPs since they are hardcoded */
|
||||
// -------------------------------------------------------------------------
|
||||
// check if spell is below maxlevel for craft want
|
||||
// -------------------------------------------------------------------------
|
||||
int nMaxLevel = GetPRCSwitch(X2_CI_CRAFTWAND_MAXLEVEL);
|
||||
int nMaxLevel = GetPRCSwitch(PRC_X2_CRAFTWAND_MAXLEVEL);
|
||||
if(nMaxLevel == 0)
|
||||
nMaxLevel = 4;
|
||||
if (nLevel > nMaxLevel)
|
||||
@@ -896,7 +1065,7 @@ These dont work as IPs since they are hardcoded */
|
||||
// -------------------------------------------------------------------------
|
||||
// XP/GP Cost Calculation
|
||||
// -------------------------------------------------------------------------
|
||||
int nCostMod = GetPRCSwitch(X2_CI_CRAFTWAND_COSTMODIFIER);
|
||||
int nCostMod = GetPRCSwitch(PRC_X2_CRAFTWAND_COSTMODIFIER);
|
||||
if(nCostMod == 0)
|
||||
nCostMod = 750;
|
||||
int nCost = CIGetCraftGPCost(nLevel, nCostMod, PRC_CRAFT_WAND_CASTER_LEVEL);
|
||||
@@ -966,6 +1135,169 @@ These dont work as IPs since they are hardcoded */
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Returns TRUE if the player used the last spell to craft a scepter
|
||||
// -----------------------------------------------------------------------------
|
||||
int CICraftCheckCraftScepter(object oSpellTarget, object oCaster, int nSpellID = 0)
|
||||
{
|
||||
|
||||
if(nSpellID == 0) nSpellID = PRCGetSpellId();
|
||||
int nCasterLevel = GetAlternativeCasterLevel(oCaster, PRCGetCasterLevel(oCaster));
|
||||
int bSuccess = TRUE;
|
||||
int nCount = 0;
|
||||
itemproperty ip = GetFirstItemProperty(oSpellTarget);
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
|
||||
while(GetIsItemPropertyValid(ip))
|
||||
{
|
||||
if(GetItemPropertyType(ip) == ITEM_PROPERTY_CAST_SPELL)
|
||||
nCount++;
|
||||
ip = GetNextItemProperty(oSpellTarget);
|
||||
}
|
||||
if(nCount >= 2) //:: Scepters are limited to two spells
|
||||
{
|
||||
FloatingTextStringOnCreature("* Failure - Too many castspell itemproperties *", oCaster);
|
||||
return TRUE;
|
||||
}
|
||||
if(!GetHasFeat(X2_CI_CRAFTSCEPTER_FEAT_ID, oCaster))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(40487, oCaster); // Item Creation Failed - Don't know how to create that type of item
|
||||
return TRUE; // tried item creation but do not know how to do it
|
||||
}
|
||||
if(CIGetIsSpellRestrictedFromCraftFeat(nSpellID, X2_CI_CRAFTSCEPTER_FEAT_ID))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(16829169, oCaster); // can not be used with this feat
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// Get the base spell level (circle) before metamagic adjustments
|
||||
int nBaseLevel = CIGetSpellInnateLevel(nSpellID, TRUE);
|
||||
|
||||
// Check if spell circle is 7th level or lower
|
||||
if (nBaseLevel > 7)
|
||||
{
|
||||
//FloatingTextStrRefOnCreature(83623, oCaster); // Spell level too high
|
||||
FloatingTextStringOnCreature("* Failure - scepters can not hold spells higher than level 7", oCaster);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int nLevel = nBaseLevel;
|
||||
|
||||
if(GetPRCSwitch(PRC_CRAFT_SCEPTER_CASTER_LEVEL))
|
||||
{
|
||||
switch(nMetaMagic)
|
||||
{
|
||||
case METAMAGIC_EMPOWER:
|
||||
nLevel += 2;
|
||||
break;
|
||||
case METAMAGIC_EXTEND:
|
||||
nLevel += 1;
|
||||
break;
|
||||
case METAMAGIC_MAXIMIZE:
|
||||
nLevel += 3;
|
||||
break;
|
||||
/* case METAMAGIC_QUICKEN:
|
||||
nLevel += 1;
|
||||
break;
|
||||
case METAMAGIC_SILENT:
|
||||
nLevel += 5;
|
||||
break;
|
||||
case METAMAGIC_STILL:
|
||||
nLevel += 6;
|
||||
break;
|
||||
These dont work as IPs since they are hardcoded */
|
||||
}
|
||||
}
|
||||
|
||||
int nCostMod = GetPRCSwitch(PRC_X2_CRAFTSCEPTER_COSTMODIFIER);
|
||||
if(!nCostMod) nCostMod = 750;
|
||||
int nLvlRow = IPGetIPConstCastSpellFromSpellID(nSpellID);
|
||||
int nCLevel = StringToInt(Get2DACache("iprp_spells","CasterLvl",nLvlRow));
|
||||
int nCost = CIGetCraftGPCost(nLevel, nCostMod, PRC_CRAFT_SCEPTER_CASTER_LEVEL);
|
||||
|
||||
//discount for second spell
|
||||
if(nCount+1 == 2)
|
||||
nCost = (nCost/2);
|
||||
|
||||
//takes epic xp costs into account
|
||||
struct craft_cost_struct costs = GetModifiedCostsFromBase(nCost, oCaster, FEAT_CRAFT_SCEPTER, (nMetaMagic > 0));
|
||||
|
||||
if(costs.nGoldCost < 1) costs.nXPCost = 1;
|
||||
if(costs.nXPCost < 1) costs.nXPCost = 1;
|
||||
//if(GetGold(oCaster) < nGoldCost) // enough gold?
|
||||
if (!GetHasGPToSpend(oCaster, costs.nGoldCost))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(3786, oCaster); // Item Creation Failed - not enough gold!
|
||||
return TRUE;
|
||||
}
|
||||
int nHD = GetHitDice(oCaster);
|
||||
int nMinXPForLevel = (nHD * (nHD - 1)) * 500;
|
||||
int nNewXP = GetXP(oCaster) - costs.nXPCost;
|
||||
//if (nMinXPForLevel > nNewXP || nNewXP == 0 )
|
||||
if (!GetHasXPToSpend(oCaster, costs.nXPCost))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(3785, oCaster); // Item Creation Failed - Not enough XP
|
||||
return TRUE;
|
||||
}
|
||||
//check spell emulation
|
||||
if(!CheckAlternativeCrafting(oCaster, nSpellID, costs))
|
||||
{
|
||||
FloatingTextStringOnCreature("*Crafting failed!*", oCaster, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
int nPropID = IPGetIPConstCastSpellFromSpellID(nSpellID);
|
||||
if (nPropID == 0 && nSpellID != 0)
|
||||
{
|
||||
FloatingTextStrRefOnCreature(84544,oCaster);
|
||||
return TRUE;
|
||||
}
|
||||
if (nPropID != -1)
|
||||
{
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyCastSpell(nPropID,IP_CONST_CASTSPELL_NUMUSES_1_CHARGE_PER_USE),oSpellTarget);
|
||||
|
||||
if(GetPRCSwitch(PRC_CRAFT_SCEPTER_CASTER_LEVEL))
|
||||
{
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyCastSpellCasterLevel(nSpellID, nCasterLevel),oSpellTarget);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyCastSpellMetamagic(nSpellID, PRCGetMetaMagicFeat()),oSpellTarget);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ItemPropertyCastSpellDC(nSpellID, PRCGetSaveDC(PRCGetSpellTargetObject(), OBJECT_SELF)),oSpellTarget);
|
||||
}
|
||||
}
|
||||
else
|
||||
bSuccess = FALSE;
|
||||
|
||||
if(bSuccess)
|
||||
{
|
||||
//TakeGoldFromCreature(nGoldCost, oCaster, TRUE);
|
||||
//SetXP(oCaster, nNewXP);
|
||||
SpendXP(oCaster, costs.nXPCost);
|
||||
SpendGP(oCaster, costs.nGoldCost);
|
||||
//DestroyObject (oSpellTarget);
|
||||
FloatingTextStrRefOnCreature(8502, oCaster); // Item Creation successful
|
||||
|
||||
//advance time here
|
||||
if(!costs.nTimeCost) costs.nTimeCost = 1;
|
||||
AdvanceTimeForPlayer(oCaster, RoundsToSeconds(costs.nTimeCost));
|
||||
string sName;
|
||||
sName = GetName(oCaster)+"'s Magic Scepter";
|
||||
SetItemCharges(oSpellTarget, 50);
|
||||
//sName = Get2DACache("spells", "Name", nID);
|
||||
//sName = "Wand of "+GetStringByStrRef(StringToInt(sName));
|
||||
SetName(oSpellTarget, sName);
|
||||
SetItemCursedFlag(oSpellTarget, FALSE);
|
||||
SetDroppableFlag(oSpellTarget, TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
FloatingTextStrRefOnCreature(76417, oCaster); // Item Creation Failed
|
||||
return TRUE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Returns TRUE if the player used the last spell to craft a staff
|
||||
// -----------------------------------------------------------------------------
|
||||
int CICraftCheckCraftStaff(object oSpellTarget, object oCaster, int nSpellID = 0)
|
||||
{
|
||||
|
||||
@@ -1027,7 +1359,7 @@ int CICraftCheckCraftStaff(object oSpellTarget, object oCaster, int nSpellID = 0
|
||||
These dont work as IPs since they are hardcoded */
|
||||
}
|
||||
}
|
||||
int nCostMod = GetPRCSwitch(X2_CI_CRAFTSTAFF_COSTMODIFIER);
|
||||
int nCostMod = GetPRCSwitch(PRC_X2_CRAFTSTAFF_COSTMODIFIER);
|
||||
if(!nCostMod) nCostMod = 750;
|
||||
int nLvlRow = IPGetIPConstCastSpellFromSpellID(nSpellID);
|
||||
int nCLevel = StringToInt(Get2DACache("iprp_spells","CasterLvl",nLvlRow));
|
||||
@@ -1114,6 +1446,9 @@ These dont work as IPs since they are hardcoded */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Returns TRUE if the player used the last spell to craft a rod
|
||||
// -----------------------------------------------------------------------------
|
||||
int CICraftCheckCraftRod(object oSpellTarget, object oCaster, int nSpellID = 0)
|
||||
{
|
||||
|
||||
@@ -1175,7 +1510,7 @@ int CICraftCheckCraftRod(object oSpellTarget, object oCaster, int nSpellID = 0)
|
||||
These dont work as IPs since they are hardcoded */
|
||||
}
|
||||
}
|
||||
int nCostMod = GetPRCSwitch(X2_CI_CRAFTROD_COSTMODIFIER);
|
||||
int nCostMod = GetPRCSwitch(PRC_X2_CRAFTROD_COSTMODIFIER);
|
||||
if(!nCostMod) nCostMod = 750;
|
||||
int nLvlRow = IPGetIPConstCastSpellFromSpellID(nSpellID);
|
||||
int nCLevel = StringToInt(Get2DACache("iprp_spells","CasterLvl",nLvlRow));
|
||||
@@ -1260,6 +1595,7 @@ These dont work as IPs since they are hardcoded */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
int InscribeRune(object oTarget = OBJECT_INVALID, object oCaster = OBJECT_INVALID, int nSpell = 0)
|
||||
{
|
||||
if(!GetIsObjectValid(oCaster)) oCaster = OBJECT_SELF;
|
||||
@@ -1310,6 +1646,11 @@ int InscribeRune(object oTarget = OBJECT_INVALID, object oCaster = OBJECT_INVALI
|
||||
|
||||
if(!GetIsObjectValid(oTarget)) oTarget = PRCGetSpellTargetObject();
|
||||
int nCaster = GetAlternativeCasterLevel(oCaster, PRCGetCasterLevel(oCaster));
|
||||
|
||||
//:: Check for Inscribe Epic Runes and cap CL at 20 if it doesn't exist.
|
||||
int bEpicRunes = GetHasFeat(EPIC_FEAT_INSCRIBE_EPIC_RUNES, oCaster);
|
||||
if (!bEpicRunes) { if(nCaster > 20) nCaster = 20; }
|
||||
|
||||
int nDC = PRCGetSaveDC(oTarget, oCaster);
|
||||
if(!nSpell) nSpell = PRCGetSpellId();
|
||||
int nSpellLevel = 0;
|
||||
@@ -1332,6 +1673,7 @@ int InscribeRune(object oTarget = OBJECT_INVALID, object oCaster = OBJECT_INVALI
|
||||
// Minimum level.
|
||||
if (nSpellLevel == 0) nSpellLevel = 1;
|
||||
|
||||
|
||||
// This will be modified with Runecaster code later.
|
||||
int nCharges = 1;
|
||||
if (GetLocalInt(oCaster, "RuneCharges")) nCharges = nCount;
|
||||
@@ -1440,9 +1782,14 @@ int InscribeRune(object oTarget = OBJECT_INVALID, object oCaster = OBJECT_INVALI
|
||||
// If they have this active, the bonuses are already added, so skip
|
||||
// If they don't, add the bonuses down below
|
||||
if(GetHasSpellEffect(SPELL_RUNE_CHANT))
|
||||
nRuneChant = 0;
|
||||
nRuneChant = 0;
|
||||
|
||||
itemproperty ipLevel = ItemPropertyCastSpellCasterLevel(nSpell, PRCGetCasterLevel());
|
||||
//:: Check for Inscribe Epic Runes and cap CL at 20 if it doesn't exist.
|
||||
nCaster = PRCGetCasterLevel();
|
||||
|
||||
if (!bEpicRunes) { if(nCaster > 20) nCaster = 20; }
|
||||
|
||||
itemproperty ipLevel = ItemPropertyCastSpellCasterLevel(nSpell, nCaster);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ipLevel,oRune);
|
||||
itemproperty ipMeta = ItemPropertyCastSpellMetamagic(nSpell, PRCGetMetaMagicFeat());
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ipMeta,oRune);
|
||||
@@ -1544,18 +1891,28 @@ int AttuneGem(object oTarget = OBJECT_INVALID, object oCaster = OBJECT_INVALID,
|
||||
// No point scribing Gems from items, and its not allowed.
|
||||
if (oItem != OBJECT_INVALID)
|
||||
{
|
||||
FloatingTextStringOnCreature("You cannot scribe a Gem from an item.", oCaster, FALSE);
|
||||
FloatingTextStringOnCreature("You cannot attune a Gem from an item.", oCaster, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
// oTarget here should be the gem. If it's not, fail.
|
||||
if(!GetIsObjectValid(oTarget)) oTarget = PRCGetSpellTargetObject();
|
||||
// Only accepts bioware gems
|
||||
if (GetStringLeft(GetResRef(oTarget), 5) == "it_gem")
|
||||
// Only accepts bioware gems & Craftable Natural Resources gems, but not gem dust.
|
||||
int bIsBioGem = (GetStringLeft(GetResRef(oTarget), 5) == "it_gem");
|
||||
int bIsCNRGem = (GetStringLeft(GetResRef(oTarget), 6) == "cnrgem");
|
||||
int bIsDust = (GetStringLeft(GetResRef(oTarget), 10) == "cnrgemdust");
|
||||
|
||||
if (!(bIsBioGem || bIsCNRGem) || bIsDust)
|
||||
{
|
||||
FloatingTextStringOnCreature("Spell target is not a valid gem.", oCaster, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* if ((GetStringLeft(GetResRef(oTarget), 5) == "it_gem") || (GetStringLeft(GetResRef(oTarget), 6) == "cnrgem") && (GetStringLeft(GetResRef(oTarget), 10) != "cnrgemdust"))
|
||||
{
|
||||
FloatingTextStringOnCreature("Spell target is not a valid gem.", oCaster, FALSE);
|
||||
// And out we go
|
||||
return TRUE;
|
||||
}
|
||||
} */
|
||||
|
||||
int nCaster = GetAlternativeCasterLevel(oCaster, PRCGetCasterLevel(oCaster));
|
||||
int nDC = PRCGetSaveDC(oTarget, oCaster);
|
||||
@@ -1952,6 +2309,19 @@ int CIGetSpellWasUsedForItemCreation(object oSpellTarget)
|
||||
nRet = CICraftCheckCraftStaff(oSpellTarget,oCaster);
|
||||
break;
|
||||
|
||||
case BASE_ITEM_CRAFTED_SCEPTER :
|
||||
// -------------------------------------------------
|
||||
// Craft Scepter
|
||||
// -------------------------------------------------
|
||||
nRet = CICraftCheckCraftScepter(oSpellTarget,oCaster);
|
||||
break;
|
||||
|
||||
case BASE_ITEM_MUNDANE_HERB :
|
||||
// -------------------------------------------------
|
||||
// Create Infusion
|
||||
// -------------------------------------------------
|
||||
nRet = CICraftCheckCreateInfusion(oSpellTarget,oCaster);
|
||||
break;
|
||||
// you could add more crafting basetypes here....
|
||||
}
|
||||
|
||||
@@ -2740,6 +3110,16 @@ int GetMagicalArtisanFeat(int nCraftingFeat)
|
||||
nReturn = FEAT_MAGICAL_ARTISAN_CRAFT_SKULL_TALISMAN;
|
||||
break;
|
||||
}
|
||||
case FEAT_CREATE_INFUSION:
|
||||
{
|
||||
nReturn = FEAT_MAGICAL_ARTISAN_CREATE_INFUSION;
|
||||
break;
|
||||
}
|
||||
case FEAT_CRAFT_SCEPTER:
|
||||
{
|
||||
nReturn = FEAT_MAGICAL_ARTISAN_CRAFT_SCEPTER;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
if(DEBUG) DoDebug("GetMagicalArtisanFeat: invalid crafting feat");
|
||||
@@ -2941,6 +3321,306 @@ int GetAlternativeCasterLevel(object oPC, int nLevel)
|
||||
return nLevel;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Returns TRUE if the player successfully performed Create Infusion
|
||||
// -----------------------------------------------------------------------------
|
||||
int CICraftCheckCreateInfusion(object oSpellTarget, object oCaster, int nID = 0)
|
||||
{
|
||||
if (nID == 0) nID = PRCGetSpellId();
|
||||
|
||||
int bIsSubradial = GetIsSubradialSpell(nID);
|
||||
|
||||
if(bIsSubradial)
|
||||
{
|
||||
nID = GetMasterSpellFromSubradial(nID);
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Check if the caster has the Create Infusion feat
|
||||
// -------------------------------------------------------------------------
|
||||
if (!GetHasFeat(FEAT_CREATE_INFUSION, oCaster))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(40487, oCaster); // Missing feat
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Divine spellcasters only
|
||||
// -------------------------------------------------------------------------
|
||||
int nClass = PRCGetLastSpellCastClass();
|
||||
if (!GetIsDivineClass(nClass))
|
||||
{
|
||||
FloatingTextStringOnCreature("Only divine casters can create infusions.", oCaster, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Check if spell is restricted for Create Infusion
|
||||
// -------------------------------------------------------------------------
|
||||
if (CIGetIsSpellRestrictedFromCraftFeat(nID, X2_CI_CREATEINFUSION_FEAT_ID))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(83451, oCaster); // Spell not allowed
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Optional PnP Herb check
|
||||
// -------------------------------------------------------------------------
|
||||
int bPnPHerbs = GetPRCSwitch(PRC_CREATE_INFUSION_OPTIONAL_HERBS);
|
||||
if(bPnPHerbs)
|
||||
{
|
||||
int nSpellschool = GetSpellSchool(nID);
|
||||
int nHerbSchool = GetHerbsSpellSchool(oSpellTarget);
|
||||
|
||||
int nSpellLevel = PRCGetSpellLevelForClass(nID, nClass);
|
||||
int nHerbLevel = GetHerbsInfusionSpellLevel(oSpellTarget);
|
||||
|
||||
if(nSpellschool != nHerbSchool)
|
||||
{
|
||||
// Herb is for wrong spellschool
|
||||
FloatingTextStringOnCreature("This herb isn't appropriate for this spell school", oCaster);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if(nSpellLevel > nHerbLevel)
|
||||
{
|
||||
// Herb spell circle level too low
|
||||
FloatingTextStringOnCreature("This herb isn't appropriate for this spell level", oCaster);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// XP/GP Cost Calculation
|
||||
// -------------------------------------------------------------------------
|
||||
int nLevel = CIGetSpellInnateLevel(nID, TRUE);
|
||||
int nCostModifier = GetPRCSwitch(PRC_X2_CREATEINFUSION_COSTMODIFIER);
|
||||
if (nCostModifier == 0)
|
||||
nCostModifier = 25;
|
||||
|
||||
int nCost = CIGetCraftGPCost(nLevel, nCostModifier, PRC_CREATE_INFUSION_CASTER_LEVEL);
|
||||
struct craft_cost_struct costs = GetModifiedCostsFromBase(nCost, oCaster, FEAT_CREATE_INFUSION, FALSE);
|
||||
|
||||
// Adjust level for metamagic
|
||||
if (GetPRCSwitch(PRC_CREATE_INFUSION_CASTER_LEVEL))
|
||||
{
|
||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||
switch(nMetaMagic)
|
||||
{
|
||||
case METAMAGIC_EMPOWER: nLevel += 2; break;
|
||||
case METAMAGIC_EXTEND: nLevel += 1; break;
|
||||
case METAMAGIC_MAXIMIZE: nLevel += 3; break;
|
||||
// Unsupported metamagic IPs not added
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Check Gold
|
||||
// -------------------------------------------------------------------------
|
||||
if (!GetHasGPToSpend(oCaster, costs.nGoldCost))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(3786, oCaster); // Not enough gold
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Check XP
|
||||
// -------------------------------------------------------------------------
|
||||
if (!GetHasXPToSpend(oCaster, costs.nXPCost))
|
||||
{
|
||||
FloatingTextStrRefOnCreature(3785, oCaster); // Not enough XP
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Check alternative spell emulation requirements
|
||||
// -------------------------------------------------------------------------
|
||||
if (!CheckAlternativeCrafting(oCaster, nID, costs))
|
||||
{
|
||||
FloatingTextStringOnCreature("*Crafting failed!*", oCaster, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Create the infused herb item
|
||||
// -------------------------------------------------------------------------
|
||||
object oInfusion = CICreateInfusion(oCaster, nID);
|
||||
|
||||
if (GetIsObjectValid(oInfusion))
|
||||
{
|
||||
// Get the spell's display name from spells.2da via TLK
|
||||
int nNameStrRef = StringToInt(Get2DAString("spells", "Name", nID));
|
||||
string sSpellName = GetStringByStrRef(nNameStrRef);
|
||||
|
||||
// Rename the item
|
||||
string sNewName = "Infusion of " + sSpellName;
|
||||
SetName(oInfusion, sNewName);
|
||||
|
||||
// Post-creation actions
|
||||
SetIdentified(oInfusion, TRUE);
|
||||
ActionPlayAnimation(ANIMATION_FIREFORGET_READ, 1.0);
|
||||
SpendXP(oCaster, costs.nXPCost);
|
||||
SpendGP(oCaster, costs.nGoldCost);
|
||||
DestroyObject(oSpellTarget);
|
||||
FloatingTextStrRefOnCreature(8502, oCaster); // Item creation successful
|
||||
|
||||
if (!costs.nTimeCost) costs.nTimeCost = 1;
|
||||
AdvanceTimeForPlayer(oCaster, RoundsToSeconds(costs.nTimeCost));
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
FloatingTextStringOnCreature("Infusion creation failed", oCaster); // Item creation failed
|
||||
FloatingTextStrRefOnCreature(76417, oCaster); // Item creation failed
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* // -------------------------------------------------------------------------
|
||||
// Create the infused herb item
|
||||
// -------------------------------------------------------------------------
|
||||
object oInfusion = CICreateInfusion(oCaster, nID);
|
||||
|
||||
if (GetIsObjectValid(oInfusion))
|
||||
{
|
||||
SetIdentified(oInfusion, TRUE);
|
||||
ActionPlayAnimation(ANIMATION_FIREFORGET_READ, 1.0);
|
||||
SpendXP(oCaster, costs.nXPCost);
|
||||
SpendGP(oCaster, costs.nGoldCost);
|
||||
DestroyObject(oSpellTarget);
|
||||
FloatingTextStrRefOnCreature(8502, oCaster); // Item creation successful
|
||||
|
||||
if (!costs.nTimeCost) costs.nTimeCost = 1;
|
||||
AdvanceTimeForPlayer(oCaster, RoundsToSeconds(costs.nTimeCost));
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
FloatingTextStringOnCreature("Infusion creation failed", oCaster); // Item creation failed
|
||||
FloatingTextStrRefOnCreature(76417, oCaster); // Item creation failed
|
||||
return TRUE;
|
||||
} */
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Create and return an herbal infusion with an item property matching nSpellID
|
||||
// -----------------------------------------------------------------------------
|
||||
object CICreateInfusion(object oCreator, int nSpellID)
|
||||
{
|
||||
if (DEBUG) DoDebug("prc_x2_craft >> CICreateInfusion: Entering function");
|
||||
|
||||
// Keep the original spell id the engine gave us (may be a subradial)
|
||||
int nSpellOriginal = nSpellID;
|
||||
if (DEBUG) DoDebug("prc_x2_craft >> CICreateInfusion: nSpellOriginal is "+IntToString(nSpellOriginal)+".");
|
||||
|
||||
// Compute the master if this is a subradial. Keep original intact.
|
||||
int nSpellMaster = nSpellOriginal;
|
||||
if (GetIsSubradialSpell(nSpellOriginal))
|
||||
{
|
||||
nSpellMaster = GetMasterSpellFromSubradial(nSpellOriginal);
|
||||
if (DEBUG) DoDebug("CICreateInfusion: detected subradial " + IntToString(nSpellOriginal) + " master -> " + IntToString(nSpellMaster));
|
||||
}
|
||||
if (DEBUG) DoDebug("prc_x2_craft >> CICreateInfusion: nSpellMaster is "+IntToString(nSpellMaster)+".");
|
||||
|
||||
// Try to find an iprp_spells row for the original subradial first (preferred).
|
||||
int nPropID = IPGetIPConstCastSpellFromSpellID(nSpellOriginal);
|
||||
int nSpellUsedForIP = nSpellOriginal;
|
||||
|
||||
// If not found for original, fall back to the master/base spell.
|
||||
if (nPropID < 0)
|
||||
{
|
||||
if (DEBUG) DoDebug("CICreateInfusion: no iprp row for original " + IntToString(nSpellOriginal) + ", trying master " + IntToString(nSpellMaster));
|
||||
nPropID = IPGetIPConstCastSpellFromSpellID(nSpellMaster);
|
||||
nSpellUsedForIP = nSpellMaster;
|
||||
}
|
||||
|
||||
// If still invalid, bail out with a helpful message
|
||||
if (nPropID < 0)
|
||||
{
|
||||
if (DEBUG) DoDebug("CICreateInfusion: No iprp_spells entry for either original " + IntToString(nSpellOriginal) + " or master " + IntToString(nSpellMaster));
|
||||
FloatingTextStringOnCreature("This spell cannot be infused (no item property mapping).", oCreator, FALSE);
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
|
||||
if (DEBUG) DoDebug("CICreateInfusion: using spell " + IntToString(nSpellUsedForIP) + " (iprp row " + IntToString(nPropID) + ") for item property");
|
||||
|
||||
// Optional: check for material component (use the resolved iprp row)
|
||||
string sMat = GetMaterialComponentTag(nPropID);
|
||||
if (sMat != "")
|
||||
{
|
||||
object oMat = GetItemPossessedBy(oCreator, sMat);
|
||||
if (oMat == OBJECT_INVALID)
|
||||
{
|
||||
FloatingTextStrRefOnCreature(83374, oCreator); // Missing material component
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyObject(oMat);
|
||||
}
|
||||
}
|
||||
|
||||
// Only allow divine spellcasters
|
||||
int nClass = PRCGetLastSpellCastClass();
|
||||
if (!GetIsDivineClass(nClass))
|
||||
{
|
||||
FloatingTextStringOnCreature("Only divine casters can use Create Infusion.", oCreator, FALSE);
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
|
||||
// Create base infusion item (herb)
|
||||
string sResRef = "prc_infusion_000";
|
||||
object oTarget = CreateItemOnObject(sResRef, oCreator);
|
||||
if (oTarget == OBJECT_INVALID)
|
||||
{
|
||||
WriteTimestampedLogEntry("Create Infusion failed: couldn't create item with resref " + sResRef);
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
|
||||
// Confirm that the item is a herb
|
||||
int nBaseItem = GetBaseItemType(oTarget);
|
||||
if (nBaseItem != BASE_ITEM_INFUSED_HERB)
|
||||
{
|
||||
FloatingTextStringOnCreature("Only herbs may be infused.", oCreator, FALSE);
|
||||
DestroyObject(oTarget);
|
||||
return OBJECT_INVALID;
|
||||
}
|
||||
|
||||
// Remove all non-material item properties from the herb
|
||||
itemproperty ipRemove = GetFirstItemProperty(oTarget);
|
||||
while (GetIsItemPropertyValid(ipRemove))
|
||||
{
|
||||
itemproperty ipNext = GetNextItemProperty(oTarget);
|
||||
if (GetItemPropertyType(ipRemove) != ITEM_PROPERTY_MATERIAL)
|
||||
RemoveItemProperty(oTarget, ipRemove);
|
||||
ipRemove = ipNext;
|
||||
}
|
||||
|
||||
// Add the cast-spell itemproperty using the iprp row we resolved
|
||||
itemproperty ipSpell = ItemPropertyCastSpell(nPropID, IP_CONST_CASTSPELL_NUMUSES_SINGLE_USE);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ipSpell, oTarget);
|
||||
|
||||
// Optional PRC casting metadata: use the SAME spell id that matched the iprp row
|
||||
// so caster level/DC/meta line up with the actual cast property on the item.
|
||||
if (GetPRCSwitch(PRC_CREATE_INFUSION_CASTER_LEVEL))
|
||||
{
|
||||
int nCasterLevel = GetAlternativeCasterLevel(oCreator, PRCGetCasterLevel(oCreator));
|
||||
// nSpellUsedForIP is either original (if that had an iprp row) or the master (fallback)
|
||||
itemproperty ipLevel = ItemPropertyCastSpellCasterLevel(nSpellUsedForIP, nCasterLevel);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ipLevel, oTarget);
|
||||
|
||||
itemproperty ipMeta = ItemPropertyCastSpellMetamagic(nSpellUsedForIP, PRCGetMetaMagicFeat());
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ipMeta, oTarget);
|
||||
|
||||
int nDC = PRCGetSpellSaveDC(nSpellUsedForIP, GetSpellSchool(nSpellUsedForIP), OBJECT_SELF);
|
||||
itemproperty ipDC = ItemPropertyCastSpellDC(nSpellUsedForIP, nDC);
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ipDC, oTarget);
|
||||
}
|
||||
|
||||
return oTarget;
|
||||
}
|
||||
|
||||
|
||||
// Test main
|
||||
//void main(){}
|
||||
// void main(){}
|
||||
|
||||
@@ -20,9 +20,6 @@
|
||||
//:: Last Update: 2003-10-07
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
//:: Test void
|
||||
//:: void main (){}
|
||||
|
||||
//Changed by primogenitor to include CEP itemtypes
|
||||
|
||||
// * The tag of the ip work container, a placeable which has to be set into each
|
||||
@@ -697,6 +694,7 @@ if(nItem == BASE_ITEM_BASTARDSWORD
|
||||
|| nItem == BASE_ITEM_SICKLE
|
||||
|| nItem == BASE_ITEM_TWOBLADEDSWORD
|
||||
|| nItem == BASE_ITEM_CLUB
|
||||
|| nItem == BASE_ITEM_CRAFTED_SCEPTER
|
||||
|| nItem == BASE_ITEM_DAGGER
|
||||
|| nItem == BASE_ITEM_DIREMACE
|
||||
|| nItem == BASE_ITEM_HEAVYFLAIL
|
||||
@@ -729,6 +727,7 @@ if(nItem == BASE_ITEM_BASTARDSWORD
|
||||
|| nItem == BASE_ITEM_ELVEN_THINBLADE
|
||||
|| nItem == BASE_ITEM_ELVEN_COURTBLADE
|
||||
|| nItem == BASE_ITEM_CRAFTED_STAFF
|
||||
|| nItem == BASE_ITEM_CRAFTED_SCEPTER
|
||||
|| nItem == 300 //CEP Trident
|
||||
|| nItem == 303 //CEP Sai
|
||||
|| nItem == 304 //CEP nunchaku
|
||||
@@ -768,7 +767,6 @@ int IPGetIsBludgeoningWeapon(object oItem)
|
||||
// ----------------------------------------------------------------------------
|
||||
// Return the IP_CONST_CASTSPELL_* ID matching to the SPELL_* constant given
|
||||
// in nSPELL_ID.
|
||||
// This uses Get2DAstring, so it is slow. Avoid using in loops!
|
||||
// returns -1 if there is no matching property for a spell
|
||||
// ----------------------------------------------------------------------------
|
||||
int IPGetIPConstCastSpellFromSpellID(int nSpellID)
|
||||
@@ -1613,31 +1611,140 @@ int IPGetDamageBonusConstantFromNumber(int nNumber)
|
||||
// oOld - Item equipped before polymorphing (source for item props)
|
||||
// oNew - Item equipped after polymorphing (target for item props)
|
||||
// bWeapon - Must be set TRUE when oOld is a weapon.
|
||||
// ----------------------------------------------------------------------------
|
||||
// ----------------------------------------------------------------------------
|
||||
void IPWildShapeCopyItemProperties(object oOld, object oNew, int bWeapon = FALSE)
|
||||
{
|
||||
if (GetIsObjectValid(oOld) && GetIsObjectValid(oNew))
|
||||
{
|
||||
itemproperty ip = GetFirstItemProperty(oOld);
|
||||
while (GetIsItemPropertyValid(ip))
|
||||
{
|
||||
if (bWeapon)
|
||||
{
|
||||
if (GetWeaponRanged(oOld) == GetWeaponRanged(oNew) )
|
||||
{
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
||||
}
|
||||
ip = GetNextItemProperty(oOld);
|
||||
// Invalid source/target
|
||||
if (!GetIsObjectValid(oOld) || !GetIsObjectValid(oNew))
|
||||
return;
|
||||
|
||||
// Determine possessor
|
||||
object oPC = GetItemPossessor(oOld);
|
||||
if (!GetIsObjectValid(oPC))
|
||||
oPC = GetItemPossessor(oNew);
|
||||
|
||||
}
|
||||
}
|
||||
if (!GetIsObjectValid(oPC))
|
||||
{
|
||||
if (DEBUG) DoDebug("IPWS: Unable to determine item possessor");
|
||||
return;
|
||||
}
|
||||
|
||||
// Determine glove state once
|
||||
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||
|
||||
// Weapon ranged mismatch = do nothing (intent is no partial copy)
|
||||
if (bWeapon && GetWeaponRanged(oOld) != GetWeaponRanged(oNew))
|
||||
{
|
||||
if (DEBUG) DoDebug("IPWS: Weapon ranged mismatch <20> skipping all IP copy");
|
||||
return;
|
||||
}
|
||||
|
||||
// Begin property copy
|
||||
itemproperty ip = GetFirstItemProperty(oOld);
|
||||
while (GetIsItemPropertyValid(ip))
|
||||
{
|
||||
int nType = GetItemPropertyType(ip);
|
||||
|
||||
// If copying from gloves and monk gloves are active
|
||||
if (bMonkGloves
|
||||
&& (nType == ITEM_PROPERTY_DAMAGE_BONUS
|
||||
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|
||||
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP))
|
||||
{
|
||||
// Always apply glove damage IPs
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||
ip = GetNextItemProperty(oOld);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Normal weapon pass
|
||||
if (bWeapon)
|
||||
{
|
||||
// If monk gloves active ? skip ALL weapon damage IPs
|
||||
if (bMonkGloves
|
||||
&& (nType == ITEM_PROPERTY_DAMAGE_BONUS
|
||||
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|
||||
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP))
|
||||
{
|
||||
ip = GetNextItemProperty(oOld);
|
||||
continue;
|
||||
}
|
||||
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||
}
|
||||
else
|
||||
{
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||
}
|
||||
|
||||
ip = GetNextItemProperty(oOld);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* // ----------------------------------------------------------------------------
|
||||
// GZ, Sept. 30 2003
|
||||
// Special Version of Copy Item Properties for use with greater wild shape
|
||||
// oOld - Item equipped before polymorphing (source for item props)
|
||||
// oNew - Item equipped after polymorphing (target for item props)
|
||||
// bWeapon - Must be set TRUE when oOld is a weapon.
|
||||
// ----------------------------------------------------------------------------
|
||||
void IPWildShapeCopyItemProperties(object oOld, object oNew, int bWeapon = FALSE)
|
||||
{
|
||||
if (!GetIsObjectValid(oOld) || !GetIsObjectValid(oNew))
|
||||
return;
|
||||
|
||||
object oPC = GetItemPossessor(oOld);
|
||||
if (!GetIsObjectValid(oPC))
|
||||
{
|
||||
oPC = GetItemPossessor(oNew);
|
||||
}
|
||||
if (!GetIsObjectValid(oPC))
|
||||
{
|
||||
if (DEBUG) DoDebug("IPWS: Unable to determine item possessor");
|
||||
return;
|
||||
}
|
||||
|
||||
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||
|
||||
itemproperty ip = GetFirstItemProperty(oOld);
|
||||
while (GetIsItemPropertyValid(ip))
|
||||
{
|
||||
if (bWeapon)
|
||||
{
|
||||
// Gloves override weapon damage <20> skip weapon damage properties
|
||||
if (bMonkGloves)
|
||||
{
|
||||
int nType = GetItemPropertyType(ip);
|
||||
|
||||
// skip damage props
|
||||
if (nType == ITEM_PROPERTY_DAMAGE_BONUS
|
||||
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|
||||
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP)
|
||||
{
|
||||
if (DEBUG) DoDebug("IPWS: SKIPPED weapon damage IP");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DEBUG) DoDebug("IPWS: Applied non-damage weapon IP");
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||
}
|
||||
|
||||
}
|
||||
else if (GetWeaponRanged(oOld) == GetWeaponRanged(oNew) )
|
||||
{
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
||||
}
|
||||
|
||||
ip = GetNextItemProperty(oOld);
|
||||
}
|
||||
} */
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Returns the current enhancement bonus of a weapon (+1 to +20), 0 if there is
|
||||
// no enhancement bonus. You can test for a specific type of enhancement bonus
|
||||
@@ -1883,7 +1990,7 @@ int IPDamageConstant(int nDamBon)
|
||||
case 49: nIPBonus = IP_CONST_DAMAGEBONUS_49; break;
|
||||
case 50: nIPBonus = IP_CONST_DAMAGEBONUS_50; break;
|
||||
}
|
||||
if (nDamBon > 20) nIPBonus = IP_CONST_DAMAGEBONUS_50;
|
||||
if (nDamBon > 50) nIPBonus = IP_CONST_DAMAGEBONUS_50;
|
||||
|
||||
return nIPBonus;
|
||||
}
|
||||
@@ -2019,4 +2126,6 @@ int IPOnHitSaveDC(int nSaveDC)
|
||||
if (nSaveDC > 26) nIPBonus = IP_CONST_ONHIT_SAVEDC_26;
|
||||
|
||||
return nIPBonus;
|
||||
} */
|
||||
} */
|
||||
|
||||
//:: void main(){}
|
||||
@@ -73,6 +73,7 @@ void SetMasteryOfElements();
|
||||
|
||||
//#include "lookup_2da_spell"
|
||||
#include "prcsp_reputation"
|
||||
#include "prc_inc_core"
|
||||
//#include "prc_inc_spells"
|
||||
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "prc_ipfeat_const"
|
||||
#include "prc_feat_const"
|
||||
#include "inc_vfx_const"
|
||||
#include "prc_inc_nwscript"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
@@ -41,6 +41,8 @@ const int POWER_LIST_WARMIND = CLASS_TYPE_WARMIND;
|
||||
/* Function prototypes */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
int IsHiddenTalent(object oPC = OBJECT_SELF);
|
||||
|
||||
/**
|
||||
* Attempts to use psionic focus. If the creature was focused, it
|
||||
* loses the focus. If it has Epic Psionic Focus feats, it will
|
||||
@@ -520,9 +522,9 @@ void GainPsionicFocus(object oGainee = OBJECT_SELF)
|
||||
{
|
||||
int nPsySneak = 1;
|
||||
if(GetHasFeat(FEAT_PSY_SNEAK_ATTACK_2d6, oGainee))
|
||||
nPsySneak += 2;
|
||||
nPsySneak += 1;
|
||||
if(GetHasFeat(FEAT_PSY_SNEAK_ATTACK_3d6, oGainee))
|
||||
nPsySneak += 3;
|
||||
nPsySneak += 1;
|
||||
|
||||
SetLocalInt(oGainee, "PsyRogueSneak",nPsySneak);
|
||||
DelayCommand(0.1, ExecuteScript("prc_sneak_att", oGainee));
|
||||
@@ -786,69 +788,12 @@ int GetIsPsionicCharacter(object oCreature)
|
||||
GetHasFeat(FEAT_KALASHTAR_PP, oCreature) ||
|
||||
GetHasFeat(FEAT_NATPSIONIC_1, oCreature) ||
|
||||
GetHasFeat(FEAT_NATPSIONIC_2, oCreature) ||
|
||||
GetHasFeat(FEAT_NATPSIONIC_3, oCreature)
|
||||
GetHasFeat(FEAT_NATPSIONIC_3, oCreature) ||
|
||||
IsHiddenTalent(oCreature)
|
||||
// Racial psionicity signifying feats go here
|
||||
);
|
||||
}
|
||||
|
||||
int IsHiddenTalent(object oPC = OBJECT_SELF)
|
||||
{
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_BIOFEEDBACK, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_BITE_WOLF, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_BOLT, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_BURST, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CALLTOMIND, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CALL_WEAPONRY, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CHAMELEON, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CLAWS_BEAST, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_COMPRESSION, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CONCEALTHOUGHT, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CREATESOUND, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CRYSTALSHARD, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DAZE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DECELERATION, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DEFPRECOG, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DEMORALIZE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DISABLE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DISSIPATINGTOUCH, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DISTRACT, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_ELFSIGHT, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_EMPATHY, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_EMPTYMIND, oPC) ||
|
||||
//GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_ENTANGLE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_EXPANSION, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_FARHAND, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_FORCESCREEN, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_GREASE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_HAMMER, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_INERTIALARMOUR, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_MATTERAGITATION, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_METAPHYSICAL_CLAW, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_METAPHYSICAL_WEAPON, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_MINDTHRUST, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_MYLIGHT, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_OFFPRECOG, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_OFFPRESC, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_PREVENOM, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_PREVENOM_WEAPON, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_SKATE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_STOMP, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_SYNESTHETE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_TELEMPATHICPRO, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_THICKSKIN, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_VIGOR, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_GRIP_IRON, oPC))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LocalCleanExtraFists(object oCreature)
|
||||
{
|
||||
int iIsCWeap, iIsEquip;
|
||||
@@ -985,6 +930,48 @@ int PracticedManifesting(object oManifester, int iManifestingClass, int iManifes
|
||||
|
||||
int GetManifesterLevel(object oManifester, int nSpecificClass = CLASS_TYPE_INVALID, int nMaxPowerLevel = FALSE)
|
||||
{
|
||||
// Handle POWER_LIST_MISC (Hidden Talent) powers
|
||||
// Check if this is a power list call
|
||||
int nPowerType = GetLocalInt(oManifester, "PRC_UsePowerList");
|
||||
|
||||
if(nSpecificClass == CLASS_TYPE_INVALID && nPowerType == POWER_LIST_MISC)
|
||||
{
|
||||
if(DEBUG) DoDebug("psi_inc_core >> GetManifesterLevel: CLASS_TYPE_INVALID + POWER_LIST_MISC found!");
|
||||
// Check if character has psionic class levels
|
||||
int nPsionLevel = GetLevelByClass(CLASS_TYPE_PSION, oManifester);
|
||||
int nPsywarLevel = GetLevelByClass(CLASS_TYPE_PSYWAR, oManifester);
|
||||
int nWilderLevel = GetLevelByClass(CLASS_TYPE_WILDER, oManifester);
|
||||
int nWarmindLevel = GetLevelByClass(CLASS_TYPE_WARMIND, oManifester);
|
||||
int nFistOfZuokenLevel = GetLevelByClass(CLASS_TYPE_FIST_OF_ZUOKEN, oManifester);
|
||||
int nPsychicRogueLevel = GetLevelByClass(CLASS_TYPE_PSYCHIC_ROGUE, oManifester);
|
||||
|
||||
// If no psionic levels, use Charisma-based calculation (treat as 1st level)
|
||||
if(nPsionLevel + nPsywarLevel + nWilderLevel + nWarmindLevel +
|
||||
nFistOfZuokenLevel + nPsychicRogueLevel == 0)
|
||||
{
|
||||
// Hidden Talent: considered 1st-level manifester, but must have CHA 11+
|
||||
if(DEBUG) DoDebug("psi_inc_core >> GetManifesterLevel: Hidden Talent found!");
|
||||
if(GetAbilityScore(oManifester, ABILITY_CHARISMA) >= 11)
|
||||
return 1;
|
||||
else
|
||||
return 0; // Cannot manifest without CHA 11+
|
||||
}
|
||||
|
||||
if(DEBUG) DoDebug("psi_inc_core >> GetManifesterLevel: nSpecificClass=" + IntToString(nSpecificClass) +
|
||||
", nPowerType=" + IntToString(nPowerType));
|
||||
|
||||
// Has psionic levels - return highest manifester level
|
||||
int nHighest = 0;
|
||||
if(nPsionLevel > 0) nHighest = GetManifesterLevel(oManifester, CLASS_TYPE_PSION);
|
||||
if(nPsywarLevel > 0) nHighest = PRCMax(nHighest, GetManifesterLevel(oManifester, CLASS_TYPE_PSYWAR));
|
||||
if(nWilderLevel > 0) nHighest = PRCMax(nHighest, GetManifesterLevel(oManifester, CLASS_TYPE_WILDER));
|
||||
if(nWarmindLevel > 0) nHighest = PRCMax(nHighest, GetManifesterLevel(oManifester, CLASS_TYPE_WARMIND));
|
||||
if(nFistOfZuokenLevel > 0) nHighest = PRCMax(nHighest, GetManifesterLevel(oManifester, CLASS_TYPE_FIST_OF_ZUOKEN));
|
||||
if(nPsychicRogueLevel > 0) nHighest = PRCMax(nHighest, GetManifesterLevel(oManifester, CLASS_TYPE_PSYCHIC_ROGUE));
|
||||
|
||||
return nHighest;
|
||||
}
|
||||
|
||||
int nLevel;
|
||||
int nAdjust = GetLocalInt(oManifester, PRC_CASTERLEVEL_ADJUSTMENT);
|
||||
nAdjust -= GetLocalInt(oManifester, "WoLManifPenalty");
|
||||
@@ -1049,17 +1036,27 @@ int GetManifesterLevel(object oManifester, int nSpecificClass = CLASS_TYPE_INVAL
|
||||
|
||||
DelayCommand(1.0, DeleteLocalInt(oManifester, PRC_CASTERLEVEL_OVERRIDE));
|
||||
nLevel = GetLocalInt(oManifester, PRC_CASTERLEVEL_OVERRIDE);
|
||||
}
|
||||
else if(GetManifestingClass(oManifester) != CLASS_TYPE_INVALID)
|
||||
{
|
||||
//Gets the manifesting class
|
||||
int nManifestingClass = GetManifestingClass(oManifester);
|
||||
if(DEBUG) DoDebug("Manifesting Class #2: " + IntToString(nManifestingClass), oManifester);
|
||||
nLevel = GetLevelByClass(nManifestingClass, oManifester);
|
||||
// Add levels from +ML PrCs only for the first manifesting class
|
||||
nLevel += GetPsionicPRCLevels(oManifester, nManifestingClass);
|
||||
//nLevel += nManifestingClass == GetPrimaryPsionicClass(oManifester) ? GetPsionicPRCLevels(oManifester) : 0;
|
||||
|
||||
}
|
||||
else if(GetManifestingClass(oManifester) != CLASS_TYPE_INVALID)
|
||||
{
|
||||
//Gets the manifesting class
|
||||
int nManifestingClass = GetManifestingClass(oManifester);
|
||||
if(DEBUG) DoDebug("Manifesting Class #2: " + IntToString(nManifestingClass), oManifester);
|
||||
|
||||
nLevel = GetLevelByClass(nManifestingClass, oManifester);
|
||||
// Add levels from +ML PrCs only for the first manifesting class
|
||||
nLevel += GetPsionicPRCLevels(oManifester, nManifestingClass);
|
||||
|
||||
// CHECK: If this is Hidden Talent and character has no levels, set to 1
|
||||
if(nLevel == 0 && GetLocalInt(oManifester, "PRC_UsePowerList") == TRUE &&
|
||||
GetLocalInt(oManifester, "PRC_PowerListType") == POWER_LIST_MISC)
|
||||
{
|
||||
if(GetAbilityScore(oManifester, ABILITY_CHARISMA) >= 11)
|
||||
{
|
||||
if(DEBUG) DoDebug("GetManifesterLevel: Hidden Talent with no psionic levels, returning 1");
|
||||
nLevel = 1;
|
||||
}
|
||||
}
|
||||
// Psionic vestiges are tucked in here to override things.
|
||||
// This assumes that there will never be a psion with this spell effect manifesting things
|
||||
if (nManifestingClass == CLASS_TYPE_PSION && GetHasSpellEffect(VESTIGE_ARETE, oManifester) && !nMaxPowerLevel)
|
||||
@@ -1085,7 +1082,37 @@ int GetManifesterLevel(object oManifester, int nSpecificClass = CLASS_TYPE_INVAL
|
||||
// if(DEBUG) DoDebug("Level gotten via GetLevelByClass: " + IntToString(nLevel), oManifester);
|
||||
}
|
||||
|
||||
// If you have a primary psionic class and no manifester level yet, get levels based on that
|
||||
// If you have a primary psionic class and no manifester level yet, get levels based on that
|
||||
if (GetPrimaryPsionicClass(oManifester) && nLevel == 0)
|
||||
{
|
||||
int nClass = GetPrimaryPsionicClass(oManifester);
|
||||
nLevel = GetLevelByClass(nClass, oManifester);
|
||||
nLevel += GetPsionicPRCLevels(oManifester, nClass);
|
||||
nLevel += PracticedManifesting(oManifester, nClass, nLevel);
|
||||
}
|
||||
|
||||
// If everything else fails, check for Hidden Talent before returning 0
|
||||
if(nLevel == 0)
|
||||
{
|
||||
// Check if this is a Hidden Talent power
|
||||
if(GetLocalInt(oManifester, "PRC_UsePowerList") == POWER_LIST_MISC)
|
||||
{
|
||||
// Hidden Talent: manifester level is 1 if they have CHA 11+
|
||||
if(GetAbilityScore(oManifester, ABILITY_CHARISMA) >= 11)
|
||||
{
|
||||
if(DEBUG) DoDebug("GetManifesterLevel: Hidden Talent character, returning level 1");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if(DEBUG) DoDebug("Failed to get manifester level for creature " + DebugObject2Str(oManifester) + ", using first class slot");
|
||||
//else WriteTimestampedLogEntry("Failed to get manifester level for creature " + DebugObject2Str(oManifester) + ", using first class slot");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* // If you have a primary psionic class and no manifester level yet, get levels based on that
|
||||
if (GetPrimaryPsionicClass(oManifester) && nLevel == 0)
|
||||
{
|
||||
int nClass = GetPrimaryPsionicClass(oManifester);
|
||||
@@ -1102,7 +1129,7 @@ int GetManifesterLevel(object oManifester, int nSpecificClass = CLASS_TYPE_INVAL
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
// The bonuses inside only apply to normal manifestation
|
||||
if(!GetLocalInt(oManifester, PRC_IS_PSILIKE))
|
||||
@@ -1665,4 +1692,225 @@ int GetMaxPowerLevel(object oManifester)
|
||||
int nMax = StringToInt(Get2DACache(sFile, "MaxPowerLevel", nLevel));
|
||||
if (DEBUG) DoDebug("GetMaxPowerLevel is "+IntToString(nMax));
|
||||
return nMax;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////
|
||||
/* START HIDDEN TALENT */
|
||||
//////////////////////////////////////////////////////
|
||||
|
||||
int IsHiddenTalent(object oPC = OBJECT_SELF)
|
||||
{
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_BIOFEEDBACK, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_BITE_WOLF, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_BOLT, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_BURST, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CALLTOMIND, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CALL_WEAPONRY, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CHAMELEON, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CLAWS_BEAST, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_COMPRESSION, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CONCEALTHOUGHT, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CREATESOUND, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_CRYSTALSHARD, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DAZE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DECELERATION, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DEFPRECOG, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DEMORALIZE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DISABLE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DISSIPATINGTOUCH, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_DISTRACT, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_ELFSIGHT, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_EMPATHY, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_EMPTYMIND, oPC) ||
|
||||
//GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_ENTANGLE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_EXPANSION, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_FARHAND, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_FORCESCREEN, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_GREASE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_HAMMER, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_INERTIALARMOUR, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_MATTERAGITATION, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_METAPHYSICAL_CLAW, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_METAPHYSICAL_WEAPON, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_MINDTHRUST, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_MYLIGHT, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_OFFPRECOG, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_OFFPRESC, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_PREVENOM, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_PREVENOM_WEAPON, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_SKATE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_STOMP, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_SYNESTHETE, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_TELEMPATHICPRO, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_THICKSKIN, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_VIGOR, oPC) ||
|
||||
GetHasFeat(FEAT_HIDDEN_TALENT_GRIP_IRON, oPC))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
int GetHiddenTalentPowerFromFeat(int nFeatID)
|
||||
{
|
||||
// Map Hidden Talent feats to their corresponding power IDs
|
||||
// Using the same mappings as GetIsHiddenTalentPower()
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_BIOFEEDBACK) return POWER_BIOFEEDBACK;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_BITE_WOLF) return POWER_BITE_WOLF;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_BOLT) return POWER_BOLT;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_BURST) return POWER_BURST;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_CALLTOMIND) return POWER_CALLTOMIND;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_CALL_WEAPONRY) return POWER_CALL_WEAPONRY;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_CHAMELEON) return POWER_CHAMELEON;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_CLAWS_BEAST) return POWER_CLAWS_BEAST;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_COMPRESSION) return POWER_COMPRESSION;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_CONCEALTHOUGHT) return POWER_CONCEALTHOUGHT;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_CREATESOUND) return POWER_CREATESOUND;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_CRYSTALSHARD) return POWER_CRYSTALSHARD;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_DAZE) return POWER_DAZE;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_DECELERATION) return POWER_DECELERATION;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_DEFPRECOG) return POWER_DEFPRECOG;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_DEMORALIZE) return POWER_DEMORALIZE;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_DISABLE) return POWER_DISABLE;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_DISSIPATINGTOUCH)return POWER_DISSIPATINGTOUCH;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_DISTRACT) return POWER_DISTRACT;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_ELFSIGHT) return POWER_ELFSIGHT;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_EMPATHY) return POWER_EMPATHY;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_EMPTYMIND) return POWER_EMPTYMIND;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_ENTANGLE) return POWER_ENTANGLE;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_EXPANSION) return POWER_EXPANSION;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_FARHAND) return POWER_FARHAND;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_FORCESCREEN) return POWER_FORCESCREEN;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_GREASE) return POWER_GREASE;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_HAMMER) return POWER_HAMMER;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_INERTIALARMOUR) return POWER_INERTIALARMOUR;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_MATTERAGITATION) return POWER_MATTERAGITATION;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_METAPHYSICAL_CLAW) return POWER_METAPHYSICAL_CLAW;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_METAPHYSICAL_WEAPON) return POWER_METAPHYSICAL_WEAPON;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_MINDTHRUST) return POWER_MINDTHRUST;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_MYLIGHT) return POWER_MYLIGHT;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_OFFPRECOG) return POWER_OFFPRECOG;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_OFFPRESC) return POWER_OFFPRESC;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_PREVENOM) return POWER_PREVENOM;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_PREVENOM_WEAPON) return POWER_PREVENOM_WEAPON;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_SKATE) return POWER_SKATE;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_STOMP) return POWER_STOMP;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_SYNESTHETE) return POWER_SYNESTHETE;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_TELEMPATHICPRO) return POWER_TELEMPATHICPRO;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_THICKSKIN) return POWER_THICKSKIN;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_VIGOR) return POWER_VIGOR;
|
||||
if(nFeatID == FEAT_HIDDEN_TALENT_GRIP_IRON) return POWER_GRIP_IRON;
|
||||
|
||||
return -1; // Not found
|
||||
}
|
||||
|
||||
int GetHiddenTalentCount(object oPC = OBJECT_SELF)
|
||||
{
|
||||
int nCount = 0;
|
||||
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_BIOFEEDBACK, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_BITE_WOLF, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_BOLT, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_BURST, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_CALLTOMIND, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_CALL_WEAPONRY, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_CHAMELEON, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_CLAWS_BEAST, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_COMPRESSION, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_CONCEALTHOUGHT, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_CREATESOUND, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_CRYSTALSHARD, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_DAZE, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_DECELERATION, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_DEFPRECOG, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_DEMORALIZE, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_DISABLE, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_DISSIPATINGTOUCH, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_DISTRACT, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_ELFSIGHT, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_EMPATHY, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_EMPTYMIND, oPC)) nCount++;
|
||||
//if (GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_ENTANGLE, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_EXPANSION, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_FARHAND, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_FORCESCREEN, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_GREASE, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_HAMMER, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_INERTIALARMOUR, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_MATTERAGITATION, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_METAPHYSICAL_CLAW, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_METAPHYSICAL_WEAPON, oPC))nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_MINDTHRUST, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_MYLIGHT, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_OFFPRECOG, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_OFFPRESC, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_PREVENOM, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_PREVENOM_WEAPON, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_SKATE, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_STOMP, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_SYNESTHETE, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_TELEMPATHICPRO, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_THICKSKIN, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_VIGOR, oPC)) nCount++;
|
||||
if (GetHasFeat(FEAT_HIDDEN_TALENT_GRIP_IRON, oPC)) nCount++;
|
||||
|
||||
return nCount;
|
||||
}
|
||||
|
||||
int GetIsHiddenTalentPower(object oPC, int nPower)
|
||||
{
|
||||
// Check each Hidden Talent feat to see if it grants this power
|
||||
if(nPower == POWER_BIOFEEDBACK && GetHasFeat(FEAT_HIDDEN_TALENT_BIOFEEDBACK, oPC)) return TRUE;
|
||||
if(nPower == POWER_BITE_WOLF && GetHasFeat(FEAT_HIDDEN_TALENT_BITE_WOLF, oPC)) return TRUE;
|
||||
if(nPower == POWER_BOLT && GetHasFeat(FEAT_HIDDEN_TALENT_BOLT, oPC)) return TRUE;
|
||||
if(nPower == POWER_BURST && GetHasFeat(FEAT_HIDDEN_TALENT_BURST, oPC)) return TRUE;
|
||||
if(nPower == POWER_CALLTOMIND && GetHasFeat(FEAT_HIDDEN_TALENT_CALLTOMIND, oPC)) return TRUE;
|
||||
if(nPower == POWER_CALL_WEAPONRY && GetHasFeat(FEAT_HIDDEN_TALENT_CALL_WEAPONRY, oPC)) return TRUE;
|
||||
if(nPower == POWER_CHAMELEON && GetHasFeat(FEAT_HIDDEN_TALENT_CHAMELEON, oPC)) return TRUE;
|
||||
if(nPower == POWER_CLAWS_BEAST && GetHasFeat(FEAT_HIDDEN_TALENT_CLAWS_BEAST, oPC)) return TRUE;
|
||||
if(nPower == POWER_COMPRESSION && GetHasFeat(FEAT_HIDDEN_TALENT_COMPRESSION, oPC)) return TRUE;
|
||||
if(nPower == POWER_CONCEALTHOUGHT && GetHasFeat(FEAT_HIDDEN_TALENT_CONCEALTHOUGHT, oPC)) return TRUE;
|
||||
if(nPower == POWER_CREATESOUND && GetHasFeat(FEAT_HIDDEN_TALENT_CREATESOUND, oPC)) return TRUE;
|
||||
if(nPower == POWER_CRYSTALSHARD && GetHasFeat(FEAT_HIDDEN_TALENT_CRYSTALSHARD, oPC)) return TRUE;
|
||||
if(nPower == POWER_DAZE && GetHasFeat(FEAT_HIDDEN_TALENT_DAZE, oPC)) return TRUE;
|
||||
if(nPower == POWER_DECELERATION && GetHasFeat(FEAT_HIDDEN_TALENT_DECELERATION, oPC)) return TRUE;
|
||||
if(nPower == POWER_DEFPRECOG && GetHasFeat(FEAT_HIDDEN_TALENT_DEFPRECOG, oPC)) return TRUE;
|
||||
if(nPower == POWER_DEMORALIZE && GetHasFeat(FEAT_HIDDEN_TALENT_DEMORALIZE, oPC)) return TRUE;
|
||||
if(nPower == POWER_DISABLE && GetHasFeat(FEAT_HIDDEN_TALENT_DISABLE, oPC)) return TRUE;
|
||||
if(nPower == POWER_DISSIPATINGTOUCH && GetHasFeat(FEAT_HIDDEN_TALENT_DISSIPATINGTOUCH, oPC)) return TRUE;
|
||||
if(nPower == POWER_DISTRACT && GetHasFeat(FEAT_HIDDEN_TALENT_DISTRACT, oPC)) return TRUE;
|
||||
if(nPower == POWER_ELFSIGHT && GetHasFeat(FEAT_HIDDEN_TALENT_ELFSIGHT, oPC)) return TRUE;
|
||||
if(nPower == POWER_EMPATHY && GetHasFeat(FEAT_HIDDEN_TALENT_EMPATHY, oPC)) return TRUE;
|
||||
if(nPower == POWER_EMPTYMIND && GetHasFeat(FEAT_HIDDEN_TALENT_EMPTYMIND, oPC)) return TRUE;
|
||||
//if(nPower == POWER_ENERGYRAY && GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC)) return TRUE;
|
||||
if(nPower == POWER_ENTANGLE && GetHasFeat(FEAT_HIDDEN_TALENT_ENTANGLE, oPC)) return TRUE;
|
||||
if(nPower == POWER_EXPANSION && GetHasFeat(FEAT_HIDDEN_TALENT_EXPANSION, oPC)) return TRUE;
|
||||
if(nPower == POWER_FARHAND && GetHasFeat(FEAT_HIDDEN_TALENT_FARHAND, oPC)) return TRUE;
|
||||
if(nPower == POWER_FORCESCREEN && GetHasFeat(FEAT_HIDDEN_TALENT_FORCESCREEN, oPC)) return TRUE;
|
||||
if(nPower == POWER_GREASE && GetHasFeat(FEAT_HIDDEN_TALENT_GREASE, oPC)) return TRUE;
|
||||
if(nPower == POWER_HAMMER && GetHasFeat(FEAT_HIDDEN_TALENT_HAMMER, oPC)) return TRUE;
|
||||
if(nPower == POWER_INERTIALARMOUR && GetHasFeat(FEAT_HIDDEN_TALENT_INERTIALARMOUR, oPC)) return TRUE;
|
||||
if(nPower == POWER_MATTERAGITATION && GetHasFeat(FEAT_HIDDEN_TALENT_MATTERAGITATION, oPC)) return TRUE;
|
||||
if(nPower == POWER_METAPHYSICAL_CLAW && GetHasFeat(FEAT_HIDDEN_TALENT_METAPHYSICAL_CLAW, oPC)) return TRUE;
|
||||
if(nPower == POWER_METAPHYSICAL_WEAPON && GetHasFeat(FEAT_HIDDEN_TALENT_METAPHYSICAL_WEAPON, oPC)) return TRUE;
|
||||
if(nPower == POWER_MINDTHRUST && GetHasFeat(FEAT_HIDDEN_TALENT_MINDTHRUST, oPC)) return TRUE;
|
||||
if(nPower == POWER_MYLIGHT && GetHasFeat(FEAT_HIDDEN_TALENT_MYLIGHT, oPC)) return TRUE;
|
||||
if(nPower == POWER_OFFPRECOG && GetHasFeat(FEAT_HIDDEN_TALENT_OFFPRECOG, oPC)) return TRUE;
|
||||
if(nPower == POWER_OFFPRESC && GetHasFeat(FEAT_HIDDEN_TALENT_OFFPRESC, oPC)) return TRUE;
|
||||
if(nPower == POWER_PREVENOM && GetHasFeat(FEAT_HIDDEN_TALENT_PREVENOM, oPC)) return TRUE;
|
||||
if(nPower == POWER_PREVENOM_WEAPON && GetHasFeat(FEAT_HIDDEN_TALENT_PREVENOM_WEAPON, oPC)) return TRUE;
|
||||
if(nPower == POWER_SKATE && GetHasFeat(FEAT_HIDDEN_TALENT_SKATE, oPC)) return TRUE;
|
||||
if(nPower == POWER_STOMP && GetHasFeat(FEAT_HIDDEN_TALENT_STOMP, oPC)) return TRUE;
|
||||
if(nPower == POWER_SYNESTHETE && GetHasFeat(FEAT_HIDDEN_TALENT_SYNESTHETE, oPC)) return TRUE;
|
||||
if(nPower == POWER_TELEMPATHICPRO && GetHasFeat(FEAT_HIDDEN_TALENT_TELEMPATHICPRO, oPC)) return TRUE;
|
||||
if(nPower == POWER_THICKSKIN && GetHasFeat(FEAT_HIDDEN_TALENT_THICKSKIN, oPC)) return TRUE;
|
||||
if(nPower == POWER_VIGOR && GetHasFeat(FEAT_HIDDEN_TALENT_VIGOR, oPC)) return TRUE;
|
||||
if(nPower == POWER_GRIP_IRON && GetHasFeat(FEAT_HIDDEN_TALENT_GRIP_IRON, oPC)) return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -110,6 +110,7 @@ object GetSplitPsionicRayTarget(struct manifestation manif, object oPrimaryTarge
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
#include "psi_inc_core"
|
||||
#include "psi_inc_psifunc"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Internal functions */
|
||||
|
||||
@@ -572,7 +572,11 @@ int GetMaxPowerCount(object oCreature, int nList)
|
||||
|
||||
int GetHasPower(int nPower, object oCreature = OBJECT_SELF)
|
||||
{
|
||||
if((GetLevelByClass(CLASS_TYPE_PSION, oCreature)
|
||||
// Check MISC list first (for Hidden Talent and similar feats)
|
||||
if(GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_INVALID), oCreature))
|
||||
return TRUE;
|
||||
|
||||
if((GetLevelByClass(CLASS_TYPE_PSION, oCreature)
|
||||
&& GetHasFeat(GetClassFeatFromPower(nPower, CLASS_TYPE_PSION), oCreature)
|
||||
) ||
|
||||
(GetLevelByClass(CLASS_TYPE_PSYWAR, oCreature)
|
||||
|
||||
@@ -93,9 +93,8 @@ void GainPowerPoints(object oChar, int nGain, int bCanExceedMax = FALSE, int bIn
|
||||
* @param bInform If TRUE, runs TellCharacterPowerPointStatus() on oChar
|
||||
* after making the modification.
|
||||
*/
|
||||
/*
|
||||
void GainTemporaryPowerPoints(object oChar, int nGain, float fDuration, int bInform = TRUE);
|
||||
*/
|
||||
|
||||
/**
|
||||
* Decreases the character's current power point count by up to the given
|
||||
* amount, limited to not going below 0.
|
||||
@@ -138,8 +137,12 @@ int _GetFeatBonusPP(object oChar)
|
||||
{
|
||||
int nBonusPP = 0;
|
||||
|
||||
//:: Wild Talent & Hidden Talents
|
||||
if(GetHasFeat(FEAT_WILD_TALENT, oChar) || IsHiddenTalent())
|
||||
//:: Wild Talent
|
||||
if(GetHasFeat(FEAT_WILD_TALENT, oChar))
|
||||
nBonusPP += 2;
|
||||
|
||||
//:: Hidden Talent
|
||||
if(GetHasFeat(FEAT_HIDDEN_TALENT, oChar))
|
||||
nBonusPP += 2;
|
||||
|
||||
//:: Psionic Feats
|
||||
|
||||
@@ -40,7 +40,8 @@ void IdentifyPower(object oManifester, int nPowerId);
|
||||
|
||||
// Always access via psi_inc_psifunc.
|
||||
|
||||
//#include "psi_inc_core"
|
||||
#include "psi_inc_core"
|
||||
#include "inc_2dacache"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Internal functions */
|
||||
|
||||
@@ -407,6 +407,8 @@ void _CleanManifestationVariables(object oManifester)
|
||||
DeleteLocalInt(oManifester, PRC_POWER_LEVEL);
|
||||
DeleteLocalInt(oManifester, PRC_IS_PSILIKE);
|
||||
DeleteLocalInt(oManifester, PRC_AUGMENT_OVERRIDE);
|
||||
DeleteLocalInt(oManifester, "PRC_UsePowerList");
|
||||
DeleteLocalInt(oManifester, "PRC_PowerListType");
|
||||
}
|
||||
|
||||
/** Internal function.
|
||||
@@ -692,10 +694,28 @@ void _UsePowerAux(object oManifester, object oMfToken, int nSpellId,
|
||||
|
||||
struct manifestation EvaluateManifestation(object oManifester, object oTarget, struct power_augment_profile pap, int nMetaPsiFlags)
|
||||
{
|
||||
/* Get some data */
|
||||
//:: Handle Hidden Talent
|
||||
int nSpellID = PRCGetSpellId();
|
||||
int bIsHiddenTalent = GetIsHiddenTalentPower(oManifester, nSpellID);
|
||||
if(bIsHiddenTalent)
|
||||
{
|
||||
SetLocalInt(oManifester, "PRC_UsePowerList", TRUE);
|
||||
SetLocalInt(oManifester, "PRC_PowerListType", POWER_LIST_MISC);
|
||||
}
|
||||
/* Get some data */
|
||||
int bIgnoreConstraints = (DEBUG) ? GetLocalInt(oManifester, PRC_DEBUG_IGNORE_CONSTRAINTS) : FALSE;
|
||||
|
||||
// Manifester-related stuff
|
||||
int nManifesterLevel = GetManifesterLevel(oManifester);
|
||||
//int nManifesterLevel = GetManifesterLevel(oManifester);
|
||||
int nManifesterLevel;
|
||||
if(bIsHiddenTalent)
|
||||
{
|
||||
nManifesterLevel = GetManifesterLevel(oManifester, CLASS_TYPE_INVALID);
|
||||
}
|
||||
else
|
||||
{
|
||||
nManifesterLevel = GetManifesterLevel(oManifester);
|
||||
}
|
||||
int nPowerLevel = GetPowerLevel(oManifester);
|
||||
int nClass = GetManifestingClass(oManifester);
|
||||
int nWildSurge = GetWildSurge(oManifester);
|
||||
@@ -714,6 +734,8 @@ struct manifestation EvaluateManifestation(object oManifester, object oTarget, s
|
||||
manif.nManifesterLevel = nManifesterLevel;
|
||||
manif.nSpellID = PRCGetSpellId();
|
||||
|
||||
|
||||
|
||||
// Run an ability score check to see if the manifester can manifest the power at all
|
||||
if (bIsPsiLike)
|
||||
{
|
||||
@@ -767,7 +789,9 @@ struct manifestation EvaluateManifestation(object oManifester, object oTarget, s
|
||||
//If the manifester does not have enough points before hostile modifiers, cancel power
|
||||
if(manif.nPPCost > nManifesterPP && !bIsPsiLike && !bIgnoreConstraints)
|
||||
{
|
||||
FloatingTextStrRefOnCreature(16826412, oManifester, FALSE); // "You do not have enough Power Points to manifest this power"
|
||||
// DEBUG: show why the cost over cap branch triggered
|
||||
FloatingTextStringOnCreature("DEBUG: manif.nManifesterLevel=" + IntToString(manif.nManifesterLevel) + " manif.nPPCost=" + IntToString(manif.nPPCost) +" PRC_UsePowerList=" + IntToString(GetLocalInt(manif.oManifester, "PRC_UsePowerList")), manif.oManifester, FALSE);
|
||||
FloatingTextStrRefOnCreature(16826412, oManifester, FALSE); // "You do not have enough Power Points to manifest this power"
|
||||
manif.bCanManifest = FALSE;
|
||||
}
|
||||
// The manifester has enough power points that they would be able to use the power, barring extra costs
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "prc_class_const"
|
||||
*/
|
||||
#include "prc_alterations"
|
||||
#include "prcsp_engine"
|
||||
|
||||
// Constants that dictate ResistPower results
|
||||
const int POWER_RESIST_FAIL = 1;
|
||||
|
||||
@@ -75,6 +75,15 @@ int PsiPrePowerCastCode()
|
||||
|
||||
int nContinue = !ExecuteScriptAndReturnInt("prespellcode", oManifester);
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Forsakers can't use psionics
|
||||
//---------------------------------------------------------------------------
|
||||
if (nContinue && GetLevelByClass(CLASS_TYPE_FORSAKER, oManifester))
|
||||
{
|
||||
FloatingTextStringOnCreature("Forsakers cannot manifest psionic powers!", oManifester, FALSE);
|
||||
nContinue = FALSE;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Break any spell require maintaining concentration
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -209,3 +218,4 @@ int PsiPrePowerCastCode()
|
||||
return nContinue;
|
||||
}
|
||||
|
||||
//:: void main (){}
|
||||
@@ -41,6 +41,7 @@ const string _MYSTERY_LIST_MISC_ARRAY = "_MysteriesKnownMiscArray";
|
||||
const string _MYSTERY_LIST_LEVEL_ARRAY = "_MysteriesKnownLevelArray_";
|
||||
const string _MYSTERY_LIST_GENERAL_ARRAY = "_MysteriesKnownGeneralArray";
|
||||
|
||||
#include "shd_inc_shdfunc"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Function prototypes */
|
||||
@@ -191,7 +192,8 @@ int PathFeatToIPFeat(int nFeat);
|
||||
/* Includes */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
|
||||
#include "inc_lookups"
|
||||
#include "inc_pers_array"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Internal functions */
|
||||
@@ -518,7 +520,7 @@ int GetMaxMysteryLevelLearnable(object oShadow, int nClass, int nType)
|
||||
if(DEBUG) DoDebug("GetMaxMysteryLevelLearnable nType: " + IntToString(nType));
|
||||
|
||||
// Rules Quote:
|
||||
// Within a category<72>Apprentice, Initiate, Master<65>you must have at least two mysteries of any given level
|
||||
// Within a category<72>Apprentice, Initiate, Master<65>you must have at least two mysteries of any given level
|
||||
// before you can take any mysteries of the next higher level. For instance, you must have two 1st-level
|
||||
// mysteries before you can take any 2nds, and at least two 2nds before you can take any 3rds.
|
||||
int nMaxLrn, i, nMystLevel, nCount1, nCount2;
|
||||
|
||||
@@ -210,6 +210,7 @@ int GetHasNocturnal(object oShadow, int nPath);
|
||||
#include "prc_alterations"
|
||||
#include "shd_inc_myst"
|
||||
#include "shd_inc_mystknwn"
|
||||
#include "lookup_2da_spell"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Internal functions */
|
||||
@@ -236,12 +237,12 @@ int GetShadowcasterLevel(object oShadow = OBJECT_SELF, int nSpecificClass = CLAS
|
||||
// For when you want to assign the caster level.
|
||||
if(nLevel)
|
||||
{
|
||||
if(DEBUG) SendMessageToPC(oShadow, "GetShadowcasterLevel(): Forced-level shadowcasting at level " + IntToString(nLevel));
|
||||
if(DEBUG) DoDebug("GetShadowcasterLevel(): Forced-level shadowcasting at level " + IntToString(nLevel));
|
||||
//DelayCommand(1.0, DeleteLocalInt(oShadow, PRC_CASTERLEVEL_OVERRIDE));
|
||||
return nLevel + nAdjust;
|
||||
}
|
||||
|
||||
if (DEBUG) FloatingTextStringOnCreature("GetShadowcasterLevel: "+GetName(oShadow)+" is a "+IntToString(nSpecificClass), oShadow);
|
||||
if (DEBUG) DoDebug("GetShadowcasterLevel: "+GetName(oShadow)+" is a "+IntToString(nSpecificClass), oShadow);
|
||||
// The function user needs to know the character's Shadowcaster level in a specific class
|
||||
// instead of whatever the character last shadowcast a mystery as
|
||||
if(nSpecificClass != CLASS_TYPE_INVALID)
|
||||
@@ -288,7 +289,7 @@ int GetShadowcasterLevel(object oShadow = OBJECT_SELF, int nSpecificClass = CLAS
|
||||
nLevel -= 4;
|
||||
}
|
||||
|
||||
if(DEBUG) FloatingTextStringOnCreature("Shadowcaster Level: " + IntToString(nLevel), oShadow, FALSE);
|
||||
if(DEBUG) DoDebug("Shadowcaster Level: " + IntToString(nLevel));
|
||||
|
||||
return nLevel + nAdjust;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
#include "prc_inc_spells"
|
||||
#include "inc_utility"
|
||||
#include "prc_inc_itmrstr"
|
||||
#include "shd_inc_shdfunc"
|
||||
#include "lookup_2da_spell"
|
||||
|
||||
// This function holds all functions that are supposed to run before the actual
|
||||
// spellscript gets run. If this functions returns FALSE, the spell is aborted
|
||||
@@ -132,6 +134,15 @@ int ShadPreMystCastCode()
|
||||
|
||||
int nContinue = !ExecuteScriptAndReturnInt("prespellcode",oShadow);
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Block forsakers from using shadowcasting
|
||||
//---------------------------------------------------------------------------
|
||||
if(GetLevelByClass(CLASS_TYPE_FORSAKER, oShadow) > 0)
|
||||
{
|
||||
SendMessageToPC(oShadow, "Forsakers cannot use the power of shadowcasting.");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Break any spell require maintaining concentration
|
||||
//---------------------------------------------------------------------------
|
||||
@@ -277,4 +288,6 @@ int ShadPreMystCastCode()
|
||||
|
||||
if(DEBUG) DoDebug("ShadPreMystCastCode nContinue #6: " + IntToString(nContinue));
|
||||
return nContinue;
|
||||
}
|
||||
}
|
||||
|
||||
//:: void main (){}
|
||||
|
||||
@@ -1154,6 +1154,7 @@ int GetIsDisciplineWeapon(object oWeapon, int nDiscipline)
|
||||
// Invalid is empty handed / Unarmed strike
|
||||
if(nType == BASE_ITEM_INVALID
|
||||
|| nType == BASE_ITEM_QUARTERSTAFF
|
||||
|| nType == BASE_ITEM_MAGICSTAFF
|
||||
|| nType == BASE_ITEM_SHORTSWORD
|
||||
|| nType == BASE_ITEM_NUNCHAKU)
|
||||
return TRUE;
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include "prc_inc_spells"
|
||||
#include "inc_utility"
|
||||
#include "x2_inc_spellhook"
|
||||
#include "tob_inc_tobfunc"
|
||||
|
||||
// This function holds all functions that are supposed to run before the actual
|
||||
// spellscript gets run. If this functions returns FALSE, the spell is aborted
|
||||
@@ -78,7 +79,14 @@ int PreManeuverCastCode()
|
||||
//---------------------------------------------------------------------------
|
||||
if(nContinue)
|
||||
nContinue = !GetLocalInt(oInitiator, "CrusaderBreak");
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Forsakers can't use supernatural maneuvers
|
||||
//---------------------------------------------------------------------------
|
||||
if (nContinue && GetIsManeuverSupernatural(nMoveId) && GetLevelByClass(CLASS_TYPE_FORSAKER, oInitiator))
|
||||
{
|
||||
FloatingTextStringOnCreature("Forsakers cannot use supernatural maneuvers!", oInitiator, FALSE);
|
||||
nContinue = FALSE;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
// Run NullPsionicsField Check
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
@@ -109,11 +109,14 @@ int GetIsSyllable(int nSpellId);
|
||||
*/
|
||||
int DoSpellTruenameCheck(object oTrueSpeaker, object oTarget, int nPersonal = FALSE);
|
||||
|
||||
string GetNormalUtterSpellId(int nSpellId);
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Includes */
|
||||
//////////////////////////////////////////////////
|
||||
|
||||
#include "prc_inc_spells"
|
||||
#include "true_inc_trufunc"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Internal functions */
|
||||
|
||||
@@ -260,6 +260,7 @@ int GetCadenceCount(object oTrueSpeaker);
|
||||
#include "prc_alterations"
|
||||
#include "true_inc_utter"
|
||||
#include "true_inc_truknwn"
|
||||
#include "true_inc_truespk"
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
/* Function definitions */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user