2025/07/22 Update

Updated ruleset.2da.
Drug Resistance should be able to target the caster.
Changed crafting constants for better compatibility with nwn_script_comp.
Made Mirror Image work better.
This commit is contained in:
Jaysyn904 2025-07-22 21:35:53 -04:00
parent 78615c847f
commit 2181120567
11 changed files with 1217 additions and 324 deletions

View File

@ -25,7 +25,7 @@
21 GOOD_AIM_MODIFIER 1 21 GOOD_AIM_MODIFIER 1
22 STUNNING_FIST_TO_HIT_MODIFIER -4 22 STUNNING_FIST_TO_HIT_MODIFIER -4
23 STUNNING_FIST_DAMAGE_MODIFIER -4 23 STUNNING_FIST_DAMAGE_MODIFIER -4
24 STUNNING_FIST_EFFECT_DURATION 6 24 STUNNING_FIST_EFFECT_DURATION 6.0
25 STUNNING_FIST_BASE_SAVE_DC 10 25 STUNNING_FIST_BASE_SAVE_DC 10
26 CRIPPLING_STRIKE_STRENGTH_MODIFIER 2 26 CRIPPLING_STRIKE_STRENGTH_MODIFIER 2
27 **** **** 27 **** ****
@ -336,12 +336,12 @@
332 SKILL_EXAMINE_TRAP_DURATION 4.5f 332 SKILL_EXAMINE_TRAP_DURATION 4.5f
333 SKILL_OPEN_LOCK_DURATION 4.5f 333 SKILL_OPEN_LOCK_DURATION 4.5f
334 SKILL_LOCK_DURATION 4.5f 334 SKILL_LOCK_DURATION 4.5f
335 SKILL_HIDE_IN_PLAIN_SIGHT_COOLDOWN 6 335 SKILL_HIDE_IN_PLAIN_SIGHT_COOLDOWN 3000
336 SKILL_TAUNT_COOLDOWN 6000 336 SKILL_TAUNT_COOLDOWN 6000
337 SKILL_PICKPOCKET_COOLDOWN 6000 337 SKILL_PICKPOCKET_COOLDOWN 6000
338 SKILL_ANIMAL_EMPATHY_COOLDOWN 6000 338 SKILL_ANIMAL_EMPATHY_COOLDOWN 6000
339 ENCOUNTERS_ON_ENTER_FIRE_BEFORE_SPAWN 0 339 ENCOUNTERS_ON_ENTER_FIRE_BEFORE_SPAWN 0
340 **** **** 340 MONK_SPELL_RESISTANCE_CAN_BE_LOWERED 0
341 **** **** 341 **** ****
342 **** **** 342 **** ****
343 **** **** 343 **** ****
@ -522,3 +522,4 @@
518 CHARGEN_ENABLE_RECOMMENDED_BUTTON 0 518 CHARGEN_ENABLE_RECOMMENDED_BUTTON 0
519 MULTICLASS_LIMIT 8 519 MULTICLASS_LIMIT 8
520 ALL_ASSOCIATES_CAN_INTERACT 0 520 ALL_ASSOCIATES_CAN_INTERACT 0
521 EMOTE_ANIMATIONS_USE_MDL_TIMINGS 0

View File

