2026/02/08 Update

Archived Spellman's Project content.
Added missing Diamond Dragon stat feats.
Hospitaler's should be able to take Extra Turning.
Dodge proxies should allow entry into Champion of Corellon.
Mounted Combat is a prereq for Champion of Corellon.
Only Clerics have Domain reqs to enter Morninglord.
Verdant Lord was missing BAB 4 entry requirement.
Diamond Dragons don't get spellcraft.
Re-added Korobokuru race.
Added .ltr tables for Korobokuru.
Capped Blood in the Water at +20.
Capped Pearl of Black Doubt at +20.
Added json_GetFirstKnownSpell() and json_GetNextKnownSpell().
Updated all old NWNx functions to work with NWNxEE.
Added new switch to enable optional PRCX / NWNxEE shims.
Commented out ConvoCC switches on inc_switch_setup.nss
Diamond Dragon's stat increases are intrinsic when using NWNxEE.
Forsaker's stat increases are intrinsic when using NWNxEE.
Vow of Poverty's stat increases are intrinsic when using NWNxEE.
Cloud Dragon summon should be Neutral Good.
Fixed Verdant Lord's regen.
Fixed Forest Master's regen.
Morninglord's Creative Fire should affect Alchemy.
Added yes/no dialog when choosing Vow of Poverty bonus Exalted Feats.
Racial natural AC should be intrinsic when NWNxEE is enabled.
Transcendent Vitality's CON bonus is intrinsic when NWNxEE is enabled.
This commit is contained in:
Jaysyn904
2026-02-08 00:44:28 -05:00
parent 875f00c88f
commit 4026b6af2c
899 changed files with 2189 additions and 83980 deletions

View File

@@ -1,258 +1,258 @@
2DA V2.0
Name LA RaceClassName RaceClass RaceHD
0 Dwarf 0 **** **** ****
1 Elf 0 **** **** ****
2 Gnome 0 **** **** ****
3 Halfling 0 **** **** ****
4 HalfElf 0 **** **** ****
5 HalfOrc 0 **** **** ****
6 Human 0 **** **** ****
7 Aberration **** **** **** ****
8 Animal **** **** **** ****
9 Beast **** **** **** ****
10 Construct **** **** **** ****
11 Dragon **** **** **** ****
12 Humanoid_Goblinoid **** **** **** ****
13 Humanoid_Monstrous **** **** **** ****
14 Humanoid_Orc **** **** **** ****
15 Humanoid_Reptilian **** **** **** ****
16 Elemental **** **** **** ****
17 Fey **** **** **** ****
18 Giant **** **** **** ****
19 Magical_Beast **** **** **** ****
20 Outsider **** **** **** ****
21 DELETED **** **** **** ****
22 DELETED **** **** **** ****
23 Shapechanger **** **** **** ****
24 Undead **** **** **** ****
25 Vermin **** **** **** ****
26 DELETED **** **** **** ****
27 DELETED **** **** **** ****
28 INVALID_RACE **** **** **** ****
29 Ooze **** **** **** ****
30 **** **** **** **** ****
31 **** **** **** **** ****
32 **** **** **** **** ****
33 **** 0 **** **** ****
34 **** 0 **** **** ****
35 **** 0 **** **** ****
36 **** **** **** **** ****
37 **** 0 **** **** ****
38 **** 1 **** **** ****
39 **** 0 **** **** ****
40 **** **** **** **** ****
41 **** **** **** **** ****
42 **** **** **** **** ****
43 **** **** **** **** ****
44 **** 0 **** **** ****
45 **** 0 **** **** ****
46 **** 0 **** **** ****
47 **** 0 **** **** ****
48 **** 0 **** **** ****
49 **** 0 **** **** ****
50 Drider 4 Aberration 11 6
51 Wemic 3 MonsterousHumanoid 15 5
52 Plant **** **** **** ****
53 Brownie 4 **** **** ****
54 Krinth 0 **** **** ****
55 Goliath 1 **** **** ****
56 FeralGargun 2 MonsterousHumanoid 15 2
57 StoneChild 4 Outsider 24 2
58 Hagspawn 2 **** **** ****
59 Taer 1 Giant 22 2
60 **** **** **** **** ****
61 Neanderthal **** **** **** ****
62 FrostFolk 1 MonsterousHumanoid 15 4
63 Uldra 1 **** **** ****
64 Extaminaar **** **** **** ****
65 Karsite 2 **** **** ****
66 Hybsil 2 **** **** ****
67 RethDekala 5 Outsider 24 5
68 Arkamoi 4 MonsterousHumanoid 15 4
69 Lashemoi 2 MonsterousHumanoid 15 2
70 Turlemoi 4 MonsterousHumanoid 15 12
71 Hadrimoi 4 MonsterousHumanoid 15 9
72 RedspawnArcaniss 4 MonsterousHumanoid 15 8
73 Gloura 2 Fey 17 7
74 Muckdweller 0 Humanoid 14 ****
75 Aranea 4 Shapechanger 25 3
76 Chitine 2 MonsterousHumanoid 15 2
77 SpiretopDragon 2 Dragon 18 2
78 **** **** **** **** ****
79 **** **** **** **** ****
80 **** **** **** **** ****
81 **** **** **** **** ****
82 **** **** **** **** ****
83 **** **** **** **** ****
84 Hound_Archon 5 Outsider 24 6
85 **** **** **** **** ****
86 **** **** **** **** ****
87 **** **** **** **** ****
88 **** **** **** **** ****
89 **** **** **** **** ****
90 Mephling_Air 1 **** **** ****
91 Mephling_Earth 1 **** **** ****
92 Mephling_Fire 1 **** **** ****
93 Mephling_Water 1 **** **** ****
94 Khaasta 3 Outsider 24 3
95 **** **** **** **** ****
96 Rakshasa_Naztharune 5 Outsider 24 11
97 **** **** **** **** ****
98 **** **** **** **** ****
99 **** **** **** **** ****
100 **** **** **** **** ****
101 **** **** **** **** ****
102 **** **** **** **** ****
103 **** **** **** **** ****
104 **** **** **** **** ****
105 Stonehunter_Gnomes 0 **** **** ****
106 Fireblood_Dwarves 0 **** **** ****
107 Forestlord_Elf 0 **** **** ****
108 Frostblood_Orc 0 **** **** ****
109 Glimmerskin_Halfling 0 **** **** ****
110 Silverbrow_Human 0 **** **** ****
111 Sunscorch_Hobgoblin 1 **** **** ****
112 Viletooth_Lizardfolk 1 Humanoid 14 2
113 **** **** **** **** ****
114 **** **** **** **** ****
115 Asherati 0 **** **** ****
116 Bhuka 0 **** **** ****
117 Marrulurk 1 MonsterousHumanoid 15 3
118 Crucian 2 **** **** ****
119 Marrusault 2 MonsterousHumanoid 15 6
120 Marrutact 3 MonsterousHumanoid 15 7
121 Mongrelfolk 0 **** **** ****
122 Sharakim 1 **** **** ****
123 Underfolk 0 **** **** ****
124 Skulk 1 Humanoid 14 2
125 Doppelganger 4 MonsterousHumanoid 15 4
126 **** 0 **** **** ****
127 Skarn 0 **** **** ****
128 Rilkan 0 **** **** ****
129 Duskling 0 **** **** ****
130 Azurin 0 **** **** ****
131 Volodni 2 **** **** ****
132 **** **** **** **** ****
133 **** **** **** **** ****
134 **** **** **** **** ****
135 **** **** **** **** ****
136 **** **** **** **** ****
137 **** **** **** **** ****
138 **** 0 **** **** ****
139 **** **** **** **** ****
140 Tasloi 0 **** **** ****
141 **** **** **** **** ****
142 **** **** **** **** ****
143 Blue_Goblin 0 **** **** ****
144 WarforgeScout 0 **** **** ****
145 WarforgedCharger 4 Construct 13 4
146 Shifter 0 **** **** ****
147 Changeling 0 **** **** ****
148 Kalashtar 0 **** **** ****
149 Warforged 0 **** **** ****
150 Rakshasa_Zakya 7 Outsider 24 7
151 Arctic_Dwarf 2 **** **** ****
152 Gold_Dwarf 0 **** **** ****
153 Gray_Dwarf 1 **** **** ****
154 EmptyVessel 1 **** **** ****
155 Urdunnir 4 **** **** ****
156 Wild_Dwarf 0 **** **** ****
157 **** 0 **** **** ****
158 **** **** **** **** ****
159 Bralani 5 Outsider 24 6
160 **** 0 **** **** ****
161 **** **** **** **** ****
162 Avariel 3 **** **** ****
163 Drow_Female 2 **** **** ****
164 Drow_Male 2 **** **** ****
165 Snow_Elf 0 **** **** ****
166 Sun_Elf 0 **** **** ****
167 Wild_Elf 0 **** **** ****
168 Wood_Elf 0 **** **** ****
169 **** **** **** **** ****
170 **** **** **** **** ****
171 **** **** **** **** ****
172 **** **** **** **** ****
173 **** 0 **** **** ****
174 Deep_Gnome_Svirfneblin 3 **** **** ****
175 Forest_Gnome 0 **** **** ****
176 Rock_Gnome 0 **** **** ****
177 **** **** **** **** ****
178 **** 0 **** **** ****
179 Whisper_Gnome 0 **** **** ****
180 Hadozee 0 **** **** ****
181 **** 2 **** **** ****
182 **** 1 **** **** ****
183 Half_Drow 0 **** **** ****
184 Gray_Orc 1 **** **** ****
185 **** **** **** **** ****
186 **** 0 **** **** ****
187 Orog 2 **** **** ****
188 **** 0 **** **** ****
189 **** 0 **** **** ****
190 Ghostwise_Halfling 1 **** **** ****
191 Tundra_Halfling 0 **** **** ****
192 Strongheart_Halfling 0 **** **** ****
193 Tallfellow_Halfling 0 **** **** ****
194 Deep_Halfling 0 **** **** ****
195 Wispling 1 **** **** ****
196 Swyft 1 **** **** ****
197 Mechanatrix 1 **** **** ****
198 Aasimar 1 **** **** ****
199 Air_Genasi 1 **** **** ****
200 Earth_Genasi 1 **** **** ****
201 Feyri 3 **** **** ****
202 Fire_Genasi 1 **** **** ****
203 Tanarukk 3 Outsider 24 5
204 Tiefling 1 **** **** ****
205 Water_Genasi 1 **** **** ****
206 Maeluth 1 **** **** ****
207 Bariaur 1 **** **** ****
208 Centaur 2 MonsterousHumanoid 15 4
209 Catfolk 1 **** **** ****
210 **** **** **** **** ****
211 FlindGnoll 2 Humanoid 14 2
212 Ogre 2 Giant 22 4
213 Goblin 0 **** **** ****
214 Orc 0 **** **** ****
215 Kobold 0 **** **** ****
216 Gnoll 1 Humanoid 14 2
217 Bugbear 1 Humanoid 14 3
218 Minotaur 2 MonsterousHumanoid 15 6
219 Lizardfolk 1 Humanoid 14 2
220 YuanTi_Pure 2 MonsterousHumanoid 15 4
221 Hobgoblin 1 **** **** ****
222 Githyanki 2 **** **** ****
223 Githzerai 2 **** **** ****
224 Rakshasa 7 Outsider 24 7
225 Illithid 7 Aberration 11 8
226 Pixie 4 **** **** ****
227 Azer 4 Outsider 24 2
228 **** **** **** **** ****
229 Half_Ogre 2 **** **** ****
230 Deep_Imaskari 0 **** **** ****
231 Troll 5 Giant 22 6
232 Varag 2 Humanoid 14 3
233 Hobgoblin_Warsoul 4 MonsterousHumanoid 15 10
234 Troglodyte 2 Humanoid 14 2
235 Neraphim 0 **** **** ****
236 Shadowswyft 1 **** **** ****
237 Nathri 1 **** **** ****
238 Buommans 0 **** **** ****
239 Spiker 0 **** **** ****
240 Wildren 1 **** **** ****
241 **** **** **** **** ****
242 **** **** **** **** ****
243 Spirit_Folk **** **** **** ****
244 Killoren 0 **** **** ****
245 **** 0 **** **** ****
246 Nezumi 0 Humanoid **** ****
247 **** **** **** **** ****
248 Poison_Dusk 1 **** **** ****
249 Dromite 1 **** **** ****
250 Elans 0 **** **** ****
251 Half_Giant 1 **** **** ****
252 Maenad 0 **** **** ****
253 Xeph 0 **** **** ****
254 254_LAST_LINE **** **** **** ****
Name LA RaceClassName RaceClass RaceHD
0 Dwarf 0 **** **** ****
1 Elf 0 **** **** ****
2 Gnome 0 **** **** ****
3 Halfling 0 **** **** ****
4 HalfElf 0 **** **** ****
5 HalfOrc 0 **** **** ****
6 Human 0 **** **** ****
7 Aberration **** **** **** ****
8 Animal **** **** **** ****
9 Beast **** **** **** ****
10 Construct **** **** **** ****
11 Dragon **** **** **** ****
12 Humanoid_Goblinoid **** **** **** ****
13 Humanoid_Monstrous **** **** **** ****
14 Humanoid_Orc **** **** **** ****
15 Humanoid_Reptilian **** **** **** ****
16 Elemental **** **** **** ****
17 Fey **** **** **** ****
18 Giant **** **** **** ****
19 Magical_Beast **** **** **** ****
20 Outsider **** **** **** ****
21 DELETED **** **** **** ****
22 DELETED **** **** **** ****
23 Shapechanger **** **** **** ****
24 Undead **** **** **** ****
25 Vermin **** **** **** ****
26 DELETED **** **** **** ****
27 DELETED **** **** **** ****
28 INVALID_RACE **** **** **** ****
29 Ooze **** **** **** ****
30 **** **** **** **** ****
31 **** **** **** **** ****
32 **** **** **** **** ****
33 **** 0 **** **** ****
34 **** 0 **** **** ****
35 **** 0 **** **** ****
36 **** **** **** **** ****
37 **** 0 **** **** ****
38 **** 1 **** **** ****
39 **** 0 **** **** ****
40 **** **** **** **** ****
41 **** **** **** **** ****
42 **** **** **** **** ****
43 **** **** **** **** ****
44 **** 0 **** **** ****
45 **** 0 **** **** ****
46 **** 0 **** **** ****
47 **** 0 **** **** ****
48 **** 0 **** **** ****
49 **** 0 **** **** ****
50 Drider 4 Aberration 11 6
51 Wemic 3 MonsterousHumanoid 15 5
52 Plant **** **** **** ****
53 Brownie 4 **** **** ****
54 Krinth 0 **** **** ****
55 Goliath 1 **** **** ****
56 FeralGargun 2 MonsterousHumanoid 15 2
57 StoneChild 4 Outsider 24 2
58 Hagspawn 2 **** **** ****
59 Taer 1 Giant 22 2
60 **** **** **** **** ****
61 Neanderthal **** **** **** ****
62 FrostFolk 1 MonsterousHumanoid 15 4
63 Uldra 1 **** **** ****
64 Extaminaar **** **** **** ****
65 Karsite 2 **** **** ****
66 Hybsil 2 **** **** ****
67 RethDekala 5 Outsider 24 5
68 Arkamoi 4 MonsterousHumanoid 15 4
69 Lashemoi 2 MonsterousHumanoid 15 2
70 Turlemoi 4 MonsterousHumanoid 15 12
71 Hadrimoi 4 MonsterousHumanoid 15 9
72 RedspawnArcaniss 4 MonsterousHumanoid 15 8
73 Gloura 2 Fey 17 7
74 Muckdweller 0 Humanoid 14 ****
75 Aranea 4 Shapechanger 25 3
76 Chitine 2 MonsterousHumanoid 15 2
77 SpiretopDragon 2 Dragon 18 2
78 **** **** **** **** ****
79 **** **** **** **** ****
80 **** **** **** **** ****
81 **** **** **** **** ****
82 **** **** **** **** ****
83 **** **** **** **** ****
84 Hound_Archon 5 Outsider 24 6
85 **** **** **** **** ****
86 **** **** **** **** ****
87 **** **** **** **** ****
88 **** **** **** **** ****
89 **** **** **** **** ****
90 Mephling_Air 1 **** **** ****
91 Mephling_Earth 1 **** **** ****
92 Mephling_Fire 1 **** **** ****
93 Mephling_Water 1 **** **** ****
94 Khaasta 3 Outsider 24 3
95 **** **** **** **** ****
96 Rakshasa_Naztharune 5 Outsider 24 11
97 **** **** **** **** ****
98 **** **** **** **** ****
99 **** **** **** **** ****
100 **** **** **** **** ****
101 **** **** **** **** ****
102 **** **** **** **** ****
103 **** **** **** **** ****
104 **** **** **** **** ****
105 Stonehunter_Gnomes 0 **** **** ****
106 Fireblood_Dwarves 0 **** **** ****
107 Forestlord_Elf 0 **** **** ****
108 Frostblood_Orc 0 **** **** ****
109 Glimmerskin_Halfling 0 **** **** ****
110 Silverbrow_Human 0 **** **** ****
111 Sunscorch_Hobgoblin 1 **** **** ****
112 Viletooth_Lizardfolk 1 Humanoid 14 2
113 **** **** **** **** ****
114 **** **** **** **** ****
115 Asherati 0 **** **** ****
116 Bhuka 0 **** **** ****
117 Marrulurk 1 MonsterousHumanoid 15 3
118 Crucian 2 **** **** ****
119 Marrusault 2 MonsterousHumanoid 15 6
120 Marrutact 3 MonsterousHumanoid 15 7
121 Mongrelfolk 0 **** **** ****
122 Sharakim 1 **** **** ****
123 Underfolk 0 **** **** ****
124 Skulk 1 Humanoid 14 2
125 Doppelganger 4 MonsterousHumanoid 15 4
126 **** 0 **** **** ****
127 Skarn 0 **** **** ****
128 Rilkan 0 **** **** ****
129 Duskling 0 **** **** ****
130 Azurin 0 **** **** ****
131 Volodni 2 **** **** ****
132 **** **** **** **** ****
133 **** **** **** **** ****
134 **** **** **** **** ****
135 **** **** **** **** ****
136 **** **** **** **** ****
137 **** **** **** **** ****
138 **** 0 **** **** ****
139 **** **** **** **** ****
140 Tasloi 0 **** **** ****
141 **** **** **** **** ****
142 **** **** **** **** ****
143 Blue_Goblin 0 **** **** ****
144 WarforgeScout 0 **** **** ****
145 WarforgedCharger 4 Construct 13 4
146 Shifter 0 **** **** ****
147 Changeling 0 **** **** ****
148 Kalashtar 0 **** **** ****
149 Warforged 0 **** **** ****
150 Rakshasa_Zakya 7 Outsider 24 7
151 Arctic_Dwarf 2 **** **** ****
152 Gold_Dwarf 0 **** **** ****
153 Gray_Dwarf 1 **** **** ****
154 EmptyVessel 1 **** **** ****
155 Urdunnir 4 **** **** ****
156 Wild_Dwarf 0 **** **** ****
157 **** 0 **** **** ****
158 **** **** **** **** ****
159 Bralani 5 Outsider 24 6
160 **** 0 **** **** ****
161 **** **** **** **** ****
162 Avariel 3 **** **** ****
163 Drow_Female 2 **** **** ****
164 Drow_Male 2 **** **** ****
165 Snow_Elf 0 **** **** ****
166 Sun_Elf 0 **** **** ****
167 Wild_Elf 0 **** **** ****
168 Wood_Elf 0 **** **** ****
169 **** **** **** **** ****
170 **** **** **** **** ****
171 **** **** **** **** ****
172 **** **** **** **** ****
173 **** 0 **** **** ****
174 Deep_Gnome_Svirfneblin 3 **** **** ****
175 Forest_Gnome 0 **** **** ****
176 Rock_Gnome 0 **** **** ****
177 **** **** **** **** ****
178 **** 0 **** **** ****
179 Whisper_Gnome 0 **** **** ****
180 Hadozee 0 **** **** ****
181 **** 2 **** **** ****
182 **** 1 **** **** ****
183 Half_Drow 0 **** **** ****
184 Gray_Orc 1 **** **** ****
185 **** **** **** **** ****
186 **** 0 **** **** ****
187 Orog 2 **** **** ****
188 **** 0 **** **** ****
189 **** 0 **** **** ****
190 Ghostwise_Halfling 1 **** **** ****
191 Tundra_Halfling 0 **** **** ****
192 Strongheart_Halfling 0 **** **** ****
193 Tallfellow_Halfling 0 **** **** ****
194 Deep_Halfling 0 **** **** ****
195 Wispling 1 **** **** ****
196 Swyft 1 **** **** ****
197 Mechanatrix 1 **** **** ****
198 Aasimar 1 **** **** ****
199 Air_Genasi 1 **** **** ****
200 Earth_Genasi 1 **** **** ****
201 Feyri 3 **** **** ****
202 Fire_Genasi 1 **** **** ****
203 Tanarukk 3 Outsider 24 5
204 Tiefling 1 **** **** ****
205 Water_Genasi 1 **** **** ****
206 Maeluth 1 **** **** ****
207 Bariaur 1 **** **** ****
208 Centaur 2 MonsterousHumanoid 15 4
209 Catfolk 1 **** **** ****
210 **** **** **** **** ****
211 FlindGnoll 2 Humanoid 14 2
212 Ogre 2 Giant 22 4
213 Goblin 0 **** **** ****
214 Orc 0 **** **** ****
215 Kobold 0 **** **** ****
216 Gnoll 1 Humanoid 14 2
217 Bugbear 1 Humanoid 14 3
218 Minotaur 2 MonsterousHumanoid 15 6
219 Lizardfolk 1 Humanoid 14 2
220 YuanTi_Pure 2 MonsterousHumanoid 15 4
221 Hobgoblin 1 **** **** ****
222 Githyanki 2 **** **** ****
223 Githzerai 2 **** **** ****
224 Rakshasa 7 Outsider 24 7
225 Illithid 7 Aberration 11 8
226 Pixie 4 **** **** ****
227 Azer 4 Outsider 24 2
228 **** **** **** **** ****
229 Half_Ogre 2 **** **** ****
230 Deep_Imaskari 0 **** **** ****
231 Troll 5 Giant 22 6
232 Varag 2 Humanoid 14 3
233 Hobgoblin_Warsoul 4 MonsterousHumanoid 15 10
234 Troglodyte 2 Humanoid 14 2
235 Neraphim 0 **** **** ****
236 Shadowswyft 1 **** **** ****
237 Nathri 1 **** **** ****
238 Buommans 0 **** **** ****
239 Spiker 0 **** **** ****
240 Wildren 1 **** **** ****
241 **** **** **** **** ****
242 **** **** **** **** ****
243 Spirit_Folk **** **** **** ****
244 Killoren 0 **** **** ****
245 Korobokuru 0 Humanoid **** ****
246 Nezumi 0 Humanoid **** ****
247 **** **** **** **** ****
248 Poison_Dusk 1 **** **** ****
249 Dromite 1 **** **** ****
250 Elans 0 **** **** ****
251 Half_Giant 1 **** **** ****
252 Maenad 0 **** **** ****
253 Xeph 0 **** **** ****
254 254_LAST_LINE **** **** **** ****

View File

