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:
parent
78615c847f
commit
2181120567
@ -25,7 +25,7 @@
|
||||
21 GOOD_AIM_MODIFIER 1
|
||||
22 STUNNING_FIST_TO_HIT_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
|
||||
26 CRIPPLING_STRIKE_STRENGTH_MODIFIER 2
|
||||
27 **** ****
|
||||
@ -336,12 +336,12 @@
|
||||
332 SKILL_EXAMINE_TRAP_DURATION 4.5f
|
||||
333 SKILL_OPEN_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
|
||||
337 SKILL_PICKPOCKET_COOLDOWN 6000
|
||||
338 SKILL_ANIMAL_EMPATHY_COOLDOWN 6000
|
||||
339 ENCOUNTERS_ON_ENTER_FIRE_BEFORE_SPAWN 0
|
||||
340 **** ****
|
||||
340 MONK_SPELL_RESISTANCE_CAN_BE_LOWERED 0
|
||||
341 **** ****
|
||||
342 **** ****
|
||||
343 **** ****
|
||||
@ -522,3 +522,4 @@
|
||||
518 CHARGEN_ENABLE_RECOMMENDED_BUTTON 0
|
||||
519 MULTICLASS_LIMIT 8
|
||||
520 ALL_ASSOCIATES_CAN_INTERACT 0
|
||||
521 EMOTE_ANIMATIONS_USE_MDL_TIMINGS 0
|
||||
|
@ -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 **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 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 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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 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 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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
@ -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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
|
@ -173,7 +173,7 @@
|
||||
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
|
||||
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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||
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
|
||||
|
@ -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_STAFF_CASTER_LEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_BASE_ITEMS);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_BREWPOTION_MAXLEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_BREWPOTION_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_SCRIBESCROLL_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_CRAFTWAND_MAXLEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), X2_CI_CRAFTWAND_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_BREWPOTION_MAXLEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_BREWPOTION_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_SCRIBESCROLL_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_CRAFTWAND_MAXLEVEL);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_X2_CRAFTWAND_COSTMODIFIER);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_ARBITRARY);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_COST_SCALE);
|
||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CRAFTING_TIME_SCALE);
|
||||
|
623
nwn/nwnprc/trunk/include/nw_inc_gff.nss
Normal file
623
nwn/nwnprc/trunk/include/nw_inc_gff.nss
Normal file
@ -0,0 +1,623 @@
|
||||
// This is a helper library for advanced use: It allows constructing arbitrary gff data.
|
||||
// You can then spawn your object via JsonToObject().
|
||||
//
|
||||
// The data format is the same as https://github.com/niv/neverwinter.nim@1.4.3+.
|
||||
//
|
||||
// Example:
|
||||
//
|
||||
// json j = GffCreateObject(OBJECT_TYPE_ITEM);
|
||||
// j = GffAddInt(j, "BaseItem", BASE_ITEM_BELT);
|
||||
// j = GffAddInt(j, "ModelPart1", 12);
|
||||
// j = GffAddLocString(j, "LocalizedName", "hi!");
|
||||
// object belt = JsonToObject(j, GetLocation(OBJECT_SELF));
|
||||
|
||||
|
||||
const string GFF_FIELD_TYPE_STRUCT = "struct";
|
||||
const string GFF_FIELD_TYPE_LIST = "list";
|
||||
const string GFF_FIELD_TYPE_BYTE = "byte";
|
||||
const string GFF_FIELD_TYPE_CHAR = "char";
|
||||
const string GFF_FIELD_TYPE_WORD = "word";
|
||||
const string GFF_FIELD_TYPE_SHORT = "short";
|
||||
const string GFF_FIELD_TYPE_DWORD = "dword";
|
||||
const string GFF_FIELD_TYPE_INT = "int";
|
||||
const string GFF_FIELD_TYPE_DWORD64 = "dword64";
|
||||
const string GFF_FIELD_TYPE_INT64 = "int64";
|
||||
const string GFF_FIELD_TYPE_FLOAT = "float";
|
||||
const string GFF_FIELD_TYPE_DOUBLE = "double";
|
||||
const string GFF_FIELD_TYPE_RESREF = "resref";
|
||||
const string GFF_FIELD_TYPE_STRING = "cexostring";
|
||||
const string GFF_FIELD_TYPE_LOC_STRING = "cexolocstring";
|
||||
|
||||
|
||||
// Create a empty object of the given type. You need to manually fill in all
|
||||
// GFF data with GffAddXXX. This will require understanding of the GFF file format
|
||||
// and what data fields each object type requires.
|
||||
json GffCreateObject(int nObjectType);
|
||||
// Create a combined area format(CAF) object. You need to manually create the ARE and GIT objects with their required data fields.
|
||||
json GffCreateArea(json jARE, json jGIT);
|
||||
|
||||
// Returns the OBJECT_TYPE_* of jGff.
|
||||
// Note: Will return 0 for invalid object types, including areas.
|
||||
int GffGetObjectType(json jGff);
|
||||
// Returns TRUE if jGff is a combined area format(CAF) object.
|
||||
int GffGetIsArea(json jGff);
|
||||
|
||||
// Returns TRUE if a field named sLabel of sType exists in jGff.
|
||||
// * sLabel: Can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
|
||||
// * sType: An optional GFF_FIELD_TYPE_*, leave empty to check if sLabel exists regardless of type.
|
||||
int GffGetFieldExists(json jGff, string sLabel, string sType = "");
|
||||
|
||||
|
||||
// Add a new field, will overwrite any existing fields with the same label even if the type is different.
|
||||
// Returns a json null value on error with GetJsonError() filled in.
|
||||
//
|
||||
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
|
||||
// For example, to add the tag of an area to an empty combined area format(CAF) object you can do the following:
|
||||
// json jArea = GffCreateArea(JsonObject(), JsonObject());
|
||||
// jArea = GffAddString(jArea, "ARE/value/Tag", "AREA_TAG");
|
||||
|
||||
json GffAddStruct(json jGff, string sLabel, json jStruct, int nType = -1);
|
||||
json GffAddList(json jGff, string sLabel, json jList);
|
||||
json GffAddByte(json jGff, string sLabel, int v);
|
||||
json GffAddChar(json jGff, string sLabel, int v);
|
||||
json GffAddWord(json jGff, string sLabel, int v);
|
||||
json GffAddShort(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffAddDword(json jGff, string sLabel, int v);
|
||||
json GffAddInt(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffAddDword64(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffAddInt64(json jGff, string sLabel, int v);
|
||||
json GffAddFloat(json jGff, string sLabel, float v);
|
||||
// Note: Only data of type float will fit, because that's all that NWScript supports.
|
||||
json GffAddDouble(json jGff, string sLabel, float v);
|
||||
json GffAddResRef(json jGff, string sLabel, string v);
|
||||
json GffAddString(json jGff, string sLabel, string v);
|
||||
json GffAddLocString(json jGff, string sLabel, string v, int nStrRef = -1);
|
||||
|
||||
|
||||
// Replace a field, the type must match and the field must exist.
|
||||
// Returns a json null value on error with GetJsonError() filled in.
|
||||
//
|
||||
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
|
||||
// For example, to replace the name of an area in a combined area format(CAF) object you can do the following:
|
||||
// json jArea = ObjectToStruct(GetFirstArea());
|
||||
// jArea = GffReplaceLocString(jArea, "ARE/value/Name", "New Area Name");
|
||||
|
||||
json GffReplaceStruct(json jGff, string sLabel, json jStruct);
|
||||
json GffReplaceList(json jGff, string sLabel, json jList);
|
||||
json GffReplaceByte(json jGff, string sLabel, int v);
|
||||
json GffReplaceChar(json jGff, string sLabel, int v);
|
||||
json GffReplaceWord(json jGff, string sLabel, int v);
|
||||
json GffReplaceShort(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffReplaceDword(json jGff, string sLabel, int v);
|
||||
json GffReplaceInt(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffReplaceDword64(json jGff, string sLabel, int v);
|
||||
// Note: Only data of type int32 will fit, because that's all that NWScript supports.
|
||||
json GffReplaceInt64(json jGff, string sLabel, int v);
|
||||
json GffReplaceFloat(json jGff, string sLabel, float v);
|
||||
// Note: Only data of type float will fit, because that's all that NWScript supports.
|
||||
json GffReplaceDouble(json jGff, string sLabel, float v);
|
||||
json GffReplaceResRef(json jGff, string sLabel, string v);
|
||||
json GffReplaceString(json jGff, string sLabel, string v);
|
||||
json GffReplaceLocString(json jGff, string sLabel, string v, int nStrRef = -1);
|
||||
|
||||
|
||||
// Remove a field, the type must match and the field must exist.
|
||||
// Returns a json null value on error with GetJsonError() filled in.
|
||||
//
|
||||
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
|
||||
// For example, to remove all placeables from an area in a combined area format(CAF) object you can do the following:
|
||||
// json jArea = ObjectToStruct(GetFirstArea());
|
||||
// jArea = GffRemoveList(jArea, "GIT/value/Placeable List");
|
||||
|
||||
json GffRemoveStruct(json jGff, string sLabel);
|
||||
json GffRemoveList(json jGff, string sLabel);
|
||||
json GffRemoveByte(json jGff, string sLabel);
|
||||
json GffRemoveChar(json jGff, string sLabel);
|
||||
json GffRemoveWord(json jGff, string sLabel);
|
||||
json GffRemoveShort(json jGff, string sLabel);
|
||||
json GffRemoveDword(json jGff, string sLabel);
|
||||
json GffRemoveInt(json jGff, string sLabel);
|
||||
json GffRemoveDword64(json jGff, string sLabel);
|
||||
json GffRemoveInt64(json jGff, string sLabel);
|
||||
json GffRemoveFloat(json jGff, string sLabel);
|
||||
json GffRemoveDouble(json jGff, string sLabel);
|
||||
json GffRemoveResRef(json jGff, string sLabel);
|
||||
json GffRemoveString(json jGff, string sLabel);
|
||||
json GffRemoveLocString(json jGff, string sLabel);
|
||||
|
||||
|
||||
// Get a field's value as json object.
|
||||
// Returns a json null value on error with GetJsonError() filled in.
|
||||
//
|
||||
// Note: Json types do not implicitly convert between types, this means you cannot convert a JsonInt to a string with JsonGetString(), etc.
|
||||
// You may need to check the type with JsonGetType() and then do the appropriate cast yourself.
|
||||
// For GffGet*() functions the json type returned is noted in the function description.
|
||||
//
|
||||
// Example:
|
||||
// INCORRECT: string s = JsonGetString(GffGetInt());
|
||||
// CORRECT: string s = IntToString(JsonGetInt(GffGetInt()));
|
||||
//
|
||||
// sLabel can be a json pointer(path) without the starting /, see the documentation of JsonPointer() for details.
|
||||
// For example, to get the resref of an area in a combined area format(CAF) object you can do the following:
|
||||
// json jResRef = GffGetResRef(ObjectToStruct(GetFirstArea()), "ARE/value/ResRef");
|
||||
// if (jResRef != JsonNull())
|
||||
// {
|
||||
// string sResRef = JsonGetString(jResRef);
|
||||
// }
|
||||
// else
|
||||
// WriteTimestampedLogEntry("Failed to get area ResRef: " + JsonGetError(jResRef));
|
||||
|
||||
// Returns the struct as JsonObject() on success.
|
||||
json GffGetStruct(json jGff, string sLabel);
|
||||
// Returns a JsonArray() with all the list elements on success.
|
||||
json GffGetList(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetByte(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetChar(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetWord(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetShort(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetDword(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetInt(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetDword64(json jGff, string sLabel);
|
||||
// Returns a JsonInt() on success.
|
||||
json GffGetInt64(json jGff, string sLabel);
|
||||
// Returns a JsonFloat() on success.
|
||||
json GffGetFloat(json jGff, string sLabel);
|
||||
// Returns a JsonFloat() on success.
|
||||
json GffGetDouble(json jGff, string sLabel);
|
||||
// Returns a JsonString() on success.
|
||||
json GffGetResRef(json jGff, string sLabel);
|
||||
// Returns a JsonString() on success.
|
||||
json GffGetString(json jGff, string sLabel);
|
||||
// Returns a JsonObject() on success.
|
||||
// Key "0" will have a JsonString() with the string, if set.
|
||||
// Key "id" will have a JsonInt() with the strref, if set.
|
||||
json GffGetLocString(json jGff, string sLabel);
|
||||
|
||||
|
||||
// *** Internal Helper Functions
|
||||
json AddPatchOperation(json jPatchArray, string sOp, string sPath, json jValue)
|
||||
{
|
||||
json jOperation = JsonObject();
|
||||
jOperation = JsonObjectSet(jOperation, "op", JsonString(sOp));
|
||||
jOperation = JsonObjectSet(jOperation, "path", JsonString(sPath));
|
||||
jOperation = JsonObjectSet(jOperation, "value", jValue);
|
||||
return JsonArrayInsert(jPatchArray, jOperation);
|
||||
}
|
||||
|
||||
json GffAddField(json jGff, string sLabel, string sType, json jValue, int nType = -1)
|
||||
{
|
||||
json jField = JsonObject();
|
||||
jField = JsonObjectSet(jField, "type", JsonString(sType));
|
||||
jField = JsonObjectSet(jField, "value", jValue);
|
||||
if (sType == GFF_FIELD_TYPE_STRUCT && nType != -1)
|
||||
jField = JsonObjectSet(jField, "__struct_id", JsonInt(nType));
|
||||
|
||||
return JsonPatch(jGff, AddPatchOperation(JsonArray(), "add", "/" + sLabel, jField));
|
||||
}
|
||||
|
||||
json GffReplaceField(json jGff, string sLabel, string sType, json jValue)
|
||||
{
|
||||
json jPatch = JsonArray();
|
||||
jPatch = AddPatchOperation(jPatch, "test", "/" + sLabel + "/type", JsonString(sType));
|
||||
jPatch = AddPatchOperation(jPatch, "replace", "/" + sLabel + "/value", jValue);
|
||||
return JsonPatch(jGff, jPatch);
|
||||
}
|
||||
|
||||
json GffRemoveField(json jGff, string sLabel, string sType)
|
||||
{
|
||||
json jPatch = JsonArray();
|
||||
jPatch = AddPatchOperation(jPatch, "test", "/" + sLabel + "/type", JsonString(sType));
|
||||
jPatch = AddPatchOperation(jPatch, "remove", "/" + sLabel, JsonNull());
|
||||
return JsonPatch(jGff, jPatch);
|
||||
}
|
||||
|
||||
json GffGetFieldType(json jGff, string sLabel)
|
||||
{
|
||||
return JsonPointer(jGff, "/" + sLabel + "/type");
|
||||
}
|
||||
|
||||
json GffGetFieldValue(json jGff, string sLabel)
|
||||
{
|
||||
return JsonPointer(jGff, "/" + sLabel + "/value");
|
||||
}
|
||||
|
||||
json GffGetField(json jGff, string sLabel, string sType)
|
||||
{
|
||||
json jType = GffGetFieldType(jGff, sLabel);
|
||||
if (jType == JsonNull())
|
||||
return jType;
|
||||
else if (jType != JsonString(sType))
|
||||
return JsonNull("field type does not match");
|
||||
else
|
||||
return GffGetFieldValue(jGff, sLabel);
|
||||
}
|
||||
|
||||
json GffLocString(string v, int nStrRef = -1)
|
||||
{
|
||||
json jLocString = JsonObject();
|
||||
if (v != "")
|
||||
jLocString = JsonObjectSet(jLocString, "0", JsonString(v)); // english/any
|
||||
if (nStrRef != -1)
|
||||
jLocString = JsonObjectSet(jLocString, "id", JsonInt(nStrRef));
|
||||
|
||||
return jLocString;
|
||||
}
|
||||
//***
|
||||
|
||||
json GffCreateObject(int nObjectType)
|
||||
{
|
||||
string ot;
|
||||
if (nObjectType == OBJECT_TYPE_CREATURE) ot = "UTC ";
|
||||
else if (nObjectType == OBJECT_TYPE_ITEM) ot = "UTI ";
|
||||
else if (nObjectType == OBJECT_TYPE_TRIGGER) ot = "UTT ";
|
||||
else if (nObjectType == OBJECT_TYPE_DOOR) ot = "UTD ";
|
||||
else if (nObjectType == OBJECT_TYPE_WAYPOINT) ot = "UTW ";
|
||||
else if (nObjectType == OBJECT_TYPE_PLACEABLE) ot = "UTP ";
|
||||
else if (nObjectType == OBJECT_TYPE_STORE) ot = "UTM ";
|
||||
else if (nObjectType == OBJECT_TYPE_ENCOUNTER) ot = "UTE ";
|
||||
|
||||
if (ot == "") return JsonNull("invalid object type");
|
||||
|
||||
json ret = JsonObject();
|
||||
ret = JsonObjectSet(ret, "__data_type", JsonString(ot));
|
||||
return ret;
|
||||
}
|
||||
|
||||
json GffCreateArea(json jARE, json jGIT)
|
||||
{
|
||||
json jCAF = JsonObject();
|
||||
jCAF = JsonObjectSet(jCAF, "__data_type", JsonString("CAF "));
|
||||
jCAF = GffAddStruct(jCAF, "ARE", jARE, 0);
|
||||
jCAF = GffAddStruct(jCAF, "GIT", jGIT, 1);
|
||||
return jCAF;
|
||||
}
|
||||
|
||||
|
||||
int GffGetObjectType(json jGff)
|
||||
{
|
||||
json jDataType = JsonObjectGet(jGff, "__data_type");
|
||||
if (jDataType == JsonNull())
|
||||
return 0;
|
||||
else
|
||||
{
|
||||
string sObjectType = JsonGetString(jDataType);
|
||||
|
||||
if (sObjectType == "UTC ") return OBJECT_TYPE_CREATURE;
|
||||
else if (sObjectType == "UTI ") return OBJECT_TYPE_ITEM;
|
||||
else if (sObjectType == "UTT ") return OBJECT_TYPE_TRIGGER;
|
||||
else if (sObjectType == "UTD ") return OBJECT_TYPE_DOOR;
|
||||
else if (sObjectType == "UTW ") return OBJECT_TYPE_WAYPOINT;
|
||||
else if (sObjectType == "UTP ") return OBJECT_TYPE_PLACEABLE;
|
||||
else if (sObjectType == "UTM ") return OBJECT_TYPE_STORE;
|
||||
else if (sObjectType == "UTE ") return OBJECT_TYPE_ENCOUNTER;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int GffGetIsArea(json jGff)
|
||||
{
|
||||
return JsonObjectGet(jGff, "__data_type") == JsonString("CAF ");
|
||||
}
|
||||
|
||||
int GffGetFieldExists(json jGff, string sLabel, string sType = "")
|
||||
{
|
||||
json jFieldType = GffGetFieldType(jGff, sLabel);
|
||||
return sType == "" ? jFieldType != JsonNull() : jFieldType == JsonString(sType);
|
||||
}
|
||||
|
||||
|
||||
json GffAddStruct(json jGff, string sLabel, json jStruct, int nType = -1)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT, jStruct, nType);
|
||||
}
|
||||
|
||||
json GffAddList(json jGff, string sLabel, json jList)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_LIST, jList);
|
||||
}
|
||||
|
||||
json GffAddByte(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_BYTE, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddChar(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_CHAR, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddWord(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_WORD, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddShort(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_SHORT, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddDword(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DWORD, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddInt(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_INT, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddDword64(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddInt64(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_INT64, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffAddFloat(json jGff, string sLabel, float v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT, JsonFloat(v));
|
||||
}
|
||||
|
||||
json GffAddDouble(json jGff, string sLabel, float v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE, JsonFloat(v));
|
||||
}
|
||||
|
||||
json GffAddResRef(json jGff, string sLabel, string v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_RESREF, JsonString(v));
|
||||
}
|
||||
|
||||
json GffAddString(json jGff, string sLabel, string v)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_STRING, JsonString(v));
|
||||
}
|
||||
|
||||
json GffAddLocString(json jGff, string sLabel, string v, int nStrRef = -1)
|
||||
{
|
||||
return GffAddField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING, GffLocString(v, nStrRef));
|
||||
}
|
||||
|
||||
|
||||
json GffReplaceStruct(json jGff, string sLabel, json jStruct)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT, jStruct);
|
||||
}
|
||||
|
||||
json GffReplaceList(json jGff, string sLabel, json jList)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_LIST, jList);
|
||||
}
|
||||
|
||||
json GffReplaceByte(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_BYTE, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceChar(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_CHAR, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceWord(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_WORD, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceShort(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_SHORT, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceDword(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DWORD, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceInt(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_INT, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceDword64(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceInt64(json jGff, string sLabel, int v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_INT64, JsonInt(v));
|
||||
}
|
||||
|
||||
json GffReplaceFloat(json jGff, string sLabel, float v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT, JsonFloat(v));
|
||||
}
|
||||
|
||||
json GffReplaceDouble(json jGff, string sLabel, float v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE, JsonFloat(v));
|
||||
}
|
||||
|
||||
json GffReplaceResRef(json jGff, string sLabel, string v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_RESREF, JsonString(v));
|
||||
}
|
||||
|
||||
json GffReplaceString(json jGff, string sLabel, string v)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_STRING, JsonString(v));
|
||||
}
|
||||
|
||||
json GffReplaceLocString(json jGff, string sLabel, string v, int nStrRef = -1)
|
||||
{
|
||||
return GffReplaceField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING, GffLocString(v, nStrRef));
|
||||
}
|
||||
|
||||
|
||||
json GffRemoveStruct(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT);
|
||||
}
|
||||
|
||||
json GffRemoveList(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_LIST);
|
||||
}
|
||||
|
||||
json GffRemoveByte(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_BYTE);
|
||||
}
|
||||
|
||||
json GffRemoveChar(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_CHAR);
|
||||
}
|
||||
|
||||
json GffRemoveWord(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_WORD);
|
||||
}
|
||||
|
||||
json GffRemoveShort(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_SHORT);
|
||||
}
|
||||
|
||||
json GffRemoveDword(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DWORD);
|
||||
}
|
||||
|
||||
json GffRemoveInt(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_INT);
|
||||
}
|
||||
|
||||
json GffRemoveDword64(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64);
|
||||
}
|
||||
|
||||
json GffRemoveInt64(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_INT64);
|
||||
}
|
||||
|
||||
json GffRemoveFloat(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT);
|
||||
}
|
||||
|
||||
json GffRemoveDouble(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE);
|
||||
}
|
||||
|
||||
json GffRemoveResRef(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_RESREF);
|
||||
}
|
||||
|
||||
json GffRemoveString(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_STRING);
|
||||
}
|
||||
|
||||
json GffRemoveLocString(json jGff, string sLabel)
|
||||
{
|
||||
return GffRemoveField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING);
|
||||
}
|
||||
|
||||
|
||||
json GffGetStruct(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_STRUCT);
|
||||
}
|
||||
|
||||
json GffGetList(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_LIST);
|
||||
}
|
||||
|
||||
json GffGetByte(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_BYTE);
|
||||
}
|
||||
|
||||
json GffGetChar(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_CHAR);
|
||||
}
|
||||
|
||||
json GffGetWord(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_WORD);
|
||||
}
|
||||
|
||||
json GffGetShort(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_SHORT);
|
||||
}
|
||||
|
||||
json GffGetDword(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DWORD);
|
||||
}
|
||||
|
||||
json GffGetInt(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_INT);
|
||||
}
|
||||
|
||||
json GffGetDword64(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DWORD64);
|
||||
}
|
||||
|
||||
json GffGetInt64(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_INT64);
|
||||
}
|
||||
|
||||
json GffGetFloat(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_FLOAT);
|
||||
}
|
||||
|
||||
json GffGetDouble(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_DOUBLE);
|
||||
}
|
||||
|
||||
json GffGetResRef(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_RESREF);
|
||||
}
|
||||
|
||||
json GffGetString(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_STRING);
|
||||
}
|
||||
|
||||
json GffGetLocString(json jGff, string sLabel)
|
||||
{
|
||||
return GffGetField(jGff, sLabel, GFF_FIELD_TYPE_LOC_STRING);
|
||||
}
|
@ -1961,45 +1961,46 @@ const string PRC_CRAFTING_BASE_ITEMS = "PRC_CRAFTING_BASE_ITEMS";
|
||||
* Max level of spells brewed into potions
|
||||
* defaults to 3
|
||||
*/
|
||||
const string X2_CI_BREWPOTION_MAXLEVEL = "X2_CI_BREWPOTION_MAXLEVEL";
|
||||
//const string X2_CI_BREWPOTION_MAXLEVEL = "X2_CI_BREWPOTION_MAXLEVEL";
|
||||
const string PRC_X2_BREWPOTION_MAXLEVEL = "PRC_X2_BREWPOTION_MAXLEVEL";
|
||||
|
||||
/*
|
||||
* cost modifier of spells brewed into poitions
|
||||
* defaults to 50
|
||||
*/
|
||||
const string X2_CI_BREWPOTION_COSTMODIFIER = "X2_CI_BREWPOTION_COSTMODIFIER";
|
||||
const string PRC_X2_BREWPOTION_COSTMODIFIER = "PRC_X2_BREWPOTION_COSTMODIFIER";
|
||||
|
||||
/*
|
||||
* cost modifier of spells scribed into scrolls
|
||||
* defaults to 25
|
||||
*/
|
||||
const string X2_CI_SCRIBESCROLL_COSTMODIFIER = "X2_CI_SCRIBESCROLL_COSTMODIFIER";
|
||||
const string PRC_X2_SCRIBESCROLL_COSTMODIFIER = "PRC_X2_SCRIBESCROLL_COSTMODIFIER";
|
||||
|
||||
/*
|
||||
* Max level of spells crafted into wands
|
||||
* defaults to 4
|
||||
*/
|
||||
const string X2_CI_CRAFTWAND_MAXLEVEL = "X2_CI_CRAFTWAND_MAXLEVEL";
|
||||
const string PRC_X2_CRAFTWAND_MAXLEVEL = "PRC_X2_CRAFTWAND_MAXLEVEL";
|
||||
|
||||
/*
|
||||
* cost modifier of spells crafted into wands
|
||||
* defaults to 750
|
||||
*/
|
||||
const string X2_CI_CRAFTWAND_COSTMODIFIER = "X2_CI_CRAFTWAND_COSTMODIFIER";
|
||||
const string PRC_X2_CRAFTWAND_COSTMODIFIER = "PRC_X2_CRAFTWAND_COSTMODIFIER";
|
||||
|
||||
/*
|
||||
* cost modifier of spells crafted into rods
|
||||
* note that adding a second spell costs 75% and 3 or more costs 50%
|
||||
* defaults to 750
|
||||
*/
|
||||
const string X2_CI_CRAFTROD_COSTMODIFIER = "X2_CI_CRAFTROD_COSTMODIFIER";
|
||||
const string PRC_X2_CRAFTROD_COSTMODIFIER = "PRC_X2_CRAFTROD_COSTMODIFIER";
|
||||
|
||||
/*
|
||||
* cost modifier of spells crafted into staffs
|
||||
* note that adding a second spell costs 75% and 3 or more costs 50%
|
||||
* defaults to 750
|
||||
*/
|
||||
const string X2_CI_CRAFTSTAFF_COSTMODIFIER = "X2_CI_CRAFTSTAFF_COSTMODIFIER";
|
||||
const string PRC_X2_CRAFTSTAFF_COSTMODIFIER = "PRC_X2_CRAFTSTAFF_COSTMODIFIER";
|
||||
|
||||
/**
|
||||
* Allows the use of arbitrary itemproperties and uses NWN item costs
|
||||
|
@ -44,14 +44,14 @@ const string X2_CI_CRAFTSKILL_CONV ="x2_p_craftskills";
|
||||
/* moved to be code switches
|
||||
|
||||
const int X2_CI_BREWPOTION_MAXLEVEL = 3; // Max Level for potions
|
||||
const int X2_CI_BREWPOTION_COSTMODIFIER = 50; // gp Brew Potion XPCost Modifier
|
||||
const int PRC_X2_BREWPOTION_COSTMODIFIER = 50; // gp Brew Potion XPCost Modifier
|
||||
|
||||
// Scribe Scroll related constants
|
||||
const int X2_CI_SCRIBESCROLL_COSTMODIFIER = 25; // Scribescroll Cost Modifier
|
||||
const int PRC_X2_SCRIBESCROLL_COSTMODIFIER = 25; // Scribescroll Cost Modifier
|
||||
|
||||
// Craft Wand related constants
|
||||
const int X2_CI_CRAFTWAND_MAXLEVEL = 4;
|
||||
const int X2_CI_CRAFTWAND_COSTMODIFIER = 750;
|
||||
const int PRC_X2_CRAFTWAND_MAXLEVEL = 4;
|
||||
const int PRC_X2_CRAFTWAND_COSTMODIFIER = 750;
|
||||
*/
|
||||
const int X2_CI_BREWPOTION_FEAT_ID = 944; // Brew Potion feat simulation
|
||||
const int X2_CI_SCRIBESCROLL_FEAT_ID = 945;
|
||||
@ -593,7 +593,7 @@ These dont work as IPs since they are hardcoded */
|
||||
// -------------------------------------------------------------------------
|
||||
// check if spell is below maxlevel for brew potions
|
||||
// -------------------------------------------------------------------------
|
||||
int nPotionMaxLevel = GetPRCSwitch(X2_CI_BREWPOTION_MAXLEVEL);
|
||||
int nPotionMaxLevel = GetPRCSwitch(PRC_X2_BREWPOTION_MAXLEVEL);
|
||||
if(nPotionMaxLevel == 0)
|
||||
nPotionMaxLevel = 3;
|
||||
|
||||
@ -624,7 +624,7 @@ These dont work as IPs since they are hardcoded */
|
||||
// -------------------------------------------------------------------------
|
||||
// XP/GP Cost Calculation
|
||||
// -------------------------------------------------------------------------
|
||||
int nCostModifier = GetPRCSwitch(X2_CI_BREWPOTION_COSTMODIFIER);
|
||||
int nCostModifier = GetPRCSwitch(PRC_X2_BREWPOTION_COSTMODIFIER);
|
||||
if(nCostModifier == 0)
|
||||
nCostModifier = 50;
|
||||
int nCost = CIGetCraftGPCost(nLevel, nCostModifier, PRC_BREW_POTION_CASTER_LEVEL);
|
||||
@ -728,7 +728,7 @@ int CICraftCheckScribeScroll(object oSpellTarget, object oCaster, int nID = 0)
|
||||
// XP/GP Cost Calculation
|
||||
// -------------------------------------------------------------------------
|
||||
int nLevel = CIGetSpellInnateLevel(nID,TRUE);
|
||||
int nCostModifier = GetPRCSwitch(X2_CI_SCRIBESCROLL_COSTMODIFIER);
|
||||
int nCostModifier = GetPRCSwitch(PRC_X2_SCRIBESCROLL_COSTMODIFIER);
|
||||
if(nCostModifier == 0)
|
||||
nCostModifier = 25;
|
||||
int nCost = CIGetCraftGPCost(nLevel, nCostModifier, PRC_SCRIBE_SCROLL_CASTER_LEVEL);
|
||||
@ -884,7 +884,7 @@ These dont work as IPs since they are hardcoded */
|
||||
// -------------------------------------------------------------------------
|
||||
// check if spell is below maxlevel for craft want
|
||||
// -------------------------------------------------------------------------
|
||||
int nMaxLevel = GetPRCSwitch(X2_CI_CRAFTWAND_MAXLEVEL);
|
||||
int nMaxLevel = GetPRCSwitch(PRC_X2_CRAFTWAND_MAXLEVEL);
|
||||
if(nMaxLevel == 0)
|
||||
nMaxLevel = 4;
|
||||
if (nLevel > nMaxLevel)
|
||||
@ -896,7 +896,7 @@ These dont work as IPs since they are hardcoded */
|
||||
// -------------------------------------------------------------------------
|
||||
// XP/GP Cost Calculation
|
||||
// -------------------------------------------------------------------------
|
||||
int nCostMod = GetPRCSwitch(X2_CI_CRAFTWAND_COSTMODIFIER);
|
||||
int nCostMod = GetPRCSwitch(PRC_X2_CRAFTWAND_COSTMODIFIER);
|
||||
if(nCostMod == 0)
|
||||
nCostMod = 750;
|
||||
int nCost = CIGetCraftGPCost(nLevel, nCostMod, PRC_CRAFT_WAND_CASTER_LEVEL);
|
||||
@ -1027,7 +1027,7 @@ int CICraftCheckCraftStaff(object oSpellTarget, object oCaster, int nSpellID = 0
|
||||
These dont work as IPs since they are hardcoded */
|
||||
}
|
||||
}
|
||||
int nCostMod = GetPRCSwitch(X2_CI_CRAFTSTAFF_COSTMODIFIER);
|
||||
int nCostMod = GetPRCSwitch(PRC_X2_CRAFTSTAFF_COSTMODIFIER);
|
||||
if(!nCostMod) nCostMod = 750;
|
||||
int nLvlRow = IPGetIPConstCastSpellFromSpellID(nSpellID);
|
||||
int nCLevel = StringToInt(Get2DACache("iprp_spells","CasterLvl",nLvlRow));
|
||||
@ -1175,7 +1175,7 @@ int CICraftCheckCraftRod(object oSpellTarget, object oCaster, int nSpellID = 0)
|
||||
These dont work as IPs since they are hardcoded */
|
||||
}
|
||||
}
|
||||
int nCostMod = GetPRCSwitch(X2_CI_CRAFTROD_COSTMODIFIER);
|
||||
int nCostMod = GetPRCSwitch(PRC_X2_CRAFTROD_COSTMODIFIER);
|
||||
if(!nCostMod) nCostMod = 750;
|
||||
int nLvlRow = IPGetIPConstCastSpellFromSpellID(nSpellID);
|
||||
int nCLevel = StringToInt(Get2DACache("iprp_spells","CasterLvl",nLvlRow));
|
||||
|
94
nwn/nwnprc/trunk/scripts/mirror_image_sa.nss
Normal file
94
nwn/nwnprc/trunk/scripts/mirror_image_sa.nss
Normal 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;
|
||||
}
|
@ -21,6 +21,22 @@
|
||||
#include "shd_inc_myst"
|
||||
#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)
|
||||
{
|
||||
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));
|
||||
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)));
|
||||
|
@ -40,9 +40,127 @@ dead after being hit by a fireball).
|
||||
//:: Created By: Stratovarius
|
||||
//:: Created On: August 20, 2004
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "nw_inc_gff"
|
||||
#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)
|
||||
{
|
||||
@ -108,21 +226,37 @@ void MakeMoreImages(object oImage, int iImages, int nDuration)
|
||||
{
|
||||
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);
|
||||
effect eGhost = EffectCutsceneGhost();
|
||||
eGhost = SupernaturalEffect(eGhost);
|
||||
effect eNoSpell = EffectSpellFailure(100);
|
||||
eNoSpell = SupernaturalEffect(eNoSpell);
|
||||
effect eSpeed = EffectMovementSpeedIncrease(200);
|
||||
eSpeed = SupernaturalEffect(eSpeed);
|
||||
|
||||
int iPlus;
|
||||
for (iPlus = 0; iPlus < iImages; iPlus++)
|
||||
{
|
||||
object oImage2 = CopyObject(oImage, GetLocation(OBJECT_SELF), OBJECT_INVALID, sImage);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImage, oImage2);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eNoSpell, oImage2);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpeed, oImage2);
|
||||
ChangeFaction(oImage2, oImage);
|
||||
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
|
||||
}
|
||||
}
|
||||
@ -145,7 +279,9 @@ void RemoveExtraImages()
|
||||
|
||||
void main2()
|
||||
{
|
||||
int iLevel = PRCGetCasterLevel(OBJECT_SELF);
|
||||
object oCaster = OBJECT_SELF;
|
||||
|
||||
int iLevel = PRCGetCasterLevel(oCaster);
|
||||
int iAdd = iLevel/3;
|
||||
int iImages = d4(1) + iAdd;
|
||||
if(iImages >8)
|
||||
@ -158,18 +294,37 @@ void main2()
|
||||
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);
|
||||
effect eGhost = EffectCutsceneGhost();
|
||||
eGhost = SupernaturalEffect(eGhost);
|
||||
effect eNoSpell = EffectSpellFailure(100);
|
||||
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
|
||||
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);
|
||||
|
||||
// images will have only 1 HP
|
||||
@ -181,12 +336,20 @@ void main2()
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImage, oImage);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eNoSpell, oImage);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDamage, oImage);
|
||||
if(!GetIsPC(OBJECT_SELF))
|
||||
ChangeFaction(oImage, OBJECT_SELF);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSpeed, oImage);
|
||||
|
||||
SetMirrorImageScripts(oImage);
|
||||
|
||||
DelayCommand(0.0, SetLocalObject(oImage, "oMaster", oCaster));
|
||||
|
||||
if(!GetIsPC(oCaster))
|
||||
ChangeFaction(oImage, oCaster);
|
||||
else
|
||||
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
|
||||
|
||||
--iImages; // made one already
|
||||
@ -195,15 +358,8 @@ void main2()
|
||||
|
||||
void main()
|
||||
{
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
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
|
||||
|
||||
*/
|
||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_ILLUSION);
|
||||
|
||||
if (!X2PreSpellCastCode())
|
||||
{
|
||||
@ -216,6 +372,6 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_ILLUSION);
|
||||
DelayCommand(0.0, RemoveExtraImages());
|
||||
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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user