@ -2545,7 +2545,7 @@
2541 DEVILS_EYE 16829518 is_devils_eye D P vs 0x38 0x09 sp_devils_eye **** 3 **** **** **** 3 3 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEGRDEVIL01 VS_CHANT_EVOC_HM VS_CHANT_EVOC_HF self 1000 **** **** **** c_devil_hit1 0 **** **** **** **** **** **** **** **** **** **** **** **** 10 **** 1 16829519 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** **** **** **** **** **** **** 2541 DEVILS_EYE 16829518 is_devils_eye D P vs 0x38 0x09 sp_devils_eye **** 3 **** **** **** 3 3 1500 head VCO_MEHEDEVIL01 **** **** SCO_MEGRDEVIL01 VS_CHANT_EVOC_HM VS_CHANT_EVOC_HF self 1000 **** **** **** c_devil_hit1 0 **** **** **** **** **** **** **** **** **** **** **** **** 10 **** 1 16829519 1 0 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2 **** **** **** **** **** **** ****
2542 DEVILS_TAIL 16829520 **** T **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 16829521 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2542 DEVILS_TAIL 16829520 **** T **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 16829521 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2543 DREAD_WORD 16829522 is_dread_word V S v 0x1d 0x0a sp_dread_word **** **** **** **** **** 3 3 1500 hand **** VCO_MEHANEVIL02 **** SCO_MEHANEVIL02 VS_CHANT_EVOC_LM VS_CHANT_EVOC_LF out 1000 **** VCA_OUTNEG **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 1 16829523 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2543 DREAD_WORD 16829522 is_dread_word V S v 0x1d 0x0a sp_dread_word **** **** **** **** **** 3 3 1500 hand **** VCO_MEHANEVIL02 **** SCO_MEHANEVIL02 VS_CHANT_EVOC_LM VS_CHANT_EVOC_LF out 1000 **** VCA_OUTNEG **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** 2 **** 1 16829523 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2544 DRUG_RESISTANCE 16829524 is_drug_resist E T v 0x18 0x0a sp_drug_resist **** 1 **** **** **** 1 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** 2544 DRUG_RESISTANCE 16829524 is_drug_resist E T v 0x18 0x0b sp_drug_resist **** 1 **** **** **** 1 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 **** **** **** **** **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** ****
2545 ECTOPLASMIC_ENCHANCEMENT 16829526 is_ecto_enhnc N S vs 0x38 0x0c sp_ecto_enhnc **** **** **** **** **** 6 6 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEGRDEVIL01 VS_CHANT_NECR_HM vs_chant_necr_hf Area 1000 **** VCA_OUTNEG **** SDR_GLOBEMAX 0 **** **** **** **** **** **** **** **** **** **** **** **** 8 **** 1 16829527 1 0 **** 0 **** **** **** **** sphere 6.67 **** 4 **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2545 ECTOPLASMIC_ENCHANCEMENT 16829526 is_ecto_enhnc N S vs 0x38 0x0c sp_ecto_enhnc **** **** **** **** **** 6 6 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEGRDEVIL01 VS_CHANT_NECR_HM vs_chant_necr_hf Area 1000 **** VCA_OUTNEG **** SDR_GLOBEMAX 0 **** **** **** **** **** **** **** **** **** **** **** **** 8 **** 1 16829527 1 0 **** 0 **** **** **** **** sphere 6.67 **** 4 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2546 ETERNITY_OF_TORTURE 16829528 is_etern_tortr N S vs 0x38 0x0a sp_etern_tortr **** **** **** **** **** **** 9 1500 head VCO_MEHEDEVIL01 **** VCO_LGRINEVIL01 SCO_LGSPREVIL01 VS_CHANT_NECR_LM VS_CHANT_NECR_LF out 1000 **** **** **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829529 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 2546 ETERNITY_OF_TORTURE 16829528 is_etern_tortr N S vs 0x38 0x0a sp_etern_tortr **** **** **** **** **** **** 9 1500 head VCO_MEHEDEVIL01 **** VCO_LGRINEVIL01 SCO_LGSPREVIL01 VS_CHANT_NECR_LM VS_CHANT_NECR_LF out 1000 **** **** **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829529 1 0 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
2547 EVIL_EYE 16829530 is_evil_eye E S s 0x28 0x0a sp_evil_eye **** **** **** **** **** 3 3 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEHANEVIL01 VS_CHANT_ENCH_HM VS_CHANT_ENCH_HF out 1000 **** VCA_OUTEVIL01 **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829531 1 0 **** 1 **** **** **** **** **** **** **** **** 3 **** **** **** **** **** **** **** **** **** **** **** **** **** 2547 EVIL_EYE 16829530 is_evil_eye E S s 0x28 0x0a sp_evil_eye **** **** **** **** **** 3 3 1500 hand **** VCO_MEHANEVIL01 **** SCO_MEHANEVIL01 VS_CHANT_ENCH_HM VS_CHANT_ENCH_HF out 1000 **** VCA_OUTEVIL01 **** SCA_OUTNEG 0 **** **** **** **** **** **** 1 **** **** **** **** **** 2 **** 1 16829531 1 0 **** 1 **** **** **** **** **** **** **** **** 3 **** **** **** **** **** **** **** **** **** **** **** **** ****
@ -4402,7 +4402,7 @@
4398 Sorcerer_Disguise_Self_QS1 16830731 is_Disguise1 I P vs 0x3a 0x01 prc_SORC_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 4395 3 16822661 1 0 **** 0 460597177 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4398 Sorcerer_Disguise_Self_QS1 16830731 is_Disguise1 I P vs 0x3a 0x01 prc_SORC_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 4395 3 16822661 1 0 **** 0 460597177 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
4399 Sorcerer_Disguise_Self_QS2 16830732 is_Disguise2 I P vs 0x3a 0x01 prc_SORC_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 4395 3 16822661 1 0 **** 0 460662713 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4399 Sorcerer_Disguise_Self_QS2 16830732 is_Disguise2 I P vs 0x3a 0x01 prc_SORC_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 4395 3 16822661 1 0 **** 0 460662713 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
4400 Sorcerer_Disguise_Self_QS3 16830733 is_Disguise3 I P vs 0x3a 0x01 prc_SORC_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 4395 3 16822661 1 0 **** 0 460728249 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4400 Sorcerer_Disguise_Self_QS3 16830733 is_Disguise3 I P vs 0x3a 0x01 prc_SORC_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 4395 3 16822661 1 0 **** 0 460728249 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
4401 Sorcerer_DRUG_RESISTANCE 16830734 is_drug_resist E T v 0x18 0x0a prc_SORC_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 10170 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4401 Sorcerer_DRUG_RESISTANCE 16830734 is_drug_resist E T v 0x18 0x0b prc_SORC_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 10170 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
4402 Sorcerer_Endure_Elements 16830735 is_EndElem A T vs 0x3a 0x2B prc_SORC_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 10171 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4402 Sorcerer_Endure_Elements 16830735 is_EndElem A T vs 0x3a 0x2B prc_SORC_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 10171 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
4403 Sorcerer_ENLARGE_PERSON 16830736 is_Enlarge T S vs 0x3a 0x0B prc_SORC_sp_gen **** **** **** **** **** **** 1 1500 head **** **** **** **** vs_chant_ench_hm vs_chant_ench_hf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 9 **** 1 16829173 1 0 **** 0 10172 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4403 Sorcerer_ENLARGE_PERSON 16830736 is_Enlarge T S vs 0x3a 0x0B prc_SORC_sp_gen **** **** **** **** **** **** 1 1500 head **** **** **** **** vs_chant_ench_hm vs_chant_ench_hf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 9 **** 1 16829173 1 0 **** 0 10172 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
4404 Sorcerer_Expeditious_Retreat 16830737 is_X1ExpRet T P vs 0x3a 0x09 prc_SORC_sp_gen **** **** **** **** **** **** 1 1500 head **** **** vco_megrdodd01 sco_megrdodd01 vs_chant_ench_hm vs_chant_ench_hf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 **** 1 2676 1 0 **** 0 10173 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 4404 Sorcerer_Expeditious_Retreat 16830737 is_X1ExpRet T P vs 0x3a 0x09 prc_SORC_sp_gen **** **** **** **** **** **** 1 1500 head **** **** vco_megrdodd01 sco_megrdodd01 vs_chant_ench_hm vs_chant_ench_hf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 **** 1 2676 1 0 **** 0 10173 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
@ -5308,9 +5308,9 @@
5304 Ocular_Adept_Quickened_Doom 16831637 is_Doom E M vs 0x3a 0x2A prc_OCU_qu_gen **** **** **** **** **** **** 5 0 head vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf touch 0 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 10882 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 5304 Ocular_Adept_Quickened_Doom 16831637 is_Doom E M vs 0x3a 0x2A prc_OCU_qu_gen **** **** **** **** **** **** 5 0 head vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf touch 0 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 10882 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
5305 Ocular_Adept_Silent_Doom 16831638 is_Doom E M vs 0x3a 0x2A prc_OCU_si_gen **** **** **** **** **** **** 2 1500 head vco_mehedodd01 **** **** **** **** **** touch 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 10883 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 5305 Ocular_Adept_Silent_Doom 16831638 is_Doom E M vs 0x3a 0x2A prc_OCU_si_gen **** **** **** **** **** **** 2 1500 head vco_mehedodd01 **** **** **** **** **** touch 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 10883 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
5306 Ocular_Adept_Still_Doom 16831639 is_Doom E M vs 0x3a 0x2A prc_OCU_st_gen **** **** **** **** **** **** 2 1500 **** vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf **** 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 10884 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 5306 Ocular_Adept_Still_Doom 16831639 is_Doom E M vs 0x3a 0x2A prc_OCU_st_gen **** **** **** **** **** **** 2 1500 **** vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf **** 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 10884 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
5307 Ocular_Adept_DRUG_RESISTANCE 16831640 is_drug_resist E T v 0x18 0x0a prc_OCU_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 10885 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 5307 Ocular_Adept_DRUG_RESISTANCE 16831640 is_drug_resist E T v 0x18 0x0b prc_OCU_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 10885 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
5308 Ocular_Adept_Quickened_DRUG_RESISTANCE 16831641 is_drug_resist E T v 0x18 0x0a prc_OCU_qu_gen **** **** **** **** **** **** 5 0 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 0 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 10886 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 5308 Ocular_Adept_Quickened_DRUG_RESISTANCE 16831641 is_drug_resist E T v 0x18 0x0b prc_OCU_qu_gen **** **** **** **** **** **** 5 0 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 0 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 10886 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
5309 Ocular_Adept_Silent_DRUG_RESISTANCE 16831642 is_drug_resist E T v 0x18 0x0a prc_OCU_si_gen **** **** **** **** **** **** 2 1500 hand **** VCO_MEHANHEAL02 **** **** **** **** touch 1000 **** VCA_OUTHOLY01 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 10887 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 5309 Ocular_Adept_Silent_DRUG_RESISTANCE 16831642 is_drug_resist E T v 0x18 0x0b prc_OCU_si_gen **** **** **** **** **** **** 2 1500 hand **** VCO_MEHANHEAL02 **** **** **** **** touch 1000 **** VCA_OUTHOLY01 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 10887 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
5310 Ocular_Adept_Endure_Elements 16831643 is_EndElem A T vs 0x3a 0x2B prc_OCU_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 10888 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 5310 Ocular_Adept_Endure_Elements 16831643 is_EndElem A T vs 0x3a 0x2B prc_OCU_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 10888 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
5311 Ocular_Adept_Exteneded_Endure_Elements 16831644 is_EndElem A T vs 0x3a 0x2B prc_OCU_ex_gen **** **** **** **** **** **** 2 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 10889 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 5311 Ocular_Adept_Exteneded_Endure_Elements 16831644 is_EndElem A T vs 0x3a 0x2B prc_OCU_ex_gen **** **** **** **** **** **** 2 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 10889 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
5312 Ocular_Adept_Quickened_Endure_Elements 16831645 is_EndElem A T vs 0x3a 0x2B prc_OCU_qu_gen **** **** **** **** **** **** 5 0 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 10890 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 5312 Ocular_Adept_Quickened_Endure_Elements 16831645 is_EndElem A T vs 0x3a 0x2B prc_OCU_qu_gen **** **** **** **** **** **** 5 0 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 10890 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
@ -6575,8 +6575,8 @@
6571 CultistShatteredP_Rouse 16840207 is_mscharm E S vs 0x38 0x0c prc_CULTS_sp_gen **** **** **** **** **** **** 1 1500 hand **** **** **** **** vs_chant_ench_hm vs_chant_ench_hf up 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 0 **** **** **** **** **** 23 **** 1 16826684 1 0 **** 0 11993 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6571 CultistShatteredP_Rouse 16840207 is_mscharm E S vs 0x38 0x0c prc_CULTS_sp_gen **** **** **** **** **** **** 1 1500 hand **** **** **** **** vs_chant_ench_hm vs_chant_ench_hf up 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 0 **** **** **** **** **** 23 **** 1 16826684 1 0 **** 0 11993 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6572 CultistShatteredP_Silent_Rouse 16840208 is_mscharm E S vs 0x38 0x0c prc_CULTS_si_gen **** **** **** **** **** **** 2 1500 hand **** **** **** **** **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 0 **** **** **** **** **** 23 **** 1 16826684 1 0 **** 0 11994 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6572 CultistShatteredP_Silent_Rouse 16840208 is_mscharm E S vs 0x38 0x0c prc_CULTS_si_gen **** **** **** **** **** **** 2 1500 hand **** **** **** **** **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 0 **** **** **** **** **** 23 **** 1 16826684 1 0 **** 0 11994 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6573 CultistShatteredP_Still_Rouse 16840209 is_mscharm E S vs 0x38 0x0c prc_CULTS_st_gen **** **** **** **** **** **** 2 1500 **** **** **** **** **** vs_chant_ench_hm vs_chant_ench_hf **** 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 0 **** **** **** **** **** 23 **** 1 16826684 1 0 **** 0 11995 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6573 CultistShatteredP_Still_Rouse 16840209 is_mscharm E S vs 0x38 0x0c prc_CULTS_st_gen **** **** **** **** **** **** 2 1500 **** **** **** **** **** vs_chant_ench_hm vs_chant_ench_hf **** 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 0 **** **** **** **** **** 23 **** 1 16826684 1 0 **** 0 11995 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6574 CultistShatteredP_DRUG_RESISTANCE 16840210 is_drug_resist E T v 0x18 0x0a prc_CULTS_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 11996 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6574 CultistShatteredP_DRUG_RESISTANCE 16840210 is_drug_resist E T v 0x18 0x0b prc_CULTS_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 11996 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6575 CultistShatteredP_Silent_DRUG_RESISTANCE 16840211 is_drug_resist E T v 0x18 0x0a prc_CULTS_si_gen **** **** **** **** **** **** 2 1500 hand **** VCO_MEHANHEAL02 **** **** **** **** touch 1000 **** VCA_OUTHOLY01 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 11997 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6575 CultistShatteredP_Silent_DRUG_RESISTANCE 16840211 is_drug_resist E T v 0x18 0x0b prc_CULTS_si_gen **** **** **** **** **** **** 2 1500 hand **** VCO_MEHANHEAL02 **** **** **** **** touch 1000 **** VCA_OUTHOLY01 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 11997 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6576 CultistShatteredP_Nybors_Gentle_Reminder 16840212 is_nybgentrem E S vs 0x3a 0x0a prc_CULTS_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehanmind01 **** sco_mehanmind01 vs_chant_ench_lm vs_chant_ench_lf out 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830442 1 0 **** 1 11998 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6576 CultistShatteredP_Nybors_Gentle_Reminder 16840212 is_nybgentrem E S vs 0x3a 0x0a prc_CULTS_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehanmind01 **** sco_mehanmind01 vs_chant_ench_lm vs_chant_ench_lf out 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830442 1 0 **** 1 11998 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6577 CultistShatteredP_Exteneded_Nybors_Gentle_Reminder 16840213 is_nybgentrem E S vs 0x3a 0x0a prc_CULTS_ex_gen **** **** **** **** **** **** 2 1500 hand **** vco_mehanmind01 **** sco_mehanmind01 vs_chant_ench_lm vs_chant_ench_lf out 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830442 1 0 **** 1 11999 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6577 CultistShatteredP_Exteneded_Nybors_Gentle_Reminder 16840213 is_nybgentrem E S vs 0x3a 0x0a prc_CULTS_ex_gen **** **** **** **** **** **** 2 1500 hand **** vco_mehanmind01 **** sco_mehanmind01 vs_chant_ench_lm vs_chant_ench_lf out 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830442 1 0 **** 1 11999 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6578 CultistShatteredP_Silent_Nybors_Gentle_Reminder 16840214 is_nybgentrem E S vs 0x3a 0x0a prc_CULTS_si_gen **** **** **** **** **** **** 2 1500 hand **** vco_mehanmind01 **** **** **** **** out 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830442 1 0 **** 1 12000 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6578 CultistShatteredP_Silent_Nybors_Gentle_Reminder 16840214 is_nybgentrem E S vs 0x3a 0x0a prc_CULTS_si_gen **** **** **** **** **** **** 2 1500 hand **** vco_mehanmind01 **** **** **** **** out 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830442 1 0 **** 1 12000 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
@ -6667,7 +6667,7 @@
6663 Beguiler_Disguise_Self_QS1 16840299 is_Disguise1 I P vs 0x3a 0x01 prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 6660 3 16822661 1 0 **** 0 484781857 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6663 Beguiler_Disguise_Self_QS1 16840299 is_Disguise1 I P vs 0x3a 0x01 prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 6660 3 16822661 1 0 **** 0 484781857 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6664 Beguiler_Disguise_Self_QS2 16840300 is_Disguise2 I P vs 0x3a 0x01 prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 6660 3 16822661 1 0 **** 0 484847393 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6664 Beguiler_Disguise_Self_QS2 16840300 is_Disguise2 I P vs 0x3a 0x01 prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 6660 3 16822661 1 0 **** 0 484847393 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6665 Beguiler_Disguise_Self_QS3 16840301 is_Disguise3 I P vs 0x3a 0x01 prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 6660 3 16822661 1 0 **** 0 484912929 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6665 Beguiler_Disguise_Self_QS3 16840301 is_Disguise3 I P vs 0x3a 0x01 prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1528 head vco_smhannatr01 **** **** sco_mehannatr01 **** **** up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 6660 3 16822661 1 0 **** 0 484912929 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6666 Beguiler_DRUG_RESISTANCE 16840302 is_drug_resist E T v 0x18 0x0a prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 12066 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6666 Beguiler_DRUG_RESISTANCE 16840302 is_drug_resist E T v 0x18 0x0b prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 12066 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6667 Beguiler_Expeditious_Retreat 16840303 is_X1ExpRet T P vs 0x3a 0x09 prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1500 head **** **** vco_megrdodd01 sco_megrdodd01 vs_chant_ench_hm vs_chant_ench_hf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 **** 1 2676 1 0 **** 0 12067 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6667 Beguiler_Expeditious_Retreat 16840303 is_X1ExpRet T P vs 0x3a 0x09 prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1500 head **** **** vco_megrdodd01 sco_megrdodd01 vs_chant_ench_hm vs_chant_ench_hf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 **** 1 2676 1 0 **** 0 12067 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6668 Beguiler_Mage_Armor 16840304 is_MageArm C T vs 0x3a 0x2B prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 16830210 1 0 **** 0 12068 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6668 Beguiler_Mage_Armor 16840304 is_MageArm C T vs 0x3a 0x2B prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 16830210 1 0 **** 0 12068 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
6669 Beguiler_Nybors_Gentle_Reminder 16840305 is_nybgentrem E S vs 0x3a 0x0a prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehanmind01 **** sco_mehanmind01 vs_chant_ench_lm vs_chant_ench_lf out 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830442 1 0 **** 1 12069 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 6669 Beguiler_Nybors_Gentle_Reminder 16840305 is_nybgentrem E S vs 0x3a 0x0a prc_BEGUI_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehanmind01 **** sco_mehanmind01 vs_chant_ench_lm vs_chant_ench_lf out 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830442 1 0 **** 1 12069 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
@ -8009,7 +8009,7 @@
8005 ****_DETECT_UNDEAD 16841641 is_detect_evil D M vs 0x3a 0x09 prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 head **** **** **** **** **** **** out 1000 **** vco_gazeevil **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 16832271 1 0 **** 0 13269 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8005 ****_DETECT_UNDEAD 16841641 is_detect_evil D M vs 0x3a 0x09 prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 head **** **** **** **** **** **** out 1000 **** vco_gazeevil **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 16832271 1 0 **** 0 13269 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8006 ****_Divine_Favor 16841642 is_X1DivFav V P vs 0x3a 0x09 prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_smhanholy01 **** sco_mehanholy01 vs_chant_ench_lm vs_chant_ench_lf area 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 0 **** **** **** **** **** 9 **** 1 54 1 0 **** 0 13270 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8006 ****_Divine_Favor 16841642 is_X1DivFav V P vs 0x3a 0x09 prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_smhanholy01 **** sco_mehanholy01 vs_chant_ench_lm vs_chant_ench_lf area 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 0 **** **** **** **** **** 9 **** 1 54 1 0 **** 0 13270 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8007 ****_Doom 16841643 is_Doom E M vs 0x3a 0x2A prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 head vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf touch 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 13271 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8007 ****_Doom 16841643 is_Doom E M vs 0x3a 0x2A prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 head vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf touch 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 13271 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8008 ****_DRUG_RESISTANCE 16841644 is_drug_resist E T v 0x18 0x0a prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 13272 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8008 ****_DRUG_RESISTANCE 16841644 is_drug_resist E T v 0x18 0x0b prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 13272 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8009 ****_Endure_Elements 16841645 is_EndElem A T vs 0x3a 0x2B prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 13273 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8009 ****_Endure_Elements 16841645 is_EndElem A T vs 0x3a 0x2B prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 13273 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8010 ****_Entropic_Shield 16841646 is_X1EShield A P vs 0x3a 0x09 prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 521 1 0 **** 0 13274 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8010 ****_Entropic_Shield 16841646 is_X1EShield A P vs 0x3a 0x09 prc_MYST_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 521 1 0 **** 0 13274 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8011 ****_EXTRACT_DRUG 16841647 is_extract_drug C P vs 0x38 0x09 prc_radialbug **** **** **** **** **** **** 1 1500 hand **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 8012 8013 8014 8015 **** **** **** **** 16829541 **** **** **** **** 13275 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8011 ****_EXTRACT_DRUG 16841647 is_extract_drug C P vs 0x38 0x09 prc_radialbug **** **** **** **** **** **** 1 1500 hand **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 8012 8013 8014 8015 **** **** **** **** 16829541 **** **** **** **** 13275 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
@ -8548,9 +8548,9 @@
8544 Archivist_Quickened_Doom 16842180 is_Doom E M vs 0x3a 0x2A prc_ARCHV_qu_gen **** **** **** **** **** **** 5 0 head vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf touch 0 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 13699 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8544 Archivist_Quickened_Doom 16842180 is_Doom E M vs 0x3a 0x2A prc_ARCHV_qu_gen **** **** **** **** **** **** 5 0 head vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf touch 0 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 13699 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8545 Archivist_Silent_Doom 16842181 is_Doom E M vs 0x3a 0x2A prc_ARCHV_si_gen **** **** **** **** **** **** 2 1500 head vco_mehedodd01 **** **** **** **** **** touch 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 13700 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8545 Archivist_Silent_Doom 16842181 is_Doom E M vs 0x3a 0x2A prc_ARCHV_si_gen **** **** **** **** **** **** 2 1500 head vco_mehedodd01 **** **** **** **** **** touch 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 13700 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8546 Archivist_Still_Doom 16842182 is_Doom E M vs 0x3a 0x2A prc_ARCHV_st_gen **** **** **** **** **** **** 2 1500 **** vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf **** 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 13701 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8546 Archivist_Still_Doom 16842182 is_Doom E M vs 0x3a 0x2A prc_ARCHV_st_gen **** **** **** **** **** **** 2 1500 **** vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf **** 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 13701 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8547 Archivist_DRUG_RESISTANCE 16842183 is_drug_resist E T v 0x18 0x0a prc_ARCHV_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 13702 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8547 Archivist_DRUG_RESISTANCE 16842183 is_drug_resist E T v 0x18 0x0b prc_ARCHV_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 13702 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8548 Archivist_Quickened_DRUG_RESISTANCE 16842184 is_drug_resist E T v 0x18 0x0a prc_ARCHV_qu_gen **** **** **** **** **** **** 5 0 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 0 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 13703 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8548 Archivist_Quickened_DRUG_RESISTANCE 16842184 is_drug_resist E T v 0x18 0x0b prc_ARCHV_qu_gen **** **** **** **** **** **** 5 0 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 0 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 13703 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8549 Archivist_Silent_DRUG_RESISTANCE 16842185 is_drug_resist E T v 0x18 0x0a prc_ARCHV_si_gen **** **** **** **** **** **** 2 1500 hand **** VCO_MEHANHEAL02 **** **** **** **** touch 1000 **** VCA_OUTHOLY01 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 13704 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8549 Archivist_Silent_DRUG_RESISTANCE 16842185 is_drug_resist E T v 0x18 0x0b prc_ARCHV_si_gen **** **** **** **** **** **** 2 1500 hand **** VCO_MEHANHEAL02 **** **** **** **** touch 1000 **** VCA_OUTHOLY01 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 13704 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8550 Archivist_Endure_Elements 16842186 is_EndElem A T vs 0x3a 0x2B prc_ARCHV_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 13705 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8550 Archivist_Endure_Elements 16842186 is_EndElem A T vs 0x3a 0x2B prc_ARCHV_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 13705 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8551 Archivist_Exteneded_Endure_Elements 16842187 is_EndElem A T vs 0x3a 0x2B prc_ARCHV_ex_gen **** **** **** **** **** **** 2 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 13706 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8551 Archivist_Exteneded_Endure_Elements 16842187 is_EndElem A T vs 0x3a 0x2B prc_ARCHV_ex_gen **** **** **** **** **** **** 2 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 13706 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
8552 Archivist_Quickened_Endure_Elements 16842188 is_EndElem A T vs 0x3a 0x2B prc_ARCHV_qu_gen **** **** **** **** **** **** 5 0 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 13707 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 8552 Archivist_Quickened_Endure_Elements 16842188 is_EndElem A T vs 0x3a 0x2B prc_ARCHV_qu_gen **** **** **** **** **** **** 5 0 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 13707 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
@ -12360,7 +12360,7 @@
12356 Favoured_Soul_DETECT_UNDEAD 16845992 is_detect_evil D M vs 0x3a 0x09 prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 head **** **** **** **** **** **** out 1000 **** vco_gazeevil **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 16832271 1 0 **** 0 16792 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 12356 Favoured_Soul_DETECT_UNDEAD 16845992 is_detect_evil D M vs 0x3a 0x09 prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 head **** **** **** **** **** **** out 1000 **** vco_gazeevil **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 1 16832271 1 0 **** 0 16792 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
12357 Favoured_Soul_Divine_Favor 16845993 is_X1DivFav V P vs 0x3a 0x09 prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_smhanholy01 **** sco_mehanholy01 vs_chant_ench_lm vs_chant_ench_lf area 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 0 **** **** **** **** **** 9 **** 1 54 1 0 **** 0 16793 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 12357 Favoured_Soul_Divine_Favor 16845993 is_X1DivFav V P vs 0x3a 0x09 prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_smhanholy01 **** sco_mehanholy01 vs_chant_ench_lm vs_chant_ench_lf area 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 0 **** **** **** **** **** 9 **** 1 54 1 0 **** 0 16793 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
12358 Favoured_Soul_Doom 16845994 is_Doom E M vs 0x3a 0x2A prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 head vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf touch 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 16794 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 12358 Favoured_Soul_Doom 16845994 is_Doom E M vs 0x3a 0x2A prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 head vco_mehedodd01 **** **** sco_mehedodd01 vs_chant_ench_lm vs_chant_ench_lf touch 1000 **** **** **** **** 0 **** **** **** **** **** Mind_Affecting 1 **** **** **** **** **** 2 **** 1 16830215 1 0 **** 1 16794 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
12359 Favoured_Soul_DRUG_RESISTANCE 16845995 is_drug_resist E T v 0x18 0x0a prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 16795 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 12359 Favoured_Soul_DRUG_RESISTANCE 16845995 is_drug_resist E T v 0x18 0x0b prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 hand **** VCO_MEHANHEAL02 **** SCO_MEHANMIND01 VS_CHANT_ENCH_LM VS_CHANT_ENCH_LF touch 1000 **** VCA_OUTHOLY01 **** SDR_SANCTUARY 0 **** **** **** **** **** **** **** **** **** **** **** **** 9 **** 1 16829525 1 0 **** 0 16795 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
12360 Favoured_Soul_Endure_Elements 16845996 is_EndElem A T vs 0x3a 0x2B prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 16796 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 12360 Favoured_Soul_Endure_Elements 16845996 is_EndElem A T vs 0x3a 0x2B prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_mehannatr02 **** sco_mehannatr02 vs_chant_conj_lm vs_chant_conj_lf up 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 6147 1 0 **** 0 16796 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
12361 Favoured_Soul_Entropic_Shield 16845997 is_X1EShield A P vs 0x3a 0x09 prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 521 1 0 **** 0 16797 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 12361 Favoured_Soul_Entropic_Shield 16845997 is_X1EShield A P vs 0x3a 0x09 prc_FAVSO_sp_gen **** **** **** **** **** **** 1 1500 hand **** vco_smhanelec01 **** sco_mehanelec01 vs_chant_conj_lm vs_chant_conj_lf self 1000 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 13 **** 1 521 1 0 **** 0 16797 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
12362 Favoured_Soul_EXTRACT_DRUG 16845998 is_extract_drug C P vs 0x38 0x09 prc_radialbug **** **** **** **** **** **** 1 1500 hand **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 12363 12364 12365 12366 **** **** **** **** 16829541 **** **** **** **** 16798 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 12362 Favoured_Soul_EXTRACT_DRUG 16845998 is_extract_drug C P vs 0x38 0x09 prc_radialbug **** **** **** **** **** **** 1 1500 hand **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 12363 12364 12365 12366 **** **** **** **** 16829541 **** **** **** **** 16798 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****