@@ -1,304 +1,307 @@
2DA V2.0
FeatLabel FeatIndex List GrantedOnLevel OnMenu
0 **Class_feats** **** **** **** ****
1 Psionic_Sleep_Paral_Immunity 3871 3 1 1
2 Channel_Dragon_Claws 3866 3 2 1
3 Psionic_Breath_Weapon 3867 3 4 1
4 Channel_Dragon_Wings 3868 3 6 1
5 Channel_Dragon_Tail 3869 3 8 1
6 Psionic_Dragonfear 3870 3 10 1
7 FEAT_AUGMENT_PSIONICS_QUICKSELECTS 3550 3 1 1
8 Augment_QuickSelects_2 3563 3 1 1
9 FEAT_AUGMENT_PSIONICS_DIGITS_0_4 3551 3 1 1
10 FEAT_AUGMENT_PSIONICS_DIGITS_5_9 3552 3 1 1
11 FEAT_AUGMENT_PSIONICS_TENS 3553 3 1 1
12 FEAT_EPIC_DIAMOND_DRAGON 25115 3 11 0
13 **** **** **** **** ****
14 **Bonus_Feats** **** **** **** ****
15 Dragon_Augment_STR_1 3857 2 1 0
16 Dragon_Augment_STR_2 3858 2 1 0
17 Dragon_Augment_STR_3 3859 2 1 0
18 Dragon_Augment_STR_4 26382 2 1 0
19 Dragon_Augment_STR_5 26383 2 1 0
20 Dragon_Augment_STR_6 26384 2 1 0
21 Dragon_Augment_STR_7 26385 2 1 0
22 Dragon_Augment_STR_8 26386 2 1 0
23 Dragon_Augment_STR_9 26387 2 1 0
24 Dragon_Augment_DEX_1 3860 2 1 0
25 Dragon_Augment_DEX_2 3861 2 1 0
26 Dragon_Augment_DEX_3 3862 2 1 0
27 Dragon_Augment_DEX_4 26388 2 1 0
28 Dragon_Augment_DEX_5 26389 2 1 0
29 Dragon_Augment_DEX_6 26390 2 1 0
30 Dragon_Augment_DEX_7 26391 2 1 0
31 Dragon_Augment_DEX_8 26392 2 1 0
32 Dragon_Augment_DEX_9 26393 2 1 0
33 Dragon_Augment_CON_1 3863 2 1 0
34 Dragon_Augment_CON_2 3864 2 1 0
35 Dragon_Augment_CON_3 3865 2 1 0
36 Dragon_Augment_CON_4 26394 2 1 0
37 Dragon_Augment_CON_5 26395 2 1 0
38 Dragon_Augment_CON_6 26396 2 1 0
39 Dragon_Augment_CON_7 26397 2 1 0
40 Dragon_Augment_CON_8 26398 2 1 0
41 Dragon_Augment_CON_9 26399 2 1 0
42 FEAT_DIAMOND_DRAGON_MANIFEST_FOZ 18131 2 1 0
43 FEAT_DIAMOND_DRAGON_MANIFEST_PSION 18138 2 1 0
44 FEAT_DIAMOND_DRAGON_MANIFEST_PSYROUGE 18146 2 1 0
45 FEAT_DIAMOND_DRAGON_MANIFEST_PSYWAR 18153 2 1 0
46 FEAT_DIAMOND_DRAGON_MANIFEST_WARMIND 18160 2 1 0
47 FEAT_DIAMOND_DRAGON_MANIFEST_WILDER 18167 2 1 0
48 FEAT_EPIC_ARMOR_SKIN 490 1 2 0
49 FEAT_EPIC_BLINDING_SPEED 491 1 2 1
50 FEAT_EPIC_DAMAGE_REDUCTION_3 492 1 2 0
51 FEAT_EPIC_DAMAGE_REDUCTION_6 493 1 2 0
52 FEAT_EPIC_DAMAGE_REDUCTION_9 494 1 2 0
53 FEAT_EPIC_TOUGHNESS_1 754 1 2 0
54 FEAT_EPIC_TOUGHNESS_2 755 1 2 0
55 FEAT_EPIC_TOUGHNESS_3 756 1 2 0
56 FEAT_EPIC_TOUGHNESS_4 757 1 2 0
57 FEAT_EPIC_TOUGHNESS_5 758 1 2 0
58 FEAT_EPIC_TOUGHNESS_6 759 1 2 0
59 FEAT_EPIC_TOUGHNESS_7 760 1 2 0
60 FEAT_EPIC_TOUGHNESS_8 761 1 2 0
61 FEAT_EPIC_TOUGHNESS_9 762 1 2 0
62 FEAT_EPIC_TOUGHNESS_10 763 1 2 0
63 FEAT_EPIC_SUPERIOR_INITIATIVE 753 1 2 0
64 FEAT_EPIC_SKILL_FOCUS_USEMAGICDEVICE 609 1 2 0
65 FEAT_EPIC_SKILL_FOCUS_RIDE 3038 1 2 0
66 FEAT_EPIC_SKILL_FOCUS_JUMP 3040 1 2 0
67 FEAT_EPIC_SKILL_FOCUS_SENSE_MOTIVE 3042 1 2 0
68 FEAT_EPIC_SKILL_FOCUS_MARTIAL_LORE 3044 1 2 0
69 FEAT_EPIC_SKILL_FOCUS_BALANCE 3046 1 2 0
70 FEAT_EPIC_SKILL_FOCUS_CRAFT_POISON 3048 1 2 0
71 FEAT_EPIC_SKILL_FOCUS_PSICRAFT 3050 1 2 0
72 FEAT_EPIC_SKILL_FOCUS_CLIMB 3052 1 2 0
73 FEAT_EPIC_SKILL_FOCUS_CRAFT_GENERAL 3054 1 2 0
74 FEAT_EPIC_SKILL_FOCUS_APPRAISE 588 1 2 0
75 FEAT_EPIC_SKILL_FOCUS_CONCENTRATION 589 1 2 0
76 FEAT_EPIC_SKILL_FOCUS_CRAFT_TRAP 590 1 2 0
77 FEAT_EPIC_SKILL_FOCUS_DISABLETRAP 591 1 2 0
78 FEAT_EPIC_SKILL_FOCUS_DISCIPLINE 592 1 2 0
79 FEAT_EPIC_SKILL_FOCUS_HEAL 593 1 2 0
80 FEAT_EPIC_SKILL_FOCUS_HIDE 594 1 2 0
81 FEAT_EPIC_SKILL_FOCUS_LISTEN 595 1 2 0
82 FEAT_EPIC_SKILL_FOCUS_LORE 596 1 2 0
83 FEAT_EPIC_SKILL_FOCUS_MOVESILENTLY 597 1 2 0
84 FEAT_EPIC_SKILL_FOCUS_OPENLOCK 598 1 2 0
85 FEAT_EPIC_SKILL_FOCUS_PARRY 599 1 2 0
86 FEAT_EPIC_SKILL_FOCUS_PERSUADE 601 1 2 0
87 FEAT_EPIC_SKILL_FOCUS_PICKPOCKET 602 1 2 0
88 FEAT_EPIC_SKILL_FOCUS_SEARCH 603 1 2 0
89 FEAT_EPIC_SKILL_FOCUS_SETTRAP 604 1 2 0
90 FEAT_EPIC_SKILL_FOCUS_SPELLCRAFT 605 1 2 0
91 FEAT_EPIC_SKILL_FOCUS_SPOT 606 1 2 0
92 FEAT_EPIC_SKILL_FOCUS_TAUNT 607 1 2 0
93 FEAT_EPIC_SKILL_FOCUS_TUMBLE 608 1 2 0
94 FEAT_EPIC_SKILL_FOCUS_CRAFT_ARMOR 913 1 2 0
95 FEAT_EPIC_SKILL_FOCUS_CRAFT_WEAPON 914 1 2 0
96 FEAT_EPIC_SKILL_FOCUS_BLUFF 917 1 2 0
97 FEAT_EPIC_SKILL_FOCUS_INTIMIDATE 918 1 2 0
98 FEAT_EPIC_GREAT_INTELLIGENCE_1 794 1 2 0
99 FEAT_EPIC_GREAT_INTELLIGENCE_2 795 1 2 0
100 FEAT_EPIC_GREAT_INTELLIGENCE_3 796 1 2 0
101 FEAT_EPIC_GREAT_INTELLIGENCE_4 797 1 2 0
102 FEAT_EPIC_GREAT_INTELLIGENCE_5 798 1 2 0
103 FEAT_EPIC_GREAT_INTELLIGENCE_6 799 1 2 0
104 FEAT_EPIC_GREAT_INTELLIGENCE_7 800 1 2 0
105 FEAT_EPIC_GREAT_INTELLIGENCE_8 801 1 2 0
106 FEAT_EPIC_GREAT_INTELLIGENCE_9 802 1 2 0
107 FEAT_EPIC_GREAT_INTELLIGENCE_10 803 1 2 0
108 FEAT_EPIC_GREAT_WISDOM_1 804 1 2 0
109 FEAT_EPIC_GREAT_WISDOM_2 805 1 2 0
110 FEAT_EPIC_GREAT_WISDOM_3 806 1 2 0
111 FEAT_EPIC_GREAT_WISDOM_4 807 1 2 0
112 FEAT_EPIC_GREAT_WISDOM_5 808 1 2 0
113 FEAT_EPIC_GREAT_WISDOM_6 809 1 2 0
114 FEAT_EPIC_GREAT_WISDOM_7 810 1 2 0
115 FEAT_EPIC_GREAT_WISDOM_8 811 1 2 0
116 FEAT_EPIC_GREAT_WISDOM_9 812 1 2 0
117 FEAT_EPIC_GREAT_WISDOM_10 813 1 2 0
118 FEAT_EPIC_GREAT_CHARISMA_1 764 1 2 0
119 FEAT_EPIC_GREAT_CHARISMA_2 765 1 2 0
120 FEAT_EPIC_GREAT_CHARISMA_3 766 1 2 0
121 FEAT_EPIC_GREAT_CHARISMA_4 767 1 2 0
122 FEAT_EPIC_GREAT_CHARISMA_5 768 1 2 0
123 FEAT_EPIC_GREAT_CHARISMA_6 769 1 2 0
124 FEAT_EPIC_GREAT_CHARISMA_7 770 1 2 0
125 FEAT_EPIC_GREAT_CHARISMA_8 771 1 2 0
126 FEAT_EPIC_GREAT_CHARISMA_9 772 1 2 0
127 FEAT_EPIC_GREAT_CHARISMA_10 773 1 2 0
128 FEAT_EPIC_REPUTATION 586 1 2 0
129 FEAT_EPIC_ENERGY_RESISTANCE_COLD_1 533 1 2 0
130 FEAT_EPIC_ENERGY_RESISTANCE_COLD_2 534 1 2 0
131 FEAT_EPIC_ENERGY_RESISTANCE_COLD_3 535 1 2 0
132 FEAT_EPIC_ENERGY_RESISTANCE_COLD_4 536 1 2 0
133 FEAT_EPIC_ENERGY_RESISTANCE_COLD_5 537 1 2 0
134 FEAT_EPIC_ENERGY_RESISTANCE_COLD_6 538 1 2 0
135 FEAT_EPIC_ENERGY_RESISTANCE_COLD_7 539 1 2 0
136 FEAT_EPIC_ENERGY_RESISTANCE_COLD_8 540 1 2 0
137 FEAT_EPIC_ENERGY_RESISTANCE_COLD_9 541 1 2 0
138 FEAT_EPIC_ENERGY_RESISTANCE_COLD_10 542 1 2 0
139 FEAT_EPIC_ENERGY_RESISTANCE_ACID_1 543 1 2 0
140 FEAT_EPIC_ENERGY_RESISTANCE_ACID_2 544 1 2 0
141 FEAT_EPIC_ENERGY_RESISTANCE_ACID_3 545 1 2 0
142 FEAT_EPIC_ENERGY_RESISTANCE_ACID_4 546 1 2 0
143 FEAT_EPIC_ENERGY_RESISTANCE_ACID_5 547 1 2 0
144 FEAT_EPIC_ENERGY_RESISTANCE_ACID_6 548 1 2 0
145 FEAT_EPIC_ENERGY_RESISTANCE_ACID_7 549 1 2 0
146 FEAT_EPIC_ENERGY_RESISTANCE_ACID_8 550 1 2 0
147 FEAT_EPIC_ENERGY_RESISTANCE_ACID_9 551 1 2 0
148 FEAT_EPIC_ENERGY_RESISTANCE_ACID_10 552 1 2 0
149 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_1 553 1 2 0
150 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_2 554 1 2 0
151 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_3 555 1 2 0
152 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_4 556 1 2 0
153 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_5 557 1 2 0
154 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_6 558 1 2 0
155 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_7 559 1 2 0
156 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_8 560 1 2 0
157 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_9 561 1 2 0
158 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_10 562 1 2 0
159 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_1 563 1 2 0
160 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_2 564 1 2 0
161 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_3 565 1 2 0
162 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_4 566 1 2 0
163 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_5 567 1 2 0
164 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_6 568 1 2 0
165 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_7 569 1 2 0
166 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_8 570 1 2 0
167 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_9 571 1 2 0
168 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_10 572 1 2 0
169 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_1 573 1 2 0
170 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_2 574 1 2 0
171 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_3 575 1 2 0
172 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_4 576 1 2 0
173 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_5 577 1 2 0
174 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_6 578 1 2 0
175 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_7 579 1 2 0
176 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_8 580 1 2 0
177 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_9 581 1 2 0
178 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_10 582 1 2 0
179 Psionic_Endowment 4802 0 2 1
180 Greater_Psionic_Endowment 4801 0 2 1
181 Power_Specialization 4805 0 2 1
182 Greater_Power_Specialization 4804 0 2 0
183 Power_Penetration 4807 0 2 1
184 Greater_Power_Penetration 4806 0 2 1
185 Overchannel 4826 0 2 1
186 Talented 4829 0 2 1
187 Chain_Power 4937 0 2 1
188 Empower_Power 4938 0 2 1
189 Extend_Power 4939 0 2 1
190 Maximize_Power 4940 0 2 1
191 Split_Psionic_Ray 4941 0 2 1
192 Twin_Power 4942 0 2 1
193 Widen_Power 4943 0 2 1
194 Quicken_Power 4944 0 2 1
195 **** **** **** **** ****
196 Psionic_Dodge 4803 0 2 0
197 Narrow_Mind 4808 0 2 0
198 Combat_Manifestation 4810 0 2 0
199 Boost_Construct 4833 0 2 0
200 Speed_Of_Thought 4834 0 2 0
201 Psionic_Talent_1 4835 0 2 0
202 Psionic_Talent_2 4836 0 2 0
203 Psionic_Talent_3 4837 0 2 0
204 Psionic_Talent_4 4838 0 2 0
205 Psionic_Talent_5 4839 0 2 0
206 Psionic_Talent_6 4840 0 2 0
207 Psionic_Talent_7 4841 0 2 0
208 Psionic_Talent_8 4842 0 2 0
209 Psionic_Talent_9 4843 0 2 0
210 Psionic_Talent_10 4844 0 2 0
211 Epic_Psionic_Focus_1 4857 1 2 0
212 Epic_Psionic_Focus_2 4858 1 2 0
213 Epic_Psionic_Focus_3 4859 1 2 0
214 Epic_Psionic_Focus_4 4860 1 2 0
215 Epic_Psionic_Focus_5 4861 1 2 0
216 Epic_Psionic_Focus_6 4862 1 2 0
217 Epic_Psionic_Focus_7 4863 1 2 0
218 Epic_Psionic_Focus_8 4864 1 2 0
219 Epic_Psionic_Focus_9 4865 1 2 0
220 Epic_Psionic_Focus_10 4866 1 2 0
221 Expanded_Knowledge_1 4867 0 2 0
222 Expanded_Knowledge_2 4868 0 2 0
223 Expanded_Knowledge_3 4869 0 2 0
224 Expanded_Knowledge_4 4870 0 2 0
225 Expanded_Knowledge_5 4871 0 2 0
226 Expanded_Knowledge_6 4872 0 2 0
227 Expanded_Knowledge_7 4873 0 2 0
228 Expanded_Knowledge_8 4874 0 2 0
229 Expanded_Knowledge_9 4875 0 2 0
230 Expanded_Knowledge_10 4876 0 2 0
231 Epic_Expanded_Knowledge_1 4877 1 2 0
232 Epic_Expanded_Knowledge_2 4878 1 2 0
233 Epic_Expanded_Knowledge_3 4879 1 2 0
234 Epic_Expanded_Knowledge_4 4880 1 2 0
235 Epic_Expanded_Knowledge_5 4881 1 2 0
236 Epic_Expanded_Knowledge_6 4882 1 2 0
237 Epic_Expanded_Knowledge_7 4883 1 2 0
238 Epic_Expanded_Knowledge_8 4884 1 2 0
239 Epic_Expanded_Knowledge_9 4885 1 2 0
240 Epic_Expanded_Knowledge_10 4886 1 2 0
241 Improved_Metapsionics_1 4887 1 2 0
242 Improved_Metapsionics_2 4888 1 2 0
243 Improved_Metapsionics_3 4889 1 2 0
244 Improved_Metapsionics_4 4890 1 2 0
245 Improved_Metapsionics_5 4891 1 2 0
246 Improved_Metapsionics_6 4892 1 2 0
247 Improved_Metapsionics_7 4893 1 2 0
248 Improved_Metapsionics_8 4894 1 2 0
249 Improved_Metapsionics_9 4895 1 2 0
250 Improved_Metapsionics_10 4896 1 2 0
251 Improved_Manifestation_1 4897 1 2 0
252 Improved_Manifestation_2 4898 1 2 0
253 Improved_Manifestation_3 4899 1 2 0
254 Improved_Manifestation_4 4900 1 2 0
255 Improved_Manifestation_5 4901 1 2 0
256 Improved_Manifestation_6 4902 1 2 0
257 Improved_Manifestation_7 4903 1 2 0
258 Improved_Manifestation_8 4904 1 2 0
259 Improved_Manifestation_9 4905 1 2 0
260 Improved_Manifestation_10 4906 1 2 0
261 Power_Knowledge_Psion_1 4907 0 2 0
262 Power_Knowledge_Psion_2 4908 0 2 0
263 Power_Knowledge_Psion_3 4909 0 2 0
264 Power_Knowledge_Psion_4 4910 0 2 0
265 Power_Knowledge_Psion_5 4911 0 2 0
266 Power_Knowledge_Psion_6 4912 0 2 0
267 Power_Knowledge_Psion_7 4913 0 2 0
268 Power_Knowledge_Psion_8 4914 0 2 0
269 Power_Knowledge_Psion_9 4915 0 2 0
270 Power_Knowledge_Psion_10 4916 0 2 0
271 Power_Knowledge_PsyWar_1 4917 0 2 0
272 Power_Knowledge_PsyWar_2 4918 0 2 0
273 Power_Knowledge_PsyWar_3 4919 0 2 0
274 Power_Knowledge_PsyWar_4 4920 0 2 0
275 Power_Knowledge_PsyWar_5 4921 0 2 0
276 Power_Knowledge_PsyWar_6 4922 0 2 0
277 Power_Knowledge_PsyWar_7 4923 0 2 0
278 Power_Knowledge_PsyWar_8 4924 0 2 0
279 Power_Knowledge_PsyWar_9 4925 0 2 0
280 Power_Knowledge_PsyWar_10 4926 0 2 0
281 Power_Knowledge_Wilder_1 4927 0 2 0
282 Power_Knowledge_Wilder_2 4928 0 2 0
283 Power_Knowledge_Wilder_3 4929 0 2 0
284 Power_Knowledge_Wilder_4 4930 0 2 0
285 Power_Knowledge_Wilder_5 4931 0 2 0
286 Power_Knowledge_Wilder_6 4932 0 2 0
287 Power_Knowledge_Wilder_7 4933 0 2 0
288 Power_Knowledge_Wilder_8 4934 0 2 0
289 Power_Knowledge_Wilder_9 4935 0 2 0
290 Power_Knowledge_Wilder_10 4936 0 2 0
291 Power_Knowledge_FistOfZuoken_1 4945 0 2 0
292 Power_Knowledge_FistOfZuoken_2 4946 0 2 0
293 Power_Knowledge_FistOfZuoken_3 4947 0 2 0
294 Power_Knowledge_FistOfZuoken_4 4948 0 2 0
295 Power_Knowledge_FistOfZuoken_5 4949 0 2 0
296 Power_Knowledge_FistOfZuoken_6 4950 0 2 0
297 Power_Knowledge_FistOfZuoken_7 4951 0 2 0
298 Power_Knowledge_FistOfZuoken_8 4952 0 2 0
299 Power_Knowledge_FistOfZuoken_9 4953 0 2 0
300 Power_Knowledge_FistOfZuoken_10 4954 0 2 0
FeatLabel FeatIndex List GrantedOnLevel OnMenu
0 **Class_feats** **** **** **** ****
1 Psionic_Sleep_Paral_Immunity 3871 3 1 1
2 Channel_Dragon_Claws 3866 3 2 1
3 Psionic_Breath_Weapon 3867 3 4 1
4 Channel_Dragon_Wings 3868 3 6 1
5 Channel_Dragon_Tail 3869 3 8 1
6 Psionic_Dragonfear 3870 3 10 1
7 FEAT_AUGMENT_PSIONICS_QUICKSELECTS 3550 3 1 1
8 Augment_QuickSelects_2 3563 3 1 1
9 FEAT_AUGMENT_PSIONICS_DIGITS_0_4 3551 3 1 1
10 FEAT_AUGMENT_PSIONICS_DIGITS_5_9 3552 3 1 1
11 FEAT_AUGMENT_PSIONICS_TENS 3553 3 1 1
12 FEAT_EPIC_DIAMOND_DRAGON 25115 3 11 0
13 **** **** **** **** ****
14 **Bonus_Feats** **** **** **** ****
15 Dragon_Augment_STR_1 3857 2 1 0
16 Dragon_Augment_STR_2 3858 2 1 0
17 Dragon_Augment_STR_3 3859 2 1 0
18 Dragon_Augment_STR_4 25645 2 1 0
19 Dragon_Augment_STR_5 25646 2 1 0
20 Dragon_Augment_STR_6 25647 2 1 0
21 Dragon_Augment_STR_7 25648 2 1 0
22 Dragon_Augment_STR_8 25649 2 1 0
23 Dragon_Augment_STR_9 25650 2 1 0
23 Dragon_Augment_STR_10 25651 2 1 0
24 Dragon_Augment_DEX_1 3860 2 1 0
25 Dragon_Augment_DEX_2 3861 2 1 0
26 Dragon_Augment_DEX_3 3862 2 1 0
27 Dragon_Augment_DEX_4 25653 2 1 0
28 Dragon_Augment_DEX_5 25654 2 1 0
29 Dragon_Augment_DEX_6 25655 2 1 0
30 Dragon_Augment_DEX_7 25656 2 1 0
31 Dragon_Augment_DEX_8 25657 2 1 0
32 Dragon_Augment_DEX_9 25658 2 1 0
32 Dragon_Augment_DEX_10 25659 2 1 0
33 Dragon_Augment_CON_1 3863 2 1 0
34 Dragon_Augment_CON_2 3864 2 1 0
35 Dragon_Augment_CON_3 3865 2 1 0
36 Dragon_Augment_CON_4 25661 2 1 0
37 Dragon_Augment_CON_5 25662 2 1 0
38 Dragon_Augment_CON_6 25663 2 1 0
39 Dragon_Augment_CON_7 25664 2 1 0
40 Dragon_Augment_CON_8 25665 2 1 0
41 Dragon_Augment_CON_9 25666 2 1 0
41 Dragon_Augment_CON_10 25667 2 1 0
42 FEAT_DIAMOND_DRAGON_MANIFEST_FOZ 18131 2 1 0
43 FEAT_DIAMOND_DRAGON_MANIFEST_PSION 18138 2 1 0
44 FEAT_DIAMOND_DRAGON_MANIFEST_PSYROUGE 18146 2 1 0
45 FEAT_DIAMOND_DRAGON_MANIFEST_PSYWAR 18153 2 1 0
46 FEAT_DIAMOND_DRAGON_MANIFEST_WARMIND 18160 2 1 0
47 FEAT_DIAMOND_DRAGON_MANIFEST_WILDER 18167 2 1 0
48 FEAT_EPIC_ARMOR_SKIN 490 1 2 0
49 FEAT_EPIC_BLINDING_SPEED 491 1 2 1
50 FEAT_EPIC_DAMAGE_REDUCTION_3 492 1 2 0
51 FEAT_EPIC_DAMAGE_REDUCTION_6 493 1 2 0
52 FEAT_EPIC_DAMAGE_REDUCTION_9 494 1 2 0
53 FEAT_EPIC_TOUGHNESS_1 754 1 2 0
54 FEAT_EPIC_TOUGHNESS_2 755 1 2 0
55 FEAT_EPIC_TOUGHNESS_3 756 1 2 0
56 FEAT_EPIC_TOUGHNESS_4 757 1 2 0
57 FEAT_EPIC_TOUGHNESS_5 758 1 2 0
58 FEAT_EPIC_TOUGHNESS_6 759 1 2 0
59 FEAT_EPIC_TOUGHNESS_7 760 1 2 0
60 FEAT_EPIC_TOUGHNESS_8 761 1 2 0
61 FEAT_EPIC_TOUGHNESS_9 762 1 2 0
62 FEAT_EPIC_TOUGHNESS_10 763 1 2 0
63 FEAT_EPIC_SUPERIOR_INITIATIVE 753 1 2 0
64 FEAT_EPIC_SKILL_FOCUS_USEMAGICDEVICE 609 1 2 0
65 FEAT_EPIC_SKILL_FOCUS_RIDE 3038 1 2 0
66 FEAT_EPIC_SKILL_FOCUS_JUMP 3040 1 2 0
67 FEAT_EPIC_SKILL_FOCUS_SENSE_MOTIVE 3042 1 2 0
68 FEAT_EPIC_SKILL_FOCUS_MARTIAL_LORE 3044 1 2 0
69 FEAT_EPIC_SKILL_FOCUS_BALANCE 3046 1 2 0
70 FEAT_EPIC_SKILL_FOCUS_CRAFT_POISON 3048 1 2 0
71 FEAT_EPIC_SKILL_FOCUS_PSICRAFT 3050 1 2 0
72 FEAT_EPIC_SKILL_FOCUS_CLIMB 3052 1 2 0
73 FEAT_EPIC_SKILL_FOCUS_CRAFT_GENERAL 3054 1 2 0
74 FEAT_EPIC_SKILL_FOCUS_APPRAISE 588 1 2 0
75 FEAT_EPIC_SKILL_FOCUS_CONCENTRATION 589 1 2 0
76 FEAT_EPIC_SKILL_FOCUS_CRAFT_TRAP 590 1 2 0
77 FEAT_EPIC_SKILL_FOCUS_DISABLETRAP 591 1 2 0
78 FEAT_EPIC_SKILL_FOCUS_DISCIPLINE 592 1 2 0
79 FEAT_EPIC_SKILL_FOCUS_HEAL 593 1 2 0
80 FEAT_EPIC_SKILL_FOCUS_HIDE 594 1 2 0
81 FEAT_EPIC_SKILL_FOCUS_LISTEN 595 1 2 0
82 FEAT_EPIC_SKILL_FOCUS_LORE 596 1 2 0
83 FEAT_EPIC_SKILL_FOCUS_MOVESILENTLY 597 1 2 0
84 FEAT_EPIC_SKILL_FOCUS_OPENLOCK 598 1 2 0
85 FEAT_EPIC_SKILL_FOCUS_PARRY 599 1 2 0
86 FEAT_EPIC_SKILL_FOCUS_PERSUADE 601 1 2 0
87 FEAT_EPIC_SKILL_FOCUS_PICKPOCKET 602 1 2 0
88 FEAT_EPIC_SKILL_FOCUS_SEARCH 603 1 2 0
89 FEAT_EPIC_SKILL_FOCUS_SETTRAP 604 1 2 0
90 FEAT_EPIC_SKILL_FOCUS_SPELLCRAFT 605 1 2 0
91 FEAT_EPIC_SKILL_FOCUS_SPOT 606 1 2 0
92 FEAT_EPIC_SKILL_FOCUS_TAUNT 607 1 2 0
93 FEAT_EPIC_SKILL_FOCUS_TUMBLE 608 1 2 0
94 FEAT_EPIC_SKILL_FOCUS_CRAFT_ARMOR 913 1 2 0
95 FEAT_EPIC_SKILL_FOCUS_CRAFT_WEAPON 914 1 2 0
96 FEAT_EPIC_SKILL_FOCUS_BLUFF 917 1 2 0
97 FEAT_EPIC_SKILL_FOCUS_INTIMIDATE 918 1 2 0
98 FEAT_EPIC_GREAT_INTELLIGENCE_1 794 1 2 0
99 FEAT_EPIC_GREAT_INTELLIGENCE_2 795 1 2 0
100 FEAT_EPIC_GREAT_INTELLIGENCE_3 796 1 2 0
101 FEAT_EPIC_GREAT_INTELLIGENCE_4 797 1 2 0
102 FEAT_EPIC_GREAT_INTELLIGENCE_5 798 1 2 0
103 FEAT_EPIC_GREAT_INTELLIGENCE_6 799 1 2 0
104 FEAT_EPIC_GREAT_INTELLIGENCE_7 800 1 2 0
105 FEAT_EPIC_GREAT_INTELLIGENCE_8 801 1 2 0
106 FEAT_EPIC_GREAT_INTELLIGENCE_9 802 1 2 0
107 FEAT_EPIC_GREAT_INTELLIGENCE_10 803 1 2 0
108 FEAT_EPIC_GREAT_WISDOM_1 804 1 2 0
109 FEAT_EPIC_GREAT_WISDOM_2 805 1 2 0
110 FEAT_EPIC_GREAT_WISDOM_3 806 1 2 0
111 FEAT_EPIC_GREAT_WISDOM_4 807 1 2 0
112 FEAT_EPIC_GREAT_WISDOM_5 808 1 2 0
113 FEAT_EPIC_GREAT_WISDOM_6 809 1 2 0
114 FEAT_EPIC_GREAT_WISDOM_7 810 1 2 0
115 FEAT_EPIC_GREAT_WISDOM_8 811 1 2 0
116 FEAT_EPIC_GREAT_WISDOM_9 812 1 2 0
117 FEAT_EPIC_GREAT_WISDOM_10 813 1 2 0
118 FEAT_EPIC_GREAT_CHARISMA_1 764 1 2 0
119 FEAT_EPIC_GREAT_CHARISMA_2 765 1 2 0
120 FEAT_EPIC_GREAT_CHARISMA_3 766 1 2 0
121 FEAT_EPIC_GREAT_CHARISMA_4 767 1 2 0
122 FEAT_EPIC_GREAT_CHARISMA_5 768 1 2 0
123 FEAT_EPIC_GREAT_CHARISMA_6 769 1 2 0
124 FEAT_EPIC_GREAT_CHARISMA_7 770 1 2 0
125 FEAT_EPIC_GREAT_CHARISMA_8 771 1 2 0
126 FEAT_EPIC_GREAT_CHARISMA_9 772 1 2 0
127 FEAT_EPIC_GREAT_CHARISMA_10 773 1 2 0
128 FEAT_EPIC_REPUTATION 586 1 2 0
129 FEAT_EPIC_ENERGY_RESISTANCE_COLD_1 533 1 2 0
130 FEAT_EPIC_ENERGY_RESISTANCE_COLD_2 534 1 2 0
131 FEAT_EPIC_ENERGY_RESISTANCE_COLD_3 535 1 2 0
132 FEAT_EPIC_ENERGY_RESISTANCE_COLD_4 536 1 2 0
133 FEAT_EPIC_ENERGY_RESISTANCE_COLD_5 537 1 2 0
134 FEAT_EPIC_ENERGY_RESISTANCE_COLD_6 538 1 2 0
135 FEAT_EPIC_ENERGY_RESISTANCE_COLD_7 539 1 2 0
136 FEAT_EPIC_ENERGY_RESISTANCE_COLD_8 540 1 2 0
137 FEAT_EPIC_ENERGY_RESISTANCE_COLD_9 541 1 2 0
138 FEAT_EPIC_ENERGY_RESISTANCE_COLD_10 542 1 2 0
139 FEAT_EPIC_ENERGY_RESISTANCE_ACID_1 543 1 2 0
140 FEAT_EPIC_ENERGY_RESISTANCE_ACID_2 544 1 2 0
141 FEAT_EPIC_ENERGY_RESISTANCE_ACID_3 545 1 2 0
142 FEAT_EPIC_ENERGY_RESISTANCE_ACID_4 546 1 2 0
143 FEAT_EPIC_ENERGY_RESISTANCE_ACID_5 547 1 2 0
144 FEAT_EPIC_ENERGY_RESISTANCE_ACID_6 548 1 2 0
145 FEAT_EPIC_ENERGY_RESISTANCE_ACID_7 549 1 2 0
146 FEAT_EPIC_ENERGY_RESISTANCE_ACID_8 550 1 2 0
147 FEAT_EPIC_ENERGY_RESISTANCE_ACID_9 551 1 2 0
148 FEAT_EPIC_ENERGY_RESISTANCE_ACID_10 552 1 2 0
149 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_1 553 1 2 0
150 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_2 554 1 2 0
151 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_3 555 1 2 0
152 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_4 556 1 2 0
153 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_5 557 1 2 0
154 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_6 558 1 2 0
155 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_7 559 1 2 0
156 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_8 560 1 2 0
157 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_9 561 1 2 0
158 FEAT_EPIC_ENERGY_RESISTANCE_FIRE_10 562 1 2 0
159 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_1 563 1 2 0
160 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_2 564 1 2 0
161 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_3 565 1 2 0
162 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_4 566 1 2 0
163 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_5 567 1 2 0
164 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_6 568 1 2 0
165 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_7 569 1 2 0
166 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_8 570 1 2 0
167 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_9 571 1 2 0
168 FEAT_EPIC_ENERGY_RESISTANCE_ELECTRICAL_10 572 1 2 0
169 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_1 573 1 2 0
170 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_2 574 1 2 0
171 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_3 575 1 2 0
172 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_4 576 1 2 0
173 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_5 577 1 2 0
174 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_6 578 1 2 0
175 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_7 579 1 2 0
176 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_8 580 1 2 0
177 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_9 581 1 2 0
178 FEAT_EPIC_ENERGY_RESISTANCE_SONIC_10 582 1 2 0
179 Psionic_Endowment 4802 0 2 1
180 Greater_Psionic_Endowment 4801 0 2 1
181 Power_Specialization 4805 0 2 1
182 Greater_Power_Specialization 4804 0 2 0
183 Power_Penetration 4807 0 2 1
184 Greater_Power_Penetration 4806 0 2 1
185 Overchannel 4826 0 2 1
186 Talented 4829 0 2 1
187 Chain_Power 4937 0 2 1
188 Empower_Power 4938 0 2 1
189 Extend_Power 4939 0 2 1
190 Maximize_Power 4940 0 2 1
191 Split_Psionic_Ray 4941 0 2 1
192 Twin_Power 4942 0 2 1
193 Widen_Power 4943 0 2 1
194 Quicken_Power 4944 0 2 1
195 **** **** **** **** ****
196 Psionic_Dodge 4803 0 2 0
197 Narrow_Mind 4808 0 2 0
198 Combat_Manifestation 4810 0 2 0
199 Boost_Construct 4833 0 2 0
200 Speed_Of_Thought 4834 0 2 0
201 Psionic_Talent_1 4835 0 2 0
202 Psionic_Talent_2 4836 0 2 0
203 Psionic_Talent_3 4837 0 2 0
204 Psionic_Talent_4 4838 0 2 0
205 Psionic_Talent_5 4839 0 2 0
206 Psionic_Talent_6 4840 0 2 0
207 Psionic_Talent_7 4841 0 2 0
208 Psionic_Talent_8 4842 0 2 0
209 Psionic_Talent_9 4843 0 2 0
210 Psionic_Talent_10 4844 0 2 0
211 Epic_Psionic_Focus_1 4857 1 2 0
212 Epic_Psionic_Focus_2 4858 1 2 0
213 Epic_Psionic_Focus_3 4859 1 2 0
214 Epic_Psionic_Focus_4 4860 1 2 0
215 Epic_Psionic_Focus_5 4861 1 2 0
216 Epic_Psionic_Focus_6 4862 1 2 0
217 Epic_Psionic_Focus_7 4863 1 2 0
218 Epic_Psionic_Focus_8 4864 1 2 0
219 Epic_Psionic_Focus_9 4865 1 2 0
220 Epic_Psionic_Focus_10 4866 1 2 0
221 Expanded_Knowledge_1 4867 0 2 0
222 Expanded_Knowledge_2 4868 0 2 0
223 Expanded_Knowledge_3 4869 0 2 0
224 Expanded_Knowledge_4 4870 0 2 0
225 Expanded_Knowledge_5 4871 0 2 0
226 Expanded_Knowledge_6 4872 0 2 0
227 Expanded_Knowledge_7 4873 0 2 0
228 Expanded_Knowledge_8 4874 0 2 0
229 Expanded_Knowledge_9 4875 0 2 0
230 Expanded_Knowledge_10 4876 0 2 0
231 Epic_Expanded_Knowledge_1 4877 1 2 0
232 Epic_Expanded_Knowledge_2 4878 1 2 0
233 Epic_Expanded_Knowledge_3 4879 1 2 0
234 Epic_Expanded_Knowledge_4 4880 1 2 0
235 Epic_Expanded_Knowledge_5 4881 1 2 0
236 Epic_Expanded_Knowledge_6 4882 1 2 0
237 Epic_Expanded_Knowledge_7 4883 1 2 0
238 Epic_Expanded_Knowledge_8 4884 1 2 0
239 Epic_Expanded_Knowledge_9 4885 1 2 0
240 Epic_Expanded_Knowledge_10 4886 1 2 0
241 Improved_Metapsionics_1 4887 1 2 0
242 Improved_Metapsionics_2 4888 1 2 0
243 Improved_Metapsionics_3 4889 1 2 0
244 Improved_Metapsionics_4 4890 1 2 0
245 Improved_Metapsionics_5 4891 1 2 0
246 Improved_Metapsionics_6 4892 1 2 0
247 Improved_Metapsionics_7 4893 1 2 0
248 Improved_Metapsionics_8 4894 1 2 0
249 Improved_Metapsionics_9 4895 1 2 0
250 Improved_Metapsionics_10 4896 1 2 0
251 Improved_Manifestation_1 4897 1 2 0
252 Improved_Manifestation_2 4898 1 2 0
253 Improved_Manifestation_3 4899 1 2 0
254 Improved_Manifestation_4 4900 1 2 0
255 Improved_Manifestation_5 4901 1 2 0
256 Improved_Manifestation_6 4902 1 2 0
257 Improved_Manifestation_7 4903 1 2 0
258 Improved_Manifestation_8 4904 1 2 0
259 Improved_Manifestation_9 4905 1 2 0
260 Improved_Manifestation_10 4906 1 2 0
261 Power_Knowledge_Psion_1 4907 0 2 0
262 Power_Knowledge_Psion_2 4908 0 2 0
263 Power_Knowledge_Psion_3 4909 0 2 0
264 Power_Knowledge_Psion_4 4910 0 2 0
265 Power_Knowledge_Psion_5 4911 0 2 0
266 Power_Knowledge_Psion_6 4912 0 2 0
267 Power_Knowledge_Psion_7 4913 0 2 0
268 Power_Knowledge_Psion_8 4914 0 2 0
269 Power_Knowledge_Psion_9 4915 0 2 0
270 Power_Knowledge_Psion_10 4916 0 2 0
271 Power_Knowledge_PsyWar_1 4917 0 2 0
272 Power_Knowledge_PsyWar_2 4918 0 2 0
273 Power_Knowledge_PsyWar_3 4919 0 2 0
274 Power_Knowledge_PsyWar_4 4920 0 2 0
275 Power_Knowledge_PsyWar_5 4921 0 2 0
276 Power_Knowledge_PsyWar_6 4922 0 2 0
277 Power_Knowledge_PsyWar_7 4923 0 2 0
278 Power_Knowledge_PsyWar_8 4924 0 2 0
279 Power_Knowledge_PsyWar_9 4925 0 2 0
280 Power_Knowledge_PsyWar_10 4926 0 2 0
281 Power_Knowledge_Wilder_1 4927 0 2 0
282 Power_Knowledge_Wilder_2 4928 0 2 0
283 Power_Knowledge_Wilder_3 4929 0 2 0
284 Power_Knowledge_Wilder_4 4930 0 2 0
285 Power_Knowledge_Wilder_5 4931 0 2 0
286 Power_Knowledge_Wilder_6 4932 0 2 0
287 Power_Knowledge_Wilder_7 4933 0 2 0
288 Power_Knowledge_Wilder_8 4934 0 2 0
289 Power_Knowledge_Wilder_9 4935 0 2 0
290 Power_Knowledge_Wilder_10 4936 0 2 0
291 Power_Knowledge_FistOfZuoken_1 4945 0 2 0
292 Power_Knowledge_FistOfZuoken_2 4946 0 2 0
293 Power_Knowledge_FistOfZuoken_3 4947 0 2 0
294 Power_Knowledge_FistOfZuoken_4 4948 0 2 0
295 Power_Knowledge_FistOfZuoken_5 4949 0 2 0
296 Power_Knowledge_FistOfZuoken_6 4950 0 2 0
297 Power_Knowledge_FistOfZuoken_7 4951 0 2 0
298 Power_Knowledge_FistOfZuoken_8 4952 0 2 0
299 Power_Knowledge_FistOfZuoken_9 4953 0 2 0
300 Power_Knowledge_FistOfZuoken_10 4954 0 2 0

