Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e0a68be4fd | ||
|
|
807db19a90 | ||
|
|
257cb23488 | ||
|
|
80070703b4 |
12
Notes/Class Expansion/Epic Swashbuckler.txt
Normal file
12
Notes/Class Expansion/Epic Swashbuckler.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
You have become the embodiment of panache and daring. You are an epic Swashbuckler.
|
||||||
|
|
||||||
|
Hit Die: d10
|
||||||
|
Skill Points at Each Additional Level: 4+ Int Modifier
|
||||||
|
Bonus Feats: The epic swashbuckler gains a bonus feat every three levels.
|
||||||
|
|
||||||
|
Special:
|
||||||
|
Swashbuckler Dodge: This bonus continues to increase by +1 at every five levels after 20th.
|
||||||
|
Grace: An epic swashbuckler gains another +1 bonus on Reflex saves at 29th and 39th level. A swashbuckler loses this bonus when wearing medium or heavy armor or when encumbered.
|
||||||
|
|
||||||
|
Epic Swashbuckler Bonus Feat List:
|
||||||
|
Armor Skin, Blinding Speed, Devastating Critical, Epic Damage Reduction, Epic Prowess, Epic Toughness, Epic Weapon Focus, Improved Stunning Fist, Improved Whirlwind Attack, Overwhelming Critical, Superior Initiative
|
||||||
23
Notes/Exalted Feats.txt
Normal file
23
Notes/Exalted Feats.txt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
Exalted Feats
|
||||||
|
|
||||||
|
Exalted Companion
|
||||||
|
Sacred Vow
|
||||||
|
Vow of Abstinence
|
||||||
|
Vow of Obedience
|
||||||
|
Vow of Poverty
|
||||||
|
Vow of Purity
|
||||||
|
Vow of Chastity
|
||||||
|
Servant of The Heavens
|
||||||
|
Touch of Golden Ice
|
||||||
|
Stigmata
|
||||||
|
Holy Radiance
|
||||||
|
Nimbus of Light
|
||||||
|
Intuitive Attack
|
||||||
|
Hand of a Healer
|
||||||
|
Exalted Turning
|
||||||
|
Favored of the Companions
|
||||||
|
Sanctify Ki Strike
|
||||||
|
Sanctify Martial Strike
|
||||||
|
Holy Ki Strike
|
||||||
|
Fist of the Heavens
|
||||||
|
Gift of Faith
|
||||||
BIN
Notes/MartialStudyNotes.pdf
Normal file
BIN
Notes/MartialStudyNotes.pdf
Normal file
Binary file not shown.
22
Notes/Summon Aberration Notes.txt
Normal file
22
Notes/Summon Aberration Notes.txt
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
Beholder
|
||||||
|
12.) Point-blank Shot (27)
|
||||||
|
15.) Weapon Focus: Ray (4819)
|
||||||
|
18.) Blind Fight (408)
|
||||||
|
21.) Fast Heaing I (4145)
|
||||||
|
24.) Armor Skin (490)
|
||||||
|
27.) Fast Heaing II (4146)
|
||||||
|
30.) Epic Reflexes (585)
|
||||||
|
33.) Fast Heaing III (4147)
|
||||||
|
|
||||||
|
Umber Hulk
|
||||||
|
9.) Blind-fight (408)
|
||||||
|
12.) Improved Critical: Creature (292)
|
||||||
|
15.) Weapon Focus: Creature (291)
|
||||||
|
18.) Lightining Reflexes (24)
|
||||||
|
21.) Epic Prowess (584)
|
||||||
|
24.) Armor Skin (490)
|
||||||
|
|
||||||
|
Battle Devourer
|
||||||
|
9.) Blind-fight (408)
|
||||||
|
12.) Improved Critical: Creature (292)
|
||||||
|
15.) Improved Trip (2807)
|
||||||
@@ -68,7 +68,7 @@ void main()
|
|||||||
float fRange = 30.0 + (nMaster * 10);
|
float fRange = 30.0 + (nMaster * 10);
|
||||||
|
|
||||||
// Target location
|
// Target location
|
||||||
location lTarget = GetSpellTargetLocation();
|
location lTarget = PRCGetSpellTargetLocation();
|
||||||
|
|
||||||
// Distance check
|
// Distance check
|
||||||
if (GetDistanceBetweenLocations(GetLocation(oPC), lTarget) > FeetToMeters(fRange))
|
if (GetDistanceBetweenLocations(GetLocation(oPC), lTarget) > FeetToMeters(fRange))
|
||||||
@@ -135,6 +135,13 @@ void main()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//:: One skill point per HD
|
||||||
|
jShadow = json_AdjustCreatureSkillByID(jShadow, SKILL_SPOT, nHDToAdd);
|
||||||
|
if (jShadow == JSON_NULL)
|
||||||
|
{
|
||||||
|
DoDebug("mdshdw_shadserv >> json_AdjustCreatureSkillByID failed — JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
object oShadow = JsonToObject(jShadow, lTarget);
|
object oShadow = JsonToObject(jShadow, lTarget);
|
||||||
effect eSummon = ExtraordinaryEffect(EffectSummonCreature("", VFX_FNF_SUMMON_UNDEAD, 0.0, 0, VFX_IMP_UNSUMMON, oShadow));
|
effect eSummon = ExtraordinaryEffect(EffectSummonCreature("", VFX_FNF_SUMMON_UNDEAD, 0.0, 0, VFX_IMP_UNSUMMON, oShadow));
|
||||||
@@ -158,10 +165,6 @@ void main()
|
|||||||
|
|
||||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oShadow);
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, oShadow);
|
||||||
|
|
||||||
// Full round wait then move
|
|
||||||
AssignCommand(oShadow, ClearAllActions());
|
|
||||||
AssignCommand(oShadow, ActionWait(6.0));
|
|
||||||
AssignCommand(oShadow, ActionMoveToObject(oPC));
|
|
||||||
|
|
||||||
// Start watch loop
|
// Start watch loop
|
||||||
DelayCommand(6.1, ShadowServantWatch(oShadow, oPC));
|
DelayCommand(6.1, ShadowServantWatch(oShadow, oPC));
|
||||||
682
Notes/prc_amagsys_gain.nss.bak
Normal file
682
Notes/prc_amagsys_gain.nss.bak
Normal file
@@ -0,0 +1,682 @@
|
|||||||
|
//:://////////////////////////////////////////////
|
||||||
|
//:: Alternate magic system gain evaluation script
|
||||||
|
//:: prc_amagsys_gain
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
/** @file
|
||||||
|
This file determines if the given character
|
||||||
|
has gained new spells / powers / utterances /
|
||||||
|
whathaveyou since the last time it was run.
|
||||||
|
If so, it starts the relevant selection
|
||||||
|
conversations.
|
||||||
|
|
||||||
|
Add new classes to their respective magic
|
||||||
|
user type block, or if such doesn't exist
|
||||||
|
yet for the system the class belongs to,
|
||||||
|
make a new block for them at the end of main().
|
||||||
|
|
||||||
|
|
||||||
|
@author Ornedan
|
||||||
|
@date Created - 2006.12.14
|
||||||
|
*/
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
|
//:: Updated for .35 by Jaysyn 2023/03/11
|
||||||
|
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "inc_dynconv"
|
||||||
|
#include "psi_inc_psifunc"
|
||||||
|
#include "inc_newspellbook"
|
||||||
|
#include "true_inc_trufunc"
|
||||||
|
#include "tob_inc_tobfunc"
|
||||||
|
#include "shd_inc_shdfunc"
|
||||||
|
#include "inv_inc_invfunc"
|
||||||
|
#include "prc_nui_lv_inc"
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
/* Function prototypes */
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void CheckSpellbooks(object oPC);
|
||||||
|
void CheckPsionics(object oPC);
|
||||||
|
void CheckInvocations(object oPC);
|
||||||
|
void CheckToB(object oPC);
|
||||||
|
void CheckShadow(object oPC);
|
||||||
|
void CheckTruenaming(object oPC);
|
||||||
|
int CheckMissingPowers(object oPC, int nClass);
|
||||||
|
int CheckMissingSpells(object oPC, int nClass, int nMinLevel, int nMaxLevel);
|
||||||
|
int CheckMissingUtterances(object oPC, int nClass, int nLexicon);
|
||||||
|
int CheckMissingManeuvers(object oPC, int nClass);
|
||||||
|
int CheckMissingMysteries(object oPC, int nClass);
|
||||||
|
int CheckMissingInvocations(object oPC, int nClass);
|
||||||
|
void AMSCompatibilityCheck(object oPC);
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
/* Function definitions */
|
||||||
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
object oPC = OBJECT_SELF;
|
||||||
|
|
||||||
|
// Sanity checks - Shifted or polymorphed characters may have their hide fucked up, and might be missing access to their hide-feats
|
||||||
|
// @todo Shifting probably doesn't do this anymore, could be ditchable - Ornedan, 20061214
|
||||||
|
if(GetLocalInt(oPC, "nPCShifted"))
|
||||||
|
return;
|
||||||
|
effect eTest = GetFirstEffect(oPC);
|
||||||
|
while(GetIsEffectValid(eTest))
|
||||||
|
{
|
||||||
|
if(GetEffectType(eTest) == EFFECT_TYPE_POLYMORPH)
|
||||||
|
return;
|
||||||
|
eTest = GetNextEffect(oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
DelayCommand(0.0f, CheckSpellbooks(oPC));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle new spellbooks
|
||||||
|
|
||||||
|
void CheckSpellbooks(object oPC)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(GetLevelByClass(CLASS_TYPE_SUBLIME_CHORD, oPC) > 0)
|
||||||
|
{
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_SUBLIME_CHORD, 4, 9);
|
||||||
|
|
||||||
|
if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_BARD, oPC))
|
||||||
|
{
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 3);
|
||||||
|
}
|
||||||
|
if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_SORCERER))
|
||||||
|
{
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 3);
|
||||||
|
}
|
||||||
|
if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_WARMAGE, oPC))
|
||||||
|
{
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_WARMAGE, 0, 3);
|
||||||
|
}
|
||||||
|
if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_DUSKBLADE, oPC))
|
||||||
|
{
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_DUSKBLADE, 0, 3);
|
||||||
|
}
|
||||||
|
if(GetHasFeat(FEAT_SUBLIME_CHORD_SPELLCASTING_BEGUILER, oPC))
|
||||||
|
{
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check all classes that might need a spellbook update
|
||||||
|
if(GetIsRHDSorcerer(oPC)) CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9);
|
||||||
|
if(GetIsRHDBard(oPC)) CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6);
|
||||||
|
|
||||||
|
if(!GetPRCSwitch(PRC_BARD_DISALLOW_NEWSPELLBOOK))
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6);
|
||||||
|
if(!GetPRCSwitch(PRC_SORC_DISALLOW_NEWSPELLBOOK))
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9);
|
||||||
|
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_SUEL_ARCHANAMACH, 1, 5);
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_FAVOURED_SOUL, 0, 9);
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_WARMAGE, 0, 9);
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_DREAD_NECROMANCER, 1, 9);
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_HEXBLADE, 1, 4);
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_DUSKBLADE, 0, 5);
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_JUSTICEWW, 1, 4);
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_KNIGHT_WEAVE, 1, 6);
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_ARCHIVIST, 0, 9);
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 9);
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_HARPER, 1, 3);
|
||||||
|
CheckMissingSpells(oPC, CLASS_TYPE_CELEBRANT_SHARESS, 1, 4);
|
||||||
|
//CheckMissingSpells(oPC, CLASS_TYPE_ASSASSIN, 1, 4);
|
||||||
|
|
||||||
|
// Check psionics
|
||||||
|
DelayCommand(0.0f, CheckPsionics(oPC));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* void CheckSpellbooks(object oPC)
|
||||||
|
{
|
||||||
|
if(GetIsRHDSorcerer(oPC) && CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9))
|
||||||
|
return;
|
||||||
|
if(GetIsRHDBard(oPC) && CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6))
|
||||||
|
return;
|
||||||
|
if(!GetPRCSwitch(PRC_BARD_DISALLOW_NEWSPELLBOOK) && CheckMissingSpells(oPC, CLASS_TYPE_BARD, 0, 6))
|
||||||
|
return;
|
||||||
|
if(!GetPRCSwitch(PRC_SORC_DISALLOW_NEWSPELLBOOK) && CheckMissingSpells(oPC, CLASS_TYPE_SORCERER, 0, 9))
|
||||||
|
return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_SUEL_ARCHANAMACH, 1, 5))
|
||||||
|
return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_FAVOURED_SOUL, 0, 9))
|
||||||
|
return;
|
||||||
|
// if(CheckMissingSpells(oPC, CLASS_TYPE_MYSTIC, 0, 9))
|
||||||
|
// return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_WARMAGE, 0, 9))
|
||||||
|
return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_DREAD_NECROMANCER, 1, 9))
|
||||||
|
return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_HEXBLADE, 1, 4))
|
||||||
|
return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_DUSKBLADE, 0, 5))
|
||||||
|
return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_JUSTICEWW, 1, 4))
|
||||||
|
return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_KNIGHT_WEAVE, 1, 6))
|
||||||
|
return;
|
||||||
|
// if(CheckMissingSpells(oPC, CLASS_TYPE_WITCH, 0, 9))
|
||||||
|
// return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_SUBLIME_CHORD, 4, 9))
|
||||||
|
return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_ARCHIVIST, 0, 9))
|
||||||
|
return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 9))
|
||||||
|
return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_HARPER, 1, 3))
|
||||||
|
return;
|
||||||
|
// if(CheckMissingSpells(oPC, CLASS_TYPE_TEMPLAR, 0, 9))
|
||||||
|
// return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_ASSASSIN, 1, 4))
|
||||||
|
return;
|
||||||
|
if(CheckMissingSpells(oPC, CLASS_TYPE_CELEBRANT_SHARESS, 1, 4))
|
||||||
|
return;
|
||||||
|
|
||||||
|
DelayCommand(0.0f, CheckPsionics(oPC));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Handle psionics
|
||||||
|
void CheckPsionics(object oPC)
|
||||||
|
{
|
||||||
|
if(CheckMissingPowers(oPC, CLASS_TYPE_PSION))
|
||||||
|
return;
|
||||||
|
if(CheckMissingPowers(oPC, CLASS_TYPE_WILDER))
|
||||||
|
return;
|
||||||
|
if(CheckMissingPowers(oPC, CLASS_TYPE_PSYWAR))
|
||||||
|
return;
|
||||||
|
if(CheckMissingPowers(oPC, CLASS_TYPE_PSYCHIC_ROGUE))
|
||||||
|
return;
|
||||||
|
if(CheckMissingPowers(oPC, CLASS_TYPE_FIST_OF_ZUOKEN))
|
||||||
|
return;
|
||||||
|
if(CheckMissingPowers(oPC, CLASS_TYPE_WARMIND))
|
||||||
|
return;
|
||||||
|
//expanded knowledge
|
||||||
|
if(CheckMissingPowers(oPC, -1))
|
||||||
|
return;
|
||||||
|
//epic expanded knowledge
|
||||||
|
if(CheckMissingPowers(oPC, -2))
|
||||||
|
return;
|
||||||
|
|
||||||
|
DelayCommand(0.0f, CheckInvocations(oPC));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle Invocations
|
||||||
|
void CheckInvocations(object oPC)
|
||||||
|
{
|
||||||
|
if(CheckMissingInvocations(oPC, CLASS_TYPE_DRAGONFIRE_ADEPT))
|
||||||
|
return;
|
||||||
|
if(CheckMissingInvocations(oPC, CLASS_TYPE_WARLOCK))
|
||||||
|
return;
|
||||||
|
if(CheckMissingInvocations(oPC, CLASS_TYPE_DRAGON_SHAMAN))
|
||||||
|
return;
|
||||||
|
//extra invocations
|
||||||
|
if(CheckMissingInvocations(oPC, CLASS_TYPE_INVALID))
|
||||||
|
return;
|
||||||
|
//epic extra invocations
|
||||||
|
if(CheckMissingInvocations(oPC, -2))
|
||||||
|
return;
|
||||||
|
|
||||||
|
DelayCommand(0.0f, CheckToB(oPC));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle Tome of Battle
|
||||||
|
void CheckToB(object oPC)
|
||||||
|
{
|
||||||
|
if(CheckMissingManeuvers(oPC, CLASS_TYPE_CRUSADER))
|
||||||
|
return;
|
||||||
|
if(CheckMissingManeuvers(oPC, CLASS_TYPE_SWORDSAGE))
|
||||||
|
return;
|
||||||
|
if(CheckMissingManeuvers(oPC, CLASS_TYPE_WARBLADE))
|
||||||
|
return;
|
||||||
|
|
||||||
|
DelayCommand(0.0f, CheckShadow(oPC));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle Shadowcasting
|
||||||
|
void CheckShadow(object oPC)
|
||||||
|
{
|
||||||
|
if(CheckMissingMysteries(oPC, CLASS_TYPE_SHADOWCASTER))
|
||||||
|
return;
|
||||||
|
if(CheckMissingMysteries(oPC, CLASS_TYPE_SHADOWSMITH))
|
||||||
|
return;
|
||||||
|
|
||||||
|
DelayCommand(0.0f, CheckTruenaming(oPC));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle Truenaming - Three different Lexicons to check
|
||||||
|
void CheckTruenaming(object oPC)
|
||||||
|
{
|
||||||
|
if(CheckMissingUtterances(oPC, CLASS_TYPE_TRUENAMER, LEXICON_EVOLVING_MIND))
|
||||||
|
return;
|
||||||
|
if(CheckMissingUtterances(oPC, CLASS_TYPE_TRUENAMER, LEXICON_CRAFTED_TOOL))
|
||||||
|
return;
|
||||||
|
if(CheckMissingUtterances(oPC, CLASS_TYPE_TRUENAMER, LEXICON_PERFECTED_MAP))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!GetIsDM(oPC))
|
||||||
|
DelayCommand(0.0f, AMSCompatibilityCheck(oPC));
|
||||||
|
}
|
||||||
|
|
||||||
|
int CheckMissingPowers(object oPC, int nClass)
|
||||||
|
{
|
||||||
|
int nLevel = GetLevelByClass(nClass, oPC);
|
||||||
|
if(!nLevel && nClass != -1 && nClass != -2)
|
||||||
|
return FALSE;
|
||||||
|
else if(nClass == -1 && !GetHasFeat(FEAT_EXPANDED_KNOWLEDGE_1))
|
||||||
|
return FALSE;
|
||||||
|
else if(nClass == -2 && !GetHasFeat(FEAT_EPIC_EXPANDED_KNOWLEDGE_1))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
int nCurrentPowers = GetPowerCount(oPC, nClass);
|
||||||
|
int nMaxPowers = GetMaxPowerCount(oPC, nClass);
|
||||||
|
|
||||||
|
if(nCurrentPowers < nMaxPowers)
|
||||||
|
{
|
||||||
|
if (nClass <= 0)
|
||||||
|
nClass = GetPrimaryPsionicClass(oPC);
|
||||||
|
if (!IsLevelUpNUIOpen(oPC))
|
||||||
|
OpenNUILevelUpWindow(nClass, oPC);
|
||||||
|
/*
|
||||||
|
// Mark the class for which the PC is to gain powers and start the conversation
|
||||||
|
SetLocalInt(oPC, "nClass", nClass);
|
||||||
|
StartDynamicConversation("psi_powconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||||||
|
*/
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CheckMissingInvocations(object oPC, int nClass)
|
||||||
|
{
|
||||||
|
int nLevel = GetLevelByClass(nClass, oPC);
|
||||||
|
if(!nLevel && (nClass == CLASS_TYPE_DRAGONFIRE_ADEPT || nClass == CLASS_TYPE_WARLOCK || nClass == CLASS_TYPE_DRAGON_SHAMAN))
|
||||||
|
return FALSE;
|
||||||
|
else if(nClass == CLASS_TYPE_INVALID && !GetHasFeat(FEAT_EXTRA_INVOCATION_I))
|
||||||
|
return FALSE;
|
||||||
|
else if(nClass == -2 && !GetHasFeat(FEAT_EPIC_EXTRA_INVOCATION_I))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
int nCurrentInvocations = GetInvocationCount(oPC, nClass);
|
||||||
|
if(DEBUG) DoDebug("Current Invocations: " + IntToString(nCurrentInvocations));
|
||||||
|
int nMaxInvocations = GetMaxInvocationCount(oPC, nClass);
|
||||||
|
if(DEBUG) DoDebug("Max Invocations: " + IntToString(nMaxInvocations));
|
||||||
|
|
||||||
|
if(nCurrentInvocations < nMaxInvocations)
|
||||||
|
{
|
||||||
|
if (nClass == CLASS_TYPE_INVALID || nClass == -2)
|
||||||
|
nClass = GetPrimaryInvocationClass(oPC);
|
||||||
|
if (!IsLevelUpNUIOpen(oPC))
|
||||||
|
OpenNUILevelUpWindow(nClass, oPC);
|
||||||
|
/*
|
||||||
|
// Mark the class for which the PC is to gain invocations and start the conversation
|
||||||
|
SetLocalInt(oPC, "nClass", nClass);
|
||||||
|
StartDynamicConversation("inv_invokeconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||||||
|
*/
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddSpellsForLevel(int nClass, int nLevel)
|
||||||
|
{
|
||||||
|
object oPC = OBJECT_SELF;
|
||||||
|
object oSkin = GetPCSkin(oPC);
|
||||||
|
//object oToken = GetHideToken(oPC);
|
||||||
|
string sFile = GetFileForClass(nClass);
|
||||||
|
string sSpellbook;
|
||||||
|
int nSpellbookType = GetSpellbookTypeForClass(nClass);
|
||||||
|
if(nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS)
|
||||||
|
sSpellbook = "Spellbook"+IntToString(nClass);
|
||||||
|
else
|
||||||
|
sSpellbook = "Spellbook_Known_"+IntToString(nClass)+"_"+IntToString(nLevel);
|
||||||
|
|
||||||
|
// Create spells known persistant array if it is missing
|
||||||
|
int nSize = persistant_array_get_size(oPC, sSpellbook);
|
||||||
|
if (nSize < 0)
|
||||||
|
{
|
||||||
|
persistant_array_create(oPC, sSpellbook);
|
||||||
|
nSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//check for learnable spells
|
||||||
|
object oToken_Class = GetObjectByTag("SpellLvl_" + IntToString(nClass) + "_Level_" + IntToString(nLevel));
|
||||||
|
int nSpells_Total = persistant_array_get_size(oToken_Class, "Lkup");
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < nSpells_Total; i++)
|
||||||
|
{
|
||||||
|
int nSpellbookID = persistant_array_get_int(oToken_Class, "Lkup", i);
|
||||||
|
if(Get2DAString(sFile, "AL", nSpellbookID) != "1")
|
||||||
|
{
|
||||||
|
persistant_array_set_int(oPC, sSpellbook, nSize, nSpellbookID);
|
||||||
|
nSize++;
|
||||||
|
if(nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS)
|
||||||
|
{
|
||||||
|
int nIPFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", nSpellbookID));
|
||||||
|
int nFeatID = StringToInt(Get2DACache(sFile, "FeatID", nSpellbookID));
|
||||||
|
AddSpellUse(oPC, nSpellbookID, nClass, sFile, "NewSpellbookMem_" + IntToString(nClass), nSpellbookType, oSkin, nFeatID, nIPFeatID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int CheckMissingSpells(object oPC, int nClass, int nMinLevel, int nMaxLevel)
|
||||||
|
{
|
||||||
|
int nLevel;
|
||||||
|
|
||||||
|
//:: Rakshasa cast as sorcerers
|
||||||
|
if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_RAKSHASA)
|
||||||
|
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_OUTSIDER, oPC);
|
||||||
|
|
||||||
|
//:: Aranea cast as sorcerers
|
||||||
|
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_ARANEA)
|
||||||
|
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_SHAPECHANGER, oPC);
|
||||||
|
|
||||||
|
//::Arkamoi cast as sorcerers
|
||||||
|
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_ARKAMOI)
|
||||||
|
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC);
|
||||||
|
|
||||||
|
//::Hobgoblin Warsouls cast as sorcerers
|
||||||
|
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_HOBGOBLIN_WARSOUL)
|
||||||
|
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC);
|
||||||
|
|
||||||
|
//:: Driders cast as sorcerers
|
||||||
|
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_DRIDER)
|
||||||
|
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_ABERRATION, oPC);
|
||||||
|
|
||||||
|
//:: Marrutact cast as 6/7 sorcerers
|
||||||
|
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_MARRUTACT)
|
||||||
|
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC);
|
||||||
|
|
||||||
|
//:: Redspawn Arcaniss cast as 3/4 sorcerers
|
||||||
|
else if(nClass == CLASS_TYPE_SORCERER && !GetLevelByClass(CLASS_TYPE_SORCERER, oPC) && GetRacialType(oPC) == RACIAL_TYPE_REDSPAWN_ARCANISS)
|
||||||
|
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC);
|
||||||
|
|
||||||
|
//:: Gloura cast as bards
|
||||||
|
else if(nClass == CLASS_TYPE_BARD && !GetLevelByClass(CLASS_TYPE_BARD, oPC) && GetRacialType(oPC) == RACIAL_TYPE_GLOURA)
|
||||||
|
nLevel = GetSpellslotLevel(nClass, oPC); //GetLevelByClass(CLASS_TYPE_MONSTROUS, oPC);
|
||||||
|
|
||||||
|
else
|
||||||
|
nLevel = nClass == CLASS_TYPE_SUBLIME_CHORD ? GetLevelByClass(nClass, oPC) : GetSpellslotLevel(nClass, oPC);
|
||||||
|
|
||||||
|
if (DEBUG) DoDebug("CheckMissingSpells 1 Class: " + IntToString(nClass));
|
||||||
|
if (DEBUG) DoDebug("CheckMissingSpells 1 Level: " + IntToString(nLevel));
|
||||||
|
|
||||||
|
if(!nLevel)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if(nClass == CLASS_TYPE_BARD || nClass == CLASS_TYPE_SORCERER)
|
||||||
|
{
|
||||||
|
if((GetLevelByClass(nClass, oPC) == nLevel) //no PrC
|
||||||
|
&& !(GetHasFeat(FEAT_DRACONIC_GRACE, oPC) || GetHasFeat(FEAT_DRACONIC_BREATH, oPC))) //no Draconic feats that apply
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else if(nClass == CLASS_TYPE_ARCHIVIST)
|
||||||
|
{
|
||||||
|
int nLastGainLevel = GetPersistantLocalInt(oPC, "LastSpellGainLevel");
|
||||||
|
nLevel = GetLevelByClass(CLASS_TYPE_ARCHIVIST, oPC);
|
||||||
|
|
||||||
|
|
||||||
|
//add cleric spells known for level 0
|
||||||
|
if(persistant_array_get_size(oPC, "Spellbook_Known_"+IntToString(CLASS_TYPE_ARCHIVIST)+"_0") < 5) // TODO: replace with GetSpellKnownCurrentCount
|
||||||
|
{
|
||||||
|
ActionDoCommand(AddSpellsForLevel(CLASS_TYPE_ARCHIVIST, 0));
|
||||||
|
}
|
||||||
|
if(nLastGainLevel < nLevel)
|
||||||
|
{
|
||||||
|
if (!IsLevelUpNUIOpen(oPC))
|
||||||
|
OpenNUILevelUpWindow(nClass, oPC);
|
||||||
|
/*
|
||||||
|
SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_ARCHIVIST);
|
||||||
|
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
|
||||||
|
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, TRUE, FALSE, oPC);
|
||||||
|
*/
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DEBUG) DoDebug("CheckMissingSpells 2 Class: " + IntToString(nClass));
|
||||||
|
if (DEBUG) DoDebug("CheckMissingSpells 2 Level: " + IntToString(nLevel));
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for(i = nMinLevel; i <= nMaxLevel; i++)
|
||||||
|
{
|
||||||
|
int nMaxSpells = GetSpellKnownMaxCount(nLevel, i, nClass, oPC);
|
||||||
|
if(nMaxSpells > 0)
|
||||||
|
{
|
||||||
|
int nCurrentSpells = GetSpellKnownCurrentCount(oPC, i, nClass);
|
||||||
|
int nSpellsAvailable = GetSpellUnknownCurrentCount(oPC, i, nClass);
|
||||||
|
|
||||||
|
if(nCurrentSpells < nMaxSpells && nSpellsAvailable > 0)
|
||||||
|
{
|
||||||
|
if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS && bKnowsAllClassSpells(nClass))
|
||||||
|
{
|
||||||
|
ActionDoCommand(AddSpellsForLevel(nClass, i));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!IsLevelUpNUIOpen(oPC))
|
||||||
|
OpenNUILevelUpWindow(nClass, oPC);
|
||||||
|
/*
|
||||||
|
// Mark the class for which the PC is to gain powers and start the conversation
|
||||||
|
SetLocalInt(oPC, "SpellGainClass", nClass);
|
||||||
|
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
|
||||||
|
SetLocalInt(oPC, "SpellbookMaxSpelllevel", nMaxLevel);
|
||||||
|
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||||||
|
*/
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Advanced Learning check
|
||||||
|
nLevel = GetLevelByClass(nClass, oPC);
|
||||||
|
int nALSpells = GetPersistantLocalInt(oPC, "AdvancedLearning_"+IntToString(nClass));
|
||||||
|
if(nClass == CLASS_TYPE_BEGUILER && nALSpells < (nLevel+1)/4)//one every 4 levels starting at 3.
|
||||||
|
{
|
||||||
|
if (!IsLevelUpNUIOpen(oPC))
|
||||||
|
OpenNUILevelUpWindow(nClass, oPC);
|
||||||
|
/*
|
||||||
|
// Mark the class for which the PC is to gain powers and start the conversation
|
||||||
|
SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_BEGUILER);
|
||||||
|
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
|
||||||
|
SetLocalInt(oPC, "AdvancedLearning", 1);
|
||||||
|
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||||||
|
*/
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else if(nClass == CLASS_TYPE_DREAD_NECROMANCER && nALSpells < nLevel/4)//one every 4 levels
|
||||||
|
{
|
||||||
|
if (!IsLevelUpNUIOpen(oPC))
|
||||||
|
OpenNUILevelUpWindow(nClass, oPC);
|
||||||
|
/*
|
||||||
|
// Mark the class for which the PC is to gain powers and start the conversation
|
||||||
|
SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_DREAD_NECROMANCER);
|
||||||
|
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
|
||||||
|
SetLocalInt(oPC, "AdvancedLearning", 1);
|
||||||
|
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||||||
|
*/
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else if(nClass == CLASS_TYPE_WARMAGE)
|
||||||
|
{
|
||||||
|
if((nLevel >= 40 && nALSpells < 9) ||// :/
|
||||||
|
(nLevel >= 36 && nLevel < 40 && nALSpells < 8) ||
|
||||||
|
(nLevel >= 32 && nLevel < 36 && nALSpells < 7) ||
|
||||||
|
(nLevel >= 28 && nLevel < 32 && nALSpells < 6) ||
|
||||||
|
(nLevel >= 24 && nLevel < 28 && nALSpells < 5) ||
|
||||||
|
(nLevel >= 16 && nLevel < 24 && nALSpells < 4) ||
|
||||||
|
(nLevel >= 11 && nLevel < 16 && nALSpells < 3) ||
|
||||||
|
(nLevel >= 6 && nLevel < 11 && nALSpells < 2) ||
|
||||||
|
(nLevel >= 3 && nLevel < 6 && nALSpells < 1))
|
||||||
|
{
|
||||||
|
if (!IsLevelUpNUIOpen(oPC))
|
||||||
|
OpenNUILevelUpWindow(nClass, oPC);
|
||||||
|
/*
|
||||||
|
// Mark the class for which the PC is to gain powers and start the conversation
|
||||||
|
SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_WARMAGE);
|
||||||
|
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
|
||||||
|
SetLocalInt(oPC, "AdvancedLearning", 1);
|
||||||
|
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||||||
|
*/
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(nClass == CLASS_TYPE_NIGHTSTALKER && nALSpells < (nLevel+1)/6)//one every 6 levels starting at 5th
|
||||||
|
{
|
||||||
|
// Mark the class for which the PC is to gain powers and start the conversation
|
||||||
|
SetLocalInt(oPC, "SpellGainClass", CLASS_TYPE_NIGHTSTALKER);
|
||||||
|
SetLocalInt(oPC, "SpellbookMinSpelllevel", nMinLevel);
|
||||||
|
SetLocalInt(oPC, "AdvancedLearning", 1);
|
||||||
|
StartDynamicConversation("prc_s_spellgain", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CheckMissingUtterances(object oPC, int nClass, int nLexicon)
|
||||||
|
{
|
||||||
|
int nLevel = GetLevelByClass(nClass, oPC);
|
||||||
|
if(!nLevel)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
int nCurrentUtterances = GetUtteranceCount(oPC, nClass, nLexicon);
|
||||||
|
int nMaxUtterances = GetMaxUtteranceCount(oPC, nClass, nLexicon);
|
||||||
|
if(DEBUG) DoDebug("CheckMissingUtterances(" + IntToString(nClass) + ", " + IntToString(nLexicon) + ", " + GetName(oPC) + ") = " + IntToString(nCurrentUtterances) + ", " + IntToString(nMaxUtterances));
|
||||||
|
|
||||||
|
if(nCurrentUtterances < nMaxUtterances)
|
||||||
|
{
|
||||||
|
if (!IsLevelUpNUIOpen(oPC))
|
||||||
|
OpenNUILevelUpWindow(nClass, oPC);
|
||||||
|
/*
|
||||||
|
// Mark the class for which the PC is to gain Utterances and start the conversation
|
||||||
|
SetLocalInt(oPC, "nClass", nClass);
|
||||||
|
StartDynamicConversation("true_utterconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||||||
|
*/
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CheckMissingManeuvers(object oPC, int nClass)
|
||||||
|
{
|
||||||
|
int nLevel = GetLevelByClass(nClass, oPC);
|
||||||
|
if(!nLevel)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
int nCurrentManeuvers = GetManeuverCount(oPC, nClass, MANEUVER_TYPE_MANEUVER);
|
||||||
|
int nMaxManeuvers = GetMaxManeuverCount(oPC, nClass, MANEUVER_TYPE_MANEUVER);
|
||||||
|
int nCurrentStances = GetManeuverCount(oPC, nClass, MANEUVER_TYPE_STANCE);
|
||||||
|
int nMaxStances = GetMaxManeuverCount(oPC, nClass, MANEUVER_TYPE_STANCE);
|
||||||
|
|
||||||
|
if(nCurrentManeuvers < nMaxManeuvers || nCurrentStances < nMaxStances)
|
||||||
|
{
|
||||||
|
if (!IsLevelUpNUIOpen(oPC))
|
||||||
|
OpenNUILevelUpWindow(nClass, oPC);
|
||||||
|
/*
|
||||||
|
// Mark the class for which the PC is to gain powers and start the conversation
|
||||||
|
SetLocalInt(oPC, "nClass", nClass);
|
||||||
|
StartDynamicConversation("tob_moveconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||||||
|
*/
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CheckMissingMysteries(object oPC, int nClass)
|
||||||
|
{
|
||||||
|
int nLevel = GetLevelByClass(nClass, oPC);
|
||||||
|
if(!nLevel)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
int nCurrentMysteries = GetMysteryCount(oPC, nClass);
|
||||||
|
int nMaxMysteries = GetMaxMysteryCount(oPC, nClass);
|
||||||
|
|
||||||
|
if(nCurrentMysteries < nMaxMysteries)
|
||||||
|
{
|
||||||
|
if (!IsLevelUpNUIOpen(oPC))
|
||||||
|
OpenNUILevelUpWindow(nClass, oPC);
|
||||||
|
/*
|
||||||
|
// Mark the class for which the PC is to gain powers and start the conversation
|
||||||
|
SetLocalInt(oPC, "nClass", nClass);
|
||||||
|
StartDynamicConversation("shd_mystconv", oPC, DYNCONV_EXIT_NOT_ALLOWED, FALSE, TRUE, oPC);
|
||||||
|
*/
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//AMS Compatibility functions - xwarren:
|
||||||
|
void CopyAMSArray(object oPC, object oAMSToken, int nClass, string sArray, int nMin, int nMax, int nLoopSize = 100)
|
||||||
|
{
|
||||||
|
string sFile = GetFileForClass(nClass);
|
||||||
|
int i = nMin;
|
||||||
|
while(i < nMin + nLoopSize && i < nMax)
|
||||||
|
{
|
||||||
|
int nSpellbookID = persistant_array_get_int(oPC, sArray, i);
|
||||||
|
int nSpell = StringToInt(Get2DACache(sFile, "RealSpellID", nSpellbookID));
|
||||||
|
if(DEBUG) DoDebug("Copying spell "+IntToString(nSpell));
|
||||||
|
array_set_int(oAMSToken, sArray, i, nSpell);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if(i < nMax)
|
||||||
|
DelayCommand(0.0, CopyAMSArray(oPC, oAMSToken, nClass, sArray, i, nMax));
|
||||||
|
}
|
||||||
|
|
||||||
|
void DoBuckUpAMS(object oPC, int nClass, string sSpellbook, object oHideToken, object oAMSToken)
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("Creating buck-up copy of "+sSpellbook);
|
||||||
|
if(array_exists(oAMSToken, sSpellbook))
|
||||||
|
array_delete(oAMSToken, sSpellbook);
|
||||||
|
array_create(oAMSToken, sSpellbook);
|
||||||
|
int nSize = persistant_array_get_size(oPC, sSpellbook);
|
||||||
|
DelayCommand(0.0, CopyAMSArray(oPC, oAMSToken, nClass, sSpellbook, 0, nSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AMSCompatibilityCheck(object oPC)
|
||||||
|
{
|
||||||
|
//Get an extra hide token with amagsys info
|
||||||
|
object oAMSToken = GetHideToken(oPC, TRUE);
|
||||||
|
object oHideToken = GetHideToken(oPC); //ebonfowl: no longer used but I'm leaving it to not have to edit other functions
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for(i = 1; i <= 8; i++)
|
||||||
|
{
|
||||||
|
int nClass = GetClassByPosition(i, oPC);
|
||||||
|
string sSpellbook;
|
||||||
|
int nSpellbookType = GetSpellbookTypeForClass(nClass);
|
||||||
|
if(nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS)
|
||||||
|
{
|
||||||
|
sSpellbook = "Spellbook"+IntToString(nClass);
|
||||||
|
int nSize1 = persistant_array_get_size(oPC, sSpellbook);
|
||||||
|
int nSize2 = array_get_size(oAMSToken, sSpellbook);
|
||||||
|
if(nSize1 > nSize2)
|
||||||
|
DelayCommand(0.1f, DoBuckUpAMS(oPC, nClass, sSpellbook, oHideToken, oAMSToken));
|
||||||
|
}
|
||||||
|
else if(nSpellbookType == SPELLBOOK_TYPE_PREPARED)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for(j = 0; j <= 9; j++)
|
||||||
|
{
|
||||||
|
sSpellbook = "Spellbook_Known_"+IntToString(nClass)+"_"+IntToString(j);
|
||||||
|
int nSize1 = persistant_array_get_size(oPC, sSpellbook);
|
||||||
|
int nSize2 = array_get_size(oAMSToken, sSpellbook);
|
||||||
|
if(nSize1 > nSize2)
|
||||||
|
DelayCommand(0.1f, DoBuckUpAMS(oPC, nClass, sSpellbook, oHideToken, oAMSToken));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
530
Notes/prc_nui_com_inc.nss.bak
Normal file
530
Notes/prc_nui_com_inc.nss.bak
Normal file
@@ -0,0 +1,530 @@
|
|||||||
|
#include "prc_nui_consts"
|
||||||
|
#include "inc_newspellbook"
|
||||||
|
#include "psi_inc_psifunc"
|
||||||
|
#include "inc_lookups"
|
||||||
|
#include "nw_inc_nui"
|
||||||
|
|
||||||
|
//
|
||||||
|
// GetCurrentSpellLevel
|
||||||
|
// Gets the current spell level the class can achieve at the current
|
||||||
|
// caster level (ranging from 0-9)
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// nClass:int the ClassID
|
||||||
|
// nLevel:int the caster level
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// int the circle the class can achieve currently
|
||||||
|
//
|
||||||
|
int GetCurrentSpellLevel(int nClass, int nLevel);
|
||||||
|
|
||||||
|
//
|
||||||
|
// GetMaxSpellLevel
|
||||||
|
// Gets the highest possible circle the class can achieve (from 0-9)
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// nClass:int the ClassID
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// int the highest circle that can be achieved
|
||||||
|
//
|
||||||
|
int GetMaxSpellLevel(int nClass);
|
||||||
|
|
||||||
|
//
|
||||||
|
// GetMinSpellLevel
|
||||||
|
// Gets the lowest possible circle the class can achieve (from 0-9)
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// nClass:int the ClassID
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// int the lowest circle that can be achieved
|
||||||
|
//
|
||||||
|
int GetMinSpellLevel(int nClass);
|
||||||
|
|
||||||
|
//
|
||||||
|
// GetHighestLevelPossibleInClass
|
||||||
|
// Given a class Id this will determine what the max level of a class can be
|
||||||
|
// achieved
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// nClass:int the ClassID
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// int the highest possible level the class can achieve
|
||||||
|
//
|
||||||
|
int GetHighestLevelPossibleInClass(int nClass);
|
||||||
|
|
||||||
|
//
|
||||||
|
// GetClassSpellbookFile
|
||||||
|
// Gets the class 2da spellbook/ability for the given class Id
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// nClass:int the classID
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// string the 2da file name for the spell/abilities of the ClassID
|
||||||
|
//
|
||||||
|
string GetClassSpellbookFile(int nClass);
|
||||||
|
|
||||||
|
//
|
||||||
|
// GetBinderSpellToFeatDictionary
|
||||||
|
// Sets up the Binder Spell Dictionary that is used to match a binder's vestige
|
||||||
|
// to their feat. This is constructed based off the binder's known location of
|
||||||
|
// their feat and spell ranges in the base 2das respectivly. After constructing
|
||||||
|
// this it will be saved to the player locally as a cached result since we do
|
||||||
|
// not need to call this again.
|
||||||
|
//
|
||||||
|
// Argument:
|
||||||
|
// oPlayer:object the player
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// json:Dictionary<String,Int> a dictionary of mapping between the SpellID
|
||||||
|
// and the FeatID of a vestige ability
|
||||||
|
//
|
||||||
|
json GetBinderSpellToFeatDictionary(object oPlayer=OBJECT_SELF);
|
||||||
|
|
||||||
|
//
|
||||||
|
// GetSpellLevelIcon
|
||||||
|
// Takes the spell circle int and gets the icon appropriate for it (i.e. 0 turns
|
||||||
|
// into "ir_cantrips"
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// spellLevel:int the spell level we want the icon for
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// string the spell level icon
|
||||||
|
//
|
||||||
|
string GetSpellLevelIcon(int spellLevel);
|
||||||
|
|
||||||
|
//
|
||||||
|
// GetSpellLevelToolTip
|
||||||
|
// Gets the spell level tool tip text based on the int spell level provided (i.e.
|
||||||
|
// 0 turns into "Cantrips")
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// spellLevel:int the spell level we want the tooltip for
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// string the spell level toop tip
|
||||||
|
//
|
||||||
|
string GetSpellLevelToolTip(int spellLevel);
|
||||||
|
|
||||||
|
//
|
||||||
|
// GetSpellIcon
|
||||||
|
// Gets the spell icon based off the spellId, or featId supplied
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// nClass:int the class Id
|
||||||
|
// featId:int the featId we can use the icon for
|
||||||
|
// spellId:int the spell Id we want the icon for
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// json:String the string of the icon we want.
|
||||||
|
//
|
||||||
|
json GetSpellIcon(int spellId, int featId=0, int nClass=0);
|
||||||
|
string GetSpellName(int spellId, int realSpellID=0, int featId=0, int nClass=0);
|
||||||
|
|
||||||
|
//
|
||||||
|
// GreyOutButton
|
||||||
|
// Takes NUI Button along with it's width and height and greys it out it with a drawn
|
||||||
|
// colored rectangle to represent it's not been selected or not valid.
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// jButton:json the NUI Button
|
||||||
|
// w:float the width of the button
|
||||||
|
// h:float the height of the button
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// json the NUI button greyed out
|
||||||
|
//
|
||||||
|
json GreyOutButton(json jButton, float w, float h);
|
||||||
|
|
||||||
|
//
|
||||||
|
// CreateGreyOutRectangle
|
||||||
|
// Creates a grey out rectangle for buttons
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// w:float the width of the button
|
||||||
|
// h:float the height of the button
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// json the transparant black rectangle
|
||||||
|
//
|
||||||
|
json CreateGreyOutRectangle(float w, float h);
|
||||||
|
|
||||||
|
void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0, int nClass=0);
|
||||||
|
void ClearSpellDescriptionNUI(object oPlayer=OBJECT_SELF);
|
||||||
|
|
||||||
|
int GetCurrentSpellLevel(int nClass, int nLevel)
|
||||||
|
{
|
||||||
|
int currentLevel = nLevel;
|
||||||
|
|
||||||
|
// ToB doesn't have a concept of spell levels, but still match up to it
|
||||||
|
if(nClass == CLASS_TYPE_WARBLADE
|
||||||
|
|| nClass == CLASS_TYPE_SWORDSAGE
|
||||||
|
|| nClass == CLASS_TYPE_CRUSADER
|
||||||
|
|| nClass == CLASS_TYPE_SHADOWCASTER)
|
||||||
|
{
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Binders don't really have a concept of spell level
|
||||||
|
if (nClass == CLASS_TYPE_BINDER
|
||||||
|
|| nClass == CLASS_TYPE_DRAGON_SHAMAN) // they can only reach 1st circle
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
//Shadowsmith has no concept of spell levels
|
||||||
|
if (nClass == CLASS_TYPE_SHADOWSMITH)
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
if (nClass == CLASS_TYPE_WARLOCK
|
||||||
|
|| nClass == CLASS_TYPE_DRAGONFIRE_ADEPT)
|
||||||
|
return 4;
|
||||||
|
|
||||||
|
// Spont casters have their own function
|
||||||
|
if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS
|
||||||
|
|| nClass == CLASS_TYPE_ARCHIVIST)
|
||||||
|
{
|
||||||
|
|
||||||
|
int maxLevel = GetMaxSpellLevelForCasterLevel(nClass, currentLevel);
|
||||||
|
return maxLevel;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// everyone else uses this
|
||||||
|
string spellLevel2da = GetAMSKnownFileName(nClass);
|
||||||
|
|
||||||
|
currentLevel = nLevel - 1; // Level is 1 off of the row in the 2da
|
||||||
|
|
||||||
|
if (nClass == CLASS_TYPE_FIST_OF_ZUOKEN
|
||||||
|
|| nClass == CLASS_TYPE_PSION
|
||||||
|
|| nClass == CLASS_TYPE_PSYWAR
|
||||||
|
|| nClass == CLASS_TYPE_WILDER
|
||||||
|
|| nClass == CLASS_TYPE_PSYCHIC_ROGUE
|
||||||
|
|| nClass == CLASS_TYPE_WARMIND)
|
||||||
|
currentLevel = GetManifesterLevel(OBJECT_SELF, nClass, TRUE) - 1;
|
||||||
|
|
||||||
|
int totalLevel = Get2DARowCount(spellLevel2da);
|
||||||
|
|
||||||
|
// in case we somehow go over bounds just don't :)
|
||||||
|
if (currentLevel >= totalLevel)
|
||||||
|
currentLevel = totalLevel - 1;
|
||||||
|
|
||||||
|
//Psionics have MaxPowerLevel as their column name
|
||||||
|
string columnName = "MaxPowerLevel";
|
||||||
|
|
||||||
|
//Invokers have MaxInvocationLevel
|
||||||
|
if (nClass == CLASS_TYPE_WARLOCK
|
||||||
|
|| nClass == CLASS_TYPE_DRAGON_SHAMAN
|
||||||
|
|| nClass == CLASS_TYPE_DRAGONFIRE_ADEPT)
|
||||||
|
columnName = "MaxInvocationLevel";
|
||||||
|
|
||||||
|
// Truenamers have 3 sets of utterances, ranging from 1-6, EvolvingMind covers the entire range
|
||||||
|
if (nClass == CLASS_TYPE_TRUENAMER)
|
||||||
|
{
|
||||||
|
columnName = "EvolvingMind";
|
||||||
|
spellLevel2da = "cls_true_maxlvl"; //has a different 2da we want to look at
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nClass == CLASS_TYPE_BINDER)
|
||||||
|
{
|
||||||
|
columnName = "VestigeLvl";
|
||||||
|
spellLevel2da = "cls_bind_binder";
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToB doesn't have a concept of this, but we don't care.
|
||||||
|
|
||||||
|
int maxLevel = StringToInt(Get2DACache(spellLevel2da, columnName, currentLevel));
|
||||||
|
return maxLevel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetMinSpellLevel(int nClass)
|
||||||
|
{
|
||||||
|
// again sponts have their own function
|
||||||
|
if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS
|
||||||
|
|| nClass == CLASS_TYPE_ARCHIVIST)
|
||||||
|
{
|
||||||
|
return GetMinSpellLevelForCasterLevel(nClass, GetHighestLevelPossibleInClass(nClass));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (nClass == CLASS_TYPE_FIST_OF_ZUOKEN
|
||||||
|
|| nClass == CLASS_TYPE_PSION
|
||||||
|
|| nClass == CLASS_TYPE_PSYWAR
|
||||||
|
|| nClass == CLASS_TYPE_WILDER
|
||||||
|
|| nClass == CLASS_TYPE_PSYCHIC_ROGUE
|
||||||
|
|| nClass == CLASS_TYPE_WARMIND
|
||||||
|
|| nClass == CLASS_TYPE_WARBLADE
|
||||||
|
|| nClass == CLASS_TYPE_SWORDSAGE
|
||||||
|
|| nClass == CLASS_TYPE_CRUSADER
|
||||||
|
|| nClass == CLASS_TYPE_WARLOCK
|
||||||
|
|| nClass == CLASS_TYPE_DRAGONFIRE_ADEPT
|
||||||
|
|| nClass == CLASS_TYPE_DRAGON_SHAMAN
|
||||||
|
|| nClass == CLASS_TYPE_SHADOWCASTER
|
||||||
|
|| nClass == CLASS_TYPE_SHADOWSMITH
|
||||||
|
|| nClass == CLASS_TYPE_BINDER)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return GetCurrentSpellLevel(nClass, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetMaxSpellLevel(int nClass)
|
||||||
|
{
|
||||||
|
if (nClass == CLASS_TYPE_WILDER
|
||||||
|
|| nClass == CLASS_TYPE_PSION)
|
||||||
|
return 9;
|
||||||
|
if (nClass == CLASS_TYPE_PSYCHIC_ROGUE
|
||||||
|
|| nClass == CLASS_TYPE_FIST_OF_ZUOKEN
|
||||||
|
|| nClass == CLASS_TYPE_WARMIND)
|
||||||
|
return 5;
|
||||||
|
if (nClass == CLASS_TYPE_PSYWAR)
|
||||||
|
return 6;
|
||||||
|
|
||||||
|
return GetCurrentSpellLevel(nClass, GetHighestLevelPossibleInClass(nClass));
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetHighestLevelPossibleInClass(int nClass)
|
||||||
|
{
|
||||||
|
string sFile;
|
||||||
|
|
||||||
|
//sponts have their spells in the classes.2da
|
||||||
|
if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS
|
||||||
|
|| nClass == CLASS_TYPE_ARCHIVIST)
|
||||||
|
{
|
||||||
|
sFile = Get2DACache("classes", "SpellGainTable", nClass);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// everyone else uses this
|
||||||
|
sFile = GetAMSKnownFileName(nClass);
|
||||||
|
|
||||||
|
if (nClass == CLASS_TYPE_TRUENAMER)
|
||||||
|
{
|
||||||
|
sFile = "cls_true_maxlvl"; //has a different 2da we want to look at
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nClass == CLASS_TYPE_BINDER)
|
||||||
|
{
|
||||||
|
sFile = "cls_bind_binder";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Get2DARowCount(sFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetClassSpellbookFile(int nClass)
|
||||||
|
{
|
||||||
|
string sFile;
|
||||||
|
// Spontaneous casters use a specific file name structure
|
||||||
|
if(GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS
|
||||||
|
|| nClass == CLASS_TYPE_ARCHIVIST)
|
||||||
|
{
|
||||||
|
sFile = GetFileForClass(nClass);
|
||||||
|
}
|
||||||
|
// everyone else uses this structure
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sFile = GetAMSDefinitionFileName(nClass);
|
||||||
|
|
||||||
|
if (nClass == CLASS_TYPE_BINDER)
|
||||||
|
{
|
||||||
|
sFile = "vestiges";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetSpellLevelIcon(int spellLevel)
|
||||||
|
{
|
||||||
|
switch (spellLevel)
|
||||||
|
{
|
||||||
|
case 0: return "ir_cantrips";
|
||||||
|
case 1: return "ir_level1";
|
||||||
|
case 2: return "ir_level2";
|
||||||
|
case 3: return "ir_level3";
|
||||||
|
case 4: return "ir_level4";
|
||||||
|
case 5: return "ir_level5";
|
||||||
|
case 6: return "ir_level6";
|
||||||
|
case 7: return "ir_level789";
|
||||||
|
case 8: return "ir_level789";
|
||||||
|
case 9: return "ir_level789";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetSpellLevelToolTip(int spellLevel)
|
||||||
|
{
|
||||||
|
switch (spellLevel)
|
||||||
|
{
|
||||||
|
case 0: return "Cantrips";
|
||||||
|
case 1: return "Level 1";
|
||||||
|
case 2: return "Level 2";
|
||||||
|
case 3: return "Level 3";
|
||||||
|
case 4: return "Level 4";
|
||||||
|
case 5: return "Level 5";
|
||||||
|
case 6: return "Level 6";
|
||||||
|
case 7: return "Level 7";
|
||||||
|
case 8: return "Level 8";
|
||||||
|
case 9: return "Level 9";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
json GetSpellIcon(int spellId,int featId=0,int nClass=0)
|
||||||
|
{
|
||||||
|
// Binder's spells don't have the FeatID on the spells.2da, so we have to use
|
||||||
|
// the mapping we constructed to get it.
|
||||||
|
if (nClass == CLASS_TYPE_BINDER)
|
||||||
|
{
|
||||||
|
json binderDict = GetBinderSpellToFeatDictionary();
|
||||||
|
int nFeatID = JsonGetInt(JsonObjectGet(binderDict, IntToString(spellId)));
|
||||||
|
return JsonString(Get2DACache("feat", "Icon", featId));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (featId)
|
||||||
|
return JsonString(Get2DACache("feat", "Icon", featId));
|
||||||
|
|
||||||
|
int masterSpellID = StringToInt(Get2DACache("spells", "Master", spellId));
|
||||||
|
|
||||||
|
// if this is a sub radial spell, then we use spell's icon instead
|
||||||
|
if (masterSpellID)
|
||||||
|
return JsonString(Get2DACache("spells", "IconResRef", spellId));
|
||||||
|
|
||||||
|
// the FeatID holds the accurate spell icon, not the SpellID
|
||||||
|
int nFeatID = StringToInt(Get2DACache("spells", "FeatID", spellId));
|
||||||
|
|
||||||
|
return JsonString(Get2DACache("feat", "Icon", nFeatID));
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetSpellName(int spellId, int realSpellID=0, int featId=0, int nClass=0)
|
||||||
|
{
|
||||||
|
if ((nClass == CLASS_TYPE_SHADOWSMITH
|
||||||
|
|| nClass == CLASS_TYPE_SHADOWCASTER) && spellId)
|
||||||
|
return GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellId)));
|
||||||
|
if (nClass == CLASS_TYPE_TRUENAMER && featId)
|
||||||
|
return GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", featId)));
|
||||||
|
if (realSpellID)
|
||||||
|
return GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", realSpellID)));
|
||||||
|
if (spellId)
|
||||||
|
return GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellId)));
|
||||||
|
if (featId)
|
||||||
|
return GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", featId)));
|
||||||
|
|
||||||
|
return GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellId)));
|
||||||
|
}
|
||||||
|
|
||||||
|
json GetBinderSpellToFeatDictionary(object oPlayer=OBJECT_SELF)
|
||||||
|
{
|
||||||
|
// a dictionary of <SpellID, FeatID>
|
||||||
|
json binderDict = GetLocalJson(oPlayer, NUI_SPELLBOOK_BINDER_DICTIONARY_CACHE_VAR);
|
||||||
|
// if this hasn't been created, create it now.
|
||||||
|
if (binderDict == JsonNull())
|
||||||
|
binderDict = JsonObject();
|
||||||
|
else
|
||||||
|
return binderDict;
|
||||||
|
|
||||||
|
// the starting row for binder spells
|
||||||
|
int spellIndex = 19070;
|
||||||
|
// the starting row for binder feats
|
||||||
|
int featIndex = 9030;
|
||||||
|
//the end of the binder spells/feats
|
||||||
|
while (spellIndex <= 19156 && featIndex <= 9104)
|
||||||
|
{
|
||||||
|
// get the SpellID tied to the feat
|
||||||
|
int spellID = StringToInt(Get2DACache("feat", "SPELLID", featIndex));
|
||||||
|
// if the spellID matches the current index, then this is the spell
|
||||||
|
// attached to the feat
|
||||||
|
if (spellID == spellIndex)
|
||||||
|
{
|
||||||
|
binderDict = JsonObjectSet(binderDict, IntToString(spellID), JsonInt(featIndex));
|
||||||
|
|
||||||
|
// move to next spell/feat
|
||||||
|
featIndex++;
|
||||||
|
spellIndex++;
|
||||||
|
}
|
||||||
|
// else we have reached a subdial spell
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// loop through until we reach back at spellID
|
||||||
|
while (spellIndex < spellID)
|
||||||
|
{
|
||||||
|
int masterSpell = StringToInt(Get2DACache("spells", "Master", spellIndex));
|
||||||
|
|
||||||
|
// add the sub radial to the dict, tied to the master's FeatID
|
||||||
|
int featId = JsonGetInt(JsonObjectGet(binderDict, IntToString(masterSpell)));
|
||||||
|
binderDict = JsonObjectSet(binderDict, IntToString(spellIndex), JsonInt(featId));
|
||||||
|
|
||||||
|
spellIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// some feats overlap the same FeatID, can cause this to get stuck.
|
||||||
|
// if it happens then move on
|
||||||
|
if (spellIndex > spellID)
|
||||||
|
featIndex++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// cache the result
|
||||||
|
SetLocalJson(oPlayer, NUI_SPELLBOOK_BINDER_DICTIONARY_CACHE_VAR, binderDict);
|
||||||
|
return binderDict;
|
||||||
|
}
|
||||||
|
|
||||||
|
json GreyOutButton(json jButton, float w, float h)
|
||||||
|
{
|
||||||
|
json retValue = jButton;
|
||||||
|
|
||||||
|
json jBorders = JsonArray();
|
||||||
|
jBorders = JsonArrayInsert(jBorders, CreateGreyOutRectangle(w, h));
|
||||||
|
|
||||||
|
return NuiDrawList(jButton, JsonBool(FALSE), jBorders);
|
||||||
|
}
|
||||||
|
|
||||||
|
json CreateGreyOutRectangle(float w, float h)
|
||||||
|
{
|
||||||
|
// set the points of the button shape
|
||||||
|
json jPoints = JsonArray();
|
||||||
|
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
|
||||||
|
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
|
||||||
|
|
||||||
|
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
|
||||||
|
jPoints = JsonArrayInsert(jPoints, JsonFloat(h));
|
||||||
|
|
||||||
|
jPoints = JsonArrayInsert(jPoints, JsonFloat(w));
|
||||||
|
jPoints = JsonArrayInsert(jPoints, JsonFloat(h));
|
||||||
|
|
||||||
|
jPoints = JsonArrayInsert(jPoints, JsonFloat(w));
|
||||||
|
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
|
||||||
|
|
||||||
|
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
|
||||||
|
jPoints = JsonArrayInsert(jPoints, JsonFloat(0.0));
|
||||||
|
|
||||||
|
return NuiDrawListPolyLine(JsonBool(TRUE), NuiColor(0, 0, 0, 127), JsonBool(TRUE), JsonFloat(2.0), jPoints);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0, int nClass=0)
|
||||||
|
{
|
||||||
|
SetLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_FEATID_VAR, featID);
|
||||||
|
SetLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_SPELLID_VAR, spellId);
|
||||||
|
SetLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_REAL_SPELLID_VAR, realSpellId);
|
||||||
|
SetLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_CLASSID_VAR, nClass);
|
||||||
|
ExecuteScript("prc_nui_dsc_view", oPlayer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClearSpellDescriptionNUI(object oPlayer=OBJECT_SELF)
|
||||||
|
{
|
||||||
|
DeleteLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_FEATID_VAR);
|
||||||
|
DeleteLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_SPELLID_VAR);
|
||||||
|
DeleteLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_REAL_SPELLID_VAR);
|
||||||
|
DeleteLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_CLASSID_VAR);
|
||||||
|
}
|
||||||
|
|
||||||
3353
Notes/prc_nui_lv_inc.nss.bak
Normal file
3353
Notes/prc_nui_lv_inc.nss.bak
Normal file
File diff suppressed because it is too large
Load Diff
165
Notes/prc_onplayerchat.nss.bak
Normal file
165
Notes/prc_onplayerchat.nss.bak
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
//::///////////////////////////////////////////////
|
||||||
|
//:: OnPlayerChat eventscript
|
||||||
|
//:: prc_onplayerchat
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
/*
|
||||||
|
A OnChat script that parses what is said and
|
||||||
|
uses any commands or NUI associated with
|
||||||
|
commands.
|
||||||
|
*/
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
//:: Updated By: Rakiov
|
||||||
|
//:: Created On: 22.05.2005
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
|
/*
|
||||||
|
PRC Chat Command Format:
|
||||||
|
~~command arg1 arg2 arg3 arg4 arg5
|
||||||
|
OR:
|
||||||
|
..command arg1 arg2 arg3 arg4 arg5
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "prc_alterations"
|
||||||
|
#include "prc_inc_chat"
|
||||||
|
#include "prc_inc_chat_dm"
|
||||||
|
#include "prc_inc_chat_pow"
|
||||||
|
#include "prc_inc_chat_shf"
|
||||||
|
#include "nw_inc_nui"
|
||||||
|
#include "prc_string_inc"
|
||||||
|
#include "prc_nui_sb_inc"
|
||||||
|
#include "prc_nui_consts"
|
||||||
|
#include "prc_nui_lv_inc"
|
||||||
|
|
||||||
|
const string CHAT_COMMAND_INDICATOR_1 = "~~";
|
||||||
|
const string CHAT_COMMAND_INDICATOR_2 = "..";
|
||||||
|
const int CHAT_COMMAND_INDICATOR_LENGHT = 2;
|
||||||
|
|
||||||
|
int GetIsChatCommand(string sString)
|
||||||
|
{
|
||||||
|
string sTest = GetStringLeft(sString, CHAT_COMMAND_INDICATOR_LENGHT);
|
||||||
|
if(sTest == CHAT_COMMAND_INDICATOR_1
|
||||||
|
|| sTest == CHAT_COMMAND_INDICATOR_2)
|
||||||
|
return TRUE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
string RemoveChatCommandIndicator(string sString)
|
||||||
|
{
|
||||||
|
return GetStringRight(sString, GetStringLength(sString) - CHAT_COMMAND_INDICATOR_LENGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
object oPC = GetPCChatSpeaker();
|
||||||
|
string sChat = GetPCChatMessage();
|
||||||
|
|
||||||
|
if(GetIsChatCommand(sChat))
|
||||||
|
{
|
||||||
|
sChat = RemoveChatCommandIndicator(sChat);
|
||||||
|
SetPCChatVolume(TALKVOLUME_TELL); //Set volume for all chat commands
|
||||||
|
|
||||||
|
if(GetStringWord(sChat, 1) == "help")
|
||||||
|
{
|
||||||
|
if(GetStringWord(sChat, 2) == "")
|
||||||
|
{
|
||||||
|
HelpText(oPC, "=== HELP SUMMARY");
|
||||||
|
HelpText(oPC, "");
|
||||||
|
HelpText(oPC, "Chat commands start with ~~ or .. followed by the command name and then any parameters.");
|
||||||
|
HelpText(oPC, " For example '~~execute test_script' will run the script named 'test_script'.");
|
||||||
|
HelpText(oPC, "");
|
||||||
|
HelpText(oPC, "A hyphen in a command name indicates that the word may be abbreviated as short as the point where the hyphen is.");
|
||||||
|
HelpText(oPC, " For example, 'exec-ute' may be entered as 'execute', 'execu', or 'exec', but not as 'exe'.");
|
||||||
|
HelpText(oPC, "");
|
||||||
|
HelpText(oPC, "Typing '~~help' displays a summary of the available commands (what you're reading now).");
|
||||||
|
HelpText(oPC, "Typing '~~help <command-name>' displays more detailed information about the specified command.");
|
||||||
|
HelpText(oPC, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Debug_ProcessChatCommand_Help(oPC, sChat))
|
||||||
|
{}
|
||||||
|
else if (PowerAttack_ProcessChatCommand_Help(oPC, sChat))
|
||||||
|
{}
|
||||||
|
else if (PnPShifter_ProcessChatCommand_Help(oPC, sChat))
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Debug_ProcessChatCommand(oPC, sChat))
|
||||||
|
{}
|
||||||
|
else if (PowerAttack_ProcessChatCommand(oPC, sChat))
|
||||||
|
{}
|
||||||
|
else if (PnPShifter_ProcessChatCommand(oPC, sChat))
|
||||||
|
{}
|
||||||
|
else
|
||||||
|
SendMessageToPC(oPC, "Unrecognized chat command: " + sChat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(GetLocalInt(oPC, PRC_CHAT_HOOK_ACTIVE))
|
||||||
|
{
|
||||||
|
SetPCChatVolume(TALKVOLUME_TELL);
|
||||||
|
SetLocalString(oPC, PRC_PLAYER_RESPONSE, sChat);
|
||||||
|
ExecuteScript(GetLocalString(oPC, PRC_CHAT_HOOK_SCRIPT), oPC);
|
||||||
|
_clear_chat_vars(oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get current player message and split it up into a list
|
||||||
|
string sCommand = GetPCChatMessage();
|
||||||
|
json sCommandSplit = StringSplit(sChat);
|
||||||
|
|
||||||
|
if(JsonGetLength(sCommandSplit) > 0)
|
||||||
|
{
|
||||||
|
string firstWord = JsonGetString(JsonArrayGet(sCommandSplit, 0));
|
||||||
|
|
||||||
|
// if first word is /pa we are using the power attack interface
|
||||||
|
if(firstWord == "/pa")
|
||||||
|
{
|
||||||
|
if(JsonGetLength(sCommandSplit) >= 2)
|
||||||
|
{
|
||||||
|
//if a parameter is given then run the power attack command directly.
|
||||||
|
string param1 = JsonGetString(JsonArrayGet(sCommandSplit, 1));
|
||||||
|
int paAmount = StringToInt(param1);
|
||||||
|
SetLocalInt(oPC, "PRC_PowerAttack_Level", paAmount);
|
||||||
|
ExecuteScript("prc_nui_pa_trggr", oPC);
|
||||||
|
|
||||||
|
// update the NUI so it is in sync
|
||||||
|
int nToken = NuiFindWindow(oPC, NUI_PRC_POWER_ATTACK_WINDOW);
|
||||||
|
if (nToken != 0)
|
||||||
|
{
|
||||||
|
NuiSetBind(oPC, nToken, NUI_PRC_PA_TEXT_BIND, JsonString(IntToString(paAmount)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if no param is given then open the NUI
|
||||||
|
ExecuteScript("prc_nui_pa_view", oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear message from chat
|
||||||
|
SetPCChatMessage();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// If the first word is /sb then we open the Spellbook NUI
|
||||||
|
if(firstWord == "/sb")
|
||||||
|
{
|
||||||
|
ExecuteScript("prc_nui_sb_view", oPC);
|
||||||
|
|
||||||
|
// clear message from chat
|
||||||
|
SetPCChatMessage();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (firstWord == "/lvl")
|
||||||
|
{
|
||||||
|
if (JsonGetLength(sCommandSplit) >= 2)
|
||||||
|
{
|
||||||
|
int classPos = StringToInt(JsonGetString(JsonArrayGet(sCommandSplit, 1)));
|
||||||
|
int nClass = GetClassByPosition(classPos, oPC);
|
||||||
|
OpenNUILevelUpWindow(nClass, oPC);
|
||||||
|
SetPCChatMessage();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute scripts hooked to this event for the player triggering it
|
||||||
|
ExecuteAllScriptsHookedToEvent(oPC, EVENT_ONPLAYERCHAT);
|
||||||
|
}
|
||||||
@@ -97,10 +97,10 @@
|
|||||||
93 SublimeChord 16790580 16829452 16829453 16829454 16829455 IR_X1_HARPER 6 CLS_ATK_3 CLS_FEAT_SCHORD CLS_SAVTHR_WIZ CLS_SKILL_SCHORD CLS_BFEAT_SCHORD 4 CLS_SPGN_SCHORD CLS_SPKN_SCHORD 1 1 10 14 12 10 14 16 CHA 0X00 0X0 0 CLASS_TYPE_SUBLIME_CHORD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SCHORD 40 0 0 0 10 46 131 **** **** **** **** **** **** **** **** **** SublimeCh **** **** **** **** ****
|
93 SublimeChord 16790580 16829452 16829453 16829454 16829455 IR_X1_HARPER 6 CLS_ATK_3 CLS_FEAT_SCHORD CLS_SAVTHR_WIZ CLS_SKILL_SCHORD CLS_BFEAT_SCHORD 4 CLS_SPGN_SCHORD CLS_SPKN_SCHORD 1 1 10 14 12 10 14 16 CHA 0X00 0X0 0 CLASS_TYPE_SUBLIME_CHORD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SCHORD 40 0 0 0 10 46 131 **** **** **** **** **** **** **** **** **** SublimeCh **** **** **** **** ****
|
||||||
94 Artificer 16790581 16827101 16827102 16827103 16827104 **** 6 CLS_ATK_2 CLS_FEAT_ARTI CLS_SAVTHR_WIZ CLS_SKILL_ARTI CLS_BFEAT_ARTI 4 **** **** 0 0 10 14 12 10 16 14 CHA 0X00 0X0 0 CLASS_TYPE_ARTIFICER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ARTI 0 1 0 0 -1 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
94 Artificer 16790581 16827101 16827102 16827103 16827104 **** 6 CLS_ATK_2 CLS_FEAT_ARTI CLS_SAVTHR_WIZ CLS_SKILL_ARTI CLS_BFEAT_ARTI 4 **** **** 0 0 10 14 12 10 16 14 CHA 0X00 0X0 0 CLASS_TYPE_ARTIFICER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ARTI 0 1 0 0 -1 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
95 Arcane_Duelist 16790582 16823520 16823521 16823522 16823523 IR_SPARCDLST 8 CLS_ATK_3 CLS_FEAT_ADST CLS_SAVTHR_BARD CLS_SKILL_ADST CLS_BFEAT_ADST 4 **** **** 1 0 12 16 14 8 14 12 CHA 0X00 0X0 0 CLASS_TYPE_ARCANE_DUELIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ADST 40 0 0 0 10 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
95 Arcane_Duelist 16790582 16823520 16823521 16823522 16823523 IR_SPARCDLST 8 CLS_ATK_3 CLS_FEAT_ADST CLS_SAVTHR_BARD CLS_SKILL_ADST CLS_BFEAT_ADST 4 **** **** 1 0 12 16 14 8 14 12 CHA 0X00 0X0 0 CLASS_TYPE_ARCANE_DUELIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ADST 40 0 0 0 10 **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
96 ForceMissileMage 16790583 16836426 16836427 16836428 16836429 IR_HAVOCMAGE 4 CLS_ATK_3 CLS_FEAT_FMM CLS_SAVTHR_ROG CLS_SKILL_FMM CLS_BFEAT_FMM 2 **** **** 1 0 12 14 14 10 12 15 CHA 0X00 0X0 0 CLASS_TYPE_FMM 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FMM 5 0 1 0 10 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
96 ForceMissileMage 16790583 16836426 16836427 16836428 16836429 IR_HAVOCMAGE 4 CLS_ATK_3 CLS_FEAT_FMM CLS_SAVTHR_ROG CLS_SKILL_FMM CLS_BFEAT_FMM 2 **** **** 1 0 12 14 14 10 12 15 INT 0X00 0X0 0 CLASS_TYPE_FMM 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FMM 5 0 1 0 5 31 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
97 WildMage 16790584 16836416 16836417 16836418 16836419 IR_WILDER 4 CLS_ATK_3 CLS_FEAT_WILDMG CLS_SAVTHR_ROG CLS_SKILL_WILDMG CLS_BFEAT_WILDMG 2 **** **** 1 0 12 14 14 10 12 15 CHA 0X04 0X0 0 CLASS_TYPE_WILD_MAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WILDMG 40 0 1 0 10 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
97 WildMage 16790584 16836416 16836417 16836418 16836419 IR_WILDER 4 CLS_ATK_3 CLS_FEAT_WILDMG CLS_SAVTHR_ROG CLS_SKILL_WILDMG CLS_BFEAT_WILDMG 2 **** **** 1 0 12 14 14 10 12 15 CHA 0X04 0X0 0 CLASS_TYPE_WILD_MAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WILDMG 40 0 1 0 10 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
98 Shadowsmith 16790585 16847414 16847415 16847416 16847417 IR_TEMPUS 8 CLS_ATK_1 CLS_FEAT_SHDSMT CLS_SAVTHR_ROG CLS_SKILL_SHDSMT CLS_BFEAT_SHDSMT 6 **** **** 1 0 14 13 14 10 14 13 INT 0x00 0x0 0 CLASS_TYPE_SHADOWSMITH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHDSMT 40 0 0 0 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
98 Shadowsmith 16790585 16847414 16847415 16847416 16847417 IR_TEMPUS 8 CLS_ATK_1 CLS_FEAT_SHDSMT CLS_SAVTHR_ROG CLS_SKILL_SHDSMT CLS_BFEAT_SHDSMT 6 **** **** 1 0 14 13 14 10 14 13 INT 0x00 0x0 0 CLASS_TYPE_SHADOWSMITH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SHDSMT 40 0 0 0 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
99 Abjurant_Champion 16790586 16847652 16847653 16847654 16847655 IR_ELDKNI 10 CLS_ATK_1 CLS_FEAT_ABCHAM CLS_SAVTHR_WIZ CLS_SKILL_ABCHAM CLS_BFEAT_ABCHAM 2 **** **** 1 0 14 13 14 10 14 13 INT 0X00 0X0 0 CLASS_TYPE_ABJURANT_CHAMPION 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ABCHAM 5 0 1 0 5 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
99 Abjurant_Champion 16790586 16847652 16847653 16847654 16847655 IR_ELDKNI 10 CLS_ATK_1 CLS_FEAT_ABCHAM CLS_SAVTHR_WIZ CLS_SKILL_ABCHAM CLS_BFEAT_ABCHAM 2 **** **** 1 0 14 13 14 10 14 13 INT 0X00 0X0 0 CLASS_TYPE_ABJURANT_CHAMPION 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ABCHAM 5 0 1 0 5 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
100 Archmage 16790587 16825000 16825001 16825002 16825003 IR_EPICSPELL 4 CLS_ATK_3 CLS_FEAT_ARCH CLS_SAVTHR_WIZ CLS_SKILL_ARCH CLS_BFEAT_ARCH 2 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_ARCHMAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ARCH 5 0 2 0 5 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
100 Archmage 16790587 16825000 16825001 16825002 16825003 IR_EPICSPELL 4 CLS_ATK_3 CLS_FEAT_ARCH CLS_SAVTHR_WIZ CLS_SKILL_ARCH CLS_BFEAT_ARCH 2 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_ARCHMAGE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ARCH 5 0 2 0 5 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
101 Oozemaster 16790588 16825036 16825037 16825038 16825039 IR_GENSUMMON 8 CLS_ATK_2 CLS_FEAT_OOZE CLS_SAVTHR_FIGHT CLS_SKILL_OOZE CLS_BFEAT_OOZE 4 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_OOZEMASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_OOZEM 40 0 2 2 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
101 Oozemaster 16790588 16825036 16825037 16825038 16825039 IR_GENSUMMON 8 CLS_ATK_2 CLS_FEAT_OOZE CLS_SAVTHR_FIGHT CLS_SKILL_OOZE CLS_BFEAT_OOZE 4 **** **** 1 0 12 16 14 8 14 12 INT 0X00 0X0 0 CLASS_TYPE_OOZEMASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_OOZEM 40 0 2 2 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
102 Psychic_Rogue 16790589 16835172 16835173 16835174 16835175 IR_PSYWARRIOR 6 CLS_ATK_2 CLS_FEAT_PSYROG CLS_SAVTHR_ROG CLS_SKILL_PSYROG CLS_BFEAT_PSYROG 6 **** **** 1 0 14 12 14 16 10 10 WIS 0X00 0X0 0 CLASS_TYPE_PSYROG 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_PSYROG 20 1 0 0 -1 7 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
102 Psychic_Rogue 16790589 16835172 16835173 16835174 16835175 IR_PSYWARRIOR 6 CLS_ATK_2 CLS_FEAT_PSYROG CLS_SAVTHR_ROG CLS_SKILL_PSYROG CLS_BFEAT_PSYROG 6 **** **** 1 0 14 12 14 16 10 10 WIS 0X00 0X0 0 CLASS_TYPE_PSYROG 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_PSYROG 20 1 0 0 -1 7 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
@@ -113,7 +113,7 @@
|
|||||||
109 Umbral_Disciple 16790596 16837827 16837828 16837829 16837830 IR_ASASIN 6 CLS_ATK_2 CLS_FEAT_UMBRAL CLS_SAVTHR_BARD CLS_SKILL_UMBRAL CLS_BFEAT_UMBRAL 6 **** **** 1 0 12 16 14 8 14 12 DEX 0X00 0X0 0 CLASS_TYPE_UMBRAL_DISCIPLE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_UMBRAL 40 0 0 0 10 8 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
109 Umbral_Disciple 16790596 16837827 16837828 16837829 16837830 IR_ASASIN 6 CLS_ATK_2 CLS_FEAT_UMBRAL CLS_SAVTHR_BARD CLS_SKILL_UMBRAL CLS_BFEAT_UMBRAL 6 **** **** 1 0 12 16 14 8 14 12 DEX 0X00 0X0 0 CLASS_TYPE_UMBRAL_DISCIPLE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_UMBRAL 40 0 0 0 10 8 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
110 Alienist 16790597 16789710 16789711 16789712 16789713 IR_ALIEN 4 CLS_ATK_3 CLS_FEAT_ALIEN CLS_SAVTHR_WIZ CLS_SKILL_ALIEN CLS_BFEAT_ALIEN 2 **** **** 1 0 10 14 14 12 16 10 INT 0X00 0X0 0 CLASS_TYPE_ALIENIST 1 1 1 2 2 4 6 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ALIEN 40 0 1 0 10 10 0 cls_stat_alien **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
110 Alienist 16790597 16789710 16789711 16789712 16789713 IR_ALIEN 4 CLS_ATK_3 CLS_FEAT_ALIEN CLS_SAVTHR_WIZ CLS_SKILL_ALIEN CLS_BFEAT_ALIEN 2 **** **** 1 0 10 14 14 12 16 10 INT 0X00 0X0 0 CLASS_TYPE_ALIENIST 1 1 1 2 2 4 6 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_ALIEN 40 0 1 0 10 10 0 cls_stat_alien **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
111 BlackBloodCultist 16790598 16823068 16823077 16823078 16823079 IR_WILDWOLF 12 CLS_ATK_2 CLS_FEAT_BBC CLS_SAVTHR_BARB CLS_SKILL_BBC CLS_BFEAT_BBC 4 **** **** 1 0 16 14 14 14 10 8 STR 0X0A 0X3 0 CLASS_TYPE_BLACK_BLOOD_CULTIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BBC 40 0 0 0 10 17 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
111 BlackBloodCultist 16790598 16823068 16823077 16823078 16823079 IR_WILDWOLF 12 CLS_ATK_2 CLS_FEAT_BBC CLS_SAVTHR_BARB CLS_SKILL_BBC CLS_BFEAT_BBC 4 **** **** 1 0 16 14 14 14 10 8 STR 0X0A 0X3 0 CLASS_TYPE_BLACK_BLOOD_CULTIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BBC 40 0 0 0 10 17 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
112 Warlock 16790599 16827934 16827935 16827936 16827937 IR_WARLOCK 6 CLS_ATK_2 CLS_FEAT_WARLOK CLS_SAVTHR_WIZ CLS_SKILL_WARLOK CLS_BFEAT_WARLOK 2 **** **** 1 1 12 14 14 10 12 15 CHA 0X14 0X3 1 CLASS_TYPE_WARLOCK 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WARLOK 0 1 0 0 -1 132 0 **** **** **** **** **** **** **** **** **** Warlock **** **** **** **** ****
|
112 Warlock 16790599 16827934 16827935 16827936 16827937 IR_WARLOCK 6 CLS_ATK_2 CLS_FEAT_WARLOK CLS_SAVTHR_WIZ CLS_SKILL_WARLOK CLS_BFEAT_WARLOK 2 **** **** 1 1 12 14 14 10 12 15 CHA 0X14 0X3 1 CLASS_TYPE_WARLOCK 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_WARLOK 0 1 0 0 -1 900 0 **** **** **** **** **** **** **** **** **** Warlock **** **** **** **** ****
|
||||||
113 Fochlucan_Lyrist 16852476 16825142 16825143 16825144 16825145 IR_DRUID 6 CLS_ATK_1 CLS_FEAT_FOCLYR CLS_SAVTHR_BARD CLS_SKILL_FOCLYR CLS_BFEAT_FOCLYR 6 **** **** 1 0 10 12 12 14 12 16 CHA 0X02 0X0 0 CLASS_TYPE_FOCHLUCAN_LYRIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FOCLYR 40 0 1 1 10 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
113 Fochlucan_Lyrist 16852476 16825142 16825143 16825144 16825145 IR_DRUID 6 CLS_ATK_1 CLS_FEAT_FOCLYR CLS_SAVTHR_BARD CLS_SKILL_FOCLYR CLS_BFEAT_FOCLYR 6 **** **** 1 0 10 12 12 14 12 16 CHA 0X02 0X0 0 CLASS_TYPE_FOCHLUCAN_LYRIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_FOCLYR 40 0 1 1 10 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
114 Dragonsong_Lyrist 16790600 16825459 16825460 16825461 16825462 IR_DRSLYR 6 CLS_ATK_2 CLS_FEAT_DRSLYR CLS_SAVTHR_BARD CLS_SKILL_DRSLYR CLS_BFEAT_DRSLYR 4 **** **** 1 0 12 14 14 10 12 15 CHA 0X10 0X2 0 CLASS_TYPE_DRAGONSONG_LYRIST 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16 17 18 19 20 CLS_PRES_DSLYR 5 0 2 0 5 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
114 Dragonsong_Lyrist 16790600 16825459 16825460 16825461 16825462 IR_DRSLYR 6 CLS_ATK_2 CLS_FEAT_DRSLYR CLS_SAVTHR_BARD CLS_SKILL_DRSLYR CLS_BFEAT_DRSLYR 4 **** **** 1 0 12 14 14 10 12 15 CHA 0X10 0X2 0 CLASS_TYPE_DRAGONSONG_LYRIST 1 2 3 4 5 6 7 8 9 10 11 12 12 14 15 16 17 18 19 20 CLS_PRES_DSLYR 5 0 2 0 5 1 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
115 SpinemeldWarrior 16790601 16836998 16836999 16837000 16837001 IR_TEMPEST 10 CLS_ATK_1 CLS_FEAT_SPNMLD CLS_SAVTHR_FIGHT CLS_SKILL_SPNMLD CLS_BFEAT_SPNMLD 4 **** **** 1 0 16 14 14 14 10 8 STR 0X02 0X1 1 CLASS_TYPE_SPINEMELD_WARRIOR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SPNMLD 40 0 0 0 10 17 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
115 SpinemeldWarrior 16790601 16836998 16836999 16837000 16837001 IR_TEMPEST 10 CLS_ATK_1 CLS_FEAT_SPNMLD CLS_SAVTHR_FIGHT CLS_SKILL_SPNMLD CLS_BFEAT_SPNMLD 4 **** **** 1 0 16 14 14 14 10 8 STR 0X02 0X1 1 CLASS_TYPE_SPINEMELD_WARRIOR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SPNMLD 40 0 0 0 10 17 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
@@ -129,7 +129,7 @@
|
|||||||
125 Soulcaster 16790611 16837012 16837013 16837014 16837015 IR_MYSTIC 4 CLS_ATK_3 CLS_FEAT_SOULC CLS_SAVTHR_WIZ CLS_SKILL_SOULC CLS_BFEAT_SOULC 2 **** **** 1 0 10 11 11 16 16 10 INT 0X00 0X0 0 CLASS_TYPE_SOULCASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SOULC 40 0 1 0 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
125 Soulcaster 16790611 16837012 16837013 16837014 16837015 IR_MYSTIC 4 CLS_ATK_3 CLS_FEAT_SOULC CLS_SAVTHR_WIZ CLS_SKILL_SOULC CLS_BFEAT_SOULC 2 **** **** 1 0 10 11 11 16 16 10 INT 0X00 0X0 0 CLASS_TYPE_SOULCASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SOULC 40 0 1 0 10 10 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
126 Sacred_Fist 16790612 16825367 16825368 16825369 16825370 IR_SACREDFIST 8 CLS_ATK_1 CLS_FEAT_SACFIS CLS_SAVTHR_WILD CLS_SKILL_SACFIS CLS_BFEAT_SACFIS 4 **** **** 1 0 14 14 12 16 10 10 WIS 0X00 0X0 0 CLASS_TYPE_SACREDFIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SACFIS 40 0 0 1 10 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
126 Sacred_Fist 16790612 16825367 16825368 16825369 16825370 IR_SACREDFIST 8 CLS_ATK_1 CLS_FEAT_SACFIS CLS_SAVTHR_WILD CLS_SKILL_SACFIS CLS_BFEAT_SACFIS 4 **** **** 1 0 14 14 12 16 10 10 WIS 0X00 0X0 0 CLASS_TYPE_SACREDFIST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_SACFIS 40 0 0 1 10 5 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
127 Legendary_Dreadnought 16790613 16826086 16826087 16826088 16826089 IC_LEGDREAD 12 CLS_ATK_1 CLS_FEAT_LGDR CLS_SAVTHR_FIGHT CLS_SKILL_LGDR CLS_BFEAT_LGDR 2 **** **** 1 0 16 13 16 10 10 9 STR 0X00 0X0 0 CLASS_TYPE_LEGENDARY_DREADNOUGHT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_LGDR 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
127 Legendary_Dreadnought 16790613 16826086 16826087 16826088 16826089 IC_LEGDREAD 12 CLS_ATK_1 CLS_FEAT_LGDR CLS_SAVTHR_FIGHT CLS_SKILL_LGDR CLS_BFEAT_LGDR 2 **** **** 1 0 16 13 16 10 10 9 STR 0X00 0X0 0 CLASS_TYPE_LEGENDARY_DREADNOUGHT 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_LGDR 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
128 Disciple_of_Baalzebul 16790614 16826094 16826095 16826096 16826097 IC_BAALZEBUL 6 CLS_ATK_2 CLS_FEAT_BAAL CLS_SAVTHR_BARD CLS_SKILL_BAAL CLS_BFEAT_BAAL 6 **** **** 1 0 12 14 14 10 12 15 CHA 0X09 0X2 0 CLASS_TYPE_DISC_BAALZEBUL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BAAL 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
128 Disciple_of_Baalzebul 16790614 16826094 16826095 16826096 16826097 IC_BAALZEBUL 6 CLS_ATK_2 CLS_FEAT_BAAL CLS_SAVTHR_BARD CLS_SKILL_BAAL CLS_BFEAT_BAAL 6 **** **** 1 0 12 14 14 10 12 15 CHA 0X09 0X2 0 CLASS_TYPE_DISC_BAALZEBUL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_BAAL 40 0 0 0 10 4 0 cls_stat_baal **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
129 Mighty_Contender_of_Kord 16790615 16824935 16824936 16824937 16824938 IC_LEGDREAD 10 CLS_ATK_2 CLS_FEAT_KORD CLS_SAVTHR_CLER CLS_SKILL_KORD CLS_BFEAT_KORD 2 **** **** 1 0 14 8 14 16 10 14 WIS 0X00 0X0 0 CLASS_TYPE_MIGHTY_CONTENDER_KORD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_KORD 40 0 0 1 10 4 0 cls_stat_kord **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
129 Mighty_Contender_of_Kord 16790615 16824935 16824936 16824937 16824938 IC_LEGDREAD 10 CLS_ATK_2 CLS_FEAT_KORD CLS_SAVTHR_CLER CLS_SKILL_KORD CLS_BFEAT_KORD 2 **** **** 1 0 14 8 14 16 10 14 WIS 0X00 0X0 0 CLASS_TYPE_MIGHTY_CONTENDER_KORD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_KORD 40 0 0 1 10 4 0 cls_stat_kord **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
130 Iaijutsu_Master 16790616 16826114 16826115 16826116 16826117 IC_IAIJUTSU 10 CLS_ATK_1 CLS_FEAT_IAIJ CLS_SAVTHR_ROG CLS_SKILL_IAIJ CLS_BFEAT_IAIJ 4 **** **** 1 0 16 13 16 10 10 9 CHA 0X05 0X1 0 CLASS_TYPE_IAIJUTSU_MASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_IAIJ 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
130 Iaijutsu_Master 16790616 16826114 16826115 16826116 16826117 IC_IAIJUTSU 10 CLS_ATK_1 CLS_FEAT_IAIJ CLS_SAVTHR_ROG CLS_SKILL_IAIJ CLS_BFEAT_IAIJ 4 **** **** 1 0 16 13 16 10 10 9 CHA 0X05 0X1 0 CLASS_TYPE_IAIJUTSU_MASTER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_IAIJ 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
131 Disciple_of_Dispater 16790617 16826136 16826137 16826138 16826139 IR_BLKGRD 10 CLS_ATK_1 CLS_FEAT_DISP CLS_SAVTHR_MONK CLS_SKILL_DISP CLS_BFEAT_DISP 4 **** **** 1 0 16 13 16 10 10 9 CON 0X09 0X2 0 CLASS_TYPE_DISPATER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DISP 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
131 Disciple_of_Dispater 16790617 16826136 16826137 16826138 16826139 IR_BLKGRD 10 CLS_ATK_1 CLS_FEAT_DISP CLS_SAVTHR_MONK CLS_SKILL_DISP CLS_BFEAT_DISP 4 **** **** 1 0 16 13 16 10 10 9 CON 0X09 0X2 0 CLASS_TYPE_DISPATER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CLS_PRES_DISP 40 0 0 0 10 4 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
18 FEAT_EKNIGHT_SPELLCASTING_SUEL_ARCHANAMACH 18960 2 1 0
|
18 FEAT_EKNIGHT_SPELLCASTING_SUEL_ARCHANAMACH 18960 2 1 0
|
||||||
19 FEAT_EKNIGHT_SPELLCASTING_WARMAGE 19002 2 1 0
|
19 FEAT_EKNIGHT_SPELLCASTING_WARMAGE 19002 2 1 0
|
||||||
20 FEAT_EKNIGHT_SPELLCASTING_WIZARD 19047 2 1 0
|
20 FEAT_EKNIGHT_SPELLCASTING_WIZARD 19047 2 1 0
|
||||||
|
21 FEAT_EPIC_SWARM_OF_ARROWS 25995 1 -1 0
|
||||||
21 Ambidex 1 1 -1 0
|
21 Ambidex 1 1 -1 0
|
||||||
22 CShot 5 1 -1 0
|
22 CShot 5 1 -1 0
|
||||||
23 Cleave 6 1 -1 0
|
23 Cleave 6 1 -1 0
|
||||||
|
|||||||
@@ -78,7 +78,7 @@
|
|||||||
74 Bane_Magic_Undead 23578 0 -1 0
|
74 Bane_Magic_Undead 23578 0 -1 0
|
||||||
75 Bane_Magic_Vermin 23579 0 -1 0
|
75 Bane_Magic_Vermin 23579 0 -1 0
|
||||||
76 **Epic_Feats** **** **** **** ****
|
76 **Epic_Feats** **** **** **** ****
|
||||||
77 FEAT_EPIC_ELDRITCH_THEURGE 23516 3 21 0
|
77 FEAT_EPIC_ELDRITCH_THEURGE 23516 3 11 0
|
||||||
78 FEAT_CRAFT_EPIC_WONDROUS_ITEM 3488 0 -1 0
|
78 FEAT_CRAFT_EPIC_WONDROUS_ITEM 3488 0 -1 0
|
||||||
79 FEAT_CRAFT_EPIC_MAGIC_ARMS_AND_ARMOR 3489 0 -1 0
|
79 FEAT_CRAFT_EPIC_MAGIC_ARMS_AND_ARMOR 3489 0 -1 0
|
||||||
80 FEAT_CRAFT_EPIC_ROD 3490 0 -1 0
|
80 FEAT_CRAFT_EPIC_ROD 3490 0 -1 0
|
||||||
|
|||||||
@@ -20,54 +20,51 @@
|
|||||||
16 WeapProfSim_Dart 7914 3 1 0
|
16 WeapProfSim_Dart 7914 3 1 0
|
||||||
17 WeapProfSim_Light_Mace 7908 3 1 0
|
17 WeapProfSim_Light_Mace 7908 3 1 0
|
||||||
18 WeapProfSim_Morningstar 7923 3 1 0
|
18 WeapProfSim_Morningstar 7923 3 1 0
|
||||||
19 WeapProfSim_Sickle 7929 3 1 0
|
19 WP_Sap 7944 3 1 0
|
||||||
20 WeapProfSim_Sling 7930 3 1 0
|
20 WP_LightCrossbow 7951 3 1 0
|
||||||
21 WP_Katar 7945 3 1 0
|
21 WP_HeavyCrossbow 7952 3 1 0
|
||||||
22 WP_Sap 7944 3 1 0
|
22 WP_Quarterstaff 7953 3 1 0
|
||||||
23 WP_LightCrossbow 7951 3 1 0
|
23 WP_Dagger 7954 3 1 0
|
||||||
24 WP_HeavyCrossbow 7952 3 1 0
|
24 WP_Club 7955 3 1 0
|
||||||
25 WP_Quarterstaff 7953 3 1 0
|
25 WP_Shortsword 7901 3 1 0
|
||||||
26 WP_Dagger 7954 3 1 0
|
26 WP_Shortbow 7910 3 1 0
|
||||||
27 WP_Club 7955 3 1 0
|
27 WP_Rapier 7924 3 1 0
|
||||||
28 WP_Shortsword 7901 3 1 0
|
28 ArmProfLgt 3 3 1 0
|
||||||
29 WP_Shortbow 7910 3 1 0
|
29 FEAT_EPIC_BLINDING_SPEED 491 1 -1 1
|
||||||
30 WP_Rapier 7924 3 1 0
|
30 FEAT_EPIC_SKILL_FOCUS_APPRAISE 588 1 -1 0
|
||||||
31 ArmProfLgt 3 3 1 0
|
31 FEAT_EPIC_SKILL_FOCUS_CONCENTRATION 589 1 -1 0
|
||||||
32 FEAT_EPIC_BLINDING_SPEED 491 1 -1 1
|
32 FEAT_EPIC_SKILL_FOCUS_CRAFT_TRAP 590 1 -1 0
|
||||||
33 FEAT_EPIC_SKILL_FOCUS_APPRAISE 588 1 -1 0
|
33 FEAT_EPIC_SKILL_FOCUS_DISABLETRAP 591 1 -1 0
|
||||||
34 FEAT_EPIC_SKILL_FOCUS_CONCENTRATION 589 1 -1 0
|
34 FEAT_EPIC_SKILL_FOCUS_DISCIPLINE 592 1 -1 0
|
||||||
35 FEAT_EPIC_SKILL_FOCUS_CRAFT_TRAP 590 1 -1 0
|
35 FEAT_EPIC_SKILL_FOCUS_HEAL 593 1 -1 0
|
||||||
36 FEAT_EPIC_SKILL_FOCUS_DISABLETRAP 591 1 -1 0
|
36 FEAT_EPIC_SKILL_FOCUS_HIDE 594 1 -1 0
|
||||||
37 FEAT_EPIC_SKILL_FOCUS_DISCIPLINE 592 1 -1 0
|
37 FEAT_EPIC_SKILL_FOCUS_LISTEN 595 1 -1 0
|
||||||
38 FEAT_EPIC_SKILL_FOCUS_HEAL 593 1 -1 0
|
38 FEAT_EPIC_SKILL_FOCUS_LORE 596 1 -1 0
|
||||||
39 FEAT_EPIC_SKILL_FOCUS_HIDE 594 1 -1 0
|
39 FEAT_EPIC_SKILL_FOCUS_MOVESILENTLY 597 1 -1 0
|
||||||
40 FEAT_EPIC_SKILL_FOCUS_LISTEN 595 1 -1 0
|
40 FEAT_EPIC_SKILL_FOCUS_OPENLOCK 598 1 -1 0
|
||||||
41 FEAT_EPIC_SKILL_FOCUS_LORE 596 1 -1 0
|
41 FEAT_EPIC_SKILL_FOCUS_PARRY 599 1 -1 0
|
||||||
42 FEAT_EPIC_SKILL_FOCUS_MOVESILENTLY 597 1 -1 0
|
42 FEAT_EPIC_SKILL_FOCUS_PERSUADE 601 1 -1 0
|
||||||
43 FEAT_EPIC_SKILL_FOCUS_OPENLOCK 598 1 -1 0
|
43 FEAT_EPIC_SKILL_FOCUS_PICKPOCKET 602 1 -1 0
|
||||||
44 FEAT_EPIC_SKILL_FOCUS_PARRY 599 1 -1 0
|
44 FEAT_EPIC_SKILL_FOCUS_SEARCH 603 1 -1 0
|
||||||
45 FEAT_EPIC_SKILL_FOCUS_PERSUADE 601 1 -1 0
|
45 FEAT_EPIC_SKILL_FOCUS_SETTRAP 604 1 -1 0
|
||||||
46 FEAT_EPIC_SKILL_FOCUS_PICKPOCKET 602 1 -1 0
|
46 FEAT_EPIC_SKILL_FOCUS_SPELLCRAFT 605 1 -1 0
|
||||||
47 FEAT_EPIC_SKILL_FOCUS_SEARCH 603 1 -1 0
|
47 FEAT_EPIC_SKILL_FOCUS_SPOT 606 1 -1 0
|
||||||
48 FEAT_EPIC_SKILL_FOCUS_SETTRAP 604 1 -1 0
|
48 FEAT_EPIC_SKILL_FOCUS_TAUNT 607 1 -1 0
|
||||||
49 FEAT_EPIC_SKILL_FOCUS_SPELLCRAFT 605 1 -1 0
|
49 FEAT_EPIC_SKILL_FOCUS_TUMBLE 608 1 -1 0
|
||||||
50 FEAT_EPIC_SKILL_FOCUS_SPOT 606 1 -1 0
|
50 FEAT_EPIC_SKILL_FOCUS_USEMAGICDEVICE 609 1 -1 0
|
||||||
51 FEAT_EPIC_SKILL_FOCUS_TAUNT 607 1 -1 0
|
51 FEAT_EPIC_SELF_CONCEALMENT_10 748 1 -1 0
|
||||||
52 FEAT_EPIC_SKILL_FOCUS_TUMBLE 608 1 -1 0
|
52 FEAT_EPIC_SELF_CONCEALMENT_20 749 1 -1 0
|
||||||
53 FEAT_EPIC_SKILL_FOCUS_USEMAGICDEVICE 609 1 -1 0
|
53 FEAT_EPIC_SELF_CONCEALMENT_30 750 1 -1 0
|
||||||
54 FEAT_EPIC_SELF_CONCEALMENT_10 748 1 -1 0
|
54 FEAT_EPIC_SELF_CONCEALMENT_40 751 1 -1 0
|
||||||
55 FEAT_EPIC_SELF_CONCEALMENT_20 749 1 -1 0
|
55 FEAT_EPIC_SELF_CONCEALMENT_50 752 1 -1 0
|
||||||
56 FEAT_EPIC_SELF_CONCEALMENT_30 750 1 -1 0
|
56 FEAT_EPIC_SUPERIOR_INITIATIVE 753 1 -1 0
|
||||||
57 FEAT_EPIC_SELF_CONCEALMENT_40 751 1 -1 0
|
57 FEAT_EPIC_DODGE 856 1 -1 0
|
||||||
58 FEAT_EPIC_SELF_CONCEALMENT_50 752 1 -1 0
|
58 FEAT_IMPROVED_WHIRLWIND 868 1 -1 0
|
||||||
59 FEAT_EPIC_SUPERIOR_INITIATIVE 753 1 -1 0
|
59 FEAT_EPIC_SKILL_FOCUS_CRAFT_ARMOR 913 1 -1 0
|
||||||
60 FEAT_EPIC_DODGE 856 1 -1 0
|
60 FEAT_EPIC_SKILL_FOCUS_CRAFT_WEAPON 914 1 -1 0
|
||||||
61 FEAT_IMPROVED_WHIRLWIND 868 1 -1 0
|
61 FEAT_EPIC_SKILL_FOCUS_BLUFF 917 1 -1 0
|
||||||
62 FEAT_EPIC_SKILL_FOCUS_CRAFT_ARMOR 913 1 -1 0
|
62 FEAT_EPIC_SKILL_FOCUS_INTIMIDATE 918 1 -1 0
|
||||||
63 FEAT_EPIC_SKILL_FOCUS_CRAFT_WEAPON 914 1 -1 0
|
63 FEAT_EPIC_SHADOWDANCER 980 3 11 0
|
||||||
64 FEAT_EPIC_SKILL_FOCUS_BLUFF 917 1 -1 0
|
64 FEAT_EPIC_EPIC_SHADOWLORD 1002 2 -1 0
|
||||||
65 FEAT_EPIC_SKILL_FOCUS_INTIMIDATE 918 1 -1 0
|
65 FEAT_EPIC_REFLEXES 585 1 -1 0
|
||||||
66 FEAT_EPIC_SHADOWDANCER 980 3 11 0
|
66 FEAT_LINGERING_DAMAGE 3099 0 -1 0
|
||||||
67 FEAT_EPIC_EPIC_SHADOWLORD 1002 2 -1 0
|
|
||||||
68 FEAT_EPIC_REFLEXES 585 1 -1 0
|
|
||||||
69 FEAT_LINGERING_DAMAGE 3099 0 -1 0
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
36 WP_Falchion 7943 3 1 0
|
36 WP_Falchion 7943 3 1 0
|
||||||
37 WP_Maul 7947 3 1 0
|
37 WP_Maul 7947 3 1 0
|
||||||
38 WP_Kukri 7922 3 1 0
|
38 WP_Kukri 7922 3 1 0
|
||||||
39 WP_Scythe 7926 3 1 1
|
39 WP_Scythe 7926 3 1 0
|
||||||
40 ReadyManeuver 1960 3 1 1
|
40 ReadyManeuver 1960 3 1 1
|
||||||
41 RecoverManeuvers 1973 3 1 1
|
41 RecoverManeuvers 1973 3 1 1
|
||||||
42 **** **** **** **** ****
|
42 **** **** **** **** ****
|
||||||
|
|||||||
43
nwn/nwnprc/trunk/2das/cls_stat_baal.2da
Normal file
43
nwn/nwnprc/trunk/2das/cls_stat_baal.2da
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
2DA V2.0
|
||||||
|
|
||||||
|
Level Str Dex Con Wis Int Cha NaturalAC
|
||||||
|
0 1 **** **** **** **** **** **** ****
|
||||||
|
1 2 **** **** **** **** **** **** ****
|
||||||
|
2 3 **** **** **** **** **** **** ****
|
||||||
|
3 4 **** **** **** **** **** **** ****
|
||||||
|
4 5 **** **** **** **** **** **** ****
|
||||||
|
5 6 **** **** **** **** **** **** ****
|
||||||
|
6 7 **** **** **** **** **** **** ****
|
||||||
|
7 8 **** **** **** **** **** **** ****
|
||||||
|
8 9 **** **** **** **** **** **** ****
|
||||||
|
9 10 **** **** **** **** **** 4 ****
|
||||||
|
10 11 **** **** **** **** **** **** ****
|
||||||
|
11 12 **** **** **** **** **** **** ****
|
||||||
|
12 13 **** **** **** **** **** **** ****
|
||||||
|
13 14 **** **** **** **** **** **** ****
|
||||||
|
14 15 **** **** **** **** **** **** ****
|
||||||
|
15 16 **** **** **** **** **** **** ****
|
||||||
|
16 17 **** **** **** **** **** **** ****
|
||||||
|
17 18 **** **** **** **** **** **** ****
|
||||||
|
18 19 **** **** **** **** **** **** ****
|
||||||
|
19 20 **** **** **** **** **** **** ****
|
||||||
|
20 21 **** **** **** **** **** **** ****
|
||||||
|
21 22 **** **** **** **** **** **** ****
|
||||||
|
22 23 **** **** **** **** **** **** ****
|
||||||
|
23 24 **** **** **** **** **** **** ****
|
||||||
|
24 25 **** **** **** **** **** **** ****
|
||||||
|
25 26 **** **** **** **** **** **** ****
|
||||||
|
26 27 **** **** **** **** **** **** ****
|
||||||
|
27 28 **** **** **** **** **** **** ****
|
||||||
|
28 29 **** **** **** **** **** **** ****
|
||||||
|
29 30 **** **** **** **** **** **** ****
|
||||||
|
30 31 **** **** **** **** **** **** ****
|
||||||
|
31 32 **** **** **** **** **** **** ****
|
||||||
|
32 33 **** **** **** **** **** **** ****
|
||||||
|
33 34 **** **** **** **** **** **** ****
|
||||||
|
34 35 **** **** **** **** **** **** ****
|
||||||
|
35 36 **** **** **** **** **** **** ****
|
||||||
|
36 37 **** **** **** **** **** **** ****
|
||||||
|
37 38 **** **** **** **** **** **** ****
|
||||||
|
38 39 **** **** **** **** **** **** ****
|
||||||
|
39 40 **** **** **** **** **** **** ****
|
||||||
@@ -2349,7 +2349,7 @@
|
|||||||
2345 ShieldCharge **** **** **** **** **** ****
|
2345 ShieldCharge **** **** **** **** **** ****
|
||||||
2346 ShieldSlam **** **** **** **** **** ****
|
2346 ShieldSlam **** **** **** **** **** ****
|
||||||
2347 PhantomSteed **** **** **** **** **** ****
|
2347 PhantomSteed **** **** **** **** **** ****
|
||||||
2348 GaseousForm **** **** **** **** **** ****
|
2348 GaseousForm prc_scr_1564 **** **** **** **** prc_scr_1564
|
||||||
2349 begin_psionics **** **** **** **** **** ****
|
2349 begin_psionics **** **** **** **** **** ****
|
||||||
2350 Augment_QuickSelects **** **** **** **** **** ****
|
2350 Augment_QuickSelects **** **** **** **** **** ****
|
||||||
2351 Augment_Digits_0_4 **** **** **** **** **** ****
|
2351 Augment_Digits_0_4 **** **** **** **** **** ****
|
||||||
@@ -2690,8 +2690,8 @@
|
|||||||
2686 **** **** **** **** **** **** ****
|
2686 **** **** **** **** **** **** ****
|
||||||
2687 **** **** **** **** **** **** ****
|
2687 **** **** **** **** **** **** ****
|
||||||
2688 **** **** **** **** **** **** ****
|
2688 **** **** **** **** **** **** ****
|
||||||
2689 **** **** **** **** **** **** ****
|
2689 **EndDomainReserver** **** **** **** **** **** ****
|
||||||
2690 **EndDomainReserver** **** **** **** **** **** ****
|
2690 CancelSpell **** **** **** **** **** ****
|
||||||
2691 end_psionics **** **** **** **** **** ****
|
2691 end_psionics **** **** **** **** **** ****
|
||||||
2692 BATTLE_RAGE **** **** **** **** **** ****
|
2692 BATTLE_RAGE **** **** **** **** **** ****
|
||||||
2693 Teleport_Management_Radial_Master **** **** **** **** **** ****
|
2693 Teleport_Management_Radial_Master **** **** **** **** **** ****
|
||||||
|
|||||||
@@ -2349,7 +2349,7 @@
|
|||||||
2345 ShieldCharge **** 1 1 1 **** 0
|
2345 ShieldCharge **** 1 1 1 **** 0
|
||||||
2346 ShieldSlam **** 1 1 1 **** 0
|
2346 ShieldSlam **** 1 1 1 **** 0
|
||||||
2347 PhantomSteed **** 1 1 1 3 0
|
2347 PhantomSteed **** 1 1 1 3 0
|
||||||
2348 GaseousForm **** 1 1 1 3 0
|
2348 GaseousForm 1564 0 0 0 3 0
|
||||||
2349 begin_psionics **** 1 1 1 **** 0
|
2349 begin_psionics **** 1 1 1 **** 0
|
||||||
2350 Augment_QuickSelects **** 1 1 1 **** 0
|
2350 Augment_QuickSelects **** 1 1 1 **** 0
|
||||||
2351 Augment_Digits_0_4 **** 1 1 1 **** 0
|
2351 Augment_Digits_0_4 **** 1 1 1 **** 0
|
||||||
@@ -2690,8 +2690,8 @@
|
|||||||
2686 **** **** 1 1 1 **** 0
|
2686 **** **** 1 1 1 **** 0
|
||||||
2687 **** **** 1 1 1 **** 0
|
2687 **** **** 1 1 1 **** 0
|
||||||
2688 **** **** 1 1 1 **** 0
|
2688 **** **** 1 1 1 **** 0
|
||||||
2689 **** **** 1 1 1 **** 0
|
2689 **EndDomainReserver** **** 1 1 1 **** 0
|
||||||
2690 **EndDomainReserver** **** 1 1 1 **** 0
|
2690 CancelSpell **** 1 1 1 9 0
|
||||||
2691 end_psionics **** 1 1 1 **** 0
|
2691 end_psionics **** 1 1 1 **** 0
|
||||||
2692 BATTLE_RAGE **** 1 1 1 1 0
|
2692 BATTLE_RAGE **** 1 1 1 1 0
|
||||||
2693 Teleport_Management_Radial_Master **** 1 1 1 **** 0
|
2693 Teleport_Management_Radial_Master **** 1 1 1 **** 0
|
||||||
@@ -12696,9 +12696,9 @@
|
|||||||
12692 Favoured_Soul_Enthrall **** 1 1 1 2 0
|
12692 Favoured_Soul_Enthrall **** 1 1 1 2 0
|
||||||
12693 Favoured_Soul_SPIRITUAL_WEAPON **** 1 1 1 2 0
|
12693 Favoured_Soul_SPIRITUAL_WEAPON **** 1 1 1 2 0
|
||||||
12694 Favoured_Soul_REGEN_LIGHT_WOUNDS **** 1 1 1 1 0
|
12694 Favoured_Soul_REGEN_LIGHT_WOUNDS **** 1 1 1 1 0
|
||||||
12695 Favoured_Soul_REGEN_MODERATE_WOUNDS **** 1 1 1 2 0
|
12695 Favoured_Soul_REGEN_MODERATE_WOUNDS **** 1 1 1 3 0
|
||||||
12696 Favoured_Soul_REGEN_SERIOUS_WOUNDS **** 1 1 1 4 0
|
12696 Favoured_Soul_REGEN_SERIOUS_WOUNDS **** 1 1 1 5 0
|
||||||
12697 Favoured_Soul_REGEN_CRITICAL_WOUNDS **** 1 1 1 5 0
|
12697 Favoured_Soul_REGEN_CRITICAL_WOUNDS **** 1 1 1 6 0
|
||||||
12698 Favoured_Soul_Hallow **** 1 1 1 6 0
|
12698 Favoured_Soul_Hallow **** 1 1 1 6 0
|
||||||
12699 Favoured_Soul_SPELL_CHASING_PERFECTION **** 1 1 1 6 0
|
12699 Favoured_Soul_SPELL_CHASING_PERFECTION **** 1 1 1 6 0
|
||||||
12700 Sohei_Silent_Bless_Weapon **** 1 1 1 2 0
|
12700 Sohei_Silent_Bless_Weapon **** 1 1 1 2 0
|
||||||
|
|||||||
@@ -3163,13 +3163,13 @@
|
|||||||
3159 FEAT_VERMINMASTERY 16825898 16825899 ife_animal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_VERMINMASTERY 6 **** **** **** **** **** 0 1
|
3159 FEAT_VERMINMASTERY 16825898 16825899 ife_animal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_VERMINMASTERY 6 **** **** **** **** **** 0 1
|
||||||
3160 FEAT_MAGICALBEASTMASTERY 16825896 16825897 ife_animal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_MAGICALBEASTMASTERY 6 **** **** **** **** **** 0 1
|
3160 FEAT_MAGICALBEASTMASTERY 16825896 16825897 ife_animal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 0.5 **** **** 0 **** **** **** **** **** **** **** **** **** FEAT_MAGICALBEASTMASTERY 6 **** **** **** **** **** 0 1
|
||||||
3161 Familiar 16825363 16825364 ife_familiar **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2189 **** 0.5 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SUMMON_FAMILIAR 6 **** **** **** **** **** 0 1
|
3161 Familiar 16825363 16825364 ife_familiar **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2189 **** 0.5 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SUMMON_FAMILIAR 6 **** **** **** **** **** 0 1
|
||||||
3162 FEAT_RAVAGEGOLDENICE 16825902 16825903 ife_MagWeap **** **** **** **** **** 13 **** **** **** **** 0 0 0 **** **** 2190 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_RAVAGEGOLDENICE 6 **** **** **** **** **** 0 1
|
3162 FEAT_RAVAGEGOLDENICE 16825902 16825903 ife_MagWeap **** **** **** **** **** 13 **** **** **** **** 0 0 1 **** **** 2190 **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_RAVAGEGOLDENICE 6 **** **** **** **** **** 0 1
|
||||||
3163 FEAT_STIGMATA 16825908 16825909 ife_layon **** **** **** **** **** **** **** **** 3165 **** 0 0 0 **** **** 2191 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_STIGMATA 6 **** **** **** **** **** 0 0
|
3163 FEAT_STIGMATA 16825908 16825909 ife_layon **** **** **** **** **** **** **** **** 3165 **** 0 0 1 **** **** 2191 **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_STIGMATA 6 **** **** **** **** **** 0 0
|
||||||
3164 FEAT_HOLYRADIANCE 16825910 16825911 ife_holyrad **** **** **** **** **** **** 15 **** 3165 **** 0 0 1 **** **** 2196 **** 0.5 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_HOLYRADIANCE 2 **** **** **** **** **** 0 1
|
3164 FEAT_HOLYRADIANCE 16825910 16825911 ife_holyrad **** **** **** **** **** **** 15 **** 3165 **** 0 0 1 **** **** 2196 **** 0.5 **** 97 1 **** **** **** **** **** **** **** **** **** FEAT_HOLYRADIANCE 2 **** **** **** **** **** 0 1
|
||||||
3165 FEAT_NIMBUSLIGHT 16825912 16825913 ife_nimlight **** **** **** **** **** **** **** **** **** **** 0 1 1 **** **** 2032 **** 0.5 **** **** 1 **** **** **** **** **** **** **** **** **** FEAT_NIMBUSLIGHT 2 **** **** **** **** **** 0 1
|
3165 FEAT_NIMBUSLIGHT 16825912 16825913 ife_nimlight **** **** **** **** **** **** **** **** **** **** 0 1 1 **** **** 2032 **** 0.5 **** 97 1 **** **** **** **** **** **** **** **** **** FEAT_NIMBUSLIGHT 2 **** **** **** **** **** 0 1
|
||||||
3166 FEAT_INTUITIVE_ATTACK 16825914 16825915 ife_weppro_sim 1 **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_INTUITIVE_ATTACK 5 **** **** **** **** **** 0 1
|
3166 FEAT_INTUITIVE_ATTACK 16825914 16825915 ife_weppro_sim 1 **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_INTUITIVE_ATTACK 5 **** **** **** **** **** 0 1
|
||||||
3167 FEAT_HAND_HEALER 16825916 16825917 ife_handheal **** **** **** **** **** **** 13 **** 299 **** 0 1 0 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_HAND_HEALER 5 **** **** **** **** **** 0 1
|
3167 FEAT_HAND_HEALER 16825916 16825917 ife_handheal **** **** **** **** **** **** 13 **** 299 **** 0 1 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_HAND_HEALER 5 **** **** **** **** **** 0 1
|
||||||
3168 FEAT_EXALTED_TURNING 16825918 16825919 ife_exaturn **** **** **** **** **** **** **** **** 294 **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EXALTED_TURNING 1 **** **** **** **** **** 0 1
|
3168 FEAT_EXALTED_TURNING 16825918 16825919 ife_exaturn **** **** **** **** **** **** **** **** 294 **** 0 0 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_EXALTED_TURNING 1 **** **** **** **** **** 0 1
|
||||||
3169 FEAT_SANCTIFY_MARTIAL_SICKLE 16825920 16823245 ife_X2WSDWAx **** **** **** **** **** **** 15 **** 98 **** 0 0 1 **** **** **** **** 0.5 **** 93 **** **** **** **** **** **** **** **** **** **** FEAT_SANCTIFY_MARTIAL_SICKLE 1 **** **** **** **** **** 0 1
|
3169 FEAT_SANCTIFY_MARTIAL_SICKLE 16825920 16823245 ife_X2WSDWAx **** **** **** **** **** **** 15 **** 98 **** 0 0 1 **** **** **** **** 0.5 **** 93 **** **** **** **** **** **** **** **** **** **** FEAT_SANCTIFY_MARTIAL_SICKLE 1 **** **** **** **** **** 0 1
|
||||||
3170 FEAT_SANCTIFY_MARTIAL_DWARVENAXE 16825921 16823245 ife_X2WSDagg **** **** **** **** **** **** 15 **** 952 **** 0 0 1 **** **** **** **** 0.5 **** 93 **** **** **** **** **** **** **** **** **** **** FEAT_SANCTIFY_MARTIAL_DWARVENAXE 1 **** **** **** **** **** 0 1
|
3170 FEAT_SANCTIFY_MARTIAL_DWARVENAXE 16825921 16823245 ife_X2WSDagg **** **** **** **** **** **** 15 **** 952 **** 0 0 1 **** **** **** **** 0.5 **** 93 **** **** **** **** **** **** **** **** **** **** FEAT_SANCTIFY_MARTIAL_DWARVENAXE 1 **** **** **** **** **** 0 1
|
||||||
3171 FEAT_WEAPON_TEMPUS_SICKLE 16825923 16822945 ife_X2WpCh **** **** **** **** **** **** **** **** 98 **** 0 0 0 **** **** **** **** 0.5 **** 94 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_TEMPUS_SICKLE 1 **** **** **** **** **** 0 1
|
3171 FEAT_WEAPON_TEMPUS_SICKLE 16825923 16822945 ife_X2WpCh **** **** **** **** **** **** **** **** 98 **** 0 0 0 **** **** **** **** 0.5 **** 94 **** **** **** **** **** **** **** **** **** **** FEAT_WEAPON_TEMPUS_SICKLE 1 **** **** **** **** **** 0 1
|
||||||
@@ -3356,7 +3356,7 @@
|
|||||||
3352 FEAT_KillingShot 16826000 16826001 ife_wepspec_Lbw 19 **** **** **** **** **** **** **** 3353 **** 0 0 1 **** **** 2207 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_KillingShot 6 0 **** **** **** **** 0 1
|
3352 FEAT_KillingShot 16826000 16826001 ife_wepspec_Lbw 19 **** **** **** **** **** **** **** 3353 **** 0 0 1 **** **** 2207 **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_KillingShot 6 0 **** **** **** **** 0 1
|
||||||
3353 FEAT_PerfectShot 16825998 16825999 ife_wepspec_Lbw 6 **** **** **** **** **** **** **** 3351 **** 0 0 1 **** **** 2207 **** 0.5 **** **** **** 92 93 101 102 99 **** **** **** **** FEAT_PerfectShot 6 0 **** **** **** **** 0 1
|
3353 FEAT_PerfectShot 16825998 16825999 ife_wepspec_Lbw 6 **** **** **** **** **** **** **** 3351 **** 0 0 1 **** **** 2207 **** 0.5 **** **** **** 92 93 101 102 99 **** **** **** **** FEAT_PerfectShot 6 0 **** **** **** **** 0 1
|
||||||
3354 FEAT_PerfectShot2 16825940 16825941 ife_wepspec_Lbw 6 **** **** **** **** **** **** **** 3353 **** 0 0 1 **** **** 2207 **** 0.5 **** **** **** 92 93 101 102 99 **** **** **** **** FEAT_PerfectShot2 6 0 **** **** **** **** 0 1
|
3354 FEAT_PerfectShot2 16825940 16825941 ife_wepspec_Lbw 6 **** **** **** **** **** **** **** 3353 **** 0 0 1 **** **** 2207 **** 0.5 **** **** **** 92 93 101 102 99 **** **** **** **** FEAT_PerfectShot2 6 0 **** **** **** **** 0 1
|
||||||
3355 FEAT_SERVHEAVEN 16823344 16823345 ife_servheaven **** **** **** **** **** **** **** **** **** **** 0 1 1 **** **** 2033 **** **** 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_SERVHEAVEN 2 **** **** **** **** **** 0 1
|
3355 FEAT_SERVHEAVEN 16823344 16823345 ife_servheaven **** **** **** **** **** **** **** **** **** **** 0 1 1 **** **** 2033 **** **** 1 97 1 **** **** **** **** **** **** **** **** **** FEAT_SERVHEAVEN 2 **** **** **** **** **** 0 1
|
||||||
3356 FEAT_RANGED_SMITE 16823346 16823347 ife_rangedsmite **** **** **** **** **** **** **** **** **** **** 0 1 0 **** **** 2034 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** FEAT_RANGED_SMITE 5 1 **** **** **** **** 0 1
|
3356 FEAT_RANGED_SMITE 16823346 16823347 ife_rangedsmite **** **** **** **** **** **** **** **** **** **** 0 1 0 **** **** 2034 **** **** 1 **** **** **** **** **** **** **** **** **** **** **** FEAT_RANGED_SMITE 5 1 **** **** **** **** 0 1
|
||||||
3357 FEAT_VILE_MARTIAL_CLUB 16825481 16825480 ife_X2WSClub **** **** **** **** **** **** 15 **** 43 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_CLUB 1 **** **** **** **** **** 0 1
|
3357 FEAT_VILE_MARTIAL_CLUB 16825481 16825480 ife_X2WSClub **** **** **** **** **** **** 15 **** 43 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_CLUB 1 **** **** **** **** **** 0 1
|
||||||
3358 FEAT_VILE_MARTIAL_DAGGER 16825482 16825480 ife_X2WSDagg **** **** **** **** **** **** 15 **** 90 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_DAGGER 1 **** **** **** **** **** 0 1
|
3358 FEAT_VILE_MARTIAL_DAGGER 16825482 16825480 ife_X2WSDagg **** **** **** **** **** **** 15 **** 90 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_DAGGER 1 **** **** **** **** **** 0 1
|
||||||
@@ -3389,8 +3389,8 @@
|
|||||||
3385 FEAT_VILE_MARTIAL_LIGHTCROSSBOW 16825509 16825480 ife_X2WSLXB **** **** **** **** **** **** 15 **** 93 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_LIGHTCROSSBOW 1 **** **** **** **** **** 0 1
|
3385 FEAT_VILE_MARTIAL_LIGHTCROSSBOW 16825509 16825480 ife_X2WSLXB **** **** **** **** **** **** 15 **** 93 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_LIGHTCROSSBOW 1 **** **** **** **** **** 0 1
|
||||||
3386 FEAT_VILE_MARTIAL_SLING 16825510 16825480 ife_X2WSSlng **** **** **** **** **** **** 15 **** 99 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_SLING 1 **** **** **** **** **** 0 1
|
3386 FEAT_VILE_MARTIAL_SLING 16825510 16825480 ife_X2WSSlng **** **** **** **** **** **** 15 **** 99 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_SLING 1 **** **** **** **** **** 0 1
|
||||||
3387 FEAT_VILE_MARTIAL_LONGBOW 16825511 16825480 ife_X2WSLBow **** **** **** **** **** **** 15 **** 101 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_LONGBOW 1 **** **** **** **** **** 0 1
|
3387 FEAT_VILE_MARTIAL_LONGBOW 16825511 16825480 ife_X2WSLBow **** **** **** **** **** **** 15 **** 101 **** 0 0 1 **** **** **** **** 0.5 **** 89 **** **** **** **** **** **** **** **** **** **** FEAT_VILE_MARTIAL_LONGBOW 1 **** **** **** **** **** 0 1
|
||||||
3388 FEAT_SAC_VOW 16822845 16822846 ife_sacredvow **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SAC_VOW 6 **** **** **** **** **** 0 1
|
3388 FEAT_SAC_VOW 16822845 16822846 ife_sacredvow **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_SAC_VOW 6 **** **** **** **** **** 0 1
|
||||||
3389 FEAT_VOW_OBED 16822847 16822848 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VOW_OBED 6 **** **** **** **** **** 0 1
|
3389 FEAT_VOW_OBED 16822847 16822848 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_VOW_OBED 6 **** **** **** **** **** 0 1
|
||||||
3390 FEAT_EB_HAND 16822851 16822852 ife_X2BoneSk1 **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 95 **** **** **** **** **** **** **** **** **** **** FEAT_EB_HAND 6 **** **** **** **** **** 0 1
|
3390 FEAT_EB_HAND 16822851 16822852 ife_X2BoneSk1 **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 95 **** **** **** **** **** **** **** **** **** **** FEAT_EB_HAND 6 **** **** **** **** **** 0 1
|
||||||
3391 FEAT_EB_HEAD 16822853 16822854 ife_X2BoneSk1 **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 95 **** **** **** **** **** **** **** **** **** **** FEAT_EB_HEAD 6 **** **** **** **** **** 0 1
|
3391 FEAT_EB_HEAD 16822853 16822854 ife_X2BoneSk1 **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 95 **** **** **** **** **** **** **** **** **** **** FEAT_EB_HEAD 6 **** **** **** **** **** 0 1
|
||||||
3392 FEAT_EB_CHEST 16822855 16822856 ife_X2BoneSk1 **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 95 **** **** **** **** **** **** **** **** **** **** FEAT_EB_CHEST 6 **** **** **** **** **** 0 1
|
3392 FEAT_EB_CHEST 16822855 16822856 ife_X2BoneSk1 **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 1 **** 95 **** **** **** **** **** **** **** **** **** **** FEAT_EB_CHEST 6 **** **** **** **** **** 0 1
|
||||||
@@ -4200,7 +4200,7 @@
|
|||||||
4196 SB_Brill_25 16823454 16823455 ife_X2WSLSwd **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1566 4197 0.5 14 **** 1 **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_SPECIALIZATION_LONGSWORD 1 **** **** **** **** **** 0 1
|
4196 SB_Brill_25 16823454 16823455 ife_X2WSLSwd **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1566 4197 0.5 14 **** 1 **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_SPECIALIZATION_LONGSWORD 1 **** **** **** **** **** 0 1
|
||||||
4197 SB_Brill_27 16823454 16823455 ife_X2WSLSwd **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1566 4198 0.5 15 **** 1 **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_SPECIALIZATION_LONGSWORD 1 **** **** **** **** **** 0 1
|
4197 SB_Brill_27 16823454 16823455 ife_X2WSLSwd **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1566 4198 0.5 15 **** 1 **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_SPECIALIZATION_LONGSWORD 1 **** **** **** **** **** 0 1
|
||||||
4198 SB_Brill_29 16823454 16823455 ife_X2WSLSwd **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1566 **** 0.5 16 **** 1 **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_SPECIALIZATION_LONGSWORD 1 **** **** **** **** **** 0 1
|
4198 SB_Brill_29 16823454 16823455 ife_X2WSLSwd **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 1566 **** 0.5 16 **** 1 **** **** **** **** **** **** **** **** **** FEAT_EPIC_WEAPON_SPECIALIZATION_LONGSWORD 1 **** **** **** **** **** 0 1
|
||||||
4199 EXALTED_COMPANION 16822440 16822441 ife_animal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_BLARCH_REGEN_1 4 **** **** **** **** **** 0 1
|
4199 EXALTED_COMPANION 16822440 16822441 ife_animal **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_BLARCH_REGEN_1 4 **** **** **** **** **** 0 1
|
||||||
4200 FEAT_BLARCH_POISON_BLOOD 16822397 16822398 ife_X2UsePoison **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2998 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_BLARCH_POISON_BLOOD 4 **** **** **** **** **** 0 1
|
4200 FEAT_BLARCH_POISON_BLOOD 16822397 16822398 ife_X2UsePoison **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 2998 **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_BLARCH_POISON_BLOOD 4 **** **** **** **** **** 0 1
|
||||||
4201 FEAT_BLARCH_ACID_BLOOD 16822399 16822400 ife_X2UsePoison **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ACID_BLOOD 4 **** **** **** **** **** 0 1
|
4201 FEAT_BLARCH_ACID_BLOOD 16822399 16822400 ife_X2UsePoison **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_ACID_BLOOD 4 **** **** **** **** **** 0 1
|
||||||
4202 FEAT_BLARCH_REGEN_1 16822401 16822402 ife_X1ResDis **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** 4203 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_BLARCH_REGEN_1 4 **** **** **** **** **** 0 1
|
4202 FEAT_BLARCH_REGEN_1 16822401 16822402 ife_X1ResDis **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** 4203 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_BLARCH_REGEN_1 4 **** **** **** **** **** 0 1
|
||||||
@@ -5361,7 +5361,7 @@
|
|||||||
5357 Factotum_Cunning_Knowledge 16824532 16826316 fot_oracle **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3903 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
5357 Factotum_Cunning_Knowledge 16824532 16826316 fot_oracle **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3903 **** 1 -1 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 0
|
||||||
5358 Factotum_Opportunistic_Piety_Heal 16826317 16826318 fot_regenerate **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3904 **** 1 10 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
5358 Factotum_Opportunistic_Piety_Heal 16826317 16826318 fot_regenerate **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3904 **** 1 10 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||||
5359 Factotum_Opportunistic_Piety_Turn 16826319 16826320 fot_contundead **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3905 **** 1 10 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
5359 Factotum_Opportunistic_Piety_Turn 16826319 16826320 fot_contundead **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3905 **** 1 10 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||||
5360 FEAT_VOW_PURITY 16826325 16826326 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VOW_PURITY 6 **** **** **** **** **** 0 1
|
5360 FEAT_VOW_PURITY 16826325 16826326 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_VOW_PURITY 6 **** **** **** **** **** 0 1
|
||||||
5361 Sharess_Fascinate 16826327 16826934 ife_X1SDaze **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3907 **** 1 10 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
5361 Sharess_Fascinate 16826327 16826934 ife_X1SDaze **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3907 **** 1 10 **** 1 **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||||
5362 Sharess_Confuse 16826935 16826936 ife_X1HTym **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3908 **** 1 10 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
5362 Sharess_Confuse 16826935 16826936 ife_X1HTym **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3908 **** 1 10 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||||
5363 Sharess_Dominate 16826937 16826938 ife_X1HLHrt **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3909 **** 1 10 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
5363 Sharess_Dominate 16826937 16826938 ife_X1HLHrt **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 3909 **** 1 10 **** **** **** **** **** **** **** **** **** **** **** **** 4 **** **** **** **** **** 0 1
|
||||||
@@ -25995,7 +25995,7 @@
|
|||||||
25991 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
25991 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
25992 FEAT_PLANT_DEFIANCE 16990318 16990319 id_plant **** **** **** **** **** **** **** **** **** **** 0 0 1 **** 1 17991 **** 0.5 -1 **** 1 198 374 23580 **** **** **** **** **** **** FEAT_PLANT_DEFIANCE 6 **** **** **** **** **** 0 1
|
25992 FEAT_PLANT_DEFIANCE 16990318 16990319 id_plant **** **** **** **** **** **** **** **** **** **** 0 0 1 **** 1 17991 **** 0.5 -1 **** 1 198 374 23580 **** **** **** **** **** **** FEAT_PLANT_DEFIANCE 6 **** **** **** **** **** 0 1
|
||||||
25993 FEAT_PLANT_CONTROL 16990320 16990321 id_plant **** **** **** **** **** **** **** **** 25992 **** 0 0 1 **** 1 17992 **** 0.5 -1 **** 1 198 374 23580 **** **** **** **** **** **** FEAT_PLANT_CONTROL 6 **** **** **** **** **** 0 1
|
25993 FEAT_PLANT_CONTROL 16990320 16990321 id_plant **** **** **** **** **** **** **** **** 25992 **** 0 0 1 **** 1 17992 **** 0.5 -1 **** 1 198 374 23580 **** **** **** **** **** **** FEAT_PLANT_CONTROL 6 **** **** **** **** **** 0 1
|
||||||
25994 FEAT_FAV_COMPANIONS 16990316 16990317 ife_servheaven **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** 17995 **** **** 1 **** 1 **** **** **** **** **** **** **** **** **** FEAT_FAV_COMPANIONS 2 **** **** **** **** **** 0 1
|
25994 FEAT_FAV_COMPANIONS 16990316 16990317 ife_servheaven **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** 17995 **** **** 1 97 1 **** **** **** **** **** **** **** **** **** FEAT_FAV_COMPANIONS 2 **** **** **** **** **** 0 1
|
||||||
25995 FEAT_EPIC_SWARM_OF_ARROWS 16990308 16990309 ife_X1HailArr **** **** 23 **** **** **** **** **** 27 30 0 0 1 2 **** 17996 **** 1 **** **** 1 101 102 **** **** **** **** **** **** **** FEAT_EPIC_SWARM_OF_ARROWS 5 0 **** **** **** **** 1 1
|
25995 FEAT_EPIC_SWARM_OF_ARROWS 16990308 16990309 ife_X1HailArr **** **** 23 **** **** **** **** **** 27 30 0 0 1 2 **** 17996 **** 1 **** **** 1 101 102 **** **** **** **** **** **** **** FEAT_EPIC_SWARM_OF_ARROWS 5 0 **** **** **** **** 1 1
|
||||||
25996 FEAT_EPIC_UP_PRIEST 16835620 16835621 ife_X2EpicChar **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_UR_PRIEST 6 **** **** **** **** **** 1 0
|
25996 FEAT_EPIC_UP_PRIEST 16835620 16835621 ife_X2EpicChar **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** FEAT_EPIC_UR_PRIEST 6 **** **** **** **** **** 1 0
|
||||||
25997 FEAT_INVESTIGATOR 16990414 16990415 ife_alertness **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_INVESTIGATOR 5 **** **** **** **** **** 0 1
|
25997 FEAT_INVESTIGATOR 16990414 16990415 ife_alertness **** **** **** **** **** **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_INVESTIGATOR 5 **** **** **** **** **** 0 1
|
||||||
@@ -26003,13 +26003,13 @@
|
|||||||
25999 FEAT_MARTIAL_STALKER 16990314 16990315 IR_NINJA **** **** **** **** **** **** **** **** 2488 45 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_MARTIAL_STALKER 5 0 **** **** **** **** 0 0
|
25999 FEAT_MARTIAL_STALKER 16990314 16990315 IR_NINJA **** **** **** **** **** **** **** **** 2488 45 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_MARTIAL_STALKER 5 0 **** **** **** **** 0 0
|
||||||
26000 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
26000 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
26001 Bullybasher_GiantBearing 16977316 16977317 is_giantbearing **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 16553 **** 0.5 **** **** 1 **** **** **** **** **** **** **** **** **** WOL_BULLY_GIANT 6 0 **** **** **** **** 0 0
|
26001 Bullybasher_GiantBearing 16977316 16977317 is_giantbearing **** **** **** **** **** **** **** **** **** **** 0 0 0 **** **** 16553 **** 0.5 **** **** 1 **** **** **** **** **** **** **** **** **** WOL_BULLY_GIANT 6 0 **** **** **** **** 0 0
|
||||||
26002 FEAT_VOWOFPOVERTY 16977318 16977319 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VOWOFPOVERTY 6 **** **** **** **** **** 0 0
|
26002 FEAT_VOWOFPOVERTY 16977318 16977319 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_VOWOFPOVERTY 6 **** **** **** **** **** 0 0
|
||||||
26003 FEAT_SANCTIFYKISTRIKE 16990535 16990536 ife_kistrike **** **** **** **** **** **** 15 **** 21 213 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_SANCTIFYKISTRIKE 6 **** **** **** **** **** 0 0
|
26003 FEAT_SANCTIFYKISTRIKE 16990535 16990536 ife_kistrike **** **** **** **** **** **** 15 **** 21 213 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_SANCTIFYKISTRIKE 6 **** **** **** **** **** 0 0
|
||||||
26004 FEAT_HOLYKISTRIKE 16990537 16990538 ife_kistrike **** **** **** **** **** **** 15 **** 21 26002 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_HOLYKISTRIKE 6 **** **** **** **** **** 0 0
|
26004 FEAT_HOLYKISTRIKE 16990537 16990538 ife_kistrike **** **** **** **** **** **** 15 **** 21 26003 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_HOLYKISTRIKE 6 **** **** **** **** **** 0 0
|
||||||
26005 FEAT_FISTOFHEAVENS 16990539 16990540 ife_kistrike **** **** **** **** 15 **** **** **** 21 26002 0 0 1 **** **** **** **** 1 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_FISTOFHEAVENS 6 **** **** **** **** **** 0 0
|
26005 FEAT_FISTOFHEAVENS 16990539 16990540 ife_kistrike **** **** **** **** 15 **** **** **** 39 26003 0 0 1 **** **** **** **** 1 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_FISTOFHEAVENS 6 **** **** **** **** **** 0 0
|
||||||
26006 FEAT_VOWABSTINENCE 16990541 16990542 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VOWABSTINENCE 6 **** **** **** **** **** 0 0
|
26006 FEAT_VOWABSTINENCE 16990541 16990542 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_VOWABSTINENCE 6 **** **** **** **** **** 0 0
|
||||||
26007 FEAT_VOWCHASTITY 16990543 16990544 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_VOWCHASTITY 6 **** **** **** **** **** 0 0
|
26007 FEAT_VOWCHASTITY 16990543 16990544 ife_sacredvow **** **** **** **** **** **** **** **** 3388 **** 0 0 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_VOWCHASTITY 6 **** **** **** **** **** 0 0
|
||||||
26008 FEAT_GIFTOFFAITH 16990545 16990546 ife_sacredvow **** **** **** **** 13 **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** **** **** **** **** **** **** **** **** **** **** **** FEAT_GIFTOFFAITH 6 **** **** **** **** **** 0 0
|
26008 FEAT_GIFTOFFAITH 16990545 16990546 ife_sacredvow **** **** **** **** 13 **** **** **** **** **** 0 0 1 **** **** **** **** 0.5 **** 97 **** **** **** **** **** **** **** **** **** **** FEAT_GIFTOFFAITH 6 **** **** **** **** **** 0 0
|
||||||
26009 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
26009 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
26010 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
26010 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
26011 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
26011 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
|||||||
@@ -300,3 +300,4 @@
|
|||||||
296 SPELL_MASS_INFLICT_MODERATE_DAMAGE 16976462 17111 6
|
296 SPELL_MASS_INFLICT_MODERATE_DAMAGE 16976462 17111 6
|
||||||
297 SPELL_MASS_INFLICT_SERIOUS_DAMAGE 16976468 17112 7
|
297 SPELL_MASS_INFLICT_SERIOUS_DAMAGE 16976468 17112 7
|
||||||
298 SPELL_MASS_INFLICT_CRITICAL_DAMAGE 16976474 17113 8
|
298 SPELL_MASS_INFLICT_CRITICAL_DAMAGE 16976474 17113 8
|
||||||
|
299 SPELL_GASEOUS_FORM 16835585 2348 3
|
||||||
|
|||||||
@@ -998,8 +998,8 @@
|
|||||||
994 Faerie_Fire 16793699 1 1 750 2924 0 1 1 iss_faerie_fire
|
994 Faerie_Fire 16793699 1 1 750 2924 0 1 1 iss_faerie_fire
|
||||||
995 SPELL_FORCE_MISSILES_8 16790491 8 4 24000 2480 0 1 1 iss_X1LesMis
|
995 SPELL_FORCE_MISSILES_8 16790491 8 4 24000 2480 0 1 1 iss_X1LesMis
|
||||||
996 SPELL_FORCE_MISSILES_12 16790488 12 4 36000 2480 0 1 1 iss_X1LesMis
|
996 SPELL_FORCE_MISSILES_12 16790488 12 4 36000 2480 0 1 1 iss_X1LesMis
|
||||||
997 SPELL_CHASING_PERFECTION_12 16790495 12 6 54000 2479 0 0 1 fot_strengthone
|
997 SPELL_CHASING_PERFECTION_12 16990495 12 6 54000 2479 0 0 1 fot_strengthone
|
||||||
998 SPELL_CHASING_PERFECTION_16 16790496 16 6 72000 2479 0 0 1 fot_strengthone
|
998 SPELL_CHASING_PERFECTION_16 16990496 16 6 72000 2479 0 0 1 fot_strengthone
|
||||||
999 **** **** **** **** **** **** **** **** **** ****
|
999 **** **** **** **** **** **** **** **** **** ****
|
||||||
1000 Acid_Orb 16830292 7 4 21000 3100 0 1 1 iss_acidorb
|
1000 Acid_Orb 16830292 7 4 21000 3100 0 1 1 iss_acidorb
|
||||||
1001 Acid_Orb 16830293 15 4 45000 3100 0 1 1 iss_acidorb
|
1001 Acid_Orb 16830293 15 4 45000 3100 0 1 1 iss_acidorb
|
||||||
@@ -1537,17 +1537,17 @@
|
|||||||
1522 SPELL_INFLICT_MODERATE_DAMAGE_3 16976416 3 2 1250 17096 1 1 1 iss_X1InfMod
|
1522 SPELL_INFLICT_MODERATE_DAMAGE_3 16976416 3 2 1250 17096 1 1 1 iss_X1InfMod
|
||||||
1523 SPELL_INFLICT_MODERATE_DAMAGE_6 16976417 6 2 2250 17096 1 1 1 iss_X1InfMod
|
1523 SPELL_INFLICT_MODERATE_DAMAGE_6 16976417 6 2 2250 17096 1 1 1 iss_X1InfMod
|
||||||
1524 SPELL_INFLICT_MODERATE_DAMAGE_10 16976418 10 2 3750 17096 1 1 1 iss_X1InfMod
|
1524 SPELL_INFLICT_MODERATE_DAMAGE_10 16976418 10 2 3750 17096 1 1 1 iss_X1InfMod
|
||||||
1525 SPELL_INFLICT_SERIOUS_DAMAGE_5 16976422 5 3 2500 17097 1 1 1 iss_X1InfSer
|
1525 SPELL_INFLICT_SERIOUS_DAMAGE_5 16976422 5 3 11250 17097 1 1 1 iss_X1InfSer
|
||||||
1526 SPELL_INFLICT_SERIOUS_DAMAGE_10 16976423 10 3 5000 17097 1 1 1 iss_X1InfSer
|
1526 SPELL_INFLICT_SERIOUS_DAMAGE_10 16976423 10 3 22500 17097 1 1 1 iss_X1InfSer
|
||||||
1527 SPELL_INFLICT_SERIOUS_DAMAGE_15 16976424 15 3 7500 17097 1 1 1 iss_X1InfSer
|
1527 SPELL_INFLICT_SERIOUS_DAMAGE_15 16976424 15 3 33750 17097 1 1 1 iss_X1InfSer
|
||||||
1528 SPELL_INFLICT_CRITICAL_DAMAGE_7 16976428 7 4 10500 17098 1 1 1 iss_X1InfCri
|
1528 SPELL_INFLICT_CRITICAL_DAMAGE_7 16976428 7 4 21000 17098 1 1 1 iss_X1InfCri
|
||||||
1529 SPELL_INFLICT_CRITICAL_DAMAGE_15 16976429 15 4 22500 17098 1 1 1 iss_X1InfCri
|
1529 SPELL_INFLICT_CRITICAL_DAMAGE_15 16976429 15 4 45000 17098 1 1 1 iss_X1InfCri
|
||||||
1530 SPELL_INFLICT_CRITICAL_DAMAGE_20 16976430 20 4 30000 17098 1 1 1 iss_X1InfCri
|
1530 SPELL_INFLICT_CRITICAL_DAMAGE_20 16976430 20 4 60000 17098 1 1 1 iss_X1InfCri
|
||||||
1531 SPELL_MASS_REPAIR_LIGHT_DAMAGE_9 16976434 9 5 16875 17106 0 0 1 is_CurLgtW
|
1531 SPELL_MASS_REPAIR_LIGHT_DAMAGE_9 16976434 9 5 33750 17106 0 0 1 is_CurLgtW
|
||||||
1532 SPELL_MASS_REPAIR_LIGHT_DAMAGE_15 16976435 15 5 28125 17106 0 0 1 is_CurLgtW
|
1532 SPELL_MASS_REPAIR_LIGHT_DAMAGE_15 16976435 15 5 56250 17106 0 0 1 is_CurLgtW
|
||||||
1533 SPELL_MASS_REPAIR_LIGHT_DAMAGE_20 16976436 20 5 37500 17106 0 0 1 is_CurLgtW
|
1533 SPELL_MASS_REPAIR_LIGHT_DAMAGE_20 16976436 20 5 75000 17106 0 0 1 is_CurLgtW
|
||||||
1534 SPELL_MASS_REPAIR_MODERATE_DAMAGE_11 16976440 11 6 20625 17107 0 0 1 is_CurModW
|
1534 SPELL_MASS_REPAIR_MODERATE_DAMAGE_11 16976440 11 6 49500 17107 0 0 1 is_CurModW
|
||||||
1535 SPELL_MASS_REPAIR_MODERATE_DAMAGE_15 16976441 15 6 28125 17107 0 0 1 is_CurModW
|
1535 SPELL_MASS_REPAIR_MODERATE_DAMAGE_15 16976441 15 6 67500 17107 0 0 1 is_CurModW
|
||||||
1536 SPELL_MASS_REPAIR_MODERATE_DAMAGE_20 16976442 20 6 37500 17107 0 0 1 is_CurModW
|
1536 SPELL_MASS_REPAIR_MODERATE_DAMAGE_20 16976442 20 6 37500 17107 0 0 1 is_CurModW
|
||||||
1537 SPELL_MASS_REPAIR_SERIOUS_DAMAGE_13 16976446 13 7 24375 17108 0 0 1 is_CurSerW
|
1537 SPELL_MASS_REPAIR_SERIOUS_DAMAGE_13 16976446 13 7 24375 17108 0 0 1 is_CurSerW
|
||||||
1538 SPELL_MASS_REPAIR_SERIOUS_DAMAGE_16 16976447 16 7 30000 17108 0 0 1 is_CurSerW
|
1538 SPELL_MASS_REPAIR_SERIOUS_DAMAGE_16 16976447 16 7 30000 17108 0 0 1 is_CurSerW
|
||||||
@@ -1565,3 +1565,6 @@
|
|||||||
1550 SPELL_MASS_INFLICT_SERIOUS_DAMAGE_20 16976472 20 7 37500 17113 0 0 1 iss_infserwm
|
1550 SPELL_MASS_INFLICT_SERIOUS_DAMAGE_20 16976472 20 7 37500 17113 0 0 1 iss_infserwm
|
||||||
1551 SPELL_MASS_INFLICT_CRITICAL_DAMAGE_15 16976476 15 8 28125 17114 0 0 1 iss_infcrwnm
|
1551 SPELL_MASS_INFLICT_CRITICAL_DAMAGE_15 16976476 15 8 28125 17114 0 0 1 iss_infcrwnm
|
||||||
1552 SPELL_MASS_INFLICT_CRITICAL_DAMAGE_20 16976477 20 8 37500 17114 0 0 1 iss_infcrwnm
|
1552 SPELL_MASS_INFLICT_CRITICAL_DAMAGE_20 16976477 20 8 37500 17114 0 0 1 iss_infcrwnm
|
||||||
|
1553 SPELL_GASEOUS_FORM_5 16976479 5 3 11250 2348 1 1 1 is_BullStr
|
||||||
|
1554 SPELL_GASEOUS_FORM_10 16976480 10 3 22500 2348 1 1 1 is_BullStr
|
||||||
|
1555 SPELL_GASEOUS_FORM_15 16976481 15 3 33750 2348 1 1 1 is_BullStr
|
||||||
|
|||||||
@@ -98,7 +98,7 @@
|
|||||||
94 WeaponChoiceTempus 16822944 16822945 ife_X2WpCh
|
94 WeaponChoiceTempus 16822944 16822945 ife_X2WpCh
|
||||||
95 Evilbrand 16822849 16822850 ife_X2BoneSk1
|
95 Evilbrand 16822849 16822850 ife_X2BoneSk1
|
||||||
96 Aberrant 16790214 16790215 ife_dfrm_gaunt
|
96 Aberrant 16790214 16790215 ife_dfrm_gaunt
|
||||||
97 **** **** **** ****
|
97 ExaltedFeats 16854436 16854437 ife_holyrad
|
||||||
98 **** **** **** ****
|
98 **** **** **** ****
|
||||||
99 **** **** **** ****
|
99 **** **** **** ****
|
||||||
100 **** **** **** ****
|
100 **** **** **** ****
|
||||||
|
|||||||
@@ -133,4 +133,870 @@
|
|||||||
129 NPC_Aribeth_Paladin 84522 84106 6 CHA 50 **** **** **** **** PackSPPala1 PackFTPalaH PackSKPalaH PackEQPala1 0 0
|
129 NPC_Aribeth_Paladin 84522 84106 6 CHA 50 **** **** **** **** PackSPPala1 PackFTPalaH PackSKPalaH PackEQPala1 0 0
|
||||||
130 NPC_Aribeth_Blackguard 84523 84106 31 STR 50 **** **** **** **** PackSPPala1 PackFTPalaH PackSKPalaH PackEQPala1 0 0
|
130 NPC_Aribeth_Blackguard 84523 84106 31 STR 50 **** **** **** **** PackSPPala1 PackFTPalaH PackSKPalaH PackEQPala1 0 0
|
||||||
131 Purple_Dragon_Knight 111933 111934 41 STR 50 **** **** **** **** **** PackFTFight1 PackSKFight1 PackEQFight1 0 1
|
131 Purple_Dragon_Knight 111933 111934 41 STR 50 **** **** **** **** **** PackFTFight1 PackSKFight1 PackEQFight1 0 1
|
||||||
132 Warlock_Blaster_Default 16988717 16988718 112 CHA 50 **** **** **** **** **** packftwr1 packftwr1 packeqwr1 0 1
|
132 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
133 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
134 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
135 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
136 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
137 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
138 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
139 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
140 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
141 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
142 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
143 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
144 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
145 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
146 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
147 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
148 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
149 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
150 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
151 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
152 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
153 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
154 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
155 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
156 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
157 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
158 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
159 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
160 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
161 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
162 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
163 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
164 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
165 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
166 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
167 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
168 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
169 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
170 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
171 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
172 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
173 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
174 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
175 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
176 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
177 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
178 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
179 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
180 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
181 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
182 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
183 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
184 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
185 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
186 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
187 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
188 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
189 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
190 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
191 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
192 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
193 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
194 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
195 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
196 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
197 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
198 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
199 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
200 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
201 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
202 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
203 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
204 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
205 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
206 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
207 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
208 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
209 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
210 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
211 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
212 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
213 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
214 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
215 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
216 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
217 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
218 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
219 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
220 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
221 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
222 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
223 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
224 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
225 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
226 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
227 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
228 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
229 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
230 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
231 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
232 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
233 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
234 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
235 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
236 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
237 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
238 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
239 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
240 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
241 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
242 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
243 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
244 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
245 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
246 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
247 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
248 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
249 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
250 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
251 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
252 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
253 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
254 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
255 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
256 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
257 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
258 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
259 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
260 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
261 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
262 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
263 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
264 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
265 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
266 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
267 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
268 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
269 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
270 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
271 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
272 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
273 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
274 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
275 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
276 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
277 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
278 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
279 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
280 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
281 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
282 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
283 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
284 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
285 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
286 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
287 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
288 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
289 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
290 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
291 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
292 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
293 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
294 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
295 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
296 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
297 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
298 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
299 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
300 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
301 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
302 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
303 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
304 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
305 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
306 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
307 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
308 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
309 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
310 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
311 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
312 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
313 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
314 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
315 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
316 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
317 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
318 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
319 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
320 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
321 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
322 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
323 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
324 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
325 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
326 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
327 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
328 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
329 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
330 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
331 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
332 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
333 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
334 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
335 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
336 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
337 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
338 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
339 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
340 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
341 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
342 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
343 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
344 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
345 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
346 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
347 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
348 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
349 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
350 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
351 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
352 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
353 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
354 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
355 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
356 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
357 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
358 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
359 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
360 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
361 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
362 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
363 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
364 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
365 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
366 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
367 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
368 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
369 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
370 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
371 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
372 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
373 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
374 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
375 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
376 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
377 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
378 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
379 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
380 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
381 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
382 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
383 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
384 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
385 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
386 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
387 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
388 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
389 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
390 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
391 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
392 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
393 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
394 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
395 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
396 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
397 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
398 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
399 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
400 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
401 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
402 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
403 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
404 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
405 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
406 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
407 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
408 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
409 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
410 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
411 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
412 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
413 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
414 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
415 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
416 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
417 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
418 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
419 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
420 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
421 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
422 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
423 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
424 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
425 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
426 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
427 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
428 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
429 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
430 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
431 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
432 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
433 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
434 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
435 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
436 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
437 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
438 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
439 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
440 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
441 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
442 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
443 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
444 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
445 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
446 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
447 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
448 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
449 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
450 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
451 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
452 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
453 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
454 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
455 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
456 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
457 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
458 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
459 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
460 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
461 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
462 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
463 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
464 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
465 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
466 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
467 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
468 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
469 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
470 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
471 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
472 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
473 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
474 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
475 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
476 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
477 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
478 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
479 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
480 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
481 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
482 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
483 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
484 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
485 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
486 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
487 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
488 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
489 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
490 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
491 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
492 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
493 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
494 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
495 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
496 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
497 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
498 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
499 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
500 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
501 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
502 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
503 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
504 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
505 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
506 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
507 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
508 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
509 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
510 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
511 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
512 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
513 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
514 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
515 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
516 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
517 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
518 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
519 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
520 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
521 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
522 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
523 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
524 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
525 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
526 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
527 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
528 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
529 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
530 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
531 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
532 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
533 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
534 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
535 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
536 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
537 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
538 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
539 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
540 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
541 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
542 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
543 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
544 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
545 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
546 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
547 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
548 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
549 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
550 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
551 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
552 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
553 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
554 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
555 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
556 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
557 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
558 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
559 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
560 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
561 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
562 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
563 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
564 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
565 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
566 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
567 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
568 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
569 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
570 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
571 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
572 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
573 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
574 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
575 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
576 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
577 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
578 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
579 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
580 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
581 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
582 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
583 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
584 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
585 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
586 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
587 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
588 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
589 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
590 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
591 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
592 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
593 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
594 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
595 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
596 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
597 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
598 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
599 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
600 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
601 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
602 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
603 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
604 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
605 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
606 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
607 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
608 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
609 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
610 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
611 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
612 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
613 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
614 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
615 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
616 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
617 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
618 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
619 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
620 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
621 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
622 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
623 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
624 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
625 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
626 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
627 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
628 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
629 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
630 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
631 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
632 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
633 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
634 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
635 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
636 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
637 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
638 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
639 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
640 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
641 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
642 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
643 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
644 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
645 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
646 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
647 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
648 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
649 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
650 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
651 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
652 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
653 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
654 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
655 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
656 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
657 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
658 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
659 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
660 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
661 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
662 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
663 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
664 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
665 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
666 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
667 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
668 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
669 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
670 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
671 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
672 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
673 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
674 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
675 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
676 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
677 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
678 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
679 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
680 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
681 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
682 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
683 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
684 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
685 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
686 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
687 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
688 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
689 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
690 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
691 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
692 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
693 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
694 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
695 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
696 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
697 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
698 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
699 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
700 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
701 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
702 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
703 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
704 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
705 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
706 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
707 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
708 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
709 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
710 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
711 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
712 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
713 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
714 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
715 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
716 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
717 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
718 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
719 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
720 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
721 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
722 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
723 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
724 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
725 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
726 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
727 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
728 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
729 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
730 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
731 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
732 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
733 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
734 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
735 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
736 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
737 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
738 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
739 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
740 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
741 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
742 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
743 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
744 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
745 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
746 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
747 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
748 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
749 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
750 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
751 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
752 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
753 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
754 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
755 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
756 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
757 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
758 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
759 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
760 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
761 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
762 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
763 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
764 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
765 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
766 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
767 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
768 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
769 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
770 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
771 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
772 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
773 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
774 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
775 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
776 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
777 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
778 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
779 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
780 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
781 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
782 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
783 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
784 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
785 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
786 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
787 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
788 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
789 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
790 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
791 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
792 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
793 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
794 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
795 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
796 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
797 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
798 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
799 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
800 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
801 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
802 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
803 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
804 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
805 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
806 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
807 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
808 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
809 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
810 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
811 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
812 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
813 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
814 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
815 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
816 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
817 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
818 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
819 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
820 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
821 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
822 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
823 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
824 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
825 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
826 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
827 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
828 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
829 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
830 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
831 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
832 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
833 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
834 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
835 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
836 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
837 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
838 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
839 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
840 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
841 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
842 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
843 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
844 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
845 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
846 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
847 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
848 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
849 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
850 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
851 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
852 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
853 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
854 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
855 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
856 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
857 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
858 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
859 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
860 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
861 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
862 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
863 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
864 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
865 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
866 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
867 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
868 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
869 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
870 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
871 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
872 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
873 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
874 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
875 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
876 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
877 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
878 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
879 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
880 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
881 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
882 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
883 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
884 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
885 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
886 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
887 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
888 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
889 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
890 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
891 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
892 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
893 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
894 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
895 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
896 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
897 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
898 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
899 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
900 Warlock_Blaster_Default 16988717 16988718 112 CHA 50 **** **** **** **** **** packftwr1 packftwr1 packeqwr1 0 1
|
||||||
|
901 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
902 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
903 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
904 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
905 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
906 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
907 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
908 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
909 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
910 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
911 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
912 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
913 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
914 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
915 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
916 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
917 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
918 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
919 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
920 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
921 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
922 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
923 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
924 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
925 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
926 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
927 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
928 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
929 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
930 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
931 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
932 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
933 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
934 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
935 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
936 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
937 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
938 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
939 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
940 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
941 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
942 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
943 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
944 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
945 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
946 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
947 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
948 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
949 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
950 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
951 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
952 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
953 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
954 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
955 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
956 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
957 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
958 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
959 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
960 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
961 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
962 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
963 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
964 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
965 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
966 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
967 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
968 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
969 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
970 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
971 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
972 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
973 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
974 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
975 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
976 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
977 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
978 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
979 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
980 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
981 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
982 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
983 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
984 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
985 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
986 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
987 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
988 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
989 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
990 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
991 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
992 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
993 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
994 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
995 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
996 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
997 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
998 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
|||||||
@@ -4067,7 +4067,7 @@
|
|||||||
4063 Epic_Spell_The_Withering **** **** **** **** **** **** **** **** **** **** **** **** ****
|
4063 Epic_Spell_The_Withering **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
4064 Epic_Spell_Tolodines_Killing_Wind **** **** **** **** **** **** **** **** **** **** **** **** ****
|
4064 Epic_Spell_Tolodines_Killing_Wind **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
4065 Epic_Spell_Transcendent_Vitality **** **** **** **** **** **** **** **** **** **** **** **** ****
|
4065 Epic_Spell_Transcendent_Vitality **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
4066 Epic_Spell_Twinfiend **** **** **** **** **** **** **** **** **** **** **** **** ****
|
4066 Epic_Spell_Twinfiend 0x01000 0x00100 **** **** **** **** **** **** **** **** **** **** ****
|
||||||
4067 Epic_Spell_Unholy_Disciple **** **** **** **** **** **** **** **** **** **** **** **** ****
|
4067 Epic_Spell_Unholy_Disciple **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
4068 Epic_Spell_Unimpinged **** **** **** **** **** **** **** **** **** **** **** **** ****
|
4068 Epic_Spell_Unimpinged **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
4069 Epic_Spell_Unseen_Wanderer **** **** **** **** **** **** **** **** **** **** **** **** ****
|
4069 Epic_Spell_Unseen_Wanderer **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
|||||||
@@ -2025,7 +2025,7 @@
|
|||||||
2021 OozyGlob(Ochre) 16825064 ife_x1precise C S 0 **** 0x32 spl_ooze_glob **** **** **** **** **** **** 9 1500 hand **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf out 1000 **** **** **** **** 1 vpr_aroacid bounce hand spr_aroacid path **** 0 **** **** **** **** **** 10 2018 3 16825047 0 0 **** 1 198052820 **** **** 1 sphere 1.67 **** 3 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2021 OozyGlob(Ochre) 16825064 ife_x1precise C S 0 **** 0x32 spl_ooze_glob **** **** **** **** **** **** 9 1500 hand **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf out 1000 **** **** **** **** 1 vpr_aroacid bounce hand spr_aroacid path **** 0 **** **** **** **** **** 10 2018 3 16825047 0 0 **** 1 198052820 **** **** 1 sphere 1.67 **** 3 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2022 OozyGlob(Fungus) 16825065 ife_x1precise C S 0 **** 0x32 spl_ooze_glob **** **** **** **** **** **** 9 1500 hand **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf out 1000 **** **** **** **** 1 vpr_aroacid bounce hand spr_aroacid path **** 0 **** **** **** **** **** 10 2018 3 16825049 0 0 **** 1 198118356 **** **** 1 sphere 1.67 **** 3 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2022 OozyGlob(Fungus) 16825065 ife_x1precise C S 0 **** 0x32 spl_ooze_glob **** **** **** **** **** **** 9 1500 hand **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf out 1000 **** **** **** **** 1 vpr_aroacid bounce hand spr_aroacid path **** 0 **** **** **** **** **** 10 2018 3 16825049 0 0 **** 1 198118356 **** **** 1 sphere 1.67 **** 3 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2023 SlimeWave 16825072 is_BurnHands T S 0 **** 0x3E spl_slime_wave **** **** **** **** **** **** 9 1500 hand **** vco_smhanacid01 **** sco_mehanacid01 vs_chant_ench_lm vs_chant_ench_lf out 1700 **** var_coneacid **** sar_coneacid 0 **** **** **** **** **** Acid 1 **** **** **** **** **** 11 **** 1 16825073 1 0 **** 1 3036 **** **** 1 cone 10 **** 19 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2023 SlimeWave 16825072 is_BurnHands T S 0 **** 0x3E spl_slime_wave **** **** **** **** **** **** 9 1500 hand **** vco_smhanacid01 **** sco_mehanacid01 vs_chant_ench_lm vs_chant_ench_lf out 1700 **** var_coneacid **** sar_coneacid 0 **** **** **** **** **** Acid 1 **** **** **** **** **** 11 **** 1 16825073 1 0 **** 1 3036 **** **** 1 cone 10 **** 19 **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2024 Feat_End_Spell_Effects 16827975 ife_mastelem T P s 0x00 0x01 prc_end_trees **** **** **** **** **** **** 1 4528 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 1798 1952 2026 **** **** **** **** 3 16827976 0 0 **** 0 2468 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2024 Feat_End_Spell_Effects 16827975 ife_mastelem T P s 0x00 0x01 prc_end_trees **** **** **** **** **** **** 1 4528 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 1798 1952 2026 2690 **** **** **** 3 16827976 0 0 **** 0 2468 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2025 HavocMage_BattleCast 16826713 ife_mastelem T P 0 **** 0x01 prc_hvcm_btlcst **** **** **** **** **** **** 9 0 head **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf self 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 **** 3 **** 0 0 **** 0 3000 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2025 HavocMage_BattleCast 16826713 ife_mastelem T P 0 **** 0x01 prc_hvcm_btlcst **** **** **** **** **** **** 9 0 head **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf self 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 **** 3 **** 0 0 **** 0 3000 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2026 EndPRCTreeshape 16847292 ife_mastelem T P 0 **** 0x01 prc_end_trees **** **** **** **** **** **** 9 0 head **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf self 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 2024 3 16847293 0 0 **** 0 350620068 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2026 EndPRCTreeshape 16847292 ife_mastelem T P 0 **** 0x01 prc_end_trees **** **** **** **** **** **** 9 0 head **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf self 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 2024 3 16847293 0 0 **** 0 350620068 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2027 BAELNORN_EYES 16829230 is_eyes G P 0 0x00 0x01 prc_bn_eyes **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 2 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2027 BAELNORN_EYES 16829230 is_eyes G P 0 0x00 0x01 prc_bn_eyes **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 2 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
@@ -2690,9 +2690,9 @@
|
|||||||
2686 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2686 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2687 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2687 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2688 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2688 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2689 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2689 **EndDomainReserver** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2690 **EndDomainReserver** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2690 CancelSpell 16855213 ife_mastelem T P S 0x00 0x01 prc_remo_spell **** **** **** **** **** **** 9 0 head **** vco_smhanevil01 **** sco_mehannatr01 vs_chant_ench_lm vs_chant_ench_lf self 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** 10 2024 3 16855214 0 0 **** 0 467863972 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2691 end_psionics **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2691 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2692 BATTLE_RAGE 16789530 ife_rage V P s 0x00 0x09 PRC_BatlRage **** **** **** **** **** **** 1 500 head **** **** **** **** **** **** out 500 **** **** **** **** 0 **** **** **** **** **** **** 1 **** **** **** **** **** 16 **** 3 **** 0 0 53207 0 293 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2692 BATTLE_RAGE 16789530 ife_rage V P s 0x00 0x09 PRC_BatlRage **** **** **** **** **** **** 1 500 head **** **** **** **** **** **** out 500 **** **** **** **** 0 **** **** **** **** **** **** 1 **** **** **** **** **** 16 **** 3 **** 0 0 53207 0 293 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2693 Teleport_Management_Radial_Master 16825258 ife_telep_manag G P 0 0x00 0x01 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 2694 2695 2696 2697 2698 **** **** **** **** **** **** **** **** 4235 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2693 Teleport_Management_Radial_Master 16825258 ife_telep_manag G P 0 0x00 0x01 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** 2694 2695 2696 2697 2698 **** **** **** **** **** **** **** **** 4235 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
2694 Teleport_Mark_Location 16825260 ife_telep_mrkloc G P 0 0x00 0x01 prc_telep_mrkloc **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** **** 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** 2693 3 16825261 0 0 **** 0 369954955 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
2694 Teleport_Mark_Location 16825260 ife_telep_mrkloc G P 0 0x00 0x01 prc_telep_mrkloc **** **** **** **** **** **** **** 0 **** **** **** **** **** **** **** **** 0 **** **** **** **** 0 **** **** **** **** **** **** 0 **** **** **** **** **** **** 2693 3 16825261 0 0 **** 0 369954955 **** **** 0 **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
|||||||
Binary file not shown.
@@ -1,13 +1,90 @@
|
|||||||
//:://////////////////////////////////////////////
|
//::////////////////////////////////////////////////////////
|
||||||
|
//:: ;-. ,-. ,-. ,-.
|
||||||
|
//:: | ) | ) / ( )
|
||||||
|
//:: |-' |-< | ;-:
|
||||||
|
//:: | | \ \ ( )
|
||||||
|
//:: ' ' ' `-' `-'
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
//:: FileName: "ss_ep_summonaber"
|
//:: FileName: "ss_ep_summonaber"
|
||||||
/* Purpose: Summon Aberration - summons a semi-random aberration for 20 hours.
|
//:: Epic Spell: Summon Aberration
|
||||||
*/
|
//:: Created By: Boneshank (Don Armstrong)
|
||||||
//:://////////////////////////////////////////////
|
|
||||||
//:: Created By: Boneshank
|
|
||||||
//:: Last Updated On: March 12, 2004
|
//:: Last Updated On: March 12, 2004
|
||||||
//:://////////////////////////////////////////////
|
//:: Updated By: Jaysyn
|
||||||
|
//:: Updated on: 2025-11-21 19:40:26
|
||||||
|
//::
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
/*
|
||||||
|
School: Conjuration (Summoning)
|
||||||
|
Components: V,S
|
||||||
|
Range: Short
|
||||||
|
Effect: Summons advanced aberration(s)
|
||||||
|
Duration: 1 Turn / Caster level
|
||||||
|
Saving Throw: None
|
||||||
|
Spell Resistance: No
|
||||||
|
|
||||||
|
You summon one or more advanced psuedonatural aberrations
|
||||||
|
from the Far Realms to do your bidding. The aberration
|
||||||
|
receives one bonus hit die for every 2 caster levels of
|
||||||
|
the summoner, up to the maximum hit dice for the creature,
|
||||||
|
and maximum hit points per die. The aberration follows
|
||||||
|
your orders to the best of its ability, for the duration
|
||||||
|
of the spell.
|
||||||
|
|
||||||
|
*/
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
#include "prc_inc_json"
|
||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
#include "inc_epicspells"
|
#include "inc_epicspells"
|
||||||
|
#include "nw_i0_generic"
|
||||||
|
#include "inc_ecl"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void SpawnIntDevourer(object oCaster, json jAberration, location lTarget, float fDuration, string sNewName = "")
|
||||||
|
{
|
||||||
|
MultisummonPreSummon();
|
||||||
|
|
||||||
|
object oAberration = JsonToObject(jAberration, lTarget);
|
||||||
|
|
||||||
|
int nHD = GetHitDice(oAberration);
|
||||||
|
|
||||||
|
SetLocalInt(oAberration, "PRC_CASTERLEVEL_OVERRIDE", nHD);
|
||||||
|
|
||||||
|
int nCasterLvl = GetTotalCastingLevel(oCaster);
|
||||||
|
|
||||||
|
if (!GetIsObjectValid(oAberration))
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber | SpawnIntDevourer() >> oAberration not passed to function.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string sSummon = "ep_sum_aberrat05";
|
||||||
|
|
||||||
|
//:: effect eSummon;
|
||||||
|
effect eSummon = EffectSummonCreature("", VFX_FNF_SUMMON_EPIC_UNDEAD, 0.0, 0, VFX_IMP_UNSUMMON, oAberration);
|
||||||
|
|
||||||
|
//:: Set faction to caster<65>s
|
||||||
|
ChangeFaction(oAberration, oCaster);
|
||||||
|
SetLocalObject(oAberration, "SUMMONER", oCaster);
|
||||||
|
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, lTarget, fDuration);
|
||||||
|
|
||||||
|
if (!GetIsObjectValid(oAberration))
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber | SpawnIntDevourer() >> JsonToObject failed - could not create creature from edited template.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AugmentSummonedCreature(sSummon);
|
||||||
|
|
||||||
|
ApplyPseudonaturalEffects(oAberration);
|
||||||
|
|
||||||
|
SetObjectVisualTransform(oAberration, OBJECT_VISUAL_TRANSFORM_SCALE, 3.5f);
|
||||||
|
|
||||||
|
SetName(oAberration, sNewName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
if (!X2PreSpellCastCode()) return;
|
if (!X2PreSpellCastCode()) return;
|
||||||
@@ -15,6 +92,22 @@ void main()
|
|||||||
PRCSetSchool(SPELL_SCHOOL_CONJURATION);
|
PRCSetSchool(SPELL_SCHOOL_CONJURATION);
|
||||||
|
|
||||||
object oCaster = OBJECT_SELF;
|
object oCaster = OBJECT_SELF;
|
||||||
|
|
||||||
|
int nCasterLvl = GetTotalCastingLevel(oCaster);
|
||||||
|
|
||||||
|
int nBonusHD = nCasterLvl/2;
|
||||||
|
int iMinHD;
|
||||||
|
int iMaxHD;
|
||||||
|
string sNewName;
|
||||||
|
|
||||||
|
float fDuration = TurnsToSeconds(nCasterLvl);
|
||||||
|
|
||||||
|
effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_EPIC_UNDEAD);
|
||||||
|
effect eVis2 = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
||||||
|
|
||||||
|
//:: Target location
|
||||||
|
location lTarget = PRCGetSpellTargetLocation();
|
||||||
|
|
||||||
if(GetCanCastSpell(oCaster, SPELL_EPIC_SUMABER))
|
if(GetCanCastSpell(oCaster, SPELL_EPIC_SUMABER))
|
||||||
{
|
{
|
||||||
string sSummon;
|
string sSummon;
|
||||||
@@ -22,22 +115,308 @@ void main()
|
|||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
case 2:
|
case 2:
|
||||||
case 3: sSummon = "ep_summonaberat1"; break;
|
case 3:
|
||||||
|
{ //:: Summoned Illithid
|
||||||
|
sSummon = "ep_sum_aberrat01";
|
||||||
|
sNewName = "Summoned Psuedonatural Illithid";
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 4:
|
case 4:
|
||||||
case 5:
|
case 5:
|
||||||
case 6: sSummon = "ep_summonaberat2"; break;
|
case 6:
|
||||||
|
{ //:: Summoned Drider
|
||||||
|
sSummon = "ep_sum_aberrat02";
|
||||||
|
sNewName = "Summoned Psuedonatural Drider";
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 7:
|
case 7:
|
||||||
case 8: sSummon = "ep_summonaberat3"; break;
|
case 8:
|
||||||
case 9: sSummon = "ep_summonaberat4"; break;
|
{ //:: Summoned Beholder
|
||||||
case 10: sSummon = "ep_summonaberat5"; break;
|
sSummon = "ep_sum_aberrat03";
|
||||||
|
sNewName = "Summoned Psuedonatural Beholder";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 9:
|
||||||
|
{ //:: Summoned Umber Hulk
|
||||||
|
sSummon = "ep_sum_aberrat04";
|
||||||
|
sNewName = "Summoned Psuedonatural Umberhulk";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 10:
|
||||||
|
{ //:: Summoned Battle Devourer
|
||||||
|
sSummon = "ep_sum_aberrat05";
|
||||||
|
sNewName = "Summoned Psuedonatural Battle Devourer";
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
effect eSummon = ExtraordinaryEffect(EffectSummonCreature(sSummon, VFX_FNF_SUMMON_EPIC_UNDEAD, 1.0f));
|
//:: Summoned Illithid and Drider have class levels & only get a partial json treatment.
|
||||||
|
if(sSummon == "ep_sum_aberrat01" || sSummon == "ep_sum_aberrat02")
|
||||||
|
{
|
||||||
|
|
||||||
|
//:: Create the creature
|
||||||
|
object oAberration = MakePsuedonaturalCreatureFromTemplate(sSummon, lTarget);
|
||||||
|
|
||||||
|
effect eSummon = ExtraordinaryEffect(EffectSummonCreature("", VFX_FNF_SUMMON_EPIC_UNDEAD, 0.0, 0, VFX_IMP_UNSUMMON, oAberration));
|
||||||
//Apply the summon visual and summon the aberration.
|
//Apply the summon visual and summon the aberration.
|
||||||
MultisummonPreSummon();
|
MultisummonPreSummon();
|
||||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, PRCGetSpellTargetLocation(), HoursToSeconds(20));
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, lTarget, fDuration);
|
||||||
|
|
||||||
|
int nOriginalHD = GetLocalInt(oAberration, "nOriginalHD");
|
||||||
|
int iTargetLvl = (nCasterLvl/2) + nOriginalHD;
|
||||||
|
int iMinHD = GetLocalInt(oAberration, "iMinHD");
|
||||||
|
int iMaxHD = GetLocalInt(oAberration, "iMaxHD");
|
||||||
|
int iClass2 = GetLocalInt(oAberration, "Class2");
|
||||||
|
int iClass2Package = GetLocalInt(oAberration, "Class2Package");
|
||||||
|
int iClass2Start = GetLocalInt(oAberration, "Class2Start");
|
||||||
|
int iMagicUse = GetLocalInt(oAberration, "X2_L_BEH_MAGIC");
|
||||||
|
string sAI = GetLocalString(oAberration, "X2_SPECIAL_COMBAT_AI_SCRIPT");
|
||||||
|
|
||||||
|
if (DEBUG) DoDebug("ss_ep_summonaber >> iMinHD = " +IntToString(iMinHD)+".");
|
||||||
|
if (DEBUG) DoDebug("ss_ep_summonaber >> iMaxHD = " +IntToString(iMaxHD)+".");
|
||||||
|
|
||||||
|
//check the ranges so we dont go above max, or below min.
|
||||||
|
if(iTargetLvl < iMinHD) iTargetLvl = iMinHD;
|
||||||
|
if(iTargetLvl > iMaxHD) iTargetLvl = iMaxHD;
|
||||||
|
|
||||||
|
if (DEBUG) DoDebug("ss_ep_summonaber >> iTargetLvl = " +IntToString(iTargetLvl)+".");
|
||||||
|
|
||||||
|
//:: Set faction to caster<65>s
|
||||||
|
ChangeFaction(oAberration, oCaster);
|
||||||
|
SetLocalObject(oAberration, "SUMMONER", oCaster);
|
||||||
|
|
||||||
|
SetLocalInt(oAberration, "PRC_CASTERLEVEL_OVERRIDE", iTargetLvl);
|
||||||
|
|
||||||
|
//:: Fires LevelUpSummon for scaling summons using LevelUpHenchman
|
||||||
|
LevelUpSummon(oAberration, iTargetLvl);
|
||||||
|
|
||||||
DelayCommand(0.5, AugmentSummonedCreature(sSummon));
|
DelayCommand(0.5, AugmentSummonedCreature(sSummon));
|
||||||
|
|
||||||
|
//:: Apply effects
|
||||||
|
ApplyPseudonaturalEffects(oAberration);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//:: Other Summons are advanced via direct json editing
|
||||||
|
//:: Load template
|
||||||
|
json jAberration = TemplateToJson(sSummon, RESTYPE_UTC);
|
||||||
|
if (jAberration == JSON_NULL)
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> TemplateToJson failed <20> bad resref or resource missing.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Read HD range from JSON template
|
||||||
|
int iMinHD = json_GetLocalIntFromVarTable(jAberration, "iMinHD");
|
||||||
|
int iMaxHD = json_GetLocalIntFromVarTable(jAberration, "iMaxHD");
|
||||||
|
|
||||||
|
//:: Original HD
|
||||||
|
int nOriginalHD = json_GetLocalIntFromVarTable(jAberration, "nOriginalHD");
|
||||||
|
int nOffsetHD = json_GetLocalIntFromVarTable(jAberration, "nOffsetHD");
|
||||||
|
if (DEBUG) DoDebug("ss_ep_summonaber >> nOffsetHD = " +IntToString(nOffsetHD)+".");
|
||||||
|
|
||||||
|
if (nOriginalHD < 1)
|
||||||
|
{
|
||||||
|
nOriginalHD = json_GetCreatureHD(jAberration);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DEBUG) DoDebug("ss_ep_summonaber >> nOriginalHD = " +IntToString(nOriginalHD)+".");
|
||||||
|
|
||||||
|
if (nOriginalHD <= 0)
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> json_GetCreatureHD failed <20> template missing HD data.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float fOriginalCR = json_GetChallengeRating(jAberration);
|
||||||
|
if (fOriginalCR <= 0.0)
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> json_GetChallengeRating failed <20> template missing CR data.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DEBUG) DoDebug("ss_ep_summonaber >> iMinHD = " +IntToString(iMinHD)+".");
|
||||||
|
if (DEBUG) DoDebug("ss_ep_summonaber >> iMaxHD = " +IntToString(iMaxHD)+".");
|
||||||
|
|
||||||
|
//:: Determine target total HD based on caster level bonuses and offset
|
||||||
|
int nTargetHD = nOriginalHD + nOffsetHD + (nCasterLvl / 2);
|
||||||
|
|
||||||
|
|
||||||
|
//:: Clamp to the template's defined range
|
||||||
|
if (nTargetHD < iMinHD) nTargetHD = iMinHD;
|
||||||
|
if (nTargetHD > iMaxHD) nTargetHD = iMaxHD;
|
||||||
|
|
||||||
|
|
||||||
|
//:: Calculate how many HD need to be added to reach that target
|
||||||
|
nBonusHD = nTargetHD - (nOriginalHD + nOffsetHD);
|
||||||
|
|
||||||
|
if (DEBUG)
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> nOffsetHD = " + IntToString(nOffsetHD));
|
||||||
|
DoDebug("ss_ep_summonaber >> nTargetHD = " + IntToString(nTargetHD));
|
||||||
|
DoDebug("ss_ep_summonaber >> nBonusHD (to add) = " + IntToString(nBonusHD));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DEBUG) DoDebug("ss_ep_summonaber >> nBonusHD = " +IntToString(nBonusHD)+".");
|
||||||
|
|
||||||
|
//:: Stat boost calc
|
||||||
|
int nStatBoost = GetStatBoostsFromHD(nOriginalHD, nBonusHD);
|
||||||
|
|
||||||
|
//:: Add Hit Dice
|
||||||
|
jAberration = json_AddHitDice(jAberration, nBonusHD);
|
||||||
|
if (jAberration == JSON_NULL)
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> json_AddHitDice failed - JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//:: Update feats
|
||||||
|
jAberration = json_AddFeatsFromCreatureVars(jAberration, nOriginalHD+nOffsetHD);
|
||||||
|
if (jAberration == JSON_NULL)
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> json_AddFeatsFromCreatureVars failed <20> JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//:: Update stats
|
||||||
|
jAberration = json_ApplyAbilityBoostFromHD(jAberration, nOriginalHD+nOffsetHD);
|
||||||
|
if (jAberration == JSON_NULL)
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> json_ApplyAbilityBoostFromHD failed <20> JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//:: Modify racial type for Psuedonatural template
|
||||||
|
jAberration = json_ModifyRacialType(jAberration, RACIAL_TYPE_OUTSIDER);
|
||||||
|
if (jAberration == JSON_NULL)
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> json_ModifyRacialType failed <20> JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//:: Add True Strike 1x / day for Psuedonatural template
|
||||||
|
jAberration = json_AddPsuedonaturalPowers(jAberration);
|
||||||
|
if (jAberration == JSON_NULL)
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> json_AddPsuedonaturalPowers failed <20> JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//:: Update CR for Psuedonatural template
|
||||||
|
jAberration = json_UpdatePsuedonaturalCR(jAberration, FloatToInt(fOriginalCR), json_GetCreatureHD(jAberration));
|
||||||
|
if (jAberration == JSON_NULL)
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> json_UpdatePsuedonaturalCR failed <20> JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Beholder get 5 skills per HD
|
||||||
|
if(sSummon == "ep_sum_aberrat03")
|
||||||
|
{
|
||||||
|
jAberration = json_AdjustCreatureSkillByID(jAberration, SKILL_SPOT, nTargetHD);
|
||||||
|
jAberration = json_AdjustCreatureSkillByID(jAberration, SKILL_LORE, nTargetHD);
|
||||||
|
jAberration = json_AdjustCreatureSkillByID(jAberration, SKILL_LISTEN, nTargetHD);
|
||||||
|
jAberration = json_AdjustCreatureSkillByID(jAberration, SKILL_SEARCH, nTargetHD);
|
||||||
|
jAberration = json_AdjustCreatureSkillByID(jAberration, SKILL_HIDE, nTargetHD);
|
||||||
|
}
|
||||||
|
else //:: Umber Hulk & Battle Devourer get 2 skills per HD
|
||||||
|
{
|
||||||
|
jAberration = json_AdjustCreatureSkillByID(jAberration, SKILL_SPOT, nTargetHD);
|
||||||
|
jAberration = json_AdjustCreatureSkillByID(jAberration, SKILL_LISTEN, nTargetHD);
|
||||||
|
}
|
||||||
|
if (jAberration == JSON_NULL)
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> json_AdjustCreatureSkillByID failed <20> JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Beholder and Umber Hulk spawn singlely
|
||||||
|
if(sSummon == "ep_sum_aberrat03" || sSummon == "ep_sum_aberrat04")
|
||||||
|
{
|
||||||
|
MultisummonPreSummon();
|
||||||
|
object oAberration = JsonToObject(jAberration, lTarget);
|
||||||
|
effect eSummon = ExtraordinaryEffect(EffectSummonCreature("", VFX_FNF_SUMMON_EPIC_UNDEAD, 0.0, 0, VFX_IMP_UNSUMMON, oAberration));
|
||||||
|
|
||||||
|
//:: Apply the summon visual and summon the aberration.
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, lTarget, fDuration);
|
||||||
|
|
||||||
|
if (!GetIsObjectValid(oAberration))
|
||||||
|
{
|
||||||
|
DoDebug("ss_ep_summonaber >> JsonToObject failed - could not create creature from edited template.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplyPseudonaturalEffects(oAberration);
|
||||||
|
}
|
||||||
|
//:: Summoned Battle Devourer spawns multiple creatures
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(GetPRCSwitch(PRC_MULTISUMMON))
|
||||||
|
{
|
||||||
|
//:: number of summons: 1d2+1
|
||||||
|
int nCount = d2() + 1;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while(i < nCount)
|
||||||
|
{
|
||||||
|
SpawnIntDevourer(oCaster, jAberration, lTarget, fDuration, sNewName);
|
||||||
|
i = i + 1;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//:: number of summons: 1d2+1
|
||||||
|
int nCount = d2() + 1;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while(i < nCount)
|
||||||
|
{
|
||||||
|
object oAberration = JsonToObject(jAberration, lTarget);
|
||||||
|
|
||||||
|
//:: Visual
|
||||||
|
DelayCommand(1.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, lTarget));
|
||||||
|
|
||||||
|
//:: Augment Summoning
|
||||||
|
DelayCommand(0.5, AugmentSummonedCreature(sSummon));
|
||||||
|
|
||||||
|
//:: Set HP
|
||||||
|
//SetCurrentHitPoints(oAberration, GetMaxPossibleHP(oAberration));
|
||||||
|
|
||||||
|
//:: Associate with caster
|
||||||
|
SetLocalNPC(oCaster, oAberration, ASSOCIATE_TYPE_SUMMONED);
|
||||||
|
SetAssociateState(NW_ASC_HAVE_MASTER, TRUE, oAberration);
|
||||||
|
SetAssociateState(NW_ASC_DISTANCE_2_METERS);
|
||||||
|
SetAssociateState(NW_ASC_DISTANCE_4_METERS, FALSE);
|
||||||
|
SetAssociateState(NW_ASC_DISTANCE_6_METERS, FALSE);
|
||||||
|
|
||||||
|
//:: Temporarily bump henchman limit so AddHenchman works
|
||||||
|
SetMaxHenchmen(GetMaxHenchmen() + nCount);
|
||||||
|
AddHenchman(oCaster, oAberration);
|
||||||
|
SetMaxHenchmen(GetMaxHenchmen() - nCount);
|
||||||
|
|
||||||
|
//:: Start combat AI
|
||||||
|
AssignCommand(oAberration, DetermineCombatRound());
|
||||||
|
|
||||||
|
//:: Schedule destruction + end-visual
|
||||||
|
DestroyObject(oAberration, fDuration);
|
||||||
|
DelayCommand(fDuration, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis2, lTarget));
|
||||||
|
|
||||||
|
SetObjectVisualTransform(oAberration, OBJECT_VISUAL_TRANSFORM_SCALE, 3.5f);
|
||||||
|
|
||||||
|
//:: Set faction to caster<65>s
|
||||||
|
ChangeFaction(oAberration, oCaster);
|
||||||
|
SetLocalObject(oAberration, "SUMMONER", oCaster);
|
||||||
|
|
||||||
|
SetLocalInt(oAberration, "PRC_CASTERLEVEL_OVERRIDE", nOriginalHD + nBonusHD);
|
||||||
|
|
||||||
|
SetLocalInt(oAberration, "MySummonerCL", nBonusHD);
|
||||||
|
|
||||||
|
ApplyPseudonaturalEffects(oAberration);
|
||||||
|
|
||||||
|
SetName(oAberration, sNewName);
|
||||||
|
|
||||||
|
i = i + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PRCSetSchool();
|
PRCSetSchool();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,60 +1,340 @@
|
|||||||
//::///////////////////////////////////////////////
|
//::////////////////////////////////////////////////////////
|
||||||
|
//:: ;-. ,-. ,-. ,-.
|
||||||
|
//:: | ) | ) / ( )
|
||||||
|
//:: |-' |-< | ;-:
|
||||||
|
//:: | | \ \ ( )
|
||||||
|
//:: ' ' ' `-' `-'
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
//;:
|
||||||
//:: Epic Spell: Twinfiend
|
//:: Epic Spell: Twinfiend
|
||||||
//:: Author: Boneshank (Don Armstrong)
|
//:: Author: Boneshank (Don Armstrong)
|
||||||
|
//:: Updated By: Jaysyn
|
||||||
|
//:: Updated on: 2025-11-18 18:18:09
|
||||||
|
//::
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
/*
|
||||||
|
School: Conjuration (Summoning, Evil)
|
||||||
|
Components: V,S
|
||||||
|
Range: Short
|
||||||
|
Effect: Summons two advanced pit fiends
|
||||||
|
Duration: 1 Turn / Caster level
|
||||||
|
Saving Throw: None
|
||||||
|
Spell Resistance: No
|
||||||
|
|
||||||
|
You summon two advanced pit fiends from the Nine Hells
|
||||||
|
to do your bidding. These devils recieve one bonus hit
|
||||||
|
die for every 2 caster levels of the summoner & maximum
|
||||||
|
hit points per die. The pit fiends follow your orders to
|
||||||
|
the best of their abilities, for the duration of the spell.
|
||||||
|
*/
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
//#include "x2_inc_toollib"
|
//#include "x2_inc_toollib"
|
||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
#include "inc_epicspells"
|
#include "inc_epicspells"
|
||||||
//#include "x2_inc_spellhook"
|
//#include "x2_inc_spellhook"
|
||||||
#include "nw_i0_generic"
|
#include "nw_i0_generic"
|
||||||
|
#include "prc_inc_json"
|
||||||
|
#include "inc_ecl"
|
||||||
|
|
||||||
void main()
|
void SpawnTwinFiend(object oPC, json jDevil, location lTarget, float fDuration)
|
||||||
{
|
{
|
||||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
MultisummonPreSummon();
|
||||||
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_CONJURATION);
|
|
||||||
|
|
||||||
if (!X2PreSpellCastCode())
|
object oFiend = JsonToObject(jDevil, lTarget);
|
||||||
|
|
||||||
|
int nHD = GetHitDice(oFiend);
|
||||||
|
|
||||||
|
SetLocalInt(oFiend, "PRC_CASTERLEVEL_OVERRIDE", nHD);
|
||||||
|
|
||||||
|
int nCasterLvl = GetTotalCastingLevel(oPC);
|
||||||
|
|
||||||
|
if (!GetIsObjectValid(oFiend))
|
||||||
{
|
{
|
||||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
SendMessageToPC(oPC, "ss_ep_twinfiend | SpawnTwinFiend() >> oFiend not passed to function.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (GetCanCastSpell(OBJECT_SELF, SPELL_EPIC_TWINF))
|
|
||||||
{
|
string sSummon = "twinfiend_demon";
|
||||||
//Declare major variables
|
|
||||||
float fDuration = RoundsToSeconds(20);
|
|
||||||
object oFiend, oFiend2;
|
|
||||||
// effect eSummon;
|
// effect eSummon;
|
||||||
effect eVis = EffectVisualEffect(460);
|
effect eVis = EffectVisualEffect(460);
|
||||||
effect eVis2 = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
effect eVis2 = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
||||||
|
|
||||||
|
effect eSummon = EffectSummonCreature("", 460, 0.0, 0, VFX_IMP_UNSUMMON, oFiend);
|
||||||
|
|
||||||
|
//:: Set faction to caster<65>s
|
||||||
|
ChangeFaction(oFiend, oPC);
|
||||||
|
SetLocalObject(oFiend, "SUMMONER", oPC);
|
||||||
|
|
||||||
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, lTarget, fDuration);
|
||||||
|
|
||||||
|
if (!GetIsObjectValid(oFiend))
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "ss_ep_twinfiend | SpawnTwinFiend() >> JsonToObject failed - could not create creature from edited template.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Update creature weapons for Size increase
|
||||||
|
if (nCasterLvl > 14)
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("ss_ep_twinfiend | SpawnTwinFiend() >> Updating Creature weapons for size increase.");
|
||||||
|
|
||||||
|
object oWeapCR = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oFiend);
|
||||||
|
MyDestroyObject(oWeapCR);
|
||||||
|
object oWeapCL = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oFiend);
|
||||||
|
MyDestroyObject(oWeapCL);
|
||||||
|
object oWeapCB = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oFiend);
|
||||||
|
MyDestroyObject(oWeapCB);
|
||||||
|
|
||||||
|
oWeapCR = CreateItemOnObject("nw_it_crewpsp010", oFiend);
|
||||||
|
ForceEquip(oFiend, oWeapCR, INVENTORY_SLOT_CWEAPON_R);
|
||||||
|
|
||||||
|
oWeapCL = CreateItemOnObject("bite_pitfiend002", oFiend);
|
||||||
|
ForceEquip(oFiend, oWeapCL, INVENTORY_SLOT_CWEAPON_L);
|
||||||
|
|
||||||
|
oWeapCB = CreateItemOnObject("prc_2d6_slamgrab", oFiend);
|
||||||
|
ForceEquip(oFiend, oWeapCB, INVENTORY_SLOT_CWEAPON_B);
|
||||||
|
|
||||||
|
SetObjectVisualTransform(oFiend, OBJECT_VISUAL_TRANSFORM_SCALE, 1.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
AugmentSummonedCreature(sSummon);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
object oPC = OBJECT_SELF;
|
||||||
|
|
||||||
|
if (!X2PreSpellCastCode())
|
||||||
|
{
|
||||||
|
DeleteLocalInt(oPC, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetLocalInt(oPC, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_CONJURATION);
|
||||||
|
|
||||||
|
// Target location
|
||||||
|
location lTarget = PRCGetSpellTargetLocation();
|
||||||
|
|
||||||
|
int nCasterLvl = GetTotalCastingLevel(oPC);
|
||||||
|
|
||||||
|
//:: Load template
|
||||||
|
json jDevil = TemplateToJson("twinfiend_demon", RESTYPE_UTC);
|
||||||
|
if (jDevil == JSON_NULL)
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "ss_ep_twinfiend >> TemplateToJson failed <20> bad resref or resource missing.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Get Original HD
|
||||||
|
int nOriginalHD = json_GetCreatureHD(jDevil);
|
||||||
|
if (nOriginalHD <= 0)
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "ss_ep_twinfiend >> json_GetCreatureHD failed <20> template missing HD data.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Stat boost calc
|
||||||
|
int nStatBoost = GetStatBoostsFromHD(nOriginalHD, nCasterLvl/2);
|
||||||
|
|
||||||
|
//:: Add one hit dice per two caster levels
|
||||||
|
jDevil = json_AddHitDice(jDevil, nCasterLvl/2);
|
||||||
|
if (jDevil == JSON_NULL)
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "ss_ep_twinfiend >> json_AddHitDice failed - JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Recalculate & maximize HP
|
||||||
|
int nCurrentHD = json_GetCreatureHD(jDevil);
|
||||||
|
if (nCurrentHD <= 0)
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "ss_ep_twinfiend >> json_GetCreatureHD failed <20> template missing HD data.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DEBUG) DoDebug("ss_ep_twinfiend >> nCurrentHD is: "+IntToString(nCurrentHD)+ " entering json_RecalcMaxHP.");
|
||||||
|
jDevil = json_RecalcMaxHP(jDevil, 8);
|
||||||
|
if (jDevil == JSON_NULL)
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "ss_ep_twinfiend >> json_RecalcMaxHP failed - JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Update feats
|
||||||
|
jDevil = json_AddFeatsFromCreatureVars(jDevil, nOriginalHD);
|
||||||
|
if (jDevil == JSON_NULL)
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "ss_ep_twinfiend >> json_AddFeatsFromCreatureVars failed <20> JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Update stats
|
||||||
|
jDevil = json_ApplyAbilityBoostFromHD(jDevil, nOriginalHD);
|
||||||
|
if (jDevil == JSON_NULL)
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "ss_ep_twinfiend >> json_ApplyAbilityBoostFromHD failed <20> JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Pit Fiend w 20 INT gets 13 (8+5) skill points per HD
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_SPOT, nCasterLvl/2);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_LORE, nCasterLvl/2);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_LISTEN, nCasterLvl/2);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_SEARCH, nCasterLvl/2);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_HIDE, nCasterLvl/2);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_MOVE_SILENTLY, nCasterLvl/2);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_CONCENTRATION, nCasterLvl/2);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_BLUFF, nCasterLvl/2);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_CLIMB, nCasterLvl/2);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_SPELLCRAFT, nCasterLvl/2);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_JUMP, nCasterLvl/2);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_TUMBLE, nCasterLvl/4);
|
||||||
|
jDevil = json_AdjustCreatureSkillByID(jDevil, SKILL_USE_MAGIC_DEVICE, nCasterLvl/4);
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "ss_ep_twinfiend >> json_AdjustCreatureSkillByID failed <20> JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Size increase
|
||||||
|
if (nCasterLvl > 14)
|
||||||
|
{
|
||||||
|
jDevil = json_AdjustCreatureSize(jDevil, 1);
|
||||||
|
if (jDevil == JSON_NULL)
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "ss_ep_twinfiend >> json_AdjustCreatureSize failed - JSON became invalid.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetCanCastSpell(oPC, SPELL_EPIC_TWINF))
|
||||||
|
{
|
||||||
|
//:: Declare major variables
|
||||||
|
float fDuration = TurnsToSeconds(nCasterLvl);
|
||||||
|
object oFiend;
|
||||||
|
object oFiend2;
|
||||||
|
|
||||||
|
// effect eSummon;
|
||||||
|
effect eVis = EffectVisualEffect(460);
|
||||||
|
effect eVis2 = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
||||||
|
|
||||||
|
string sSummon = "twinfiend_demon";
|
||||||
|
|
||||||
|
// Despawn existing Twinfiends
|
||||||
|
object oArea = GetArea(oPC);
|
||||||
|
object oObj = GetFirstObjectInArea(oArea);
|
||||||
|
|
||||||
|
while (GetIsObjectValid(oObj))
|
||||||
|
{
|
||||||
|
if (GetTag(oObj) == "TWINFIEND_DEMON")
|
||||||
|
{
|
||||||
|
if (GetLocalObject(oObj, "SUMMONER") == oPC)
|
||||||
|
{
|
||||||
|
DestroyObject(oObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
oObj = GetNextObjectInArea(oArea);
|
||||||
|
}
|
||||||
|
|
||||||
if(GetPRCSwitch(PRC_MULTISUMMON))
|
if(GetPRCSwitch(PRC_MULTISUMMON))
|
||||||
{
|
{
|
||||||
string sSummon = "twinfiend_demon";
|
SpawnTwinFiend(oPC, jDevil, lTarget, fDuration);
|
||||||
effect eSummon = EffectSummonCreature(sSummon, 460);
|
SpawnTwinFiend(oPC, jDevil, lTarget, fDuration);
|
||||||
MultisummonPreSummon();
|
|
||||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon,
|
|
||||||
PRCGetSpellTargetLocation(), fDuration);
|
|
||||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon,
|
|
||||||
PRCGetSpellTargetLocation(), fDuration);
|
|
||||||
DelayCommand(0.5, AugmentSummonedCreature(sSummon));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DelayCommand(1.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, PRCGetSpellTargetLocation()));
|
DelayCommand(1.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, lTarget));
|
||||||
oFiend = CreateObject(OBJECT_TYPE_CREATURE, "twinfiend_demon", PRCGetSpellTargetLocation());
|
//oFiend = CreateObject(OBJECT_TYPE_CREATURE, "twinfiend_demon", PRCGetSpellTargetLocation());
|
||||||
oFiend2 = CreateObject(OBJECT_TYPE_CREATURE, "twinfiend_demon", PRCGetSpellTargetLocation());
|
oFiend = JsonToObject(jDevil, lTarget);
|
||||||
|
DelayCommand(0.0, AugmentSummonedCreature(sSummon));
|
||||||
|
SetCurrentHitPoints(oFiend, GetMaxPossibleHP(oFiend));
|
||||||
|
|
||||||
|
//:: Set faction to caster<65>s
|
||||||
|
ChangeFaction(oFiend, oPC);
|
||||||
|
SetLocalObject(oFiend, "SUMMONER", oPC);
|
||||||
|
|
||||||
|
SetLocalNPC(oPC, oFiend, ASSOCIATE_TYPE_SUMMONED);
|
||||||
|
SetAssociateState(NW_ASC_HAVE_MASTER, TRUE, oFiend);
|
||||||
|
SetAssociateState(NW_ASC_DISTANCE_2_METERS);
|
||||||
|
SetAssociateState(NW_ASC_DISTANCE_4_METERS, FALSE);
|
||||||
|
SetAssociateState(NW_ASC_DISTANCE_6_METERS, FALSE);
|
||||||
|
|
||||||
|
//oFiend2 = CreateObject(OBJECT_TYPE_CREATURE, "twinfiend_demon", PRCGetSpellTargetLocation());
|
||||||
|
oFiend2 = JsonToObject(jDevil, lTarget);
|
||||||
|
DelayCommand(0.0, AugmentSummonedCreature(sSummon));
|
||||||
|
SetCurrentHitPoints(oFiend2, GetMaxPossibleHP(oFiend2));
|
||||||
|
|
||||||
|
//:: Set faction to caster<65>s
|
||||||
|
ChangeFaction(oFiend2, oPC);
|
||||||
|
SetLocalObject(oFiend2, "SUMMONER", oPC);
|
||||||
|
|
||||||
|
SetLocalNPC(oPC, oFiend2, ASSOCIATE_TYPE_SUMMONED);
|
||||||
|
SetAssociateState(NW_ASC_HAVE_MASTER, TRUE, oFiend2);
|
||||||
|
SetAssociateState(NW_ASC_DISTANCE_2_METERS);
|
||||||
|
SetAssociateState(NW_ASC_DISTANCE_4_METERS, FALSE);
|
||||||
|
SetAssociateState(NW_ASC_DISTANCE_6_METERS, FALSE);
|
||||||
|
|
||||||
SetMaxHenchmen(GetMaxHenchmen() + 2);
|
SetMaxHenchmen(GetMaxHenchmen() + 2);
|
||||||
AddHenchman(OBJECT_SELF, oFiend);
|
AddHenchman(oPC, oFiend);
|
||||||
AddHenchman(OBJECT_SELF, oFiend2);
|
AddHenchman(oPC, oFiend2);
|
||||||
SetMaxHenchmen(GetMaxHenchmen() - 2);
|
SetMaxHenchmen(GetMaxHenchmen() - 2);
|
||||||
|
|
||||||
|
//:: Update creature weapons for Size increase
|
||||||
|
if (nCasterLvl > 14)
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("ss_ep_twinfiend >> Updating Creature weapons for size increase.");
|
||||||
|
|
||||||
|
object oWeapCR = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oFiend);
|
||||||
|
MyDestroyObject(oWeapCR);
|
||||||
|
object oWeapCL = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oFiend);
|
||||||
|
MyDestroyObject(oWeapCL);
|
||||||
|
object oWeapCB = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oFiend);
|
||||||
|
MyDestroyObject(oWeapCB);
|
||||||
|
|
||||||
|
oWeapCR = CreateItemOnObject("nw_it_crewpsp010", oFiend);
|
||||||
|
ForceEquip(oFiend, oWeapCR, INVENTORY_SLOT_CWEAPON_R);
|
||||||
|
|
||||||
|
oWeapCL = CreateItemOnObject("bite_pitfiend002", oFiend);
|
||||||
|
ForceEquip(oFiend, oWeapCL, INVENTORY_SLOT_CWEAPON_L);
|
||||||
|
|
||||||
|
oWeapCB = CreateItemOnObject("prc_2d6_slamgrab", oFiend);
|
||||||
|
ForceEquip(oFiend, oWeapCB, INVENTORY_SLOT_CWEAPON_B);
|
||||||
|
|
||||||
|
oWeapCR = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oFiend2);
|
||||||
|
MyDestroyObject(oWeapCR);
|
||||||
|
oWeapCL = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L, oFiend2);
|
||||||
|
MyDestroyObject(oWeapCL);
|
||||||
|
oWeapCB = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B, oFiend2);
|
||||||
|
MyDestroyObject(oWeapCB);
|
||||||
|
|
||||||
|
oWeapCR = CreateItemOnObject("nw_it_crewpsp010", oFiend2);
|
||||||
|
ForceEquip(oFiend2, oWeapCR, INVENTORY_SLOT_CWEAPON_R);
|
||||||
|
|
||||||
|
oWeapCL = CreateItemOnObject("bite_pitfiend002", oFiend2);
|
||||||
|
ForceEquip(oFiend2, oWeapCL, INVENTORY_SLOT_CWEAPON_L);
|
||||||
|
|
||||||
|
oWeapCB = CreateItemOnObject("prc_2d6_slamgrab", oFiend2);
|
||||||
|
ForceEquip(oFiend2, oWeapCB, INVENTORY_SLOT_CWEAPON_B);
|
||||||
|
|
||||||
|
SetObjectVisualTransform(oFiend, OBJECT_VISUAL_TRANSFORM_SCALE, 1.1);
|
||||||
|
SetObjectVisualTransform(oFiend2, OBJECT_VISUAL_TRANSFORM_SCALE, 1.1);
|
||||||
|
|
||||||
|
}
|
||||||
|
else DoDebug("ss_ep_twinfiend >> No size change detected.");
|
||||||
|
|
||||||
AssignCommand(oFiend, DetermineCombatRound());
|
AssignCommand(oFiend, DetermineCombatRound());
|
||||||
AssignCommand(oFiend2, DetermineCombatRound());
|
AssignCommand(oFiend2, DetermineCombatRound());
|
||||||
|
|
||||||
DestroyObject(oFiend, fDuration);
|
DestroyObject(oFiend, fDuration);
|
||||||
DelayCommand(fDuration, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis2, GetLocation(oFiend)));
|
DelayCommand(fDuration, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis2, GetLocation(oFiend)));
|
||||||
DestroyObject(oFiend2, fDuration);
|
DestroyObject(oFiend2, fDuration);
|
||||||
DelayCommand(fDuration, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis2, GetLocation(oFiend2)));
|
DelayCommand(fDuration, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis2, GetLocation(oFiend2)));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
||||||
|
DeleteLocalInt(oPC, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,8 +7,11 @@
|
|||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
|
//:: Levels up an NPC according to variables set on NPC.
|
||||||
|
void LevelUpSummon(object oSummon, int iTargetLvl);
|
||||||
|
|
||||||
// Get the master of oAssociate.
|
// Get the master of oAssociate.
|
||||||
object GetMasterNPC(object oAssociate=OBJECT_SELF);
|
object GetMasterNPC(object oAssociate0 = OBJECT_SELF);
|
||||||
|
|
||||||
// Returns the associate type of the specified creature.
|
// Returns the associate type of the specified creature.
|
||||||
// - Returns ASSOCIATE_TYPE_NONE if the creature is not the associate of anyone.
|
// - Returns ASSOCIATE_TYPE_NONE if the creature is not the associate of anyone.
|
||||||
@@ -75,7 +78,6 @@ void DestroySummon(object oSummon)
|
|||||||
DestroyObject(oSummon);
|
DestroyObject(oSummon);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
object CreateLocalNPC(object oMaster,int nAssociateType,string sTemplate,location loc,int Nth=1,string sTag="")
|
object CreateLocalNPC(object oMaster,int nAssociateType,string sTemplate,location loc,int Nth=1,string sTag="")
|
||||||
{
|
{
|
||||||
object oSummon=CreateObject(OBJECT_TYPE_CREATURE,sTemplate,loc,FALSE,sTag);
|
object oSummon=CreateObject(OBJECT_TYPE_CREATURE,sTemplate,loc,FALSE,sTag);
|
||||||
@@ -111,7 +113,7 @@ object CreateLocalNextNPC(object oMaster,int nAssociateType,string sTemplate,loc
|
|||||||
SetLocalObject(oMaster, IntToString(nAssociateType)+"oHench"+IntToString(nCount), oSummon);
|
SetLocalObject(oMaster, IntToString(nAssociateType)+"oHench"+IntToString(nCount), oSummon);
|
||||||
SetLocalInt(oSummon, "iAssocNth", nCount);
|
SetLocalInt(oSummon, "iAssocNth", nCount);
|
||||||
|
|
||||||
SetAssociateState(NW_ASC_HAVE_MASTER,TRUE,oSummon);
|
SetAssociateState(NW_ASC_HAVE_MASTER, TRUE, oSummon);
|
||||||
SetAssociateState(NW_ASC_DISTANCE_2_METERS);
|
SetAssociateState(NW_ASC_DISTANCE_2_METERS);
|
||||||
SetAssociateState(NW_ASC_DISTANCE_4_METERS, FALSE);
|
SetAssociateState(NW_ASC_DISTANCE_4_METERS, FALSE);
|
||||||
SetAssociateState(NW_ASC_DISTANCE_6_METERS, FALSE);
|
SetAssociateState(NW_ASC_DISTANCE_6_METERS, FALSE);
|
||||||
@@ -122,6 +124,7 @@ object CreateLocalNextNPC(object oMaster,int nAssociateType,string sTemplate,loc
|
|||||||
return oSummon;
|
return oSummon;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object GetMasterNPC(object oAssociate=OBJECT_SELF)
|
object GetMasterNPC(object oAssociate=OBJECT_SELF)
|
||||||
{
|
{
|
||||||
object oMaster = GetLocalObject(oAssociate, "oMaster");
|
object oMaster = GetLocalObject(oAssociate, "oMaster");
|
||||||
@@ -220,4 +223,173 @@ int GetAssociateHealMasterNPC()
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Levels up a summoned creature based on its master's total casting level,
|
||||||
|
* while respecting configured HD limits and multiclass transition rules.
|
||||||
|
* Should only be called on the NPC onSpawn event.
|
||||||
|
*
|
||||||
|
* This function:
|
||||||
|
* - Retrieves the master<65>s total casting level and clamps it to the creature<72>s
|
||||||
|
* minimum and maximum HD (iMinHD, iMaxHD).
|
||||||
|
* - Repeatedly calls LevelUpHenchman() until the creature reaches that level,
|
||||||
|
* switching classes when the creature's stored "ClassXStart" thresholds are met.
|
||||||
|
*
|
||||||
|
* Local variables recognized on the summoned creature:
|
||||||
|
*
|
||||||
|
* | Variable Name | Purpose |
|
||||||
|
* |-----------------|-------------------------------------------------------------|
|
||||||
|
* | iMinHD | Minimum HD allowed |
|
||||||
|
* | iMaxHD | Maximum HD allowed |
|
||||||
|
* | Class2Start | Level to begin second class progression |
|
||||||
|
* | Class2 | Class type for second progression |
|
||||||
|
* | Class2Package | Package for second progression |
|
||||||
|
* | Class3Start | Level to begin third class progression |
|
||||||
|
* | Class3 | Class type for third progression |
|
||||||
|
* | Class3Package | Package for third progression |
|
||||||
|
* | Class4Start | Level to begin fourth class progression |
|
||||||
|
* | Class4 | Class type for fourth progression |
|
||||||
|
* | Class4Package | Package for fourth progression |
|
||||||
|
*
|
||||||
|
* Behavior notes:
|
||||||
|
* - Leveling continues until the creature reaches the master<65>s effective
|
||||||
|
* casting level (bounded by iMinHD/iMaxHD).
|
||||||
|
* - If LevelUpHenchman() returns 0, the creature shouts a failure message.
|
||||||
|
* - CLASS_TYPE_INVALID causes the creature to level in its current class.
|
||||||
|
*
|
||||||
|
* @param oCreature The summoned creature being leveled. Defaults to OBJECT_SELF.
|
||||||
|
*
|
||||||
|
* @see LevelUpHenchman
|
||||||
|
* @see GetLocalInt
|
||||||
|
* @see GetHitDice
|
||||||
|
*/
|
||||||
|
void LevelUpSummon(object oSummon, int iTargetLvl)
|
||||||
|
{
|
||||||
|
int nCurrentHD = GetHitDice(oSummon);
|
||||||
|
int iNewHD = nCurrentHD;
|
||||||
|
|
||||||
|
// Read multiclassing info from locals
|
||||||
|
int iClass2Start = GetLocalInt(oSummon, "Class2Start");
|
||||||
|
int iClass2 = GetLocalInt(oSummon, "Class2");
|
||||||
|
int iClass2Package = GetLocalInt(oSummon, "Class2Package");
|
||||||
|
|
||||||
|
int iClass3Start = GetLocalInt(oSummon, "Class3Start");
|
||||||
|
int iClass3 = GetLocalInt(oSummon, "Class3");
|
||||||
|
int iClass3Package = GetLocalInt(oSummon, "Class3Package");
|
||||||
|
|
||||||
|
int iClass4Start = GetLocalInt(oSummon, "Class4Start");
|
||||||
|
int iClass4 = GetLocalInt(oSummon, "Class4");
|
||||||
|
int iClass4Package = GetLocalInt(oSummon, "Class4Package");
|
||||||
|
|
||||||
|
int iClass; // current class to level
|
||||||
|
int iPackage; // package to use
|
||||||
|
|
||||||
|
// Main leveling loop
|
||||||
|
while (nCurrentHD < iTargetLvl && nCurrentHD > 0)
|
||||||
|
{
|
||||||
|
// Determine which class and package to use
|
||||||
|
if (iClass4Start != 0 && nCurrentHD >= iClass4Start)
|
||||||
|
{
|
||||||
|
iClass = iClass4;
|
||||||
|
iPackage = iClass4Package;
|
||||||
|
}
|
||||||
|
else if (iClass3Start != 0 && nCurrentHD >= iClass3Start)
|
||||||
|
{
|
||||||
|
iClass = iClass3;
|
||||||
|
iPackage = iClass3Package;
|
||||||
|
}
|
||||||
|
else if (iClass2Start != 0 && nCurrentHD >= iClass2Start)
|
||||||
|
{
|
||||||
|
iClass = iClass2;
|
||||||
|
iPackage = iClass2Package;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Base class (first class in the sheet)
|
||||||
|
iClass = CLASS_TYPE_INVALID; // keeps current
|
||||||
|
iPackage = PACKAGE_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Level up one HD
|
||||||
|
iNewHD = LevelUpHenchman(oSummon, iClass, TRUE, iPackage);
|
||||||
|
|
||||||
|
if (iNewHD == 0)
|
||||||
|
{
|
||||||
|
SpeakString(GetName(oSummon) + " failed to level properly!", TALKVOLUME_SHOUT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
nCurrentHD = iNewHD;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force the creature to rest to memorize spells
|
||||||
|
// PRCForceRest(oSummon);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* void LevelUpSummon(object oSummon, int iTargetLvl)
|
||||||
|
{
|
||||||
|
//get the default hit dice of the summon
|
||||||
|
int nDefaultHD = GetHitDice(oSummon);
|
||||||
|
|
||||||
|
if (DEBUG) DoDebug("inc_npc >> LevelUpSummon: nDefaultHD = " +IntToString(nDefaultHD)+".");
|
||||||
|
|
||||||
|
if (DEBUG) DoDebug("inc_npc >> LevelUpSummon: iTargetLvl = " +IntToString(iTargetLvl)+".");
|
||||||
|
|
||||||
|
//get the multiclassing variables to see if we need to change classes from its base class
|
||||||
|
int iClass2Start = GetLocalInt(oSummon, "Class2Start");
|
||||||
|
int iClass2 = GetLocalInt(oSummon, "Class2");
|
||||||
|
int iClass2Package = GetLocalInt(oSummon, "Class2Package");
|
||||||
|
|
||||||
|
int iClass3Start = GetLocalInt(oSummon, "Class3Start");
|
||||||
|
int iClass3 = GetLocalInt(oSummon, "Class3");
|
||||||
|
int iClass3Package = GetLocalInt(oSummon, "Class3Package");
|
||||||
|
|
||||||
|
int iClass4Start = GetLocalInt(oSummon, "Class4Start");
|
||||||
|
int iClass4 = GetLocalInt(oSummon, "Class4");
|
||||||
|
int iClass4Package = GetLocalInt(oSummon, "Class4Package");
|
||||||
|
|
||||||
|
//check for zero cause thats an error
|
||||||
|
//if creatures are not leveling then best bet is they are not legal creatures
|
||||||
|
while( (nDefaultHD < iTargetLvl) && (nDefaultHD > 0) )
|
||||||
|
{
|
||||||
|
//check the multiclassing numbers to change classes
|
||||||
|
if( (iClass4Start != 0) && (nDefaultHD >= iClass4Start) )
|
||||||
|
{
|
||||||
|
//level up using the new class and Packageage
|
||||||
|
nDefaultHD = LevelUpHenchman(oSummon, iClass4 ,TRUE, iClass4Package);
|
||||||
|
|
||||||
|
if(nDefaultHD == 0)
|
||||||
|
SpeakString(GetName(oSummon) + " Failed on fourth class", TALKVOLUME_SHOUT);
|
||||||
|
}
|
||||||
|
else if( (iClass3Start != 0) && (nDefaultHD >= iClass3Start) )
|
||||||
|
{
|
||||||
|
//level up using the new class and Packageage
|
||||||
|
nDefaultHD = LevelUpHenchman(oSummon, iClass3 ,TRUE, iClass3Package);
|
||||||
|
|
||||||
|
if(nDefaultHD == 0)
|
||||||
|
SpeakString(GetName(oSummon) + " Failed on third class", TALKVOLUME_SHOUT);
|
||||||
|
}
|
||||||
|
else if( (iClass2Start != 0) && (nDefaultHD >= iClass2Start) )
|
||||||
|
{
|
||||||
|
//level up using the new class and Packageage
|
||||||
|
nDefaultHD = LevelUpHenchman(oSummon, iClass2 ,TRUE, iClass2Package);
|
||||||
|
|
||||||
|
if(nDefaultHD == 0)
|
||||||
|
SpeakString(GetName(oSummon) + " Failed on second class", TALKVOLUME_SHOUT);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//just level up using the class it already has
|
||||||
|
nDefaultHD = LevelUpHenchman(oSummon, CLASS_TYPE_INVALID ,TRUE);
|
||||||
|
|
||||||
|
if(nDefaultHD == 0)
|
||||||
|
SpeakString(GetName(oSummon) + " Failed to level properly", TALKVOLUME_SHOUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
//:: void main() {}
|
||||||
@@ -999,26 +999,6 @@ void CreateSwitchNameArray()
|
|||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PSI_ASTRAL_CONSTRUCT_DUR_MOD);
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PSI_ASTRAL_CONSTRUCT_DUR_MOD);
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PNP_RAPID_METABOLISM);
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PNP_RAPID_METABOLISM);
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PSI_IMP_METAPSIONICS_USE_SUM);
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PSI_IMP_METAPSIONICS_USE_SUM);
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_USECR);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_HUGE);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_LARGE);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_MEDIUM);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_SMALL);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_TINY);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_OUTSIDER);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_ELEMENTAL);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_CONSTRUCT);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_UNDEAD);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_DRAGON);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_ABERRATION);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_OOZE);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_MAGICALBEAST);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_GIANT);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_VERMIN);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_BEAST);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_ANIMAL);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_MONSTROUSHUMANOID);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_HUMANOID);
|
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PNP_ELEMENTAL_DAMAGE);
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_PNP_ELEMENTAL_DAMAGE);
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_SPELL_SNEAK_DISABLE);
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_SPELL_SNEAK_DISABLE);
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_3_5e_FIST_DAMAGE);
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_3_5e_FIST_DAMAGE);
|
||||||
@@ -1079,10 +1059,33 @@ void CreateSwitchNameArray()
|
|||||||
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);
|
||||||
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CREATE_INFUSION_CASTER_LEVEL);
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CREATE_INFUSION_CASTER_LEVEL);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_CREATE_INFUSION_OPTIONAL_HERBS);
|
||||||
|
|
||||||
//spells
|
//spells
|
||||||
|
|
||||||
//shifter
|
//shifter
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPECHANGE);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PRC_WILDSHAPE_ALLOWS_ARMS_SLOT);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_USECR);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_HUGE);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_LARGE);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_MEDIUM);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_SMALL);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_S_TINY);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_OUTSIDER);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_ELEMENTAL);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_CONSTRUCT);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_UNDEAD);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_DRAGON);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_ABERRATION);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_OOZE);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_MAGICALBEAST);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_GIANT);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_VERMIN);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_BEAST);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_ANIMAL);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_MONSTROUSHUMANOID);
|
||||||
|
array_set_string(oWP, "Switch_Name", array_get_size(oWP, "Switch_Name"), PNP_SHFT_F_HUMANOID);
|
||||||
|
|
||||||
//general
|
//general
|
||||||
|
|
||||||
|
|||||||
@@ -11,16 +11,13 @@ void ShifterCheck(object oPC);
|
|||||||
#include "prc_inc_shifting"
|
#include "prc_inc_shifting"
|
||||||
|
|
||||||
const string PRC_PNP_SHIFTING = "PRC_Shift";
|
const string PRC_PNP_SHIFTING = "PRC_Shift";
|
||||||
|
|
||||||
////////////////Begin Werewolf//////////////////
|
|
||||||
|
|
||||||
void LycanthropePoly(object oPC, int nPoly)
|
void LycanthropePoly(object oPC, int nPoly)
|
||||||
{
|
{
|
||||||
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
||||||
effect ePoly;
|
effect ePoly = SupernaturalEffect(EffectPolymorph(nPoly));
|
||||||
|
|
||||||
ePoly = EffectPolymorph(nPoly);
|
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||||
ePoly = SupernaturalEffect(ePoly);
|
int bArmsSlotAllowed = GetPRCSwitch(PRC_WILDSHAPE_ALLOWS_ARMS_SLOT); // <--- new
|
||||||
|
|
||||||
int bWeapon = StringToInt(Get2DACache("polymorph","MergeW",nPoly)) == 1;
|
int bWeapon = StringToInt(Get2DACache("polymorph","MergeW",nPoly)) == 1;
|
||||||
int bArmor = StringToInt(Get2DACache("polymorph","MergeA",nPoly)) == 1;
|
int bArmor = StringToInt(Get2DACache("polymorph","MergeA",nPoly)) == 1;
|
||||||
@@ -36,6 +33,128 @@ void LycanthropePoly(object oPC, int nPoly)
|
|||||||
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
|
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
|
||||||
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
|
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
|
||||||
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
||||||
|
object oGlovesOld = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);
|
||||||
|
|
||||||
|
if (GetIsObjectValid(oShield))
|
||||||
|
{
|
||||||
|
int nShieldType = GetBaseItemType(oShield);
|
||||||
|
if (nShieldType != BASE_ITEM_LARGESHIELD &&
|
||||||
|
nShieldType != BASE_ITEM_SMALLSHIELD &&
|
||||||
|
nShieldType != BASE_ITEM_TOWERSHIELD)
|
||||||
|
{
|
||||||
|
oShield = OBJECT_INVALID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ShifterCheck(oPC);
|
||||||
|
ClearAllActions();
|
||||||
|
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, oPC);
|
||||||
|
|
||||||
|
object oWeaponNewRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
|
||||||
|
object oWeaponNewLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
||||||
|
object oWeaponNewBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
|
||||||
|
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
Weapon merge block
|
||||||
|
If arms-slot-merge is enabled we DO NOT apply gloves here.
|
||||||
|
---------------- */
|
||||||
|
if (bWeapon)
|
||||||
|
{
|
||||||
|
if (!bMonkGloves)
|
||||||
|
{
|
||||||
|
if (GetIsObjectValid(oWeaponOld))
|
||||||
|
{
|
||||||
|
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oWeaponOld, oWeaponNewLeft, TRUE);
|
||||||
|
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oWeaponOld, oWeaponNewRight, TRUE);
|
||||||
|
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oWeaponOld, oWeaponNewBite, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!bArmsSlotAllowed) // only apply gloves-to-weapons here if arms-slot is NOT allowed
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("LycanthropePoly: Monk gloves overriding weapon merge (arms slot NOT allowed).");
|
||||||
|
if (GetIsObjectValid(oGlovesOld))
|
||||||
|
{
|
||||||
|
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewLeft, TRUE);
|
||||||
|
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewRight, TRUE);
|
||||||
|
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewBite, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
Armor merge block
|
||||||
|
When arms-slot-allowed is TRUE, merge gloves here into the creature's weapons
|
||||||
|
(so forms that don't normally merge weapons/items still get glove damage).
|
||||||
|
---------------- */
|
||||||
|
if (bArmor)
|
||||||
|
{
|
||||||
|
if (GetIsObjectValid(oArmorNew))
|
||||||
|
{
|
||||||
|
if (GetIsObjectValid(oShield)) IPWildShapeCopyItemProperties(oShield, oArmorNew);
|
||||||
|
if (GetIsObjectValid(oHelmetOld)) IPWildShapeCopyItemProperties(oHelmetOld, oArmorNew);
|
||||||
|
if (GetIsObjectValid(oArmorOld)) IPWildShapeCopyItemProperties(oArmorOld, oArmorNew);
|
||||||
|
|
||||||
|
/* If module allows arms-slot merging, and player is wearing monk gloves,
|
||||||
|
copy the gloves' IPs to any creature weapon slot from the armor branch.
|
||||||
|
This runs regardless of bWeapon (i.e. even if MergeW == 0). */
|
||||||
|
if (bArmsSlotAllowed && bMonkGloves && GetIsObjectValid(oGlovesOld))
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("LycanthropePoly: Arms-slot allowed -> applying gloves to creature weapons from armor branch.");
|
||||||
|
|
||||||
|
if (GetIsObjectValid(oWeaponNewLeft)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewLeft, TRUE);
|
||||||
|
if (GetIsObjectValid(oWeaponNewRight)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewRight, TRUE);
|
||||||
|
if (GetIsObjectValid(oWeaponNewBite)) IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewBite, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("LycanthropePoly: MergeA set, but oArmorNew invalid.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bItems && GetIsObjectValid(oArmorNew))
|
||||||
|
{
|
||||||
|
if (GetIsObjectValid(oRing1Old)) IPWildShapeCopyItemProperties(oRing1Old, oArmorNew);
|
||||||
|
if (GetIsObjectValid(oRing2Old)) IPWildShapeCopyItemProperties(oRing2Old, oArmorNew);
|
||||||
|
if (GetIsObjectValid(oAmuletOld)) IPWildShapeCopyItemProperties(oAmuletOld, oArmorNew);
|
||||||
|
if (GetIsObjectValid(oCloakOld)) IPWildShapeCopyItemProperties(oCloakOld, oArmorNew);
|
||||||
|
if (GetIsObjectValid(oBootsOld)) IPWildShapeCopyItemProperties(oBootsOld, oArmorNew);
|
||||||
|
if (GetIsObjectValid(oBeltOld)) IPWildShapeCopyItemProperties(oBeltOld, oArmorNew);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ////////////////Begin Werewolf//////////////////
|
||||||
|
|
||||||
|
void LycanthropePoly(object oPC, int nPoly)
|
||||||
|
{
|
||||||
|
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
||||||
|
effect ePoly;
|
||||||
|
|
||||||
|
ePoly = EffectPolymorph(nPoly);
|
||||||
|
ePoly = SupernaturalEffect(ePoly);
|
||||||
|
|
||||||
|
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||||
|
//int bMonkSwitch = GetPRCSwitch(PRC_WILDSHAPE_USES_ARM_SLOTS);
|
||||||
|
|
||||||
|
int bWeapon = StringToInt(Get2DACache("polymorph","MergeW",nPoly)) == 1;
|
||||||
|
int bArmor = StringToInt(Get2DACache("polymorph","MergeA",nPoly)) == 1;
|
||||||
|
int bItems = StringToInt(Get2DACache("polymorph","MergeI",nPoly)) == 1;
|
||||||
|
|
||||||
|
object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||||||
|
object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
|
||||||
|
object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,oPC);
|
||||||
|
object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oPC);
|
||||||
|
object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,oPC);
|
||||||
|
object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
|
||||||
|
object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,oPC);
|
||||||
|
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
|
||||||
|
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
|
||||||
|
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
||||||
|
object oGlovesOld = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);
|
||||||
if (GetIsObjectValid(oShield))
|
if (GetIsObjectValid(oShield))
|
||||||
{
|
{
|
||||||
if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD &&
|
if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD &&
|
||||||
@@ -61,11 +180,21 @@ void LycanthropePoly(object oPC, int nPoly)
|
|||||||
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
||||||
|
|
||||||
if (bWeapon)
|
if (bWeapon)
|
||||||
|
{
|
||||||
|
if(!bMonkGloves)
|
||||||
{
|
{
|
||||||
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewLeft, TRUE);
|
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewLeft, TRUE);
|
||||||
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewRight, TRUE);
|
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewRight, TRUE);
|
||||||
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewBite, TRUE);
|
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewBite, TRUE);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("pnp_shift_poly >> LycanthropePoly(): Found monk gloves in bWeapon branch.");
|
||||||
|
IPWildShapeCopyItemProperties(oGlovesOld,oWeaponNewLeft, TRUE);
|
||||||
|
IPWildShapeCopyItemProperties(oGlovesOld,oWeaponNewRight, TRUE);
|
||||||
|
IPWildShapeCopyItemProperties(oGlovesOld,oWeaponNewBite, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (bArmor)
|
if (bArmor)
|
||||||
{
|
{
|
||||||
IPWildShapeCopyItemProperties(oShield,oArmorNew);
|
IPWildShapeCopyItemProperties(oShield,oArmorNew);
|
||||||
@@ -84,7 +213,119 @@ void LycanthropePoly(object oPC, int nPoly)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////End Werewolf//////////////////
|
////////////////End Werewolf////////////////// */
|
||||||
|
|
||||||
|
|
||||||
|
/* ////////////////Begin Werewolf//////////////////
|
||||||
|
|
||||||
|
void LycanthropePoly(object oPC, int nPoly)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(DEBUG) DoDebug("pnp_shift_poly >> LycanthropePoly(): Entering fucntion.");
|
||||||
|
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
||||||
|
effect ePoly;
|
||||||
|
|
||||||
|
ePoly = EffectPolymorph(nPoly);
|
||||||
|
ePoly = SupernaturalEffect(ePoly);
|
||||||
|
|
||||||
|
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||||
|
int bMonkSwitch = GetPRCSwitch(PRC_WILDSHAPE_USES_ARM_SLOTS);
|
||||||
|
|
||||||
|
int bWeapon = StringToInt(Get2DACache("polymorph","MergeW",nPoly)) == 1;
|
||||||
|
int bArmor = StringToInt(Get2DACache("polymorph","MergeA",nPoly)) == 1;
|
||||||
|
int bItems = StringToInt(Get2DACache("polymorph","MergeI",nPoly)) == 1;
|
||||||
|
|
||||||
|
|
||||||
|
object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||||||
|
object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
|
||||||
|
object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,oPC);
|
||||||
|
object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oPC);
|
||||||
|
object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,oPC);
|
||||||
|
object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
|
||||||
|
object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,oPC);
|
||||||
|
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
|
||||||
|
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
|
||||||
|
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
||||||
|
object oGlovesOld = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);
|
||||||
|
if (GetIsObjectValid(oShield))
|
||||||
|
{
|
||||||
|
if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD &&
|
||||||
|
GetBaseItemType(oShield) !=BASE_ITEM_SMALLSHIELD &&
|
||||||
|
GetBaseItemType(oShield) !=BASE_ITEM_TOWERSHIELD)
|
||||||
|
{
|
||||||
|
oShield = OBJECT_INVALID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//check if a shifter and if shifted then unshift
|
||||||
|
ShifterCheck(oPC);
|
||||||
|
|
||||||
|
ClearAllActions(); // prevents an exploit
|
||||||
|
|
||||||
|
//Apply the VFX impact and effects
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, oPC);
|
||||||
|
|
||||||
|
object oWeaponNewRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
|
||||||
|
object oWeaponNewLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
||||||
|
object oWeaponNewBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
|
||||||
|
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
||||||
|
|
||||||
|
if (bWeapon)
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("pnp_shift_poly >> LycanthropePoly(): Entering bWeapon branch.");
|
||||||
|
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewLeft, TRUE);
|
||||||
|
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewRight, TRUE);
|
||||||
|
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewBite, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bArmor)
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("pnp_shift_poly >> LycanthropePoly(): Entering bArmor branch.");
|
||||||
|
IPWildShapeCopyItemProperties(oShield,oArmorNew);
|
||||||
|
IPWildShapeCopyItemProperties(oHelmetOld,oArmorNew);
|
||||||
|
IPWildShapeCopyItemProperties(oArmorOld,oArmorNew);
|
||||||
|
|
||||||
|
if(bMonkGloves)
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("pnp_shift_poly >> LycanthropePoly(): Entering bMonkSwitch -> bMonkGloves branch.");
|
||||||
|
IPWildShapeCopyItemProperties(oGlovesOld,oWeaponNewLeft, TRUE);
|
||||||
|
IPWildShapeCopyItemProperties(oGlovesOld,oWeaponNewRight, TRUE);
|
||||||
|
IPWildShapeCopyItemProperties(oGlovesOld,oWeaponNewBite, TRUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("pnp_shift_poly >> LycanthropePoly(): Entering bMonkSwitch -> !bMonkGloves branch.");
|
||||||
|
IPWildShapeCopyItemProperties(oGlovesOld,oArmorNew);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (bItems)
|
||||||
|
{
|
||||||
|
IPWildShapeCopyItemProperties(oRing1Old,oArmorNew);
|
||||||
|
IPWildShapeCopyItemProperties(oRing2Old,oArmorNew);
|
||||||
|
IPWildShapeCopyItemProperties(oAmuletOld,oArmorNew);
|
||||||
|
IPWildShapeCopyItemProperties(oCloakOld,oArmorNew);
|
||||||
|
IPWildShapeCopyItemProperties(oBootsOld,oArmorNew);
|
||||||
|
IPWildShapeCopyItemProperties(oBeltOld,oArmorNew);
|
||||||
|
|
||||||
|
if(!bMonkGloves)
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("pnp_shift_poly >> LycanthropePoly(): Entering !bMonkSwitch -> !bMonkGloves branch.");
|
||||||
|
IPWildShapeCopyItemProperties(oGlovesOld, oArmorNew);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("pnp_shift_poly >> LycanthropePoly(): Entering !bMonkSwitch -> bMonkGloves branch.");
|
||||||
|
IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewLeft, TRUE);
|
||||||
|
IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewRight, TRUE);
|
||||||
|
IPWildShapeCopyItemProperties(oGlovesOld, oWeaponNewBite, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////End Werewolf////////////////// */
|
||||||
|
|
||||||
void ShifterCheck(object oPC)
|
void ShifterCheck(object oPC)
|
||||||
{
|
{
|
||||||
@@ -247,3 +488,5 @@ void DoTail(object oPC, int nTailType)
|
|||||||
//override any stored default appearance
|
//override any stored default appearance
|
||||||
SetPersistantLocalInt(oPC, "AppearanceStoredTail", nTailType);
|
SetPersistantLocalInt(oPC, "AppearanceStoredTail", nTailType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//::void main (){}
|
||||||
@@ -269,6 +269,8 @@ object GetObjectToApplyNewEffect(string sTag, object oPC, int nStripEffects = TR
|
|||||||
SetCreatureAppearanceType(oWP, APPEARANCE_TYPE_INVISIBLE_HUMAN_MALE);
|
SetCreatureAppearanceType(oWP, APPEARANCE_TYPE_INVISIBLE_HUMAN_MALE);
|
||||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oWP);
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oWP);
|
||||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneGhost(), oWP);
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneGhost(), oWP);
|
||||||
|
AssignCommand(oWP, ActionUseSkill(SKILL_HIDE, oWP));
|
||||||
|
|
||||||
}
|
}
|
||||||
//remove previous effects
|
//remove previous effects
|
||||||
if(nStripEffects)
|
if(nStripEffects)
|
||||||
|
|||||||
@@ -18,7 +18,15 @@
|
|||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
#include "nw_inc_gff"
|
#include "nw_inc_gff"
|
||||||
#include "inc_debug"
|
#include "inc_debug"
|
||||||
|
#include "prc_inc_racial"
|
||||||
|
#include "prc_inc_nwscript"
|
||||||
|
#include "prc_inc_spells"
|
||||||
|
#include "prc_inc_util"
|
||||||
|
#include "prc_inc_fork"
|
||||||
|
#include "prc_inc_natweap"
|
||||||
|
|
||||||
|
//:: Get a random General feat.
|
||||||
|
void ApplyParagonBonusFeat(object oCreature, int iFeat);
|
||||||
|
|
||||||
//::---------------------------------------------|
|
//::---------------------------------------------|
|
||||||
//:: Helper functions |
|
//:: Helper functions |
|
||||||
@@ -30,6 +38,8 @@ int GetMaxPossibleHP(object oCreature)
|
|||||||
int nMaxHP = 0; // Stores the total maximum hitpoints
|
int nMaxHP = 0; // Stores the total maximum hitpoints
|
||||||
int i = 1; // Initialize position for class index
|
int i = 1; // Initialize position for class index
|
||||||
int nConb = GetAbilityModifier(ABILITY_CONSTITUTION, oCreature);
|
int nConb = GetAbilityModifier(ABILITY_CONSTITUTION, oCreature);
|
||||||
|
int nRacial = MyPRCGetRacialType(oCreature);
|
||||||
|
int nSize = PRCGetCreatureSize(oCreature);
|
||||||
|
|
||||||
// Loop through each class position the creature may have, checking each class in turn
|
// Loop through each class position the creature may have, checking each class in turn
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
@@ -54,8 +64,25 @@ int GetMaxPossibleHP(object oCreature)
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(nRacial == RACIAL_TYPE_CONSTRUCT || nRacial == RACIAL_TYPE_UNDEAD)
|
||||||
|
{
|
||||||
|
nConb = 0;
|
||||||
|
}
|
||||||
|
|
||||||
nMaxHP += nConb * GetHitDice(oCreature);
|
nMaxHP += nConb * GetHitDice(oCreature);
|
||||||
|
|
||||||
|
if(nRacial == RACIAL_TYPE_CONSTRUCT)
|
||||||
|
{
|
||||||
|
if(nSize == CREATURE_SIZE_FINE) nMaxHP += 0;
|
||||||
|
if(nSize == CREATURE_SIZE_DIMINUTIVE) nMaxHP += 0;
|
||||||
|
if(nSize == CREATURE_SIZE_TINY) nMaxHP += 0;
|
||||||
|
if(nSize == CREATURE_SIZE_SMALL) nMaxHP += 10;
|
||||||
|
if(nSize == CREATURE_SIZE_MEDIUM) nMaxHP += 20;
|
||||||
|
if(nSize == CREATURE_SIZE_LARGE) nMaxHP += 30;
|
||||||
|
if(nSize == CREATURE_SIZE_HUGE) nMaxHP += 40;
|
||||||
|
if(nSize == CREATURE_SIZE_GARGANTUAN) nMaxHP += 60;
|
||||||
|
}
|
||||||
|
|
||||||
return nMaxHP;
|
return nMaxHP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,6 +137,440 @@ int GetAbilityModFromValue(int nAbilityValue)
|
|||||||
return nMod;
|
return nMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//:: Get a random General feat.
|
||||||
|
void PickParagonBonusFeat(object oCreature)
|
||||||
|
{
|
||||||
|
//:: Paragon creatures get a +15 to all ability scores,
|
||||||
|
//:: so can always meet feat pre-reqs.
|
||||||
|
|
||||||
|
//:: Detect spellcasting classes (FOR FUTURE USE)
|
||||||
|
int i;
|
||||||
|
for (i = 1; i <= 8; i++)
|
||||||
|
{
|
||||||
|
if (GetIsArcaneClass(GetClassByPosition(i, oCreature)))
|
||||||
|
{
|
||||||
|
SetLocalInt(oCreature, "ParagonArcaneCaster", 0);
|
||||||
|
}
|
||||||
|
if (GetIsDivineClass(GetClassByPosition(i, oCreature)))
|
||||||
|
{
|
||||||
|
SetLocalInt(oCreature, "ParagonDivineCaster", 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (Random(18))
|
||||||
|
{
|
||||||
|
//:: Dodge -> Mobility -> Spring Attack
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
int iDodge = GetHasFeat(FEAT_DODGE, oCreature);
|
||||||
|
int iMobility = GetHasFeat(FEAT_MOBILITY, oCreature);
|
||||||
|
int iSpringAttack = GetHasFeat(FEAT_SPRING_ATTACK, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iDodge == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_DODGE);
|
||||||
|
}
|
||||||
|
else if (iMobility == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_MOBILITY);
|
||||||
|
}
|
||||||
|
else if (iSpringAttack == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_SPRING_ATTACK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Power Attack -> Cleave -> Imp Power Attack -> Great Cleave
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
int iPower = GetHasFeat(FEAT_POWER_ATTACK, oCreature);
|
||||||
|
int iCleave = GetHasFeat(FEAT_CLEAVE, oCreature);
|
||||||
|
int iImpPower = GetHasFeat(FEAT_IMPROVED_POWER_ATTACK, oCreature);
|
||||||
|
int iGrCleave = GetHasFeat(FEAT_GREAT_CLEAVE, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iPower == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_POWER_ATTACK);
|
||||||
|
}
|
||||||
|
else if (iCleave == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_CLEAVE);
|
||||||
|
}
|
||||||
|
else if (iImpPower == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_POWER_ATTACK);
|
||||||
|
}
|
||||||
|
else if (iGrCleave == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_GREAT_CLEAVE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Expertise -> Imp Expertise -> Whirlwind Attack -> Imp Whirlwind Attack
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
int iEx = GetHasFeat(FEAT_EXPERTISE, oCreature);
|
||||||
|
int iImpEx = GetHasFeat(FEAT_IMPROVED_EXPERTISE, oCreature);
|
||||||
|
int iWhirl = GetHasFeat(FEAT_WHIRLWIND_ATTACK, oCreature);
|
||||||
|
int iImpWhirl = GetHasFeat(FEAT_IMPROVED_WHIRLWIND, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iEx == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_EXPERTISE);
|
||||||
|
}
|
||||||
|
else if (iImpEx == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_EXPERTISE);
|
||||||
|
}
|
||||||
|
else if (iWhirl == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_WHIRLWIND_ATTACK);
|
||||||
|
}
|
||||||
|
else if (iImpWhirl == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_WHIRLWIND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Disarm -> Expertise -> Improved Disarm -> Imp Expertise
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
int iDisarm = GetHasFeat(FEAT_DISARM, oCreature);
|
||||||
|
int iEx = GetHasFeat(FEAT_EXPERTISE, oCreature);
|
||||||
|
int iImpDisarm = GetHasFeat(FEAT_IMPROVED_DISARM, oCreature);
|
||||||
|
int iImpEx = GetHasFeat(FEAT_IMPROVED_EXPERTISE, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iDisarm == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_DISARM);
|
||||||
|
}
|
||||||
|
else if (iEx == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_EXPERTISE);
|
||||||
|
}
|
||||||
|
else if (iImpDisarm == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_DISARM);
|
||||||
|
}
|
||||||
|
else if (iImpEx == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_EXPERTISE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Toughness
|
||||||
|
case 4:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_TOUGHNESS);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Great Fortitude
|
||||||
|
case 5:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_GREAT_FORTITUDE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Lightining Reflexes
|
||||||
|
case 6:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_LIGHTNING_REFLEXES);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Iron Will -> Unnatural Will
|
||||||
|
case 7:
|
||||||
|
{
|
||||||
|
int iIronWill = GetHasFeat(FEAT_IRON_WILL, oCreature);
|
||||||
|
int iUnnaturalWill = GetHasFeat(FEAT_UNNATURAL_WILL, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iIronWill == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IRON_WILL);
|
||||||
|
}
|
||||||
|
else if (iUnnaturalWill == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_UNNATURAL_WILL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Blind-Fight
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_BLIND_FIGHT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Improved Initiative
|
||||||
|
case 9:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_IMPROVED_INITIATIVE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Alertness
|
||||||
|
case 10:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_ALERTNESS);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Blooded
|
||||||
|
case 11:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_BLOODED);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Side-step Charge
|
||||||
|
case 12:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_SIDESTEP_CHARGE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Thug
|
||||||
|
case 13:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_THUG);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Dive for Cover
|
||||||
|
case 14:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_DIVE_FOR_COVER);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Endurance -> Strong Stomach
|
||||||
|
case 15:
|
||||||
|
{
|
||||||
|
int iEndurance = GetHasFeat(FEAT_ENDURANCE, oCreature);
|
||||||
|
int iStrStomach = GetHasFeat(FEAT_STRONG_STOMACH, oCreature);
|
||||||
|
|
||||||
|
//:: Grant only the first missing feat in the chain
|
||||||
|
if (iEndurance == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_ENDURANCE);
|
||||||
|
}
|
||||||
|
else if (iStrStomach == 0)
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_STRONG_STOMACH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Resist Disease
|
||||||
|
case 16:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_RESIST_DISEASE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//:: Resist Poison
|
||||||
|
case 17:
|
||||||
|
{
|
||||||
|
ApplyParagonBonusFeat(oCreature, FEAT_RESIST_POISON);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Check & apply the feat using EffectBonusFeat if it
|
||||||
|
//:: doesn't exist on the creature already
|
||||||
|
void ApplyParagonBonusFeat(object oCreature, int iFeat)
|
||||||
|
{
|
||||||
|
// If the creature does not already have the feat, apply it
|
||||||
|
if (!GetHasFeat(iFeat, oCreature))
|
||||||
|
{
|
||||||
|
effect eFeat = EffectBonusFeat(iFeat);
|
||||||
|
effect eLink = UnyieldingEffect(eFeat);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oCreature);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DelayCommand(0.0f, PickParagonBonusFeat(oCreature));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Apply Paragon effects to a non-PC creature
|
||||||
|
void ApplyParagonEffects(object oCreature, int nBaseHD, int nBaseCR)
|
||||||
|
{
|
||||||
|
//:: Declare major variables
|
||||||
|
int nNewCR;
|
||||||
|
|
||||||
|
effect eParagon;
|
||||||
|
|
||||||
|
//:: Set maximum hit points for each HD
|
||||||
|
int nParagonHP = (GetMaxPossibleHP(oCreature) + (nBaseHD * GetAbilityModifier(ABILITY_CONSTITUTION, oCreature)));
|
||||||
|
SetCurrentHitPoints(oCreature, nParagonHP);
|
||||||
|
|
||||||
|
//:: Tripling the speed for all movement types
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectMovementSpeedIncrease(300));
|
||||||
|
|
||||||
|
//:: +25 luck bonus on all attack rolls
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectAttackIncrease(25));
|
||||||
|
|
||||||
|
//:: +20 luck bonus on damage rolls for melee and thrown ranged attacks
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectDamageIncrease(20));
|
||||||
|
|
||||||
|
//:: AC Bonuses: +12 insight, +12 luck
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectACIncrease(12, AC_DODGE_BONUS));
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectACIncrease(12, AC_DEFLECTION_BONUS));
|
||||||
|
|
||||||
|
//:: Boost caster & SLA level by 15
|
||||||
|
SetLocalInt(oCreature, PRC_CASTERLEVEL_ADJUSTMENT, 15);
|
||||||
|
|
||||||
|
//:: Fire and cold resistance 10, or keep the higher existing resistance if applicable
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectDamageResistance(DAMAGE_TYPE_FIRE, 10));
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectDamageResistance(DAMAGE_TYPE_COLD, 10));
|
||||||
|
|
||||||
|
//:: Damage Reduction 20/epic or retain existing DR if higher
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectDamageReduction(20, DAMAGE_POWER_ENERGY));
|
||||||
|
|
||||||
|
//:: Spell Resistance equal to CR +10, or retain existing SR if higher
|
||||||
|
int iExSR = GetSpellResistance(oCreature);
|
||||||
|
int nSpellResistance;
|
||||||
|
|
||||||
|
if (iExSR < nBaseCR + 10)
|
||||||
|
{
|
||||||
|
nSpellResistance = nBaseCR + 10;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nSpellResistance = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectSpellResistanceIncrease(nSpellResistance));
|
||||||
|
|
||||||
|
//:: Fast Healing 20
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectRegenerate(20, 6.0f));
|
||||||
|
|
||||||
|
//:: Saving Throws: +10 insight bonus on all saving throws
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectSavingThrowIncrease(SAVING_THROW_ALL, 10));
|
||||||
|
|
||||||
|
//:: Skills: +10 competence bonus to all skill checks
|
||||||
|
int nSkillID = 0;
|
||||||
|
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
//:: Get & check skill
|
||||||
|
string sSkillLabel = Get2DACache("skills", "Label", nSkillID);
|
||||||
|
|
||||||
|
//:: Break when out of skills
|
||||||
|
if (sSkillLabel == "")
|
||||||
|
break;
|
||||||
|
|
||||||
|
//:: Apply the skill increase effect for the current skill
|
||||||
|
eParagon = EffectLinkEffects(eParagon, EffectSkillIncrease(nSkillID, 10));
|
||||||
|
|
||||||
|
|
||||||
|
//:: Move to the next skill ID
|
||||||
|
nSkillID++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Two free general feats.
|
||||||
|
PickParagonBonusFeat(oCreature);
|
||||||
|
PickParagonBonusFeat(oCreature);
|
||||||
|
|
||||||
|
eParagon = UnyieldingEffect(eParagon);
|
||||||
|
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eParagon, oCreature);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ReallyEquipItemInSlot(object oNPC, object oItem, int nSlot)
|
||||||
|
{
|
||||||
|
if (GetItemInSlot(nSlot) != oItem)
|
||||||
|
{
|
||||||
|
//ClearAllActions();
|
||||||
|
AssignCommand(oNPC, ActionEquipItem(oItem, nSlot));
|
||||||
|
DelayCommand(0.5, ReallyEquipItemInSlot(oNPC, oItem, nSlot));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the size of a JSON array
|
||||||
|
int GetJsonArraySize(json jArray)
|
||||||
|
{
|
||||||
|
int iSize = 0;
|
||||||
|
while (JsonArrayGet(jArray, iSize) != JsonNull())
|
||||||
|
{
|
||||||
|
iSize++;
|
||||||
|
}
|
||||||
|
return iSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CheckForWeapon(object oCreature)
|
||||||
|
{
|
||||||
|
if (GetIsWeapon(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oCreature)) == 1 || GetIsWeapon(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oCreature)) == 1)
|
||||||
|
{
|
||||||
|
// oCreature has a weapon in at least one hand
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// oCreature doesn't have a weapon in either hand
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Adds Psuedonatural resistances & DR.
|
||||||
|
void ApplyPseudonaturalEffects(object oCreature)
|
||||||
|
{
|
||||||
|
if(!GetIsObjectValid(oCreature)) return;
|
||||||
|
|
||||||
|
int nHD = GetHitDice(oCreature);
|
||||||
|
if(DEBUG) DoDebug("prc_inc_json >> ApplyPseudonaturalEffects: nHD is: "+IntToString(nHD)+".");
|
||||||
|
// -------------------------
|
||||||
|
// Spell Resistance
|
||||||
|
// SR = 10 + HD (max 25)
|
||||||
|
// -------------------------
|
||||||
|
int nSR = 10 + nHD;
|
||||||
|
if(nSR > 25) nSR = 25;
|
||||||
|
|
||||||
|
effect eSR = EffectSpellResistanceIncrease(nSR);
|
||||||
|
eSR = TagEffect(eSR, "PSEUDO_SR");
|
||||||
|
eSR = EffectLinkEffects(eSR, UnyieldingEffect(eSR));
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSR, oCreature);
|
||||||
|
|
||||||
|
// -------------------------
|
||||||
|
// Acid/Electricity Resistance
|
||||||
|
// Reference Table:
|
||||||
|
// HD 1<>3 : Resist 5
|
||||||
|
// HD 4<>7 : Resist 5
|
||||||
|
// HD 8<>11 : Resist 10
|
||||||
|
// HD >=12 : Resist 15
|
||||||
|
// -------------------------
|
||||||
|
int nResist;
|
||||||
|
|
||||||
|
if(nHD <= 7) nResist = 5;
|
||||||
|
else if(nHD <=11) nResist = 10;
|
||||||
|
else nResist = 15;
|
||||||
|
|
||||||
|
effect eResAcid = EffectDamageResistance(DAMAGE_TYPE_ACID, nResist);
|
||||||
|
eResAcid = TagEffect(eResAcid, "PSEUDO_RES_ACID");
|
||||||
|
eResAcid = EffectLinkEffects(eResAcid, UnyieldingEffect(eResAcid));
|
||||||
|
|
||||||
|
effect eResElec = EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, nResist);
|
||||||
|
eResElec = TagEffect(eResElec, "PSEUDO_RES_ELEC");
|
||||||
|
eResElec = EffectLinkEffects(eResElec, UnyieldingEffect(eResElec));
|
||||||
|
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eResAcid, oCreature);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eResElec, oCreature);
|
||||||
|
|
||||||
|
// -------------------------
|
||||||
|
// Damage Reduction
|
||||||
|
// Reference Table:
|
||||||
|
// HD 1<>3 : none
|
||||||
|
// HD 4<>7 : DR 5 / magic
|
||||||
|
// HD 8<>11 : DR 5 / magic
|
||||||
|
// HD >=12 : DR 10 / magic
|
||||||
|
// -------------------------
|
||||||
|
|
||||||
|
int nDR;
|
||||||
|
if(nHD <= 3) { nDR = 0; }
|
||||||
|
else if(nHD <= 11) { nDR = 5; }
|
||||||
|
else { nDR = 10; }
|
||||||
|
|
||||||
|
effect eDR = EffectDamageReduction(nDR, DAMAGE_POWER_PLUS_ONE, 0, FALSE);
|
||||||
|
eDR = TagEffect(eDR, "PSEUDO_DR_MAGIC");
|
||||||
|
eDR = EffectLinkEffects(eDR, UnyieldingEffect(eDR));
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDR, oCreature);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//::---------------------------------------------|
|
//::---------------------------------------------|
|
||||||
//:: JSON functions |
|
//:: JSON functions |
|
||||||
@@ -129,6 +590,23 @@ int json_GetCONValue(json jCreature)
|
|||||||
return nCon;
|
return nCon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//:: Returns the Challenge Rating from a GFF creature UTC
|
||||||
|
float json_GetChallengeRating(json jCreature)
|
||||||
|
{
|
||||||
|
float fCR = 0.25; // default if missing
|
||||||
|
|
||||||
|
if (GffGetFieldExists(jCreature, "ChallengeRating"))
|
||||||
|
{
|
||||||
|
json jCR = GffGetFloat(jCreature, "ChallengeRating");
|
||||||
|
if (jCR != JsonNull())
|
||||||
|
{
|
||||||
|
fCR = JsonGetFloat(jCR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fCR;
|
||||||
|
}
|
||||||
|
|
||||||
//:: Returns the integer value of a VarTable entry named sVarName, or 0 if not found.
|
//:: Returns the integer value of a VarTable entry named sVarName, or 0 if not found.
|
||||||
int json_GetLocalIntFromVarTable(json jCreature, string sVarName)
|
int json_GetLocalIntFromVarTable(json jCreature, string sVarName)
|
||||||
{
|
{
|
||||||
@@ -169,6 +647,46 @@ int json_GetLocalIntFromVarTable(json jCreature, string sVarName)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//:: Returns the string value of a VarTable entry named sVarName, or "" if not found.
|
||||||
|
string json_GetLocalStringFromVarTable(json jCreature, string sVarName)
|
||||||
|
{
|
||||||
|
json jVarTable = GffGetList(jCreature, "VarTable");
|
||||||
|
if (jVarTable == JsonNull())
|
||||||
|
return "";
|
||||||
|
|
||||||
|
int nCount = JsonGetLength(jVarTable);
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < nCount; i++)
|
||||||
|
{
|
||||||
|
json jEntry = JsonArrayGet(jVarTable, i);
|
||||||
|
if (jEntry == JsonNull()) continue;
|
||||||
|
|
||||||
|
// Get the Name field using GFF functions
|
||||||
|
json jName = GffGetString(jEntry, "Name");
|
||||||
|
if (jName == JsonNull()) continue;
|
||||||
|
string sName = JsonGetString(jName);
|
||||||
|
|
||||||
|
if (sName == sVarName)
|
||||||
|
{
|
||||||
|
// Get the Type field to verify it's a string
|
||||||
|
json jType = GffGetDword(jEntry, "Type");
|
||||||
|
if (jType != JsonNull())
|
||||||
|
{
|
||||||
|
int nType = JsonGetInt(jType);
|
||||||
|
if (nType == 3) // Type 3 = string
|
||||||
|
{
|
||||||
|
// Get the Value field using GFF functions
|
||||||
|
json jValue = GffGetString(jEntry, "Value");
|
||||||
|
if (jValue == JsonNull()) return "";
|
||||||
|
return JsonGetString(jValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
//:: Returns the total Hit Dice from a JSON'd creature GFF.
|
//:: Returns the total Hit Dice from a JSON'd creature GFF.
|
||||||
int json_GetCreatureHD(json jCreature)
|
int json_GetCreatureHD(json jCreature)
|
||||||
{
|
{
|
||||||
@@ -198,17 +716,47 @@ int json_GetCreatureHD(json jCreature)
|
|||||||
return nHD;
|
return nHD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
json json_RecalcMaxHP(json jCreature, int iHitDieValue)
|
json json_RecalcMaxHP(json jCreature, int iHitDieValue)
|
||||||
{
|
{
|
||||||
int iHD = json_GetCreatureHD(jCreature);
|
int iHD = json_GetCreatureHD(jCreature);
|
||||||
int iCON = json_GetCONValue(jCreature);
|
|
||||||
int iMod = GetAbilityModFromValue(iCON);
|
|
||||||
|
|
||||||
int nConBonusHP = iMod * iHD;
|
//:: Retrieve the RacialType field
|
||||||
int iNewMaxHP = (iHitDieValue * iHD); /* nConBonusHP */
|
json jRacialTypeField = JsonObjectGet(jCreature, "Race");
|
||||||
|
int nRacialType = JsonGetInt(jRacialTypeField);
|
||||||
|
|
||||||
//jCreature = GffReplaceShort(jCreature, "MaxHitPoints", iNewMaxHP);
|
//:: Retrieve the CreatureSize from the creature appearance field
|
||||||
|
json jAppearanceField = JsonObjectGet(jCreature, "Appearance_Type");
|
||||||
|
int nAppearance = JsonGetInt(jAppearanceField);
|
||||||
|
|
||||||
|
int nSize = StringToInt(Get2DAString("appearance", "SizeCategory", nAppearance));
|
||||||
|
|
||||||
|
//CEP adds other sizes, take them into account too
|
||||||
|
if(nSize == 20)
|
||||||
|
nSize = CREATURE_SIZE_DIMINUTIVE;
|
||||||
|
else if(nSize == 21)
|
||||||
|
nSize = CREATURE_SIZE_FINE;
|
||||||
|
else if(nSize == 22)
|
||||||
|
nSize = CREATURE_SIZE_GARGANTUAN;
|
||||||
|
else if(nSize == 23)
|
||||||
|
nSize = CREATURE_SIZE_COLOSSAL;
|
||||||
|
|
||||||
|
int iNewMaxHP = (iHitDieValue * iHD);
|
||||||
|
|
||||||
|
if(nRacialType == RACIAL_TYPE_CONSTRUCT)
|
||||||
|
{
|
||||||
|
if(nSize == CREATURE_SIZE_FINE) iNewMaxHP += 0;
|
||||||
|
if(nSize == CREATURE_SIZE_DIMINUTIVE) iNewMaxHP += 0;
|
||||||
|
if(nSize == CREATURE_SIZE_TINY) iNewMaxHP += 0;
|
||||||
|
if(nSize == CREATURE_SIZE_SMALL) iNewMaxHP += 10;
|
||||||
|
if(nSize == CREATURE_SIZE_MEDIUM) iNewMaxHP += 20;
|
||||||
|
if(nSize == CREATURE_SIZE_LARGE) iNewMaxHP += 30;
|
||||||
|
if(nSize == CREATURE_SIZE_HUGE) iNewMaxHP += 40;
|
||||||
|
if(nSize == CREATURE_SIZE_GARGANTUAN) iNewMaxHP += 60;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(DEBUG) DoDebug("prc_inc_json >> json_RecalcMaxHP | New MaxHP is: "+IntToString(iNewMaxHP)+ ".");
|
||||||
|
|
||||||
|
jCreature = GffReplaceShort(jCreature, "MaxHitPoints", iNewMaxHP);
|
||||||
jCreature = GffReplaceShort(jCreature, "CurrentHitPoints", iNewMaxHP);
|
jCreature = GffReplaceShort(jCreature, "CurrentHitPoints", iNewMaxHP);
|
||||||
jCreature = GffReplaceShort(jCreature, "HitPoints", iNewMaxHP);
|
jCreature = GffReplaceShort(jCreature, "HitPoints", iNewMaxHP);
|
||||||
|
|
||||||
@@ -221,9 +769,7 @@ json json_RecalcMaxHP(json jCreature, int iHitDieValue)
|
|||||||
return jCreature;
|
return jCreature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//:: Reads ABILITY_TO_INCREASE from creature's VarTable and applies stat boosts based on increased HD
|
//:: Reads ABILITY_TO_INCREASE from creature's VarTable and applies stat boosts based on increased HD
|
||||||
|
|
||||||
json json_ApplyAbilityBoostFromHD(json jCreature, int nOriginalHD)
|
json json_ApplyAbilityBoostFromHD(json jCreature, int nOriginalHD)
|
||||||
{
|
{
|
||||||
if (jCreature == JsonNull())
|
if (jCreature == JsonNull())
|
||||||
@@ -262,6 +808,8 @@ json json_ApplyAbilityBoostFromHD(json jCreature, int nOriginalHD)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(DEBUG) DoDebug("prc_inc_json >> json_ApplyAbilityBoostFromHD: nCurrentTotalHD = "+IntToString(nCurrentTotalHD)+".");
|
||||||
|
|
||||||
if (nCurrentTotalHD <= 0)
|
if (nCurrentTotalHD <= 0)
|
||||||
{
|
{
|
||||||
DoDebug("json_ApplyAbilityBoostFromHD: No valid Hit Dice found");
|
DoDebug("json_ApplyAbilityBoostFromHD: No valid Hit Dice found");
|
||||||
@@ -425,7 +973,7 @@ json json_AddFeatsFromCreatureVars(json jCreature, int nOriginalHD)
|
|||||||
if(DEBUG) DoDebug("json_AddFeatsFromCreatureVars: Original feat count: " + IntToString(nOriginalFeatCount));
|
if(DEBUG) DoDebug("json_AddFeatsFromCreatureVars: Original feat count: " + IntToString(nOriginalFeatCount));
|
||||||
|
|
||||||
int nAdded = 0;
|
int nAdded = 0;
|
||||||
int i = 1;
|
int i = 0;
|
||||||
int nMaxIterations = 100; // Safety valve
|
int nMaxIterations = 100; // Safety valve
|
||||||
int nIterations = 0;
|
int nIterations = 0;
|
||||||
|
|
||||||
@@ -662,7 +1210,6 @@ json json_AddHitDice(json jCreature, int nAmount)
|
|||||||
// Grab the first class entry
|
// Grab the first class entry
|
||||||
json jFirstClass = JsonArrayGet(jClasses, 0);
|
json jFirstClass = JsonArrayGet(jClasses, 0);
|
||||||
|
|
||||||
// Only touch ClassLevel; do NOT modify Class type
|
|
||||||
json jCurrentLevel = GffGetShort(jFirstClass, "ClassLevel");
|
json jCurrentLevel = GffGetShort(jFirstClass, "ClassLevel");
|
||||||
int nCurrentLevel = JsonGetInt(jCurrentLevel);
|
int nCurrentLevel = JsonGetInt(jCurrentLevel);
|
||||||
int nNewLevel = nCurrentLevel + nAmount;
|
int nNewLevel = nCurrentLevel + nAmount;
|
||||||
@@ -823,16 +1370,16 @@ json json_AdjustCreatureSize(json jCreature, int nSizeDelta, int nIncorporeal =
|
|||||||
}
|
}
|
||||||
|
|
||||||
//:: Changes jCreature's creature type.
|
//:: Changes jCreature's creature type.
|
||||||
json JsonModifyRacialType(json jCreature, int nNewRacialType)
|
json json_ModifyRacialType(json jCreature, int nNewRacialType)
|
||||||
{
|
{
|
||||||
if(DEBUG)DoDebug("prc_inc_function >> JsonModifyRacialType: Entering function");
|
if(DEBUG)DoDebug("prc_inc_json >> json_ModifyRacialType: Entering function");
|
||||||
|
|
||||||
// Retrieve the RacialType field
|
// Retrieve the RacialType field
|
||||||
json jRacialTypeField = JsonObjectGet(jCreature, "Race");
|
json jRacialTypeField = JsonObjectGet(jCreature, "Race");
|
||||||
|
|
||||||
if (JsonGetType(jRacialTypeField) == JSON_TYPE_NULL)
|
if (JsonGetType(jRacialTypeField) == JSON_TYPE_NULL)
|
||||||
{
|
{
|
||||||
DoDebug("prc_inc_function >> JsonModifyRacialType: JsonGetType error 1: " + JsonGetError(jRacialTypeField));
|
DoDebug("prc_inc_json >> json_ModifyRacialType: JsonGetType error 1: " + JsonGetError(jRacialTypeField));
|
||||||
//SpeakString("JsonGetType error 1: " + JsonGetError(jRacialTypeField));
|
//SpeakString("JsonGetType error 1: " + JsonGetError(jRacialTypeField));
|
||||||
return JsonNull();
|
return JsonNull();
|
||||||
}
|
}
|
||||||
@@ -842,7 +1389,7 @@ json JsonModifyRacialType(json jCreature, int nNewRacialType)
|
|||||||
|
|
||||||
if (JsonGetType(jRacialTypeValue) != JSON_TYPE_INTEGER)
|
if (JsonGetType(jRacialTypeValue) != JSON_TYPE_INTEGER)
|
||||||
{
|
{
|
||||||
DoDebug("prc_inc_function >> JsonModifyRacialType: JsonGetType error 2: " + JsonGetError(jRacialTypeValue));
|
DoDebug("prc_inc_json >> json_ModifyRacialType: JsonGetType error 2: " + JsonGetError(jRacialTypeValue));
|
||||||
//SpeakString("JsonGetType error 2: " + JsonGetError(jRacialTypeValue));
|
//SpeakString("JsonGetType error 2: " + JsonGetError(jRacialTypeValue));
|
||||||
return JsonNull();
|
return JsonNull();
|
||||||
}
|
}
|
||||||
@@ -853,6 +1400,206 @@ json JsonModifyRacialType(json jCreature, int nNewRacialType)
|
|||||||
return jCreature;
|
return jCreature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//:: Adds Paragon SLA's to jCreature.
|
||||||
|
//::
|
||||||
|
json json_AddParagonPowers(json jCreature)
|
||||||
|
{
|
||||||
|
// Get the existing SpecAbilityList (if it exists)
|
||||||
|
json jSpecAbilityList = GffGetList(jCreature, "SpecAbilityList");
|
||||||
|
|
||||||
|
// Create the SpecAbilityList if it doesn't exist
|
||||||
|
if (jSpecAbilityList == JsonNull())
|
||||||
|
{
|
||||||
|
jSpecAbilityList = JsonArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Greater Dispelling 3x / Day
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
json jSpecAbility = JsonObject();
|
||||||
|
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 67);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", 15);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
|
||||||
|
|
||||||
|
// Manually add to the array
|
||||||
|
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Add Haste 3x / Day
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
json jSpecAbility = JsonObject();
|
||||||
|
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 78);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", 15);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
|
||||||
|
|
||||||
|
// Manually add to the array
|
||||||
|
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: See Invisiblity 3x / Day
|
||||||
|
for (i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
json jSpecAbility = JsonObject();
|
||||||
|
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 157);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", 15);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
|
||||||
|
|
||||||
|
// Manually add to the array
|
||||||
|
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Add the list to the creature
|
||||||
|
jCreature = GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList);
|
||||||
|
|
||||||
|
return jCreature;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Directly modifies jCreature's Challenge Rating.
|
||||||
|
//:: This is useful for most XP calculations.
|
||||||
|
//::
|
||||||
|
json json_UpdateParagonCR(json jCreature, int nBaseCR, int nBaseHD)
|
||||||
|
{
|
||||||
|
int nNewCR;
|
||||||
|
|
||||||
|
//:: Calculate additional CR by HD
|
||||||
|
if(nBaseHD <= 6)
|
||||||
|
{
|
||||||
|
nNewCR = nBaseCR + 18;
|
||||||
|
}
|
||||||
|
else if(nBaseHD <= 16)
|
||||||
|
{
|
||||||
|
nNewCR = nBaseCR + 15;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{nNewCR = nBaseCR + 12;}
|
||||||
|
|
||||||
|
//:: Modify Challenge Rating
|
||||||
|
jCreature = GffReplaceFloat(jCreature, "ChallengeRating"/* /value" */, IntToFloat(nNewCR));
|
||||||
|
|
||||||
|
return jCreature;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Adds Psuedonatural SLA's to jCreature.
|
||||||
|
//::
|
||||||
|
json json_AddPsuedonaturalPowers(json jCreature)
|
||||||
|
{
|
||||||
|
// Get the existing SpecAbilityList (if it exists)
|
||||||
|
json jSpecAbilityList = GffGetList(jCreature, "SpecAbilityList");
|
||||||
|
|
||||||
|
// Create the SpecAbilityList if it doesn't exist
|
||||||
|
if (jSpecAbilityList == JsonNull())
|
||||||
|
{
|
||||||
|
jSpecAbilityList = JsonArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: True Strike 1x / Day
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 1; i++)
|
||||||
|
{
|
||||||
|
json jSpecAbility = JsonObject();
|
||||||
|
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 415);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", 15);
|
||||||
|
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
|
||||||
|
|
||||||
|
// Manually add to the array
|
||||||
|
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Add the list to the creature
|
||||||
|
jCreature = GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList);
|
||||||
|
|
||||||
|
return jCreature;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Directly modifies jCreature's Challenge Rating.
|
||||||
|
//:: This is useful for most XP calculations.
|
||||||
|
//::
|
||||||
|
json json_UpdatePsuedonaturalCR(json jCreature, int nBaseCR, int nBaseHD)
|
||||||
|
{
|
||||||
|
int nNewCR;
|
||||||
|
|
||||||
|
//:: Calculate additional CR by HD
|
||||||
|
if (nBaseHD >= 4 && nBaseHD <= 11)
|
||||||
|
{
|
||||||
|
nNewCR = nBaseCR + 1;
|
||||||
|
}
|
||||||
|
else if (nBaseHD >= 12)
|
||||||
|
{
|
||||||
|
nNewCR = nBaseCR + 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Modify Challenge Rating
|
||||||
|
jCreature = GffReplaceFloat(jCreature, "ChallengeRating"/* /value" */, IntToFloat(nNewCR));
|
||||||
|
|
||||||
|
return jCreature;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//:: Spawns a Psuedonatural creature from a template
|
||||||
|
object MakePsuedonaturalCreatureFromTemplate(string sResref, location lSpawnLoc)
|
||||||
|
{
|
||||||
|
json jPsuedo = TemplateToJson(sResref, RESTYPE_UTC);
|
||||||
|
if (jPsuedo == JSON_NULL)
|
||||||
|
{
|
||||||
|
DoDebug("prc_inc_json >> SpawnPsuedonaturalCreatureFromTemplate: TemplateToJson failed <20> bad resref or resource missing.");
|
||||||
|
return OBJECT_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Get current HD
|
||||||
|
int nCurrentHD = json_GetCreatureHD(jPsuedo);
|
||||||
|
if (nCurrentHD <= 0)
|
||||||
|
{
|
||||||
|
DoDebug("make_psuedonat >> MakePsuedonaturalCreatureFromTemplate failed <20> template missing HD data.");
|
||||||
|
return OBJECT_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Get current CR
|
||||||
|
int nBaseCR = 1;
|
||||||
|
nBaseCR = json_GetCreatureHD(jPsuedo);
|
||||||
|
if (nBaseCR <= 0)
|
||||||
|
{
|
||||||
|
DoDebug("make_psuedonat >> MakePsuedonaturalCreatureFromTemplate failed <20> template missing CR data.");
|
||||||
|
return OBJECT_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Get local vars to transfer over.
|
||||||
|
int iMinHD = json_GetLocalIntFromVarTable(jPsuedo, "iMinHD");
|
||||||
|
int iMaxHD = json_GetLocalIntFromVarTable(jPsuedo, "iMaxHD");
|
||||||
|
int nOriginalHD = json_GetLocalIntFromVarTable(jPsuedo, "nOriginalHD");
|
||||||
|
int iClass2 = json_GetLocalIntFromVarTable(jPsuedo, "Class2");
|
||||||
|
int iClass2Package = json_GetLocalIntFromVarTable(jPsuedo, "Class2Package");
|
||||||
|
int iClass2Start = json_GetLocalIntFromVarTable(jPsuedo, "Class2Start");
|
||||||
|
int iMagicUse = json_GetLocalIntFromVarTable(jPsuedo, "X2_L_BEH_MAGIC");
|
||||||
|
string sAI = json_GetLocalStringFromVarTable(jPsuedo, "X2_SPECIAL_COMBAT_AI_SCRIPT");
|
||||||
|
|
||||||
|
//:: Adds True Strike 1x / day to jCreature.
|
||||||
|
jPsuedo = json_AddPsuedonaturalPowers(jPsuedo);
|
||||||
|
|
||||||
|
//:: Change jCreature's racialtype to outsider
|
||||||
|
jPsuedo = json_ModifyRacialType(jPsuedo, RACIAL_TYPE_OUTSIDER);
|
||||||
|
|
||||||
|
jPsuedo = json_UpdatePsuedonaturalCR(jPsuedo, nBaseCR, nCurrentHD);
|
||||||
|
|
||||||
|
//:: Spawn the creature
|
||||||
|
object oPsuedo = JsonToObject(jPsuedo, lSpawnLoc);
|
||||||
|
|
||||||
|
//:: Set variables
|
||||||
|
SetLocalInt(oPsuedo, "TEMPLATE_PSUEDONATURAL", 1);
|
||||||
|
SetLocalInt(oPsuedo, "iMinHD", iMinHD);
|
||||||
|
SetLocalInt(oPsuedo, "iMaxHD", iMaxHD);
|
||||||
|
SetLocalInt(oPsuedo, "nOriginalHD", nOriginalHD);
|
||||||
|
SetLocalInt(oPsuedo, "Class2", iClass2);
|
||||||
|
SetLocalInt(oPsuedo, "Class2Package", iClass2Package);
|
||||||
|
SetLocalInt(oPsuedo, "Class2Start", iClass2Start);
|
||||||
|
SetLocalInt(oPsuedo, "X2_L_BEH_MAGIC", iMagicUse);
|
||||||
|
SetLocalString(oPsuedo, "X2_SPECIAL_COMBAT_AI_SCRIPT", sAI);
|
||||||
|
|
||||||
|
return oPsuedo;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//:: Test void
|
//:: Test void
|
||||||
//:: void main (){}
|
//:: void main (){}
|
||||||
@@ -277,6 +277,32 @@ void ClearNaturalWeapons(object oPC)
|
|||||||
array_delete(oPC, ARRAY_NAT_PRI_WEAP_ATTACKS);
|
array_delete(oPC, ARRAY_NAT_PRI_WEAP_ATTACKS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adds a natural primary weapon to a creature (PC/NPC).
|
||||||
|
*
|
||||||
|
* This function manages a creature's natural primary weapons by storing their
|
||||||
|
* resource references and attack counts in persistent arrays. If the weapon
|
||||||
|
* being added is the first natural weapon, it may automatically become the
|
||||||
|
* creature's active primary natural weapon, unless the creature is a Monk or
|
||||||
|
* Brawler. Optionally, the weapon can be forced to become the active primary
|
||||||
|
* weapon regardless of class.
|
||||||
|
*
|
||||||
|
* @param oPC The creature object to which the natural weapon will be added.
|
||||||
|
* @param sResRef The resource reference string of the natural weapon.
|
||||||
|
* @param nCount (Optional) The number of attacks this natural weapon provides.
|
||||||
|
* Default is 1.
|
||||||
|
* @param nForceUse (Optional) If TRUE, forces this weapon to become the active
|
||||||
|
* primary natural weapon regardless of the creature's class.
|
||||||
|
* Default is FALSE.
|
||||||
|
*
|
||||||
|
* @details
|
||||||
|
* - Creates persistent arrays for weapon references and attack counts if they
|
||||||
|
* do not already exist.
|
||||||
|
* - Checks if the weapon is already present to avoid duplicates.
|
||||||
|
* - Adds the weapon and attack count to the arrays.
|
||||||
|
* - Sets the primary natural weapon index to this weapon if it is the first
|
||||||
|
* natural weapon added, unless the creature is a Monk or Brawler.
|
||||||
|
*/
|
||||||
void AddNaturalPrimaryWeapon(object oPC, string sResRef, int nCount = 1, int nForceUse = FALSE)
|
void AddNaturalPrimaryWeapon(object oPC, string sResRef, int nCount = 1, int nForceUse = FALSE)
|
||||||
{
|
{
|
||||||
int nFirstNaturalWeapon = FALSE;
|
int nFirstNaturalWeapon = FALSE;
|
||||||
|
|||||||
@@ -363,7 +363,10 @@ int PRCIsFlying(object oCreature)
|
|||||||
bFlying = TRUE;
|
bFlying = TRUE;
|
||||||
}
|
}
|
||||||
if(!bFlying
|
if(!bFlying
|
||||||
&& ((nWings > 0 && nWings < 79) || nWings == 90))//CEP and Project Q wing models
|
&& ((nWings > 0 && nWings < 79)
|
||||||
|
|| (nWings > 1959 && nWings < 1962)
|
||||||
|
|| (nWings > 1962 && nWings < 1966)
|
||||||
|
|| nWings == 90))//CEP and Project Q wing models
|
||||||
bFlying = TRUE;
|
bFlying = TRUE;
|
||||||
|
|
||||||
if (GetHasSpellEffect(MOVE_SH_BALANCE_SKY, oCreature))
|
if (GetHasSpellEffect(MOVE_SH_BALANCE_SKY, oCreature))
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
|
|
||||||
/* This variable MUST be updated with every new version of the PRC!!! */
|
/* This variable MUST be updated with every new version of the PRC!!! */
|
||||||
|
|
||||||
const string PRC_VERSION = "PRC8 4.69";
|
const string PRC_VERSION = "PRC8 4.71";
|
||||||
|
|
||||||
/* This variable MUST be updated every time 'assemble_spellbooks.bat' is run!!! */
|
/* This variable MUST be updated every time 'assemble_spellbooks.bat' is run!!! */
|
||||||
|
|
||||||
@@ -552,13 +552,13 @@ const string PRC_BARD_DISALLOW_NEWSPELLBOOK = "PRC_BARD_DISALLOW_NEWSPELLBOO
|
|||||||
*/
|
*/
|
||||||
const string PRC_BARD_LIGHT_ARMOR_SPELLCASTING = "PRC_BARD_LIGHT_ARMOR_SPELLCASTING";
|
const string PRC_BARD_LIGHT_ARMOR_SPELLCASTING = "PRC_BARD_LIGHT_ARMOR_SPELLCASTING";
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* By default, CW Samurai get a plain katana and a plain wakizashi (shortsword) at 1st level.
|
* By default, CW Samurai get a plain katana and a plain wakizashi (shortsword) at 1st level.
|
||||||
* Setting this to non-zero value prevents that.
|
* Setting this to non-zero value prevents that.
|
||||||
*/
|
*/
|
||||||
const string PRC_CWSAMURAI_NO_HEIRLOOM_DAISHO = "PRC_CWSAMURAI_NO_HEIRLOOM_DAISHO";
|
const string PRC_CWSAMURAI_NO_HEIRLOOM_DAISHO = "PRC_CWSAMURAI_NO_HEIRLOOM_DAISHO";
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* Determines the number of wight henchmen a Soul Eater can have via their Soul Slave
|
* Determines the number of wight henchmen a Soul Eater can have via their Soul Slave
|
||||||
* class ability.
|
* class ability.
|
||||||
* Default: 4
|
* Default: 4
|
||||||
@@ -568,7 +568,7 @@ const string PRC_CWSAMURAI_NO_HEIRLOOM_DAISHO = "PRC_CWSAMURAI_NO_HEIRLOOM_DAISH
|
|||||||
const string PRC_SOUL_EATER_MAX_SLAVES = "PRC_SOUL_EATER_MAX_SLAVES";
|
const string PRC_SOUL_EATER_MAX_SLAVES = "PRC_SOUL_EATER_MAX_SLAVES";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* For the Psionic Slayer prestige class, this switch limits the Favored Enemy selection
|
* For the Psionic Slayer prestige class, this switch limits the Favored Enemy selection
|
||||||
* to the Aberration racial type.
|
* to the Aberration racial type.
|
||||||
*
|
*
|
||||||
@@ -581,7 +581,7 @@ const string PRC_SOUL_EATER_MAX_SLAVES = "PRC_SOUL_EATER_MAX_SLAVES";
|
|||||||
*/
|
*/
|
||||||
const string PRC_PSIONIC_SLAYER_FAV_ENEMY_ABERRATION_ONLY = "PRC_PSIONIC_SLAYER_FAV_ENEMY_ABERRATION_ONLY";
|
const string PRC_PSIONIC_SLAYER_FAV_ENEMY_ABERRATION_ONLY = "PRC_PSIONIC_SLAYER_FAV_ENEMY_ABERRATION_ONLY";
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* For the Psionic Slayer prestige class, this switch requires a character to make a "kill"
|
* For the Psionic Slayer prestige class, this switch requires a character to make a "kill"
|
||||||
* of a specific type of creature before the class becomes available.
|
* of a specific type of creature before the class becomes available.
|
||||||
*
|
*
|
||||||
@@ -603,9 +603,9 @@ const string PRC_PSIONIC_SLAYER_FAV_ENEMY_ABERRATION_ONLY = "PRC_PSIONIC_S
|
|||||||
const string PRC_PSIONIC_SLAYER_REQUIRE_KILL_TOKEN = "PRC_PSIONIC_SLAYER_REQUIRE_KILL_TOKEN";
|
const string PRC_PSIONIC_SLAYER_REQUIRE_KILL_TOKEN = "PRC_PSIONIC_SLAYER_REQUIRE_KILL_TOKEN";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* By default the Werewolf class uses the Bioware Polymorph effect to perfrom its
|
* By default the Werewolf class uses the Bioware Polymorph effect to perfrom its
|
||||||
* Hybrid Form Shapchange.
|
* Hybrid Form Shapechange.
|
||||||
*
|
*
|
||||||
* This switch allows the Werewolf class to be toggled to use the PRC Shifter
|
* This switch allows the Werewolf class to be toggled to use the PRC Shifter
|
||||||
* Shapchange code instead.
|
* Shapchange code instead.
|
||||||
@@ -614,9 +614,9 @@ const string PRC_PSIONIC_SLAYER_REQUIRE_KILL_TOKEN = "PRC_PSIONIC_SLAYER_R
|
|||||||
* Values: 0 [Default] (Werewolf Hybrid Shapchange uses Bioware Polymorph)
|
* Values: 0 [Default] (Werewolf Hybrid Shapchange uses Bioware Polymorph)
|
||||||
* 1 (Werewolf Hybrid Shapchange uses PRC Shifter shape change code)
|
* 1 (Werewolf Hybrid Shapchange uses PRC Shifter shape change code)
|
||||||
*/
|
*/
|
||||||
const string PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPCHANGE = "PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPCHANGE";
|
const string PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPECHANGE = "PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPECHANGE";
|
||||||
|
|
||||||
/**
|
/*
|
||||||
* Sets the max bonus for the PnP Shifter shifting systems
|
* Sets the max bonus for the PnP Shifter shifting systems
|
||||||
*
|
*
|
||||||
* Type: Int
|
* Type: Int
|
||||||
@@ -1204,8 +1204,11 @@ const string PRC_SPELL_ALIGNMENT_RESTRICT = "PRC_SPELL_ALIGNMENT_REST
|
|||||||
*/
|
*/
|
||||||
const string PRC_APPEARNCE_CHANGE_DISABLE = "PRC_APPEARNCE_CHANGE_DISABLE";
|
const string PRC_APPEARNCE_CHANGE_DISABLE = "PRC_APPEARNCE_CHANGE_DISABLE";
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allow "Monk" gloves to merge with a creature weapons when Wildshaped.
|
||||||
|
* Will also merge bracers with creature hides when Wildshaped.
|
||||||
|
*/
|
||||||
|
const string PRC_WILDSHAPE_ALLOWS_ARMS_SLOT = "PRC_WILDSHAPE_ALLOWS_ARMS_SLOT";
|
||||||
|
|
||||||
/******************************************************************************\
|
/******************************************************************************\
|
||||||
* Death/Bleeding system *
|
* Death/Bleeding system *
|
||||||
|
|||||||
@@ -15,6 +15,56 @@
|
|||||||
#include "inc_item_props"
|
#include "inc_item_props"
|
||||||
#include "prc_x2_itemprop"
|
#include "prc_x2_itemprop"
|
||||||
|
|
||||||
|
//:: Detects if "monk" gloves are being equipped & set a
|
||||||
|
//:: variable if TRUE for use with other functions
|
||||||
|
void DetectMonkGloveEquip(object oItem)
|
||||||
|
{
|
||||||
|
int nItemType = GetBaseItemType(oItem);
|
||||||
|
|
||||||
|
object oPC = GetItemPossessor(oItem);
|
||||||
|
if (!GetIsObjectValid(oItem))
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("prc_inc_wpnrest >> DetectMonkGloveEquip(): Unable to determine item possessor");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(nItemType != BASE_ITEM_GLOVES && nItemType != BASE_ITEM_BRACER) {return;}
|
||||||
|
|
||||||
|
else if (nItemType == BASE_ITEM_BRACER)
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("prc_inc_wpnrest >> DetectMonkGloveEquip(): Bracer found!");
|
||||||
|
DeleteLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
itemproperty ipG = GetFirstItemProperty(oItem);
|
||||||
|
|
||||||
|
while(GetIsItemPropertyValid(ipG))
|
||||||
|
{
|
||||||
|
int nTypeG = GetItemPropertyType(ipG);
|
||||||
|
|
||||||
|
// Damage related properties we care about
|
||||||
|
if(nTypeG == ITEM_PROPERTY_DAMAGE_BONUS
|
||||||
|
|| nTypeG == ITEM_PROPERTY_ATTACK_BONUS
|
||||||
|
|| nTypeG == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP
|
||||||
|
|| nTypeG == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|
||||||
|
|| nTypeG == ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT)
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("prc_inc_wpnrest >> DetectMonkGloves(): Monk gloves found!");
|
||||||
|
SetLocalInt(oPC, "WEARING_MONK_GLOVES", 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("prc_inc_wpnrest >> DetectMonkGloves(): Monk gloves not found! You should never see this.");
|
||||||
|
DeleteLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All of the following functions use the following parameters:
|
* All of the following functions use the following parameters:
|
||||||
*
|
*
|
||||||
@@ -23,7 +73,6 @@
|
|||||||
* @param nHand The hand the weapon is wielded in. In the form of
|
* @param nHand The hand the weapon is wielded in. In the form of
|
||||||
* ATTACK_BONUS_ONHAND or ATTACK_BONUS_OFFHAND.
|
* ATTACK_BONUS_ONHAND or ATTACK_BONUS_OFFHAND.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//:: returns TRUE if the wielded weapon works with the Swashbuckler's class abilities.
|
//:: returns TRUE if the wielded weapon works with the Swashbuckler's class abilities.
|
||||||
int GetHasSwashbucklerWeapon(object oPC)
|
int GetHasSwashbucklerWeapon(object oPC)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "psi_inc_psifunc"
|
#include "psi_inc_psifunc"
|
||||||
#include "inc_lookups"
|
#include "inc_lookups"
|
||||||
#include "nw_inc_nui"
|
#include "nw_inc_nui"
|
||||||
|
#include "tob_inc_tobfunc"
|
||||||
|
|
||||||
//
|
//
|
||||||
// GetCurrentSpellLevel
|
// GetCurrentSpellLevel
|
||||||
@@ -153,8 +154,53 @@ json GreyOutButton(json jButton, float w, float h);
|
|||||||
//
|
//
|
||||||
json CreateGreyOutRectangle(float w, float h);
|
json CreateGreyOutRectangle(float w, float h);
|
||||||
|
|
||||||
|
//
|
||||||
|
// GetTrueClassType
|
||||||
|
// Gets the true class Id for a provided class Id, mostly for RHD and for
|
||||||
|
// ToB prestige classes
|
||||||
|
//
|
||||||
|
// Arguments:
|
||||||
|
// nClass:int classId
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// int the true classId based off nClass
|
||||||
|
//
|
||||||
|
int GetTrueClassType(int nClass, object oPC=OBJECT_SELF);
|
||||||
|
|
||||||
void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0, int nClass=0);
|
void CreateSpellDescriptionNUI(object oPlayer, int featID, int spellId=0, int realSpellId=0, int nClass=0);
|
||||||
|
|
||||||
|
void CallSpellUnlevelScript(object oPC, int nClass, int nLevel);
|
||||||
void ClearSpellDescriptionNUI(object oPlayer=OBJECT_SELF);
|
void ClearSpellDescriptionNUI(object oPlayer=OBJECT_SELF);
|
||||||
|
void RemoveIPFeat(object oPC, int ipFeatID);
|
||||||
|
|
||||||
|
void CallSpellUnlevelScript(object oPC, int nClass, int nLevel)
|
||||||
|
{
|
||||||
|
SetScriptParam("UnLevel_ClassChoice", IntToString(nClass));
|
||||||
|
SetScriptParam("UnLevel_LevelChoice", IntToString(nLevel));
|
||||||
|
ExecuteScript("prc_unlvl_script", oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveIPFeat(object oPC, int ipFeatID)
|
||||||
|
{
|
||||||
|
object oSkin = GetPCSkin(oPC);
|
||||||
|
itemproperty ipTest = GetFirstItemProperty(oSkin);
|
||||||
|
while(GetIsItemPropertyValid(ipTest))
|
||||||
|
{
|
||||||
|
// Check if the itemproperty is a bonus feat that has been marked for removal
|
||||||
|
if(GetItemPropertyType(ipTest) == ITEM_PROPERTY_BONUS_FEAT)
|
||||||
|
{
|
||||||
|
if (GetItemPropertySubType(ipTest) == ipFeatID)
|
||||||
|
{
|
||||||
|
if(DEBUG) DoDebug("_ManeuverRecurseRemoveArray(): Removing bonus feat itemproperty:\n" + DebugIProp2Str(ipTest));
|
||||||
|
// If so, remove it
|
||||||
|
RemoveItemProperty(oSkin, ipTest);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ipTest = GetNextItemProperty(oSkin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int GetCurrentSpellLevel(int nClass, int nLevel)
|
int GetCurrentSpellLevel(int nClass, int nLevel)
|
||||||
{
|
{
|
||||||
@@ -528,3 +574,39 @@ void ClearSpellDescriptionNUI(object oPlayer=OBJECT_SELF)
|
|||||||
DeleteLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_CLASSID_VAR);
|
DeleteLocalInt(oPlayer, NUI_SPELL_DESCRIPTION_CLASSID_VAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GetTrueClassType(int nClass, object oPC=OBJECT_SELF)
|
||||||
|
{
|
||||||
|
if (nClass == CLASS_TYPE_JADE_PHOENIX_MAGE
|
||||||
|
|| nClass == CLASS_TYPE_MASTER_OF_NINE
|
||||||
|
|| nClass == CLASS_TYPE_DEEPSTONE_SENTINEL
|
||||||
|
|| nClass == CLASS_TYPE_BLOODCLAW_MASTER
|
||||||
|
|| nClass == CLASS_TYPE_RUBY_VINDICATOR
|
||||||
|
|| nClass == CLASS_TYPE_ETERNAL_BLADE
|
||||||
|
|| nClass == CLASS_TYPE_SHADOW_SUN_NINJA)
|
||||||
|
{
|
||||||
|
int trueClass = GetPrimaryBladeMagicClass(oPC);
|
||||||
|
return trueClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((nClass == CLASS_TYPE_SHAPECHANGER
|
||||||
|
&& GetRacialType(oPC) == RACIAL_TYPE_ARANEA)
|
||||||
|
|| (nClass == CLASS_TYPE_OUTSIDER
|
||||||
|
&& GetRacialType(oPC) == RACIAL_TYPE_RAKSHASA)
|
||||||
|
|| (nClass == CLASS_TYPE_ABERRATION
|
||||||
|
&& GetRacialType(oPC) == RACIAL_TYPE_DRIDER)
|
||||||
|
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||||
|
&& GetRacialType(oPC) == RACIAL_TYPE_ARKAMOI)
|
||||||
|
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||||
|
&& GetRacialType(oPC) == RACIAL_TYPE_HOBGOBLIN_WARSOUL)
|
||||||
|
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||||
|
&& GetRacialType(oPC) == RACIAL_TYPE_REDSPAWN_ARCANISS)
|
||||||
|
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||||
|
&& GetRacialType(oPC) == RACIAL_TYPE_MARRUTACT))
|
||||||
|
return CLASS_TYPE_SORCERER;
|
||||||
|
if (nClass == CLASS_TYPE_FEY
|
||||||
|
&& GetRacialType(oPC) == RACIAL_TYPE_GLOURA)
|
||||||
|
return CLASS_TYPE_BARD;
|
||||||
|
|
||||||
|
return nClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,21 +98,9 @@ void OpenNUILevelUpWindow(int nClass, object oPC=OBJECT_SELF);
|
|||||||
//
|
//
|
||||||
// CloseNUILevelUpWindow
|
// CloseNUILevelUpWindow
|
||||||
// Closes the NUI Level Up Window if its open
|
// Closes the NUI Level Up Window if its open
|
||||||
|
// setting reset to 1 will make it clear the entire cache as if the NUI was never opened
|
||||||
//
|
//
|
||||||
void CloseNUILevelUpWindow(object oPC=OBJECT_SELF);
|
void CloseNUILevelUpWindow(object oPC=OBJECT_SELF, int reset=0);
|
||||||
|
|
||||||
//
|
|
||||||
// GetTrueClassType
|
|
||||||
// Gets the true class Id for a provided class Id, mostly for RHD and for
|
|
||||||
// ToB prestige classes
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// nClass:int classId
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// int the true classId based off nClass
|
|
||||||
//
|
|
||||||
int GetTrueClassType(int nClass, object oPC=OBJECT_SELF);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// GetRemainingSpellChoices
|
// GetRemainingSpellChoices
|
||||||
@@ -432,7 +420,7 @@ json GetChosenReplaceListObject(object oPC=OBJECT_SELF);
|
|||||||
// Returns:
|
// Returns:
|
||||||
// int:Boolean TRUE if the spell is a expanded knowledge spell, FALSE otherwise
|
// int:Boolean TRUE if the spell is a expanded knowledge spell, FALSE otherwise
|
||||||
//
|
//
|
||||||
int IsExpKnowledgePower(int nClass, int spellbookId);
|
int IsExpKnowledgePower(int nClass, int spellbookId, object oPC=OBJECT_SELF);
|
||||||
|
|
||||||
//
|
//
|
||||||
// GetExpKnowledgePowerListRequired
|
// GetExpKnowledgePowerListRequired
|
||||||
@@ -861,7 +849,7 @@ void AddSpellToChosenList(int nClass, int spellbookId, int spellCircle, object o
|
|||||||
// if the power is a expanded knowledge than we immediatly add it to the
|
// if the power is a expanded knowledge than we immediatly add it to the
|
||||||
// extra list, otherwise check to make sure we have made all choices in our
|
// extra list, otherwise check to make sure we have made all choices in our
|
||||||
// base list first before adding it to the extra list.
|
// base list first before adding it to the extra list.
|
||||||
if (IsExpKnowledgePower(nClass, spellbookId)
|
if (IsExpKnowledgePower(nClass, spellbookId, oPC)
|
||||||
|| GetRemainingPowerChoices(nClass, spellCircle, oPC, FALSE) == 0)
|
|| GetRemainingPowerChoices(nClass, spellCircle, oPC, FALSE) == 0)
|
||||||
{
|
{
|
||||||
string sFile = GetClassSpellbookFile(nClass);
|
string sFile = GetClassSpellbookFile(nClass);
|
||||||
@@ -975,8 +963,7 @@ void RemoveSpellFromChosenList(int nClass, int spellbookId, int spellCircle, obj
|
|||||||
// for psionics we need to check if the removed spell was a expanded knowledge choice
|
// for psionics we need to check if the removed spell was a expanded knowledge choice
|
||||||
// or not. The id of the list is -1 or -2.
|
// or not. The id of the list is -1 or -2.
|
||||||
int i;
|
int i;
|
||||||
//for (i == -1; i >= -2; i--)
|
for (i == -1; i >= -2; i--)
|
||||||
for (i = -1; i >= -2; i--)
|
|
||||||
{
|
{
|
||||||
json expList = (i == -1) ? GetExpandedChoicesList(nClass, oPC) :
|
json expList = (i == -1) ? GetExpandedChoicesList(nClass, oPC) :
|
||||||
GetEpicExpandedChoicesList(nClass, oPC);
|
GetEpicExpandedChoicesList(nClass, oPC);
|
||||||
@@ -1062,53 +1049,20 @@ void OpenNUILevelUpWindow(int nClass, object oPC=OBJECT_SELF)
|
|||||||
// figure out what the true base class is (mostly true for RHD)
|
// figure out what the true base class is (mostly true for RHD)
|
||||||
int chosenClass = GetTrueClassType(nClass, oPC);
|
int chosenClass = GetTrueClassType(nClass, oPC);
|
||||||
SetLocalInt(oPC, NUI_LEVEL_UP_SELECTED_CLASS_VAR, chosenClass);
|
SetLocalInt(oPC, NUI_LEVEL_UP_SELECTED_CLASS_VAR, chosenClass);
|
||||||
|
|
||||||
ExecuteScript("prc_nui_lv_view", oPC);
|
ExecuteScript("prc_nui_lv_view", oPC);
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetTrueClassType(int nClass, object oPC=OBJECT_SELF)
|
void CloseNUILevelUpWindow(object oPC=OBJECT_SELF, int reset=0)
|
||||||
{
|
|
||||||
if (nClass == CLASS_TYPE_JADE_PHOENIX_MAGE
|
|
||||||
|| nClass == CLASS_TYPE_MASTER_OF_NINE
|
|
||||||
|| nClass == CLASS_TYPE_DEEPSTONE_SENTINEL
|
|
||||||
|| nClass == CLASS_TYPE_BLOODCLAW_MASTER
|
|
||||||
|| nClass == CLASS_TYPE_RUBY_VINDICATOR
|
|
||||||
|| nClass == CLASS_TYPE_ETERNAL_BLADE
|
|
||||||
|| nClass == CLASS_TYPE_SHADOW_SUN_NINJA)
|
|
||||||
{
|
|
||||||
int trueClass = GetPrimaryBladeMagicClass(oPC);
|
|
||||||
return trueClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((nClass == CLASS_TYPE_SHAPECHANGER
|
|
||||||
&& GetRacialType(oPC) == RACIAL_TYPE_ARANEA)
|
|
||||||
|| (nClass == CLASS_TYPE_OUTSIDER
|
|
||||||
&& GetRacialType(oPC) == RACIAL_TYPE_RAKSHASA)
|
|
||||||
|| (nClass == CLASS_TYPE_ABERRATION
|
|
||||||
&& GetRacialType(oPC) == RACIAL_TYPE_DRIDER)
|
|
||||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
|
||||||
&& GetRacialType(oPC) == RACIAL_TYPE_ARKAMOI)
|
|
||||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
|
||||||
&& GetRacialType(oPC) == RACIAL_TYPE_HOBGOBLIN_WARSOUL)
|
|
||||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
|
||||||
&& GetRacialType(oPC) == RACIAL_TYPE_REDSPAWN_ARCANISS)
|
|
||||||
|| (nClass == CLASS_TYPE_MONSTROUS
|
|
||||||
&& GetRacialType(oPC) == RACIAL_TYPE_MARRUTACT))
|
|
||||||
return CLASS_TYPE_SORCERER;
|
|
||||||
if (nClass == CLASS_TYPE_FEY
|
|
||||||
&& GetRacialType(oPC) == RACIAL_TYPE_GLOURA)
|
|
||||||
return CLASS_TYPE_BARD;
|
|
||||||
|
|
||||||
return nClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CloseNUILevelUpWindow(object oPC=OBJECT_SELF)
|
|
||||||
{
|
{
|
||||||
int currentClass = GetLocalInt(oPC, NUI_LEVEL_UP_SELECTED_CLASS_VAR);
|
int currentClass = GetLocalInt(oPC, NUI_LEVEL_UP_SELECTED_CLASS_VAR);
|
||||||
// if we are refreshing the NUI but not finished we need to clear some caching done
|
// if we are refreshing the NUI but not finished we need to clear some caching done
|
||||||
// to save computation time as they will need to be reprocessed.
|
// to save computation time as they will need to be reprocessed.
|
||||||
DeleteLocalJson(oPC, NUI_LEVEL_UP_DISCIPLINE_INFO_VAR + IntToString(currentClass));
|
DeleteLocalJson(oPC, NUI_LEVEL_UP_DISCIPLINE_INFO_VAR + IntToString(currentClass));
|
||||||
SetLocalInt(oPC, NUI_LEVEL_UP_REMAINING_CHOICES_CACHE_VAR, -20);
|
SetLocalInt(oPC, NUI_LEVEL_UP_REMAINING_CHOICES_CACHE_VAR, -20);
|
||||||
|
if (reset)
|
||||||
|
{
|
||||||
|
ClearLevelUpNUICaches(currentClass, oPC);
|
||||||
|
}
|
||||||
int nPreviousToken = NuiFindWindow(oPC, NUI_LEVEL_UP_WINDOW_ID);
|
int nPreviousToken = NuiFindWindow(oPC, NUI_LEVEL_UP_WINDOW_ID);
|
||||||
if (nPreviousToken != 0)
|
if (nPreviousToken != 0)
|
||||||
{
|
{
|
||||||
@@ -1127,7 +1081,7 @@ int ShouldSpellButtonBeEnabled(int nClass, int circleLevel, int spellbookId, obj
|
|||||||
|
|
||||||
// if its an expanded knowledge choice and we have already made all our
|
// if its an expanded knowledge choice and we have already made all our
|
||||||
// exp knowledge choices then it needs to be disabled.
|
// exp knowledge choices then it needs to be disabled.
|
||||||
if (IsExpKnowledgePower(nClass, spellbookId))
|
if (IsExpKnowledgePower(nClass, spellbookId, oPC))
|
||||||
{
|
{
|
||||||
int remainingExp = GetRemainingExpandedChoices(nClass, POWER_LIST_EXP_KNOWLEDGE, oPC)
|
int remainingExp = GetRemainingExpandedChoices(nClass, POWER_LIST_EXP_KNOWLEDGE, oPC)
|
||||||
+ GetRemainingExpandedChoices(nClass, POWER_LIST_EPIC_EXP_KNOWLEDGE, oPC);
|
+ GetRemainingExpandedChoices(nClass, POWER_LIST_EPIC_EXP_KNOWLEDGE, oPC);
|
||||||
@@ -1540,7 +1494,7 @@ int GetRemainingSpellChoices(int nClass, int circleLevel, object oPC=OBJECT_SELF
|
|||||||
// default logic for spont casters
|
// default logic for spont casters
|
||||||
totalSpellsKnown = GetSpellKnownMaxCount(casterLevel, circleLevel, nClass, oPC);
|
totalSpellsKnown = GetSpellKnownMaxCount(casterLevel, circleLevel, nClass, oPC);
|
||||||
// Favoured Soul has more 0 choices than there are spells for some reason
|
// Favoured Soul has more 0 choices than there are spells for some reason
|
||||||
if (nClass == CLASS_TYPE_FAVOURED_SOUL && circleLevel == 0 && totalSpellsKnown > 7)
|
if (nClass == CLASS_TYPE_FAVOURED_SOUL && circleLevel == 0 && totalSpellsKnown > 6)
|
||||||
totalSpellsKnown = 7;
|
totalSpellsKnown = 7;
|
||||||
|
|
||||||
// logic for spont casters
|
// logic for spont casters
|
||||||
@@ -1555,6 +1509,7 @@ int GetRemainingSpellChoices(int nClass, int circleLevel, object oPC=OBJECT_SELF
|
|||||||
|
|
||||||
if (chosenCircle == circleLevel)
|
if (chosenCircle == circleLevel)
|
||||||
SetLocalInt(oPC, NUI_LEVEL_UP_REMAINING_CHOICES_CACHE_VAR, remainingChoices);
|
SetLocalInt(oPC, NUI_LEVEL_UP_REMAINING_CHOICES_CACHE_VAR, remainingChoices);
|
||||||
|
if (DEBUG) DoDebug("Remaining spell choices is " + IntToString(remainingChoices));
|
||||||
return remainingChoices;
|
return remainingChoices;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1567,22 +1522,9 @@ void FinishLevelUp(int nClass, object oPC=OBJECT_SELF)
|
|||||||
int nLevel = GetLevelByClass(nClass, oPC);
|
int nLevel = GetLevelByClass(nClass, oPC);
|
||||||
SetPersistantLocalInt(oPC, "LastSpellGainLevel", nLevel);
|
SetPersistantLocalInt(oPC, "LastSpellGainLevel", nLevel);
|
||||||
}
|
}
|
||||||
CloseNUILevelUpWindow(oPC); // Close while selected-class var is still set
|
|
||||||
ClearLevelUpNUICaches(nClass, oPC);
|
ClearLevelUpNUICaches(nClass, oPC);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* void FinishLevelUp(int nClass, object oPC=OBJECT_SELF)
|
|
||||||
{
|
|
||||||
RemoveSpells(nClass, oPC);
|
|
||||||
LearnSpells(nClass, oPC);
|
|
||||||
if (nClass == CLASS_TYPE_ARCHIVIST)
|
|
||||||
{
|
|
||||||
int nLevel = GetLevelByClass(nClass, oPC);
|
|
||||||
SetPersistantLocalInt(oPC, "LastSpellGainLevel", nLevel);
|
|
||||||
}
|
|
||||||
ClearLevelUpNUICaches(nClass, oPC);
|
|
||||||
} */
|
|
||||||
|
|
||||||
void ClearLevelUpNUICaches(int nClass, object oPC=OBJECT_SELF)
|
void ClearLevelUpNUICaches(int nClass, object oPC=OBJECT_SELF)
|
||||||
{
|
{
|
||||||
// clear the chosen spells you made
|
// clear the chosen spells you made
|
||||||
@@ -1678,11 +1620,13 @@ void RemoveSpells(int nClass, object oPC=OBJECT_SELF)
|
|||||||
{
|
{
|
||||||
string sFile = GetClassSpellbookFile(nClass);
|
string sFile = GetClassSpellbookFile(nClass);
|
||||||
string sSpellBook = GetSpellsKnown_Array(nClass);
|
string sSpellBook = GetSpellsKnown_Array(nClass);
|
||||||
|
string spellsAtLevelList = "SpellsKnown_" + IntToString(nClass) + "_AtLevel" + IntToString(GetHitDice(oPC));
|
||||||
// remove the spell from the spellbook
|
// remove the spell from the spellbook
|
||||||
array_extract_int(oPC, sSpellBook, nSpellbookID);
|
array_extract_int(oPC, sSpellBook, nSpellbookID);
|
||||||
|
array_extract_int(oPC, spellsAtLevelList, nSpellbookID);
|
||||||
// wipe the spell from the player
|
// wipe the spell from the player
|
||||||
int ipFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", nSpellbookID));
|
int ipFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", nSpellbookID));
|
||||||
WipeSpellFromHide(ipFeatID, oPC);
|
RemoveIPFeat(oPC, ipFeatID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1793,6 +1737,7 @@ void LearnSpells(int nClass, object oPC=OBJECT_SELF)
|
|||||||
|
|
||||||
// get location of persistant storage on the hide
|
// get location of persistant storage on the hide
|
||||||
string sSpellbook = GetSpellsKnown_Array(nClass, nSpellLevel);
|
string sSpellbook = GetSpellsKnown_Array(nClass, nSpellLevel);
|
||||||
|
if (DEBUG) DoDebug("Adding spell " + IntToString(nSpellbookID) + "to " + sSpellbook);
|
||||||
//object oToken = GetHideToken(oPC);
|
//object oToken = GetHideToken(oPC);
|
||||||
|
|
||||||
// Create spells known persistant array if it is missing
|
// Create spells known persistant array if it is missing
|
||||||
@@ -1803,13 +1748,25 @@ void LearnSpells(int nClass, object oPC=OBJECT_SELF)
|
|||||||
nSize = 0;
|
nSize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string spellsAtLevelList = "SpellsKnown_" + IntToString(nClass) + "_AtLevel" + IntToString(GetHitDice(oPC));
|
||||||
|
int spellsAtLevelSize = persistant_array_get_size(oPC, spellsAtLevelList);
|
||||||
|
if (spellsAtLevelSize < 0)
|
||||||
|
{
|
||||||
|
persistant_array_create(oPC, spellsAtLevelList);
|
||||||
|
spellsAtLevelSize = 0;
|
||||||
|
}
|
||||||
|
// set the list of spells learned at this level
|
||||||
|
string sFile = GetClassSpellbookFile(nClass);
|
||||||
|
int spellId = StringToInt(Get2DACache(sFile, "SpellID", nSpellbookID));
|
||||||
|
persistant_array_set_int(oPC, spellsAtLevelList, spellsAtLevelSize, spellId);
|
||||||
|
if (DEBUG) DoDebug("Adding spells to array " + spellsAtLevelList);
|
||||||
|
|
||||||
// Mark the spell as known (e.g. add it to the end of oPCs spellbook)
|
// Mark the spell as known (e.g. add it to the end of oPCs spellbook)
|
||||||
persistant_array_set_int(oPC, sSpellbook, nSize, nSpellbookID);
|
persistant_array_set_int(oPC, sSpellbook, nSize, nSpellbookID);
|
||||||
|
|
||||||
if (nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS)
|
if (nSpellbookType == SPELLBOOK_TYPE_SPONTANEOUS)
|
||||||
{
|
{
|
||||||
// add spell
|
// add spell
|
||||||
string sFile = GetClassSpellbookFile(nClass);
|
|
||||||
string sArrayName = "NewSpellbookMem_" + IntToString(nClass);
|
string sArrayName = "NewSpellbookMem_" + IntToString(nClass);
|
||||||
int featId = StringToInt(Get2DACache(sFile, "FeatID", nSpellbookID));
|
int featId = StringToInt(Get2DACache(sFile, "FeatID", nSpellbookID));
|
||||||
int ipFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", nSpellbookID));
|
int ipFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", nSpellbookID));
|
||||||
@@ -1989,7 +1946,7 @@ void RemoveSpellKnown(int nClass, int spellbookId, object oPC=OBJECT_SELF, int n
|
|||||||
//if we could not find the spell here, something went wrong
|
//if we could not find the spell here, something went wrong
|
||||||
if (persistant_array_extract_int(oPC, sTestArray, spellID) < 0)
|
if (persistant_array_extract_int(oPC, sTestArray, spellID) < 0)
|
||||||
{
|
{
|
||||||
SendMessageToPC(oPC, "Could not find spellID " + IntToString(spellID) + " in the class's spellbook!");
|
if (DEBUG) DoDebug("Could not find spellID " + IntToString(spellID) + " in the class's spellbook!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2016,10 +1973,7 @@ void RemoveSpellKnown(int nClass, int spellbookId, object oPC=OBJECT_SELF, int n
|
|||||||
|
|
||||||
// remove spell from player
|
// remove spell from player
|
||||||
int ipFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", spellbookId));
|
int ipFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", spellbookId));
|
||||||
itemproperty ipFeat = PRCItemPropertyBonusFeat(ipFeatID);
|
RemoveIPFeat(oPC, ipFeatID);
|
||||||
object oSkin = GetPCSkin(oPC);
|
|
||||||
RemoveItemProperty(oSkin, ipFeat);
|
|
||||||
CheckAndRemoveFeat(oSkin, ipFeat);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
json GetSpellIDsKnown(int nClass, object oPC=OBJECT_SELF, int nList=0)
|
json GetSpellIDsKnown(int nClass, object oPC=OBJECT_SELF, int nList=0)
|
||||||
@@ -2102,7 +2056,7 @@ string ReasonForDisabledSpell(int nClass, int spellbookId, object oPC=OBJECT_SEL
|
|||||||
|
|
||||||
// if its an expanded knowledge choice and we have already made all our
|
// if its an expanded knowledge choice and we have already made all our
|
||||||
// exp knowledge choices then it needs to be disabled.
|
// exp knowledge choices then it needs to be disabled.
|
||||||
if (IsExpKnowledgePower(nClass, spellbookId))
|
if (IsExpKnowledgePower(nClass, spellbookId, oPC))
|
||||||
{
|
{
|
||||||
int remainingExp = GetRemainingExpandedChoices(nClass, POWER_LIST_EXP_KNOWLEDGE, oPC)
|
int remainingExp = GetRemainingExpandedChoices(nClass, POWER_LIST_EXP_KNOWLEDGE, oPC)
|
||||||
+ GetRemainingExpandedChoices(nClass, POWER_LIST_EPIC_EXP_KNOWLEDGE, oPC);
|
+ GetRemainingExpandedChoices(nClass, POWER_LIST_EPIC_EXP_KNOWLEDGE, oPC);
|
||||||
@@ -2336,11 +2290,15 @@ json GetChosenReplaceListObject(object oPC=OBJECT_SELF)
|
|||||||
////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
int IsExpKnowledgePower(int nClass, int spellbookId)
|
int IsExpKnowledgePower(int nClass, int spellbookId, object oPC=OBJECT_SELF)
|
||||||
{
|
{
|
||||||
string sFile = GetClassSpellbookFile(nClass);
|
string sFile = GetClassSpellbookFile(nClass);
|
||||||
int isExp = StringToInt(Get2DACache(sFile, "Exp", spellbookId));
|
int isExp = StringToInt(Get2DACache(sFile, "Exp", spellbookId));
|
||||||
return isExp;
|
if (isExp)
|
||||||
|
return TRUE;
|
||||||
|
int featId = StringToInt(Get2DACache(sFile, "FeatID", spellbookId));
|
||||||
|
int isOuterDomain = (featId) ? !CheckPowerPrereqs(featId, oPC) : FALSE;
|
||||||
|
return isOuterDomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
json GetCurrentPowerList(object oPC=OBJECT_SELF)
|
json GetCurrentPowerList(object oPC=OBJECT_SELF)
|
||||||
@@ -2360,12 +2318,8 @@ int ShouldAddPower(int nClass, int spellbookId, object oPC=OBJECT_SELF)
|
|||||||
string sFile = GetClassSpellbookFile(nClass);
|
string sFile = GetClassSpellbookFile(nClass);
|
||||||
int featId = StringToInt(Get2DACache(sFile, "FeatID", spellbookId));
|
int featId = StringToInt(Get2DACache(sFile, "FeatID", spellbookId));
|
||||||
int isExp = StringToInt(Get2DACache(sFile, "Exp", spellbookId));
|
int isExp = StringToInt(Get2DACache(sFile, "Exp", spellbookId));
|
||||||
// if you don't have the prereqs for a power then don't add it. Specific for
|
|
||||||
// psions
|
|
||||||
if (!CheckPowerPrereqs(featId, oPC))
|
|
||||||
return FALSE;
|
|
||||||
// if the power is a expanded knowledge power
|
// if the power is a expanded knowledge power
|
||||||
if (isExp)
|
if (!CheckPowerPrereqs(featId, oPC) || isExp)
|
||||||
{
|
{
|
||||||
// and we have a expanded knowledge choice left to make then show
|
// and we have a expanded knowledge choice left to make then show
|
||||||
// the button
|
// the button
|
||||||
@@ -2374,10 +2328,12 @@ int ShouldAddPower(int nClass, int spellbookId, object oPC=OBJECT_SELF)
|
|||||||
int currentCircle = GetLocalInt(oPC, NUI_LEVEL_UP_SELECTED_CIRCLE_VAR);
|
int currentCircle = GetLocalInt(oPC, NUI_LEVEL_UP_SELECTED_CIRCLE_VAR);
|
||||||
|
|
||||||
int choicesLeft = GetRemainingExpandedChoices(nClass, POWER_LIST_EXP_KNOWLEDGE, oPC);
|
int choicesLeft = GetRemainingExpandedChoices(nClass, POWER_LIST_EXP_KNOWLEDGE, oPC);
|
||||||
|
if (DEBUG) DoDebug("You still have " + IntToString(choicesLeft) + " expanded power choices left!");
|
||||||
if (choicesLeft && (currentCircle <= (maxLevel-1)))
|
if (choicesLeft && (currentCircle <= (maxLevel-1)))
|
||||||
addPower = TRUE;
|
addPower = TRUE;
|
||||||
choicesLeft = GetRemainingExpandedChoices(nClass, POWER_LIST_EPIC_EXP_KNOWLEDGE, oPC);
|
choicesLeft = GetRemainingExpandedChoices(nClass, POWER_LIST_EPIC_EXP_KNOWLEDGE, oPC);
|
||||||
if (choicesLeft)
|
if (DEBUG) DoDebug("You still have " + IntToString(choicesLeft) + " epic expanded power choices left!");
|
||||||
|
if (choicesLeft && (currentCircle <= (maxLevel-1)))
|
||||||
addPower = TRUE;
|
addPower = TRUE;
|
||||||
// otherwise don't show the button.
|
// otherwise don't show the button.
|
||||||
return addPower;
|
return addPower;
|
||||||
@@ -2397,7 +2353,7 @@ void LearnPowers(int nClass, object oPC=OBJECT_SELF)
|
|||||||
int nSpellbookID = JsonGetInt(JsonArrayGet(powerList, i));
|
int nSpellbookID = JsonGetInt(JsonArrayGet(powerList, i));
|
||||||
// get the expanded knowledge list we are adding to if any
|
// get the expanded knowledge list we are adding to if any
|
||||||
int expKnow = GetExpKnowledgePowerListRequired(nClass, nSpellbookID, oPC);
|
int expKnow = GetExpKnowledgePowerListRequired(nClass, nSpellbookID, oPC);
|
||||||
AddPowerKnown(oPC, nClass, nSpellbookID, TRUE, GetManifesterLevel(oPC, nClass, TRUE), expKnow);
|
AddPowerKnown(oPC, nClass, nSpellbookID, TRUE, GetHitDice(oPC), expKnow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3180,13 +3136,18 @@ json GetInvokerKnownListObject(int nClass, object oPC=OBJECT_SELF)
|
|||||||
}
|
}
|
||||||
|
|
||||||
SetLocalJson(oPC, NUI_LEVEL_UP_KNOWN_INVOCATIONS_CACHE_VAR + IntToString(nClass), knownObject);
|
SetLocalJson(oPC, NUI_LEVEL_UP_KNOWN_INVOCATIONS_CACHE_VAR + IntToString(nClass), knownObject);
|
||||||
|
if (DEBUG) DoDebug("Printing json representation of allowed invocations for class " + IntToString(nClass));
|
||||||
|
if (DEBUG) DoDebug(JsonDump(knownObject, 2));
|
||||||
return knownObject;
|
return knownObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GetRemainingInvocationChoices(int nClass, int chosenCircle, object oPC=OBJECT_SELF, int extra=TRUE)
|
int GetRemainingInvocationChoices(int nClass, int chosenCircle, object oPC=OBJECT_SELF, int extra=TRUE)
|
||||||
{
|
{
|
||||||
|
if (DEBUG) DoDebug ("Getting remaining invocation choices at " + IntToString(chosenCircle) + " circle");
|
||||||
int remaining = 0;
|
int remaining = 0;
|
||||||
int nLevel = GetInvokerLevel(oPC, nClass);
|
int nLevel = GetInvokerLevel(oPC, nClass);
|
||||||
|
if (nClass == CLASS_TYPE_DRAGON_SHAMAN) nLevel = GetLevelByClass(nClass, oPC);
|
||||||
|
if (DEBUG) DoDebug("Invoker level is " + IntToString(nLevel));
|
||||||
|
|
||||||
json knownObject = GetInvokerKnownListObject(nClass, oPC);
|
json knownObject = GetInvokerKnownListObject(nClass, oPC);
|
||||||
json chosenInv = GetChosenSpellListObject(nClass, oPC);
|
json chosenInv = GetChosenSpellListObject(nClass, oPC);
|
||||||
@@ -3214,8 +3175,10 @@ int GetRemainingInvocationChoices(int nClass, int chosenCircle, object oPC=OBJEC
|
|||||||
currentChosen += 1;
|
currentChosen += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (DEBUG) DoDebug(IntToString(currentChosen) + " incantations chosen at " + IntToString(chosenCircle) + " circle");
|
||||||
|
|
||||||
int allowedAtCircle = JsonGetInt(JsonObjectGet(currentLevelKnown, IntToString(i)));
|
int allowedAtCircle = JsonGetInt(JsonObjectGet(currentLevelKnown, IntToString(i)));
|
||||||
|
if (DEBUG) DoDebug(IntToString(allowedAtCircle) + " incantations allowed at " + IntToString(chosenCircle) + " circle");
|
||||||
|
|
||||||
remaining = (allowedAtCircle - currentChosen + remaining);
|
remaining = (allowedAtCircle - currentChosen + remaining);
|
||||||
// if the circle is below the chosen circle and we have a positive remaining,
|
// if the circle is below the chosen circle and we have a positive remaining,
|
||||||
|
|||||||
@@ -1615,14 +1615,124 @@ int IPGetDamageBonusConstantFromNumber(int nNumber)
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void IPWildShapeCopyItemProperties(object oOld, object oNew, int bWeapon = FALSE)
|
void IPWildShapeCopyItemProperties(object oOld, object oNew, int bWeapon = FALSE)
|
||||||
{
|
{
|
||||||
if (GetIsObjectValid(oOld) && GetIsObjectValid(oNew))
|
// Invalid source/target
|
||||||
|
if (!GetIsObjectValid(oOld) || !GetIsObjectValid(oNew))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Determine possessor
|
||||||
|
object oPC = GetItemPossessor(oOld);
|
||||||
|
if (!GetIsObjectValid(oPC))
|
||||||
|
oPC = GetItemPossessor(oNew);
|
||||||
|
|
||||||
|
if (!GetIsObjectValid(oPC))
|
||||||
{
|
{
|
||||||
|
if (DEBUG) DoDebug("IPWS: Unable to determine item possessor");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine glove state once
|
||||||
|
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||||
|
|
||||||
|
// Weapon ranged mismatch = do nothing (intent is no partial copy)
|
||||||
|
if (bWeapon && GetWeaponRanged(oOld) != GetWeaponRanged(oNew))
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("IPWS: Weapon ranged mismatch <20> skipping all IP copy");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin property copy
|
||||||
|
itemproperty ip = GetFirstItemProperty(oOld);
|
||||||
|
while (GetIsItemPropertyValid(ip))
|
||||||
|
{
|
||||||
|
int nType = GetItemPropertyType(ip);
|
||||||
|
|
||||||
|
// If copying from gloves and monk gloves are active
|
||||||
|
if (bMonkGloves
|
||||||
|
&& (nType == ITEM_PROPERTY_DAMAGE_BONUS
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP))
|
||||||
|
{
|
||||||
|
// Always apply glove damage IPs
|
||||||
|
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||||
|
ip = GetNextItemProperty(oOld);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normal weapon pass
|
||||||
|
if (bWeapon)
|
||||||
|
{
|
||||||
|
// If monk gloves active ? skip ALL weapon damage IPs
|
||||||
|
if (bMonkGloves
|
||||||
|
&& (nType == ITEM_PROPERTY_DAMAGE_BONUS
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP))
|
||||||
|
{
|
||||||
|
ip = GetNextItemProperty(oOld);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||||
|
}
|
||||||
|
|
||||||
|
ip = GetNextItemProperty(oOld);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* // ----------------------------------------------------------------------------
|
||||||
|
// GZ, Sept. 30 2003
|
||||||
|
// Special Version of Copy Item Properties for use with greater wild shape
|
||||||
|
// oOld - Item equipped before polymorphing (source for item props)
|
||||||
|
// oNew - Item equipped after polymorphing (target for item props)
|
||||||
|
// bWeapon - Must be set TRUE when oOld is a weapon.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void IPWildShapeCopyItemProperties(object oOld, object oNew, int bWeapon = FALSE)
|
||||||
|
{
|
||||||
|
if (!GetIsObjectValid(oOld) || !GetIsObjectValid(oNew))
|
||||||
|
return;
|
||||||
|
|
||||||
|
object oPC = GetItemPossessor(oOld);
|
||||||
|
if (!GetIsObjectValid(oPC))
|
||||||
|
{
|
||||||
|
oPC = GetItemPossessor(oNew);
|
||||||
|
}
|
||||||
|
if (!GetIsObjectValid(oPC))
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("IPWS: Unable to determine item possessor");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||||
|
|
||||||
itemproperty ip = GetFirstItemProperty(oOld);
|
itemproperty ip = GetFirstItemProperty(oOld);
|
||||||
while (GetIsItemPropertyValid(ip))
|
while (GetIsItemPropertyValid(ip))
|
||||||
{
|
{
|
||||||
if (bWeapon)
|
if (bWeapon)
|
||||||
{
|
{
|
||||||
if (GetWeaponRanged(oOld) == GetWeaponRanged(oNew) )
|
// Gloves override weapon damage <20> skip weapon damage properties
|
||||||
|
if (bMonkGloves)
|
||||||
|
{
|
||||||
|
int nType = GetItemPropertyType(ip);
|
||||||
|
|
||||||
|
// skip damage props
|
||||||
|
if (nType == ITEM_PROPERTY_DAMAGE_BONUS
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP)
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("IPWS: SKIPPED weapon damage IP");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("IPWS: Applied non-damage weapon IP");
|
||||||
|
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (GetWeaponRanged(oOld) == GetWeaponRanged(oNew) )
|
||||||
{
|
{
|
||||||
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
||||||
}
|
}
|
||||||
@@ -1631,11 +1741,10 @@ void IPWildShapeCopyItemProperties(object oOld, object oNew, int bWeapon = FALSE
|
|||||||
{
|
{
|
||||||
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
||||||
}
|
}
|
||||||
ip = GetNextItemProperty(oOld);
|
|
||||||
|
|
||||||
|
ip = GetNextItemProperty(oOld);
|
||||||
}
|
}
|
||||||
}
|
} */
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Returns the current enhancement bonus of a weapon (+1 to +20), 0 if there is
|
// Returns the current enhancement bonus of a weapon (+1 to +20), 0 if there is
|
||||||
@@ -2019,3 +2128,5 @@ int IPOnHitSaveDC(int nSaveDC)
|
|||||||
|
|
||||||
return nIPBonus;
|
return nIPBonus;
|
||||||
} */
|
} */
|
||||||
|
|
||||||
|
//:: void main(){}
|
||||||
@@ -93,9 +93,8 @@ void GainPowerPoints(object oChar, int nGain, int bCanExceedMax = FALSE, int bIn
|
|||||||
* @param bInform If TRUE, runs TellCharacterPowerPointStatus() on oChar
|
* @param bInform If TRUE, runs TellCharacterPowerPointStatus() on oChar
|
||||||
* after making the modification.
|
* after making the modification.
|
||||||
*/
|
*/
|
||||||
/*
|
|
||||||
void GainTemporaryPowerPoints(object oChar, int nGain, float fDuration, int bInform = TRUE);
|
void GainTemporaryPowerPoints(object oChar, int nGain, float fDuration, int bInform = TRUE);
|
||||||
*/
|
|
||||||
/**
|
/**
|
||||||
* Decreases the character's current power point count by up to the given
|
* Decreases the character's current power point count by up to the given
|
||||||
* amount, limited to not going below 0.
|
* amount, limited to not going below 0.
|
||||||
|
|||||||
@@ -37,6 +37,8 @@
|
|||||||
/* Function prototypes */
|
/* Function prototypes */
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void CheckIfDeleveled(object oPC);
|
||||||
|
void UpdateLastKnownLevels(object oPC);
|
||||||
void CheckSpellbooks(object oPC);
|
void CheckSpellbooks(object oPC);
|
||||||
void CheckPsionics(object oPC);
|
void CheckPsionics(object oPC);
|
||||||
void CheckInvocations(object oPC);
|
void CheckInvocations(object oPC);
|
||||||
@@ -71,9 +73,72 @@ void main()
|
|||||||
eTest = GetNextEffect(oPC);
|
eTest = GetNextEffect(oPC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CheckIfDeleveled(oPC);
|
||||||
|
|
||||||
DelayCommand(0.0f, CheckSpellbooks(oPC));
|
DelayCommand(0.0f, CheckSpellbooks(oPC));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CheckIfDeleveled(object oPC)
|
||||||
|
{
|
||||||
|
int lastKnownLevel = GetPersistantLocalInt(oPC, "PCLastKnownLevel");
|
||||||
|
int currentLevel = GetHitDice(oPC);
|
||||||
|
if (lastKnownLevel > 0 && currentLevel < lastKnownLevel)
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("The player has de-leveled, checking spells!");
|
||||||
|
json changedClassList = JsonArray();
|
||||||
|
int i;
|
||||||
|
for (i = 1; i <= 8; i++)
|
||||||
|
{
|
||||||
|
int storedClass = GetPersistantLocalInt(oPC, "PCLastKnownClass" + IntToString(i));
|
||||||
|
if (storedClass && storedClass != CLASS_TYPE_INVALID)
|
||||||
|
{
|
||||||
|
int storedLevel = GetPersistantLocalInt(oPC, "PCLastKnownClass" + IntToString(i) + "Levels");
|
||||||
|
int nClass = GetClassByPosition(i, oPC);
|
||||||
|
int currentClassLevels = (GetIsArcaneClass(nClass, oPC) || GetIsDivineClass(nClass, oPC))
|
||||||
|
? GetPrCAdjustedClassLevel(nClass, oPC) : GetLevelByClass(nClass, oPC);
|
||||||
|
if (nClass == CLASS_TYPE_INVALID
|
||||||
|
|| (nClass == storedClass && storedLevel != currentClassLevels))
|
||||||
|
{
|
||||||
|
DoDebug("Class " + IntToString(storedClass) + " lost levels!");
|
||||||
|
changedClassList = JsonArrayInsert(changedClassList, JsonInt(storedClass));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = lastKnownLevel; i > currentLevel; i--)
|
||||||
|
{
|
||||||
|
int totalChangedClasses = JsonGetLength(changedClassList);
|
||||||
|
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < totalChangedClasses; j++)
|
||||||
|
{
|
||||||
|
int nClass = JsonGetInt(JsonArrayGet(changedClassList, j));
|
||||||
|
DelayCommand(0.0f, CallSpellUnlevelScript(oPC, nClass, i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(DEBUG) DoDebug("Setting last known player level to " + IntToString(currentLevel));
|
||||||
|
UpdateLastKnownLevels(oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateLastKnownLevels(object oPC)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 1; i <= 8; i++)
|
||||||
|
{
|
||||||
|
int nClass = GetClassByPosition(i, oPC);
|
||||||
|
int classLevel = (GetIsArcaneClass(nClass, oPC) || GetIsDivineClass(nClass, oPC))
|
||||||
|
? GetPrCAdjustedClassLevel(nClass, oPC) : GetLevelByClass(nClass, oPC);
|
||||||
|
|
||||||
|
SetPersistantLocalInt(oPC, "PCLastKnownClass" + IntToString(i), nClass);
|
||||||
|
SetPersistantLocalInt(oPC, "PCLastKnownClass" + IntToString(i) + "Levels", classLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
int currentLevel = GetHitDice(oPC);
|
||||||
|
SetPersistantLocalInt(oPC, "PCLastKnownLevel", currentLevel);
|
||||||
|
}
|
||||||
|
|
||||||
// Handle new spellbooks
|
// Handle new spellbooks
|
||||||
|
|
||||||
void CheckSpellbooks(object oPC)
|
void CheckSpellbooks(object oPC)
|
||||||
|
|||||||
BIN
nwn/nwnprc/trunk/others/bite_pitfiend001.uti
Normal file
BIN
nwn/nwnprc/trunk/others/bite_pitfiend001.uti
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/bite_pitfiend002.uti
Normal file
BIN
nwn/nwnprc/trunk/others/bite_pitfiend002.uti
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/claw_btldvr001.uti
Normal file
BIN
nwn/nwnprc/trunk/others/claw_btldvr001.uti
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/dm_pc_info_tool.uti
Normal file
BIN
nwn/nwnprc/trunk/others/dm_pc_info_tool.uti
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/ep_sum_aberrat01.utc
Normal file
BIN
nwn/nwnprc/trunk/others/ep_sum_aberrat01.utc
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/ep_sum_aberrat02.utc
Normal file
BIN
nwn/nwnprc/trunk/others/ep_sum_aberrat02.utc
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/ep_sum_aberrat03.utc
Normal file
BIN
nwn/nwnprc/trunk/others/ep_sum_aberrat03.utc
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/ep_sum_aberrat04.utc
Normal file
BIN
nwn/nwnprc/trunk/others/ep_sum_aberrat04.utc
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/ep_sum_aberrat05.utc
Normal file
BIN
nwn/nwnprc/trunk/others/ep_sum_aberrat05.utc
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/hide_beholder01.uti
Normal file
BIN
nwn/nwnprc/trunk/others/hide_beholder01.uti
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/hide_btldvr001.uti
Normal file
BIN
nwn/nwnprc/trunk/others/hide_btldvr001.uti
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/hide_pitfiend001.uti
Normal file
BIN
nwn/nwnprc/trunk/others/hide_pitfiend001.uti
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/prc_2d4_slamgrab.uti
Normal file
BIN
nwn/nwnprc/trunk/others/prc_2d4_slamgrab.uti
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/prc_2d6_slamgrab.uti
Normal file
BIN
nwn/nwnprc/trunk/others/prc_2d6_slamgrab.uti
Normal file
Binary file not shown.
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/prc_bite_3d8.uti
Normal file
BIN
nwn/nwnprc/trunk/others/prc_bite_3d8.uti
Normal file
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/prc_scr_1564.uti
Normal file
BIN
nwn/nwnprc/trunk/others/prc_scr_1564.uti
Normal file
Binary file not shown.
Binary file not shown.
BIN
nwn/nwnprc/trunk/others/tent_illithid001.uti
Normal file
BIN
nwn/nwnprc/trunk/others/tent_illithid001.uti
Normal file
Binary file not shown.
Binary file not shown.
@@ -55,13 +55,25 @@ int DoPower(object oManifester, object oTarget, struct manifestation manif)
|
|||||||
// It's a creature, target their primary weapon
|
// It's a creature, target their primary weapon
|
||||||
oTarget = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
|
oTarget = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
|
||||||
}
|
}
|
||||||
// Make sure the target is either weapon or ammo
|
|
||||||
|
// Validate that the target is a weapon or ammunition
|
||||||
|
int bIsWeapon = GetWeaponRanged(oTarget) || IPGetIsMeleeWeapon(oTarget);
|
||||||
|
|
||||||
|
int nBase = GetBaseItemType(oTarget);
|
||||||
|
int bIsAmmo = nBase == BASE_ITEM_ARROW || nBase == BASE_ITEM_BOLT || nBase == BASE_ITEM_BULLET;
|
||||||
|
|
||||||
|
if (!(bIsWeapon || bIsAmmo))
|
||||||
|
{
|
||||||
|
oTarget = OBJECT_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* // Make sure the target is either weapon or ammo
|
||||||
if(!(GetWeaponRanged(oTarget) || IPGetIsMeleeWeapon(oTarget) ||
|
if(!(GetWeaponRanged(oTarget) || IPGetIsMeleeWeapon(oTarget) ||
|
||||||
GetBaseItemType(oTarget) == BASE_ITEM_ARROW ||
|
GetBaseItemType(oTarget) == BASE_ITEM_ARROW ||
|
||||||
GetBaseItemType(oTarget) == BASE_ITEM_BOLT ||
|
GetBaseItemType(oTarget) == BASE_ITEM_BOLT ||
|
||||||
GetBaseItemType(oTarget) == BASE_ITEM_BULLET
|
GetBaseItemType(oTarget) == BASE_ITEM_BULLET
|
||||||
) )
|
) )
|
||||||
oTarget = OBJECT_INVALID;
|
oTarget = OBJECT_INVALID; */
|
||||||
|
|
||||||
// Make sure we have a valid target
|
// Make sure we have a valid target
|
||||||
if(!GetIsObjectValid(oTarget))
|
if(!GetIsObjectValid(oTarget))
|
||||||
|
|||||||
@@ -966,6 +966,17 @@ void main()
|
|||||||
sResRef += GetAffixForSize(nSize);
|
sResRef += GetAffixForSize(nSize);
|
||||||
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
AddNaturalPrimaryWeapon(oPC, sResRef, 2);
|
||||||
}
|
}
|
||||||
|
else if(nRace==RACIAL_TYPE_ZAKYA_RAKSHASA)
|
||||||
|
{
|
||||||
|
string sResRef = "prc_raks_bite_";
|
||||||
|
int nSize = PRCGetCreatureSize(oPC);
|
||||||
|
sResRef += GetAffixForSize(nSize);
|
||||||
|
AddNaturalSecondaryWeapon(oPC, sResRef);
|
||||||
|
//primary weapon
|
||||||
|
sResRef = "prc_claw_1d6l_";
|
||||||
|
sResRef += GetAffixForSize(nSize);
|
||||||
|
AddNaturalPrimaryWeapon(oPC, sResRef, 1);
|
||||||
|
}
|
||||||
else if(nRace==RACIAL_TYPE_LIZARDFOLK)
|
else if(nRace==RACIAL_TYPE_LIZARDFOLK)
|
||||||
{
|
{
|
||||||
string sResRef = "prc_lizf_bite_";
|
string sResRef = "prc_lizf_bite_";
|
||||||
|
|||||||
@@ -8,8 +8,9 @@
|
|||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
//:: Created By: Fox
|
//:: Created By: Fox
|
||||||
//:: Created On: Feb 12, 2008
|
//:: Created On: Feb 12, 2008
|
||||||
|
//:: Updated by: Jaysyn
|
||||||
|
//:: Updated on: 2025-11-25 10:48:32
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
|
|
||||||
void CreateWarforgedArmor(object oPC)
|
void CreateWarforgedArmor(object oPC)
|
||||||
@@ -49,7 +50,7 @@ void CreateWarforgedArmor(object oPC)
|
|||||||
SetDroppableFlag(oHelm, FALSE);
|
SetDroppableFlag(oHelm, FALSE);
|
||||||
SetItemCursedFlag(oHelm, TRUE);
|
SetItemCursedFlag(oHelm, TRUE);
|
||||||
|
|
||||||
// Force equip
|
//:: Force equip
|
||||||
DelayCommand(1.0, AssignCommand(oPC, ActionEquipItem(oArmor, INVENTORY_SLOT_CHEST)));
|
DelayCommand(1.0, AssignCommand(oPC, ActionEquipItem(oArmor, INVENTORY_SLOT_CHEST)));
|
||||||
DelayCommand(1.0, AssignCommand(oPC, ActionEquipItem(oHelm, INVENTORY_SLOT_HEAD)));
|
DelayCommand(1.0, AssignCommand(oPC, ActionEquipItem(oHelm, INVENTORY_SLOT_HEAD)));
|
||||||
}
|
}
|
||||||
@@ -68,13 +69,13 @@ void main()
|
|||||||
int nEvent = GetRunningEvent();
|
int nEvent = GetRunningEvent();
|
||||||
if(DEBUG) DoDebug("race_warforged running, event: " + IntToString(nEvent));
|
if(DEBUG) DoDebug("race_warforged running, event: " + IntToString(nEvent));
|
||||||
|
|
||||||
// Init the PC.
|
//:: Init the PC.
|
||||||
object oPC = OBJECT_SELF;
|
object oPC = OBJECT_SELF;
|
||||||
object oItem;
|
object oItem;
|
||||||
object oArmor;
|
object oArmor;
|
||||||
object oSkin;
|
object oSkin;
|
||||||
|
|
||||||
// We aren't being called from any event, instead from EvalPRCFeats
|
//:: We aren't being called from any event, instead from EvalPRCFeats
|
||||||
if(nEvent == FALSE)
|
if(nEvent == FALSE)
|
||||||
{
|
{
|
||||||
oPC = OBJECT_SELF;
|
oPC = OBJECT_SELF;
|
||||||
@@ -83,7 +84,7 @@ void main()
|
|||||||
|| GetIsObjectValid(GetItemPossessedBy(oPC, "prc_wf_mithbody"))
|
|| GetIsObjectValid(GetItemPossessedBy(oPC, "prc_wf_mithbody"))
|
||||||
|| GetIsObjectValid(GetItemPossessedBy(oPC, "prc_wf_admtbody"))
|
|| GetIsObjectValid(GetItemPossessedBy(oPC, "prc_wf_admtbody"))
|
||||||
|| GetIsObjectValid(GetItemPossessedBy(oPC, "prc_wf_compbody"));
|
|| GetIsObjectValid(GetItemPossessedBy(oPC, "prc_wf_compbody"));
|
||||||
// Hook in the events
|
//:: Hook in the events
|
||||||
if(DEBUG) DoDebug("race_warforged: Adding eventhooks");
|
if(DEBUG) DoDebug("race_warforged: Adding eventhooks");
|
||||||
AddEventScript(oPC, EVENT_ONHEARTBEAT, "race_warforged", TRUE, FALSE);
|
AddEventScript(oPC, EVENT_ONHEARTBEAT, "race_warforged", TRUE, FALSE);
|
||||||
//may not be needed, put in just in case(ala HotU start)
|
//may not be needed, put in just in case(ala HotU start)
|
||||||
@@ -109,7 +110,7 @@ void main()
|
|||||||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||||||
if(DEBUG) DoDebug("race_warforged - ironwood - adding item property "+ItemPropertyToString(ipIP));
|
if(DEBUG) DoDebug("race_warforged - ironwood - adding item property "+ItemPropertyToString(ipIP));
|
||||||
}
|
}
|
||||||
// Force equip
|
//:: Force equip
|
||||||
oItem = GetItemPossessedBy(oPC, "prc_wf_woodbody");
|
oItem = GetItemPossessedBy(oPC, "prc_wf_woodbody");
|
||||||
if (oItem != GetItemInSlot(INVENTORY_SLOT_CHEST, oPC))
|
if (oItem != GetItemInSlot(INVENTORY_SLOT_CHEST, oPC))
|
||||||
AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
||||||
@@ -123,7 +124,7 @@ void main()
|
|||||||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||||||
if(DEBUG) DoDebug("race_warforged - mithril - adding item property "+ItemPropertyToString(ipIP));
|
if(DEBUG) DoDebug("race_warforged - mithril - adding item property "+ItemPropertyToString(ipIP));
|
||||||
}
|
}
|
||||||
// Force equip
|
//:: Force equip
|
||||||
oItem = GetItemPossessedBy(oPC, "prc_wf_mithbody");
|
oItem = GetItemPossessedBy(oPC, "prc_wf_mithbody");
|
||||||
if (oItem != GetItemInSlot(INVENTORY_SLOT_CHEST, oPC))
|
if (oItem != GetItemInSlot(INVENTORY_SLOT_CHEST, oPC))
|
||||||
AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
||||||
@@ -137,20 +138,20 @@ void main()
|
|||||||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||||||
if(DEBUG) DoDebug("race_warforged - adamantine - adding item property "+ItemPropertyToString(ipIP));
|
if(DEBUG) DoDebug("race_warforged - adamantine - adding item property "+ItemPropertyToString(ipIP));
|
||||||
}
|
}
|
||||||
// Force equip
|
//:: Force equip
|
||||||
oItem = GetItemPossessedBy(oPC, "prc_wf_admtbody");
|
oItem = GetItemPossessedBy(oPC, "prc_wf_admtbody");
|
||||||
if (oItem != GetItemInSlot(INVENTORY_SLOT_CHEST, oPC))
|
if (oItem != GetItemInSlot(INVENTORY_SLOT_CHEST, oPC))
|
||||||
AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
||||||
}
|
}
|
||||||
else if(GetHasFeat(FEAT_COMPOSITE_PLATING, oPC))
|
else if(GetHasFeat(FEAT_COMPOSITE_PLATING, oPC))
|
||||||
{
|
{
|
||||||
// Force equip
|
//:: Force equip
|
||||||
oItem = GetItemPossessedBy(oPC, "prc_wf_compbody");
|
oItem = GetItemPossessedBy(oPC, "prc_wf_compbody");
|
||||||
if (oItem != GetItemInSlot(INVENTORY_SLOT_CHEST, oPC))
|
if (oItem != GetItemInSlot(INVENTORY_SLOT_CHEST, oPC))
|
||||||
AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delay a bit to make sure they are appropriately dressed
|
//:: Delay a bit to make sure they are appropriately dressed
|
||||||
DelayCommand(0.5f, DoWarforgedCheck(oPC));
|
DelayCommand(0.5f, DoWarforgedCheck(oPC));
|
||||||
}
|
}
|
||||||
else if(nEvent == EVENT_ONUNAQUIREITEM)
|
else if(nEvent == EVENT_ONUNAQUIREITEM)
|
||||||
|
|||||||
67
nwn/nwnprc/trunk/scripts/dm_pc_info_tool.nss
Normal file
67
nwn/nwnprc/trunk/scripts/dm_pc_info_tool.nss
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
//:://////////////////////////////////////////////
|
||||||
|
//:: Created By: Jason Stephenson
|
||||||
|
//:: Created On: August 3, 2004
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
//:: Changed By: Jason Stephenson
|
||||||
|
//:: Changed On: November 24, 2004
|
||||||
|
//:: Note: Changed to use if instead of switch().
|
||||||
|
//:: Also fixed code for X2_ITEM_EVENT_SPELLCAST_AT.
|
||||||
|
//:: Changed On: December 12, 2004
|
||||||
|
//:: Note: Using helper functions from Axe Murderer's example.
|
||||||
|
//:: Click Here
|
||||||
|
//:: Changed On: February 03, 2005
|
||||||
|
//:: Note: Fix Axe Murderer's SetTagBasedScriptExitBehavior function to
|
||||||
|
//:: only clear the variables if the nEndContinue is set to
|
||||||
|
//:: X2_EXECUTE_SCRIPT_END.
|
||||||
|
//:: Changed By: Jaysyn
|
||||||
|
//:: Changed On: 2025-11-25 08:31:43
|
||||||
|
//:: Note: Modified for use with DM info tool
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "x2_inc_switches"
|
||||||
|
int GetTagBasedItemEventNumber()
|
||||||
|
{
|
||||||
|
int nEvent = GetLocalInt(OBJECT_SELF, "X2_L_LAST_ITEM_EVENT");
|
||||||
|
return (nEvent ? nEvent : GetLocalInt(GetModule(), "X2_L_LAST_ITEM_EVENT"));
|
||||||
|
}
|
||||||
|
void SetTagBasedScriptExitBehavior(int nEndContinue)
|
||||||
|
{
|
||||||
|
if (nEndContinue == X2_EXECUTE_SCRIPT_END)
|
||||||
|
{
|
||||||
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_ITEM_EVENT");
|
||||||
|
DeleteLocalInt(GetModule(), "X2_L_LAST_ITEM_EVENT");
|
||||||
|
}
|
||||||
|
SetExecutedScriptReturnValue(nEndContinue);
|
||||||
|
}
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
//:: Get which event was fired.
|
||||||
|
int nEvent = GetTagBasedItemEventNumber();
|
||||||
|
|
||||||
|
//:: Declare major variables
|
||||||
|
object oPC;
|
||||||
|
object oItem;
|
||||||
|
|
||||||
|
//:: Our unique power was activated.
|
||||||
|
if (nEvent == X2_ITEM_EVENT_ACTIVATE)
|
||||||
|
{
|
||||||
|
oPC = GetItemActivator();
|
||||||
|
oItem = GetItemActivated();
|
||||||
|
object oTarget = GetItemActivatedTarget();
|
||||||
|
|
||||||
|
SetLocalObject(oPC, "EXAMINE_TARGET", oTarget);
|
||||||
|
|
||||||
|
if(!GetIsDM(oPC))
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "This tool is for DM's, not players");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ExecuteScript("prc_playerinfo", oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
//:: Set the return value, and then fall through.
|
||||||
|
SetTagBasedScriptExitBehavior(X2_EXECUTE_SCRIPT_END);
|
||||||
|
}
|
||||||
@@ -1,10 +1,24 @@
|
|||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
#include "prc_compan_inc"
|
#include "prc_compan_inc"
|
||||||
|
#include "inc_npc"
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
ExecuteScript("nw_ch_summon_9", OBJECT_SELF);
|
object oNPC = OBJECT_SELF;
|
||||||
ExecuteScript("prc_npc_spawn", OBJECT_SELF);
|
|
||||||
|
ExecuteScript("nw_ch_summon_9", oNPC);
|
||||||
|
ExecuteScript("prc_npc_spawn", oNPC);
|
||||||
|
|
||||||
|
//:: Used for the Twinfiend Pit Fiend summon
|
||||||
|
int nUltravision = GetLocalInt(oNPC,"INNATE_ULTRAVISION");
|
||||||
|
if(nUltravision)
|
||||||
|
{
|
||||||
|
effect eUltra = EffectUltravision();
|
||||||
|
eUltra = UnyieldingEffect(eUltra);
|
||||||
|
DelayCommand(0.0f, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eUltra, oNPC));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//use companion appearances
|
//use companion appearances
|
||||||
/*if(GetPRCSwitch(MARKER_PRC_COMPANION))
|
/*if(GetPRCSwitch(MARKER_PRC_COMPANION))
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ void main()
|
|||||||
int bKing = GetHasFeat(FEAT_KING_LIES, oPC) ? 4 : 0;
|
int bKing = GetHasFeat(FEAT_KING_LIES, oPC) ? 4 : 0;
|
||||||
int bDevil = GetHasFeat(FEAT_TONGUE_DEVIL, oPC) ? iInt : 0;
|
int bDevil = GetHasFeat(FEAT_TONGUE_DEVIL, oPC) ? iInt : 0;
|
||||||
|
|
||||||
if (bKing>0) KingofLies(oPC, oSkin,bKing);
|
//if (bKing>0) KingofLies(oPC, oSkin,bKing); Handled in stat 2DA now
|
||||||
if (bDevil>0) DevilTongue(oPC, oSkin,bDevil);
|
if (bDevil>0) DevilTongue(oPC, oSkin,bDevil);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
//:: Created By: Georg Zoeller
|
//:: Created By: Georg Zoeller
|
||||||
//:: Created On: 2003-07-16
|
//:: Created On: 2003-07-16
|
||||||
//:://////////////////////////////////////////////
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
#include "prc_inc_function"
|
#include "prc_inc_function"
|
||||||
#include "prc_inc_wpnrest"
|
#include "prc_inc_wpnrest"
|
||||||
#include "inc_timestop"
|
#include "inc_timestop"
|
||||||
@@ -32,6 +31,9 @@ void main()
|
|||||||
if(!GetIsObjectValid(oPC))
|
if(!GetIsObjectValid(oPC))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
//:: Use with bioware polymorphs
|
||||||
|
DetectMonkGloveEquip(oItem);
|
||||||
|
|
||||||
//if(DEBUG) DoDebug("Running OnEquip, creature = '" + GetName(oPC) + "' is PC: " + DebugBool2String(GetIsPC(oPC)) + "; Item = '" + GetName(oItem) + "' - '" + GetTag(oItem) + "'");
|
//if(DEBUG) DoDebug("Running OnEquip, creature = '" + GetName(oPC) + "' is PC: " + DebugBool2String(GetIsPC(oPC)) + "; Item = '" + GetName(oItem) + "' - '" + GetTag(oItem) + "'");
|
||||||
|
|
||||||
SetLocalInt(oPC, "ONEQUIP", 2); // Ugly hack to work around event detection in CheckPRCLimitations() - Ornedan
|
SetLocalInt(oPC, "ONEQUIP", 2); // Ugly hack to work around event detection in CheckPRCLimitations() - Ornedan
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "psi_inc_psifunc"
|
#include "psi_inc_psifunc"
|
||||||
#include "inc_ecl"
|
#include "inc_ecl"
|
||||||
#include "prc_inc_assoc"
|
#include "prc_inc_assoc"
|
||||||
|
#include "prc_inc_combmove"
|
||||||
|
|
||||||
void PreyOnTheWeak(object oDead)
|
void PreyOnTheWeak(object oDead)
|
||||||
{
|
{
|
||||||
@@ -49,6 +50,9 @@ void main()
|
|||||||
object oDead = GetLastBeingDied();
|
object oDead = GetLastBeingDied();
|
||||||
object oKiller = MyGetLastKiller();
|
object oKiller = MyGetLastKiller();
|
||||||
|
|
||||||
|
DelayCommand(0.1f, EndGrapple(oDead, oKiller));
|
||||||
|
DelayCommand(0.2f, EndGrapple(oKiller, oDead));
|
||||||
|
|
||||||
// We are not actually dead until -10
|
// We are not actually dead until -10
|
||||||
// Unless it's a spell death
|
// Unless it's a spell death
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,28 @@ const string CHAT_COMMAND_INDICATOR_1 = "~~";
|
|||||||
const string CHAT_COMMAND_INDICATOR_2 = "..";
|
const string CHAT_COMMAND_INDICATOR_2 = "..";
|
||||||
const int CHAT_COMMAND_INDICATOR_LENGHT = 2;
|
const int CHAT_COMMAND_INDICATOR_LENGHT = 2;
|
||||||
|
|
||||||
|
void ForceRemoveAllSpells(object oPC)
|
||||||
|
{
|
||||||
|
int classId;
|
||||||
|
for(classId = 1; classId < CLASS_TYPE_INVALID; classId++)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for (j = 0; j <= 40; j++)
|
||||||
|
{
|
||||||
|
DelayCommand(0.0f, CallSpellUnlevelScript(oPC, classId, j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SendMessageToPC(oPC, "Finished removing spells.");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResetCharacterXPAndRemoveSpells(object oPC)
|
||||||
|
{
|
||||||
|
int xp = GetXP(oPC);
|
||||||
|
ForceRemoveAllSpells(oPC);
|
||||||
|
SetXP(oPC, 1);
|
||||||
|
SetXP(oPC, xp);
|
||||||
|
}
|
||||||
|
|
||||||
int GetIsChatCommand(string sString)
|
int GetIsChatCommand(string sString)
|
||||||
{
|
{
|
||||||
string sTest = GetStringLeft(sString, CHAT_COMMAND_INDICATOR_LENGHT);
|
string sTest = GetStringLeft(sString, CHAT_COMMAND_INDICATOR_LENGHT);
|
||||||
@@ -111,6 +133,50 @@ void main()
|
|||||||
string firstWord = JsonGetString(JsonArrayGet(sCommandSplit, 0));
|
string firstWord = JsonGetString(JsonArrayGet(sCommandSplit, 0));
|
||||||
|
|
||||||
// if first word is /pa we are using the power attack interface
|
// if first word is /pa we are using the power attack interface
|
||||||
|
if (firstWord == "/relevel")
|
||||||
|
{
|
||||||
|
int confirmed = GetLocalInt(oPC, "RelevelConfirm");
|
||||||
|
if(confirmed)
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "Please wait as we relevel you, this may take some time...");
|
||||||
|
DelayCommand(1.0f, ResetCharacterXPAndRemoveSpells(oPC));
|
||||||
|
DeleteLocalInt(oPC, "RelevelConfirm");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "This will relevel you back to level 1 while preserving XP, type /relevel again to confirm.");
|
||||||
|
SetLocalInt(oPC, "RelevelConfirm", 1);
|
||||||
|
CloseNUILevelUpWindow(oPC, TRUE);
|
||||||
|
}
|
||||||
|
SetPCChatMessage();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DeleteLocalInt(oPC, "RelevelConfirm");
|
||||||
|
SetPCChatMessage();
|
||||||
|
}
|
||||||
|
if (firstWord == "/resetSpells")
|
||||||
|
{
|
||||||
|
int confirmed = GetLocalInt(oPC, "ResetSpellsConfirm");
|
||||||
|
if (confirmed)
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "Please wait as we remove your spells, this may take some time...");
|
||||||
|
DelayCommand(1.0f, ForceRemoveAllSpells(oPC));
|
||||||
|
DeleteLocalInt(oPC, "ResetSpellsConfirm");
|
||||||
|
CloseNUILevelUpWindow(oPC, TRUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "This will reset all spell choices among all PRC classes. Type /resetSpells again to confirm.");
|
||||||
|
SetLocalInt(oPC, "ResetSpellsConfirm", 1);
|
||||||
|
}
|
||||||
|
SetPCChatMessage();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DeleteLocalInt(oPC, "ResetSpellsConfirm");
|
||||||
|
SetPCChatMessage();
|
||||||
|
}
|
||||||
if(firstWord == "/pa")
|
if(firstWord == "/pa")
|
||||||
{
|
{
|
||||||
if(JsonGetLength(sCommandSplit) >= 2)
|
if(JsonGetLength(sCommandSplit) >= 2)
|
||||||
@@ -147,17 +213,6 @@ void main()
|
|||||||
SetPCChatMessage();
|
SetPCChatMessage();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (firstWord == "/lvl")
|
|
||||||
{
|
|
||||||
if (JsonGetLength(sCommandSplit) >= 2)
|
|
||||||
{
|
|
||||||
int classPos = StringToInt(JsonGetString(JsonArrayGet(sCommandSplit, 1)));
|
|
||||||
int nClass = GetClassByPosition(classPos, oPC);
|
|
||||||
OpenNUILevelUpWindow(nClass, oPC);
|
|
||||||
SetPCChatMessage();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Execute scripts hooked to this event for the player triggering it
|
// Execute scripts hooked to this event for the player triggering it
|
||||||
|
|||||||
406
nwn/nwnprc/trunk/scripts/prc_playerinfo.nss
Normal file
406
nwn/nwnprc/trunk/scripts/prc_playerinfo.nss
Normal file
@@ -0,0 +1,406 @@
|
|||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
//:: ;-. ,-. ,-. ,-.
|
||||||
|
//:: | ) | ) / ( )
|
||||||
|
//:: |-' |-< | ;-:
|
||||||
|
//:: | | \ \ ( )
|
||||||
|
//:: ' ' ' `-' `-'
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
//:: FileName: "prc_playerinfo"
|
||||||
|
//:: Created By: Jaysyn
|
||||||
|
//:: Last Updated On: 2025-11-25 08:26:22
|
||||||
|
//::
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
/*
|
||||||
|
|
||||||
|
Displays a lot of relevant PC info in an NUI window
|
||||||
|
|
||||||
|
*/
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
|
#include "nw_inc_nui"
|
||||||
|
#include "prc_inc_template"
|
||||||
|
|
||||||
|
const string CHAR_SHEET_WINDOW_ID = "char_sheet_window";
|
||||||
|
|
||||||
|
void ShowCharacterSheet(object oPC, object oTarget)
|
||||||
|
{
|
||||||
|
//:: Close existing window if open
|
||||||
|
int nToken = NuiFindWindow(oPC, CHAR_SHEET_WINDOW_ID);
|
||||||
|
if (nToken > 0)
|
||||||
|
{
|
||||||
|
NuiDestroy(oPC, nToken);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Build the layout
|
||||||
|
json jCol = JsonArray();
|
||||||
|
|
||||||
|
//:: === CHARACTER NAME & RACE ===
|
||||||
|
json jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Name:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_name"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Race:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_race"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Subrace:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_subrace"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Deity:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_deity"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Templates:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiText(NuiBind("char_templates"), TRUE, NUI_SCROLLBARS_AUTO));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiHeight(NuiRow(jRow), 60.0));
|
||||||
|
|
||||||
|
//:: === CLASSES ===
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Classes:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiText(NuiBind("char_classes"), TRUE, NUI_SCROLLBARS_AUTO));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiHeight(NuiRow(jRow), 120.0));
|
||||||
|
|
||||||
|
//:: === LEVEL & EXPERIENCE ===
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Total Level:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_level"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: Only show XP for PCs
|
||||||
|
if (GetIsPC(oTarget))
|
||||||
|
{
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Experience:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_xp"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: === HIT POINTS ===
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Hit Points:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_hp"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: === ABILITY SCORES - Two columns ===
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Ability Scores:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: STR and DEX
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("STR:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_str"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("DEX:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_dex"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: CON and INT
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("CON:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_con"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("INT:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_int"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: WIS and CHA
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("WIS:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_wis"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("CHA:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_cha"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: === ENCUMBRANCE ===
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Encumbrance:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_encumbrance"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: === SAVING THROWS ===
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Saving Throws:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: Fortitude
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Fortitude:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_fort"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: Reflex
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Reflex:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_ref"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: Will
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Will:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_will"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: === ARMOR CLASS ===
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Armor Class:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiSpacer());
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(NuiBind("char_ac"), JsonInt(NUI_HALIGN_RIGHT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
//:: === ACTIVE EFFECTS ===
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiLabel(JsonString("Active Spells:"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE)));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiRow(jRow));
|
||||||
|
|
||||||
|
jRow = JsonArray();
|
||||||
|
jRow = JsonArrayInsert(jRow, NuiText(NuiBind("char_effects"), TRUE, NUI_SCROLLBARS_AUTO));
|
||||||
|
jCol = JsonArrayInsert(jCol, NuiHeight(NuiRow(jRow), 100.0));
|
||||||
|
|
||||||
|
//:: Create window
|
||||||
|
json jRoot = NuiCol(jCol);
|
||||||
|
|
||||||
|
string sTitle = "Character Sheet: " + GetName(oTarget);
|
||||||
|
json jNui = NuiWindow(
|
||||||
|
jRoot,
|
||||||
|
JsonString(sTitle),
|
||||||
|
NuiBind("geometry"),
|
||||||
|
JsonBool(TRUE),
|
||||||
|
JsonBool(FALSE),
|
||||||
|
JsonBool(TRUE),
|
||||||
|
JsonBool(FALSE),
|
||||||
|
JsonBool(TRUE)
|
||||||
|
);
|
||||||
|
|
||||||
|
nToken = NuiCreate(oPC, jNui, CHAR_SHEET_WINDOW_ID);
|
||||||
|
|
||||||
|
//:: Set geometry
|
||||||
|
NuiSetBind(oPC, nToken, "geometry", NuiRect(100.0, 100.0, 400.0, 850.0));
|
||||||
|
|
||||||
|
//:: === POPULATE DATA ===
|
||||||
|
|
||||||
|
//:: Name
|
||||||
|
NuiSetBind(oPC, nToken, "char_name", JsonString(GetName(oTarget)));
|
||||||
|
|
||||||
|
//:: Race
|
||||||
|
string sRace = GetStringByStrRef(StringToInt(Get2DAString("racialtypes", "Name", GetRacialType(oTarget))));
|
||||||
|
if (sRace == "") sRace = "Unknown";
|
||||||
|
NuiSetBind(oPC, nToken, "char_race", JsonString(sRace));
|
||||||
|
|
||||||
|
//:: Subrace
|
||||||
|
string sSubrace = GetSubRace(oTarget);
|
||||||
|
if (sSubrace == "") sSubrace = "None";
|
||||||
|
NuiSetBind(oPC, nToken, "char_subrace", JsonString(sSubrace));
|
||||||
|
|
||||||
|
//:: Deity
|
||||||
|
string sDeity = GetDeity(oTarget);
|
||||||
|
if (sDeity == "") sDeity = "None";
|
||||||
|
NuiSetBind(oPC, nToken, "char_deity", JsonString(sDeity));
|
||||||
|
|
||||||
|
//:: Templates - Check for persistent local variables named "template_X"
|
||||||
|
string sTemplates = "";
|
||||||
|
int nTemplateCount = 0;
|
||||||
|
int i;
|
||||||
|
int nMaxTemplates = 128;
|
||||||
|
|
||||||
|
for (i = 0; i <= nMaxTemplates; i++)
|
||||||
|
{
|
||||||
|
string sVarName = "template_" + IntToString(i);
|
||||||
|
|
||||||
|
//:: Check if this persistent local variable exists and is TRUE
|
||||||
|
if (GetPersistantLocalInt(oTarget, sVarName))
|
||||||
|
{
|
||||||
|
string sNameEntry = Get2DAString("templates", "Name", i);
|
||||||
|
|
||||||
|
//:: Only process if we got a valid name entry
|
||||||
|
if (sNameEntry != "")
|
||||||
|
{
|
||||||
|
int nNameStrRef = StringToInt(sNameEntry);
|
||||||
|
string sTemplateName = GetStringByStrRef(nNameStrRef);
|
||||||
|
|
||||||
|
if (sTemplateName == "")
|
||||||
|
sTemplateName = "Template " + IntToString(i);
|
||||||
|
|
||||||
|
if (nTemplateCount > 0)
|
||||||
|
sTemplates += "\n";
|
||||||
|
|
||||||
|
sTemplates += sTemplateName;
|
||||||
|
nTemplateCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nTemplateCount == 0)
|
||||||
|
sTemplates = "None";
|
||||||
|
|
||||||
|
NuiSetBind(oPC, nToken, "char_templates", JsonString(sTemplates));
|
||||||
|
|
||||||
|
//:: Classes
|
||||||
|
string sClasses = "";
|
||||||
|
for (i = 1; i <= 8; i++)
|
||||||
|
{
|
||||||
|
int nClass = GetClassByPosition(i, oTarget);
|
||||||
|
if (nClass != CLASS_TYPE_INVALID)
|
||||||
|
{
|
||||||
|
string sClassName = GetStringByStrRef(StringToInt(Get2DAString("classes", "Name", nClass)));
|
||||||
|
if (sClassName == "") sClassName = "Class " + IntToString(nClass);
|
||||||
|
|
||||||
|
int nLevel = GetLevelByClass(nClass, oTarget);
|
||||||
|
|
||||||
|
if (sClasses != "")
|
||||||
|
sClasses += "\n";
|
||||||
|
|
||||||
|
sClasses += sClassName + " " + IntToString(nLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sClasses == "")
|
||||||
|
sClasses = "No classes found";
|
||||||
|
|
||||||
|
NuiSetBind(oPC, nToken, "char_classes", JsonString(sClasses));
|
||||||
|
|
||||||
|
//:: Level
|
||||||
|
NuiSetBind(oPC, nToken, "char_level", JsonString(IntToString(GetHitDice(oTarget))));
|
||||||
|
|
||||||
|
//:: XP (only for PCs)
|
||||||
|
if (GetIsPC(oTarget))
|
||||||
|
{
|
||||||
|
NuiSetBind(oPC, nToken, "char_xp", JsonString(IntToString(GetXP(oTarget))));
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Hit Points
|
||||||
|
string sHP = IntToString(GetCurrentHitPoints(oTarget)) + " / " + IntToString(GetMaxHitPoints(oTarget));
|
||||||
|
NuiSetBind(oPC, nToken, "char_hp", JsonString(sHP));
|
||||||
|
|
||||||
|
//:: Ability Scores - Individual binds
|
||||||
|
NuiSetBind(oPC, nToken, "char_str", JsonString(IntToString(GetAbilityScore(oTarget, ABILITY_STRENGTH))));
|
||||||
|
NuiSetBind(oPC, nToken, "char_dex", JsonString(IntToString(GetAbilityScore(oTarget, ABILITY_DEXTERITY))));
|
||||||
|
NuiSetBind(oPC, nToken, "char_con", JsonString(IntToString(GetAbilityScore(oTarget, ABILITY_CONSTITUTION))));
|
||||||
|
NuiSetBind(oPC, nToken, "char_int", JsonString(IntToString(GetAbilityScore(oTarget, ABILITY_INTELLIGENCE))));
|
||||||
|
NuiSetBind(oPC, nToken, "char_wis", JsonString(IntToString(GetAbilityScore(oTarget, ABILITY_WISDOM))));
|
||||||
|
NuiSetBind(oPC, nToken, "char_cha", JsonString(IntToString(GetAbilityScore(oTarget, ABILITY_CHARISMA))));
|
||||||
|
|
||||||
|
//:: Encumbrance
|
||||||
|
int nEncumbrance = GetWeight(oTarget) / 10;
|
||||||
|
string sEncumbrance = IntToString(nEncumbrance) + " lbs";
|
||||||
|
|
||||||
|
//:: Only check for gold bag on PCs
|
||||||
|
if (GetIsPC(oTarget) && GetIsObjectValid(GetItemPossessedBy(oTarget, "NW_IT_MNYBAG01")))
|
||||||
|
{
|
||||||
|
nEncumbrance += GetGold(oTarget) / 50;
|
||||||
|
sEncumbrance += " (+" + IntToString(GetGold(oTarget) / 50) + " gold)";
|
||||||
|
}
|
||||||
|
NuiSetBind(oPC, nToken, "char_encumbrance", JsonString(sEncumbrance));
|
||||||
|
|
||||||
|
//:: Saves - Individual binds
|
||||||
|
NuiSetBind(oPC, nToken, "char_fort", JsonString(IntToString(GetFortitudeSavingThrow(oTarget))));
|
||||||
|
NuiSetBind(oPC, nToken, "char_ref", JsonString(IntToString(GetReflexSavingThrow(oTarget))));
|
||||||
|
NuiSetBind(oPC, nToken, "char_will", JsonString(IntToString(GetWillSavingThrow(oTarget))));
|
||||||
|
|
||||||
|
//:: AC
|
||||||
|
NuiSetBind(oPC, nToken, "char_ac", JsonString(IntToString(GetAC(oTarget))));
|
||||||
|
|
||||||
|
//:: Active Spells - Track unique spell IDs to avoid duplicates
|
||||||
|
string sEffects = "";
|
||||||
|
effect eEffect = GetFirstEffect(oTarget);
|
||||||
|
int nEffectCount = 0;
|
||||||
|
string sTrackedSpells = ""; //:: Use this to track which spells we've already listed
|
||||||
|
|
||||||
|
while (GetIsEffectValid(eEffect))
|
||||||
|
{
|
||||||
|
int nSpellId = GetEffectSpellId(eEffect);
|
||||||
|
|
||||||
|
//:: Only process if this is a valid spell and we haven't already listed it
|
||||||
|
if (nSpellId > 0)
|
||||||
|
{
|
||||||
|
string sSpellIdStr = IntToString(nSpellId);
|
||||||
|
|
||||||
|
//:: Check if we've already processed this spell
|
||||||
|
if (FindSubString(sTrackedSpells, ":" + sSpellIdStr + ":") == -1)
|
||||||
|
{
|
||||||
|
//:: Add to tracked list
|
||||||
|
sTrackedSpells += ":" + sSpellIdStr + ":";
|
||||||
|
|
||||||
|
//:: Get spell name from spells.2da -> TLK
|
||||||
|
int nNameStrRef = StringToInt(Get2DAString("spells", "Name", nSpellId));
|
||||||
|
string sSpellName = GetStringByStrRef(nNameStrRef);
|
||||||
|
|
||||||
|
if (sSpellName == "")
|
||||||
|
sSpellName = "Unknown Spell (ID: " + sSpellIdStr + ")";
|
||||||
|
|
||||||
|
//:: Get duration for this spell effect
|
||||||
|
float fDuration = IntToFloat(GetEffectDurationRemaining(eEffect));
|
||||||
|
string sDuration = "";
|
||||||
|
|
||||||
|
if (fDuration > 0.0)
|
||||||
|
{
|
||||||
|
int nSeconds = FloatToInt(fDuration);
|
||||||
|
int nMinutes = nSeconds / 60;
|
||||||
|
nSeconds = nSeconds % 60;
|
||||||
|
|
||||||
|
if (nMinutes > 0)
|
||||||
|
sDuration = IntToString(nMinutes) + "m " + IntToString(nSeconds) + "s";
|
||||||
|
else
|
||||||
|
sDuration = IntToString(nSeconds) + "s";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sDuration = "Permanent";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nEffectCount > 0)
|
||||||
|
sEffects += "\n";
|
||||||
|
|
||||||
|
sEffects += sSpellName + " (" + sDuration + ")";
|
||||||
|
nEffectCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
eEffect = GetNextEffect(oTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nEffectCount == 0)
|
||||||
|
sEffects = "No active spells";
|
||||||
|
|
||||||
|
NuiSetBind(oPC, nToken, "char_effects", JsonString(sEffects));
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
object oPC = OBJECT_SELF;
|
||||||
|
object oTarget = oPC;
|
||||||
|
|
||||||
|
//:: If PC is targeting something else, show that target's sheet instead
|
||||||
|
object oTargeted = GetLocalObject(oPC, "EXAMINE_TARGET");
|
||||||
|
if (GetIsObjectValid(oTargeted) && GetObjectType(oTargeted) == OBJECT_TYPE_CREATURE)
|
||||||
|
{
|
||||||
|
oTarget = oTargeted;
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Show the window
|
||||||
|
ShowCharacterSheet(oPC, oTarget);
|
||||||
|
}
|
||||||
9
nwn/nwnprc/trunk/scripts/prc_remo_spell.nss
Normal file
9
nwn/nwnprc/trunk/scripts/prc_remo_spell.nss
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#include "inc_dynconv"
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
object oPC = OBJECT_SELF;
|
||||||
|
|
||||||
|
StartDynamicConversation("prc_remo_spl_cv", oPC);
|
||||||
|
|
||||||
|
}
|
||||||
130
nwn/nwnprc/trunk/scripts/prc_remo_spl_cv.nss
Normal file
130
nwn/nwnprc/trunk/scripts/prc_remo_spl_cv.nss
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
//:://///////////////////////////////////////////////////////////////
|
||||||
|
//:: End Self-Cast Active Spells - DynConv
|
||||||
|
//:: prc_remo_spl_fx.nss
|
||||||
|
//::
|
||||||
|
//:: Created by: Jaysyn
|
||||||
|
//:: Created on: 2025-11-22 15:45:50
|
||||||
|
//:://///////////////////////////////////////////////////////////////
|
||||||
|
/*
|
||||||
|
- Lists all active spell effects on and cast by the PC.
|
||||||
|
- Allows the player to end any of them (removes all effects
|
||||||
|
- from that spell cast by the PC).
|
||||||
|
|
||||||
|
- Start with:
|
||||||
|
- StartDynamicConversation("prc_remo_spl_cv", OBJECT_SELF);
|
||||||
|
*/
|
||||||
|
//:://///////////////////////////////////////////////////////////////
|
||||||
|
#include "prc_effect_inc"
|
||||||
|
#include "inc_dynconv"
|
||||||
|
|
||||||
|
const int STAGE_ENTRY = 0;
|
||||||
|
|
||||||
|
// Get a localized spell name from spells.2da; fallback to "Spell #"
|
||||||
|
string PRCGetSpellName(int nSpell)
|
||||||
|
{
|
||||||
|
string sName = "";
|
||||||
|
string sRef = Get2DAString("spells", "Name", nSpell);
|
||||||
|
if (sRef != "")
|
||||||
|
{
|
||||||
|
int nStrRef = StringToInt(sRef);
|
||||||
|
if (nStrRef > 0)
|
||||||
|
{
|
||||||
|
sName = GetStringByStrRef(nStrRef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sName == "")
|
||||||
|
{
|
||||||
|
sName = "Spell #" + IntToString(nSpell);
|
||||||
|
}
|
||||||
|
return sName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build list of unique self-cast active spells on oPC, one choice per spell id.
|
||||||
|
// Returns count of unique spells found.
|
||||||
|
int BuildSpellChoiceList(object oPC)
|
||||||
|
{
|
||||||
|
int nCount = 0;
|
||||||
|
|
||||||
|
array_create(oPC, "PC_SPELL_LIST");
|
||||||
|
|
||||||
|
effect e = GetFirstEffect(oPC);
|
||||||
|
|
||||||
|
while (GetIsEffectValid(e))
|
||||||
|
{
|
||||||
|
int nSpell = GetEffectSpellId(e);
|
||||||
|
if (nSpell >= 0 && GetEffectCreator(e) == oPC)
|
||||||
|
{
|
||||||
|
if (array_get_int(oPC, "PC_SPELL_LIST", nSpell) == 0)
|
||||||
|
{
|
||||||
|
AddChoice(PRCGetSpellName(nSpell), nSpell, oPC);
|
||||||
|
array_set_int(oPC, "PC_SPELL_LIST", nSpell, 1);
|
||||||
|
nCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
e = GetNextEffect(oPC);
|
||||||
|
}
|
||||||
|
array_delete(oPC, "PC_SPELL_LIST");
|
||||||
|
return nCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
object oPC = GetPCSpeaker();
|
||||||
|
|
||||||
|
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
|
||||||
|
int nStage = GetStage(oPC);
|
||||||
|
|
||||||
|
if (nValue == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (nValue == DYNCONV_SETUP_STAGE)
|
||||||
|
{
|
||||||
|
if (!GetIsStageSetUp(nStage, oPC))
|
||||||
|
{
|
||||||
|
if (nStage == STAGE_ENTRY)
|
||||||
|
{
|
||||||
|
int nList = BuildSpellChoiceList(oPC);
|
||||||
|
|
||||||
|
if (nList > 0)
|
||||||
|
{
|
||||||
|
SetHeader("Which of your active spells would you like to end:");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetHeader("You have no self-cast active spells available to end.");
|
||||||
|
}
|
||||||
|
|
||||||
|
MarkStageSetUp(nStage, oPC);
|
||||||
|
SetDefaultTokens();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetupTokens(oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (nValue == DYNCONV_EXITED)
|
||||||
|
{
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
else if (nValue == DYNCONV_ABORTED)
|
||||||
|
{
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Player selected a spell id
|
||||||
|
int nSpellId = GetChoice(oPC);
|
||||||
|
|
||||||
|
if (nStage == STAGE_ENTRY)
|
||||||
|
{
|
||||||
|
// End the spell
|
||||||
|
PRCRemoveSpellEffects(nSpellId, oPC, oPC);
|
||||||
|
|
||||||
|
// Rebuild list
|
||||||
|
ClearCurrentStage(oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
SetStage(nStage, oPC);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -142,8 +142,8 @@ int GetHighestSpellAvailableByDescriptor(object oPC, string sDescriptor)
|
|||||||
sSpellLabel = Get2DACache(sFile, "Label", i);
|
sSpellLabel = Get2DACache(sFile, "Label", i);
|
||||||
if(sSpellLabel != "") // Non-blank row
|
if(sSpellLabel != "") // Non-blank row
|
||||||
{
|
{
|
||||||
SendMessageToPC(oPC, "GetHighestSpellAvailableByDescriptor >> Entered function.");
|
if (DEBUG) DoDebug("GetHighestSpellAvailableByDescriptor >> Entered function.");
|
||||||
SendMessageToPC(oPC, "Row " + IntToString(i) +
|
if (DEBUG) DoDebug("Row " + IntToString(i) +
|
||||||
" Label = " + sSpellLabel +
|
" Label = " + sSpellLabel +
|
||||||
" SpellID = " + IntToString(nSpellID) +
|
" SpellID = " + IntToString(nSpellID) +
|
||||||
" HasSpell " + IntToString(PRCGetHasSpell(nSpellID, oPC)));
|
" HasSpell " + IntToString(PRCGetHasSpell(nSpellID, oPC)));
|
||||||
|
|||||||
@@ -31,6 +31,27 @@ void PrcFeats(object oPC, object oItem)
|
|||||||
DeleteLocalInt(oPC,"ONEQUIP");
|
DeleteLocalInt(oPC,"ONEQUIP");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//:: Unsets a variable used for Bioware polymorphs
|
||||||
|
void DoGloveUnequip(object oItem)
|
||||||
|
{
|
||||||
|
object oPC = OBJECT_SELF;
|
||||||
|
|
||||||
|
int nItemType = GetBaseItemType(oItem);
|
||||||
|
|
||||||
|
if(nItemType != BASE_ITEM_GLOVES)
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("prc_unequip >> DoGloveUnequip(): Not gloves.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("prc_unequip >> DoGloveUnequip(): Removing WEARING_MONK_GLOVES token.");
|
||||||
|
DeleteLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DoNaturalWeaponEffect(object oPC)
|
void DoNaturalWeaponEffect(object oPC)
|
||||||
{
|
{
|
||||||
if (DEBUG) DoDebug("GetIsUsingPrimaryNaturalWeapons "+IntToString(GetIsUsingPrimaryNaturalWeapons(oPC))+" PrimaryNaturalWeapEffect "+IntToString(GetLocalInt(oPC, "PrimaryNaturalWeapEffect")));
|
if (DEBUG) DoDebug("GetIsUsingPrimaryNaturalWeapons "+IntToString(GetIsUsingPrimaryNaturalWeapons(oPC))+" PrimaryNaturalWeapEffect "+IntToString(GetLocalInt(oPC, "PrimaryNaturalWeapEffect")));
|
||||||
@@ -56,6 +77,8 @@ void main()
|
|||||||
|
|
||||||
DoTimestopUnEquip(oPC, oItem);
|
DoTimestopUnEquip(oPC, oItem);
|
||||||
|
|
||||||
|
DoGloveUnequip(oItem);
|
||||||
|
|
||||||
if (GetResRef(oItem) == "prc_crown_might") DestroyObject(oItem);
|
if (GetResRef(oItem) == "prc_crown_might") DestroyObject(oItem);
|
||||||
if (GetResRef(oItem) == "prc_crown_prot") DestroyObject(oItem);
|
if (GetResRef(oItem) == "prc_crown_prot") DestroyObject(oItem);
|
||||||
|
|
||||||
|
|||||||
474
nwn/nwnprc/trunk/scripts/prc_unlvl_script.nss
Normal file
474
nwn/nwnprc/trunk/scripts/prc_unlvl_script.nss
Normal file
@@ -0,0 +1,474 @@
|
|||||||
|
//::///////////////////////////////////////////////
|
||||||
|
//:: PRC Unlevel Logic
|
||||||
|
//:: prc_unlvl_script
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
/*
|
||||||
|
This is the logic for removing spells from a PRC class in case of
|
||||||
|
unleveling or for fixing issues
|
||||||
|
*/
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
//:: Created By: Rakiov
|
||||||
|
//:: Created On: 22.09.2025
|
||||||
|
//:://////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "tob_inc_tobfunc"
|
||||||
|
#include "tob_inc_moveknwn"
|
||||||
|
#include "inv_inc_invfunc"
|
||||||
|
#include "shd_inc_mystknwn"
|
||||||
|
#include "shd_inc_shdfunc"
|
||||||
|
#include "true_inc_truknwn"
|
||||||
|
#include "true_inc_trufunc"
|
||||||
|
#include "prc_nui_com_inc"
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// ///
|
||||||
|
/// Implementations ///
|
||||||
|
/// ///
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
int FindSpellbookId(int nClass, int spellId)
|
||||||
|
{
|
||||||
|
string sFile = GetClassSpellbookFile(nClass);
|
||||||
|
int totalSpells = Get2DARowCount(sFile);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < totalSpells; i++)
|
||||||
|
{
|
||||||
|
int currentSpellId = StringToInt(Get2DACache(sFile, "SpellID", i));
|
||||||
|
if (currentSpellId == spellId)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveSpellsFromPlayer(object oPC, int nClass, string spellArray, string totalSpellsId, int nType=0)
|
||||||
|
{
|
||||||
|
// if we found the spell, then we remove it.
|
||||||
|
int totalRemoved = persistant_array_get_size(oPC, spellArray);
|
||||||
|
if (DEBUG) DoDebug("Found " + IntToString(totalRemoved) + " spells in " + spellArray + ", removing them.");
|
||||||
|
string sFile = GetClassSpellbookFile(nClass);
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < totalRemoved; i++)
|
||||||
|
{
|
||||||
|
int spellId = persistant_array_get_int(oPC, spellArray, i);
|
||||||
|
int spellbookId = FindSpellbookId(nClass, spellId);
|
||||||
|
|
||||||
|
if (spellbookId != 0)
|
||||||
|
{
|
||||||
|
// remove spell from player
|
||||||
|
string spellName = Get2DACache(sFile, "Label", spellbookId);
|
||||||
|
if (DEBUG) DoDebug( "Removing spell " + spellName);
|
||||||
|
int ipFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", spellbookId));
|
||||||
|
object oSkin = GetPCSkin(oPC);
|
||||||
|
RemoveIPFeat(oPC, ipFeatID);
|
||||||
|
if (GetIsBladeMagicClass(nClass))
|
||||||
|
{
|
||||||
|
string sDisciplineArray = _MANEUVER_LIST_DISCIPLINE + IntToString(nType) + "_" + Get2DACache(sFile, "Discipline", spellbookId);
|
||||||
|
int totalDiscSpells = GetPersistantLocalInt(oPC, sDisciplineArray);
|
||||||
|
SetPersistantLocalInt(oPC, sDisciplineArray, totalDiscSpells - 1);
|
||||||
|
if (DEBUG) DoDebug(sDisciplineArray + " total maneuvers is now " + IntToString(totalDiscSpells-1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
persistant_array_delete(oPC, spellArray);
|
||||||
|
|
||||||
|
int totalSpellCount = GetPersistantLocalInt(oPC, totalSpellsId);
|
||||||
|
// decrement the amount of spells known.
|
||||||
|
SetPersistantLocalInt(oPC, totalSpellsId,
|
||||||
|
totalSpellCount - totalRemoved
|
||||||
|
);
|
||||||
|
if (DEBUG) DoDebug(totalSpellsId + " total spells is now " + IntToString(totalSpellCount - totalRemoved));
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetMaxSpellsKnownName(int nClass)
|
||||||
|
{
|
||||||
|
if (GetIsShadowMagicClass(nClass))
|
||||||
|
{
|
||||||
|
return _MYSTERY_LIST_TOTAL_KNOWN;
|
||||||
|
}
|
||||||
|
if (GetIsInvocationClass(nClass))
|
||||||
|
{
|
||||||
|
return _INVOCATION_LIST_TOTAL_KNOWN;
|
||||||
|
}
|
||||||
|
if (GetIsBladeMagicClass(nClass))
|
||||||
|
{
|
||||||
|
return _MANEUVER_LIST_TOTAL_KNOWN;
|
||||||
|
}
|
||||||
|
if (GetIsTruenamingClass(nClass))
|
||||||
|
{
|
||||||
|
return _UTTERANCE_LIST_TOTAL_KNOWN;
|
||||||
|
}
|
||||||
|
if (GetIsPsionicClass(nClass))
|
||||||
|
{
|
||||||
|
return _POWER_LIST_TOTAL_KNOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetGeneralArrayId(int nClass)
|
||||||
|
{
|
||||||
|
if (GetIsShadowMagicClass(nClass))
|
||||||
|
{
|
||||||
|
return _MYSTERY_LIST_GENERAL_ARRAY;
|
||||||
|
}
|
||||||
|
if (GetIsInvocationClass(nClass))
|
||||||
|
{
|
||||||
|
return _INVOCATION_LIST_GENERAL_ARRAY;
|
||||||
|
}
|
||||||
|
if (GetIsBladeMagicClass(nClass))
|
||||||
|
{
|
||||||
|
return _MANEUVER_LIST_GENERAL_ARRAY;
|
||||||
|
}
|
||||||
|
if (GetIsTruenamingClass(nClass))
|
||||||
|
{
|
||||||
|
return _UTTERANCE_LIST_GENERAL_ARRAY;
|
||||||
|
}
|
||||||
|
if (GetIsPsionicClass(nClass))
|
||||||
|
{
|
||||||
|
return _POWER_LIST_GENERAL_ARRAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetBaseListName(int nClass)
|
||||||
|
{
|
||||||
|
if (GetIsShadowMagicClass(nClass))
|
||||||
|
{
|
||||||
|
return _MYSTERY_LIST_NAME_BASE;
|
||||||
|
}
|
||||||
|
if (GetIsInvocationClass(nClass))
|
||||||
|
{
|
||||||
|
return _INVOCATION_LIST_NAME_BASE;
|
||||||
|
}
|
||||||
|
if (GetIsBladeMagicClass(nClass))
|
||||||
|
{
|
||||||
|
return _MANEUVER_LIST_NAME_BASE;
|
||||||
|
}
|
||||||
|
if (GetIsTruenamingClass(nClass))
|
||||||
|
{
|
||||||
|
return _UTTERANCE_LIST_NAME_BASE;
|
||||||
|
}
|
||||||
|
if (GetIsPsionicClass(nClass))
|
||||||
|
{
|
||||||
|
return _POWER_LIST_NAME_BASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
string GetLevelArrayListName(int nClass)
|
||||||
|
{
|
||||||
|
if (GetIsShadowMagicClass(nClass))
|
||||||
|
{
|
||||||
|
return _MYSTERY_LIST_LEVEL_ARRAY;
|
||||||
|
}
|
||||||
|
if (GetIsInvocationClass(nClass))
|
||||||
|
{
|
||||||
|
return _INVOCATION_LIST_LEVEL_ARRAY;
|
||||||
|
}
|
||||||
|
if (GetIsBladeMagicClass(nClass))
|
||||||
|
{
|
||||||
|
return _MANEUVER_LIST_LEVEL_ARRAY;
|
||||||
|
}
|
||||||
|
if (GetIsTruenamingClass(nClass))
|
||||||
|
{
|
||||||
|
return _UTTERANCE_LIST_LEVEL_ARRAY;
|
||||||
|
}
|
||||||
|
if (GetIsPsionicClass(nClass))
|
||||||
|
{
|
||||||
|
return _POWER_LIST_LEVEL_ARRAY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveSpellsAtLevel(object oPC, int nClass, int level, int nList = 0)
|
||||||
|
{
|
||||||
|
if (GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS)
|
||||||
|
{
|
||||||
|
string sFile = GetClassSpellbookFile(nClass);
|
||||||
|
string spellsAtLevelList = ("SpellsKnown_" + IntToString(nClass) + "_AtLevel" + IntToString(level));
|
||||||
|
string spellLevelBook = GetSpellsKnown_Array(nClass);
|
||||||
|
if (level == 0)
|
||||||
|
{
|
||||||
|
spellsAtLevelList = spellLevelBook;
|
||||||
|
int totalSpells = Get2DARowCount(sFile);
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < totalSpells; i++)
|
||||||
|
{
|
||||||
|
int featID = StringToInt(Get2DACache(sFile, "FeatID", i));
|
||||||
|
if (featID && GetHasFeat(featID, oPC, TRUE))
|
||||||
|
{
|
||||||
|
string spellName = Get2DACache(sFile, "Label", i);
|
||||||
|
if (DEBUG) DoDebug( "Removing spellID " + IntToString(i) + ", spell name: " + spellName);
|
||||||
|
int ipFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", i));
|
||||||
|
WipeSpellFromHide(ipFeatID, oPC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
persistant_array_delete(oPC, spellsAtLevelList);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (persistant_array_exists(oPC, spellsAtLevelList))
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug( "Removing spells in " + spellsAtLevelList);
|
||||||
|
int knownSpellsCount = persistant_array_get_size(oPC, spellsAtLevelList);
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < knownSpellsCount; i++)
|
||||||
|
{
|
||||||
|
int spellId = persistant_array_get_int(oPC, spellsAtLevelList, i);
|
||||||
|
int spellbookId = FindSpellbookId(nClass, spellId);
|
||||||
|
|
||||||
|
if (spellbookId)
|
||||||
|
{
|
||||||
|
array_extract_int(oPC, spellLevelBook, spellbookId);
|
||||||
|
|
||||||
|
// wipe the spell from the player
|
||||||
|
string spellName = Get2DACache(sFile, "Label", spellbookId);
|
||||||
|
if (DEBUG) DoDebug( "Removing spellID " + IntToString(spellbookId) + ", spell name: " + spellName);
|
||||||
|
int ipFeatID = StringToInt(Get2DACache(sFile, "IPFeatID", spellbookId));
|
||||||
|
WipeSpellFromHide(ipFeatID, oPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
persistant_array_delete(oPC, spellsAtLevelList);
|
||||||
|
|
||||||
|
if (nClass == CLASS_TYPE_BEGUILER
|
||||||
|
|| nClass == CLASS_TYPE_DREAD_NECROMANCER
|
||||||
|
|| nClass == CLASS_TYPE_WARMAGE)
|
||||||
|
{
|
||||||
|
int nAdvLearn = GetPersistantLocalInt(oPC, "AdvancedLearning_"+IntToString(nClass)) - knownSpellsCount;
|
||||||
|
SetPersistantLocalInt(oPC, "AdvancedLearning_"+IntToString(nClass), nAdvLearn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int chosenList = (nList != 0) ? nList : nClass;
|
||||||
|
string baseList = GetBaseListName(nClass);
|
||||||
|
string totalCountId = GetMaxSpellsKnownName(nClass);
|
||||||
|
|
||||||
|
if (GetIsBladeMagicClass(nClass))
|
||||||
|
{
|
||||||
|
|
||||||
|
// remove maneuvers
|
||||||
|
int maneuver;
|
||||||
|
for (maneuver = 1; maneuver <= MANEUVER_TYPE_MANEUVER; maneuver++)
|
||||||
|
{
|
||||||
|
string spellArray = baseList + IntToString(chosenList) + IntToString(maneuver);
|
||||||
|
if (level == 0)
|
||||||
|
{
|
||||||
|
spellArray += GetGeneralArrayId(nClass);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spellArray += GetLevelArrayListName(nClass) + IntToString(level);
|
||||||
|
}
|
||||||
|
if (persistant_array_exists(oPC, spellArray))
|
||||||
|
{
|
||||||
|
string totalSpellsId = baseList + IntToString(chosenList) + IntToString(maneuver) + totalCountId;
|
||||||
|
RemoveSpellsFromPlayer(oPC, nClass, spellArray, totalSpellsId, maneuver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (GetIsTruenamingClass(nClass))
|
||||||
|
{
|
||||||
|
// Lexicon 1
|
||||||
|
string spellArray = baseList + IntToString(chosenList) + "1";
|
||||||
|
if (level == 0)
|
||||||
|
{
|
||||||
|
spellArray += GetGeneralArrayId(nClass);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spellArray += GetLevelArrayListName(nClass) + IntToString(level);
|
||||||
|
}
|
||||||
|
if (persistant_array_exists(oPC, spellArray))
|
||||||
|
{
|
||||||
|
string totalSpellsId = baseList + IntToString(chosenList) + totalCountId;
|
||||||
|
RemoveSpellsFromPlayer(oPC, nClass, spellArray, totalSpellsId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lexicon 2
|
||||||
|
spellArray = baseList + IntToString(chosenList) + "2";
|
||||||
|
if (level == 0)
|
||||||
|
{
|
||||||
|
spellArray += GetGeneralArrayId(nClass);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spellArray += GetLevelArrayListName(nClass) + IntToString(level);
|
||||||
|
}
|
||||||
|
if (persistant_array_exists(oPC, spellArray))
|
||||||
|
{
|
||||||
|
string totalSpellsId = baseList + IntToString(chosenList) + totalCountId;
|
||||||
|
RemoveSpellsFromPlayer(oPC, nClass, spellArray, totalSpellsId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lexicon 3
|
||||||
|
spellArray = baseList + IntToString(chosenList) + "3";
|
||||||
|
if (level == 0)
|
||||||
|
{
|
||||||
|
spellArray += GetGeneralArrayId(nClass);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spellArray += GetLevelArrayListName(nClass) + IntToString(level);
|
||||||
|
}
|
||||||
|
if (persistant_array_exists(oPC, spellArray))
|
||||||
|
{
|
||||||
|
string totalSpellsId = baseList + IntToString(chosenList) + totalCountId;
|
||||||
|
RemoveSpellsFromPlayer(oPC, nClass, spellArray, totalSpellsId);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string spellArray = (baseList + IntToString(chosenList));
|
||||||
|
if (level == 0)
|
||||||
|
{
|
||||||
|
spellArray += GetGeneralArrayId(nClass);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
spellArray += GetLevelArrayListName(nClass) + IntToString(level);
|
||||||
|
}
|
||||||
|
if (persistant_array_exists(oPC, spellArray))
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug( "Removing spells from " + spellArray);
|
||||||
|
string totalSpellsId = baseList + IntToString(chosenList) + totalCountId;
|
||||||
|
RemoveSpellsFromPlayer(oPC, nClass, spellArray, totalSpellsId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int IsClassPRCSpellCaster(int nClass, object oPlayer)
|
||||||
|
{
|
||||||
|
// This controls who can use the Spellbook NUI, if for some reason you don't
|
||||||
|
// want a class to be allowed to use this you can comment out their line here
|
||||||
|
|
||||||
|
// Bard and Sorc are allowed if they took a PRC that makes them use the spellbook
|
||||||
|
if (GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS
|
||||||
|
|| GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_PREPARED)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
// Arcane Spont
|
||||||
|
if (nClass == CLASS_TYPE_ASSASSIN
|
||||||
|
|| nClass == CLASS_TYPE_BEGUILER
|
||||||
|
|| nClass == CLASS_TYPE_CELEBRANT_SHARESS
|
||||||
|
|| nClass == CLASS_TYPE_DREAD_NECROMANCER
|
||||||
|
|| nClass == CLASS_TYPE_DUSKBLADE
|
||||||
|
|| nClass == CLASS_TYPE_HARPER
|
||||||
|
|| nClass == CLASS_TYPE_HEXBLADE
|
||||||
|
|| nClass == CLASS_TYPE_KNIGHT_WEAVE
|
||||||
|
|| nClass == CLASS_TYPE_SHADOWLORD
|
||||||
|
|| nClass == CLASS_TYPE_SUBLIME_CHORD
|
||||||
|
|| nClass == CLASS_TYPE_SUEL_ARCHANAMACH
|
||||||
|
|| nClass == CLASS_TYPE_WARMAGE)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
// Psionics
|
||||||
|
if (nClass == CLASS_TYPE_FIST_OF_ZUOKEN
|
||||||
|
|| nClass == CLASS_TYPE_PSION
|
||||||
|
|| nClass == CLASS_TYPE_PSYWAR
|
||||||
|
|| nClass == CLASS_TYPE_WILDER
|
||||||
|
|| nClass == CLASS_TYPE_PSYCHIC_ROGUE
|
||||||
|
|| nClass == CLASS_TYPE_WARMIND)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
// Invokers
|
||||||
|
if (nClass == CLASS_TYPE_WARLOCK
|
||||||
|
|| nClass == CLASS_TYPE_DRAGON_SHAMAN
|
||||||
|
|| nClass == CLASS_TYPE_DRAGONFIRE_ADEPT)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
// Divine Spont
|
||||||
|
if (nClass == CLASS_TYPE_ARCHIVIST //while technically prepared, they use the spont system of casting
|
||||||
|
|| nClass == CLASS_TYPE_FAVOURED_SOUL
|
||||||
|
|| nClass == CLASS_TYPE_JUSTICEWW)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
// ToB Classes
|
||||||
|
if (nClass == CLASS_TYPE_WARBLADE
|
||||||
|
|| nClass == CLASS_TYPE_SWORDSAGE
|
||||||
|
|| nClass == CLASS_TYPE_CRUSADER)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
// Mystery Classes
|
||||||
|
if (nClass == CLASS_TYPE_SHADOWCASTER
|
||||||
|
|| nClass == CLASS_TYPE_SHADOWSMITH)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
// Truenamers
|
||||||
|
if (nClass == CLASS_TYPE_TRUENAMER)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
// RHD Casters
|
||||||
|
if ((nClass == CLASS_TYPE_SHAPECHANGER
|
||||||
|
&& GetRacialType(oPlayer) == RACIAL_TYPE_ARANEA
|
||||||
|
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||||
|
|| (nClass == CLASS_TYPE_OUTSIDER
|
||||||
|
&& GetRacialType(oPlayer) == RACIAL_TYPE_RAKSHASA
|
||||||
|
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||||
|
|| (nClass == CLASS_TYPE_ABERRATION
|
||||||
|
&& GetRacialType(oPlayer) == RACIAL_TYPE_DRIDER
|
||||||
|
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||||
|
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||||
|
&& GetRacialType(oPlayer) == RACIAL_TYPE_ARKAMOI
|
||||||
|
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||||
|
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||||
|
&& GetRacialType(oPlayer) == RACIAL_TYPE_HOBGOBLIN_WARSOUL
|
||||||
|
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||||
|
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||||
|
&& GetRacialType(oPlayer) == RACIAL_TYPE_REDSPAWN_ARCANISS
|
||||||
|
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||||
|
|| (nClass == CLASS_TYPE_MONSTROUS
|
||||||
|
&& GetRacialType(oPlayer) == RACIAL_TYPE_MARRUTACT
|
||||||
|
&& !GetLevelByClass(CLASS_TYPE_SORCERER))
|
||||||
|
|| (nClass == CLASS_TYPE_FEY
|
||||||
|
&& GetRacialType(oPlayer) == RACIAL_TYPE_GLOURA
|
||||||
|
&& !GetLevelByClass(CLASS_TYPE_BARD)))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
// Binders
|
||||||
|
if (nClass == CLASS_TYPE_BINDER)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CheckAndRemoveSpellsForClassAtLevel(object oPC, int nClass, int level)
|
||||||
|
{
|
||||||
|
if (IsClassPRCSpellCaster(nClass, oPC))
|
||||||
|
{
|
||||||
|
if (GetIsInvocationClass(nClass))
|
||||||
|
{
|
||||||
|
RemoveSpellsAtLevel(oPC, nClass, level, INVOCATION_LIST_EXTRA);
|
||||||
|
RemoveSpellsAtLevel(oPC, nClass, level, INVOCATION_LIST_EXTRA_EPIC);
|
||||||
|
}
|
||||||
|
if (GetIsPsionicClass(nClass))
|
||||||
|
{
|
||||||
|
RemoveSpellsAtLevel(oPC, nClass, level, POWER_LIST_EXP_KNOWLEDGE);
|
||||||
|
RemoveSpellsAtLevel(oPC, nClass, level, POWER_LIST_EPIC_EXP_KNOWLEDGE);
|
||||||
|
}
|
||||||
|
RemoveSpellsAtLevel(oPC, nClass, level);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
int nClass = StringToInt(GetScriptParam("UnLevel_ClassChoice"));
|
||||||
|
int nLevel = StringToInt(GetScriptParam("UnLevel_LevelChoice"));
|
||||||
|
if (nClass)
|
||||||
|
{
|
||||||
|
CheckAndRemoveSpellsForClassAtLevel(OBJECT_SELF, nClass, nLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -27,7 +27,7 @@ void main()
|
|||||||
int nPoly;
|
int nPoly;
|
||||||
|
|
||||||
// Retrieve Module flag
|
// Retrieve Module flag
|
||||||
int iPnPShifterShapchange = GetPRCSwitch(PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPCHANGE);
|
int iPnPShifterShapchange = GetPRCSwitch(PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPECHANGE);
|
||||||
|
|
||||||
|
|
||||||
if (GetLocalInt(oPC, "WWHybrid") != TRUE)
|
if (GetLocalInt(oPC, "WWHybrid") != TRUE)
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ void main()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Target location
|
// Target location
|
||||||
location lTarget = GetSpellTargetLocation();
|
location lTarget = PRCGetSpellTargetLocation();
|
||||||
|
|
||||||
// Distance check
|
// Distance check
|
||||||
if (GetDistanceBetweenLocations(GetLocation(oPC), lTarget) > FeetToMeters(TREE_RANGE_FEET))
|
if (GetDistanceBetweenLocations(GetLocation(oPC), lTarget) > FeetToMeters(TREE_RANGE_FEET))
|
||||||
|
|||||||
@@ -41,6 +41,9 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_NECROMANCY);
|
|||||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||||
int nCasterLevel = PRCGetCasterLevel(OBJECT_SELF);
|
int nCasterLevel = PRCGetCasterLevel(OBJECT_SELF);
|
||||||
int nDuration = nCasterLevel;
|
int nDuration = nCasterLevel;
|
||||||
|
|
||||||
|
int bIsPC = GetIsPC(OBJECT_SELF);
|
||||||
|
|
||||||
nDuration = 24;
|
nDuration = 24;
|
||||||
string sResRef;
|
string sResRef;
|
||||||
//effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD);
|
//effect eVis = EffectVisualEffect(VFX_FNF_SUMMON_UNDEAD);
|
||||||
@@ -61,7 +64,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_NECROMANCY);
|
|||||||
effect eSummon = EffectSummonCreature(sResRef,VFX_FNF_SUMMON_UNDEAD);
|
effect eSummon = EffectSummonCreature(sResRef,VFX_FNF_SUMMON_UNDEAD);
|
||||||
//Apply summon effect and VFX impact.
|
//Apply summon effect and VFX impact.
|
||||||
MultisummonPreSummon();
|
MultisummonPreSummon();
|
||||||
if(GetPRCSwitch(PRC_CREATE_UNDEAD_UNCONTROLLED))
|
if(GetPRCSwitch(PRC_CREATE_UNDEAD_UNCONTROLLED) && bIsPC)
|
||||||
{
|
{
|
||||||
object oSummon = CreateObject(OBJECT_TYPE_CREATURE, sResRef, PRCGetSpellTargetLocation());
|
object oSummon = CreateObject(OBJECT_TYPE_CREATURE, sResRef, PRCGetSpellTargetLocation());
|
||||||
//make it hostile
|
//make it hostile
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_NECROMANCY);
|
|||||||
//Declare major variables
|
//Declare major variables
|
||||||
int nMetaMagic = PRCGetMetaMagicFeat();
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
||||||
int nCasterLevel = PRCGetCasterLevel(OBJECT_SELF);
|
int nCasterLevel = PRCGetCasterLevel(OBJECT_SELF);
|
||||||
|
int bIsPC = GetIsPC(OBJECT_SELF);
|
||||||
int nDuration = nCasterLevel;
|
int nDuration = nCasterLevel;
|
||||||
nDuration = 24;
|
nDuration = 24;
|
||||||
string sResRef;
|
string sResRef;
|
||||||
@@ -62,7 +63,7 @@ SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_NECROMANCY);
|
|||||||
|
|
||||||
//Apply VFX impact and summon effect
|
//Apply VFX impact and summon effect
|
||||||
MultisummonPreSummon();
|
MultisummonPreSummon();
|
||||||
if(GetPRCSwitch(PRC_CREATE_UNDEAD_UNCONTROLLED))
|
if(GetPRCSwitch(PRC_CREATE_UNDEAD_UNCONTROLLED) && bIsPC)
|
||||||
{
|
{
|
||||||
object oSummon = CreateObject(OBJECT_TYPE_CREATURE, sResRef, PRCGetSpellTargetLocation());
|
object oSummon = CreateObject(OBJECT_TYPE_CREATURE, sResRef, PRCGetSpellTargetLocation());
|
||||||
//this is to
|
//this is to
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
#include "prc_alterations"
|
#include "prc_alterations"
|
||||||
#include "inc_Timestop"
|
#include "inc_timestop"
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
object oTarget = GetExitingObject();
|
object oTarget = GetExitingObject();
|
||||||
|
|||||||
@@ -79,7 +79,15 @@ void main()
|
|||||||
int nNewStack = GetItemStackSize(oStack);
|
int nNewStack = GetItemStackSize(oStack);
|
||||||
nNewStack--;
|
nNewStack--;
|
||||||
|
|
||||||
|
if (nNewStack < 1)
|
||||||
|
{
|
||||||
|
DestroyObject(oStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( oStack != OBJECT_INVALID)
|
||||||
|
{
|
||||||
SetItemStackSize(oStack, nNewStack);
|
SetItemStackSize(oStack, nNewStack);
|
||||||
|
}
|
||||||
|
|
||||||
//create appropriate item
|
//create appropriate item
|
||||||
object oArrowBone = CreateItemOnObject(sBone, oPC, 1);
|
object oArrowBone = CreateItemOnObject(sBone, oPC, 1);
|
||||||
|
|||||||
@@ -91,14 +91,15 @@ void main()
|
|||||||
{
|
{
|
||||||
nArmor = nLevel + 5;
|
nArmor = nLevel + 5;
|
||||||
DoCorruptionCost(oPC, ABILITY_STRENGTH, d2(1), 0);
|
DoCorruptionCost(oPC, ABILITY_STRENGTH, d2(1), 0);
|
||||||
|
SignalEvent(oTarget, EventSpellCastAt(oPC, nSpell));
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(nSpell == SPELL_GREATER_LUMINOUS_ARMOR)
|
else if(nSpell == SPELL_GREATER_LUMINOUS_ARMOR)
|
||||||
{
|
{
|
||||||
nArmor = nLevel + 8;
|
nArmor = nLevel + 8;
|
||||||
DoCorruptionCost(oPC, ABILITY_STRENGTH, d3(), 0);
|
DoCorruptionCost(oPC, ABILITY_STRENGTH, d3(), 0);
|
||||||
|
SignalEvent(oTarget, EventSpellCastAt(oPC, nSpell));
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -282,7 +282,7 @@ void main2()
|
|||||||
object oImage;
|
object oImage;
|
||||||
json jImage = ObjectToJson(oCaster);
|
json jImage = ObjectToJson(oCaster);
|
||||||
|
|
||||||
jImage = JsonModifyRacialType(jImage, RACIAL_TYPE_CONSTRUCT);
|
jImage = json_ModifyRacialType(jImage, RACIAL_TYPE_CONSTRUCT);
|
||||||
|
|
||||||
oImage = JsonToObject(jImage, GetLocation(oCaster));
|
oImage = JsonToObject(jImage, GetLocation(oCaster));
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ int DoSpell(object oCaster, object oTarget, int nCasterLevel, int nEvent)
|
|||||||
int nDuration = nCasterLevel; // * Duration 1 turn/level
|
int nDuration = nCasterLevel; // * Duration 1 turn/level
|
||||||
if (CheckMetaMagic(nMetaMagic, METAMAGIC_EXTEND)) //Duration is +100%
|
if (CheckMetaMagic(nMetaMagic, METAMAGIC_EXTEND)) //Duration is +100%
|
||||||
nDuration *= 2;
|
nDuration *= 2;
|
||||||
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, 421, FALSE));
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_SHIELD_OF_FAITH, FALSE));
|
||||||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_AC_BONUS), oTarget);
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_AC_BONUS), oTarget);
|
||||||
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, TurnsToSeconds(nDuration),TRUE,-1,nCasterLevel);
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, TurnsToSeconds(nDuration),TRUE,-1,nCasterLevel);
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -6380,7 +6380,7 @@ Skill Points at Each Additional Level: 4 + Int modifier
|
|||||||
Bonus Feats: The epic arcane trickster gains a bonus feat (selected from the list of epic arcane trickster feats) every 4 levels after 10th.
|
Bonus Feats: The epic arcane trickster gains a bonus feat (selected from the list of epic arcane trickster feats) every 4 levels after 10th.
|
||||||
Epic Arcane Trickster Bonus Feat List: (Automatic) Silent Spell, (Automatic) Still Spell, (Automatic) Quicken Spell, Blinding Speed, Epic Skill Focus, Improved Combat Casting, Improved Sneak Attack, Self-Concealment, Epic Dodge, (Greater) Spell Focus, (Greater) Spell Penetration.B</entry>
|
Epic Arcane Trickster Bonus Feat List: (Automatic) Silent Spell, (Automatic) Still Spell, (Automatic) Quicken Spell, Blinding Speed, Epic Skill Focus, Improved Combat Casting, Improved Sneak Attack, Self-Concealment, Epic Dodge, (Greater) Spell Focus, (Greater) Spell Penetration.B</entry>
|
||||||
<entry id="45224" lang="en" sex="m">Exalted Companion</entry>
|
<entry id="45224" lang="en" sex="m">Exalted Companion</entry>
|
||||||
<entry id="45225" lang="en" sex="m">Type of Feat: General
|
<entry id="45225" lang="en" sex="m">Type of Feat: Exalted
|
||||||
Prerequisite: Animal Companion, Good Alignment (if you select this feat with another alignment, it will fail).
|
Prerequisite: Animal Companion, Good Alignment (if you select this feat with another alignment, it will fail).
|
||||||
Specifics: Applies the celestial template to your animal companion. It gains the ability to Smite Evil 1/day, as a paladin, Spell Resistance of 2 times HD, capping at 25, Darkvision, and benefits per the table below.
|
Specifics: Applies the celestial template to your animal companion. It gains the ability to Smite Evil 1/day, as a paladin, Spell Resistance of 2 times HD, capping at 25, Darkvision, and benefits per the table below.
|
||||||
|
|
||||||
@@ -9687,7 +9687,7 @@ Prerequisite: Thrall of Orcus Level 10
|
|||||||
Specifics: A Thrall of Orcus can summon a Nightwing once per day.
|
Specifics: A Thrall of Orcus can summon a Nightwing once per day.
|
||||||
Use: Selected.</entry>
|
Use: Selected.</entry>
|
||||||
<entry id="46128" lang="en" sex="m">Servant of The Heavens</entry>
|
<entry id="46128" lang="en" sex="m">Servant of The Heavens</entry>
|
||||||
<entry id="46129" lang="en" sex="m">Type of Feat: Exalted.
|
<entry id="46129" lang="en" sex="m">Type of Feat: Exalted
|
||||||
Prerequisite: Good Alignment*
|
Prerequisite: Good Alignment*
|
||||||
Specifics: You swear allegiance to one of the Tome Archons who rule the Seven Heavens, and in exchange gain power to act on their behalf. Once per day, you may call upon your archon patron to gain a +1 luck bonus to damage, attack roll and saving throws for 9 seconds.
|
Specifics: You swear allegiance to one of the Tome Archons who rule the Seven Heavens, and in exchange gain power to act on their behalf. Once per day, you may call upon your archon patron to gain a +1 luck bonus to damage, attack roll and saving throws for 9 seconds.
|
||||||
Use: Selected.
|
Use: Selected.
|
||||||
@@ -19562,7 +19562,7 @@ Prerequisite: Tamer of Beasts level 1
|
|||||||
Specifics: The tamer can have companions whose Hit Dice total no more than the sum of twice his tamer level plus twice his caster level for animal friendship. No individual companions can have more Hit Dice than the tamer.
|
Specifics: The tamer can have companions whose Hit Dice total no more than the sum of twice his tamer level plus twice his caster level for animal friendship. No individual companions can have more Hit Dice than the tamer.
|
||||||
Use: Automatic.</entry>
|
Use: Automatic.</entry>
|
||||||
<entry id="48686" lang="en" sex="m">Touch of Golden Ice</entry>
|
<entry id="48686" lang="en" sex="m">Touch of Golden Ice</entry>
|
||||||
<entry id="48687" lang="en" sex="m">Type of Feat: Exalted.
|
<entry id="48687" lang="en" sex="m">Type of Feat: Exalted
|
||||||
Prerequisite: Con 13, Good Alignment*.
|
Prerequisite: Con 13, Good Alignment*.
|
||||||
Specifics: Any evil being you hit (with glove or natural attack) is ravaged by Golden Ice (Poison DC 14, 2d6/1d6 Dex). You cannot wield a weapon and use this ability at the same time.
|
Specifics: Any evil being you hit (with glove or natural attack) is ravaged by Golden Ice (Poison DC 14, 2d6/1d6 Dex). You cannot wield a weapon and use this ability at the same time.
|
||||||
Use: Automatic.
|
Use: Automatic.
|
||||||
@@ -19573,7 +19573,7 @@ Use: Automatic.
|
|||||||
<entry id="48690" lang="en" sex="m">Stigmata Con -4</entry>
|
<entry id="48690" lang="en" sex="m">Stigmata Con -4</entry>
|
||||||
<entry id="48691" lang="en" sex="m">Stigmata Con -2</entry>
|
<entry id="48691" lang="en" sex="m">Stigmata Con -2</entry>
|
||||||
<entry id="48692" lang="en" sex="m">Stigmata</entry>
|
<entry id="48692" lang="en" sex="m">Stigmata</entry>
|
||||||
<entry id="48693" lang="en" sex="m">Type of Feat: Exalted.
|
<entry id="48693" lang="en" sex="m">Type of Feat: Exalted
|
||||||
Prerequisite: Nimbus of Light, Good Alignment*.
|
Prerequisite: Nimbus of Light, Good Alignment*.
|
||||||
Specifics: You can heal the wounds and ailments of others' using your own life energy. When you activate this ability, as a free action, you immediately take at least 2 points of temporary Constitution damage. You can take as many points of Constitution damage as you wish**, as long as you remain alive and conscious.
|
Specifics: You can heal the wounds and ailments of others' using your own life energy. When you activate this ability, as a free action, you immediately take at least 2 points of temporary Constitution damage. You can take as many points of Constitution damage as you wish**, as long as you remain alive and conscious.
|
||||||
Once you have activated your stigmata, you can touch your allies to heal them of 1 point of constitution damage per level they possess for every 2 points of Constitution damage you take. In addition, any character you touch who is suffering from a disease is cured of it.***
|
Once you have activated your stigmata, you can touch your allies to heal them of 1 point of constitution damage per level they possess for every 2 points of Constitution damage you take. In addition, any character you touch who is suffering from a disease is cured of it.***
|
||||||
@@ -19586,14 +19586,14 @@ Notes:
|
|||||||
**: Limited to 2, 4, 6 and 8 points due to technical limits.
|
**: Limited to 2, 4, 6 and 8 points due to technical limits.
|
||||||
***: Due to technical limits, one cannot "hold the charge" on the stigmata. To make up for that, diseases will always be cured.</entry>
|
***: Due to technical limits, one cannot "hold the charge" on the stigmata. To make up for that, diseases will always be cured.</entry>
|
||||||
<entry id="48694" lang="en" sex="m">Holy Radiance</entry>
|
<entry id="48694" lang="en" sex="m">Holy Radiance</entry>
|
||||||
<entry id="48695" lang="en" sex="m">Type of Feat: Exalted.
|
<entry id="48695" lang="en" sex="m">Type of Feat: Exalted
|
||||||
Prerequisite: Cha 15, Nimbus of Light, Good Alignment*.
|
Prerequisite: Cha 15, Nimbus of Light, Good Alignment*.
|
||||||
Specifics: You can increase the intensity of the light surrounding you to damage undead creatures. At will, as a free action, you can empower the radiance surrounding you into a blazing glow that sheds bright light in a 10-foot radius. Undead within 10 feet of you take 1d4 damage per round they remain within your halo.
|
Specifics: You can increase the intensity of the light surrounding you to damage undead creatures. At will, as a free action, you can empower the radiance surrounding you into a blazing glow that sheds bright light in a 10-foot radius. Undead within 10 feet of you take 1d4 damage per round they remain within your halo.
|
||||||
Use: Selected.
|
Use: Selected.
|
||||||
|
|
||||||
(*Note: You can select this feat even when evil or neutral, but it will not give you any benefits, so be smart and don't choose it if you can't use it.)</entry>
|
(*Note: You can select this feat even when evil or neutral, but it will not give you any benefits, so be smart and don't choose it if you can't use it.)</entry>
|
||||||
<entry id="48696" lang="en" sex="m">Nimbus of Light</entry>
|
<entry id="48696" lang="en" sex="m">Nimbus of Light</entry>
|
||||||
<entry id="48697" lang="en" sex="m">Type of Feat: Exalted.
|
<entry id="48697" lang="en" sex="m">Type of Feat: Exalted
|
||||||
Prerequisite: Base Attack Bonus 1, Good Alignment*.
|
Prerequisite: Base Attack Bonus 1, Good Alignment*.
|
||||||
Required For: Holy Radiance, Stigmata.
|
Required For: Holy Radiance, Stigmata.
|
||||||
Specifics: You are cloaked in a radiant light that marks you as a servant of purest ideals. You gain a +2 bonus to persuade. Your radiance sheds light with a radius of 5 feet.
|
Specifics: You are cloaked in a radiant light that marks you as a servant of purest ideals. You gain a +2 bonus to persuade. Your radiance sheds light with a radius of 5 feet.
|
||||||
@@ -19601,21 +19601,21 @@ Use: Selected.
|
|||||||
|
|
||||||
(*Note: You can select this feat even when evil or neutral, but it will not give you any benefits, so be smart and don't choose it if you can't use it.)</entry>
|
(*Note: You can select this feat even when evil or neutral, but it will not give you any benefits, so be smart and don't choose it if you can't use it.)</entry>
|
||||||
<entry id="48698" lang="en" sex="m">Intuitive Attack</entry>
|
<entry id="48698" lang="en" sex="m">Intuitive Attack</entry>
|
||||||
<entry id="48699" lang="en" sex="m">Type of Feat: Exalted.
|
<entry id="48699" lang="en" sex="m">Type of Feat: Exalted
|
||||||
Prerequisite: Base Attack Bonus 1, Good Alignment*.
|
Prerequisite: Base Attack Bonus 1, Good Alignment*.
|
||||||
Specifics: With a simple weapon or a natural weapon, you may use your Wisdom modifier instead your Strength modifier on attack rolls.
|
Specifics: With a simple weapon or a natural weapon, you may use your Wisdom modifier instead your Strength modifier on attack rolls.
|
||||||
Use: Automatic.
|
Use: Automatic.
|
||||||
|
|
||||||
(*Note: You can select this feat even when evil or neutral, but it will not give you any benefits, so be smart and don't choose it if you can't use it.)</entry>
|
(*Note: You can select this feat even when evil or neutral, but it will not give you any benefits, so be smart and don't choose it if you can't use it.)</entry>
|
||||||
<entry id="48700" lang="en" sex="m">Hand of a Healer</entry>
|
<entry id="48700" lang="en" sex="m">Hand of a Healer</entry>
|
||||||
<entry id="48701" lang="en" sex="m">Type of Feat: Exalted.
|
<entry id="48701" lang="en" sex="m">Type of Feat: Exalted
|
||||||
Prerequisite: Cha 13, Lay on Hand, Good Alignment*.
|
Prerequisite: Cha 13, Lay on Hand, Good Alignment*.
|
||||||
Specifics: When you determining how many hit points you can cure, treat your Charisma score as if it were 2 points higher.
|
Specifics: When you determining how many hit points you can cure, treat your Charisma score as if it were 2 points higher.
|
||||||
Use: Automatic.
|
Use: Automatic.
|
||||||
|
|
||||||
(*Note: You can select this feat even when evil or neutral, but it will not give you any benefits, so be smart and don't choose it if you can't use it.)</entry>
|
(*Note: You can select this feat even when evil or neutral, but it will not give you any benefits, so be smart and don't choose it if you can't use it.)</entry>
|
||||||
<entry id="48702" lang="en" sex="m">Exalted Turning</entry>
|
<entry id="48702" lang="en" sex="m">Exalted Turning</entry>
|
||||||
<entry id="48703" lang="en" sex="m">Type of Feat: Exalted.
|
<entry id="48703" lang="en" sex="m">Type of Feat: Exalted
|
||||||
Prerequisite: Turn Undead, Good or Neutral Alignment*.
|
Prerequisite: Turn Undead, Good or Neutral Alignment*.
|
||||||
Specifics: Any Undead that you turns take an extra 3d6 damage in addition to the normal turning effect.
|
Specifics: Any Undead that you turns take an extra 3d6 damage in addition to the normal turning effect.
|
||||||
Use: Automatic.
|
Use: Automatic.
|
||||||
@@ -27156,7 +27156,14 @@ A marshal can haste himself and his allies for 1 round. This ability may be use
|
|||||||
|
|
||||||
Hit Die: d10
|
Hit Die: d10
|
||||||
Skill Points at Each Additional Level: 4+ Int Modifier
|
Skill Points at Each Additional Level: 4+ Int Modifier
|
||||||
Bonus Feats: The epic swashbuckler gains a bonus feat every three levels, starting at level 23 </entry>
|
Bonus Feats: The epic swashbuckler gains a bonus feat every three levels.
|
||||||
|
|
||||||
|
Special:
|
||||||
|
Swashbuckler Dodge: This bonus continues to increase by +1 at every five levels after 20th.
|
||||||
|
Grace: An epic swashbuckler gains another +1 bonus on Reflex saves at 29th and 39th level. A swashbuckler loses this bonus when wearing medium or heavy armor or when encumbered.
|
||||||
|
|
||||||
|
Epic Swashbuckler Bonus Feat List:
|
||||||
|
Armor Skin, Blinding Speed, Devastating Critical, Epic Damage Reduction, Epic Prowess, Epic Toughness, Epic Weapon Focus, Improved Stunning Fist, Improved Whirlwind Attack, Overwhelming Critical, Superior Initiative</entry>
|
||||||
<entry id="51045" lang="en" sex="m">Epic Marshal</entry>
|
<entry id="51045" lang="en" sex="m">Epic Marshal</entry>
|
||||||
<entry id="51046" lang="en" sex="m">An epic marshal commands legions of soldiers and sometimes rules his own nation.
|
<entry id="51046" lang="en" sex="m">An epic marshal commands legions of soldiers and sometimes rules his own nation.
|
||||||
His followers are loyal to the death, and his empire is the stuff of legend.
|
His followers are loyal to the death, and his empire is the stuff of legend.
|
||||||
@@ -45957,15 +45964,15 @@ Spell Resistance: Will Negates (Harmless)
|
|||||||
You cast forth a field of minor storms that create barriers around the caster and all allies within a 20 radius that absorbs all incoming spells. The barriers can absorb 1d12+10 spell levels each before collapsing.</entry>
|
You cast forth a field of minor storms that create barriers around the caster and all allies within a 20 radius that absorbs all incoming spells. The barriers can absorb 1d12+10 spell levels each before collapsing.</entry>
|
||||||
<entry id="56281" lang="en" sex="m">Epic Spell: Summon Aberration</entry>
|
<entry id="56281" lang="en" sex="m">Epic Spell: Summon Aberration</entry>
|
||||||
<entry id="56282" lang="en" sex="m">Researched Epic Spell: Summon Aberration</entry>
|
<entry id="56282" lang="en" sex="m">Researched Epic Spell: Summon Aberration</entry>
|
||||||
<entry id="56283" lang="en" sex="m">School: Conjuration (Summoning)
|
<entry id="56283" lang="en" sex="m"> School: Conjuration (Summoning)
|
||||||
Components: V,S
|
Components: V,S
|
||||||
Range: Short
|
Range: Short
|
||||||
Effect: One summoned aberration
|
Effect: Summons advanced aberration(s)
|
||||||
Duration: 20 hours
|
Duration: 1 Turn / Caster level
|
||||||
Saving Throw: None
|
Saving Throw: None
|
||||||
Spell Resistance: No
|
Spell Resistance: No
|
||||||
|
|
||||||
You summon one of a variety of aberrations. It is never clear which type of aberration will appear, but it will always be one of these: a Drider Chief, a Beholder, a Mind Flayer Darkener, an Umber Hulk, or a Battle Devourer. The summoned aberration will do your bidding to the best of its abilities, for the duration. </entry>
|
You summon one or more advanced psuedonatural aberrations from the Far Realms to do your bidding. The aberration receives one bonus hit die for every 2 caster levels of the summoner, up to the maximum hit dice for the creature, and maximum hit points per die. The aberration follows your orders to the best of its ability, for the duration of the spell. Possible summons are a: Drider, Beholder, Illithid, Umber Hulk, or 2-3 Battle Devourers.</entry>
|
||||||
<entry id="56284" lang="en" sex="m">Epic Spell: Superb Dispelling</entry>
|
<entry id="56284" lang="en" sex="m">Epic Spell: Superb Dispelling</entry>
|
||||||
<entry id="56285" lang="en" sex="m">Researched Epic Spell: Superb Dispelling</entry>
|
<entry id="56285" lang="en" sex="m">Researched Epic Spell: Superb Dispelling</entry>
|
||||||
<entry id="56286" lang="en" sex="m">School: Abjuration
|
<entry id="56286" lang="en" sex="m">School: Abjuration
|
||||||
@@ -46024,15 +46031,15 @@ Spell Resistance: No (harmless)
|
|||||||
Physical frailty is but a memory for the subject of this spell. The targeted creature is granted permanent immunity to poison and disease, regeneration +1, and a Constitution bonus of +5.</entry>
|
Physical frailty is but a memory for the subject of this spell. The targeted creature is granted permanent immunity to poison and disease, regeneration +1, and a Constitution bonus of +5.</entry>
|
||||||
<entry id="56299" lang="en" sex="m">Epic Spell: Twinfiend</entry>
|
<entry id="56299" lang="en" sex="m">Epic Spell: Twinfiend</entry>
|
||||||
<entry id="56300" lang="en" sex="m">Researched Epic Spell: Twinfiend</entry>
|
<entry id="56300" lang="en" sex="m">Researched Epic Spell: Twinfiend</entry>
|
||||||
<entry id="56301" lang="en" sex="m">School: Conjuration (Summoning)
|
<entry id="56301" lang="en" sex="m"> School: Conjuration (Summoning, Evil)
|
||||||
Components: V,S
|
Components: V,S
|
||||||
Range: Short
|
Range: Short
|
||||||
Effect: Two summoned pit fiends
|
Effect: Summons two advanced pit fiends
|
||||||
Duration: 20 rounds
|
Duration: 1 Turn / Caster level
|
||||||
Saving Throw: None
|
Saving Throw: None
|
||||||
Spell Resistance: No
|
Spell Resistance: No
|
||||||
|
|
||||||
You summon two pit fiends from the abyss to do your bidding. These devils follow your orders to the best of their abilities, for the duration.</entry>
|
You summon two advanced pit fiends from the Nine Hells to do your bidding. These devils recieve one bonus hit die for every 2 caster levels of the summoner and maximum hit points per die. The pit fiends follow your orders to the best of their abilities, for the duration of the spell.</entry>
|
||||||
<entry id="56302" lang="en" sex="m">Epic Spell: Unholy Disciple</entry>
|
<entry id="56302" lang="en" sex="m">Epic Spell: Unholy Disciple</entry>
|
||||||
<entry id="56303" lang="en" sex="m">Researched Epic Spell: Unholy Disciple</entry>
|
<entry id="56303" lang="en" sex="m">Researched Epic Spell: Unholy Disciple</entry>
|
||||||
<entry id="56304" lang="en" sex="m">School: Necromancy
|
<entry id="56304" lang="en" sex="m">School: Necromancy
|
||||||
@@ -72673,6 +72680,12 @@ Strength of Will: You gain a bonus equal to 1/2 your class level (minimum +1) on
|
|||||||
Wild Frenzy: You gain a +2 bonus on attack rolls and damage rolls with melee weapons and eldritch blasts, along with temporary hit points equal to twice your class level. This effect lasts for a number of rounds equal to 3 + your Cha modifier (minimum 1 round). Your deity must be chaotic for you to select this gift.</entry>
|
Wild Frenzy: You gain a +2 bonus on attack rolls and damage rolls with melee weapons and eldritch blasts, along with temporary hit points equal to twice your class level. This effect lasts for a number of rounds equal to 3 + your Cha modifier (minimum 1 round). Your deity must be chaotic for you to select this gift.</entry>
|
||||||
<entry id="77218" lang="en" sex="m"><cÿÿÿ>Pick an invoking feat (1st lvl)</c></entry>
|
<entry id="77218" lang="en" sex="m"><cÿÿÿ>Pick an invoking feat (1st lvl)</c></entry>
|
||||||
<entry id="77219" lang="en" sex="m">Choose which invoking class to advance with the currently selected Prestige Class. If you try take a marker feat after1st class level, your character will be releveled.</entry>
|
<entry id="77219" lang="en" sex="m">Choose which invoking class to advance with the currently selected Prestige Class. If you try take a marker feat after1st class level, your character will be releveled.</entry>
|
||||||
|
<entry id="77220" lang="en" sex="m">Exalted Feats</entry>
|
||||||
|
<entry id="77221" lang="en" sex="m">Exalted feats are only available to good-aligned characters and creatures.
|
||||||
|
|
||||||
|
Due to technical reasons, we cannot enforce this limitation directly. If you do take one of these feats without qualifying for it, it will be useless to you.</entry>
|
||||||
|
<entry id="77997" lang="en" sex="m">Cancel Spell</entry>
|
||||||
|
<entry id="77998" lang="en" sex="m">This will allow the caster to end any self-cast spell effects on their person.</entry>
|
||||||
<entry id="77999" lang="en" sex="m">### PRC8 CLASS RESERVE ###</entry>
|
<entry id="77999" lang="en" sex="m">### PRC8 CLASS RESERVE ###</entry>
|
||||||
<entry id="78000" lang="en" sex="m">LoT</entry>
|
<entry id="78000" lang="en" sex="m">LoT</entry>
|
||||||
<entry id="78001" lang="en" sex="m">Lion of Talisid</entry>
|
<entry id="78001" lang="en" sex="m">Lion of Talisid</entry>
|
||||||
@@ -73578,9 +73591,9 @@ Transmuting energy spreads out around the targets, dealing 4d8 points of damage
|
|||||||
<entry id="199260" lang="en" sex="m">Mass Inflict Critical Damage (15)</entry>
|
<entry id="199260" lang="en" sex="m">Mass Inflict Critical Damage (15)</entry>
|
||||||
<entry id="199261" lang="en" sex="m">Mass Inflict Critical Damage (20)</entry>
|
<entry id="199261" lang="en" sex="m">Mass Inflict Critical Damage (20)</entry>
|
||||||
<entry id="199262" lang="en" sex="m">****</entry>
|
<entry id="199262" lang="en" sex="m">****</entry>
|
||||||
<entry id="199263" lang="en" sex="m">****</entry>
|
<entry id="199263" lang="en" sex="m">Gaseous Form (5)</entry>
|
||||||
<entry id="199264" lang="en" sex="m">****</entry>
|
<entry id="199264" lang="en" sex="m">Gaseous Form (10)</entry>
|
||||||
<entry id="199265" lang="en" sex="m">****</entry>
|
<entry id="199265" lang="en" sex="m">Gaseous Form (15)</entry>
|
||||||
<entry id="199266" lang="en" sex="m">****</entry>
|
<entry id="199266" lang="en" sex="m">****</entry>
|
||||||
<entry id="199267" lang="en" sex="m">****</entry>
|
<entry id="199267" lang="en" sex="m">****</entry>
|
||||||
<entry id="199268" lang="en" sex="m">****</entry>
|
<entry id="199268" lang="en" sex="m">****</entry>
|
||||||
@@ -73657,7 +73670,8 @@ Benefit: Beginning at 13th level, you can multiply your weight by 8, gaining a +
|
|||||||
|
|
||||||
Use: Selected</entry>
|
Use: Selected</entry>
|
||||||
<entry id="200102" lang="en" sex="m">Vow of Poverty</entry>
|
<entry id="200102" lang="en" sex="m">Vow of Poverty</entry>
|
||||||
<entry id="200103" lang="en" sex="m">You have taken a sacred vow to forswear material possessions.
|
<entry id="200103" lang="en" sex="m">Type of Feat: Exalted
|
||||||
|
You have taken a sacred vow to forswear material possessions.
|
||||||
|
|
||||||
You gain bonuses to your Armor Class, ability scores, and saving throws, as well as bonus exalted feats, all depending on your character level.
|
You gain bonuses to your Armor Class, ability scores, and saving throws, as well as bonus exalted feats, all depending on your character level.
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user