View File

@ -173,7 +173,7 @@
169 AOE_PER_PYROTECHNICS_SMOKE C 6.096 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 169 AOE_PER_PYROTECHNICS_SMOKE C 6.096 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
170 AOE_PER_FIRE_TRAP C 1.524 **** **** sp_fire_trapA **** **** 0 **** vps_delfireb vps_delfireb vps_delfireb 5 5 5 3400 1100 1900 0 0 0.25 **** sps_delfireb **** **** **** vps_delfireb_L vps_delfireb_L vps_delfireb_L 170 AOE_PER_FIRE_TRAP C 1.524 **** **** sp_fire_trapA **** **** 0 **** vps_delfireb vps_delfireb vps_delfireb 5 5 5 3400 1100 1900 0 0 0.25 **** sps_delfireb **** **** **** vps_delfireb_L vps_delfireb_L vps_delfireb_L
171 VFX_PER_PRISMATIC_WALL R **** 15 1 sp_prism_wallA **** **** **** 891 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 171 VFX_PER_PRISMATIC_WALL R **** 15 1 sp_prism_wallA **** **** **** 891 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
172 VFX_MOB_RING_OF_BLADES C 1.524 **** **** sp_ring_bldsa **** sp_ring_bldsC **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 172 VFX_MOB_RING_OF_BLADES C 1.524 **** **** sp_ring_bldsa **** sp_ring_bldsc **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
173 VFX_PER_PRISMATIC_SPHERE C 3.048 **** **** sp_prismt_sphrA sp_prismt_sphrB **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 173 VFX_PER_PRISMATIC_SPHERE C 3.048 **** **** sp_prismt_sphrA sp_prismt_sphrB **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
174 VFX_PER_OTILUKES_RESILIENT_SPHERE C 3.048 **** **** sp_otiluke_rsA sp_otiluke_rsB **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 174 VFX_PER_OTILUKES_RESILIENT_SPHERE C 3.048 **** **** sp_otiluke_rsA sp_otiluke_rsB **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
175 VFX_PER_SLEET_STORM C 12.192 **** **** sp_sleet_stormA sp_sleet_stormB sp_sleet_stormC 0 248 vps_sstorm vps_sstorm vps_sstorm 15 15 15 3400 1100 1900 0 0 0.25 **** sps_storm **** **** **** vps_sstorm_L vps_sstorm_L vps_sstorm_L 175 VFX_PER_SLEET_STORM C 12.192 **** **** sp_sleet_stormA sp_sleet_stormB sp_sleet_stormC 0 248 vps_sstorm vps_sstorm vps_sstorm 15 15 15 3400 1100 1900 0 0 0.25 **** sps_storm **** **** **** vps_sstorm_L vps_sstorm_L vps_sstorm_L