View File

@@ -594,3 +594,4 @@
68 WEAP_SPEC_ELVEN_LIGHTBLADE 24699 1 -1 0
69 WEAP_SPEC_ELVEN_THINBLADE 24707 1 -1 0
70 WEAP_SPEC_ELVEN_COURTBLADE 24715 1 -1 0
71 ExtraTurning 13 0 -1 0

View File

@@ -1,33 +1,29 @@
2DA V2.0
LABEL ReqType ReqParam1 ReqParam2
0 Persuade SKILL 12 4
1 Lore SKILL 7 2
2 WeapProfMar FEAT 45 ****
3 ArmProfHvy FEAT 2 ****
4 Dodge FEAT 10 ****
5 Expertise FEAT 389 ****
6 WeapProfThinbld FEATOR 7936 ****
7 WeapFocLSw FEATOR 106 ****
8 WeapProfCrtbld FEATOR 7937 ****
9 Elf RACE 1 ****
10 HalfElf RACE 4 ****
11 DarksunElf RACE 34 ****
12 DarksunHalfelf RACE 35 ****
13 Kagonesti RACE 44 ****
14 Sylvanesti RACE 45 ****
15 FrstlrdElf RACE 107 ****
16 Aquatic_Elf RACE 161 ****
17 Avariel RACE 162 ****
18 Drow_female RACE 163 ****
19 Drow_male RACE 164 ****
20 SnowElf RACE 165 ****
21 Sun_Elf RACE 166 ****
22 Wild_Elf RACE 167 ****
23 Wood_Elf RACE 168 ****
24 Half_Drow RACE 183 ****
25 Feyri RACE 201 ****
26 Grey_Elf RACE 169 ****
27 Base_Attack BAB 7 ****
28 ScriptVar VAR PRC_AllowCoC 0
29 ScriptVar VAR PRC_PrereqCoC 0
LABEL ReqType ReqParam1 ReqParam2
0 Persuade SKILL 12 4
1 Lore SKILL 7 2
2 WeapProfMar FEAT 45 ****
3 ArmProfHvy FEAT 2 ****
4 Expertise FEAT 389 ****
5 WeapProfThinbld FEATOR 7936 ****
6 WeapFocLSw FEATOR 106 ****
7 WeapProfCrtbld FEATOR 7937 ****
8 Elf RACE 1 ****
9 HalfElf RACE 4 ****
10 FrstlrdElf RACE 107 ****
11 Aquatic_Elf RACE 161 ****
12 Avariel RACE 162 ****
13 Drow_female RACE 163 ****
14 Drow_male RACE 164 ****
15 SnowElf RACE 165 ****
16 Sun_Elf RACE 166 ****
17 Wild_Elf RACE 167 ****
18 Wood_Elf RACE 168 ****
19 Half_Drow RACE 183 ****
20 Feyri RACE 201 ****
21 Grey_Elf RACE 169 ****
22 Base_Attack BAB 7 ****
23 ScriptVar VAR PRC_AllowCoC 0
24 ScriptVar VAR PRC_PrereqCoC 0
24 MountedCombat FEAT 1087 0

View File

@@ -6,12 +6,6 @@
2 CraftArmor SKILL 25 4
3 CraftWeapon SKILL 26 4
4 ExtTurn FEAT 13 ****
5 Sun_Domain FEATOR 322 ****
6 Strength_Domain FEATOR 307 ****
7 Protection_Domain FEATOR 308 ****
8 Good_Domain FEATOR 317 ****
9 Nobility_Domain FEATOR 4055 ****
10 Renewal_Domain FEATOR 4060 ****
11 ScriptVar VAR PRC_DivSpell3 0
12 ScriptVar VAR PRC_PrereqMornLord 0
13 ScriptVar VAR PRC_AllowMorninglord 0
5 ScriptVar VAR PRC_DivSpell3 0
6 ScriptVar VAR PRC_PrereqMornLord 0
7 ScriptVar VAR PRC_AllowMorninglord 0

View File

@@ -1,15 +1,16 @@
2DA V2.0
LABEL ReqType ReqParam1 ReqParam2
0 FEAT_PLANT_DEFIANCE FEAT 25992 ****
1 FEAT_PLANT_CONTROL FEAT 25993 ****
2 Cleric CLASSOR 2 ****
2 Archivist CLASSOR 190 ****
3 Shaman CLASSOR 207 ****
4 Ranger CLASSOR 7 ****
5 Druid CLASSOR 3 ****
6 Blighter CLASSNOT 247 ****
7 Ur-Priest CLASSNOT 42 ****
8 Heal SKILL 4 8
9 Lore SKILL 7 8
10 ScriptVar VAR PRC_PrereqVerdantLord 0
LABEL ReqType ReqParam1 ReqParam2
0 FEAT_PLANT_DEFIANCE FEAT 25992 ****
1 FEAT_PLANT_CONTROL FEAT 25993 ****
2 Cleric CLASSOR 2 ****
2 Archivist CLASSOR 190 ****
3 Shaman CLASSOR 207 ****
4 Ranger CLASSOR 7 ****
5 Druid CLASSOR 3 ****
6 Blighter CLASSNOT 247 ****
7 Ur-Priest CLASSNOT 42 ****
8 Heal SKILL 4 8
9 Lore SKILL 7 8
10 ScriptVar VAR PRC_PrereqVerdantLord 0
12 BaseAttackBonus4 BAB 4 ****

View File

@@ -15,7 +15,7 @@
11 PickPocket 13 0
12 Search 14 1
13 SetTrap 15 0
14 Spellcraft 16 1
14 Spellcraft 16 0
15 Spot 17 0
16 UseMagicDevice 19 1
17 Appraise 20 0

View File

@@ -25646,29 +25646,29 @@
25642 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25643 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25644 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25645 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25646 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25647 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25648 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25649 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25650 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25651 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25645 Dragon_Augment_STR_4 16987236 16987237 dradis_gen **** **** **** **** **** **** **** **** 3859 **** 0 1 0 **** **** **** 25646 0.5 **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_STR_4 5 **** **** **** **** **** 0 1
25646 Dragon_Augment_STR_5 16987238 16987239 dradis_gen **** **** **** **** **** **** **** **** 25645 **** 0 1 0 **** **** **** 25647 0.5 **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_STR_5 5 **** **** **** **** **** 0 1
25647 Dragon_Augment_STR_6 16987240 16987241 dradis_gen **** **** **** **** **** **** **** **** 25646 **** 0 1 0 **** **** **** 25648 0.5 **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_STR_6 5 **** **** **** **** **** 0 1
25648 Dragon_Augment_STR_7 16987242 16987243 dradis_gen **** **** **** **** **** **** **** **** 25647 **** 0 1 0 **** **** **** 25649 0.5 **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_STR_7 5 **** **** **** **** **** 0 1
25649 Dragon_Augment_STR_8 16987244 16987245 dradis_gen **** **** **** **** **** **** **** **** 25648 **** 0 1 0 **** **** **** 25650 0.5 **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_STR_8 5 **** **** **** **** **** 0 1
25650 Dragon_Augment_STR_9 16987246 16987247 dradis_gen **** **** **** **** **** **** **** **** 25649 **** 0 1 0 **** **** **** 25651 0.5 **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_STR_9 5 **** **** **** **** **** 0 1
25651 Dragon_Augment_STR_10 16987248 16987249 dradis_gen **** **** **** **** **** **** **** **** 25650 **** 0 1 0 **** **** **** **** 0.5 **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_STR_10 5 **** **** **** **** **** 0 1
25652 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25653 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25654 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25655 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25656 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25657 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25658 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25659 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25653 Dragon_Augment_DEX_4 16987252 16987253 dradis_gen **** **** **** **** **** **** **** **** 3862 **** 0 1 0 **** **** **** 25654 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_DEX_4 5 **** **** **** **** **** 0 1
25654 Dragon_Augment_DEX_5 16987254 16987255 dradis_gen **** **** **** **** **** **** **** **** 25653 **** 0 1 0 **** **** **** 25655 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_DEX_5 5 **** **** **** **** **** 0 1
25655 Dragon_Augment_DEX_6 16987256 16987257 dradis_gen **** **** **** **** **** **** **** **** 25654 **** 0 1 0 **** **** **** 25656 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_DEX_6 5 **** **** **** **** **** 0 1
25656 Dragon_Augment_DEX_7 16987258 16987259 dradis_gen **** **** **** **** **** **** **** **** 25655 **** 0 1 0 **** **** **** 25657 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_DEX_7 5 **** **** **** **** **** 0 1
25657 Dragon_Augment_DEX_8 16987260 16987261 dradis_gen **** **** **** **** **** **** **** **** 25656 **** 0 1 0 **** **** **** 25658 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_DEX_8 5 **** **** **** **** **** 0 1
25658 Dragon_Augment_DEX_9 16987262 16987263 dradis_gen **** **** **** **** **** **** **** **** 25657 **** 0 1 0 **** **** **** 25659 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_DEX_9 5 **** **** **** **** **** 0 1
25659 Dragon_Augment_DEX_10 16987264 16987265 dradis_gen **** **** **** **** **** **** **** **** 25658 **** 0 1 0 **** **** **** **** **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_DEX_10 5 **** **** **** **** **** 0 1
25660 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25661 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25662 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25663 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25664 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25665 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25666 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25667 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25661 Dragon_Augment_CON_4 16987268 16987269 dradis_gen **** **** **** **** **** **** **** **** 3865 **** 0 1 0 **** **** **** 25662 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_CON_4 5 **** **** **** **** **** 0 1
25662 Dragon_Augment_CON_5 16987270 16987271 dradis_gen **** **** **** **** **** **** **** **** 25661 **** 0 1 0 **** **** **** 25663 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_CON_5 5 **** **** **** **** **** 0 1
25663 Dragon_Augment_CON_6 16987272 16987273 dradis_gen **** **** **** **** **** **** **** **** 25662 **** 0 1 0 **** **** **** 25664 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_CON_6 5 **** **** **** **** **** 0 1
25664 Dragon_Augment_CON_7 16987274 16987275 dradis_gen **** **** **** **** **** **** **** **** 25663 **** 0 1 0 **** **** **** 25665 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_CON_7 5 **** **** **** **** **** 0 1
25665 Dragon_Augment_CON_8 16987276 16987277 dradis_gen **** **** **** **** **** **** **** **** 25664 **** 0 1 0 **** **** **** 25666 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_CON_8 5 **** **** **** **** **** 0 1
25666 Dragon_Augment_CON_9 16987278 16987279 dradis_gen **** **** **** **** **** **** **** **** 25665 **** 0 1 0 **** **** **** 25667 **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_CON_9 5 **** **** **** **** **** 0 1
25667 Dragon_Augment_CON_10 16987280 16987281 dradis_gen **** **** **** **** **** **** **** **** 25666 **** 0 1 0 **** **** **** **** **** **** 83 **** **** **** **** **** **** **** **** **** **** FEAT_DRAGON_AUGMENT_CON_10 5 **** **** **** **** **** 0 1
25668 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25669 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
25670 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****

View File

@@ -3,13 +3,71 @@
#include "prc_x2_itemprop"
// x - moved to prc_feats.nss
/* void main()
{
//:: Declare major variables
object oTarget = OBJECT_SELF;
object oSkin = GetPCSkin(oTarget);
int bNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int bPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bApplied = GetPersistantLocalInt(oTarget, "NWNX_TransVital");
if (DEBUG)
DoDebug("TransVital: start | NWNxEE=" + IntToString(bNWNxEE)
+ " Applied=" + IntToString(bApplied));
//:: Set Immunities
itemproperty ipDis = ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_DISEASE);
itemproperty ipPoi = ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON);
IPSafeAddItemProperty(oSkin, ipDis, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, TRUE);
IPSafeAddItemProperty(oSkin, ipPoi, 0.0f, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, TRUE);
//:: Set Regeneration
SetCompositeBonus(oSkin, "TransVitalRegen", 1, ITEM_PROPERTY_REGENERATION);
//:: No stacking
if (bApplied)
{
if (DEBUG)
DoDebug("TransVital: already applied, exiting");
return;
}
SetPersistantLocalInt(oTarget, "NWNX_TransVital", 1);
//:: NWNxEE
if (bNWNxEE & bPRCx)
{
if (DEBUG)
DoDebug("TransVital: dispatching NWNxEE shim prcx_trans_vital");
// Fire external NWNxEE-only script
ExecuteScript("prcx_trans_vital", oTarget);
}
//:: Vanilla NWN
else
{
if (DEBUG)
DoDebug("TransVital: applying vanilla composite CON bonus");
SetCompositeBonus(oSkin, "TransVitalCon", 5, ITEM_PROPERTY_ABILITY_BONUS, ABILITY_CONSTITUTION);
}
} */
void main()
{
//Declare major variables
object oTarget = OBJECT_SELF;
object oSkin = GetPCSkin(oTarget);
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int iTest = GetPersistantLocalInt(oTarget, "NWNX_TransVital");
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCX = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCX);
int iTest = GetPersistantLocalInt(oTarget, "NWNX_TransVital");
//itemproperty ipCON = ItemPropertyAbilityBonus(IP_CONST_ABILITY_CON, 5);
itemproperty ipDis = ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_DISEASE);

View File

@@ -2,21 +2,23 @@
/* Combined wrappers for both Win32 and Linux NWNX funcs */
////////////////////////////////////////////////////////////////////////////////////
#include "inc_debug"
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
// Used in OnModuleLoad event to auto-detect if NWNX_Funcs plugin is enabled
// Used in OnModuleLoad event to auto-detect if NWNX_Funcs plugin is enabled (DEFUNCT)
void PRC_Funcs_Init(object oModule);
// Sets the amount of hitpoints oObject has currently to nHP
void PRC_Funcs_SetCurrentHitPoints(object oCreature, int nHP);
// Sets the amount of hitpoints oObject can maximally have to nHP
void PRC_Funcs_SetMaxHitPoints(object oCreature, int nHP);
void PRC_Funcs_SetMaxHitPoints(object oCreature, int nHP, int nLevel = 0);
// Changes the skill ranks for nSkill on oObject by iValue
void PRC_Funcs_ModSkill(object oCreature, int nSkill, int nValue);
void PRC_Funcs_ModSkill(object oCreature, int nSkill, int nValue, int nLevel = 0);
// Sets a base ability score nAbility (ABILITY_STRENGTH, ABILITY_DEXTERITY, etc) to nValue
// The range of nValue is 3 to 255
@@ -44,17 +46,17 @@ void PRC_Funcs_SetBaseNaturalAC(object oCreature, int nValue);
int PRC_Funcs_GetBaseNaturalAC(object oCreature);
// Sets the specialist spell school of a Wizard
void PRC_Funcs_SetWizardSpecialization(object oCreature, int iSpecialization);
void PRC_Funcs_SetWizardSpecialization(object oCreature, int iSpecialization, int nClass = CLASS_TYPE_WIZARD);
// Returns the specialist spell school of a Wizard
int PRC_Funcs_GetWizardSpecialization(object oCreature);
int PRC_Funcs_GetWizardSpecialization(object oCreature, int nClass = CLASS_TYPE_WIZARD);
//////////////////////////////////////////////////
/* Function definitions */
//////////////////////////////////////////////////
int _PRC_NWNXFuncsZero(object oObject, string sFunc) {
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
SetLocalString(oObject, sFunc, "-");
else if (nVersion == 2)
@@ -65,7 +67,7 @@ int _PRC_NWNXFuncsZero(object oObject, string sFunc) {
}
int _PRC_NWNXFuncsOne(object oObject, string sFunc, int nVal1) {
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
SetLocalString(oObject, sFunc, IntToString(nVal1));
else if (nVersion == 2)
@@ -76,7 +78,7 @@ int _PRC_NWNXFuncsOne(object oObject, string sFunc, int nVal1) {
}
int _PRC_NWNXFuncsTwo(object oObject, string sFunc, int nVal1, int nVal2) {
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
SetLocalString(oObject, sFunc, IntToString(nVal1) + " " + IntToString(nVal2));
else if (nVersion == 2)
@@ -87,7 +89,7 @@ int _PRC_NWNXFuncsTwo(object oObject, string sFunc, int nVal1, int nVal2) {
}
int _PRC_NWNXFuncsThree(object oObject, string sFunc, int nVal1, int nVal2, int nVal3) {
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
SetLocalString(oObject, sFunc, IntToString(nVal1) + " " + IntToString(nVal2) + " " + IntToString(nVal3));
else if (nVersion == 2)
@@ -98,7 +100,7 @@ int _PRC_NWNXFuncsThree(object oObject, string sFunc, int nVal1, int nVal2, int
}
int _PRC_NWNXFuncsFour(object oObject, string sFunc, int nVal1, int nVal2, int nVal3, int nVal4) {
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
SetLocalString(oObject, sFunc, IntToString(nVal1) + " " + IntToString(nVal2) + " " + IntToString(nVal3) + " " + IntToString(nVal4));
else if (nVersion == 2)
@@ -114,13 +116,13 @@ void PRC_Funcs_Init(object oModule)
string sTestVariable = "PRC_TEST_NWNX_FUNCS";
SetLocalString(oModule, sTestVariable, "1");
SetLocalString(oModule, "NWNX!FUNCS!GETHASLOCALVARIABLE", sTestVariable + " 3"); //3 is the variable type
//NOTE: don't use _PRC_NWNXFuncsX functions here; they depend on the PRC_NWNX_FUNCS that we haven't set yet
//NOTE: don't use _PRC_NWNXFuncsX functions here; they depend on the PRC_NWNXEE_ENABLED that we haven't set yet
int iTest = StringToInt(GetLocalString(oModule, "NWNX!FUNCS!GETHASLOCALVARIABLE"));
DeleteLocalString(oModule, "NWNX!FUNCS!GETHASLOCALVARIABLE");
DeleteLocalString(oModule, sTestVariable);
if (iTest)
SetLocalInt(oModule, "PRC_NWNX_FUNCS", 1); //1 == win32
SetLocalInt(oModule, "PRC_NWNXEE_ENABLED", 1); //1 == win32
else
{
//NWNX GetLocalVariableCount behaves differently for win32 and linux,
@@ -132,7 +134,7 @@ void PRC_Funcs_Init(object oModule)
//the call failed because NWNX funcs is not present.
string sFunc = "NWNX!FUNCS!GETLOCALVARIABLECOUNT";
SetLocalString(oModule, sFunc, " ");
//NOTE: don't use _PRC_NWNXFuncsX functions here; they depend on the PRC_NWNX_FUNCS that we haven't set yet
//NOTE: don't use _PRC_NWNXFuncsX functions here; they depend on the PRC_NWNXEE_ENABLED that we haven't set yet
//NOTE: the number being returned by GetLocalVariableCount() on Linux seems bogus to me (it's huge, e.g. 294,654,504),
//but it does seem to be reliably zero when NWNX funcs is not present, and so far has been reliably non-zero
//when it is present. That's all we need here.
@@ -140,50 +142,116 @@ void PRC_Funcs_Init(object oModule)
int nVariables = StringToInt(GetLocalString(oModule, sFunc));
DeleteLocalString(oModule, sFunc);
if (nVariables)
SetLocalInt(oModule, "PRC_NWNX_FUNCS", 2); //2 == linux
SetLocalInt(oModule, "PRC_NWNXEE_ENABLED", 2); //2 == linux
}
}
void PRC_Funcs_SetMaxHitPoints(object oCreature, int nHP)
void PRC_Funcs_SetMaxHitPoints(object oCreature, int nHP, int nLevel = 0)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
//:: Default to total hit dice if not provided
if (nLevel <= 0)
nLevel = GetHitDice(oCreature);
//:: Payload for NWNxEE shim
SetLocalInt(oCreature, "PRC_EE_MAXHP", nHP);
SetLocalInt(oCreature, "PRC_EE_MAXHP_LEVEL", nLevel);
//:: Fire NWNxEE shim
ExecuteScript("prcx_set_maxhp", oCreature);
}
/* void PRC_Funcs_SetMaxHitPoints(object oCreature, int nHP)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1 || nVersion == 2)
{
_PRC_NWNXFuncsOne(oCreature, "NWNX!FUNCS!SETMAXHITPOINTS", nHP);
DeleteLocalString(oCreature, "NWNX!FUNCS!SETMAXHITPOINTS");
}
} */
void PRC_Funcs_ModSkill(object oCreature, int nSkill, int nValue, int nLevel = 0)
{
//:: Default to current level if not provided
if (nLevel <= 0)
nLevel = GetHitDice(oCreature);
//:: Payload for NWNxEE shim
SetLocalInt(oCreature, "PRC_EE_SKILL", nSkill);
SetLocalInt(oCreature, "PRC_EE_SKILL_DELTA", nValue);
SetLocalInt(oCreature, "PRC_EE_SKILL_LEVEL", nLevel);
//:: Fire NWNxEE shim
ExecuteScript("prcx_mod_skill", oCreature);
}
void PRC_Funcs_ModSkill(object oCreature, int nSkill, int nValue)
/* void PRC_Funcs_ModSkill(object oCreature, int nSkill, int nValue)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
_PRC_NWNXFuncsThree(oCreature, "NWNX!FUNCS!SETSKILL", nSkill, nValue, 1); //The 1 is a flag specifying modify instead of set
else if (nVersion == 2)
_PRC_NWNXFuncsTwo(oCreature, "NWNX!FUNCS!MODIFYSKILLRANK", nSkill, nValue);
}
} */
void PRC_Funcs_SetAbilityScore(object oCreature, int nAbility, int nValue)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
//:: Payload for NWNxEE shim
SetLocalInt(oCreature, "PRC_EE_ABILITY", nAbility);
SetLocalInt(oCreature, "PRC_EE_ABILITY_VALUE", nValue);
//:: Fire NWNxEE shim
ExecuteScript("prcx_set_ability", oCreature);
}
/* void PRC_Funcs_SetAbilityScore(object oCreature, int nAbility, int nValue)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
_PRC_NWNXFuncsFour(oCreature, "NWNX!FUNCS!SETABILITYSCORE", nAbility, nValue, 0, 0); //The first 0 is a flag specifying set instead of modify
else if (nVersion == 2)
_PRC_NWNXFuncsTwo(oCreature, "NWNX!FUNCS!SETABILITYSCORE", nAbility, nValue);
}
} */
void PRC_Funcs_ModAbilityScore(object oCreature, int nAbility, int nValue)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
if(DEBUG) DoDebug("============================================");
if(DEBUG) DoDebug("PRC_Funcs_ModAbiltyScore: Starting function.");
if(DEBUG) DoDebug("============================================");
//:: Payload for NWNxEE shim
SetLocalInt(oCreature, "PRC_EE_ABILITY", nAbility);
SetLocalInt(oCreature, "PRC_EE_ABILITY_DELTA", nValue);
if(DEBUG) DoDebug("PRC_Funcs_ModAbiltyScore: Variables Set");
//:: Fire NWNxEE shim
if(DEBUG) DoDebug("PRC_Funcs_ModAbiltyScore: Firing prc_mod_ability");
ExecuteScript("prcx_mod_ability", oCreature);
}
/* void PRC_Funcs_ModAbilityScore(object oCreature, int nAbility, int nValue)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
_PRC_NWNXFuncsFour(oCreature, "NWNX!FUNCS!SETABILITYSCORE", nAbility, nValue, 1, 0); //The 1 is a flag specifying modify instead of set
else if (nVersion == 2)
_PRC_NWNXFuncsTwo(oCreature, "NWNX!FUNCS!MODIFYABILITYSCORE", nAbility, nValue);
} */
void PRC_Funcs_AddFeat(object oCreature, int nFeat, int nLevel = 0)
{
//:: Payload for NWNxEE shim
SetLocalInt(oCreature, "PRC_EE_FEAT", nFeat);
SetLocalInt(oCreature, "PRC_EE_FEAT_LEVEL", nLevel);
//:: Fire NWNxEE shim
ExecuteScript("prcx_add_feat", oCreature);
}
void PRC_Funcs_AddFeat(object oCreature, int nFeat, int nLevel=0)
/* void PRC_Funcs_AddFeat(object oCreature, int nFeat, int nLevel=0)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
{
if (!nLevel)
@@ -198,21 +266,88 @@ void PRC_Funcs_AddFeat(object oCreature, int nFeat, int nLevel=0)
else if(nLevel > 0)
_PRC_NWNXFuncsTwo(oCreature, "NWNX!FUNCS!ADDKNOWNFEATATLEVEL", nLevel, nFeat);
}
} */
/**
* @brief Determines whether a creature inherently knows a feat.
*
* This function returns TRUE only if the specified feat is an inherent
* (true) feat possessed by the creature. Bonus feats granted via
* EFFECT_TYPE_BONUS_FEAT effects are explicitly ignored.
*
* This allows reliable differentiation between permanent feats
* (e.g. class, racial, or template feats) and temporary or granted
* bonus feats applied through effects.
*
* No NWNxEE shim is required; this function operates entirely using
* stock NWScript functionality.
*
* @param oCreature The creature to check.
* @param nFeatIndex The feat constant to test.
*
* @return TRUE if the creature inherently knows the feat and does not
* possess it solely via a bonus feat effect; FALSE otherwise.
*/
int PRC_Funcs_GetFeatKnown(object oCreature, int nFeatIndex)
{
//:: Check for an EffectBonusFeat with this feat ID
effect eCheck = GetFirstEffect(oCreature);
int bHasBonusFeatEffect = FALSE;
while (GetIsEffectValid(eCheck))
{
if (GetEffectType(eCheck) == EFFECT_TYPE_BONUS_FEAT && GetEffectInteger(eCheck, 0) == nFeatIndex)
{
bHasBonusFeatEffect = TRUE;
break;
}
eCheck = GetNextEffect(oCreature);
}
//;: Return TRUE only if inherent and no matching bonus feat effect
return (!bHasBonusFeatEffect && GetHasFeat(nFeatIndex, oCreature));
}
int PRC_Funcs_GetFeatKnown(object oCreature, int nFeatIndex)
/* int PRC_Funcs_GetFeatKnown(object oCreature, int nFeatIndex)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
//:: Payload for NWNxEE shim
SetLocalInt(oCreature, "PRC_EE_FEAT", nFeatIndex);
//:: Fire NWNxEE shim
ExecuteScript("prcx_knows_feat", oCreature);
//:: Read result
int nResult = GetLocalInt(oCreature, "PRC_EE_FEAT_RESULT");
//:: Clean up locals
DeleteLocalInt(oCreature, "PRC_EE_FEAT");
DeleteLocalInt(oCreature, "PRC_EE_FEAT_RESULT");
return nResult;
} */
/* int PRC_Funcs_GetFeatKnown(object oCreature, int nFeatIndex)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
return _PRC_NWNXFuncsOne(oCreature, "NWNX!FUNCS!GETFEATKNOWN", nFeatIndex);
else if (nVersion == 2)
return _PRC_NWNXFuncsOne(oCreature, "NWNX!FUNCS!GETKNOWNFEAT", nFeatIndex);
return 0;
}
} */
void PRC_Funcs_ModSavingThrowBonus(object oCreature, int nSavingThrow, int nValue)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
//:: Payload for NWNxEE shim
SetLocalInt(oCreature, "PRC_EE_STYPE", nSavingThrow);
SetLocalInt(oCreature, "PRC_EE_SDELTA", nValue);
//:: Fire NWNxEE shim
ExecuteScript("prcx_mod_save", oCreature);
}
/* void PRC_Funcs_ModSavingThrowBonus(object oCreature, int nSavingThrow, int nValue)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
_PRC_NWNXFuncsThree(oCreature, "NWNX!FUNCS!SETSAVINGTHROWBONUS", nSavingThrow, nValue, 1); //The 1 is a flag specifying modify instead of set
else if (nVersion == 2)
@@ -224,61 +359,133 @@ void PRC_Funcs_ModSavingThrowBonus(object oCreature, int nSavingThrow, int nValu
nNewValue = 127;
_PRC_NWNXFuncsTwo(oCreature, "NWNX!FUNCS!SETSAVINGTHROWBONUS", nSavingThrow, nNewValue);
}
}
} */
void PRC_Funcs_SetBaseNaturalAC(object oCreature, int nValue)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
//:: Payload for NWNxEE shim
SetLocalInt(oCreature, "PRC_EE_BASEAC", nValue);
//:: Fire NWNxEE shim
ExecuteScript("prcx_set_ac", oCreature);
}
/* void PRC_Funcs_SetBaseNaturalAC(object oCreature, int nValue)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
_PRC_NWNXFuncsTwo(oCreature, "NWNX!FUNCS!SETBASEAC", nValue, AC_NATURAL_BONUS);
else if (nVersion == 2)
_PRC_NWNXFuncsOne(oCreature, "NWNX!FUNCS!SETACNATURALBASE", nValue);
}
} */
int PRC_Funcs_GetBaseNaturalAC(object oCreature)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
//:: Fire NWNxEE shim
ExecuteScript("prcx_get_ac", oCreature);
//:: Read result
int nAC = GetLocalInt(oCreature, "PRC_EE_BASEAC_RESULT");
//:: Clean up
DeleteLocalInt(oCreature, "PRC_EE_BASEAC_RESULT");
return nAC;
}
/* int PRC_Funcs_GetBaseNaturalAC(object oCreature)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
return _PRC_NWNXFuncsOne(oCreature, "NWNX!FUNCS!GETBASEAC", AC_NATURAL_BONUS);
else if (nVersion == 2)
return _PRC_NWNXFuncsZero(oCreature, "NWNX!FUNCS!GETACNATURALBASE");
return 0;
} */
void PRC_Funcs_SetCurrentHitPoints(object oCreature, int nHP)
{
//:: Sanity check
if (nHP < 0)
nHP = 0;
//:: Set current hit points directly
//:: Was this not a native function in the past?
SetCurrentHitPoints(oCreature, nHP);
}
void PRC_Funcs_SetCurrentHitPoints(object oCreature, int nHP)
/* void PRC_Funcs_SetCurrentHitPoints(object oCreature, int nHP)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1 || nVersion == 2)
_PRC_NWNXFuncsOne(oCreature, "NWNX!FUNCS!SETCURRENTHITPOINTS", nHP);
} */
void PRC_Funcs_SetCreatureSize(object oCreature, int nSize)
{
//:: Pass parameters via locals
SetLocalInt(oCreature, "PRC_EE_CREATURESIZE", nSize);
//:: Fire NWNxEE shim
ExecuteScript("prcx_set_size", oCreature);
}
void PRC_Funcs_SetCreatureSize (object oCreature, int nSize)
/* void PRC_Funcs_SetCreatureSize (object oCreature, int nSize)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1 || nVersion == 2)
_PRC_NWNXFuncsOne(oCreature, "NWNX!FUNCS!SETCREATURESIZE", nSize);
} */
void PRC_Funcs_SetRace(object oCreature, int nRace)
{
//:: Pass parameters via locals
SetLocalInt(oCreature, "PRC_EE_RACETYPE", nRace);
//:: Fire NWNxEE shim
ExecuteScript("prcx_set_race", oCreature);
}
void PRC_Funcs_SetRace(object oCreature, int nRace)
/* void PRC_Funcs_SetRace(object oCreature, int nRace)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1)
_PRC_NWNXFuncsOne(oCreature, "NWNX!FUNCS!SETRACE", nRace);
else if (nVersion == 2)
_PRC_NWNXFuncsOne(oCreature, "NWNX!FUNCS!SETRACIALTYPE", nRace);
} */
void PRC_Funcs_SetWizardSpecialization(object oCreature, int iSpecialization, int nClass = CLASS_TYPE_WIZARD)
{
//:: Pass parameters via locals
SetLocalInt(oCreature, "PRC_EE_WIZCLASS", nClass);
SetLocalInt(oCreature, "PRC_EE_WIZSCHOOL", iSpecialization);
//:: Fire NWNxEE shim
ExecuteScript("prcx_set_spec", oCreature);
}
void PRC_Funcs_SetWizardSpecialization(object oCreature, int iSpecialization)
/* void PRC_Funcs_SetWizardSpecialization(object oCreature, int iSpecialization)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1 || nVersion == 2)
_PRC_NWNXFuncsOne(oCreature, "NWNX!FUNCS!SETWIZARDSPECIALIZATION", iSpecialization);
} */
//:: This is a native function now.
int PRC_Funcs_GetWizardSpecialization(object oCreature, int nClass = CLASS_TYPE_WIZARD)
{
return GetSpecialization(oCreature, nClass);
}
int PRC_Funcs_GetWizardSpecialization(object oCreature)
/* int PRC_Funcs_GetWizardSpecialization(object oCreature)
{
int nVersion = GetLocalInt(GetModule(), "PRC_NWNX_FUNCS");
int nVersion = GetLocalInt(GetModule(), "PRC_NWNXEE_ENABLED");
if (nVersion == 1 || nVersion == 2)
return _PRC_NWNXFuncsZero(oCreature, "NWNX!FUNCS!GETWIZARDSPECIALIZATION");
return 0;
}
} */
//:: void main(){}

View File

@@ -867,6 +867,7 @@ 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);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PRCX_ENABLED);
//craft
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_DISABLE_CRAFT);
@@ -1116,7 +1117,8 @@ void CreateSwitchNameArray()
//general
//PW
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CONVOCC_ENABLE);
// ConvoCC is unneeded now.
/* array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CONVOCC_ENABLE);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CONVOCC_AVARIEL_WINGS);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CONVOCC_FEYRI_WINGS);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CONVOCC_AASIMAR_WINGS);
@@ -1146,7 +1148,7 @@ void CreateSwitchNameArray()
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CONVOCC_MAX_STAT);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CONVOCC_SKILL_MULTIPLIER);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CONVOCC_SKILL_BONUS);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CONVOCC_CUSTOM_EXIT_SCRIPT);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CONVOCC_CUSTOM_EXIT_SCRIPT); */
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_TRUENAME_CR_MULTIPLIER);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_TRUENAME_LEVEL_BONUS);

View File

@@ -978,32 +978,35 @@ const int FEAT_KOB_DRAGONWROUGHT_SR = 3855;
const int FEAT_DRAGON_AUGMENT_STR_1 = 3857;
const int FEAT_DRAGON_AUGMENT_STR_2 = 3858;
const int FEAT_DRAGON_AUGMENT_STR_3 = 3859;
const int FEAT_DRAGON_AUGMENT_STR_4 = 26382;
const int FEAT_DRAGON_AUGMENT_STR_5 = 26383;
const int FEAT_DRAGON_AUGMENT_STR_6 = 26384;
const int FEAT_DRAGON_AUGMENT_STR_7 = 26385;
const int FEAT_DRAGON_AUGMENT_STR_8 = 26386;
const int FEAT_DRAGON_AUGMENT_STR_9 = 26387;
const int FEAT_DRAGON_AUGMENT_STR_4 = 25645;
const int FEAT_DRAGON_AUGMENT_STR_5 = 25646;
const int FEAT_DRAGON_AUGMENT_STR_6 = 25647;
const int FEAT_DRAGON_AUGMENT_STR_7 = 25648;
const int FEAT_DRAGON_AUGMENT_STR_8 = 25649;
const int FEAT_DRAGON_AUGMENT_STR_9 = 25650;
const int FEAT_DRAGON_AUGMENT_STR_10 = 25651;
const int FEAT_DRAGON_AUGMENT_DEX_1 = 3860;
const int FEAT_DRAGON_AUGMENT_DEX_2 = 3861;
const int FEAT_DRAGON_AUGMENT_DEX_3 = 3862;
const int FEAT_DRAGON_AUGMENT_DEX_4 = 26388;
const int FEAT_DRAGON_AUGMENT_DEX_5 = 26389;
const int FEAT_DRAGON_AUGMENT_DEX_6 = 26390;
const int FEAT_DRAGON_AUGMENT_DEX_7 = 26391;
const int FEAT_DRAGON_AUGMENT_DEX_8 = 26392;
const int FEAT_DRAGON_AUGMENT_DEX_9 = 26393;
const int FEAT_DRAGON_AUGMENT_DEX_4 = 25653;
const int FEAT_DRAGON_AUGMENT_DEX_5 = 25654;
const int FEAT_DRAGON_AUGMENT_DEX_6 = 25655;
const int FEAT_DRAGON_AUGMENT_DEX_7 = 25656;
const int FEAT_DRAGON_AUGMENT_DEX_8 = 25657;
const int FEAT_DRAGON_AUGMENT_DEX_9 = 25658;
const int FEAT_DRAGON_AUGMENT_DEX_10 = 25659;
const int FEAT_DRAGON_AUGMENT_CON_1 = 3863;
const int FEAT_DRAGON_AUGMENT_CON_2 = 3864;
const int FEAT_DRAGON_AUGMENT_CON_3 = 3865;
const int FEAT_DRAGON_AUGMENT_CON_4 = 26394;
const int FEAT_DRAGON_AUGMENT_CON_5 = 26395;
const int FEAT_DRAGON_AUGMENT_CON_6 = 26396;
const int FEAT_DRAGON_AUGMENT_CON_7 = 26397;
const int FEAT_DRAGON_AUGMENT_CON_8 = 26398;
const int FEAT_DRAGON_AUGMENT_CON_9 = 26399;
const int FEAT_DRAGON_AUGMENT_CON_4 = 25661;
const int FEAT_DRAGON_AUGMENT_CON_5 = 25662;
const int FEAT_DRAGON_AUGMENT_CON_6 = 25663;
const int FEAT_DRAGON_AUGMENT_CON_7 = 25664;
const int FEAT_DRAGON_AUGMENT_CON_8 = 25665;
const int FEAT_DRAGON_AUGMENT_CON_9 = 25666;
const int FEAT_DRAGON_AUGMENT_CON_10 = 25667;
const int FEAT_CHANNEL_DRACLAWS = 3866;
const int FEAT_PSIONIC_BREATH = 3867;

View File