View File

@ -1069,11 +1069,11 @@ void CreateSwitchNameArray()
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_ROD_CASTER_LEVEL); array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_ROD_CASTER_LEVEL);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_STAFF_CASTER_LEVEL); array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFT_STAFF_CASTER_LEVEL);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_BASE_ITEMS); array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_BASE_ITEMS);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_BREWPOTION_MAXLEVEL); array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_BREWPOTION_MAXLEVEL);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_BREWPOTION_COSTMODIFIER); array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_BREWPOTION_COSTMODIFIER);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_SCRIBESCROLL_COSTMODIFIER); array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_SCRIBESCROLL_COSTMODIFIER);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_CRAFTWAND_MAXLEVEL); array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_CRAFTWAND_MAXLEVEL);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_CRAFTWAND_COSTMODIFIER); array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_CRAFTWAND_COSTMODIFIER);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_ARBITRARY); array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_ARBITRARY);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_COST_SCALE); array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_COST_SCALE);
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_TIME_SCALE); array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_TIME_SCALE);

View File

@ -0,0 +1,623 @@
// This is a helper library for advanced use: It allows constructing arbitrary gff data.
// You can then spawn your object via JsonToObject().
//
// The data format is the same as https://github.com/niv/neverwinter.nim@1.4.3+.
//
// Example:
//
// json j = GffCreateObject(OBJECT_TYPE_ITEM);
// j = GffAddInt(j, "BaseItem", BASE_ITEM_BELT);
// j = GffAddInt(j, "ModelPart1", 12);
// j = GffAddLocString(j, "LocalizedName", "hi!");
// object belt = JsonToObject(j, GetLocation(OBJECT_SELF));
const string GFF_FIELD_TYPE_STRUCT = "struct";
const string GFF_FIELD_TYPE_LIST = "list";
const string GFF_FIELD_TYPE_BYTE = "byte";
const string GFF_FIELD_TYPE_CHAR = "char";
const string GFF_FIELD_TYPE_WORD = "word";
const string GFF_FIELD_TYPE_SHORT = "short";
const string GFF_FIELD_TYPE_DWORD = "dword";
const string GFF_FIELD_TYPE_INT = "int";
const string GFF_FIELD_TYPE_DWORD64 = "dword64";
const string GFF_FIELD_TYPE_INT64 = "int64";
const string GFF_FIELD_TYPE_FLOAT = "float";
const string GFF_FIELD_TYPE_DOUBLE = "double";
const string GFF_FIELD_TYPE_RESREF = "resref";
const string GFF_FIELD_TYPE_STRING = "cexostring";
const string GFF_FIELD_TYPE_LOC_STRING = "cexolocstring";
// Create a empty object of the given type. You need to manually fill in all
// GFF data with GffAddXXX. This will require understanding of the GFF file format
// and what data fields each object type requires.
json GffCreateObject(int nObjectType);
// Create a combined area format(CAF) object. You need to manually create the ARE and GIT objects with their required data fields.
json GffCreateArea(json jARE, json jGIT);
// Returns the OBJECT_TYPE_* of jGff.
// Note: Will return 0 for invalid object types, including areas.
int GffGetObjectType(json jGff);
// Returns TRUE if jGff is a combined area format(CAF) object.
int GffGetIsArea(json jGff);
// Returns TRUE if a field named sLabel of sType exists in jGff.
// * sLabel: Can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
// * sType: An optional GFF_FIELD_TYPE_*, leave empty to check if sLabel exists regardless of type.
int GffGetFieldExists(json jGff, string sLabel, string sType = "");
// Add a new field, will overwrite any existing fields with the same label even if the type is different.
// Returns a json null value on error with GetJsonError() filled in.
//
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
// For example, to add the tag of an area to an empty combined area format(CAF) object you can do the following:
// json jArea = GffCreateArea(JsonObject(), JsonObject());
// jArea = GffAddString(jArea, "ARE/value/Tag", "AREA_TAG");
json GffAddStruct(json jGff, string sLabel, json jStruct, int nType = -1);
json GffAddList(json jGff, string sLabel, json jList);
json GffAddByte(json jGff, string sLabel, int v);
json GffAddChar(json jGff, string sLabel, int v);
json GffAddWord(json jGff, string sLabel, int v);
json GffAddShort(json jGff, string sLabel, int v);
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
json GffAddDword(json jGff, string sLabel, int v);
json GffAddInt(json jGff, string sLabel, int v);
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
json GffAddDword64(json jGff, string sLabel, int v);
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
json GffAddInt64(json jGff, string sLabel, int v);
json GffAddFloat(json jGff, string sLabel, float v);
// Note: Only data of type float will fit, because that's all that NWScript supports.
json GffAddDouble(json jGff, string sLabel, float v);
json GffAddResRef(json jGff, string sLabel, string v);
json GffAddString(json jGff, string sLabel, string v);
json GffAddLocString(json jGff, string sLabel, string v, int nStrRef = -1);
// Replace a field, the type must match and the field must exist.
// Returns a json null value on error with GetJsonError() filled in.
//
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
// For example, to replace the name of an area in a combined area format(CAF) object you can do the following:
// json jArea = ObjectToStruct(GetFirstArea());
// jArea = GffReplaceLocString(jArea, "ARE/value/Name", "New Area Name");
json GffReplaceStruct(json jGff, string sLabel, json jStruct);
json GffReplaceList(json jGff, string sLabel, json jList);
json GffReplaceByte(json jGff, string sLabel, int v);
json GffReplaceChar(json jGff, string sLabel, int v);
json GffReplaceWord(json jGff, string sLabel, int v);
json GffReplaceShort(json jGff, string sLabel, int v);
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
json GffReplaceDword(json jGff, string sLabel, int v);
json GffReplaceInt(json jGff, string sLabel, int v);
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
json GffReplaceDword64(json jGff, string sLabel, int v);
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
json GffReplaceInt64(json jGff, string sLabel, int v);
json GffReplaceFloat(json jGff, string sLabel, float v);
// Note: Only data of type float will fit, because that's all that NWScript supports.
json GffReplaceDouble(json jGff, string sLabel, float v);
json GffReplaceResRef(json jGff, string sLabel, string v);
json GffReplaceString(json jGff, string sLabel, string v);
json GffReplaceLocString(json jGff, string sLabel, string v, int nStrRef = -1);
// Remove a field, the type must match and the field must exist.
// Returns a json null value on error with GetJsonError() filled in.
//
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
// For example, to remove all placeables from an area in a combined area format(CAF) object you can do the following:
// json jArea = ObjectToStruct(GetFirstArea());
// jArea = GffRemoveList(jArea, "GIT/value/Placeable List");
json GffRemoveStruct(json jGff, string sLabel);
json GffRemoveList(json jGff, string sLabel);
json GffRemoveByte(json jGff, string sLabel);
json GffRemoveChar(json jGff, string sLabel);
json GffRemoveWord(json jGff, string sLabel);
json GffRemoveShort(json jGff, string sLabel);
json GffRemoveDword(json jGff, string sLabel);
json GffRemoveInt(json jGff, string sLabel);
json GffRemoveDword64(json jGff, string sLabel);
json GffRemoveInt64(json jGff, string sLabel);
json GffRemoveFloat(json jGff, string sLabel);
json GffRemoveDouble(json jGff, string sLabel);
json GffRemoveResRef(json jGff, string sLabel);
json GffRemoveString(json jGff, string sLabel);
json GffRemoveLocString(json jGff, string sLabel);
// Get a field's value as json object.
// Returns a json null value on error with GetJsonError() filled in.
//
// Note: Json types do not implicitly convert between types, this means you cannot convert a JsonInt to a string with JsonGetString(), etc.
// You may need to check the type with JsonGetType() and then do the appropriate cast yourself.
// For GffGet*() functions the json type returned is noted in the function description.
//
// Example:
// INCORRECT: string s = JsonGetString(GffGetInt());
// CORRECT: string s = IntToString(JsonGetInt(GffGetInt()));
//
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
// For example, to get the resref of an area in a combined area format(CAF) object you can do the following:
// json jResRef = GffGetResRef(ObjectToStruct(GetFirstArea()), "ARE/value/ResRef");
// if (jResRef != JsonNull())
// {
// string sResRef = JsonGetString(jResRef);
// }
// else
// WriteTimestampedLogEntry("Failed to get area ResRef: " + JsonGetError(jResRef));
// Returns the struct as JsonObject() on success.
json GffGetStruct(json jGff, string sLabel);
// Returns a JsonArray() with all the list elements on success.
json GffGetList(json jGff, string sLabel);
// Returns a JsonInt() on success.
json GffGetByte(json jGff, string sLabel);
// Returns a JsonInt() on success.
json GffGetChar(json jGff, string sLabel);
// Returns a JsonInt() on success.
json GffGetWord(json jGff, string sLabel);
// Returns a JsonInt() on success.
json GffGetShort(json jGff, string sLabel);
// Returns a JsonInt() on success.
json GffGetDword(json jGff, string sLabel);
// Returns a JsonInt() on success.
json GffGetInt(json jGff, string sLabel);
// Returns a JsonInt() on success.
json GffGetDword64(json jGff, string sLabel);
// Returns a JsonInt() on success.
json GffGetInt64(json jGff, string sLabel);
// Returns a JsonFloat() on success.
json GffGetFloat(json jGff, string sLabel);
// Returns a JsonFloat() on success.
json GffGetDouble(json jGff, string sLabel);
// Returns a JsonString() on success.
json GffGetResRef(json jGff, string sLabel);
// Returns a JsonString() on success.
json GffGetString(json jGff, string sLabel);
// Returns a JsonObject() on success.
// Key "0" will have a JsonString() with the string, if set.
// Key "id" will have a JsonInt() with the strref, if set.
json GffGetLocString(json jGff, string sLabel);
// *** Internal Helper Functions
json AddPatchOperation(json jPatchArray, string sOp, string sPath, json jValue)
{
json jOperation = JsonObject();
jOperation = JsonObjectSet(jOperation, "op", JsonString(sOp));
jOperation = JsonObjectSet(jOperation, "path", JsonString(sPath));
jOperation = JsonObjectSet(jOperation, "value", jValue);
return JsonArrayInsert(jPatchArray, jOperation);
}
json GffAddField(json jGff, string sLabel, string sType, json jValue, int nType = -1)
{
json jField = JsonObject();
jField = JsonObjectSet(jField, "type", JsonString(sType));
jField = JsonObjectSet(jField, "value", jValue);
if (sType == GFF_FIELD_TYPE_STRUCT && nType != -1)
jField = JsonObjectSet(jField, "__struct_id", JsonInt(nType));
return JsonPatch(jGff, AddPatchOperation(JsonArray(), "add", "/" + sLabel, jField));
}
json GffReplaceField(json jGff, string sLabel, string sType, json jValue)
{
json jPatch = JsonArray();
jPatch = AddPatchOperation(jPatch, "test", "/" + sLabel + "/type", JsonString(sType));
jPatch = AddPatchOperation(jPatch, "replace", "/" + sLabel + "/value", jValue);
return JsonPatch(jGff, jPatch);
}
json GffRemoveField(json jGff, string sLabel, string sType)
{
json jPatch = JsonArray();
jPatch = AddPatchOperation(jPatch, "test", "/" + sLabel + "/type", JsonString(sType));
jPatch = AddPatchOperation(jPatch, "remove", "/" + sLabel, JsonNull());
return JsonPatch(jGff, jPatch);
}
json GffGetFieldType(json jGff, string sLabel)
{
return JsonPointer(jGff, "/" + sLabel + "/type");
}
json GffGetFieldValue(json jGff, string sLabel)
{
return JsonPointer(jGff, "/" + sLabel + "/value");
}
json GffGetField(json jGff, string sLabel, string sType)
{
json jType = GffGetFieldType(jGff, sLabel);
if (jType == JsonNull())
return jType;
else if (jType != JsonString(sType))
return JsonNull("field type does not match");
else
return GffGetFieldValue(jGff, sLabel);
}
json GffLocString(string v, int nStrRef = -1)
{
json jLocString = JsonObject();
if (v != "")
jLocString = JsonObjectSet(jLocString, "0", JsonString(v)); // english/any
if (nStrRef != -1)
jLocString = JsonObjectSet(jLocString, "id", JsonInt(nStrRef));
return jLocString;
}
//***
json GffCreateObject(int nObjectType)
{
string ot;
if (nObjectType == OBJECT_TYPE_CREATURE) ot = "UTC ";
else if (nObjectType == OBJECT_TYPE_ITEM) ot = "UTI ";
else if (nObjectType == OBJECT_TYPE_TRIGGER) ot = "UTT ";
else if (nObjectType == OBJECT_TYPE_DOOR) ot = "UTD ";
else if (nObjectType == OBJECT_TYPE_WAYPOINT) ot = "UTW ";
else if (nObjectType == OBJECT_TYPE_PLACEABLE) ot = "UTP ";
else if (nObjectType == OBJECT_TYPE_STORE) ot = "UTM ";
else if (nObjectType == OBJECT_TYPE_ENCOUNTER) ot = "UTE ";
if (ot == "") return JsonNull("invalid object type");
json ret = JsonObject();
ret = JsonObjectSet(ret, "__data_type", JsonString(ot));
return ret;
}
json GffCreateArea(json jARE, json jGIT)
{
json jCAF = JsonObject();
jCAF = JsonObjectSet(jCAF, "__data_type", JsonString("CAF "));
jCAF = GffAddStruct(jCAF, "ARE", jARE, 0);
jCAF = GffAddStruct(jCAF, "GIT", jGIT, 1);
return jCAF;
}
int GffGetObjectType(json jGff)
{
json jDataType = JsonObjectGet(jGff, "__data_type");
if (jDataType == JsonNull())
return 0;
else
{
string sObjectType = JsonGetString(jDataType);
if (sObjectType == "UTC ") return OBJECT_TYPE_CREATURE;
else if (sObjectType == "UTI ") return OBJECT_TYPE_ITEM;
else if (sObjectType == "UTT ") return OBJECT_TYPE_TRIGGER;
else if (sObjectType == "UTD ") return OBJECT_TYPE_DOOR;
else if (sObjectType == "UTW ") return OBJECT_TYPE_WAYPOINT;
else if (sObjectType == "UTP ") return OBJECT_TYPE_PLACEABLE;
else if (sObjectType == "UTM ") return OBJECT_TYPE_STORE;
else if (sObjectType == "UTE ") return OBJECT_TYPE_ENCOUNTER;
}
return 0;
}
int GffGetIsArea(json jGff)
{
return JsonObjectGet(jGff, "__data_type") == JsonString("CAF ");
}
int GffGetFieldExists(json jGff, string sLabel, string sType = "")
{
json jFieldType = GffGetFieldType(jGff, sLabel);
return sType == "" ? jFieldType != JsonNull() : jFieldType == JsonString(sType);
}
json GffAddStruct(json jGff, string sLabel, json jStruct, int nType = -1)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT, jStruct, nType);
}
json GffAddList(json jGff, string sLabel, json jList)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_LIST, jList);
}
json GffAddByte(json jGff, string sLabel, int v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_BYTE, JsonInt(v));
}
json GffAddChar(json jGff, string sLabel, int v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_CHAR, JsonInt(v));
}
json GffAddWord(json jGff, string sLabel, int v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_WORD, JsonInt(v));
}
json GffAddShort(json jGff, string sLabel, int v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_SHORT, JsonInt(v));
}
json GffAddDword(json jGff, string sLabel, int v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DWORD, JsonInt(v));
}
json GffAddInt(json jGff, string sLabel, int v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_INT, JsonInt(v));
}
json GffAddDword64(json jGff, string sLabel, int v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64, JsonInt(v));
}
json GffAddInt64(json jGff, string sLabel, int v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_INT64, JsonInt(v));
}
json GffAddFloat(json jGff, string sLabel, float v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT, JsonFloat(v));
}
json GffAddDouble(json jGff, string sLabel, float v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE, JsonFloat(v));
}
json GffAddResRef(json jGff, string sLabel, string v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_RESREF, JsonString(v));
}
json GffAddString(json jGff, string sLabel, string v)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_STRING, JsonString(v));
}
json GffAddLocString(json jGff, string sLabel, string v, int nStrRef = -1)
{
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING, GffLocString(v, nStrRef));
}
json GffReplaceStruct(json jGff, string sLabel, json jStruct)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT, jStruct);
}
json GffReplaceList(json jGff, string sLabel, json jList)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_LIST, jList);
}
json GffReplaceByte(json jGff, string sLabel, int v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_BYTE, JsonInt(v));
}
json GffReplaceChar(json jGff, string sLabel, int v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_CHAR, JsonInt(v));
}
json GffReplaceWord(json jGff, string sLabel, int v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_WORD, JsonInt(v));
}
json GffReplaceShort(json jGff, string sLabel, int v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_SHORT, JsonInt(v));
}
json GffReplaceDword(json jGff, string sLabel, int v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DWORD, JsonInt(v));
}
json GffReplaceInt(json jGff, string sLabel, int v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_INT, JsonInt(v));
}
json GffReplaceDword64(json jGff, string sLabel, int v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64, JsonInt(v));
}
json GffReplaceInt64(json jGff, string sLabel, int v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_INT64, JsonInt(v));
}
json GffReplaceFloat(json jGff, string sLabel, float v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT, JsonFloat(v));
}
json GffReplaceDouble(json jGff, string sLabel, float v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE, JsonFloat(v));
}
json GffReplaceResRef(json jGff, string sLabel, string v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_RESREF, JsonString(v));
}
json GffReplaceString(json jGff, string sLabel, string v)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_STRING, JsonString(v));
}
json GffReplaceLocString(json jGff, string sLabel, string v, int nStrRef = -1)
{
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING, GffLocString(v, nStrRef));
}
json GffRemoveStruct(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT);
}
json GffRemoveList(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_LIST);
}
json GffRemoveByte(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_BYTE);
}
json GffRemoveChar(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_CHAR);
}
json GffRemoveWord(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_WORD);
}
json GffRemoveShort(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_SHORT);
}
json GffRemoveDword(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DWORD);
}
json GffRemoveInt(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_INT);
}
json GffRemoveDword64(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64);
}
json GffRemoveInt64(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_INT64);
}
json GffRemoveFloat(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT);
}
json GffRemoveDouble(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE);
}
json GffRemoveResRef(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_RESREF);
}
json GffRemoveString(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_STRING);
}
json GffRemoveLocString(json jGff, string sLabel)
{
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING);
}
json GffGetStruct(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT);
}
json GffGetList(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_LIST);
}
json GffGetByte(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_BYTE);
}
json GffGetChar(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_CHAR);
}
json GffGetWord(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_WORD);
}
json GffGetShort(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_SHORT);
}
json GffGetDword(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DWORD);
}
json GffGetInt(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_INT);
}
json GffGetDword64(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64);
}
json GffGetInt64(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_INT64);
}
json GffGetFloat(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT);
}
json GffGetDouble(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE);
}
json GffGetResRef(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_RESREF);
}
json GffGetString(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_STRING);
}
json GffGetLocString(json jGff, string sLabel)
{
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING);
}

View File

@ -1961,45 +1961,46 @@ const string PRC_CRAFTING_BASE_ITEMS = "PRC_CRAFTING_BASE_ITEMS";
* Max level of spells brewed into potions * Max level of spells brewed into potions
* defaults to 3 * defaults to 3
*/ */
const string X2_CI_BREWPOTION_MAXLEVEL = "X2_CI_BREWPOTION_MAXLEVEL"; //const string X2_CI_BREWPOTION_MAXLEVEL = "X2_CI_BREWPOTION_MAXLEVEL";
const string PRC_X2_BREWPOTION_MAXLEVEL = "PRC_X2_BREWPOTION_MAXLEVEL";
/* /*
* cost modifier of spells brewed into poitions * cost modifier of spells brewed into poitions
* defaults to 50 * defaults to 50
*/ */
const string X2_CI_BREWPOTION_COSTMODIFIER = "X2_CI_BREWPOTION_COSTMODIFIER"; const string PRC_X2_BREWPOTION_COSTMODIFIER = "PRC_X2_BREWPOTION_COSTMODIFIER";
/* /*
* cost modifier of spells scribed into scrolls * cost modifier of spells scribed into scrolls
* defaults to 25 * defaults to 25
*/ */
const string X2_CI_SCRIBESCROLL_COSTMODIFIER = "X2_CI_SCRIBESCROLL_COSTMODIFIER"; const string PRC_X2_SCRIBESCROLL_COSTMODIFIER = "PRC_X2_SCRIBESCROLL_COSTMODIFIER";
/* /*
* Max level of spells crafted into wands * Max level of spells crafted into wands
* defaults to 4 * defaults to 4
*/ */
const string X2_CI_CRAFTWAND_MAXLEVEL = "X2_CI_CRAFTWAND_MAXLEVEL"; const string PRC_X2_CRAFTWAND_MAXLEVEL = "PRC_X2_CRAFTWAND_MAXLEVEL";
/* /*
* cost modifier of spells crafted into wands * cost modifier of spells crafted into wands
* defaults to 750 * defaults to 750
*/ */
const string X2_CI_CRAFTWAND_COSTMODIFIER = "X2_CI_CRAFTWAND_COSTMODIFIER"; const string PRC_X2_CRAFTWAND_COSTMODIFIER = "PRC_X2_CRAFTWAND_COSTMODIFIER";
/* /*
* cost modifier of spells crafted into rods * cost modifier of spells crafted into rods
* note that adding a second spell costs 75% and 3 or more costs 50% * note that adding a second spell costs 75% and 3 or more costs 50%
* defaults to 750 * defaults to 750
*/ */
const string X2_CI_CRAFTROD_COSTMODIFIER = "X2_CI_CRAFTROD_COSTMODIFIER"; const string PRC_X2_CRAFTROD_COSTMODIFIER = "PRC_X2_CRAFTROD_COSTMODIFIER";
/* /*
* cost modifier of spells crafted into staffs * cost modifier of spells crafted into staffs
* note that adding a second spell costs 75% and 3 or more costs 50% * note that adding a second spell costs 75% and 3 or more costs 50%
* defaults to 750 * defaults to 750
*/ */
const string X2_CI_CRAFTSTAFF_COSTMODIFIER = "X2_CI_CRAFTSTAFF_COSTMODIFIER"; const string PRC_X2_CRAFTSTAFF_COSTMODIFIER = "PRC_X2_CRAFTSTAFF_COSTMODIFIER";
/** /**
* Allows the use of arbitrary itemproperties and uses NWN item costs * Allows the use of arbitrary itemproperties and uses NWN item costs

View File

@ -44,14 +44,14 @@ const string X2_CI_CRAFTSKILL_CONV ="x2_p_craftskills";
/* moved to be code switches /* moved to be code switches
const int X2_CI_BREWPOTION_MAXLEVEL = 3; // Max Level for potions const int X2_CI_BREWPOTION_MAXLEVEL = 3; // Max Level for potions
const int X2_CI_BREWPOTION_COSTMODIFIER = 50; // gp Brew Potion XPCost Modifier const int PRC_X2_BREWPOTION_COSTMODIFIER = 50; // gp Brew Potion XPCost Modifier
// Scribe Scroll related constants // Scribe Scroll related constants
const int X2_CI_SCRIBESCROLL_COSTMODIFIER = 25; // Scribescroll Cost Modifier const int PRC_X2_SCRIBESCROLL_COSTMODIFIER = 25; // Scribescroll Cost Modifier
// Craft Wand related constants // Craft Wand related constants
const int X2_CI_CRAFTWAND_MAXLEVEL = 4; const int PRC_X2_CRAFTWAND_MAXLEVEL = 4;
const int X2_CI_CRAFTWAND_COSTMODIFIER = 750; const int PRC_X2_CRAFTWAND_COSTMODIFIER = 750;
*/ */
const int X2_CI_BREWPOTION_FEAT_ID = 944; // Brew Potion feat simulation const int X2_CI_BREWPOTION_FEAT_ID = 944; // Brew Potion feat simulation
const int X2_CI_SCRIBESCROLL_FEAT_ID = 945; const int X2_CI_SCRIBESCROLL_FEAT_ID = 945;
@ -593,7 +593,7 @@ These dont work as IPs since they are hardcoded */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// check if spell is below maxlevel for brew potions // check if spell is below maxlevel for brew potions
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
int nPotionMaxLevel = GetPRCSwitch(X2_CI_BREWPOTION_MAXLEVEL); int nPotionMaxLevel = GetPRCSwitch(PRC_X2_BREWPOTION_MAXLEVEL);
if(nPotionMaxLevel == 0) if(nPotionMaxLevel == 0)
nPotionMaxLevel = 3; nPotionMaxLevel = 3;
@ -624,7 +624,7 @@ These dont work as IPs since they are hardcoded */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// XP/GP Cost Calculation // XP/GP Cost Calculation
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
int nCostModifier = GetPRCSwitch(X2_CI_BREWPOTION_COSTMODIFIER); int nCostModifier = GetPRCSwitch(PRC_X2_BREWPOTION_COSTMODIFIER);
if(nCostModifier == 0) if(nCostModifier == 0)
nCostModifier = 50; nCostModifier = 50;
int nCost = CIGetCraftGPCost(nLevel, nCostModifier, PRC_BREW_POTION_CASTER_LEVEL); int nCost = CIGetCraftGPCost(nLevel, nCostModifier, PRC_BREW_POTION_CASTER_LEVEL);
@ -728,7 +728,7 @@ int CICraftCheckScribeScroll(object oSpellTarget, object oCaster, int nID = 0)
// XP/GP Cost Calculation // XP/GP Cost Calculation
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
int nLevel = CIGetSpellInnateLevel(nID,TRUE); int nLevel = CIGetSpellInnateLevel(nID,TRUE);
int nCostModifier = GetPRCSwitch(X2_CI_SCRIBESCROLL_COSTMODIFIER); int nCostModifier = GetPRCSwitch(PRC_X2_SCRIBESCROLL_COSTMODIFIER);
if(nCostModifier == 0) if(nCostModifier == 0)
nCostModifier = 25; nCostModifier = 25;
int nCost = CIGetCraftGPCost(nLevel, nCostModifier, PRC_SCRIBE_SCROLL_CASTER_LEVEL); int nCost = CIGetCraftGPCost(nLevel, nCostModifier, PRC_SCRIBE_SCROLL_CASTER_LEVEL);
@ -884,7 +884,7 @@ These dont work as IPs since they are hardcoded */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// check if spell is below maxlevel for craft want // check if spell is below maxlevel for craft want
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
int nMaxLevel = GetPRCSwitch(X2_CI_CRAFTWAND_MAXLEVEL); int nMaxLevel = GetPRCSwitch(PRC_X2_CRAFTWAND_MAXLEVEL);
if(nMaxLevel == 0) if(nMaxLevel == 0)
nMaxLevel = 4; nMaxLevel = 4;
if (nLevel > nMaxLevel) if (nLevel > nMaxLevel)
@ -896,7 +896,7 @@ These dont work as IPs since they are hardcoded */
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// XP/GP Cost Calculation // XP/GP Cost Calculation
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
int nCostMod = GetPRCSwitch(X2_CI_CRAFTWAND_COSTMODIFIER); int nCostMod = GetPRCSwitch(PRC_X2_CRAFTWAND_COSTMODIFIER);
if(nCostMod == 0) if(nCostMod == 0)
nCostMod = 750; nCostMod = 750;
int nCost = CIGetCraftGPCost(nLevel, nCostMod, PRC_CRAFT_WAND_CASTER_LEVEL); int nCost = CIGetCraftGPCost(nLevel, nCostMod, PRC_CRAFT_WAND_CASTER_LEVEL);
@ -1027,7 +1027,7 @@ int CICraftCheckCraftStaff(object oSpellTarget, object oCaster, int nSpellID = 0
These dont work as IPs since they are hardcoded */ These dont work as IPs since they are hardcoded */
} }
} }
int nCostMod = GetPRCSwitch(X2_CI_CRAFTSTAFF_COSTMODIFIER); int nCostMod = GetPRCSwitch(PRC_X2_CRAFTSTAFF_COSTMODIFIER);
if(!nCostMod) nCostMod = 750; if(!nCostMod) nCostMod = 750;
int nLvlRow = IPGetIPConstCastSpellFromSpellID(nSpellID); int nLvlRow = IPGetIPConstCastSpellFromSpellID(nSpellID);
int nCLevel = StringToInt(Get2DACache("iprp_spells","CasterLvl",nLvlRow)); int nCLevel = StringToInt(Get2DACache("iprp_spells","CasterLvl",nLvlRow));
@ -1175,7 +1175,7 @@ int CICraftCheckCraftRod(object oSpellTarget, object oCaster, int nSpellID = 0)
These dont work as IPs since they are hardcoded */ These dont work as IPs since they are hardcoded */
} }
} }
int nCostMod = GetPRCSwitch(X2_CI_CRAFTROD_COSTMODIFIER); int nCostMod = GetPRCSwitch(PRC_X2_CRAFTROD_COSTMODIFIER);
if(!nCostMod) nCostMod = 750; if(!nCostMod) nCostMod = 750;
int nLvlRow = IPGetIPConstCastSpellFromSpellID(nSpellID); int nLvlRow = IPGetIPConstCastSpellFromSpellID(nSpellID);
int nCLevel = StringToInt(Get2DACache("iprp_spells","CasterLvl",nLvlRow)); int nCLevel = StringToInt(Get2DACache("iprp_spells","CasterLvl",nLvlRow));