@@ -244,7 +244,7 @@ void ApplyPseudonatural(object oFamiliar, object oFamSkin)
void ApplyIllmaster(object oCompanion, object oCompSkin)
{
//Give the companion permanent Str +4, Con +2, Wis -2, and Cha -2
if(GetPRCSwitch(PRC_NWNX_FUNCS))
if(GetPRCSwitch(PRC_NWNXEE_ENABLED))
{
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_STRENGTH, 4);
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_CONSTITUTION, 2);
@@ -305,7 +305,7 @@ void WinterWolfProperties(object oCompanion, int nLevel)
object oCreR = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oCompanion);
if(GetPRCSwitch(PRC_NWNX_FUNCS))
if(GetPRCSwitch(PRC_NWNXEE_ENABLED))
{
if(iStr > 0)
PRC_Funcs_ModAbilityScore(oCompanion, ABILITY_STRENGTH, iStr);
@@ -358,7 +358,10 @@ void WinterWolfProperties(object oCompanion, int nLevel)
void ApplyPnPFamiliarProperties(object oPC, object oFam)
{
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
effect eBonus;
//get familiar level

View File

@@ -480,7 +480,7 @@ int Debug_ProcessChatCommand(object oPC, string sCommand)
HelpText(oPC, "=== INT: " + IntToString(GetAbilityScore(oTarget, ABILITY_INTELLIGENCE, TRUE)) + " / " + IntToString(GetAbilityScore(oTarget, ABILITY_INTELLIGENCE, FALSE)));
HelpText(oPC, "=== WIS: " + IntToString(GetAbilityScore(oTarget, ABILITY_WISDOM, TRUE)) + " / " + IntToString(GetAbilityScore(oTarget, ABILITY_WISDOM, FALSE)));
HelpText(oPC, "=== CHA: " + IntToString(GetAbilityScore(oTarget, ABILITY_CHARISMA, TRUE)) + " / " + IntToString(GetAbilityScore(oTarget, ABILITY_CHARISMA, FALSE)));
if (GetPersistantLocalInt(oTarget, SHIFTER_ISSHIFTED_MARKER) && GetPRCSwitch(PRC_NWNX_FUNCS))
if (GetPersistantLocalInt(oTarget, SHIFTER_ISSHIFTED_MARKER) && GetPRCSwitch(PRC_NWNXEE_ENABLED))
{
int iSTR = GetPersistantLocalInt(oTarget, "Shifting_NWNXSTRAdjust");
int iDEX = GetPersistantLocalInt(oTarget, "Shifting_NWNXDEXAdjust");
@@ -664,7 +664,7 @@ int Debug_ProcessChatCommand(object oPC, string sCommand)
}
/* else if (GetStringMatchesAbbreviation(sChangeWhat, CMD_ABILITY))
{
if (!GetPRCSwitch(PRC_NWNX_FUNCS))
if (!GetPRCSwitch(PRC_NWNXEE_ENABLED))
HelpText(oPC, "This command only works if NWNX funcs is installed");
else
{

View File

@@ -367,7 +367,7 @@ void EvalPRCFeats(object oPC)
SetLocalInt(oPC, PRC_EvalPRCFeats_Generation, nGeneration);
//permanent ability changes
if(GetPRCSwitch(PRC_NWNX_FUNCS))
if(GetPRCSwitch(PRC_NWNXEE_ENABLED))
ExecuteScript("prc_nwnx_funcs", oPC);
//Add IP Feats to the hide

View File

@@ -582,8 +582,6 @@ effect CelestialTemplateEffects(int nHD)
return eEffects;
}
void ReallyEquipItemInSlot(object oNPC, object oItem, int nSlot)
{
if (GetItemInSlot(nSlot) != oItem)
@@ -688,6 +686,148 @@ void ApplyPseudonaturalEffects(object oCreature)
//:: JSON functions |
//::---------------------------------------------|
//:: Get the first spell ID that a creature knows (not memorized, but known)
//:: Returns -1 if no spells are found
int json_GetFirstKnownSpell(json jCreature)
{
// Store the creature JSON for later use by GetNext
SetLocalJson(GetModule(), "JSON_SPELL_CREATURE", jCreature);
SetLocalInt(GetModule(), "JSON_SPELL_CLASS_INDEX", 0);
SetLocalInt(GetModule(), "JSON_SPELL_LEVEL", 0);
SetLocalInt(GetModule(), "JSON_SPELL_INDEX", 0);
// Get the ClassList
json jClassList = GffGetList(jCreature, "ClassList");
if (jClassList == JsonNull())
{
if(DEBUG) DoDebug("json_GetFirstKnownSpell: No ClassList found");
return -1;
}
int nClassCount = JsonGetLength(jClassList);
int iClass, iSpellLevel, iSpell;
// Iterate through all classes
for (iClass = 0; iClass < nClassCount; iClass++)
{
json jClass = JsonArrayGet(jClassList, iClass);
if (jClass == JsonNull()) continue;
// Check all spell levels (0-9)
for (iSpellLevel = 0; iSpellLevel <= 9; iSpellLevel++)
{
string sKnownList = "KnownList" + IntToString(iSpellLevel);
json jKnownList = GffGetList(jClass, sKnownList);
if (jKnownList == JsonNull()) continue;
int nSpellCount = JsonGetLength(jKnownList);
// Look for the first spell
for (iSpell = 0; iSpell < nSpellCount; iSpell++)
{
json jSpell = JsonArrayGet(jKnownList, iSpell);
if (jSpell == JsonNull()) continue;
json jSpellID = GffGetWord(jSpell, "Spell");
if (jSpellID != JsonNull())
{
int nSpellID = JsonGetInt(jSpellID);
// Update tracking variables for next call
SetLocalInt(GetModule(), "JSON_SPELL_CLASS_INDEX", iClass);
SetLocalInt(GetModule(), "JSON_SPELL_LEVEL", iSpellLevel);
SetLocalInt(GetModule(), "JSON_SPELL_INDEX", iSpell + 1);
return nSpellID;
}
}
}
}
// Clean up when done
DeleteLocalJson(GetModule(), "JSON_SPELL_CREATURE");
DeleteLocalInt(GetModule(), "JSON_SPELL_CLASS_INDEX");
DeleteLocalInt(GetModule(), "JSON_SPELL_LEVEL");
DeleteLocalInt(GetModule(), "JSON_SPELL_INDEX");
return -1; // No more spells found
}
//:: Get the next spell ID from the creature's known spells
//:: Returns -1 if no more spells are found
int json_GetNextKnownSpell()
{
json jCreature = GetLocalJson(GetModule(), "JSON_SPELL_CREATURE");
if (jCreature == JsonNull())
return -1;
int nClassIndex = GetLocalInt(GetModule(), "JSON_SPELL_CLASS_INDEX");
int nSpellLevel = GetLocalInt(GetModule(), "JSON_SPELL_LEVEL");
int nSpellIndex = GetLocalInt(GetModule(), "JSON_SPELL_INDEX");
// Get the ClassList
json jClassList = GffGetList(jCreature, "ClassList");
if (jClassList == JsonNull())
return -1;
int nClassCount = JsonGetLength(jClassList);
int iClass, iSpellLevel, iSpell;
// Continue from where we left off
for (iClass = nClassIndex; iClass < nClassCount; iClass++)
{
json jClass = JsonArrayGet(jClassList, iClass);
if (jClass == JsonNull()) continue;
// Check all spell levels (0-9)
for (iSpellLevel = nSpellLevel; iSpellLevel <= 9; iSpellLevel++)
{
string sKnownList = "KnownList" + IntToString(iSpellLevel);
json jKnownList = GffGetList(jClass, sKnownList);
if (jKnownList == JsonNull()) continue;
int nSpellCount = JsonGetLength(jKnownList);
// Start from saved index if same class and level, otherwise start from 0
int nStartIndex = (iClass == nClassIndex && iSpellLevel == nSpellLevel) ? nSpellIndex : 0;
for (iSpell = nStartIndex; iSpell < nSpellCount; iSpell++)
{
json jSpell = JsonArrayGet(jKnownList, iSpell);
if (jSpell == JsonNull()) continue;
json jSpellID = GffGetWord(jSpell, "Spell");
if (jSpellID != JsonNull())
{
int nSpellID = JsonGetInt(jSpellID);
// Update tracking variables for next call
SetLocalInt(GetModule(), "JSON_SPELL_CLASS_INDEX", iClass);
SetLocalInt(GetModule(), "JSON_SPELL_LEVEL", iSpellLevel);
SetLocalInt(GetModule(), "JSON_SPELL_INDEX", iSpell + 1);
return nSpellID;
}
}
// Reset spell index for next spell level
nSpellIndex = 0;
}
// Reset spell level for next class
nSpellLevel = 0;
}
// Clean up when done
DeleteLocalJson(GetModule(), "JSON_SPELL_CREATURE");
DeleteLocalInt(GetModule(), "JSON_SPELL_CLASS_INDEX");
DeleteLocalInt(GetModule(), "JSON_SPELL_LEVEL");
DeleteLocalInt(GetModule(), "JSON_SPELL_INDEX");
return -1; // No more spells found
}
//:: Returns the Constitution value from a GFF creature UTC
int json_GetCONValue(json jCreature)
{

View File

@@ -249,7 +249,7 @@ void CancelGreatFeats(object oSpawn)
else if(GetHasFeat(FEAT_EPIC_GREAT_CHARISMA_1, oSpawn)) nGreatCha = 1;
//apply penalties to counter the GreatX feats
if(GetPRCSwitch(PRC_NWNX_FUNCS))
if(GetPRCSwitch(PRC_NWNXEE_ENABLED))
{
if(nGreatStr) PRC_Funcs_ModAbilityScore(oSpawn, ABILITY_STRENGTH, -nGreatStr);
if(nGreatDex) PRC_Funcs_ModAbilityScore(oSpawn, ABILITY_DEXTERITY, -nGreatDex);

View File

@@ -3098,7 +3098,7 @@ void HandleApplyShiftTemplate(object oPC)
int PnPShifterFeats()
{
if(GetPRCSwitch(PRC_NWNX_FUNCS))
if(GetPRCSwitch(PRC_NWNXEE_ENABLED))
{
//If any stats have been changed by NWNX, this could qualify the PC for feats they should
//not actually qualify for, so force unshifting before levelling up.

View File

@@ -2393,7 +2393,15 @@ const string PRC_XP_MAX_LEVEL_DIFF = "PRC_XP_MAX_LEVEL_DIFF";
*/
const string PRC_XP_GIVE_XP_TO_NON_PC_FACTIONS = "PRC_XP_GIVE_XP_TO_NON_PC_FACTIONS";
/******************************************************************************\
* NWNxEE switches *
\******************************************************************************/
//:: This switch enables the PRC8 -> NWNxEE shims. Don't use without NWNxEE
const string PRC_PRCX_ENABLED = "PRC_PRCX_ENABLED";
//:: This switch is set automatically after prc_onmodload detects NWNxEE.
const string PRC_NWNXEE_ENABLED = "PRC_NWNXEE_ENABLED";
/******************************************************************************\
@@ -2517,10 +2525,6 @@ const string PRC_LETOSCRIPT_PORTAL_PASSWORD = "PRC_LETOSCRIPT_PORTAL_PA
*/
const string PRC_LETOSCRIPT_GETNEWESTBIC = "PRC_LETOSCRIPT_GETNEWESTBIC";
//This switch is set automatically after prc_onmodload detects NWNX_Funcs plugin
const string PRC_NWNX_FUNCS = "PRC_NWNX_FUNCS";
/******************************************************************************\
* ConvoCC switches [DEFUNCT] *
\******************************************************************************/

View File

@@ -93,7 +93,9 @@ struct _prc_inc_ability_info_struct _prc_inc_CountItemAbilities(object oCreature
struct _prc_inc_ability_info_struct _prc_inc_shifter_GetAbilityInfo(object oTemplate, object oShifter)
{
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
//Initialize with item ability bonuses

View File

@@ -27,21 +27,16 @@
#include "tob_movehook"
////#include "prc_alterations"
int GetApproximateAPR(object oCreature)
int GetAPR(object oCreature)
{
int nBAB = GetBaseAttackBonus(oCreature);
int nAttacks = 1;
if (nBAB >= 6) nAttacks++;
if (nBAB >= 11) nAttacks++;
if (nBAB >= 16) nAttacks++;
int nAPR = GetAttacksPerRound(oCreature, TRUE);
if (PRCGetHasEffect(EFFECT_TYPE_HASTE, oCreature))
{
nAttacks++;
nAPR++;
}
return nAttacks;
return nAPR;
}
void main()
@@ -109,7 +104,7 @@ void main()
GetCurrentAction(oEnemy) == ACTION_ATTACKOBJECT && // Must be attacking
GetAttackTarget(oEnemy) == oTarget) // Must be attacking this PC
{
int nAPR = GetApproximateAPR(oEnemy);
int nAPR = GetAPR(oEnemy);
nBonus += 2 * nAPR;
string s = "Enemy: " + GetName(oEnemy) + " APR: " + IntToString(nAPR);
@@ -119,23 +114,25 @@ void main()
oEnemy = GetNextObjectInShape(SHAPE_SPHERE, 5.0, lLoc);
}
if (nBonus > 0)
{
if(GetLocalInt(oTarget, "PearlOfBlackDoubt_JustHit"))
{
DeleteLocalInt(oTarget, "PearlOfBlackDoubt_JustHit");
// Skip this heartbeat's bonus calculation
return;
}
if(DEBUG) DoDebug("Applying AC Bonus: " + IntToString(nBonus));
effect eAC = EffectACIncrease(nBonus);
eAC = ExtraordinaryEffect(eAC);
eAC = TagEffect(eAC, "PEARL_OF_BLACK_DOUBT_BONUS");
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAC, oTarget, 5.9);
SetLocalInt(oTarget, "PearlOfBlackDoubtBonus", nBonus);
if (nBonus > 0)
{
if(GetLocalInt(oTarget, "PearlOfBlackDoubt_JustHit"))
{
DeleteLocalInt(oTarget, "PearlOfBlackDoubt_JustHit");
return;
}
// Cap bonus at +20
if(nBonus > 20) nBonus = 20;
if(DEBUG) DoDebug("Applying AC Bonus: " + IntToString(nBonus));
effect eAC = EffectACIncrease(nBonus);
eAC = ExtraordinaryEffect(eAC);
eAC = TagEffect(eAC, "PEARL_OF_BLACK_DOUBT_BONUS");
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAC, oTarget, 5.9);
SetLocalInt(oTarget, "PearlOfBlackDoubtBonus", nBonus);
}
else
{

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -13,6 +13,22 @@
#include "prc_x2_itemprop"
#include "inc_item_props"
void ApplyDiamondDragonEE(object oPC, int nAbility, int nNewBonus, string sLocal)
{
int nOldBonus = GetPersistantLocalInt(oPC, sLocal);
if (DEBUG)
DoDebug("DiaDrag EE: ability=" + IntToString(nAbility)
+ " old=" + IntToString(nOldBonus)
+ " new=" + IntToString(nNewBonus));
if (nOldBonus == nNewBonus)
return;
SetPersistantLocalInt(oPC, sLocal + "_NEW", nNewBonus);
ExecuteScript("prcx_diadra_stat", oPC);
}
//removes channeled wings after relogging or server restart
void WingCorrection(object oPC, int nEvent)
{
@@ -43,7 +59,10 @@ void TailCorrection(object oPC, int nEvent)
void main()
{
int nEvent = GetRunningEvent();
int bNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int bPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int nEvent = GetRunningEvent();
if(DEBUG) DoDebug("psi_diadra running, event: " + IntToString(nEvent));
object oPC = OBJECT_SELF;
@@ -71,9 +90,22 @@ void main()
nBonus = GetHasFeat(FEAT_DRAGON_AUGMENT_STR_9, oPC) ? 9 : nBonus;
nDiff = nBonus - iTest;
if (nDiff != 0)
{
if (bNWNxEE && bPRCx)
{
ApplyDiamondDragonEE(oPC, ABILITY_STRENGTH, nBonus, "NWNX_DiaDragStr");
}
else
{
SetCompositeBonus(oSkin, "DrAug_STR", nBonus,
ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_STR);
}
}
if(nDiff != 0)
SetCompositeBonus(oSkin, "DrAug_STR", nBonus, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_STR);
/* if(nDiff != 0)
SetCompositeBonus(oSkin, "DrAug_STR", nBonus, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_STR); */
//Dex Augmentation feats
iTest = GetPersistantLocalInt(oPC, "NWNX_DiaDragDex");
@@ -88,9 +120,22 @@ void main()
nBonus = GetHasFeat(FEAT_DRAGON_AUGMENT_DEX_9, oPC) ? 9 : nBonus;
nDiff = nBonus - iTest;
if (nDiff != 0)
{
if (bNWNxEE && bPRCx)
{
ApplyDiamondDragonEE(oPC, ABILITY_DEXTERITY, nBonus, "NWNX_DiaDragDex");
}
else
{
SetCompositeBonus(oSkin, "DrAug_DEX", nBonus,
ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_DEX);
}
}
if(nDiff != 0)
SetCompositeBonus(oSkin, "DrAug_DEX", nBonus, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_DEX);
/* if(nDiff != 0)
SetCompositeBonus(oSkin, "DrAug_DEX", nBonus, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_DEX); */
//Con Augmentation feats
iTest = GetPersistantLocalInt(oPC, "NWNX_DiaDragCon");
@@ -105,9 +150,22 @@ void main()
nBonus = GetHasFeat(FEAT_DRAGON_AUGMENT_CON_9, oPC) ? 9 : nBonus;
nDiff = nBonus - iTest;
if (nDiff != 0)
{
if (bNWNxEE && bPRCx)
{
ApplyDiamondDragonEE(oPC, ABILITY_CONSTITUTION, nBonus, "NWNX_DiaDragCon");
}
else
{
SetCompositeBonus(oSkin, "DrAug_CON", nBonus,
ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_CON);
}
}
if(nDiff != 0)
SetCompositeBonus(oSkin, "DrAug_CON", nBonus, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_CON);
/* if(nDiff != 0)
SetCompositeBonus(oSkin, "DrAug_CON", nBonus, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_CON); */
}
//Every heartbeat, perform wing and tail status checks to see if they expired

View File

@@ -1,11 +1,11 @@
2DA V2.0
FeatLabel FeatIndex
0 darkvision 228
1 Small 375
2 hardinesspoisons 229
3 hardinessspells 230
4 gobtrain 232
5 gianttrain 233
6 skillaffinitylore 234
7 Race_Dwarven 4710
FeatLabel FeatIndex
0 darkvision 228
1 Small 375
2 hardinesspoisons 229
3 hardinessspells 230
4 gobtrain 232
5 gianttrain 233
6 skillaffinitylore 234
7 Race_Dwarven 4710

View File

@@ -246,7 +246,7 @@
242 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
243 Spirit_Folk Sf 16828037 16828037 16828038 16828037 16828039 **** 4 0 0 0 0 0 0 30 **** RACE_FEAT_SPIRIT 16826909 1 RACIAL_TYPE_SPIRIT_FOLK 110 **** 1 human **** **** **** 4 30 3 1 INT 267
244 Killoren Kn 16835207 16835207 16835208 16835209 16835210 **** 4 0 0 0 0 0 0 30 3 RACE_FEAT_KILLOR 16826911 1 RACIAL_TYPE_KILLOREN 10 3 1 killoren **** **** **** 4 30 3 1 INT 278
245 Korobokuru Kk 16828049 16828049 16828050 16828049 16828051 **** 2 0 0 -2 0 0 2 20 0 RACE_FEAT_KORO 16828048 0 RACIAL_TYPE_KOROBKURU 45 0 1 **** **** **** **** 4 30 3 1 INT 261
245 Korobokuru Kk 16828049 16828049 16828050 16828049 16828051 **** 2 0 0 -2 0 0 2 20 0 RACE_FEAT_KORO 16828048 1 RACIAL_TYPE_KOROBKURU 45 0 1 koro **** **** **** 4 30 3 1 INT 261
246 Nezumi Nz 16832282 16832282 16832283 16832282 16832284 **** 170 0 0 0 -2 0 2 40 8 RACE_FEAT_NEZU 16826907 1 RACIAL_TYPE_NEZUMI 18 8 1 nezumi **** **** **** 4 30 3 1 INT 274
247 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
248 Poison_Dusk Pd 16832303 16832303 16832304 16832303 16832305 **** 304 0 2 0 -2 0 2 30 7 RACE_FEAT_PDUSK 16826908 1 RACIAL_TYPE_POISON_DUSK 20 7 1 lizardfolk **** **** **** 4 30 3 1 INT 276

View File

@@ -51,7 +51,7 @@ const int STRREF_NO = 4753; // "No"
object oSkin = GetPCSkin(oPC);
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
int nStage = GetStage(oPC);
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int bFuncs = GetPRCSwitch(PRC_NWNXEE_ENABLED);
// Check which of the conversation scripts called the scripts
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort

View File

@@ -54,11 +54,15 @@ const int WINTERHIDE = 8;
void main()
{
object oPC = GetPCSpeaker();
object oSkin = GetPCSkin(oPC);
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
int nStage = GetStage(oPC);
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
object oPC = GetPCSpeaker();
object oSkin = GetPCSkin(oPC);
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
int nStage = GetStage(oPC);
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCX = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCX);
// Check which of the conversation scripts called the scripts
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort

View File

@@ -12,8 +12,12 @@ void main()
{
object oPC = OBJECT_SELF;
object oSkin = GetPCSkin(oPC);
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
itemproperty ipIP;
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
itemproperty ipIP;
if(DEBUG) DoDebug("race_skin >> Entering main function");
@@ -171,9 +175,45 @@ void main()
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}
//natural armor 1-10
// Note: This bonus will be Dodge bonus no matter what IP_CONST you specify.
int nAC;
//:: Natural Armor feats 1<>19
int nAC = 0;
if (GetHasFeat(FEAT_NATARM_19)) nAC = 19;
else if (GetHasFeat(FEAT_NATARM_18)) nAC = 18;
else if (GetHasFeat(FEAT_NATARM_17)) nAC = 17;
else if (GetHasFeat(FEAT_NATARM_16)) nAC = 16;
else if (GetHasFeat(FEAT_NATARM_15)) nAC = 15;
else if (GetHasFeat(FEAT_NATARM_14)) nAC = 14;
else if (GetHasFeat(FEAT_NATARM_13)) nAC = 13;
else if (GetHasFeat(FEAT_NATARM_12)) nAC = 12;
else if (GetHasFeat(FEAT_NATARM_11)) nAC = 11;
else if (GetHasFeat(FEAT_NATARM_10)) nAC = 10;
else if (GetHasFeat(FEAT_NATARM_9)) nAC = 9;
else if (GetHasFeat(FEAT_NATARM_8)) nAC = 8;
else if (GetHasFeat(FEAT_NATARM_7)) nAC = 7;
else if (GetHasFeat(FEAT_NATARM_6)) nAC = 6;
else if (GetHasFeat(FEAT_NATARM_5)) nAC = 5;
else if (GetHasFeat(FEAT_NATARM_4)) nAC = 4;
else if (GetHasFeat(FEAT_NATARM_3)) nAC = 3;
else if (GetHasFeat(FEAT_NATARM_2)) nAC = 2;
else if (GetHasFeat(FEAT_NATARM_1)) nAC = 1;
if (nAC > 0)
{
if (bFuncs)
{
//:: Fire NWNxEE shim to set base AC
SetLocalInt(oPC, "PRC_EE_BASEAC", nAC);
ExecuteScript("prcx_set_ac", oPC);
}
else
{
//:: Vanilla fallback
SetCompositeBonus(oSkin, "RacialNaturalArmor", nAC, ITEM_PROPERTY_AC_BONUS);
}
}
/* int nAC;
if(GetHasFeat(FEAT_NATARM_19)) nAC = 19;
else if(GetHasFeat(FEAT_NATARM_18)) nAC = 18;
else if(GetHasFeat(FEAT_NATARM_17)) nAC = 17;
@@ -194,7 +234,7 @@ void main()
else if(GetHasFeat(FEAT_NATARM_2)) nAC = 2;
else if(GetHasFeat(FEAT_NATARM_1)) nAC = 1;
if(nAC) SetCompositeBonus(oSkin, "RacialNaturalArmor", nAC, ITEM_PROPERTY_AC_BONUS);
if(nAC) SetCompositeBonus(oSkin, "RacialNaturalArmor", nAC, ITEM_PROPERTY_AC_BONUS); */
if (GetHasFeat(FEAT_ABERRANT_DEEPSPAWN, oPC))

View File

@@ -49,9 +49,13 @@ void main()
{
object oPC = GetPCSpeaker();
object oSkin = GetPCSkin(oPC);
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
int nStage = GetStage(oPC);
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
// Check which of the conversation scripts called the scripts
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort

View File

@@ -14,6 +14,7 @@
#include "NW_I0_GENERIC"
#include "nw_i0_spells"
#include "inc_persist_loca"
#include "inc_nwnx_funcs"
effect VoPDamage(int nTotalEnhancement)
{
@@ -37,6 +38,68 @@ effect VoPDamage(int nTotalEnhancement)
return eDamage;
}
void ConvertVoPFeatsToNWNxEE(object oPC)
{
if (GetPersistantLocalInt(oPC, "VoP_NWNxEE_Feats_Converted")) return;
if (!GetHasFeat(FEAT_VOWOFPOVERTY, oPC)) return;
// Remove any lingering VoP feat effects
effect eLoop = GetFirstEffect(oPC);
while (GetIsEffectValid(eLoop))
{
string sTag = GetEffectTag(eLoop);
if (GetStringLeft(sTag, 7) == "VoPFeat")
RemoveEffect(oPC, eLoop);
eLoop = GetNextEffect(oPC);
}
// Reapply intrinsic feats for each stored VoPFeatID entry
int i = 1;
string sKey;
while (GetPersistantLocalInt(oPC, "VoPFeatID" + IntToString(i)))
{
int nFeatID = StringToInt(Get2DAString("prc_vop_feats", "FeatIndex", i - 1));
if (nFeatID > 0)
{
PRC_Funcs_AddFeat(oPC, nFeatID);
}
i++;
}
SetPersistantLocalInt(oPC, "VoP_NWNxEE_Feats_Converted", TRUE);
}
void ConvertVoPToNWNxEE(object oPC)
{
if (GetPersistantLocalInt(oPC, "VoP_NWNxEE_Converted")) return;
if (!GetHasFeat(FEAT_VOWOFPOVERTY, oPC)) return;
int nLevel = GetCharacterLevel(oPC) - GetPersistantLocalInt(oPC, "VoPLevel1") + 1;
object oSkin = GetPCSkin(oPC);
int i;
// Remove existing VoP ability item properties
for (i = 0; i < 6; i++)
{
RemoveSpecificProperty(oSkin, ITEM_PROPERTY_ABILITY_BONUS, i, -1, 1, "VoPBoostStat"+IntToString(i), -1, DURATION_TYPE_PERMANENT);
}
// Reapply intrinsic bonuses for each stored VoPBoost
for (i = 1; i <= nLevel; i++)
{
int nStored = GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(i));
if (nStored >= 10)
{
int stat = nStored - 10;
int value = 2 * (1 + (nLevel - i) / 4);
PRC_Funcs_ModAbilityScore(oPC, stat, value);
}
}
SetPersistantLocalInt(oPC, "VoP_NWNxEE_Converted", TRUE);
}
void main()
{
int nEvent = GetRunningEvent();
@@ -83,7 +146,13 @@ void main()
if(nEvent == FALSE)
{
//Check if level up bonus has already been chosen and given for any of past VoP levels
if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
ConvertVoPToNWNxEE(oPC);
if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
ConvertVoPFeatsToNWNxEE(oPC);
//Check if level up bonus has already been chosen and given for any of past VoP levels
for(nLevelCheck=1; nLevelCheck <= nLevel; nLevelCheck++)
{
//Call stat boost dialogue for level 7 and each 4 levels after that
@@ -93,14 +162,37 @@ void main()
SetPersistantLocalInt(oPC,"VoPBoostCheck",nLevelCheck);
StartDynamicConversation("ft_vowpoverty_ab", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
}
//Applying stat boosts
//Applying stat boosts
if(GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) >= 10)
{
int stat = GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) - 10;
int value = 2 * (1 + (nLevel - nLevelCheck) / 4);
if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
{
// Track last applied intrinsic bonus per ability to avoid stacking
string sKey = "VoP_EE_Boost_" + IntToString(stat);
int nLastApplied = GetPersistantLocalInt(oPC, sKey);
int nDelta = value - nLastApplied;
if (nDelta > 0)
{
PRC_Funcs_ModAbilityScore(oPC, stat, nDelta);
SetPersistantLocalInt(oPC, sKey, value);
}
}
else
{
// Fallback to item property on skin (overwrites, so safe to run each level)
SetCompositeBonus(oSkin, "VoPBoostStat"+IntToString(stat), value, ITEM_PROPERTY_ABILITY_BONUS, stat);
}
}
/* //Applying stat boosts
if(GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) >= 10)
{
int stat = GetPersistantLocalInt(oPC, "VoPBoost"+IntToString(nLevelCheck)) - 10;
int value = 2 * (1 + (nLevel - nLevelCheck) / 4);
SetCompositeBonus(oSkin, "VoPBoostStat"+IntToString(stat), value, ITEM_PROPERTY_ABILITY_BONUS, stat);
}
} */
//Call exalted feat for each even level
if (!GetPersistantLocalInt(oPC, "VoPFeat"+IntToString(nLevelCheck)) && (nLevelCheck-(nLevelCheck/2)*2 == 0))

View File

@@ -16,17 +16,180 @@
#include "NW_I0_GENERIC"
#include "inc_persist_loca"
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
//////////////////////////////////////////////////
/* Constant definitions */
//////////////////////////////////////////////////
const int STAGE_SELECT_ABIL = 0;
const int STAGE_CONFIRM_SELECTION = 1;
const int STRREF_SELECTED_HEADER2 = 16824210; // "Is this correct?"
const int STRREF_YES = 4752; // "Yes"
const int STRREF_NO = 4753; // "No"
//////////////////////////////////////////////////
/* Function definitions */
//////////////////////////////////////////////////
void main()
{
object oPC = GetPCSpeaker();
object oSkin = GetPCSkin(oPC);
int i, j, nTest, nRow;
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
int nStage = GetStage(oPC);
int nLevel = GetPersistantLocalInt(oPC, "VoPFeatCheck");
// Check which of the conversation scripts called the scripts
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
{
if(DEBUG) DoDebug("ft_vowpoverty_ft: Aborting due to error.");
return;
}
if(nValue == DYNCONV_SETUP_STAGE)
{
// Check if this stage is marked as already set up
// This stops list duplication when scrolling
if(!GetIsStageSetUp(nStage, oPC))
{
// Maneuver selection stage
if(nStage == STAGE_SELECT_ABIL)
{
//Check which Feats have been added by this ability
int nTotalRows = Get2DARowCount("prc_vop_feats");
effect eCheckEffect = GetFirstEffect(oPC);
while (GetIsEffectValid(eCheckEffect))
{
for(nRow=0; nRow <= nTotalRows; nRow++)
{
string nFeat = Get2DAString("prc_vop_feats","FeatIndex",nRow);
if(GetEffectTag(eCheckEffect) == "VoPFeat"+nFeat) SetLocalInt(oPC,"VoPFeat"+nFeat,1);
}
eCheckEffect = GetNextEffect(oPC);
}
SetHeader("Choose an Exalted Feat for this new level under a Vow of Poverty:");
//Add new option depending if it was not selected and char has all prereqs
for(nRow=0; nRow <= nTotalRows; nRow++)
{
//Get prereqs from 2DA
string sName = Get2DAString("prc_vop_feats","Name",nRow);
int nFeat = StringToInt(Get2DAString("prc_vop_feats","FeatIndex",nRow));
int nPreReq1 = StringToInt(Get2DAString("prc_vop_feats","PreReq1",nRow));
int nPreReq2 = StringToInt(Get2DAString("prc_vop_feats","PreReq2",nRow));
int nCon = StringToInt(Get2DAString("prc_vop_feats","Con",nRow));
int nWis = StringToInt(Get2DAString("prc_vop_feats","Wis",nRow));
int nCha = StringToInt(Get2DAString("prc_vop_feats","Cha",nRow));
int nBAB = StringToInt(Get2DAString("prc_vop_feats","BAB",nRow));
int nLaw = StringToInt(Get2DAString("prc_vop_feats","Law",nRow));
int nAllPreReq = 1;
//Check if prereqs exist and, if so, if they are met - if not, set bol to 0
if(nPreReq1>0 && !GetHasFeat(nPreReq1, oPC)) nAllPreReq = 0;
if(nPreReq1==213 && GetLevelByClass(CLASS_TYPE_MONK, oPC) >= 1) nAllPreReq = 1; //for Ki Strike and monks
if(nPreReq2>0 && !GetHasFeat(nPreReq2, oPC)) nAllPreReq = 0;
if(nCon>0 && GetAbilityScore(oPC,ABILITY_CONSTITUTION, TRUE) < nCon) nAllPreReq = 0;
if(nWis>0 && GetAbilityScore(oPC,ABILITY_WISDOM, TRUE) < nWis) nAllPreReq = 0;
if(nCha>0 && GetAbilityScore(oPC,ABILITY_CHARISMA, TRUE) < nCha) nAllPreReq = 0;
if(nBAB>0 && GetBaseAttackBonus(oPC) < nBAB) nAllPreReq = 0;
if(nLaw>0 && !(GetAlignmentLawChaos(oPC) == ALIGNMENT_LAWFUL)) nAllPreReq = 0;
if (!GetHasFeat(nFeat, oPC) && !GetLocalInt(oPC, "VoPFeat"+IntToString(nFeat)) && nAllPreReq == 1) AddChoice(sName, nFeat, oPC);
}
AddChoice("Cancel (you will get no Exalted Feats this level)", 0, oPC);
SetDefaultTokens(); //If there are more than 10 options, add Next
MarkStageSetUp(STAGE_SELECT_ABIL, oPC);
}
else if(nStage == STAGE_CONFIRM_SELECTION)
{
int nFeat = GetLocalInt(oPC, "VoP_SelectedFeat");
string sText = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nFeat))) + "\n\n";
sText += GetStringByStrRef(StringToInt(Get2DAString("feat", "DESCRIPTION", nFeat))) + "\n\n";
sText += GetStringByStrRef(STRREF_SELECTED_HEADER2); // "Is this correct?"
SetHeader(sText);
AddChoice(GetStringByStrRef(STRREF_YES), TRUE, oPC);
AddChoice(GetStringByStrRef(STRREF_NO), FALSE, oPC);
MarkStageSetUp(STAGE_CONFIRM_SELECTION, oPC);
}
}
// Do token setup
SetupTokens();
}
else if(nValue == DYNCONV_EXITED)
{
if(DEBUG) DoDebug("ft_vowpoverty_ft: Running exit handler");
DeleteLocalInt(oPC, "VoP_SelectedFeat");
}
else if(nValue == DYNCONV_ABORTED)
{
// This section should never be run, since aborting this conversation should
// always be forbidden and as such, any attempts to abort the conversation
// should be handled transparently by the system
if(DEBUG) DoDebug("ft_vowpoverty_ft: ERROR: Conversation abort section run");
DeleteLocalInt(oPC, "VoP_SelectedFeat");
}
// Handle PC response
else
{
int nChoice = GetChoice(oPC);
if(nStage == STAGE_SELECT_ABIL)
{
if (nChoice == 0)
{
// Cancel chosen
DeletePersistantLocalInt(oPC,"VoPFeatCheck");
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
return;
}
SetLocalInt(oPC, "VoP_SelectedFeat", nChoice);
nStage = STAGE_CONFIRM_SELECTION;
MarkStageNotSetUp(STAGE_SELECT_ABIL, oPC);
}
else if(nStage == STAGE_CONFIRM_SELECTION)
{
if (nChoice == TRUE) // Yes
{
int nFeat = GetLocalInt(oPC, "VoP_SelectedFeat");
SetPersistantLocalInt(oPC, "VoPFeat"+IntToString(nLevel), 1);
SetPersistantLocalInt(oPC, "VoPFeatID" + IntToString(nFeat), 1);
if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
{
PRC_Funcs_AddFeat(oPC, nFeat);
}
else
{
effect eBonusFeat = EffectBonusFeat(nFeat);
eBonusFeat = UnyieldingEffect(eBonusFeat);
eBonusFeat = TagEffect(eBonusFeat, "VoPFeat"+IntToString(nFeat));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusFeat, oPC);
}
DeleteLocalInt(oPC, "VoP_SelectedFeat");
DeletePersistantLocalInt(oPC,"VoPFeatCheck");
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else // No
{
nStage = STAGE_SELECT_ABIL;
MarkStageNotSetUp(STAGE_CONFIRM_SELECTION, oPC);
}
}
if(DEBUG) DoDebug("ft_vowpoverty_ft: New stage: " + IntToString(nStage));
// Store the stage value. If it has been changed, this clears out the choices
SetStage(nStage, oPC);
}
}
const int STAGE_SELECT_ABIL = 0;
//////////////////////////////////////////////////
/* Function defintions */
//////////////////////////////////////////////////
void main()
/* void main()
{
object oPC = GetPCSpeaker();
object oSkin = GetPCSkin(oPC);
@@ -144,5 +307,5 @@ void main()
// Store the stage value. If it has been changed, this clears out the choices
SetStage(nStage, oPC);
}
}
} */

View File

@@ -205,6 +205,8 @@ void AddDomainFeat(object oPC, object oSkin, int bFuncs)
itemproperty ipIP =ItemPropertyDamageResistance(IP_CONST_DAMAGETYPE_ELECTRICAL, IP_CONST_DAMAGERESIST_5);
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
}
if (GetHasFeat(FEAT_WAR_DOMAIN_POWER, oPC))
{
int nWarFocus = GetPersistantLocalInt(oPC, "WarDomainWeaponPersistent");
@@ -239,7 +241,8 @@ void AddDomainFeat(object oPC, object oSkin, int bFuncs)
}
}
if (GetHasFeat(FEAT_DOMAIN_POWER_METAL, oPC))
if (GetHasFeat(FEAT_DOMAIN_POWER_METAL, oPC))
{
int nWFocus = GetPersistantLocalInt(oPC, "MetalDomainWeaponPersistent");
// If they've already chosen a weapon, reapply the feats if they dont have it
@@ -297,8 +300,17 @@ void main()
object oPC = OBJECT_SELF;
object oSkin = GetPCSkin(oPC);
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
if(DEBUG) DoDebug("PRC Domain Skin is running");
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
if(DEBUG) DoDebug("prc_domain_skin: Starting");
if (bFuncs)
{
if(DEBUG) DoDebug("prc_domain_skin: NWNxEE detected.");
}
// This is above the check to stop because AddDomainFeat needs this to run beforehand.
// Puts the domain power feats on the skin for the appropriate domains.

View File

@@ -6,6 +6,14 @@
#include "prc_inc_combat"
void AddVerdantHealing(object oSkin,int iFH)
{
if(GetLocalInt(oSkin, "ForestMaster_FastHealing") == iFH) return;
SetCompositeBonus(oSkin,"ForestMaster_FastHealing",iFH,ITEM_PROPERTY_REGENERATION);
}
void main()
{
//:: Declare major variables
@@ -20,6 +28,10 @@ void main()
itemproperty ipIP;
int iFH = GetHasFeat(FEAT_SOL_FAST_HEALING_1,oPC);
if (iFH) AddVerdantHealing(oSkin,iFH);
//:: We aren't being called from onPlayerUnequipItem event, instead from the PRCEvalFeats
if(nEvent == FALSE)

View File

@@ -78,33 +78,40 @@ void main()
// should be handled transparently by the system
if(DEBUG) DoDebug("prc_forsake_abil: ERROR: Conversation abort section run");
}
// Handle PC response
else
{
int nChoice = GetChoice(oPC);
if(DEBUG) DoDebug("prc_forsake_abil: Handling PC response, stage = " + IntToString(nStage) + "; nChoice = " +
IntToString(nChoice) + "; choice text = '" + GetChoiceText(oPC) + "'");
if(nStage == STAGE_SELECT_ABIL)
{
if(DEBUG) DoDebug("prc_forsake_abil: nChoice: " + IntToString(nChoice));
effect eAbility = EffectAbilityIncrease(nChoice, 1);
eAbility = UnyieldingEffect(eAbility);
eAbility = TagEffect(eAbility, "ForsakerAbilityBoost");
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAbility, oPC); //Give the boost
SetPersistantLocalInt(oPC, "ForsakerBoost"+IntToString(nClass), nChoice+1); //Register the boost has been given
DeletePersistantLocalInt(oPC,"ForsakerBoostCheck");
// And we're all done
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
if(DEBUG) DoDebug("prc_forsake_abil: New stage: " + IntToString(nStage));
// Store the stage value. If it has been changed, this clears out the choices
SetStage(nStage, oPC);
}
// Handle PC response
else
{
int nChoice = GetChoice(oPC);
if(DEBUG) DoDebug("prc_forsake_abil: Handling PC response, stage = " + IntToString(nStage) + "; nChoice = " +
IntToString(nChoice) + "; choice text = '" + GetChoiceText(oPC) + "'");
if(nStage == STAGE_SELECT_ABIL)
{
if(DEBUG) DoDebug("prc_forsake_abil: nChoice: " + IntToString(nChoice));
if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
{
// Apply intrinsic ability bonus via NWNxEE
PRC_Funcs_ModAbilityScore(oPC, nChoice, 1);
}
else
{
// Fallback to effect-based
effect eAbility = EffectAbilityIncrease(nChoice, 1);
eAbility = UnyieldingEffect(eAbility);
eAbility = TagEffect(eAbility, "ForsakerAbilityBoost");
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAbility, oPC);
}
SetPersistantLocalInt(oPC, "ForsakerBoost"+IntToString(nClass), nChoice+1);
DeletePersistantLocalInt(oPC,"ForsakerBoostCheck");
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
if(DEBUG) DoDebug("prc_forsake_abil: New stage: " + IntToString(nStage));
// Store the stage value. If it has been changed, this clears out the choices
SetStage(nStage, oPC);
}
/* // Handle PC response
else
{

View File

@@ -514,7 +514,7 @@ void SummonCelestialCompanion(object oPC, string sResRef, int nHD, int nHealerLv
nStat += nEpicBonus / 2;
eBonus = EffectACIncrease(nArmour);
if(GetPRCSwitch(PRC_NWNX_FUNCS))
if(GetPRCSwitch(PRC_NWNXEE_ENABLED))
{
PRC_Funcs_ModAbilityScore(oComp, ABILITY_STRENGTH, nStat);
PRC_Funcs_ModAbilityScore(oComp, ABILITY_DEXTERITY, nStat);

View File

@@ -35,7 +35,7 @@ void main()
SetCompositeBonus(oSkin, "SkillMLPer", nMorninglordLevel, ITEM_PROPERTY_SKILL_BONUS,SKILL_PERFORM);
SetCompositeBonus(oSkin, "SkillMLCW", nMorninglordLevel, ITEM_PROPERTY_SKILL_BONUS,SKILL_CRAFT_WEAPON);
SetCompositeBonus(oSkin, "SkillMLCG", nMorninglordLevel, ITEM_PROPERTY_SKILL_BONUS,SKILL_CRAFT_GENERAL);
SetCompositeBonus(oSkin, "SkillMLCA", nMorninglordLevel, ITEM_PROPERTY_SKILL_BONUS,SKILL_CRAFT_ALCHEMY);
SetCompositeBonus(oSkin, "SkillMLCAL", nMorninglordLevel, ITEM_PROPERTY_SKILL_BONUS,SKILL_CRAFT_ALCHEMY);
SetCompositeBonus(oSkin, "SkillMLPoi", nMorninglordLevel, ITEM_PROPERTY_SKILL_BONUS,SKILL_CRAFT_POISON);
if (nMorninglordLevel >= 6)

View File

@@ -12,106 +12,157 @@
#include "inc_persistsql"
#include "prc_craft_cv_inc"
//:: Restore crafting state on login with offline time calculation
void RestoreCraftingStateOnLogin(object oPC)
{
if(DEBUG) DoDebug("prc_oneter >> RestoreCraftingStateOnLogin | RestoreCraftingStateOnLogin called for " + GetName(oPC));
// Check switch conditions
if(!(!GetPRCSwitch(PRC_DISABLE_CRAFT) &&
GetPRCSwitch(PRC_CRAFTING_TIME_SCALE) > 1))
{
if(DEBUG) DoDebug("prc_oneter >> RestoreCraftingStateOnLogin | Switch conditions not met for crafting restore");
return;
}
if(DEBUG) DoDebug("prc_oneter >> RestoreCraftingStateOnLogin | Switch conditions met, checking for saved crafting state");
if(SQLocalsPlayer_GetInt(oPC, "crafting_active"))
{
if(DEBUG) DoDebug("prc_oneter >> RestoreCraftingStateOnLogin | Found active crafting state, restoring...");
// Get basic crafting state
string sUUID = SQLocalsPlayer_GetString(oPC, "crafting_item_uuid");
int nRounds = SQLocalsPlayer_GetInt(oPC, "crafting_rounds");
int nCost = SQLocalsPlayer_GetInt(oPC, "crafting_cost");
int nXP = SQLocalsPlayer_GetInt(oPC, "crafting_xp");
string sFile = SQLocalsPlayer_GetString(oPC, "crafting_file");
int nLine = SQLocalsPlayer_GetInt(oPC, "crafting_line");
int nIPType = SQLocalsPlayer_GetInt(oPC, "crafting_ip_type");
int nIPSubtype = SQLocalsPlayer_GetInt(oPC, "crafting_ip_subtype");
int nIPCostTable = SQLocalsPlayer_GetInt(oPC, "crafting_ip_costtable");
int nIPParam1 = SQLocalsPlayer_GetInt(oPC, "crafting_ip_param1");
if(DEBUG) DoDebug("prc_oneter >> RestoreCraftingStateOnLogin | Initial data - UUID: " + sUUID + ", rounds: " + IntToString(nRounds) +
", cost: " + IntToString(nCost) + ", xp: " + IntToString(nXP));
// Calculate offline progress
int nLogoutTime = SQLocalsPlayer_GetInt(oPC, "crafting_last_timestamp");
int nCurrentTime = GetCurrentUnixTimestamp();
if(DEBUG) DoDebug("prc_onenter >> RestoreCraftingStateOnLogin() | GetCurrentUnixTimestamp is:" + IntToString(nCurrentTime) +".");
if(nLogoutTime > 0 && nCurrentTime > nLogoutTime)
{
// Calculate real time elapsed in seconds
int nSecondsOffline = nCurrentTime - nLogoutTime;
if(DEBUG) DoDebug("prc_onenter >> RestoreCraftingStateOnLogin() | nSecondsOffline is:" + IntToString(nSecondsOffline) +".");
// Each round is always 6 seconds real time
int nRoundsOffline = nSecondsOffline / 6;
if(DEBUG) DoDebug("prc_onenter >> RestoreCraftingStateOnLogin() | nRoundsOffline is:" + IntToString(nRoundsOffline) +".");
// Subtract offline progress from remaining rounds
nRounds -= nRoundsOffline;
if(nRounds < 1) nRounds = 1; // Minimum 1 round to finish
if(DEBUG) DoDebug("prc_oneter >> RestoreCraftingStateOnLogin | Offline progress - time diff: " + IntToString(nSecondsOffline) +
"s, rounds progress: " + IntToString(nRoundsOffline) +
", new rounds: " + IntToString(nRounds));
}
else
{
if(DEBUG) DoDebug("prc_oneter >> RestoreCraftingStateOnLogin | No valid logout time found, using saved rounds: " + IntToString(nRounds));
}
// Find the crafting item
object oItem = GetItemByUUID(oPC, sUUID);
if(GetIsObjectValid(oItem))
{
if(DEBUG) DoDebug("prc_oneter >> RestoreCraftingStateOnLogin | Found item, restoring crafting session");
// Reconstruct the itemproperty
itemproperty ip;
if(nIPType > 0)
{
ip = ConstructIP(nIPType, nIPSubtype, nIPCostTable, nIPParam1);
}
if(DEBUG) DoDebug("prc_oneter >> RestoreCraftingStateOnLogin | About to call CraftingHB with " + IntToString(nRounds) + " rounds, cost: " + IntToString(nCost) + ", xp: " + IntToString(nXP));
// Notify player
FloatingTextStringOnCreature("Resuming crafting session: " + IntToString(nRounds) + " round(s) remaining", oPC);
// Restart the crafting heartbeat with all correct parameters
AssignCommand(oPC, ClearAllActions(TRUE));
SetLocalInt(oPC, "PRC_CRAFT_RESTORED", 1);
DelayCommand(3.0, CraftingHB(oPC, oItem, ip, nCost, nXP, sFile, nLine, nRounds));
}
else
{
if(DEBUG) DoDebug("prc_oneter >> RestoreCraftingStateOnLogin | Failed to find item with UUID: " + sUUID);
FloatingTextStringOnCreature("Crafting session could not be restored - item not found", oPC);
// Clear the invalid crafting state
SQLocalsPlayer_SetInt(oPC, "crafting_active", 0);
}
}
else
{
if(DEBUG) DoDebug("prc_oneter >> RestoreCraftingStateOnLogin | No saved crafting state found");
}
// Restore crafting state on login with offline time calculation
void RestoreCraftingStateOnLogin(object oPC)
{
if(DEBUG) DoDebug("DEBUG: RestoreCraftingStateOnLogin called");
// Check switch conditions
if(GetPRCSwitch(PRC_PW_LOCATION_TRACKING) &&
!GetPRCSwitch(PRC_DISABLE_CRAFT) &&
GetPRCSwitch(PRC_CRAFTING_TIME_SCALE) > 1)
{
if(DEBUG) DoDebug("DEBUG: Switch conditions not met for crafting restore");
return;
}
if(DEBUG) DoDebug("DEBUG: Switch conditions met, checking for saved crafting state");
// Check if player has saved crafting state
if(SQLocalsPlayer_GetInt(oPC, "crafting_active"))
{
// Get logout time
struct time tLogoutTime = GetPersistantLocalTime(oPC, "crafting_logout_time");
// Get current login time
struct time tLoginTime = GetTimeAndDate();
// Calculate offline time difference
struct time tOfflineTime = TimeSubtract(tLoginTime, tLogoutTime);
// Convert offline time to rounds (6 seconds per round)
int nOfflineRounds = tOfflineTime.nSecond / 6;
nOfflineRounds += tOfflineTime.nMinute * 10; // 10 rounds per minute
nOfflineRounds += tOfflineTime.nHour * 600; // 600 rounds per hour
nOfflineRounds += tOfflineTime.nDay * 14400; // 14400 rounds per day
// Load saved crafting parameters
object oItem = SQLocalsPlayer_GetObject(oPC, "crafting_item");
int nCost = SQLocalsPlayer_GetInt(oPC, "crafting_cost");
int nXP = SQLocalsPlayer_GetInt(oPC, "crafting_xp");
int nRounds = SQLocalsPlayer_GetInt(oPC, "crafting_rounds");
string sFile = SQLocalsPlayer_GetString(oPC, "crafting_file");
int nLine = SQLocalsPlayer_GetInt(oPC, "crafting_line");
// Calculate remaining rounds after offline time
nRounds = nRounds - nOfflineRounds;
// Check if crafting is complete
if(nRounds <= 0)
{
// Set to 1 round so it completes normally
nRounds = 1;
FloatingTextStringOnCreature("Your item is almost finished crafting!", oPC);
}
// Restore local variables needed for crafting
SetLocalObject(oPC, "PRC_CRAFT_ITEM", oItem);
SetLocalInt(oPC, "PRC_CRAFT_COST", nCost);
SetLocalInt(oPC, "PRC_CRAFT_XP", nXP);
SetLocalInt(oPC, "PRC_CRAFT_ROUNDS", nRounds);
SetLocalString(oPC, "PRC_CRAFT_FILE", sFile);
SetLocalInt(oPC, "PRC_CRAFT_LINE", nLine);
// Restart the crafting heartbeat
SetLocalInt(oPC, "PRC_CRAFT_HB", 1);
// Re-attach concentration monitoring
AddEventScript(oPC, EVENT_VIRTUAL_ONDAMAGED, "prc_od_conc", FALSE, FALSE);
// Resume crafting with remaining rounds
itemproperty ip = GetFirstItemProperty(oItem);
DelayCommand(6.0, CraftingHB(oPC, oItem, ip, nCost, nXP, sFile, nLine, nRounds));
// Clear the saved state
SQLocalsPlayer_SetInt(oPC, "crafting_active", 0);
FloatingTextStringOnCreature("Crafting resumed with " + IntToString(nRounds) + " rounds remaining", oPC);
}
else
{
if(DEBUG) DoDebug("DEBUG: No saved crafting state found");
}
}
void ConvertForsakerToNWNxEE(object oPC)
{
// Run only once per PC
if (GetPersistantLocalInt(oPC, "Forsaker_NWNxEE_Converted")) return;
int nForsakerLevel = GetLevelByClass(CLASS_TYPE_FORSAKER, oPC);
if (!nForsakerLevel) return;
// Remove any lingering ForsakerAbilityBoost effects
effect eLoop = GetFirstEffect(oPC);
while (GetIsEffectValid(eLoop))
{
if (GetEffectTag(eLoop) == "ForsakerAbilityBoost")
RemoveEffect(oPC, eLoop);
eLoop = GetNextEffect(oPC);
}
// Apply intrinsic bonuses for each stored level
int i;
for (i = 1; i <= nForsakerLevel; i++)
{
int nAbility = GetPersistantLocalInt(oPC, "ForsakerBoost" + IntToString(i));
if (nAbility > 0 && nAbility <= 6)
{
PRC_Funcs_ModAbilityScore(oPC, nAbility - 1, 1);
}
}
// Mark as converted
SetPersistantLocalInt(oPC, "Forsaker_NWNxEE_Converted", TRUE);
}
void RestoreForsakerAbilities(object oPC)
{
// If using NWNxEE intrinsic bonuses, convert once and skip restoration
if (GetPRCSwitch("PRC_NWNXEE_ENABLED") && GetPRCSwitch("PRC_PRCX_ENABLED"))
{
ConvertForsakerToNWNxEE(oPC);
return;
}
// Existing effect-based restoration logic follows...
int nForsakerLevel = GetLevelByClass(CLASS_TYPE_FORSAKER, oPC);
int i;
// Remove existing Forsaker ability effects first
effect eLoop = GetFirstEffect(oPC);
while(GetIsEffectValid(eLoop))
{
if(GetEffectTag(eLoop) == "ForsakerAbilityBoost")
RemoveEffect(oPC, eLoop);
eLoop = GetNextEffect(oPC);
}
for(i = 1; i <= nForsakerLevel; i++)
{
int nAbility = GetPersistantLocalInt(oPC, "ForsakerBoost" + IntToString(i));
if(nAbility > 0 && nAbility <= 6)
{
effect eAbility = EffectAbilityIncrease(nAbility - 1, 1);
eAbility = SupernaturalEffect(eAbility);
eAbility = TagEffect(eAbility, "ForsakerAbilityBoost");
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAbility, oPC);
}
}
}
/* void RestoreForsakerAbilities(object oPC)
{
int nForsakerLevel = GetLevelByClass(CLASS_TYPE_FORSAKER, oPC);
int i;
@@ -137,7 +188,7 @@ void RestoreForsakerAbilities(object oPC)
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eAbility, oPC);
}
}
}
} */
/**
* Reads the 2da file onenter_locals.2da and sets local variables

View File

@@ -414,8 +414,72 @@ void main()
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_L_LAW), oHealTarget);
}
// Blood in the Water
if (GetHasSpellEffect(MOVE_TC_BLOOD_WATER, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR)
// Blood in the Water
if (GetHasSpellEffect(MOVE_TC_BLOOD_WATER, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR)
{
// Fake critical hit check
if (d20() >= GetWeaponCriticalRange(oSpellOrigin, oItem))
{
string sBlood = GetCreatureBloodColor(oSpellTarget);
int bGhost = GetIsIncorporeal(oSpellTarget);
int nRace = MyPRCGetRacialType(oSpellTarget);
effect eVFX;
if (sBlood == "R") eVFX = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);
else if (sBlood == "Y") eVFX = EffectVisualEffect(VFX_COM_CHUNK_YELLOW_SMALL);
else if (sBlood == "W") eVFX = EffectVisualEffect(VFX_COM_BLOOD_SPARK_SMALL);
else if (sBlood == "G") eVFX = EffectVisualEffect(VFX_COM_CHUNK_GREEN_SMALL);
else if (sBlood == "N")
{
if (nRace == RACIAL_TYPE_UNDEAD)
{
if (bGhost) eVFX = EffectVisualEffect(VFX_COM_HIT_DIVINE);
else eVFX = EffectVisualEffect(VFX_COM_CHUNK_BONE_MEDIUM);
}
else eVFX = EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL);
}
else
{
eVFX = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL); // fallback VFX
}
// Increase total bonus stack count
int nStacks = GetLocalInt(oSpellOrigin, "BITW_STACKS") + 1;
SetLocalInt(oSpellOrigin, "BITW_STACKS", nStacks);
// Cap stacks at 20
if(nStacks > 20) nStacks = 20;
// Store time of last crit as integer seconds
SetLocalInt(oSpellOrigin, "BITW_LASTCRIT", (GetTimeHour() * 3600) + (GetTimeMinute() * 60) + GetTimeSecond());
// Remove old BITW_BUFF effect before applying updated buff
effect eOld = GetFirstEffect(oSpellOrigin);
while (GetIsEffectValid(eOld))
{
if (GetEffectTag(eOld) == "BITW_BUFF")
{
RemoveEffect(oSpellOrigin, eOld);
}
eOld = GetNextEffect(oSpellOrigin);
}
// Apply new combined attack and damage bonus with total stacks
effect eBuff = EffectLinkEffects(
EffectAttackIncrease(nStacks),
EffectDamageIncrease(IPGetDamageBonusConstantFromNumber(nStacks), DAMAGE_TYPE_SLASHING)
);
eBuff = TagEffect(eBuff, "BITW_BUFF");
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBuff, oSpellOrigin);
// Schedule decay check in 60 seconds (will only reset if no new crit since last)
DelayCommand(60.0, CheckBloodInTheWaterDecay(oSpellOrigin));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oSpellTarget);
}
}
/* if (GetHasSpellEffect(MOVE_TC_BLOOD_WATER, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR)
{
// Fake critical hit check
if (d20() >= GetWeaponCriticalRange(oSpellOrigin, oItem))
@@ -475,62 +539,8 @@ void main()
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oSpellTarget);
}
}
/* if (GetHasSpellEffect(MOVE_TC_BLOOD_WATER, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR)
{
// Fake critical hit check
if (d20() >= GetWeaponCriticalRange(oSpellOrigin, oItem))
{
string sBlood = GetCreatureBloodColor(oSpellTarget);
int bGhost = GetIsIncorporeal(oSpellTarget);
int nRace = MyPRCGetRacialType(oSpellTarget);
effect eVFX;
if (sBlood == "R") eVFX = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);
if (sBlood == "Y") eVFX = EffectVisualEffect(VFX_COM_CHUNK_YELLOW_SMALL);
if (sBlood == "W") eVFX = EffectVisualEffect(VFX_COM_BLOOD_SPARK_SMALL);
if (sBlood == "G") eVFX = EffectVisualEffect(VFX_COM_CHUNK_GREEN_SMALL);
if (sBlood == "N")
{
if (nRace == RACIAL_TYPE_UNDEAD)
{
if (bGhost) eVFX = EffectVisualEffect(VFX_COM_HIT_DIVINE);
else eVFX = EffectVisualEffect(VFX_COM_CHUNK_BONE_MEDIUM);
}
else eVFX = EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL);
}
// --- STACKING LOGIC ---
int nStacks = GetLocalInt(oSpellOrigin, "BITW_STACKS");
nStacks += 1;
SetLocalInt(oSpellOrigin, "BITW_STACKS", nStacks);
// Remove any old bonus effect
effect eOld = GetFirstEffect(oSpellOrigin);
while (GetIsEffectValid(eOld))
{
if (GetEffectTag(eOld) == "BITW_BUFF")
{
RemoveEffect(oSpellOrigin, eOld);
}
eOld = GetNextEffect(oSpellOrigin);
}
// Apply new combined attack/damage bonus
effect eBuff = EffectLinkEffects(
EffectAttackIncrease(nStacks),
EffectDamageIncrease(IPGetDamageBonusConstantFromNumber(nStacks), DAMAGE_TYPE_SLASHING));
eBuff = TagEffect(eBuff, "BITW_BUFF");
DelayCommand(0.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBuff, oSpellOrigin, TurnsToSeconds(1)));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oSpellTarget);
}
}
*/
/* if(GetHasSpellEffect(MOVE_TC_BLOOD_WATER, oSpellOrigin) && GetBaseItemType(oItem) != BASE_ITEM_ARMOR && !GetIsImmune(oSpellTarget, IMMUNITY_TYPE_CRITICAL_HIT) )
{
// Fake critical hit check

View File

@@ -165,7 +165,16 @@ void main()
OnLoad_Fresh(oModule);
}
//NWNX_Funcs plugin test:
//:: NWNxEE Detection
int bNWNxEE = NWNXGetIsAvailable();
if (bNWNxEE)
{
SetPRCSwitch(PRC_NWNXEE_ENABLED, TRUE);
if(DEBUG) DoDebug("NWNxEE detected.");
}
//NWNX_Funcs plugin test:
//PRC_Funcs_Init(oModule);
}
@@ -199,7 +208,7 @@ void OnLoad_Fresh(object oModule)
SetModuleSwitch(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS, TRUE); /// @todo This is somewhat intrusive, make it unnecessary and remove
// Run a script to determine if the PRC Companion is present
ExecuteScript("hakmarker", OBJECT_SELF);
//ExecuteScript("hakmarker", OBJECT_SELF); //:: script no longer present in project - Jaysyn
//delay this to avoid TMIs
DelayCommand(0.01, CreateSwitchNameArray());

View File

@@ -436,6 +436,19 @@ void DemiLich(object oPC)
}
}
void CoCDodgePrereq(object oPC)
{
//Champion of Corellon
SetLocalInt(oPC, "PRC_PrereqCoC", 1);
if(GetHasFeat(FEAT_DODGE, oPC) ||
GetHasFeat(FEAT_EXPEDITIOUS_DODGE, oPC) ||
GetHasFeat(FEAT_DESERT_WIND_DODGE, oPC) ||
GetHasFeat(FEAT_MIDNIGHT_DODGE, oPC))
{
DeleteLocalInt(oPC, "PRC_PrereqCoC");
}
}
void reqDomains()
{
//Black Flame Zealot
@@ -1986,6 +1999,7 @@ void main()
AOTSPreReqs(oPC);
AbChamp(oPC);
AnimaMageReq(oPC);
CoCDodgePrereq(oPC);
Cultist(oPC);
DalQuor(oPC);
DemiLich(oPC);

View File

@@ -5,6 +5,14 @@
//::///////////////////////////////////////////////
#include "prc_inc_spells"
void AddVerdantHealing(object oSkin,int iFH)
{
if(GetLocalInt(oSkin, "VerdantLord_FastHealing") == iFH) return;
SetCompositeBonus(oSkin,"VerdantLord_FastHealing",iFH,ITEM_PROPERTY_REGENERATION);
}
void main()
{
//:: Declare major variables
@@ -16,6 +24,10 @@ void main()
effect eEffect;
itemproperty ipIP;
int iFH = GetHasFeat(FEAT_SOL_FAST_HEALING_1,oPC);
if (iFH) AddVerdantHealing(oSkin,iFH);
//:: Setup Gaeas Embrace ///////////////////////////////////////////////////////////////
/* Gaeas Embrace: At 10th level, the verdant lord permanently becomes a plant

View File

@@ -18,7 +18,8 @@ void main()
if(GetHasSpellEffect(SPELL_SPELL_RAGE, oPC))
{
IncrementRemainingFeatUses(oPC, FEAT_SPELL_RAGE);
PRCRemoveSpellEffects(SPELL_SPELL_RAGE, oPC, oPC);
IncrementRemainingFeatUses(oPC, FEAT_SPELL_RAGE);
return;
}
if(GetHasSpellEffect(SPELLABILITY_BARBARIAN_RAGE, oPC))

View File

@@ -78,9 +78,17 @@ void main()
{
object oPC = OBJECT_SELF;
object oSkin = GetPCSkin(oPC);
SendMessageToPC(oPC,
"NWNxEE=" + IntToString(GetPRCSwitch(PRC_NWNXEE_ENABLED)) +
" PRCx=" + IntToString(GetPRCSwitch(PRC_PRCX_ENABLED)));
int nHD = GetHitDice(oPC);
itemproperty ipIP;
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
//darkvision
ipIP = ItemPropertyDarkvision();

View File

@@ -78,9 +78,13 @@ void main()
{
object oPC = OBJECT_SELF;
object oSkin = GetPCSkin(oPC);
int nHD = GetHitDice(oPC);
itemproperty ipIP;
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
//darkvision
ipIP = ItemPropertyDarkvision();

View File

@@ -100,7 +100,11 @@ void main()
object oSkin = GetPCSkin(oPC);
int nHD = GetHitDice(oPC);
itemproperty ipIP;
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
int iTest = GetPersistantLocalInt(oPC, "NWNX_Template_hceles");
//wings

View File

@@ -157,7 +157,11 @@ void main()
object oSkin = GetPCSkin(oPC);
int nHD = GetHitDice(oPC);
itemproperty ipIP;
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
int iTest = GetPersistantLocalInt(oPC, "NWNX_Template_hdragon");
int nSubTemplate = GetPersistantLocalInt(oPC, "HalfDragon_Template");
int nWingType, iType, lResis, pImmune, dImmune, iSpell, iSpel2, sResis;

View File

@@ -122,7 +122,11 @@ void main()
object oSkin = GetPCSkin(oPC);
int nHD = GetHitDice(oPC);
itemproperty ipIP;
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
int iTest = GetPersistantLocalInt(oPC, "NWNX_Template_hfiend");
//wings

View File

@@ -349,7 +349,11 @@ void main()
object oSkin = GetPCSkin(oPC);
int nHD = GetHitDice(oPC);
itemproperty ipIP;
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
int iTestLich = GetPersistantLocalInt(oPC, "NWNX_Template_lich");
int iTestDemi = GetPersistantLocalInt(oPC, "NWNX_Template_demilich");

View File

@@ -51,7 +51,11 @@ void main()
object oPC = OBJECT_SELF;
object oSkin = GetPCSkin(oPC);
itemproperty ipIP;
int bFuncs = GetPRCSwitch(PRC_NWNX_FUNCS);
int nNWNxEE = GetPRCSwitch(PRC_NWNXEE_ENABLED);
int nPRCx = GetPRCSwitch(PRC_PRCX_ENABLED);
int bFuncs = (nNWNxEE && nPRCx);
int iTest = GetPersistantLocalInt(oPC, "NWNX_Template_necropolitan");
//NOTE: this maintains the Necropolitan template

View File

@@ -1,28 +0,0 @@
void main()
{
// AOE On Enter - a
object oCreator = GetAreaOfEffectCreator(OBJECT_SELF);
// Check spell Id, ETC:
int nSpellId = GetSpellId();
int nActual = SPELL_FIREBALL;
// Get save DC:
int nSpellSaveDC = GetSpellSaveDC();
// Get caster level
int nCasterLevel = GetCasterLevel(oCreator);
// Get tag
string sTag = GetTag(OBJECT_SELF);
string sName = GetName(OBJECT_SELF);
string sResRef = GetResRef(OBJECT_SELF);
// We relay the information.
SendMessageToPC(oCreator, "ENTER (BLUE): (T: " + sTag + ")(N: " + sName + ")(RR: " + sResRef + "). ID1: " + IntToString(nSpellId) + ". ID2: " + IntToString(nActual) + ". SaveDC: " + IntToString(nSpellSaveDC) + ". CasterLevel: " + IntToString(nCasterLevel) + ".");
// Apply an On Enter effect
object oTarget = GetEnteringObject();
effect eDur = EffectVisualEffect(VFX_DUR_IOUNSTONE_BLUE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDur, oTarget);
}

View File

@@ -1,33 +0,0 @@
void main()
{
// AOE On Heartbeat - b
object oCreator = GetAreaOfEffectCreator(OBJECT_SELF);
// Check spell Id, ETC:
int nSpellId = GetSpellId();
int nActual = SPELL_FIREBALL;
// Get save DC:
int nSpellSaveDC = GetSpellSaveDC();
// Get caster level
int nCasterLevel = GetCasterLevel(oCreator);
// Get tag
string sTag = GetTag(OBJECT_SELF);
string sName = GetName(OBJECT_SELF);
string sResRef = GetResRef(OBJECT_SELF);
// We relay the information.
SendMessageToPC(oCreator, "ENTER (BLUE): (T: " + sTag + ")(N: " + sName + ")(RR: " + sResRef + "). ID1: " + IntToString(nSpellId) + ". ID2: " + IntToString(nActual) + ". SaveDC: " + IntToString(nSpellSaveDC) + ". CasterLevel: " + IntToString(nCasterLevel) + ".");
// Apply an On Enter effect
object oTarget = GetFirstInPersistentObject();
effect eDur = EffectVisualEffect(VFX_DUR_IOUNSTONE_GREEN);
while(GetIsObjectValid(oTarget))
{
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDur, oTarget);
oTarget = GetNextInPersistentObject();
}
}

View File

@@ -1,40 +0,0 @@
void main()
{
// AOE On Exit - C
object oCreator = GetAreaOfEffectCreator(OBJECT_SELF);
// Check spell Id, ETC:
int nSpellId = GetSpellId();
int nActual = SPELL_FIREBALL;
// Get save DC:
int nSpellSaveDC = GetSpellSaveDC();
// Get caster level
int nCasterLevel = GetCasterLevel(oCreator);
// Get tag
string sTag = GetTag(OBJECT_SELF);
string sName = GetName(OBJECT_SELF);
string sResRef = GetResRef(OBJECT_SELF);
// We relay the information.
SendMessageToPC(oCreator, "ENTER (BLUE): (T: " + sTag + ")(N: " + sName + ")(RR: " + sResRef + "). ID1: " + IntToString(nSpellId) + ". ID2: " + IntToString(nActual) + ". SaveDC: " + IntToString(nSpellSaveDC) + ". CasterLevel: " + IntToString(nCasterLevel) + ".");
// Check effects on target
object oTarget = GetExitingObject();
string sCreator, sEffectId, sType, sSubtype;
effect eCheck = GetFirstEffect(oTarget);
while(GetIsEffectValid(eCheck))
{
sCreator = GetName(GetEffectCreator(eCheck));
sEffectId = IntToString(GetEffectSpellId(eCheck));
sType = IntToString(GetEffectType(eCheck));
sSubtype = IntToString(GetEffectSubType(eCheck));
// Relay message
SendMessageToPC(oCreator, "EXIT: EXITER: " + GetName(oTarget) + ". Creator: " + sCreator + ". Spell ID: " + sEffectId + ". Type: " + sType + ". Subtype: " + sSubtype + ".");
eCheck = GetNextEffect(oTarget);
}
}

View File

@@ -1,49 +0,0 @@
/*
001_testcut
Cutscene test
*/
#include "PHS_INC_SPELLS"
void Debug(string sString)
{
SendMessageToPC(GetFirstPC(), sString);
}
void main()
{
// Set cutscene mode
Debug("Setting cutscene mode - using the special spells function");
location lLoc = GetStartingLocation();
PHS_ForceMovementToLocation(lLoc, VFX_FNF_TELEPORT_OUT, VFX_FNF_TELEPORT_IN);
/*
SetCutsceneMode(OBJECT_SELF, TRUE);
// Attempt to make them cast a spell first
Debug("Attempting to jump to the start point");
if(GetCommandable(OBJECT_SELF) == FALSE)
{
SetCommandable(TRUE, OBJECT_SELF);
ClearAllActions();
ActionJumpToLocation(lLoc);
Debug("Attempting to set back to normal 1");
ActionDoCommand(SetCutsceneMode(OBJECT_SELF, FALSE));
SetCommandable(FALSE, OBJECT_SELF);
}
else
{
ClearAllActions();
JumpToLocation(lLoc);
Debug("Attempting to set back to normal 2");
SetCutsceneMode(OBJECT_SELF, FALSE);
}
*/
}

View File

@@ -1,18 +0,0 @@
// 0_onattacked
// On Attacked report. report feedback information via. Speak String.
void main()
{
object oAttacker = GetLastAttacker();// returns the object that last attacked OBJECT_SELF.
object oDamager = GetLastDamager();// returns the object that actually dealt damage last (not neccessarily the last attacker).
object oWeapon = GetLastWeaponUsed(oAttacker);// will return the last weapon used to attack the creature, if any.
int nMode = GetLastAttackMode(oAttacker);// will return the last combat mode the attacking creature used, if any.
int nType = GetLastAttackType(oAttacker);// will return the last special attack the attacking creature used, if any.
SpeakString("[ATTACKED] By: " + GetName(oAttacker) + ". With: " + GetName(oWeapon) +
". Last Damager: " + GetName(oDamager) + ". nMode: " + IntToString(nMode) +
". nType: " + IntToString(nType));
}

View File

@@ -1,10 +0,0 @@
// 0_onblock
// On Blocked report. report feedback information via. Speak String.
void main()
{
// Report
SpeakString("[BLOCKED]");
}

View File

@@ -1,10 +0,0 @@
// 0_oncombat
// On Combat Round End report. report feedback information via. Speak String.
void main()
{
// Report
SpeakString("[COMBAT ROUND END] [" + GetName(OBJECT_SELF) + "]");
}

View File

@@ -1,10 +0,0 @@
// 0_onconver
// On Conversation report. report feedback information via. Speak String.
void main()
{
// Report
SpeakString("[CONVERSATION]");
}

View File

@@ -1,17 +0,0 @@
// 0_ondamaged
// On Damage report. report feedback information via. Speak String.
void main()
{
object oDamager = GetLastDamager(); // returns the object that last dealt damage to OBJECT_SELF, causing this event to fire.
int nTotalDamage = GetTotalDamageDealt();// returns the amount of damage dealt to a creature (returns 0 when used in a Door's or Placeable Object's OnDamaged event).
//int n = GetDamageDealtByType(int nDamageType);// returns the amount of damage dealt by particular attacks.
int nCurHP = GetCurrentHitPoints(OBJECT_SELF);// can be used to return the current hit points of the caller.
int nMaxHP = GetMaxHitPoints(OBJECT_SELF);// can be used to return the maximum hit points (and used with GetCurrentHitPoints(object oObject = OBJECT_SELF) for determining how threatened the creature is with death).
// Report
SpeakString("[DAMAGED] [" + GetName(OBJECT_SELF) + "] By: " + GetName(oDamager) + ". Total: " + IntToString(nTotalDamage) +
". Current HP: " + IntToString(nCurHP) + ". MaxHP: " + IntToString(nMaxHP));
}

View File

@@ -1,11 +0,0 @@
// 0_ondeath
// On Death report. report feedback information via. Speak String.
void main()
{
object oKiller = GetLastKiller();// returns the object that killed OBJECT_SELF.
// Report
SpeakString("[KILLED] [" + GetName(OBJECT_SELF) + "] By: " + GetName(oKiller) + ".");
}

View File

@@ -1,15 +0,0 @@
// 0_ondisturb
// On Disturbed report. report feedback information via. Speak String.
void main()
{
object oDisturber = GetLastDisturbed();// returns the object that last disturbed OBJECT_SELF.
int nType = GetInventoryDisturbType();//returns one of the INVENTORY_DISTURB_TYPE_* constants to determine what occured.
object oItem = GetInventoryDisturbItem();// returns the item that was either added or removed to the inventory of OBJECT_SELF.
// Report
SpeakString("[DISTURBED] [" + GetName(OBJECT_SELF) + "] By: " + GetName(oDisturber) + ". Took: " + GetName(oItem) + ". Type: " + IntToString(nType));
}

View File

@@ -1,16 +0,0 @@
// 0_onperception
// On Perception report. report feedback information via. Speak String.
void main()
{
object oPerceived = GetLastPerceived();// returns the last perceived creature (whether or not it was actually seen or heard).
int bHeard = GetLastPerceptionHeard();// returns TRUE or FALSE as to whether the last perceived object was also heard.
int bInaudible = GetLastPerceptionInaudible();// returns TRUE or FALSE as to whether or not the last perceived object has become inaudible (unable to be heard).
int bSeen = GetLastPerceptionSeen();// returns TRUE or FALSE as to whether or not the last perceived object was seen.
int bVanished = GetLastPerceptionVanished();// returns TRUE or FALSE as to whether or not the last perceived object can no longer be seen (invisible).
SpeakString("[PERCEPTION] [" + GetName(OBJECT_SELF) + "] Perceived: " + GetName(oPerceived) + ". bHeard: " + IntToString(bHeard) +
". bInaudible: " + IntToString(bInaudible) + ". bSeen: " + IntToString(bSeen) +
". bVanished: " + IntToString(bVanished));
}

View File

@@ -1,10 +0,0 @@
// 0_onrested
// On Rested report. report feedback information via. Speak String.
void main()
{
SpeakString("[RESTED] [" + GetName(OBJECT_SELF) + "] ");
}

View File

@@ -1,10 +0,0 @@
// 0_onspawn
// On Spawn report. report feedback information via. Speak String.
void main()
{
SpeakString("[SPAWN] [" + GetName(OBJECT_SELF) + "] ");
}

View File

@@ -1,14 +0,0 @@
// 0_onspellcast
// On Spell Cast At report. report feedback information via. Speak String.
void main()
{
int nSpell = GetLastSpell();// returns the SPELL_* that was cast.
object oCaster = GetLastSpellCaster();// returns the object that cast the spell.
int bHarmful = GetLastSpellHarmful();// returns TRUE if the spell was marked as hostile, FALSE otherwise.
SpeakString("[SPELL CAST AT] [" + GetName(OBJECT_SELF) + "] Caster: " + GetName(oCaster) +
". nSpell: " + IntToString(nSpell) + ". bHarmful: " + IntToString(bHarmful));
}

View File

@@ -1,40 +0,0 @@
#include "phs_inc_visuals"
void main()
{
// Fires set VFX
int iVFX = GetLocalInt(OBJECT_SELF, "VFX");
if(iVFX > 0)
{
object oTarget = GetNearestObjectByTag("CombatDummy");
if(!GetIsObjectValid(oTarget)) return;
effect eVis;
if(iVFX == VFX_BEAM_DISINTEGRATE ||
iVFX == VFX_BEAM_FLAME ||
iVFX == VFX_BEAM_BLACK ||
iVFX == VFX_BEAM_CHAIN ||
iVFX == VFX_BEAM_COLD ||
iVFX == VFX_BEAM_EVIL ||
iVFX == VFX_BEAM_FIRE ||
iVFX == VFX_BEAM_FIRE_LASH ||
iVFX == VFX_BEAM_FIRE_W ||
iVFX == VFX_BEAM_FIRE_W_SILENT ||
iVFX == VFX_BEAM_HOLY ||
iVFX == VFX_BEAM_LIGHTNING ||
iVFX == VFX_BEAM_MIND ||
iVFX == VFX_BEAM_ODD)
{
eVis = EffectBeam(iVFX, OBJECT_SELF, BODY_NODE_CHEST);
}
else
{
eVis = EffectVisualEffect(iVFX);
}
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, 12.0);
}
}