View File

@ -0,0 +1,94 @@
#include "inc_debug"
#include "prc_inc_spells"
void main()
{
object oSummoned = OBJECT_SELF;
// Get the caster of the potential dispel
object oCaster = GetLastSpellCaster();
int nCasterLevel = GetCasterLevel(oCaster);
if(DEBUG) DoDebug("mirror_image_sa: EVENT_NPC_ONSPELLCASTAT triggered.");
// Get the spell ID
int nSpellId = GetLastSpell();
if(DEBUG) DoDebug("mirror_image_sa: Dispel spell ID: " + IntToString(nSpellId));
// Check if the spell ID is a dispel spell
if (nSpellId == SPELL_DISPEL_MAGIC || nSpellId == SPELL_LESSER_DISPEL || nSpellId == SPELL_GREATER_DISPELLING || nSpellId == SPELL_MORDENKAINENS_DISJUNCTION
|| nSpellId == SPELL_SLASHING_DISPEL || nSpellId == SPELL_DISPELLING_TOUCH || nSpellId == SPELL_PIXIE_DISPEL || nSpellId == SPELL_GREAT_WALL_OF_DISPEL)
{
// Get the target of the spell
object oTarget = OBJECT_SELF;
if(DEBUG) DoDebug("mirror_image_sa: Spell targeted at: " + GetName(oTarget));
// Check if the target is OBJECT_SELF
if (oTarget == OBJECT_SELF)
{
// Retrieve the original caster of the Spiritual Weapon spell from oSummon
object oSummon = OBJECT_SELF;
object oOriginalCaster = GetLocalObject(oSummon, "oMaster");
// Ensure oOriginalCaster is valid
if (GetIsObjectValid(oOriginalCaster))
{
if(DEBUG) DoDebug("mirror_image_sa: Original caster found. Caster level: " + IntToString(GetCasterLevel(oOriginalCaster)));
// Determine the DC for the dispel check
int nDispelDC = 11 + GetCasterLevel(oOriginalCaster);
if(DEBUG) DoDebug("mirror_image_sa: Dispel DC: " + IntToString(nDispelDC));
// Determine the maximum cap for the dispel check
int nDispelCap = 0;
if (nSpellId == SPELL_LESSER_DISPEL)
nDispelCap = 5;
else if (nSpellId == SPELL_DISPEL_MAGIC || nSpellId == SPELL_SLASHING_DISPEL || nSpellId == SPELL_DISPELLING_TOUCH || nSpellId == SPELL_PIXIE_DISPEL || nSpellId == INVOKE_VORACIOUS_DISPELLING)
nDispelCap = 10;
else if (nSpellId == SPELL_GREATER_DISPELLING || nSpellId == SPELL_GREAT_WALL_OF_DISPEL)
nDispelCap = 15;
else if (nSpellId == SPELL_MORDENKAINENS_DISJUNCTION)
nDispelCap = 0; // No cap for Disjunction
// Roll for the dispel check
int nDispelRoll = d20();
int nCappedCasterLevel = nCasterLevel;
if (nDispelCap > 0 && nCasterLevel > nDispelCap)
nCappedCasterLevel = nDispelCap;
nDispelRoll += nCappedCasterLevel;
if(DEBUG) DoDebug("mirror_image_sa: Dispel roll: " + IntToString(nDispelRoll) + " (Caster Level: " + IntToString(nCappedCasterLevel) + ", Cap: " + IntToString(nDispelCap) + ")");
// Compare the dispel result to the DC
if (nDispelRoll >= nDispelDC)
{
if(DEBUG) DoDebug("mirror_image_sa: Dispel check succeeded.");
// Dispel succeeded, destroy oSummon
if(DEBUG) DoDebug("mirror_image_sa: Dispel Magic succeeded. Destroying Mirror Image.");
// Set flags and destroy objects with delays
SetPlotFlag(oSummon, FALSE);
SetImmortal(oSummon, FALSE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_DISPEL), oSummon);
DelayCommand(1.0f, DestroyObject(oSummon));
if(DEBUG) DoDebug("mirror_image_sa: Mirror Image destruction scheduled.");
}
else
{
if(DEBUG) DoDebug("mirror_image_sa: Dispel check failed.");
}
}
else
{
if(DEBUG) DoDebug("mirror_image_sa: Original caster not found.");
}
}
}
return;
}

View File

@ -21,6 +21,22 @@
#include "shd_inc_myst" #include "shd_inc_myst"
#include "prc_inc_template" #include "prc_inc_template"
void RemoveExtraImages(object oPC)
{
string sImage1 = "PC_IMAGE"+ObjectToString(oPC)+"mirror";
string sImage2 = "PC_IMAGE"+ObjectToString(oPC)+"flurry";
object oCreature = GetFirstObjectInArea(GetArea(oPC));
while (GetIsObjectValid(oCreature))
{
if(GetTag(oCreature) == sImage1 || GetTag(oCreature) == sImage2)
{
DestroyObject(oCreature, 0.0);
}
oCreature = GetNextObjectInArea(GetArea(oPC));
}
}
void PrcFeats(object oPC) void PrcFeats(object oPC)
{ {
if(DEBUG) DoDebug("prc_rest: Evaluating PC feats for " + DebugObject2Str(oPC)); if(DEBUG) DoDebug("prc_rest: Evaluating PC feats for " + DebugObject2Str(oPC));
@ -349,6 +365,8 @@ void RestStarted(object oPC)
} }
*/ */
RemoveExtraImages(oPC);
if (GetIsPC(oPC)) SetLocalInt(oPC, "PnP_Rest_InitialHP", GetCurrentHitPoints(oPC)); if (GetIsPC(oPC)) SetLocalInt(oPC, "PnP_Rest_InitialHP", GetCurrentHitPoints(oPC));
SetLocalInt(oPC, "PnP_Rest_InitialMax", GetMaxHitPoints(oPC)); SetLocalInt(oPC, "PnP_Rest_InitialMax", GetMaxHitPoints(oPC));
if(DEBUG) DoDebug("prc_rest: HPs for " + DebugObject2Str(oPC)+"n/n/"+" nCurrent: "+IntToString(GetCurrentHitPoints(oPC))+" nMax: "+IntToString(GetMaxHitPoints(oPC))); if(DEBUG) DoDebug("prc_rest: HPs for " + DebugObject2Str(oPC)+"n/n/"+" nCurrent: "+IntToString(GetCurrentHitPoints(oPC))+" nMax: "+IntToString(GetMaxHitPoints(oPC)));

View File