View File

@@ -1,5 +0,0 @@
void main()
{
SetListening(OBJECT_SELF, TRUE);
SetListenPattern(OBJECT_SELF, "**", 0);
}

View File

@@ -1,18 +0,0 @@
void main()
{
if(GetListenPatternNumber() == -1)
{
BeginConversation();
}
if(GetListenPatternNumber() == 0 && GetIsPC(GetLastSpeaker()))
{
string sSpeak = GetMatchedSubstring(0);
SendMessageToPC(GetLastSpeaker(), "Said: " + sSpeak);
int iSpeak = StringToInt(sSpeak);
SetLocalInt(OBJECT_SELF, "VFX", iSpeak);
}
}

View File

@@ -1,38 +0,0 @@
void main()
{
// Display info about the target
object oUser = GetItemActivator();
object oTarget = GetItemActivatedTarget();
string sInfo = "[INFO] [Of: " + GetName(oTarget);
// Get effects
if(GetIsObjectValid(oTarget))
{
sInfo += "] [Tag: " + GetTag(oTarget);
sInfo += "] [CurHP: " + IntToString(GetCurrentHitPoints(oTarget));
sInfo += "] [MaxHP: " + IntToString(GetMaxHitPoints(oTarget));
sInfo += "] [Reputation: " + IntToString(GetReputation(oTarget, oUser));
sInfo += "] [Effects: ";
// Effects
int nAmount = 0;
effect eCheck = GetFirstEffect(oTarget);
while(GetIsEffectValid(eCheck))
{
nAmount++;
// Name creator, spell name and id, duration type, subtype and effect type.
sInfo += "[" + IntToString(nAmount) + ". [Type:" + IntToString(GetEffectType(eCheck)) +
"] [Id:" + IntToString(GetEffectSpellId(eCheck)) +
"] [Name:" + GetStringByStrRef(StringToInt(Get2DAString("Spells", "Name", GetEffectSpellId(eCheck)))) +
"] [Subtype:" + IntToString(GetEffectSubType(eCheck)) +
"] [Duration:" + IntToString(GetEffectDurationType(eCheck)) + "]";
eCheck = GetNextEffect(oTarget);
}
sInfo += "]";
}
// Say it
AssignCommand(oUser, SpeakString(sInfo));
}