@ -40,9 +40,127 @@ dead after being hit by a fireball).
//:: Created By: Stratovarius //:: Created By: Stratovarius
//:: Created On: August 20, 2004 //:: Created On: August 20, 2004
//::////////////////////////////////////////////// //:://////////////////////////////////////////////
#include "nw_inc_gff"
#include "prc_inc_spells" #include "prc_inc_spells"
// Validates and tracks mirror image alignment with master
void TrackMirrorImage(object oSummoned)
{
DoDebug("sp_mirror >> TrackMirrorImage: Running.");
if (!GetIsObjectValid(oSummoned))
{
DoDebug("sp_mirror >> TrackMirrorImage: oSummoned invalid.");
//SendMessageToPC(GetFirstPC(), "TrackMirrorImage >> oSummon or oMaster invalid.");
return;
}
object oMaster = GetLocalObject(oSummoned, "oMaster");
if (!GetIsObjectValid(oMaster))
{
DoDebug("sp_mirror >> TrackMirrorImage: oMaster invalid.");
//SendMessageToPC(GetFirstPC(), "TrackMirrorImage >> oSummon or oMaster invalid.");
return;
}
float fRelX = GetLocalFloat(oSummoned, "rel_x");
float fRelY = GetLocalFloat(oSummoned, "rel_y");
vector vMaster = GetPosition(oMaster);
float fFacing = GetFacing(oMaster);
float fRadians = fFacing * 3.14159 / 180.0;
// Apply facing-based 2D rotation to the stored offset
float fX = vMaster.x + fRelX * cos(fRadians) - fRelY * sin(fRadians);
float fY = vMaster.y + fRelX * sin(fRadians) + fRelY * cos(fRadians);
location lTarget = Location(GetArea(oMaster), Vector(fX, fY, vMaster.z), fFacing);
// Ensure these commands only execute under needed context
AssignCommand(oSummoned, ClearAllActions());
AssignCommand(oSummoned, ActionJumpToLocation(lTarget));
// Schedule next update in 0.25 seconds
DelayCommand(0.1, TrackMirrorImage(oSummoned));
}
// Initializes the summoning and tracking system
void StartMirrorImageTracking(object oSummoned, object oMaster)
{
if (!GetIsObjectValid(oMaster))
{
DoDebug("sp_mirror >> StartMirrorImageTracking: oMaster invalid.");
//SendMessageToPC(GetFirstPC(), "TrackMirrorImage >> oSummon or oMaster invalid.");
return;
}
vector vMaster = GetPosition(oMaster);
vector vSummoned = GetPosition(oSummoned);
float fRelX = vSummoned.x - vMaster.x;
float fRelY = vSummoned.y - vMaster.y;
SetLocalFloat(oSummoned, "rel_x", fRelX);
SetLocalFloat(oSummoned, "rel_y", fRelY);
SetLocalObject(oSummoned, "summoner", oMaster);
SetLocalObject(oSummoned, "oMaster", oMaster);
DoDebug("sp_mirror >> StartMirrorImageTracking: Firing TrackMirrorImage().");
TrackMirrorImage(oSummoned);
}
void SetMirrorImageScripts(object oImage)
{
string sTag = GetTag(oImage);
if(DEBUG) DoDebug("sp_mirror >> SetMirrorImageScripts: Setting OnSpellCastAt script on "+ sTag +".");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_BLOCKED_BY_DOOR, "");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_DAMAGED, "");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_DEATH, "");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_DIALOGUE, "");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_DISTURBED, "");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_END_COMBATROUND, "");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_HEARTBEAT, "");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_MELEE_ATTACKED, "");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_NOTICE, "");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_RESTED, "");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_SPAWN_IN, "");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_SPELLCASTAT, "mirror_image_sa");
SetEventScript(oImage, EVENT_SCRIPT_CREATURE_ON_USER_DEFINED_EVENT, "");
}
json JsonModifyRacialType(json jCreature, int nNewRacialType)
{
if(DEBUG)DoDebug("sp_mirror >> JsonModifyRacialType: Entering function");
// Retrieve the RacialType field
json jRacialTypeField = JsonObjectGet(jCreature, "Race");
if (JsonGetType(jRacialTypeField) == JSON_TYPE_NULL)
{
DoDebug("sp_mirror >> JsonModifyRacialType: JsonGetType error 1: " + JsonGetError(jRacialTypeField));
//SpeakString("JsonGetType error 1: " + JsonGetError(jRacialTypeField));
return JsonNull();
}
// Retrieve the value to modify
json jRacialTypeValue = JsonObjectGet(jRacialTypeField, "value");
if (JsonGetType(jRacialTypeValue) != JSON_TYPE_INTEGER)
{
DoDebug("sp_mirror >> JsonModifyRacialType: JsonGetType error 2: " + JsonGetError(jRacialTypeValue));
//SpeakString("JsonGetType error 2: " + JsonGetError(jRacialTypeValue));
return JsonNull();
}
jCreature = GffReplaceByte(jCreature, "Race", nNewRacialType);
// Return the new creature object
return jCreature;
}
void CleanCopy(object oImage) void CleanCopy(object oImage)
{ {
@ -108,21 +226,37 @@ void MakeMoreImages(object oImage, int iImages, int nDuration)
{ {
string sImage = "PC_IMAGE"+ObjectToString(OBJECT_SELF)+"mirror"; string sImage = "PC_IMAGE"+ObjectToString(OBJECT_SELF)+"mirror";
effect eImage = EffectCutsceneParalyze(); object oMaster = OBJECT_SELF;
if (!GetIsObjectValid(oMaster))
{
DoDebug("sp_mirror >> MakeMoreImages: oMaster invalid.");
return;
}
SetLocalObject(oImage, "oMaster", oMaster);
effect //eImage = EffectCutsceneParalyze();
eImage = SupernaturalEffect(eImage); eImage = SupernaturalEffect(eImage);
effect eGhost = EffectCutsceneGhost(); effect eGhost = EffectCutsceneGhost();
eGhost = SupernaturalEffect(eGhost); eGhost = SupernaturalEffect(eGhost);
effect eNoSpell = EffectSpellFailure(100); effect eNoSpell = EffectSpellFailure(100);
eNoSpell = SupernaturalEffect(eNoSpell); eNoSpell = SupernaturalEffect(eNoSpell);
effect eSpeed = EffectMovementSpeedIncrease(200);
eSpeed = SupernaturalEffect(eSpeed);
int iPlus; int iPlus;
for (iPlus = 0; iPlus < iImages; iPlus++) for (iPlus = 0; iPlus < iImages; iPlus++)
{ {
object oImage2 = CopyObject(oImage, GetLocation(OBJECT_SELF), OBJECT_INVALID, sImage); object oImage2 = CopyObject(oImage, GetLocation(OBJECT_SELF), OBJECT_INVALID, sImage);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImage, oImage2); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImage, oImage2);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eNoSpell, oImage2); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eNoSpell, oImage2);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpeed, oImage2);
ChangeFaction(oImage2, oImage); ChangeFaction(oImage2, oImage);
SetIsTemporaryFriend(OBJECT_SELF, oImage2, FALSE); SetIsTemporaryFriend(OBJECT_SELF, oImage2, FALSE);
DelayCommand(3.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oImage2)); DelayCommand(0.0f, SetMirrorImageScripts(oImage2));
DelayCommand(0.5f, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oImage2));
StartMirrorImageTracking(oImage2, OBJECT_SELF);
DestroyObject(oImage2, TurnsToSeconds(nDuration)); // they dissapear after a minute per level DestroyObject(oImage2, TurnsToSeconds(nDuration)); // they dissapear after a minute per level
} }
} }
@ -145,7 +279,9 @@ void RemoveExtraImages()
void main2() void main2()
{ {
int iLevel = PRCGetCasterLevel(OBJECT_SELF); object oCaster = OBJECT_SELF;
int iLevel = PRCGetCasterLevel(oCaster);
int iAdd = iLevel/3; int iAdd = iLevel/3;
int iImages = d4(1) + iAdd; int iImages = d4(1) + iAdd;
if(iImages >8) if(iImages >8)
@ -158,18 +294,37 @@ void main2()
nDuration = nDuration *2; //Duration is +100% nDuration = nDuration *2; //Duration is +100%
} }
string sImage = "PC_IMAGE"+ObjectToString(oCaster)+"mirror";
string sImage = "PC_IMAGE"+ObjectToString(OBJECT_SELF)+"mirror"; effect //eImage = EffectCutsceneParalyze();
effect eImage = EffectCutsceneParalyze();
eImage = SupernaturalEffect(eImage); eImage = SupernaturalEffect(eImage);
effect eGhost = EffectCutsceneGhost(); effect eGhost = EffectCutsceneGhost();
eGhost = SupernaturalEffect(eGhost); eGhost = SupernaturalEffect(eGhost);
effect eNoSpell = EffectSpellFailure(100); effect eNoSpell = EffectSpellFailure(100);
eNoSpell = SupernaturalEffect(eNoSpell); eNoSpell = SupernaturalEffect(eNoSpell);
effect eSpeed = EffectMovementSpeedIncrease(200);
eSpeed = SupernaturalEffect(eSpeed);
//:: Convert to a construct.
object oImage;
json jImage = ObjectToJson(oCaster);
jImage = JsonModifyRacialType(jImage, RACIAL_TYPE_CONSTRUCT);
oImage = JsonToObject(jImage, GetLocation(oCaster));
if (!GetIsObjectValid(oImage))
{
DoDebug("sp_mirror: Image failed to spawn");
//SpeakString("Image failed to spawn.");
return;
}
// make, then clean up, first image and copy it, not the PC for subsequent images // make, then clean up, first image and copy it, not the PC for subsequent images
object oImage = CopyObject(OBJECT_SELF, GetLocation(OBJECT_SELF), OBJECT_INVALID, sImage); //object oImage = CopyObject(OBJECT_SELF, GetLocation(OBJECT_SELF), OBJECT_INVALID, sImage);
SetTag(oImage, sImage);
CleanCopy(oImage); CleanCopy(oImage);
// images will have only 1 HP // images will have only 1 HP
@ -181,12 +336,20 @@ void main2()
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImage, oImage); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImage, oImage);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eNoSpell, oImage); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eNoSpell, oImage);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDamage, oImage); ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDamage, oImage);
if(!GetIsPC(OBJECT_SELF)) ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpeed, oImage);
ChangeFaction(oImage, OBJECT_SELF);
SetMirrorImageScripts(oImage);
DelayCommand(0.0, SetLocalObject(oImage, "oMaster", oCaster));
if(!GetIsPC(oCaster))
ChangeFaction(oImage, oCaster);
else else
ChangeToStandardFaction(oImage, STANDARD_FACTION_DEFENDER); ChangeToStandardFaction(oImage, STANDARD_FACTION_DEFENDER);
SetIsTemporaryFriend(OBJECT_SELF, oImage, FALSE);
DelayCommand(3.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oImage)); SetIsTemporaryFriend(oCaster, oImage, FALSE);
DelayCommand(0.5f, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oImage));
StartMirrorImageTracking(oImage, OBJECT_SELF);
DestroyObject(oImage, TurnsToSeconds(nDuration)); // they dissapear after a minute per level DestroyObject(oImage, TurnsToSeconds(nDuration)); // they dissapear after a minute per level
--iImages; // made one already --iImages; // made one already
@ -195,15 +358,8 @@ void main2()
void main() void main()
{ {
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR"); DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_ILLUSION); SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_ILLUSION);
/*
Spellcast Hook Code
Added 2003-06-23 by GeorgZ
If you want to make changes to all spells,
check x2_inc_spellhook.nss to find out more
*/
if (!X2PreSpellCastCode()) if (!X2PreSpellCastCode())
{ {
@ -216,6 +372,6 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_ILLUSION);
DelayCommand(0.0, RemoveExtraImages()); DelayCommand(0.0, RemoveExtraImages());
DelayCommand(0.1, main2()); DelayCommand(0.1, main2());
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR"); DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
// Getting rid of the local integer storing the spellschool name // Getting rid of the local integer storing the spellschool name
} }