View File

@@ -1,18 +0,0 @@
void main()
{
SpeakString("CONVERSATION");
object oPC = GetLastSpeaker();
// Repeat the string said
string sSaid = GetMatchedSubstring(0);
SpeakString("CONV. " + GetName(oPC) + " said: " + sSaid);
if(sSaid == "exit")
{
SpeakString("EXIT");
SetPlotFlag(OBJECT_SELF, FALSE);
DestroyObject(OBJECT_SELF);
}
}

View File

@@ -1,19 +0,0 @@
void main()
{
// Spawn in "genie"
SetListening(OBJECT_SELF, TRUE);
SetListenPattern(OBJECT_SELF, "**", 0);
SetFacingPoint(GetPosition(GetFirstPC()));
ActionSpeakString("You can speak your wish sir");// Never appers
SendMessageToPC(GetFirstPC(), "Wish debug: Spawn");
effect eTime = EffectTimeStop();
// 4 seconds too long
// 1 second too little, by a small margin.
// 1.5 should be fine
DelayCommand(1.5, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eTime, OBJECT_SELF));
}

View File

@@ -1,34 +0,0 @@
void WrapperDelayRemoval(float fDuration);
void CheckAndRemove(int nSpellId, int nTimesCast, object oTarget);
void main() // This would be the spell script.
{
float fDuration = 4.0; // fDuration = the duration of the tempoary effect
WrapperDelayRemoval(fDuration);// Put this at the end of all spell scripts with polymorph in
}
void WrapperDelayRemoval(float fDuration)
{
int nSpell = GetSpellId();
int nCastTimes = GetLocalInt(OBJECT_SELF, "TIMES_CAST" + IntToString(nSpell));
nCastTimes++; // Add one to cast times
SetLocalInt(OBJECT_SELF, "TIMES_CAST" + IntToString(nSpell), nCastTimes);
DelayCommand(fDuration, CheckAndRemove(nSpell, nCastTimes, OBJECT_SELF));
}
void CheckAndRemove(int nSpellId, int nTimesCast, object oTarget)
{
if(GetHasSpellEffect(nSpellId, oTarget) &&
GetLocalInt(oTarget, "TIMES_CAST" + IntToString(nSpellId)) == nTimesCast)
{
effect eCheck = GetFirstEffect(oTarget);
while(GetIsEffectValid(eCheck))
{
if(GetEffectSpellId(eCheck) == nSpellId)
{
RemoveEffect(oTarget, eCheck);
}
eCheck = GetNextEffect(oTarget);
}
}
}

View File

@@ -1,240 +0,0 @@
/*:://////////////////////////////////////////////
//:: Name Jasperre's 3 Level Puzzle script for tom23
//:: FileName J_Levelpuzzle
//:://////////////////////////////////////////////
This will be put in 3 levers On Used events.
- Door, must be TAGGED as "JAS_3LEVERDOOR", exactly!
- Each plate (there are 3 you have to stand on in order) must be tagged
seperatly:
"JAS_3LEVER1"
"JAS_3LEVER2"
"JAS_3LEVER3"
How it works:
- Door can be in "LOCK_OPEN", TRUE or FALSe state. If TRUE, the levers
do not work, because the door is open!
- Door handles the total order via. strings. It hsa the "Randomise" pattern
set as a string, 123, for example, while it has the order already done
also set to a string, eg could be a partial: "32", and 1 would be the last
to add.
- If the door has a randomise pattern, we will add our number to the list
- If the door hasn't got a randomise pattern (IE: Its been reset from
completetion) then we make one, and add this as the first one said.
This does a special string whenever something happens to show something
has happened.
WE ONLY RANDOMISE IF WE HAVE NOT BEEN COMPLETED ONCE, thus it will stay
forever, for example, 312, until they have pressed 312.
Not too complicated really.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//:: Created On: 25 May
//::////////////////////////////////////////////*/
// Set all the levers to "unpressed" and delete the order.
void ResetLockStatus(object oDoor);
// Do small animation.
// SpeakString(sSpeak) too.
void DoAnimation(string sSpeak);
// Set this lock to have been pressed
// If all have been done, it may open it too.
void SetLockPressed(object oDoor, string sRandomSet, string sDoneAlready, string sLever);
// Randomise what order the locks have to be pressed
void RandomiseLocks(object oDoor);
// Reset lock on this
void DelayedLockResetDoor(object oDoor);
// Assigned from DelayedLockResetDoor.
void DoCloseSelf();
void main()
{
// Get what lever we are
object oSelf = OBJECT_SELF;
string sLever = GetStringRight(GetTag(oSelf), 1);
object oDoor = GetObjectByTag("JAS_3LEVERDOOR");
string sRandomSet = GetLocalString(oDoor, "JASP_RANDOM_LOCKNUMBER");
string sDoneAlready = GetLocalString(oDoor, "JASP_LOCK_NUMBERS");
// Get the status - is the thing active. If the lock is NOT off, we
// are OK.
if(GetLocalInt(oDoor, "JASP_LOCK_OPEN") == FALSE)
{
// Check if we will reset because its been pressed once already
if(FindSubString(sLever, sDoneAlready) >= 0)
{
// "We have been pressed, reset the puzzle"
DoAnimation("*Wiiirrrr, chug chug chug*");
// Reset the current set pattern
DeleteLocalInt(oDoor, "JASP_LOCK_NUMBERS");
}
else
{
// We will now start, or simply add it to the done list
if(sRandomSet == "")
{
// Not started, start it up
RandomiseLocks(oDoor);
SetLockPressed(oDoor, sRandomSet, "", sLever);
}
else
{
// Else, do that we've done
SetLockPressed(oDoor, sRandomSet, sDoneAlready, sLever);
}
}
}
else
{
// "Failed to do anything, its already open!"
DoAnimation("*Wiirrr, clunk*");
}
}
// Set all the levers to "unpressed" and delete the order.
void ResetLockStatus(object oDoor)
{
// Delete the locals for the door randomise and door already done strings
DeleteLocalString(oDoor, "JASP_RANDOM_LOCKNUMBER");
DeleteLocalString(oDoor, "JASP_LOCK_NUMBERS");
}
// Do small animation.
// SpeakString(sSpeak) too.
void DoAnimation(string sSpeak)
{
SpeakString(sSpeak);
PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
DelayCommand(1.5, PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
}
// Set this lock to have been pressed
// If all have been done, it may open it too.
void SetLockPressed(object oDoor, string sRandomSet, string sDoneAlready, string sLever)
{
// We check if this is the last one
if(GetStringLength(sDoneAlready) == 2)
{
// Add it, and check if we have completed the puzzle or should
// just reset sDoneAlready
sDoneAlready += sLever;
// check against sRandomSet
if(sDoneAlready == sRandomSet)
{
// WOO! done it!
// "Completed the puzzle!"
DoAnimation("*Wiirrr, chi-ching!*");
// Delete locked code too
ResetLockStatus(oDoor);
// Open the door
SetLocalInt(oDoor, "JASP_LOCK_OPEN", TRUE);
SetLocked(oDoor, TRUE);
AssignCommand(oDoor, ActionOpenDoor(oDoor));
// Delay closing
DelayCommand(60.0, DelayedLockResetDoor(oDoor));
}
else
{
// Must have failed - DO NOT RESET LOCKS, just delete JASP_LOCK_NUMBERS
DoAnimation("*Wiirrr, blonk!*");
DeleteLocalInt(oDoor, "JASP_LOCK_NUMBERS");
}
}
// Thus this just the first or second one
else
{
// We know if its been pressed already. No more checks here
// Add the lever to exsisting string
sDoneAlready += sLever;
// Set string to the door
DoAnimation("*Wiirrr, clink clunk!*");
SetLocalString(oDoor, "JASP_LOCK_NUMBERS", sDoneAlready);
}
}
// Randomise what order the locks have to be pressed
void RandomiseLocks(object oDoor)
{
// Thanks to Olias for this. Yes, I can't be bothered
// to even do it for something this simple myself.
string sComplete;
int nOne = d3();
if(nOne == 1)
{
// First string "1"
sComplete += "1";
if(d2() == 1)
{
// Second string "2", last "3"
sComplete += "23";
}
else
{
// Second string "3", last "2"
sComplete += "32";
}
}
else if(nOne == 2)
{
// First string "2"
sComplete += "2";
if(d2() == 1)
{
// Second string "1", last "3"
sComplete += "13";
}
else
{
// Second string "3", last "1"
sComplete += "31";
}
}
else// if(nOne == 3)
{
// First string "3"
sComplete += "3";
if(d2() == 1)
{
// Second string "1", last "2"
sComplete += "12";
}
else
{
// Second string "2", last "1"
sComplete += "21";
}
}
// Randomise and set to the string JASP_RANDOM_LOCKNUMBER, on oDoor,
// a combination of sComplete (123, 132, etc).
SetLocalString(oDoor, "JASP_RANDOM_LOCKNUMBER", sComplete);
}
// Reset lock on this
void DelayedLockResetDoor(object oDoor)
{
SetLocalInt(oDoor, "JASP_LOCK_OPEN", FALSE);
AssignCommand(oDoor, DoCloseSelf());
}
// Assigned from DelayedLockResetDoor.
void DoCloseSelf()
{
ActionCloseDoor(OBJECT_SELF);
SetLocked(OBJECT_SELF, TRUE);
}

View File

@@ -1,138 +0,0 @@
// NO LONGER USED. HERE INCASE I NEED IT. 2 SCRIPTS.
void main(){return;}
/*:://////////////////////////////////////////////
//:: Spell Name Cloudkill - Create second ETC ones.
//:: Spell FileName phs_cloudkilly
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Creates the first AOE when the creature created is created. This then will
jump to new locations 3.3 M away from the starting location (increments
thereof) and then destroy itself after the duration.
This is the "Heartbeat round file" of the creature.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//:://///////////////////////////////////////////
#include "PHS_INC_SPELLS"
// Does exactly what is says on the tin
void DestroySelf();
void main()
{
// Create first instance by Executing a Script on the caster, if valid
object oCaster = GetLocalObject(OBJECT_SELF, PHS_CLOUDKILL_CASTER);
// Get original location
location lOriginal = GetLocalLocation(OBJECT_SELF, PHS_CLOUDKILL_LOCATION);
if(GetIsObjectValid(oCaster))
{
// Get new location for X rounds done
int iLastRounds = GetLocalInt(OBJECT_SELF, PHS_CLOUDKILL_ROUNDS_DONE);
// Check if the duration is up to the rounds limit
if(iLastRounds <= GetLocalInt(OBJECT_SELF, PHS_CLOUDKILL_DURATION))
{
// Increment
iLastRounds++;
// Get location based on this
float fFromOriginal = iLastRounds * 3.33;
// New location
location lMove = PHS_GetLocationBehindLocation(lOriginal, GetLocation(oCaster), fFromOriginal);
// Move me
ClearAllActions();
JumpToLocation(lMove);
// New effect for 6 seconds
// - apply at lOriginal
effect eFog = EffectAreaOfEffect(AOE_PER_FOGKILL, "phs_s_cloudkilla", "****", "****");
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eFog, GetLocation(OBJECT_SELF), 6.0);
// 6 second "Pesudo-heartbeat" heartbeat
DelayCommand(6.0, ExecuteScript("phs_cloudkilly", OBJECT_SELF));
}
else
{
// Stop the script
return;
}
}
else
{
DestroySelf();
}
}
void DestroySelf()
{
SetPlotFlag(OBJECT_SELF, FALSE);
DestroyObject(OBJECT_SELF);
}
:://////////////////////////////////////////////
//:: Spell Name Cloudkill - Create First AOE
//:: Spell FileName phs_cloudkillx
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Creates the first AOE when the creature created is created. This then will
jump to new locations 3.3 M away from the starting location (increments
thereof) and then destroy itself after the duration.
This is the "Spawn file" of the creature.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//:://///////////////////////////////////////////
#include "PHS_INC_SPELLS"
// Does exactly what is says on the tin
void DestroySelf();
void main()
{
// Apply Ghost as starting one
// Ghost
effect eGhost = EffectCutsceneGhost();
// No dispel
eGhost = SupernaturalEffect(eGhost);
// Apply effects
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, OBJECT_SELF);
// Create first instance by Executing a Script on the caster, if valid
object oCaster = GetLocalObject(OBJECT_SELF, PHS_CLOUDKILL_CASTER);
// Get original location
location lOriginal = GetLocalLocation(OBJECT_SELF, PHS_CLOUDKILL_LOCATION);
if(GetIsObjectValid(oCaster))
{
// Move me
ClearAllActions();
JumpToLocation(lOriginal);
// New effect for 6 seconds
// - apply at lOriginal
effect eFog = EffectAreaOfEffect(AOE_PER_FOGKILL, "phs_s_cloudkilla", "****", "****");
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eFog, GetLocation(OBJECT_SELF), 6.0);
// 6 second "Pesudo-heartbeat" heartbeat
DelayCommand(6.0, ExecuteScript("phs_cloudkilly", OBJECT_SELF));
}
else
{
DestroySelf();
}
}
void DestroySelf()
{
SetPlotFlag(OBJECT_SELF, FALSE);
DestroyObject(OBJECT_SELF);
}
*/

View File

@@ -1,36 +0,0 @@
void main()
{
// walks to the nearest waypoint ,if we are not already walking
object oWP1 = GetWaypointByTag("MOVETO1");
object oWP2 = GetWaypointByTag("MOVETO2");
int nAction = GetCurrentAction();
int nCommand = GetCommandable();
// Get if we are moving
if(nAction == ACTION_MOVETOPOINT)
{
SpeakString("Cannot do new move, we are moving [Action] " + IntToString(nAction) + " [Command] " + IntToString(nCommand));
}
else if(nCommand == FALSE)
{
SpeakString("Cannot do new move, uncommandable [Action] " + IntToString(nAction) + " [Command] " + IntToString(nCommand));
}
else
{
// Check distance
if(GetDistanceToObject(oWP1) <= 1.5)
{
// Go to 2.
ClearAllActions();
SpeakString("Moving to waypoint 2 [Action] " + IntToString(nAction) + " [Command] " + IntToString(nCommand));
ActionMoveToLocation(GetLocation(oWP2), FALSE);
}
else
{
// Else, go to 1
ClearAllActions();
SpeakString("Moving to waypoint 1 [Action] " + IntToString(nAction) + " [Command] " + IntToString(nCommand));
ActionMoveToLocation(GetLocation(oWP1), FALSE);
}
}
}

View File

@@ -1,14 +0,0 @@
void main()
{
/*
// Make sure they are not immune to spells
!PHS_TotalSpellImmunity(oTarget))
// Make sure they are not immune to spells
if(PHS_TotalSpellImmunity(oTarget)) return;
// Signal Spell cast at
PHS_SignalSpellCastAt(oTarget, SPELL_INVALID);
*/
}

View File

@@ -1,154 +0,0 @@
/*:://////////////////////////////////////////////
//:: Name Jasperre's 3 Level Puzzle script for tom23
//:: FileName J_Levelpuzzle
//:://////////////////////////////////////////////
This will be put in 3 levers On Used events.
- Door, must be TAGGED as "JAS_3LEVERDOOR", exactly!
- Each plate (there are 3 you have to stand on in order) must be tagged
seperatly:
"JAS_3LEVER1"
"JAS_3LEVER2"
"JAS_3LEVER3"
How it works:
- Door can be in "LOCK_OPEN", TRUE or FALSe state. If TRUE, the levers
do not work, because the door is open!
- Door handles the total order via. strings. It hsa the "Randomise" pattern
set as a string, 123, for example, while it has the order already done
also set to a string, eg could be a partial: "32", and 1 would be the last
to add.
- If the door has a randomise pattern, we will add our number to the list
- If the door hasn't got a randomise pattern (IE: Its been reset from
completetion) then we make one, and add this as the first one said.
This does a special string whenever something happens to show something
has happened.
WE ONLY RANDOMISE IF WE HAVE NOT BEEN COMPLETED ONCE, thus it will stay
forever, for example, 312, until they have pressed 312.
Not too complicated really.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//:: Created On: 25 May
//::////////////////////////////////////////////*/
const int CONST_LEVER_COUNT = 3;
// Do small animation.
// SpeakString(sSpeak) too.
void DoAnimation(string sSpeak);
// Reset lock on this
void DelayedLockResetDoor(object oDoor);
// Assigned from DelayedLockResetDoor.
void DoCloseSelf();
void main()
{
// Get what lever we are
object oSelf = OBJECT_SELF;
string sLever = GetStringRight(GetTag(oSelf), 1);
object oDoor = GetObjectByTag("JAS_3LEVERDOOR");
int nPulled = GetLocalInt(oDoor, "JASP_PULLED_COUNT");
// Get the status - is the thing active. If the lock is NOT off, we
// are OK.
if(GetLocalInt(oDoor, "JASP_LOCK_OPEN") == FALSE)
{
// Check if we will reset because its been pressed once already
if(GetLocalInt(oDoor, "JASP_LEVERDONE_" + sLever) == TRUE)
{
// "We have been pressed, reset the puzzle"
DoAnimation("*Wiiirrrr, chug chug chug*");
// Reset the current set pattern
DeleteLocalInt(oDoor, "JASP_LOCK_NUMBERS");
}
else
{
// We will now start, or simply add it to the done list
if(Random(CONST_LEVER_COUNT - nPulled) == 0)
{
// Correct lever
nPulled++;
SetLocalInt(oDoor, "JASP_PULLED_COUNT", nPulled);
// Combination Successful
if(nPulled == CONST_LEVER_COUNT)
{
// DONE:
// Reset levers done
int nCnt;
for(nCnt = 1; nCnt <= 3; nCnt++)
{
DeleteLocalInt(oDoor, "JASP_LEVERDONE_" + IntToString(nCnt));
}
DeleteLocalInt(oDoor, "JASP_PULLED_COUNT");
// Open door
// WOO! done it!
// "Completed the puzzle!"
DoAnimation("*Wiirrr, chi-ching!*");
// Open the door
SetLocalInt(oDoor, "JASP_LOCK_OPEN", TRUE);
SetLocked(oDoor, TRUE);
AssignCommand(oDoor, ActionOpenDoor(oDoor));
// Delay closing
DelayCommand(60.0, DelayedLockResetDoor(oDoor));
}
}
else
{
// Incorrect lever, duh-duh-duh, duuuuhhhh
// Just clank away, and leave the variables
DoAnimation("*Wiirrr, clink clunk!*");
}
}
}
else
{
// "Failed to do anything, its already open!"
DoAnimation("*Wiirrr, clunk*");
}
}
// Do small animation.
// SpeakString(sSpeak) too.
void DoAnimation(string sSpeak)
{
SpeakString(sSpeak);
PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE);
DelayCommand(1.5, PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
}
// Randomise what order the locks have to be pressed
void RandomiseLocks(object oDoor)
{
// Reset levers done
int nCnt;
for(nCnt = 1; nCnt <= 3; nCnt++)
{
DeleteLocalInt(oDoor, "JASP_LEVERDONE_" + IntToString(nCnt));
}
DeleteLocalInt(oDoor, "JASP_PULLED_COUNT");
}
// Reset lock on this
void DelayedLockResetDoor(object oDoor)
{
SetLocalInt(oDoor, "JASP_LOCK_OPEN", FALSE);
AssignCommand(oDoor, DoCloseSelf());
}
// Assigned from DelayedLockResetDoor.
void DoCloseSelf()
{
ActionCloseDoor(OBJECT_SELF);
SetLocked(OBJECT_SELF, TRUE);
}

View File

@@ -1,43 +0,0 @@
// In this code, we will say wether the item aquired was on a logon
// attempt, a normal addition, or a relog.
// The OnItemAquire event would use this.
void main()
{
// Get item aquired
object oItem = GetModuleItemAcquired();
// Who by?
object oPC = GetModuleItemAcquiredBy();
object oPC2 = GetItemPossessor(oItem);
// Who was it taken from?
object oLostBy = GetModuleItemAcquiredFrom();
// If oLostBy is invalid, we must have logged in - we are not
// taking this from anyone
if(!GetIsObjectValid(oLostBy) || oLostBy == oPC2)
{
// Is it a relog in or not?
// It will be if oPC is invalid
if(!GetIsObjectValid(oPC))
{
// It is a relog, we can use oPC2 as the person who
// reloged in with this item to send the message to.
SendMessageToPC(oPC2, "You have relogged in carrying the item: " + GetName(oItem));
}
else
{
// Not a relog, a normal login, we can use oPC to send
// a message to.
// * Note: oPC2 is always valid to use
SendMessageToPC(oPC, "You just logged in, carrying the item: " + GetName(oItem));
}
}
else
{
// This fires when it is a normal case of the event
// and so oPC can be used to send the message.
// * Note: oPC2 is always valid to use
SendMessageToPC(oPC, "You have aquired the item: " + GetName(oItem));
}
}

View File

@@ -1,65 +0,0 @@
/* Script generated by
Lilac Soul's NWN Script Generator, v. 1.6
For download info, please visit:
http://www.lilacsoul.revility.com */
//Put this on action taken in the conversation editor
// Moves oPC to "dst_zarni_cut3", out of the area, and resets thier cutscene mode
// status.
void MovePC(object oPC);
void main()
{
//Introducing the cast, player and Zarniwoop
object oPC = GetPCSpeaker();
object oNPC = OBJECT_SELF;
//Making sure nobody is doing anything
AssignCommand(oPC, ClearAllActions());
AssignCommand(oNPC, ClearAllActions());
// Set the PC into cutscene mode
SetCutsceneMode(oPC, TRUE);
//Take your positions
AssignCommand(oPC, ActionMoveToObject(GetWaypointByTag("dst_zarni_cut1"), FALSE, 0.0));
AssignCommand(oPC, SetFacing(GetFacing(GetWaypointByTag("dst_zarni_cut1"))));
AssignCommand(oNPC, ActionMoveToObject(GetWaypointByTag("dst_zarni_cut2"), FALSE, 0.0));
AssignCommand(oNPC, SetFacing(GetFacing(GetWaypointByTag("dst_zarni_cut2"))));
//DebugMessage
//AssignCommand(oNPC, SpeakString("Adams will sue me for this!"));
//Jumping to the unknown
DelayCommand(6.0, MovePC(oPC));
}
// Moves oPC to "dst_zarni_cut3", out of the area, and resets thier cutscene mode
// status.
void MovePC(object oPC)
{
// Define some stuff
object oMoveTo = GetWaypointByTag("dst_zarni_cut3");
location lTarget = GetLocation(oMoveTo);
effect eVis = EffectVisualEffect(VFX_IMP_UNSUMMON);
// Apply the visual
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetLocation(oPC));
// move them to the waypoint (and turn off cutscene mode)
if(GetCommandable(oPC))
{
AssignCommand(oPC, JumpToLocation(lTarget));
DelayCommand(1.0, SetCutsceneMode(oPC, FALSE));
}
else
{
SetCommandable(TRUE, oPC);
AssignCommand(oPC, JumpToLocation(lTarget));
SetCommandable(FALSE, oPC);
DelayCommand(1.0, SetCutsceneMode(oPC, FALSE));
}
}

View File

@@ -1,35 +0,0 @@
void Debug(string sString)
{
SendMessageToPC(GetFirstPC(), sString);
}
void main()
{
object oMaster = GetMaster();
// heartbeat of summon
Debug("Heartbeat script Id: " + ObjectToString(OBJECT_SELF) + ". Name: " + GetName(OBJECT_SELF) + ". Tag: " + GetTag(OBJECT_SELF) + ". ResRef: " + GetResRef(OBJECT_SELF));
// Debug properties
Debug("Master: " + GetName(oMaster));
Debug("Effects Debug");
effect eCheck = GetFirstEffect(OBJECT_SELF);
while(GetIsEffectValid(eCheck))
{
Debug("Effect: " + IntToString(GetEffectType(eCheck)) + ". Creator: " + GetName(GetEffectCreator(eCheck)) + ".");
eCheck = GetNextEffect(OBJECT_SELF);
}
// Master effects
eCheck = GetFirstEffect(oMaster);
while(GetIsEffectValid(eCheck))
{
Debug("Effect: " + IntToString(GetEffectType(eCheck)) + ". Creator: " + GetName(GetEffectCreator(eCheck)) + ".");
eCheck = GetNextEffect(oMaster);
}
}

View File

@@ -1,34 +0,0 @@
void Debug(string sString)
{
SendMessageToPC(GetFirstPC(), sString);
}
void main()
{
object oMaster = GetMaster();
// death of summon
Debug("Death! (Id: " + ObjectToString(OBJECT_SELF) + ". Name: " + GetName(OBJECT_SELF) + ". Tag: " + GetTag(OBJECT_SELF) + ". ResRef: " + GetResRef(OBJECT_SELF));
// Debug properties
Debug("Master: " + GetName(oMaster));
Debug("Effects Debug");
effect eCheck = GetFirstEffect(OBJECT_SELF);
while(GetIsEffectValid(eCheck))
{
Debug("Effect: " + IntToString(GetEffectType(eCheck)) + ". Creator: " + GetName(GetEffectCreator(eCheck)) + ".");
eCheck = GetNextEffect(OBJECT_SELF);
}
// Master effects
eCheck = GetFirstEffect(oMaster);
while(GetIsEffectValid(eCheck))
{
Debug("Effect: " + IntToString(GetEffectType(eCheck)) + ". Creator: " + GetName(GetEffectCreator(eCheck)) + ".");
eCheck = GetNextEffect(oMaster);
}}

View File

@@ -1,41 +0,0 @@
void Debug(string sString)
{
SendMessageToPC(GetFirstPC(), sString);
}
void main()
{
object oMaster = GetMaster();
// Spawn of summon
Debug("Spawn Script: Spawned (My Name: " + GetName(OBJECT_SELF) + ". Tag: " + GetTag(OBJECT_SELF) + ". ResRef: " + GetResRef(OBJECT_SELF));
SetIsDestroyable(FALSE);
DelayCommand(0.01, SetIsDestroyable(TRUE));
// Debug properties
Debug("Master: " + GetName(oMaster));
Debug("My 'Type of companion': " + IntToString(GetAssociateType(OBJECT_SELF)));
Debug("Effects Debug");
effect eCheck = GetFirstEffect(OBJECT_SELF);
while(GetIsEffectValid(eCheck))
{
Debug("Effect: " + IntToString(GetEffectType(eCheck)) + ". Creator: " + GetName(GetEffectCreator(eCheck)) + ".");
eCheck = GetNextEffect(OBJECT_SELF);
}
// Master effects
eCheck = GetFirstEffect(oMaster);
while(GetIsEffectValid(eCheck))
{
Debug("Effect: " + IntToString(GetEffectType(eCheck)) + ". Creator: " + GetName(GetEffectCreator(eCheck)) + ".");
eCheck = GetNextEffect(oMaster);
}
}

View File

@@ -1,40 +0,0 @@
//::///////////////////////////////////////////////
//:: Fireball
//:: NW_S0_Fireball
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
// Testing summoning spell
void main()
{
// Create summon effect
string sResRef = "phs_kobold";
string sResRef2 = "phs_balor";
effect eSummon = EffectSummonCreature(sResRef, VFX_FNF_SUMMON_MONSTER_1);
effect eSummon2 = EffectSummonCreature(sResRef2, VFX_FNF_SUMMON_MONSTER_2);
effect eLink = EffectLinkEffects(eSummon, eSummon2);
location lTarget = GetSpellTargetLocation();
SpeakString("Summoning monster: Kobold");
// Set the associates (summons) to destroyable: FALSE for a sec.
int nCnt = 1;
object oAssociate = GetAssociate(ASSOCIATE_TYPE_SUMMONED, OBJECT_SELF, nCnt);
while(GetIsObjectValid(oAssociate))
{
SpeakString("Summon: " + GetName(oAssociate) + ". changing to destroyable");
AssignCommand(oAssociate, SetIsDestroyable(FALSE));
DelayCommand(0.1, AssignCommand(oAssociate, SetIsDestroyable(TRUE)));
nCnt++;
oAssociate = GetAssociate(ASSOCIATE_TYPE_SUMMONED, OBJECT_SELF, nCnt);
}
// Apply it for 10 minutes
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eLink, lTarget, TurnsToSeconds(10));
// Apply it for 10 minutes
//ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, lTarget, TurnsToSeconds(10));
// 2 of them - Apply it for 10 minutes
//ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon2, lTarget, TurnsToSeconds(10));
}

View File

@@ -1,74 +0,0 @@
/*:://////////////////////////////////////////////
//:: Spell Name Invisibility, Greater
//:: Spell FileName PHS_S_InvisGreat
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
Illusion (Glamer)
Level: Brd 4, Sor/Wiz 4
Components: V, S
Casting Time: 1 standard action
Range: Personal or touch
Target: You or creature touched
Duration: 1 round/level (D)
Saving Throw: Will negates (harmless)
Spell Resistance: Yes (harmless)
This spell functions like invisibility, except that it doesn<73>t end if the
subject attacks.
Arcane Material Component: An eyelash encased in a bit of gum arabic.
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Only difference to invisiblity is the 1 round/level, and that we
are attempting to use the
INVISIBILITY_TYPE_IMPROVED
Constant to see if it won't get removed when they attack.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Spell hook check.
if(!PHS_SpellHookCheck(PHS_SPELL_INVISIBILITY_GREATER)) return;
// Declare Major Variables
object oCaster = OBJECT_SELF;
object oTarget = GetSpellTargetObject();
int nCasterLevel = PHS_GetCasterLevel();
int nMetaMagic = PHS_GetMetaMagicFeat();
// Make sure they are not immune to spells
if(PHS_TotalSpellImmunity(oTarget)) return;
// Determine duration in rounds
float fDuration = PHS_GetDuration(PHS_ROUNDS, nCasterLevel, nMetaMagic);
// Declare effects
effect eInvisibility = EffectInvisibility(INVISIBILITY_TYPE_IMPROVED);
effect eCessate = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
// Link effects
effect eLink = EffectLinkEffects(eInvisibility, eCessate);
// Remove pervious castings of it
PHS_RemoveSpellEffectsFromTarget(PHS_SPELL_INVISIBILITY_GREATER, oTarget);
// Fire cast spell at event for the specified target
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_INVISIBILITY_GREATER, FALSE);
// Report effects
PHS_DebugReportEffects(oTarget);
// Apply VNF and effect.
PHS_ApplyDuration(oTarget, eLink, fDuration);
// Report effects
PHS_DebugReportEffects(oTarget);
}

View File

@@ -1 +0,0 @@
// Empty used for testing

View File

@@ -1,53 +0,0 @@
//::///////////////////////////////////////////////
// Tests:
// - Paralysis: Non-commandable is TRUE, so cannot even use Verbal spells (urg)
// - EffectCutsceneImmobilize() - Commandable, but cannot move at all, can cast.
// - EffectCutsceneParalyze() - Bypasses normal palarysis immunities. No icon. Not commandable.
// - reports :"you cannot speak, cannot cast spells with verbal components" - a boo boo
// -
// ActionMoveXXX will not work in Entangle, Paralsis, Immobilize, and therefore
// pushback (which is logical in entanglements case) will not work.
void Send(string sMessage, object oTarget);
void Report(object oTarget);
void main()
{
// Effect
effect eApply = EffectDispelMagicAll(10);
// Get target
object oTarget = GetSpellTargetObject();
// Message
Send("EffectDispelMagicAll(10)", oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eApply, oTarget, 30.0);
// Delay a report
DelayCommand(10.0, Report(oTarget));
}
void Send(string sMessage, object oTarget)
{
if(oTarget != OBJECT_SELF) SendMessageToPC(OBJECT_SELF, sMessage);
SendMessageToPC(oTarget, sMessage);
}
void Report(object oTarget)
{
int bCommandable = GetCommandable(oTarget);
int bPlot = GetPlotFlag(oTarget);
int bDead = GetIsDead(oTarget);
string sMessage = "STATUS: " + GetName(oTarget) + "| COM: " + IntToString(bCommandable) + "| PLOT: " + IntToString(bPlot) + "| DEAD: " + IntToString(bDead) + "|";
SendMessageToPC(oTarget, sMessage);
if(oTarget != OBJECT_SELF)
{
SendMessageToPC(OBJECT_SELF, sMessage);
}
}

View File

@@ -1,41 +0,0 @@
/*:://////////////////////////////////////////////
Test for:
Wish, Timestop, and stuff like that...
1. Can you have a timestop conversation
2. Can you use stun with timestop.
etc.
If linked damage, in a tempoary effect, will actually apply the linked effects
if the damage is made out to be 0 somehow. (most likely yes)
(it will apply the effects, tested with stoneskin)
Old ones:
If invisibility + Link effects will remove all linked efffects when invis goes
(it does)
//::////////////////////////////////////////////*/
void main()
{
// Declare Major Variables
object oCaster = OBJECT_SELF;
object oTarget = oCaster;
// Create the genie
object oGenie = CreateObject(OBJECT_TYPE_CREATURE, "wish_test", GetLocation(oCaster));
//AssignCommand(oGenie, ActionStartConversation(oCaster, "", TRUE));
//ActionStartConversation(oCaster, "test_wish", TRUE);
// Apply timestop
//effect eTime = EffectTimeStop();
//SpeakString("Appling Time Stop and creating creature (1.5 delay), to " + GetName(oTarget));
// Apply cutscene stuff to the PC
//AssignCommand(oTarget, ClearAllActions());
//SetCutsceneMode(oTarget, TRUE);
}

View File

@@ -1,27 +0,0 @@
//::///////////////////////////////////////////////
#include "PHS_INC_SPELLS"
void main()
{
// Apply some paralsis to the target
object oTarget = GetSpellTargetObject();
// Declare Effects
effect eParalyze = EffectParalyze();
effect eDur1 = EffectVisualEffect(VFX_DUR_PARALYZED);
effect eDur2 = EffectVisualEffect(VFX_DUR_PARALYZE_HOLD);
effect eCessate = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
// Link effects
effect eLink = EffectLinkEffects(eParalyze, eDur1);
eLink = EffectLinkEffects(eLink, eDur2);
eLink = EffectLinkEffects(eLink, eCessate);
SpeakString("PARALSIS: 120 seconds :" + GetName(oTarget));
// Apply VFX Impact and daze effect
PHS_ApplyDuration(oTarget, eLink, 120.0);
}

View File

@@ -1,56 +0,0 @@
// Empty, used for testing
// Test repel on things.
#include "PHS_INC_SPELLS"
void Test(float fDistance, object oSource);
void main()
{
object oSource = OBJECT_SELF;
float fDistance = 10.0;
object oTarget = GetSpellTargetObject();
//SpeakString("Doing Move Back: Cutscene only test: " + GetName(oTarget));
//AssignCommand(oTarget, Test(fDistance, oSource));
SpeakString("Setting the target via. assign command to destroyable TRUE");
AssignCommand(oTarget, SetIsDestroyable(TRUE));
// Move them
// SpeakString("DOING MOVE BACK/ REPEL SPECAIL: " + GetName(oTarget));
// AssignCommand(oTarget, PHS_ActionRepel(fDistance, oSource));
}
void Test(float fDistance, object oSource)
{
location lSource = GetLocation(oSource);
// Commandable?
SpeakString("Test (CUTSCENE, 10 seconds till out): Commandable: " + IntToString(GetCommandable(OBJECT_SELF)));
// Cutscene mdoe
SetCutsceneMode(OBJECT_SELF, TRUE);
if(GetCommandable() == FALSE)
{
SetCommandable(TRUE);
AssignCommand(OBJECT_SELF, ActionMoveAwayFromLocation(lSource, TRUE, fDistance));
SetCommandable(FALSE);
}
else
{
AssignCommand(OBJECT_SELF, ActionMoveAwayFromLocation(lSource, TRUE, fDistance));
}
DelayCommand(10.0, SetCutsceneMode(OBJECT_SELF, FALSE));
}

View File

@@ -1,32 +0,0 @@
/*:://////////////////////////////////////////////
//:: Spell Name Cursed Water
//:: Spell FileName PHS_M_CurseWater
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
Cursed Water: Cursed water damages good outsiders almost as if it were acid.
A flask of cursed water can be thrown as a splash weapon.
Treat this attack as a ranged touch attack, with a maximum range of 8M. A
direct hit by a flask of holy water deals 2d4 points of damage to a good
outsider. Each such creature within 1.67M (5 feet) of the point where the
flask hits takes 1 point of damage from the splash.
Temples to evil deities sell cursed water at cost (making no profit).
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
As above, damage similar to Biowares.
This is required for the Curse Water spell.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Use the function to do the hit, blast ETC
PHS_Grenade(d4(2), 1, VFX_IMP_HEAD_EVIL, VFX_IMP_PULSE_NEGATIVE, DAMAGE_TYPE_NEGATIVE, RADIUS_SIZE_FEET_5, OBJECT_TYPE_CREATURE, RACIAL_TYPE_OUTSIDER, RACIAL_TYPE_ALL, ALIGNMENT_GOOD);
}

View File

@@ -1,30 +0,0 @@
/*:://////////////////////////////////////////////
//:: Spell Name Holy Water
//:: Spell FileName PHS_M_HolyWater
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
Holy Water: Holy water damages undead creatures and evil outsiders almost as
if it were acid. A flask of holy water can be thrown as a splash weapon.
Treat this attack as a ranged touch attack, with a maximum range of 8M. A
direct hit by a flask of holy water deals 2d4 points of damage to an undead
creature or an evil outsider. Each such creature within 1.67M (5 feet) of
the point where the flask hits takes 1 point of damage from the splash.
Temples to good deities sell holy water at cost (making no profit).
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
As above.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Use the function to do the hit, blast ETC
PHS_Grenade(d4(2), 1, VFX_IMP_HEAD_HOLY, VFX_IMP_PULSE_HOLY, DAMAGE_TYPE_DIVINE, RADIUS_SIZE_FEET_5, OBJECT_TYPE_CREATURE, RACIAL_TYPE_UNDEAD, RACIAL_TYPE_OUTSIDER, ALIGNMENT_EVIL);
}

View File

@@ -1,76 +0,0 @@
/*:://////////////////////////////////////////////
//:: Script Name Negative Energy Plane - Major - Heartbeat
//:: Script FileName PHS_OT_NegPlnMaj
//:://////////////////////////////////////////////
//:: File Notes
//:://////////////////////////////////////////////
Major Negative Energy Plane. Very unlucky if you end up here!
Description:
Negative-Dominant: Planes with this trait are vast, empty reaches that suck
the life out of travelers who cross them. They tend to be lonely, haunted
planes, drained of color and filled with winds bearing the soft moans of
those who died within them. As with positive-dominant planes,
negative-dominant planes can be either minor or major. On minor
negative-dominant planes, living creatures take 1d6 points of damage per
round. At 0 hit points or lower, they crumble into ash.
Major negative-dominant planes are even more severe. Each round, those
within must make a DC 25 Fortitude save or gain a negative level. A
creature whose negative levels equal its current levels or Hit Dice is
slain, becoming a wraith. The death ward spell protects a traveler from
the damage and energy drain of a negative-dominant plane.
Basically:
- Deals a negative level (delayed just in case of it not reacting correctly
to stacking) on a failed DC25 fortitude save, eachround.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Loop all objects in the area. DMs excepted.
object oTarget = GetFirstObjectInArea(OBJECT_SELF);
if(!GetIsObjectValid(oTarget)) return;
// Delcare effects - Negative Level
effect eVis = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
effect eNeg = EffectNegativeLevel(1);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
effect eLink = SupernaturalEffect(EffectLinkEffects(eNeg, eDur));
float fDuration;
// Loop all objects in the area. DMs excepted.
while(GetIsObjectValid(oTarget))
{
// Is it a creature? (Not a DM)
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE &&
PHS_CanCreatureBeDestroyed(oTarget))
{
// Are they dead? If yes, ignore.
if(!GetIsDead(oTarget))
{
// Immune to negative levels?
if(!PHS_ImmunityCheck(oTarget, IMMUNITY_TYPE_NEGATIVE_LEVEL))
{
// DC 25 fortitude save for a permanent negative level.
if(!PHS_NotSpellSavingThrow(SAVING_THROW_FORT, oTarget, 25, SAVING_THROW_TYPE_NEGATIVE))
{
// Fortitude save: Death
SendMessageToPC(oTarget, "You gain a negative level due to being on the negative plane.");
// Apply the negative level.
DelayCommand(0.1, PHS_ApplyPermanentAndVFX(oTarget, eVis, eLink));
}
}
}
}
// Get next object
oTarget = GetNextObjectInArea(OBJECT_SELF);
}
}

View File

@@ -1,129 +0,0 @@
/*:://////////////////////////////////////////////
//:: Script Name Positive Energy Plane - Major - Heartbeat
//:: Script FileName PHS_OT_PosiPlMaj
//:://////////////////////////////////////////////
//:: File Notes
//:://////////////////////////////////////////////
Major Positive Energy Plane heartbeat. For those unlucky enough to get here...
Description:
Positive-Dominant: An abundance of life characterizes planes with this trait.
The two kinds of positive-dominant traits are minor positive-dominant and
major positive-dominant.
A minor positive-dominant plane is a riotous explosion of life in all its
forms. Colors are brighter, fires are hotter, noises are louder, and
sensations are more intense as a result of the positive energy swirling
through the plane. All individuals in a positive-dominant plane gain fast
healing 2 as an extraordinary ability.
Major positive-dominant planes go even further. A creature on a major
positive-dominant plane must make a DC 15 Fortitude save to avoid being
blinded for 10 rounds by the brilliance of the surroundings. Simply being
on the plane grants fast healing 5 as an extraordinary ability. In addition,
those at full hit points gain 5 additional temporary hit points per round.
These temporary hit points fade 1d20 rounds after the creature leaves the
major positive- dominant plane. However, a creature must make a DC 20
Fortitude save each round that its temporary hit points exceed its normal
hit point total. Failing the saving throw results in the creature exploding
in a riot of energy, killing it.
Despite the beneficial effects of the plane, it is one of the most hostile
of the Inner Planes. An unprotected character on this plane swells with
power as positive energy is force-fed into her. Then, her mortal frame
unable to contain that power, she immolates as if she were a small planet
caught at the edge of a supernova. Visits to the Positive Energy Plane
are brief, and even then travelers must be heavily protected.
Basically:
- Heals 5HP per round.
- If at full health, provides 5HP bonus in temp HP.
- Saving throw based on how many temp HP bonuses are applied from this
area object.
- Temp HP is only added for 1d20 rounds, as per the description (Yes, it is
permanent in this realm, but it is hard to remove it otherwise!)
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Loop all objects in the area. DMs excepted.
object oTarget = GetFirstObjectInArea(OBJECT_SELF);
if(!GetIsObjectValid(oTarget)) return;
// Healing and Temp HP effect. Same VFX for each.
effect eVis = EffectVisualEffect(VFX_IMP_HEALING_G);
effect eHeal = EffectHeal(5);
effect eHP = EffectTemporaryHitpoints(5);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
effect eLink = SupernaturalEffect(EffectLinkEffects(eHP, eDur));
effect eBlind = SupernaturalEffect(EffectBlindness());
float fDuration;
// Loop all objects in the area. DMs excepted.
while(GetIsObjectValid(oTarget))
{
// Is it a creature? (Not a DM)
if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE &&
PHS_CanCreatureBeDestroyed(oTarget))
{
// Are they dead? If yes, ignore.
if(!GetIsDead(oTarget))
{
// DC 15 fortitude save for blindness for 10 rounds, if not
// already blinded or otherwise.
if(PHS_GetCanSee(oTarget))
{
// Temp HP, and save for death.
// Save first:
if(!PHS_NotSpellSavingThrow(SAVING_THROW_FORT, oTarget, 15, SAVING_THROW_TYPE_POSITIVE))
{
// Fortitude save: Death
SendMessageToPC(oTarget, "You are blinded for 10 rounds due to the brilliance of the positive plane.");
// Duration of 10 rounds
fDuration = PHS_GetDuration(PHS_ROUNDS, 10, FALSE);
PHS_ApplyDurationAndVFX(oTarget, eVis, eBlind, fDuration);
}
}
// Heal if below max HP
if(GetCurrentHitPoints(oTarget) < GetMaxHitPoints(oTarget))
{
// Tell them
SendMessageToPC(oTarget, "You are healed with massive positive energy flowing through your body.");
// Apply healing effect
PHS_ApplyInstantAndVFX(oTarget, eVis, eHeal);
}
else
{
// Temp HP, and save for death.
// Save first:
if(!PHS_NotSpellSavingThrow(SAVING_THROW_FORT, oTarget, 20, SAVING_THROW_TYPE_POSITIVE))
{
// Fortitude save: Death
SendMessageToPC(oTarget, "Your body explodes in a massive burst of positive energy.");
PHS_ApplyDeathByDamageAndVFX(oTarget, eVis, DAMAGE_TYPE_POSITIVE);
}
else
{
// Temp HP addition
SendMessageToPC(oTarget, "You gain temporary hit points with massive positive energy flowing through your body.");
// Duration of 1d20 rounds
fDuration = PHS_GetRandomDuration(PHS_ROUNDS, 20, 1, FALSE);
PHS_ApplyDurationAndVFX(oTarget, eVis, eLink, fDuration);
}
}
}
}
// Get next object
oTarget = GetNextObjectInArea(OBJECT_SELF);
}
}

View File

@@ -1,44 +0,0 @@
/*:://////////////////////////////////////////////
//:: Name Read
//:: FileName PHS_OT_Read
//:://////////////////////////////////////////////
//:: Notes
//:://////////////////////////////////////////////
When activated, as a spell (like Unique Power is) it will start an approprate
conversation for the book/scroll/whatever.
Includes "Explosive Runes" check too.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Declare major variables
object oSelf = OBJECT_SELF;
// Get conversation based on the item used tag
object oUsed = GetSpellCastItem();
if(GetIsObjectValid(oUsed))
{
// Get tag and activate "cnv_" + tag
string sConversastion = "cnv_" + GetTag(oUsed);
// Stop other things
ClearAllActions();
// Play some reading animation if it wasn't a scroll
if(GetBaseItemType(oUsed) != BASE_ITEM_SCROLL)
{
ActionPlayAnimation(ANIMATION_FIREFORGET_READ);
}
// See if Explosive Runes explode..
if(PHS_ExplosiveRunes()) return;
// Start the conversation with self.
ActionStartConversation(oSelf, sConversastion, TRUE, FALSE);
}
}

View File

@@ -1,118 +0,0 @@
/*:://////////////////////////////////////////////
//:: Name Trap Disarm
//:: FileName PHS_OT_Trapdisar
//:://////////////////////////////////////////////
//:: Notes
//:://////////////////////////////////////////////
When activated (When they know about a magical trap in the area) a rogue
or anyone can use this power on an item to diarm the trap from the perimeter.
They have a local int set on any AOE's (the magical traps) which are
detected by the PC.
Explosive runes and the like are detected if the item targeted has it, and
it is sucessfully detected. It will be disarmed if they detect it.
Item description:
Rogue only.
Use this tool on yourself to disarm magical traps you know about in the area
such as Symbol: Death. It requires you to be aware the magical trap is there
(visible runes and magical traps you always know about) and have a sucessful
Disarm Trap check against 25 + Spell level.
If you target an item, you check to see if has any Explosive Runes or similar
spells on it, and attempt to disarm them if it does. Once you know it has
Explosive runes upon it, use the tool again to disarm them, or attempt to.
The DC for this is also 25 + Spell level.
If you ever fail a Disarm Trap check and get a 1, you trigger the runes or
magical trap, and it goes off instantly as if you were the triggerer.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
// Disarm oTrap with special checks. Must be in fDistance meters to do so.
void ActionDisarmTheMagicTrap(object oTrap, float fDistance = 8.0, object oDisarmer = OBJECT_SELF);
void main()
{
// Declare major variables
object oSelf = OBJECT_SELF;
object oDisarm;
string sName = GetName(oSelf);
int nCnt = 1;
// Only PC's can disarm magical traps. No faries ETC
if(!GetIsPC(oSelf)) return;
// Only a rogue can use this
if(!GetLevelByClass(CLASS_TYPE_ROGUE, oSelf)) return;
// See if we know of any traps nearby. Loop until we find on in 20M
object oAOE = GetNearestObject(OBJECT_TYPE_AREA_OF_EFFECT, oSelf, nCnt);
while(GetIsObjectValid(oAOE) && GetDistanceToObject(oAOE) <= 20.0)
{
// Check if detected. PC's should have unique names.
if((GetLocalInt(oAOE, PHS_MAGICAL_TRAP_DETECTED_BY + sName) == TRUE ||
GetLocalInt(oAOE, PHS_MAGICAL_TRAP_ALWAYS_DETECTED) == TRUE) &&
GetLocalInt(oAOE, PHS_MAGICAL_TRAP_LEVEL) >= 1)
{
// Stop
oDisarm = oAOE;
break;
}
// Get next one
nCnt++;
oAOE = GetNearestObject(OBJECT_TYPE_AREA_OF_EFFECT, oSelf, nCnt);
}
// Is oDiarm valid?
if(GetIsObjectValid(oDisarm))
{
// The DC in each case is 25 + spell level, (EG: 31 for symbol of fear).
SendMessageToPC(oSelf, "You have detected a magical trap, so you plan on disarming it");
// Get the DC of the disarm check
}
else
{
}
}
// Disarm oTrap with special checks. Must be in fDistance meters to do so.
void ActionDisarmTheMagicTrap(object oTrap, float fDistance = 8.0, object oDisarmer = OBJECT_SELF)
{
// Make sure we are fDistance or nearer
if(GetDistanceToObject(oTrap) <= fDistance)
{
// Get DC and do a check
int nDC = GetLocalInt(oTrap, PHS_MAGICAL_TRAP_LEVEL);
if(GetIsSkillSuccessful(oDisarmer, SKILL_DISABLE_TRAP, nDC))
{
SendMessageToPC(oDisarmer, "PASS: You disable the magical trap with your tools.");
DestroyObject(oTrap);
}
else if(d20() == 1)
{
// Trap goes off!
SendMessageToPC(oDisarmer, "FAIL: You fail to disable the magical trap, and it goes off!");
}
else
{
// Fail to disable it but no trap goes off
SendMessageToPC(oDisarmer, "FAIL: You fail to disable the magical trap with your tools.");
}
}
else
{
FloatingTextStringOnCreature("You are too far away from the magical trap to disarm it", oDisarmer);
}
}

View File

@@ -1,32 +0,0 @@
/*:://////////////////////////////////////////////
//:: Spell Name
//:: Spell FileName
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
3E Spellcasting
Universal
Level: All 0
Components: V, S, M/DF
Casting Time: 1 standard action
Range: Personal
Target: You
This lets you read the book of knowledge - all there is to know about
casting spells in NwN and the 3.5E rules governing them. It pops up in
conversation form.
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Starts conversation (privatly, with self) for all information for spell
casting is.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
void main()
{
// Start conversation PHS_Magicoverview
ClearAllActions();
ActionStartConversation(OBJECT_SELF, "phs_magicoverview", TRUE, FALSE);
}

View File

@@ -1,63 +0,0 @@
/*:://////////////////////////////////////////////
//:: Spell Name Acid Splash
//:: Spell FileName PHS_S_AcidSplash
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
Conjuration (Creation) [Acid]
Level: Sor/Wiz 0
Components: V, S
Casting Time: 1 standard action
Range: Close (8M)
Effect: One missile of acid
Duration: Instantaneous
Saving Throw: None
Spell Resistance: No
You fire a small orb of acid at the target. You must succeed on a ranged
touch attack to hit your target. The orb deals 1d3 points of acid damage.
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Notes about this: No spell resistance or spell turning. Only check spell
immunity :-)
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Spell hook check.
if(!PHS_SpellHookCheck()) return;
//Declare major variables
object oCaster = OBJECT_SELF;
object oTarget = GetSpellTargetObject();
int nMetaMagic = PHS_GetMetaMagicFeat();
// Requires a touch attack
int nTouch = PHS_SpellTouchAttack(PHS_TOUCH_RAY, oTarget, TRUE);
// Damage + Double for a critical hit.
int nDamage = PHS_MaximizeOrEmpower(3, 1, nMetaMagic, FALSE, nTouch);
// Declare Effects
effect eVis = EffectVisualEffect(VFX_IMP_ACID_S);
// Check PvP
if(!GetIsReactionTypeFriendly(oTarget) &&
// Make sure they are not immune to spells
!PHS_TotalSpellImmunity(oTarget))
{
// Fire cast spell at event for the specified target
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_ACID_SPLASH);
// Do we even hit?
if(nTouch)
{
//Apply the VFX impact and damage effect
PHS_ApplyDamageVFXToObject(oTarget, eVis, nDamage, DAMAGE_TYPE_ACID);
}
// Else we miss - do nothing
}
}

Some files were not shown because too many files have changed in this diff Show More