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,7 +135,14 @@ 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 **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
|
||||||
|
|||||||
@@ -1,424 +1,425 @@
|
|||||||
2DA V2.0
|
2DA V2.0
|
||||||
|
|
||||||
FeatLabel FeatIndex List GrantedOnLevel OnMenu
|
FeatLabel FeatIndex List GrantedOnLevel OnMenu
|
||||||
0 FEAT_EKNIGHT_SPELLCASTING_FEY 18221 2 1 0
|
0 FEAT_EKNIGHT_SPELLCASTING_FEY 18221 2 1 0
|
||||||
1 FEAT_EKNIGHT_SPELLCASTING_ABERRATION 18266 2 1 0
|
1 FEAT_EKNIGHT_SPELLCASTING_ABERRATION 18266 2 1 0
|
||||||
2 FEAT_EKNIGHT_SPELLCASTING_MONSTROUS 18313 2 1 0
|
2 FEAT_EKNIGHT_SPELLCASTING_MONSTROUS 18313 2 1 0
|
||||||
3 FEAT_EKNIGHT_SPELLCASTING_OUTSIDER 18360 2 1 0
|
3 FEAT_EKNIGHT_SPELLCASTING_OUTSIDER 18360 2 1 0
|
||||||
4 FEAT_EKNIGHT_SPELLCASTING_SHAPECHANGER 18407 2 1 0
|
4 FEAT_EKNIGHT_SPELLCASTING_SHAPECHANGER 18407 2 1 0
|
||||||
5 FEAT_EKNIGHT_SPELLCASTING_ASSASSIN 18450 2 1 0
|
5 FEAT_EKNIGHT_SPELLCASTING_ASSASSIN 18450 2 1 0
|
||||||
6 FEAT_EKNIGHT_SPELLCASTING_BARD 18485 2 1 0
|
6 FEAT_EKNIGHT_SPELLCASTING_BARD 18485 2 1 0
|
||||||
7 FEAT_EKNIGHT_SPELLCASTING_BEGUILER 18529 2 1 0
|
7 FEAT_EKNIGHT_SPELLCASTING_BEGUILER 18529 2 1 0
|
||||||
8 FEAT_EKNIGHT_SPELLCASTING_CELEBRANT_SHARESS 18568 2 1 0
|
8 FEAT_EKNIGHT_SPELLCASTING_CELEBRANT_SHARESS 18568 2 1 0
|
||||||
9 FEAT_EKNIGHT_SPELLCASTING_CULTIST_PEAK 18598 2 1 0
|
9 FEAT_EKNIGHT_SPELLCASTING_CULTIST_PEAK 18598 2 1 0
|
||||||
10 FEAT_EKNIGHT_SPELLCASTING_DNECRO 18637 2 1 0
|
10 FEAT_EKNIGHT_SPELLCASTING_DNECRO 18637 2 1 0
|
||||||
11 FEAT_EKNIGHT_SPELLCASTING_DUSKBLADE 18679 2 1 0
|
11 FEAT_EKNIGHT_SPELLCASTING_DUSKBLADE 18679 2 1 0
|
||||||
12 FEAT_EKNIGHT_SPELLCASTING_HARPER 18717 2 1 0
|
12 FEAT_EKNIGHT_SPELLCASTING_HARPER 18717 2 1 0
|
||||||
13 FEAT_EKNIGHT_SPELLCASTING_HEXBLADE 18752 2 1 0
|
13 FEAT_EKNIGHT_SPELLCASTING_HEXBLADE 18752 2 1 0
|
||||||
14 FEAT_EKNIGHT_SPELLCASTING_KNIGHT_WEAVE 18789 2 1 0
|
14 FEAT_EKNIGHT_SPELLCASTING_KNIGHT_WEAVE 18789 2 1 0
|
||||||
15 FEAT_EKNIGHT_SPELLCASTING_SHADOWLORD 18827 2 1 0
|
15 FEAT_EKNIGHT_SPELLCASTING_SHADOWLORD 18827 2 1 0
|
||||||
16 FEAT_EKNIGHT_SPELLCASTING_SORCERER 18870 2 1 0
|
16 FEAT_EKNIGHT_SPELLCASTING_SORCERER 18870 2 1 0
|
||||||
17 FEAT_EKNIGHT_SPELLCASTING_SUBLIME_CHORD 18917 2 1 0
|
17 FEAT_EKNIGHT_SPELLCASTING_SUBLIME_CHORD 18917 2 1 0
|
||||||
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 Ambidex 1 1 -1 0
|
21 FEAT_EPIC_SWARM_OF_ARROWS 25995 1 -1 0
|
||||||
22 CShot 5 1 -1 0
|
21 Ambidex 1 1 -1 0
|
||||||
23 Cleave 6 1 -1 0
|
22 CShot 5 1 -1 0
|
||||||
24 DefArrow 8 1 -1 0
|
23 Cleave 6 1 -1 0
|
||||||
25 Disarm 9 1 -1 0
|
24 DefArrow 8 1 -1 0
|
||||||
26 Dodge 10 1 -1 0
|
25 Disarm 9 1 -1 0
|
||||||
27 ImpCritClub 15 1 -1 0
|
26 Dodge 10 1 -1 0
|
||||||
28 ImpCritDagger 52 1 -1 0
|
27 ImpCritClub 15 1 -1 0
|
||||||
29 ImpCritDart 53 1 -1 0
|
28 ImpCritDagger 52 1 -1 0
|
||||||
30 ImpCritHXBow 54 1 -1 0
|
29 ImpCritDart 53 1 -1 0
|
||||||
31 ImpCritLgXBow 55 1 -1 0
|
30 ImpCritHXBow 54 1 -1 0
|
||||||
32 ImpCritLgMace 56 1 -1 0
|
31 ImpCritLgXBow 55 1 -1 0
|
||||||
33 ImpCritMorn 57 1 -1 0
|
32 ImpCritLgMace 56 1 -1 0
|
||||||
34 ImpCritStaff 58 1 -1 0
|
33 ImpCritMorn 57 1 -1 0
|
||||||
35 ImpCritSpear 59 1 -1 0
|
34 ImpCritStaff 58 1 -1 0
|
||||||
36 ImpCritSickle 60 1 -1 0
|
35 ImpCritSpear 59 1 -1 0
|
||||||
37 ImpCritSling 61 1 -1 0
|
36 ImpCritSickle 60 1 -1 0
|
||||||
38 ImpCritUnArm 62 1 -1 0
|
37 ImpCritSling 61 1 -1 0
|
||||||
39 ImpCritLongBow 63 1 -1 0
|
38 ImpCritUnArm 62 1 -1 0
|
||||||
40 ImpCritShortBow 64 1 -1 0
|
39 ImpCritLongBow 63 1 -1 0
|
||||||
41 ImpCritShortSword 65 1 -1 0
|
40 ImpCritShortBow 64 1 -1 0
|
||||||
42 ImpCritRapier 66 1 -1 0
|
41 ImpCritShortSword 65 1 -1 0
|
||||||
43 ImpCritScim 67 1 -1 0
|
42 ImpCritRapier 66 1 -1 0
|
||||||
44 ImpCritLSw 68 1 -1 0
|
43 ImpCritScim 67 1 -1 0
|
||||||
45 ImpCritGSw 69 1 -1 0
|
44 ImpCritLSw 68 1 -1 0
|
||||||
46 ImpCritHAxe 70 1 -1 0
|
45 ImpCritGSw 69 1 -1 0
|
||||||
47 ImpCritTAxe 71 1 -1 0
|
46 ImpCritHAxe 70 1 -1 0
|
||||||
48 ImpCritBAxe 72 1 -1 0
|
47 ImpCritTAxe 71 1 -1 0
|
||||||
49 ImpCritGAxe 73 1 -1 0
|
48 ImpCritBAxe 72 1 -1 0
|
||||||
50 ImpCritHalb 74 1 -1 0
|
49 ImpCritGAxe 73 1 -1 0
|
||||||
51 ImpCritLgHam 75 1 -1 0
|
50 ImpCritHalb 74 1 -1 0
|
||||||
52 ImpCritLgFlail 76 1 -1 0
|
51 ImpCritLgHam 75 1 -1 0
|
||||||
53 ImpCritWHam 77 1 -1 0
|
52 ImpCritLgFlail 76 1 -1 0
|
||||||
54 ImpCritHFlail 78 1 -1 0
|
53 ImpCritWHam 77 1 -1 0
|
||||||
55 ImpCritKama 79 1 -1 0
|
54 ImpCritHFlail 78 1 -1 0
|
||||||
56 ImpCritKukri 80 1 -1 0
|
55 ImpCritKama 79 1 -1 0
|
||||||
57 ImpCritShur 82 1 -1 0
|
56 ImpCritKukri 80 1 -1 0
|
||||||
58 ImpCritScy 83 1 -1 0
|
57 ImpCritShur 82 1 -1 0
|
||||||
59 ImpCritKatana 84 1 -1 0
|
58 ImpCritScy 83 1 -1 0
|
||||||
60 ImpCritBSw 85 1 -1 0
|
59 ImpCritKatana 84 1 -1 0
|
||||||
61 ImpCritDMace 87 1 -1 0
|
60 ImpCritBSw 85 1 -1 0
|
||||||
62 ImpCritDAxe 88 1 -1 0
|
61 ImpCritDMace 87 1 -1 0
|
||||||
63 ImpCrit2Sw 89 1 -1 0
|
62 ImpCritDAxe 88 1 -1 0
|
||||||
64 ImpDis 16 1 -1 0
|
63 ImpCrit2Sw 89 1 -1 0
|
||||||
65 ImpKnock 17 1 -1 0
|
64 ImpDis 16 1 -1 0
|
||||||
66 ImpParry 18 1 -1 0
|
65 ImpKnock 17 1 -1 0
|
||||||
67 ImpPower 19 1 -1 0
|
66 ImpParry 18 1 -1 0
|
||||||
68 ImpTwo 20 1 -1 0
|
67 ImpPower 19 1 -1 0
|
||||||
69 ImpStrike 21 1 -1 0
|
68 ImpTwo 20 1 -1 0
|
||||||
70 KnockDown 23 1 -1 0
|
69 ImpStrike 21 1 -1 0
|
||||||
71 Mobility 26 1 -1 0
|
70 KnockDown 23 1 -1 0
|
||||||
72 PBShot 27 1 -1 0
|
71 Mobility 26 1 -1 0
|
||||||
73 PowerAtk 28 1 -1 0
|
72 PBShot 27 1 -1 0
|
||||||
74 RapidShot 30 1 -1 0
|
73 PowerAtk 28 1 -1 0
|
||||||
75 StunFist 39 1 -1 0
|
74 RapidShot 30 1 -1 0
|
||||||
76 TwoWeap 41 1 -1 0
|
75 StunFist 39 1 -1 0
|
||||||
77 WeapFinesse 42 1 -1 0
|
76 TwoWeap 41 1 -1 0
|
||||||
78 WeapFocClub 43 1 -1 0
|
77 WeapFinesse 42 1 -1 0
|
||||||
79 WeapFocDagger 90 1 -1 0
|
78 WeapFocClub 43 1 -1 0
|
||||||
80 WeapFocDart 91 1 -1 0
|
79 WeapFocDagger 90 1 -1 0
|
||||||
81 WeapFocHXBow 92 1 -1 0
|
80 WeapFocDart 91 1 -1 0
|
||||||
82 WeapFocLgXBow 93 1 -1 0
|
81 WeapFocHXBow 92 1 -1 0
|
||||||
83 WeapFocLgMace 94 1 -1 0
|
82 WeapFocLgXBow 93 1 -1 0
|
||||||
84 WeapFocMorn 95 1 -1 0
|
83 WeapFocLgMace 94 1 -1 0
|
||||||
85 WeapFocStaff 96 1 -1 0
|
84 WeapFocMorn 95 1 -1 0
|
||||||
86 WeapFocSpear 97 1 -1 0
|
85 WeapFocStaff 96 1 -1 0
|
||||||
87 WeapFocSickle 98 1 -1 0
|
86 WeapFocSpear 97 1 -1 0
|
||||||
88 WeapFocSling 99 1 -1 0
|
87 WeapFocSickle 98 1 -1 0
|
||||||
89 WeapFocUnArm 100 1 -1 0
|
88 WeapFocSling 99 1 -1 0
|
||||||
90 WeapFocLongBow 101 1 -1 0
|
89 WeapFocUnArm 100 1 -1 0
|
||||||
91 WeapFocShortBow 102 1 -1 0
|
90 WeapFocLongBow 101 1 -1 0
|
||||||
92 WeapFocShortSword 103 1 -1 0
|
91 WeapFocShortBow 102 1 -1 0
|
||||||
93 WeapFocRapier 104 1 -1 0
|
92 WeapFocShortSword 103 1 -1 0
|
||||||
94 WeapFocScim 105 1 -1 0
|
93 WeapFocRapier 104 1 -1 0
|
||||||
95 WeapFocLSw 106 1 -1 0
|
94 WeapFocScim 105 1 -1 0
|
||||||
96 WeapFocGSw 107 1 -1 0
|
95 WeapFocLSw 106 1 -1 0
|
||||||
97 WeapFocHAxe 108 1 -1 0
|
96 WeapFocGSw 107 1 -1 0
|
||||||
98 WeapFocTAxe 109 1 -1 0
|
97 WeapFocHAxe 108 1 -1 0
|
||||||
99 WeapFocBAxe 110 1 -1 0
|
98 WeapFocTAxe 109 1 -1 0
|
||||||
100 WeapFocGAxe 111 1 -1 0
|
99 WeapFocBAxe 110 1 -1 0
|
||||||
101 WeapFocHalb 112 1 -1 0
|
100 WeapFocGAxe 111 1 -1 0
|
||||||
102 WeapFocLgHam 113 1 -1 0
|
101 WeapFocHalb 112 1 -1 0
|
||||||
103 WeapFocLgFlail 114 1 -1 0
|
102 WeapFocLgHam 113 1 -1 0
|
||||||
104 WeapFocWHam 115 1 -1 0
|
103 WeapFocLgFlail 114 1 -1 0
|
||||||
105 WeapFocHFlail 116 1 -1 0
|
104 WeapFocWHam 115 1 -1 0
|
||||||
106 WeapFocKama 117 1 -1 0
|
105 WeapFocHFlail 116 1 -1 0
|
||||||
107 WeapFocKukri 118 1 -1 0
|
106 WeapFocKama 117 1 -1 0
|
||||||
108 WeapFocShur 120 1 -1 0
|
107 WeapFocKukri 118 1 -1 0
|
||||||
109 WeapFocScy 121 1 -1 0
|
108 WeapFocShur 120 1 -1 0
|
||||||
110 WeapFocKatana 122 1 -1 0
|
109 WeapFocScy 121 1 -1 0
|
||||||
111 WeapFocBSw 123 1 -1 0
|
110 WeapFocKatana 122 1 -1 0
|
||||||
112 WeapFocDMace 125 1 -1 0
|
111 WeapFocBSw 123 1 -1 0
|
||||||
113 WeapFocDAxe 126 1 -1 0
|
112 WeapFocDMace 125 1 -1 0
|
||||||
114 WeapFoc2Sw 127 1 -1 0
|
113 WeapFocDAxe 126 1 -1 0
|
||||||
115 FEAT_WEAPON_FOCUS_TRIDENT 1072 1 -1 0
|
114 WeapFoc2Sw 127 1 -1 0
|
||||||
116 FEAT_IMPROVED_CRITICAL_TRIDENT 1074 1 -1 0
|
115 FEAT_WEAPON_FOCUS_TRIDENT 1072 1 -1 0
|
||||||
117 WP_BstrdSwd 7904 1 -1 0
|
116 FEAT_IMPROVED_CRITICAL_TRIDENT 1074 1 -1 0
|
||||||
118 WP_TwoBldSwd 7911 1 -1 0
|
117 WP_BstrdSwd 7904 1 -1 0
|
||||||
119 WP_DireMace 7915 1 -1 0
|
118 WP_TwoBldSwd 7911 1 -1 0
|
||||||
120 WP_DblAxe 7916 1 -1 0
|
119 WP_DireMace 7915 1 -1 0
|
||||||
121 WP_Kama 7920 1 -1 0
|
120 WP_DblAxe 7916 1 -1 0
|
||||||
122 WP_Katana 7921 1 -1 0
|
121 WP_Kama 7920 1 -1 0
|
||||||
123 WP_Kukri 7922 1 -1 0
|
122 WP_Katana 7921 1 -1 0
|
||||||
124 WP_Scythe 7926 1 -1 0
|
123 WP_Kukri 7922 1 -1 0
|
||||||
125 WP_Shuriken 7928 1 -1 0
|
124 WP_Scythe 7926 1 -1 0
|
||||||
126 WP_DwarfWaraxe 7933 1 -1 0
|
125 WP_Shuriken 7928 1 -1 0
|
||||||
127 WP_Whip 7934 1 -1 0
|
126 WP_DwarfWaraxe 7933 1 -1 0
|
||||||
128 WP_Lightblade 7935 1 -1 0
|
127 WP_Whip 7934 1 -1 0
|
||||||
129 WP_Thinblade 7936 1 -1 0
|
128 WP_Lightblade 7935 1 -1 0
|
||||||
130 WP_Courtblade 7937 1 -1 0
|
129 WP_Thinblade 7936 1 -1 0
|
||||||
131 Expertise 389 1 -1 0
|
130 WP_Courtblade 7937 1 -1 0
|
||||||
132 ImpExpertise 390 1 -1 0
|
131 Expertise 389 1 -1 0
|
||||||
133 GreatCleave 391 1 -1 0
|
132 ImpExpertise 390 1 -1 0
|
||||||
134 SpringAttack 392 1 -1 0
|
133 GreatCleave 391 1 -1 0
|
||||||
135 BlindFight 408 1 -1 0
|
134 SpringAttack 392 1 -1 0
|
||||||
136 WhirlwindAttack 867 1 -1 0
|
135 BlindFight 408 1 -1 0
|
||||||
137 WeaponFocusdwaxe 952 1 -1 0
|
136 WhirlwindAttack 867 1 -1 0
|
||||||
138 WeaponFocuswhip 993 1 -1 0
|
137 WeaponFocusdwaxe 952 1 -1 0
|
||||||
139 FEAT_EPIC_ARMOR_SKIN 490 1 -1 0
|
138 WeaponFocuswhip 993 1 -1 0
|
||||||
140 FEAT_EPIC_DAMAGE_REDUCTION_3 492 1 -1 0
|
139 FEAT_EPIC_ARMOR_SKIN 490 1 -1 0
|
||||||
141 FEAT_EPIC_DAMAGE_REDUCTION_6 493 1 -1 0
|
140 FEAT_EPIC_DAMAGE_REDUCTION_3 492 1 -1 0
|
||||||
142 FEAT_EPIC_DAMAGE_REDUCTION_9 494 1 -1 0
|
141 FEAT_EPIC_DAMAGE_REDUCTION_6 493 1 -1 0
|
||||||
143 IMP_CRIT_LIGHT_LANCE 24649 1 -1 0
|
142 FEAT_EPIC_DAMAGE_REDUCTION_9 494 1 -1 0
|
||||||
144 IMP_CRIT_HEAVY_PICK 24650 1 -1 0
|
143 IMP_CRIT_LIGHT_LANCE 24649 1 -1 0
|
||||||
145 IMP_CRIT_LIGHT_PICK 24651 1 -1 0
|
144 IMP_CRIT_HEAVY_PICK 24650 1 -1 0
|
||||||
146 IMP_CRIT_SAI 24652 1 -1 0
|
145 IMP_CRIT_LIGHT_PICK 24651 1 -1 0
|
||||||
147 IMP_CRIT_NUNCHAKU 24653 1 -1 0
|
146 IMP_CRIT_SAI 24652 1 -1 0
|
||||||
148 IMP_CRIT_FALCHION 24654 1 -1 0
|
147 IMP_CRIT_NUNCHAKU 24653 1 -1 0
|
||||||
149 IMP_CRIT_SAP 24655 1 -1 0
|
148 IMP_CRIT_FALCHION 24654 1 -1 0
|
||||||
150 IMP_CRIT_KATAR 24656 1 -1 0
|
149 IMP_CRIT_SAP 24655 1 -1 0
|
||||||
151 IMP_CRIT_HEAVY_MACE 24657 1 -1 0
|
150 IMP_CRIT_KATAR 24656 1 -1 0
|
||||||
152 IMP_CRIT_MAUL 24658 1 -1 0
|
151 IMP_CRIT_HEAVY_MACE 24657 1 -1 0
|
||||||
153 IMP_CRIT_DBL_SCIMITAR 24659 1 -1 0
|
152 IMP_CRIT_MAUL 24658 1 -1 0
|
||||||
154 IMP_CRIT_GOAD 24660 1 -1 0
|
153 IMP_CRIT_DBL_SCIMITAR 24659 1 -1 0
|
||||||
155 IMP_CRIT_ELVEN_LIGHTBLADE 24701 1 -1 0
|
154 IMP_CRIT_GOAD 24660 1 -1 0
|
||||||
156 IMP_CRIT_ELVEN_THINBLADE 24709 1 -1 0
|
155 IMP_CRIT_ELVEN_LIGHTBLADE 24701 1 -1 0
|
||||||
157 IMP_CRIT_ELVEN_COURTBLADE 24717 1 -1 0
|
156 IMP_CRIT_ELVEN_THINBLADE 24709 1 -1 0
|
||||||
158 FEAT_WEAPON_FOCUS_LIGHT_LANCE 24601 1 -1 0
|
157 IMP_CRIT_ELVEN_COURTBLADE 24717 1 -1 0
|
||||||
159 FEAT_WEAPON_FOCUS_HEAVY_PICK 24602 1 -1 0
|
158 FEAT_WEAPON_FOCUS_LIGHT_LANCE 24601 1 -1 0
|
||||||
160 FEAT_WEAPON_FOCUS_LIGHT_PICK 24603 1 -1 0
|
159 FEAT_WEAPON_FOCUS_HEAVY_PICK 24602 1 -1 0
|
||||||
161 FEAT_WEAPON_FOCUS_SAI 24604 1 -1 0
|
160 FEAT_WEAPON_FOCUS_LIGHT_PICK 24603 1 -1 0
|
||||||
162 FEAT_WEAPON_FOCUS_NUNCHUKU 24605 1 -1 0
|
161 FEAT_WEAPON_FOCUS_SAI 24604 1 -1 0
|
||||||
163 FEAT_WEAPON_FOCUS_FALCHION 24606 1 -1 0
|
162 FEAT_WEAPON_FOCUS_NUNCHUKU 24605 1 -1 0
|
||||||
164 FEAT_WEAPON_FOCUS_SAP 24607 1 -1 0
|
163 FEAT_WEAPON_FOCUS_FALCHION 24606 1 -1 0
|
||||||
165 FEAT_WEAPON_FOCUS_KATAR 24608 1 -1 0
|
164 FEAT_WEAPON_FOCUS_SAP 24607 1 -1 0
|
||||||
166 FEAT_WEAPON_FOCUS_HEAVY_MACE 24609 1 -1 0
|
165 FEAT_WEAPON_FOCUS_KATAR 24608 1 -1 0
|
||||||
167 FEAT_WEAPON_FOCUS_MAUL 24610 1 -1 0
|
166 FEAT_WEAPON_FOCUS_HEAVY_MACE 24609 1 -1 0
|
||||||
168 FEAT_WEAPON_FOCUS_DOUBLE_SCIMITAR 24611 1 -1 0
|
167 FEAT_WEAPON_FOCUS_MAUL 24610 1 -1 0
|
||||||
169 FEAT_WEAPON_FOCUS_GOAD 24612 1 -1 0
|
168 FEAT_WEAPON_FOCUS_DOUBLE_SCIMITAR 24611 1 -1 0
|
||||||
170 WF_ELVEN_LIGHTBLADE 24697 1 -1 0
|
169 FEAT_WEAPON_FOCUS_GOAD 24612 1 -1 0
|
||||||
171 WF_ELVEN_THINBLADE 24705 1 -1 0
|
170 WF_ELVEN_LIGHTBLADE 24697 1 -1 0
|
||||||
172 WF_ELVEN_COURTBLADE 24713 1 -1 0
|
171 WF_ELVEN_THINBLADE 24705 1 -1 0
|
||||||
173 EPIC_WEAPON_FOCUS_LANCE 24613 1 -1 0
|
172 WF_ELVEN_COURTBLADE 24713 1 -1 0
|
||||||
174 EPIC_WEAPON_FOCUS_HEAVY_PICK 24614 1 -1 0
|
173 EPIC_WEAPON_FOCUS_LANCE 24613 1 -1 0
|
||||||
175 EPIC_WEAPON_FOCUS_LIGHT_PICK 24615 1 -1 0
|
174 EPIC_WEAPON_FOCUS_HEAVY_PICK 24614 1 -1 0
|
||||||
176 EPIC_WEAPON_FOCUS_SAI 24616 1 -1 0
|
175 EPIC_WEAPON_FOCUS_LIGHT_PICK 24615 1 -1 0
|
||||||
177 EPIC_WEAPON_FOCUS_NUNCHAKU 24617 1 -1 0
|
176 EPIC_WEAPON_FOCUS_SAI 24616 1 -1 0
|
||||||
178 EPIC_WEAPON_FOCUS_FALCHION 24618 1 -1 0
|
177 EPIC_WEAPON_FOCUS_NUNCHAKU 24617 1 -1 0
|
||||||
179 EPIC_WEAPON_FOCUS_SAP 24619 1 -1 0
|
178 EPIC_WEAPON_FOCUS_FALCHION 24618 1 -1 0
|
||||||
180 EPIC_WEAPON_FOCUS_KATAR 24620 1 -1 0
|
179 EPIC_WEAPON_FOCUS_SAP 24619 1 -1 0
|
||||||
181 EPIC_WEAPON_FOCUS_HEAVY_MACE 24621 1 -1 0
|
180 EPIC_WEAPON_FOCUS_KATAR 24620 1 -1 0
|
||||||
182 EPIC_WEAPON_FOCUS_MAUL 24622 1 -1 0
|
181 EPIC_WEAPON_FOCUS_HEAVY_MACE 24621 1 -1 0
|
||||||
183 EPIC_WEAPON_FOCUS_DBL_SCIMITAR 24623 1 -1 0
|
182 EPIC_WEAPON_FOCUS_MAUL 24622 1 -1 0
|
||||||
184 EPIC_WEAPON_FOCUS_GOAD 24624 1 -1 0
|
183 EPIC_WEAPON_FOCUS_DBL_SCIMITAR 24623 1 -1 0
|
||||||
185 EPIC_WEAPON_FOCUS_ELVEN_LIGHTBLADE 24698 1 -1 0
|
184 EPIC_WEAPON_FOCUS_GOAD 24624 1 -1 0
|
||||||
186 EPIC_WEAPON_FOCUS_ELVEN_THINBLADE 24706 1 -1 0
|
185 EPIC_WEAPON_FOCUS_ELVEN_LIGHTBLADE 24698 1 -1 0
|
||||||
187 EPIC_WEAPON_FOCUS_ELVEN_COURTBLADE 24714 1 -1 0
|
186 EPIC_WEAPON_FOCUS_ELVEN_THINBLADE 24706 1 -1 0
|
||||||
188 OVERWHELMING_CRITICAL_LIGHT_LANCE 24661 1 -1 0
|
187 EPIC_WEAPON_FOCUS_ELVEN_COURTBLADE 24714 1 -1 0
|
||||||
189 OVERWHELMING_CRITICAL_HEAVY_PICK 24662 1 -1 0
|
188 OVERWHELMING_CRITICAL_LIGHT_LANCE 24661 1 -1 0
|
||||||
190 OVERWHELMING_CRITICAL_LIGHT_PICK 24663 1 -1 0
|
189 OVERWHELMING_CRITICAL_HEAVY_PICK 24662 1 -1 0
|
||||||
191 OVERWHELMING_CRITICAL_SAI 24664 1 -1 0
|
190 OVERWHELMING_CRITICAL_LIGHT_PICK 24663 1 -1 0
|
||||||
192 OVERWHELMING_CRITICAL_NUNCHAKU 24665 1 -1 0
|
191 OVERWHELMING_CRITICAL_SAI 24664 1 -1 0
|
||||||
193 OVERWHELMING_CRITICAL_FALCHION 24666 1 -1 0
|
192 OVERWHELMING_CRITICAL_NUNCHAKU 24665 1 -1 0
|
||||||
194 OVERWHELMING_CRITICAL_SAP 24667 1 -1 0
|
193 OVERWHELMING_CRITICAL_FALCHION 24666 1 -1 0
|
||||||
195 OVERWHELMING_CRITICAL_KATAR 24668 1 -1 0
|
194 OVERWHELMING_CRITICAL_SAP 24667 1 -1 0
|
||||||
196 OVERWHELMING_CRITICAL_HEAVY_MACE 24669 1 -1 0
|
195 OVERWHELMING_CRITICAL_KATAR 24668 1 -1 0
|
||||||
197 OVERWHELMING_CRITICAL_MAUL 24670 1 -1 0
|
196 OVERWHELMING_CRITICAL_HEAVY_MACE 24669 1 -1 0
|
||||||
198 OVERWHELMING_CRITICAL_DBL_SCIMITAR 24671 1 -1 0
|
197 OVERWHELMING_CRITICAL_MAUL 24670 1 -1 0
|
||||||
199 OVERWHELMING_CRITICAL_GOAD 24672 1 -1 0
|
198 OVERWHELMING_CRITICAL_DBL_SCIMITAR 24671 1 -1 0
|
||||||
200 OVERWHELMING_CRITICAL_ELVEN_LIGHTBLADE 24702 1 -1 0
|
199 OVERWHELMING_CRITICAL_GOAD 24672 1 -1 0
|
||||||
201 OVERWHELMING_CRITICAL_ELVEN_THINBLADE 24710 1 -1 0
|
200 OVERWHELMING_CRITICAL_ELVEN_LIGHTBLADE 24702 1 -1 0
|
||||||
202 OVERWHELMING_CRITICAL_ELVEN_COURTBLADE 24718 1 -1 0
|
201 OVERWHELMING_CRITICAL_ELVEN_THINBLADE 24710 1 -1 0
|
||||||
203 DEVASTATING_CRITICAL_LIGHT_LANCE 24673 1 -1 0
|
202 OVERWHELMING_CRITICAL_ELVEN_COURTBLADE 24718 1 -1 0
|
||||||
204 DEVASTATING_CRITICAL_HEAVY_PICK 24674 1 -1 0
|
203 DEVASTATING_CRITICAL_LIGHT_LANCE 24673 1 -1 0
|
||||||
205 DEVASTATING_CRITICAL_LIGHT_PICK 24675 1 -1 0
|
204 DEVASTATING_CRITICAL_HEAVY_PICK 24674 1 -1 0
|
||||||
206 DEVASTATING_CRITICAL_SAI 24676 1 -1 0
|
205 DEVASTATING_CRITICAL_LIGHT_PICK 24675 1 -1 0
|
||||||
207 DEVASTATING_CRITICAL_NUNCHAKU 24677 1 -1 0
|
206 DEVASTATING_CRITICAL_SAI 24676 1 -1 0
|
||||||
208 DEVASTATING_CRITICAL_FALCHION 24678 1 -1 0
|
207 DEVASTATING_CRITICAL_NUNCHAKU 24677 1 -1 0
|
||||||
209 DEVASTATING_CRITICAL_SAP 24679 1 -1 0
|
208 DEVASTATING_CRITICAL_FALCHION 24678 1 -1 0
|
||||||
210 DEVASTATING_CRITICAL_KATAR 24680 1 -1 0
|
209 DEVASTATING_CRITICAL_SAP 24679 1 -1 0
|
||||||
211 DEVASTATING_CRITICAL_HEAVY_MACE 24681 1 -1 0
|
210 DEVASTATING_CRITICAL_KATAR 24680 1 -1 0
|
||||||
212 DEVASTATING_CRITICAL_MAUL 24682 1 -1 0
|
211 DEVASTATING_CRITICAL_HEAVY_MACE 24681 1 -1 0
|
||||||
213 DEVASTATING_CRITICAL_DBL_SCIMITAR 24683 1 -1 0
|
212 DEVASTATING_CRITICAL_MAUL 24682 1 -1 0
|
||||||
214 DEVASTATING_CRITICAL_GOAD 24684 1 -1 0
|
213 DEVASTATING_CRITICAL_DBL_SCIMITAR 24683 1 -1 0
|
||||||
215 DEVASTATING_CRITICAL_ELVEN_LIGHTBLADE 24703 1 -1 0
|
214 DEVASTATING_CRITICAL_GOAD 24684 1 -1 0
|
||||||
216 DEVASTATING_CRITICAL_ELVEN_THINBLADE 24711 1 -1 0
|
215 DEVASTATING_CRITICAL_ELVEN_LIGHTBLADE 24703 1 -1 0
|
||||||
217 DEVASTATING_CRITICAL_ELVEN_COURTBLADE 24719 1 -1 0
|
216 DEVASTATING_CRITICAL_ELVEN_THINBLADE 24711 1 -1 0
|
||||||
218 FEAT_EPIC_DEVASTATING_CRITICAL_CLUB 495 1 -1 0
|
217 DEVASTATING_CRITICAL_ELVEN_COURTBLADE 24719 1 -1 0
|
||||||
219 FEAT_EPIC_DEVASTATING_CRITICAL_DAGGER 496 1 -1 0
|
218 FEAT_EPIC_DEVASTATING_CRITICAL_CLUB 495 1 -1 0
|
||||||
220 FEAT_EPIC_DEVASTATING_CRITICAL_DART 497 1 -1 0
|
219 FEAT_EPIC_DEVASTATING_CRITICAL_DAGGER 496 1 -1 0
|
||||||
221 FEAT_EPIC_DEVASTATING_CRITICAL_HEAVYCROSSBOW 498 1 -1 0
|
220 FEAT_EPIC_DEVASTATING_CRITICAL_DART 497 1 -1 0
|
||||||
222 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTCROSSBOW 499 1 -1 0
|
221 FEAT_EPIC_DEVASTATING_CRITICAL_HEAVYCROSSBOW 498 1 -1 0
|
||||||
223 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTMACE 500 1 -1 0
|
222 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTCROSSBOW 499 1 -1 0
|
||||||
224 FEAT_EPIC_DEVASTATING_CRITICAL_MORNINGSTAR 501 1 -1 0
|
223 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTMACE 500 1 -1 0
|
||||||
225 FEAT_EPIC_DEVASTATING_CRITICAL_QUARTERSTAFF 502 1 -1 0
|
224 FEAT_EPIC_DEVASTATING_CRITICAL_MORNINGSTAR 501 1 -1 0
|
||||||
226 FEAT_EPIC_DEVASTATING_CRITICAL_SHORTSPEAR 503 1 -1 0
|
225 FEAT_EPIC_DEVASTATING_CRITICAL_QUARTERSTAFF 502 1 -1 0
|
||||||
227 FEAT_EPIC_DEVASTATING_CRITICAL_SICKLE 504 1 -1 0
|
226 FEAT_EPIC_DEVASTATING_CRITICAL_SHORTSPEAR 503 1 -1 0
|
||||||
228 FEAT_EPIC_DEVASTATING_CRITICAL_SLING 505 1 -1 0
|
227 FEAT_EPIC_DEVASTATING_CRITICAL_SICKLE 504 1 -1 0
|
||||||
229 FEAT_EPIC_DEVASTATING_CRITICAL_UNARMED 506 1 -1 0
|
228 FEAT_EPIC_DEVASTATING_CRITICAL_SLING 505 1 -1 0
|
||||||
230 FEAT_EPIC_DEVASTATING_CRITICAL_LONGBOW 507 1 -1 0
|
229 FEAT_EPIC_DEVASTATING_CRITICAL_UNARMED 506 1 -1 0
|
||||||
231 FEAT_EPIC_DEVASTATING_CRITICAL_SHORTBOW 508 1 -1 0
|
230 FEAT_EPIC_DEVASTATING_CRITICAL_LONGBOW 507 1 -1 0
|
||||||
232 FEAT_EPIC_DEVASTATING_CRITICAL_SHORTSWORD 509 1 -1 0
|
231 FEAT_EPIC_DEVASTATING_CRITICAL_SHORTBOW 508 1 -1 0
|
||||||
233 FEAT_EPIC_DEVASTATING_CRITICAL_RAPIER 510 1 -1 0
|
232 FEAT_EPIC_DEVASTATING_CRITICAL_SHORTSWORD 509 1 -1 0
|
||||||
234 FEAT_EPIC_DEVASTATING_CRITICAL_SCIMITAR 511 1 -1 0
|
233 FEAT_EPIC_DEVASTATING_CRITICAL_RAPIER 510 1 -1 0
|
||||||
235 FEAT_EPIC_DEVASTATING_CRITICAL_LONGSWORD 512 1 -1 0
|
234 FEAT_EPIC_DEVASTATING_CRITICAL_SCIMITAR 511 1 -1 0
|
||||||
236 FEAT_EPIC_DEVASTATING_CRITICAL_GREATSWORD 513 1 -1 0
|
235 FEAT_EPIC_DEVASTATING_CRITICAL_LONGSWORD 512 1 -1 0
|
||||||
237 FEAT_EPIC_DEVASTATING_CRITICAL_HANDAXE 514 1 -1 0
|
236 FEAT_EPIC_DEVASTATING_CRITICAL_GREATSWORD 513 1 -1 0
|
||||||
238 FEAT_EPIC_DEVASTATING_CRITICAL_THROWINGAXE 515 1 -1 0
|
237 FEAT_EPIC_DEVASTATING_CRITICAL_HANDAXE 514 1 -1 0
|
||||||
239 FEAT_EPIC_DEVASTATING_CRITICAL_BATTLEAXE 516 1 -1 0
|
238 FEAT_EPIC_DEVASTATING_CRITICAL_THROWINGAXE 515 1 -1 0
|
||||||
240 FEAT_EPIC_DEVASTATING_CRITICAL_GREATAXE 517 1 -1 0
|
239 FEAT_EPIC_DEVASTATING_CRITICAL_BATTLEAXE 516 1 -1 0
|
||||||
241 FEAT_EPIC_DEVASTATING_CRITICAL_HALBERD 518 1 -1 0
|
240 FEAT_EPIC_DEVASTATING_CRITICAL_GREATAXE 517 1 -1 0
|
||||||
242 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTHAMMER 519 1 -1 0
|
241 FEAT_EPIC_DEVASTATING_CRITICAL_HALBERD 518 1 -1 0
|
||||||
243 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTFLAIL 520 1 -1 0
|
242 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTHAMMER 519 1 -1 0
|
||||||
244 FEAT_EPIC_DEVASTATING_CRITICAL_WARHAMMER 521 1 -1 0
|
243 FEAT_EPIC_DEVASTATING_CRITICAL_LIGHTFLAIL 520 1 -1 0
|
||||||
245 FEAT_EPIC_DEVASTATING_CRITICAL_HEAVYFLAIL 522 1 -1 0
|
244 FEAT_EPIC_DEVASTATING_CRITICAL_WARHAMMER 521 1 -1 0
|
||||||
246 FEAT_EPIC_DEVASTATING_CRITICAL_KAMA 523 1 -1 0
|
245 FEAT_EPIC_DEVASTATING_CRITICAL_HEAVYFLAIL 522 1 -1 0
|
||||||
247 FEAT_EPIC_DEVASTATING_CRITICAL_KUKRI 524 1 -1 0
|
246 FEAT_EPIC_DEVASTATING_CRITICAL_KAMA 523 1 -1 0
|
||||||
248 FEAT_EPIC_DEVASTATING_CRITICAL_SHURIKEN 525 1 -1 0
|
247 FEAT_EPIC_DEVASTATING_CRITICAL_KUKRI 524 1 -1 0
|
||||||
249 FEAT_EPIC_DEVASTATING_CRITICAL_SCYTHE 526 1 -1 0
|
248 FEAT_EPIC_DEVASTATING_CRITICAL_SHURIKEN 525 1 -1 0
|
||||||
250 FEAT_EPIC_DEVASTATING_CRITICAL_KATANA 527 1 -1 0
|
249 FEAT_EPIC_DEVASTATING_CRITICAL_SCYTHE 526 1 -1 0
|
||||||
251 FEAT_EPIC_DEVASTATING_CRITICAL_BASTARDSWORD 528 1 -1 0
|
250 FEAT_EPIC_DEVASTATING_CRITICAL_KATANA 527 1 -1 0
|
||||||
252 FEAT_EPIC_DEVASTATING_CRITICAL_DIREMACE 529 1 -1 0
|
251 FEAT_EPIC_DEVASTATING_CRITICAL_BASTARDSWORD 528 1 -1 0
|
||||||
253 FEAT_EPIC_DEVASTATING_CRITICAL_DOUBLEAXE 530 1 -1 0
|
252 FEAT_EPIC_DEVASTATING_CRITICAL_DIREMACE 529 1 -1 0
|
||||||
254 FEAT_EPIC_DEVASTATING_CRITICAL_TWOBLADEDSWORD 531 1 -1 0
|
253 FEAT_EPIC_DEVASTATING_CRITICAL_DOUBLEAXE 530 1 -1 0
|
||||||
255 FEAT_EPIC_PROWESS 584 1 -1 0
|
254 FEAT_EPIC_DEVASTATING_CRITICAL_TWOBLADEDSWORD 531 1 -1 0
|
||||||
256 FEAT_EPIC_WEAPON_FOCUS_CLUB 619 1 -1 0
|
255 FEAT_EPIC_PROWESS 584 1 -1 0
|
||||||
257 FEAT_EPIC_WEAPON_FOCUS_DAGGER 620 1 -1 0
|
256 FEAT_EPIC_WEAPON_FOCUS_CLUB 619 1 -1 0
|
||||||
258 FEAT_EPIC_WEAPON_FOCUS_DART 621 1 -1 0
|
257 FEAT_EPIC_WEAPON_FOCUS_DAGGER 620 1 -1 0
|
||||||
259 FEAT_EPIC_WEAPON_FOCUS_HEAVYCROSSBOW 622 1 -1 0
|
258 FEAT_EPIC_WEAPON_FOCUS_DART 621 1 -1 0
|
||||||
260 FEAT_EPIC_WEAPON_FOCUS_LIGHTCROSSBOW 623 1 -1 0
|
259 FEAT_EPIC_WEAPON_FOCUS_HEAVYCROSSBOW 622 1 -1 0
|
||||||
261 FEAT_EPIC_WEAPON_FOCUS_LIGHTMACE 624 1 -1 0
|
260 FEAT_EPIC_WEAPON_FOCUS_LIGHTCROSSBOW 623 1 -1 0
|
||||||
262 FEAT_EPIC_WEAPON_FOCUS_MORNINGSTAR 625 1 -1 0
|
261 FEAT_EPIC_WEAPON_FOCUS_LIGHTMACE 624 1 -1 0
|
||||||
263 FEAT_EPIC_WEAPON_FOCUS_QUARTERSTAFF 626 1 -1 0
|
262 FEAT_EPIC_WEAPON_FOCUS_MORNINGSTAR 625 1 -1 0
|
||||||
264 FEAT_EPIC_WEAPON_FOCUS_SHORTSPEAR 627 1 -1 0
|
263 FEAT_EPIC_WEAPON_FOCUS_QUARTERSTAFF 626 1 -1 0
|
||||||
265 FEAT_EPIC_WEAPON_FOCUS_SICKLE 628 1 -1 0
|
264 FEAT_EPIC_WEAPON_FOCUS_SHORTSPEAR 627 1 -1 0
|
||||||
266 FEAT_EPIC_WEAPON_FOCUS_SLING 629 1 -1 0
|
265 FEAT_EPIC_WEAPON_FOCUS_SICKLE 628 1 -1 0
|
||||||
267 FEAT_EPIC_WEAPON_FOCUS_UNARMED 630 1 -1 0
|
266 FEAT_EPIC_WEAPON_FOCUS_SLING 629 1 -1 0
|
||||||
268 FEAT_EPIC_WEAPON_FOCUS_LONGBOW 631 1 -1 0
|
267 FEAT_EPIC_WEAPON_FOCUS_UNARMED 630 1 -1 0
|
||||||
269 FEAT_EPIC_WEAPON_FOCUS_SHORTBOW 632 1 -1 0
|
268 FEAT_EPIC_WEAPON_FOCUS_LONGBOW 631 1 -1 0
|
||||||
270 FEAT_EPIC_WEAPON_FOCUS_SHORTSWORD 633 1 -1 0
|
269 FEAT_EPIC_WEAPON_FOCUS_SHORTBOW 632 1 -1 0
|
||||||
271 FEAT_EPIC_WEAPON_FOCUS_RAPIER 634 1 -1 0
|
270 FEAT_EPIC_WEAPON_FOCUS_SHORTSWORD 633 1 -1 0
|
||||||
272 FEAT_EPIC_WEAPON_FOCUS_SCIMITAR 635 1 -1 0
|
271 FEAT_EPIC_WEAPON_FOCUS_RAPIER 634 1 -1 0
|
||||||
273 FEAT_EPIC_WEAPON_FOCUS_LONGSWORD 636 1 -1 0
|
272 FEAT_EPIC_WEAPON_FOCUS_SCIMITAR 635 1 -1 0
|
||||||
274 FEAT_EPIC_WEAPON_FOCUS_GREATSWORD 637 1 -1 0
|
273 FEAT_EPIC_WEAPON_FOCUS_LONGSWORD 636 1 -1 0
|
||||||
275 FEAT_EPIC_WEAPON_FOCUS_HANDAXE 638 1 -1 0
|
274 FEAT_EPIC_WEAPON_FOCUS_GREATSWORD 637 1 -1 0
|
||||||
276 FEAT_EPIC_WEAPON_FOCUS_THROWINGAXE 639 1 -1 0
|
275 FEAT_EPIC_WEAPON_FOCUS_HANDAXE 638 1 -1 0
|
||||||
277 FEAT_EPIC_WEAPON_FOCUS_BATTLEAXE 640 1 -1 0
|
276 FEAT_EPIC_WEAPON_FOCUS_THROWINGAXE 639 1 -1 0
|
||||||
278 FEAT_EPIC_WEAPON_FOCUS_GREATAXE 641 1 -1 0
|
277 FEAT_EPIC_WEAPON_FOCUS_BATTLEAXE 640 1 -1 0
|
||||||
279 FEAT_EPIC_WEAPON_FOCUS_HALBERD 642 1 -1 0
|
278 FEAT_EPIC_WEAPON_FOCUS_GREATAXE 641 1 -1 0
|
||||||
280 FEAT_EPIC_WEAPON_FOCUS_LIGHTHAMMER 643 1 -1 0
|
279 FEAT_EPIC_WEAPON_FOCUS_HALBERD 642 1 -1 0
|
||||||
281 FEAT_EPIC_WEAPON_FOCUS_LIGHTFLAIL 644 1 -1 0
|
280 FEAT_EPIC_WEAPON_FOCUS_LIGHTHAMMER 643 1 -1 0
|
||||||
282 FEAT_EPIC_WEAPON_FOCUS_WARHAMMER 645 1 -1 0
|
281 FEAT_EPIC_WEAPON_FOCUS_LIGHTFLAIL 644 1 -1 0
|
||||||
283 FEAT_EPIC_WEAPON_FOCUS_HEAVYFLAIL 646 1 -1 0
|
282 FEAT_EPIC_WEAPON_FOCUS_WARHAMMER 645 1 -1 0
|
||||||
284 FEAT_EPIC_WEAPON_FOCUS_KAMA 647 1 -1 0
|
283 FEAT_EPIC_WEAPON_FOCUS_HEAVYFLAIL 646 1 -1 0
|
||||||
285 FEAT_EPIC_WEAPON_FOCUS_KUKRI 648 1 -1 0
|
284 FEAT_EPIC_WEAPON_FOCUS_KAMA 647 1 -1 0
|
||||||
286 FEAT_EPIC_WEAPON_FOCUS_SHURIKEN 649 1 -1 0
|
285 FEAT_EPIC_WEAPON_FOCUS_KUKRI 648 1 -1 0
|
||||||
287 FEAT_EPIC_WEAPON_FOCUS_SCYTHE 650 1 -1 0
|
286 FEAT_EPIC_WEAPON_FOCUS_SHURIKEN 649 1 -1 0
|
||||||
288 FEAT_EPIC_WEAPON_FOCUS_KATANA 651 1 -1 0
|
287 FEAT_EPIC_WEAPON_FOCUS_SCYTHE 650 1 -1 0
|
||||||
289 FEAT_EPIC_WEAPON_FOCUS_BASTARDSWORD 652 1 -1 0
|
288 FEAT_EPIC_WEAPON_FOCUS_KATANA 651 1 -1 0
|
||||||
290 FEAT_EPIC_WEAPON_FOCUS_DIREMACE 653 1 -1 0
|
289 FEAT_EPIC_WEAPON_FOCUS_BASTARDSWORD 652 1 -1 0
|
||||||
291 FEAT_EPIC_WEAPON_FOCUS_DOUBLEAXE 654 1 -1 0
|
290 FEAT_EPIC_WEAPON_FOCUS_DIREMACE 653 1 -1 0
|
||||||
292 FEAT_EPIC_WEAPON_FOCUS_TWOBLADEDSWORD 655 1 -1 0
|
291 FEAT_EPIC_WEAPON_FOCUS_DOUBLEAXE 654 1 -1 0
|
||||||
293 FEAT_EPIC_OVERWHELMING_CRITICAL_CLUB 709 1 -1 0
|
292 FEAT_EPIC_WEAPON_FOCUS_TWOBLADEDSWORD 655 1 -1 0
|
||||||
294 FEAT_EPIC_OVERWHELMING_CRITICAL_DAGGER 710 1 -1 0
|
293 FEAT_EPIC_OVERWHELMING_CRITICAL_CLUB 709 1 -1 0
|
||||||
295 FEAT_EPIC_OVERWHELMING_CRITICAL_DART 711 1 -1 0
|
294 FEAT_EPIC_OVERWHELMING_CRITICAL_DAGGER 710 1 -1 0
|
||||||
296 FEAT_EPIC_OVERWHELMING_CRITICAL_HEAVYCROSSBOW 712 1 -1 0
|
295 FEAT_EPIC_OVERWHELMING_CRITICAL_DART 711 1 -1 0
|
||||||
297 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTCROSSBOW 713 1 -1 0
|
296 FEAT_EPIC_OVERWHELMING_CRITICAL_HEAVYCROSSBOW 712 1 -1 0
|
||||||
298 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTMACE 714 1 -1 0
|
297 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTCROSSBOW 713 1 -1 0
|
||||||
299 FEAT_EPIC_OVERWHELMING_CRITICAL_MORNINGSTAR 715 1 -1 0
|
298 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTMACE 714 1 -1 0
|
||||||
300 FEAT_EPIC_OVERWHELMING_CRITICAL_QUARTERSTAFF 716 1 -1 0
|
299 FEAT_EPIC_OVERWHELMING_CRITICAL_MORNINGSTAR 715 1 -1 0
|
||||||
301 FEAT_EPIC_OVERWHELMING_CRITICAL_SHORTSPEAR 717 1 -1 0
|
300 FEAT_EPIC_OVERWHELMING_CRITICAL_QUARTERSTAFF 716 1 -1 0
|
||||||
302 FEAT_EPIC_OVERWHELMING_CRITICAL_SICKLE 718 1 -1 0
|
301 FEAT_EPIC_OVERWHELMING_CRITICAL_SHORTSPEAR 717 1 -1 0
|
||||||
303 FEAT_EPIC_OVERWHELMING_CRITICAL_SLING 719 1 -1 0
|
302 FEAT_EPIC_OVERWHELMING_CRITICAL_SICKLE 718 1 -1 0
|
||||||
304 FEAT_EPIC_OVERWHELMING_CRITICAL_UNARMED 720 1 -1 0
|
303 FEAT_EPIC_OVERWHELMING_CRITICAL_SLING 719 1 -1 0
|
||||||
305 FEAT_EPIC_OVERWHELMING_CRITICAL_LONGBOW 721 1 -1 0
|
304 FEAT_EPIC_OVERWHELMING_CRITICAL_UNARMED 720 1 -1 0
|
||||||
306 FEAT_EPIC_OVERWHELMING_CRITICAL_SHORTBOW 722 1 -1 0
|
305 FEAT_EPIC_OVERWHELMING_CRITICAL_LONGBOW 721 1 -1 0
|
||||||
307 FEAT_EPIC_OVERWHELMING_CRITICAL_SHORTSWORD 723 1 -1 0
|
306 FEAT_EPIC_OVERWHELMING_CRITICAL_SHORTBOW 722 1 -1 0
|
||||||
308 FEAT_EPIC_OVERWHELMING_CRITICAL_RAPIER 724 1 -1 0
|
307 FEAT_EPIC_OVERWHELMING_CRITICAL_SHORTSWORD 723 1 -1 0
|
||||||
309 FEAT_EPIC_OVERWHELMING_CRITICAL_SCIMITAR 725 1 -1 0
|
308 FEAT_EPIC_OVERWHELMING_CRITICAL_RAPIER 724 1 -1 0
|
||||||
310 FEAT_EPIC_OVERWHELMING_CRITICAL_LONGSWORD 726 1 -1 0
|
309 FEAT_EPIC_OVERWHELMING_CRITICAL_SCIMITAR 725 1 -1 0
|
||||||
311 FEAT_EPIC_OVERWHELMING_CRITICAL_GREATSWORD 727 1 -1 0
|
310 FEAT_EPIC_OVERWHELMING_CRITICAL_LONGSWORD 726 1 -1 0
|
||||||
312 FEAT_EPIC_OVERWHELMING_CRITICAL_HANDAXE 728 1 -1 0
|
311 FEAT_EPIC_OVERWHELMING_CRITICAL_GREATSWORD 727 1 -1 0
|
||||||
313 FEAT_EPIC_OVERWHELMING_CRITICAL_THROWINGAXE 729 1 -1 0
|
312 FEAT_EPIC_OVERWHELMING_CRITICAL_HANDAXE 728 1 -1 0
|
||||||
314 FEAT_EPIC_OVERWHELMING_CRITICAL_BATTLEAXE 730 1 -1 0
|
313 FEAT_EPIC_OVERWHELMING_CRITICAL_THROWINGAXE 729 1 -1 0
|
||||||
315 FEAT_EPIC_OVERWHELMING_CRITICAL_GREATAXE 731 1 -1 0
|
314 FEAT_EPIC_OVERWHELMING_CRITICAL_BATTLEAXE 730 1 -1 0
|
||||||
316 FEAT_EPIC_OVERWHELMING_CRITICAL_HALBERD 732 1 -1 0
|
315 FEAT_EPIC_OVERWHELMING_CRITICAL_GREATAXE 731 1 -1 0
|
||||||
317 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTHAMMER 733 1 -1 0
|
316 FEAT_EPIC_OVERWHELMING_CRITICAL_HALBERD 732 1 -1 0
|
||||||
318 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTFLAIL 734 1 -1 0
|
317 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTHAMMER 733 1 -1 0
|
||||||
319 FEAT_EPIC_OVERWHELMING_CRITICAL_WARHAMMER 735 1 -1 0
|
318 FEAT_EPIC_OVERWHELMING_CRITICAL_LIGHTFLAIL 734 1 -1 0
|
||||||
320 FEAT_EPIC_OVERWHELMING_CRITICAL_HEAVYFLAIL 736 1 -1 0
|
319 FEAT_EPIC_OVERWHELMING_CRITICAL_WARHAMMER 735 1 -1 0
|
||||||
321 FEAT_EPIC_OVERWHELMING_CRITICAL_KAMA 737 1 -1 0
|
320 FEAT_EPIC_OVERWHELMING_CRITICAL_HEAVYFLAIL 736 1 -1 0
|
||||||
322 FEAT_EPIC_OVERWHELMING_CRITICAL_KUKRI 738 1 -1 0
|
321 FEAT_EPIC_OVERWHELMING_CRITICAL_KAMA 737 1 -1 0
|
||||||
323 FEAT_EPIC_OVERWHELMING_CRITICAL_SHURIKEN 739 1 -1 0
|
322 FEAT_EPIC_OVERWHELMING_CRITICAL_KUKRI 738 1 -1 0
|
||||||
324 FEAT_EPIC_OVERWHELMING_CRITICAL_SCYTHE 740 1 -1 0
|
323 FEAT_EPIC_OVERWHELMING_CRITICAL_SHURIKEN 739 1 -1 0
|
||||||
325 FEAT_EPIC_OVERWHELMING_CRITICAL_KATANA 741 1 -1 0
|
324 FEAT_EPIC_OVERWHELMING_CRITICAL_SCYTHE 740 1 -1 0
|
||||||
326 FEAT_EPIC_OVERWHELMING_CRITICAL_BASTARDSWORD 742 1 -1 0
|
325 FEAT_EPIC_OVERWHELMING_CRITICAL_KATANA 741 1 -1 0
|
||||||
327 FEAT_EPIC_OVERWHELMING_CRITICAL_DIREMACE 743 1 -1 0
|
326 FEAT_EPIC_OVERWHELMING_CRITICAL_BASTARDSWORD 742 1 -1 0
|
||||||
328 FEAT_EPIC_OVERWHELMING_CRITICAL_DOUBLEAXE 744 1 -1 0
|
327 FEAT_EPIC_OVERWHELMING_CRITICAL_DIREMACE 743 1 -1 0
|
||||||
329 FEAT_EPIC_OVERWHELMING_CRITICAL_TWOBLADEDSWORD 745 1 -1 0
|
328 FEAT_EPIC_OVERWHELMING_CRITICAL_DOUBLEAXE 744 1 -1 0
|
||||||
330 FEAT_EPIC_DEVASTATING_CRITICAL_TRIDENT 1075 1 -1 0
|
329 FEAT_EPIC_OVERWHELMING_CRITICAL_TWOBLADEDSWORD 745 1 -1 0
|
||||||
331 FEAT_EPIC_WEAPON_FOCUS_TRIDENT 1076 1 -1 0
|
330 FEAT_EPIC_DEVASTATING_CRITICAL_TRIDENT 1075 1 -1 0
|
||||||
332 FEAT_EPIC_OVERWHELMING_CRITICAL_TRIDENT 1078 1 -1 0
|
331 FEAT_EPIC_WEAPON_FOCUS_TRIDENT 1076 1 -1 0
|
||||||
333 FEAT_EPIC_TOUGHNESS_1 754 1 -1 0
|
332 FEAT_EPIC_OVERWHELMING_CRITICAL_TRIDENT 1078 1 -1 0
|
||||||
334 FEAT_EPIC_TOUGHNESS_2 755 1 -1 0
|
333 FEAT_EPIC_TOUGHNESS_1 754 1 -1 0
|
||||||
335 FEAT_EPIC_TOUGHNESS_3 756 1 -1 0
|
334 FEAT_EPIC_TOUGHNESS_2 755 1 -1 0
|
||||||
336 FEAT_EPIC_TOUGHNESS_4 757 1 -1 0
|
335 FEAT_EPIC_TOUGHNESS_3 756 1 -1 0
|
||||||
337 FEAT_EPIC_TOUGHNESS_5 758 1 -1 0
|
336 FEAT_EPIC_TOUGHNESS_4 757 1 -1 0
|
||||||
338 FEAT_EPIC_TOUGHNESS_6 759 1 -1 0
|
337 FEAT_EPIC_TOUGHNESS_5 758 1 -1 0
|
||||||
339 FEAT_EPIC_TOUGHNESS_7 760 1 -1 0
|
338 FEAT_EPIC_TOUGHNESS_6 759 1 -1 0
|
||||||
340 FEAT_EPIC_TOUGHNESS_8 761 1 -1 0
|
339 FEAT_EPIC_TOUGHNESS_7 760 1 -1 0
|
||||||
341 FEAT_EPIC_TOUGHNESS_9 762 1 -1 0
|
340 FEAT_EPIC_TOUGHNESS_8 761 1 -1 0
|
||||||
342 FEAT_EPIC_TOUGHNESS_10 763 1 -1 0
|
341 FEAT_EPIC_TOUGHNESS_9 762 1 -1 0
|
||||||
343 FEAT_EPIC_DEVASTATING_CRITICAL_DWAXE 955 1 -1 0
|
342 FEAT_EPIC_TOUGHNESS_10 763 1 -1 0
|
||||||
344 FEAT_EPIC_WEAPON_FOCUS_DWAXE 956 1 -1 0
|
343 FEAT_EPIC_DEVASTATING_CRITICAL_DWAXE 955 1 -1 0
|
||||||
345 FEAT_EPIC_OVERWHELMING_CRITICAL_DWAXE 958 1 -1 0
|
344 FEAT_EPIC_WEAPON_FOCUS_DWAXE 956 1 -1 0
|
||||||
346 FEAT_IMPROVED_CRITICAL_WHIP 995 1 -1 0
|
345 FEAT_EPIC_OVERWHELMING_CRITICAL_DWAXE 958 1 -1 0
|
||||||
347 FEAT_EPIC_WEAPON_FOCUS_WHIP 997 1 -1 0
|
346 FEAT_IMPROVED_CRITICAL_WHIP 995 1 -1 0
|
||||||
348 FEAT_EPIC_DEVASTATING_CRITICAL_WHIP 996 1 -1 0
|
347 FEAT_EPIC_WEAPON_FOCUS_WHIP 997 1 -1 0
|
||||||
349 FEAT_EPIC_OVERWHELMING_CRITICAL_WHIP 999 1 -1 0
|
348 FEAT_EPIC_DEVASTATING_CRITICAL_WHIP 996 1 -1 0
|
||||||
350 FEAT_IMPROVED_WHIRLWIND 868 1 -1 0
|
349 FEAT_EPIC_OVERWHELMING_CRITICAL_WHIP 999 1 -1 0
|
||||||
351 FEAT_EPIC_SUPERIOR_INITIATIVE 753 1 -1 0
|
350 FEAT_IMPROVED_WHIRLWIND 868 1 -1 0
|
||||||
352 FEAT_EPIC_SPELL_FOCUS_ABJURATION 610 1 -1 0
|
351 FEAT_EPIC_SUPERIOR_INITIATIVE 753 1 -1 0
|
||||||
353 FEAT_EPIC_SPELL_FOCUS_CONJURATION 611 1 -1 0
|
352 FEAT_EPIC_SPELL_FOCUS_ABJURATION 610 1 -1 0
|
||||||
354 FEAT_EPIC_SPELL_FOCUS_DIVINATION 612 1 -1 0
|
353 FEAT_EPIC_SPELL_FOCUS_CONJURATION 611 1 -1 0
|
||||||
355 FEAT_EPIC_SPELL_FOCUS_ENCHANTMENT 613 1 -1 0
|
354 FEAT_EPIC_SPELL_FOCUS_DIVINATION 612 1 -1 0
|
||||||
356 FEAT_EPIC_SPELL_FOCUS_EVOCATION 614 1 -1 0
|
355 FEAT_EPIC_SPELL_FOCUS_ENCHANTMENT 613 1 -1 0
|
||||||
357 FEAT_EPIC_SPELL_FOCUS_ILLUSION 615 1 -1 0
|
356 FEAT_EPIC_SPELL_FOCUS_EVOCATION 614 1 -1 0
|
||||||
358 FEAT_EPIC_SPELL_FOCUS_NECROMANCY 616 1 -1 0
|
357 FEAT_EPIC_SPELL_FOCUS_ILLUSION 615 1 -1 0
|
||||||
359 FEAT_EPIC_SPELL_FOCUS_TRANSMUTATION 617 1 -1 0
|
358 FEAT_EPIC_SPELL_FOCUS_NECROMANCY 616 1 -1 0
|
||||||
360 FEAT_EPIC_SPELL_PENETRATION 618 1 -1 0
|
359 FEAT_EPIC_SPELL_FOCUS_TRANSMUTATION 617 1 -1 0
|
||||||
361 FEAT_EPIC_IMPROVED_COMBAT_CASTING 696 1 -1 0
|
360 FEAT_EPIC_SPELL_PENETRATION 618 1 -1 0
|
||||||
362 FEAT_EPIC_AUTOMATIC_STILL_SPELL_1 863 1 -1 0
|
361 FEAT_EPIC_IMPROVED_COMBAT_CASTING 696 1 -1 0
|
||||||
363 FEAT_EPIC_AUTOMATIC_STILL_SPELL_2 864 1 -1 0
|
362 FEAT_EPIC_AUTOMATIC_STILL_SPELL_1 863 1 -1 0
|
||||||
364 FEAT_EPIC_AUTOMATIC_STILL_SPELL_3 865 1 -1 0
|
363 FEAT_EPIC_AUTOMATIC_STILL_SPELL_2 864 1 -1 0
|
||||||
365 Epic_Eldritch_Knight 4013 3 11 0
|
364 FEAT_EPIC_AUTOMATIC_STILL_SPELL_3 865 1 -1 0
|
||||||
366 SpellFocusCon 166 0 -1 0
|
365 Epic_Eldritch_Knight 4013 3 11 0
|
||||||
367 SpellFocusDiv 167 0 -1 0
|
366 SpellFocusCon 166 0 -1 0
|
||||||
368 SpellFocusEnc 168 0 -1 0
|
367 SpellFocusDiv 167 0 -1 0
|
||||||
369 SpellFocusEvo 169 0 -1 0
|
368 SpellFocusEnc 168 0 -1 0
|
||||||
370 SpellFocusIll 170 0 -1 0
|
369 SpellFocusEvo 169 0 -1 0
|
||||||
371 SpellFocusNec 171 0 -1 0
|
370 SpellFocusIll 170 0 -1 0
|
||||||
372 SpellFocusTra 172 0 -1 0
|
371 SpellFocusNec 171 0 -1 0
|
||||||
373 SpellFocusAbj 35 0 -1 0
|
372 SpellFocusTra 172 0 -1 0
|
||||||
374 FocusedSpellPenetrCon 3128 0 -1 0
|
373 SpellFocusAbj 35 0 -1 0
|
||||||
375 FocusedSpellPenetrDiv 3129 0 -1 0
|
374 FocusedSpellPenetrCon 3128 0 -1 0
|
||||||
376 FocusedSpellPenetrEnc 3130 0 -1 0
|
375 FocusedSpellPenetrDiv 3129 0 -1 0
|
||||||
377 FocusedSpellPenetrEvo 3131 0 -1 0
|
376 FocusedSpellPenetrEnc 3130 0 -1 0
|
||||||
378 FocusedSpellPenetrIll 3132 0 -1 0
|
377 FocusedSpellPenetrEvo 3131 0 -1 0
|
||||||
379 FocusedSpellPenetrNec 3133 0 -1 0
|
378 FocusedSpellPenetrIll 3132 0 -1 0
|
||||||
380 FocusedSpellPenetrTra 3134 0 -1 0
|
379 FocusedSpellPenetrNec 3133 0 -1 0
|
||||||
381 FocusedSpellPenetrAbj 3135 0 -1 0
|
380 FocusedSpellPenetrTra 3134 0 -1 0
|
||||||
382 FEAT_EPIC_BLINDING_SPEED 491 0 -1 1
|
381 FocusedSpellPenetrAbj 3135 0 -1 0
|
||||||
383 Quicken 29 0 -1 0
|
382 FEAT_EPIC_BLINDING_SPEED 491 0 -1 1
|
||||||
384 FEAT_EPIC_AUTOMATIC_QUICKEN_1 857 0 -1 0
|
383 Quicken 29 0 -1 0
|
||||||
385 FEAT_EPIC_AUTOMATIC_QUICKEN_2 858 0 -1 0
|
384 FEAT_EPIC_AUTOMATIC_QUICKEN_1 857 0 -1 0
|
||||||
386 FEAT_EPIC_AUTOMATIC_QUICKEN_3 859 0 -1 0
|
385 FEAT_EPIC_AUTOMATIC_QUICKEN_2 858 0 -1 0
|
||||||
387 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_1 860 0 -1 0
|
386 FEAT_EPIC_AUTOMATIC_QUICKEN_3 859 0 -1 0
|
||||||
388 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_2 861 0 -1 0
|
387 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_1 860 0 -1 0
|
||||||
389 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_3 862 0 -1 0
|
388 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_2 861 0 -1 0
|
||||||
390 OverWCrit_Mindblade 3615 1 -1 0
|
389 FEAT_EPIC_AUTOMATIC_SILENT_SPELL_3 862 0 -1 0
|
||||||
391 DevCrit_Mindblade 3616 1 -1 0
|
390 OverWCrit_Mindblade 3615 1 -1 0
|
||||||
392 Epic_WeaponFocus_Mindblade 3618 1 -1 0
|
391 DevCrit_Mindblade 3616 1 -1 0
|
||||||
393 ImpCrit_Mindblade 3614 1 -1 0
|
392 Epic_WeaponFocus_Mindblade 3618 1 -1 0
|
||||||
394 PERFECT_TWO_WEAPON_FIGHTING 4320 1 -1 0
|
393 ImpCrit_Mindblade 3614 1 -1 0
|
||||||
395 Two-Weapon_Rend 3113 1 -1 0
|
394 PERFECT_TWO_WEAPON_FIGHTING 4320 1 -1 0
|
||||||
396 GREATER_TWO_WEAPON_FIGHTING 4315 1 -1 0
|
395 Two-Weapon_Rend 3113 1 -1 0
|
||||||
397 Bane_Magic_Aberration 23556 0 -1 0
|
396 GREATER_TWO_WEAPON_FIGHTING 4315 1 -1 0
|
||||||
398 Bane_Magic_Animal 23557 0 -1 0
|
397 Bane_Magic_Aberration 23556 0 -1 0
|
||||||
399 Bane_Magic_Beast 23558 0 -1 0
|
398 Bane_Magic_Animal 23557 0 -1 0
|
||||||
400 Bane_Magic_Construct 23559 0 -1 0
|
399 Bane_Magic_Beast 23558 0 -1 0
|
||||||
401 Bane_Magic_Dragon 23560 0 -1 0
|
400 Bane_Magic_Construct 23559 0 -1 0
|
||||||
402 Bane_Magic_Dwarf 23561 0 -1 0
|
401 Bane_Magic_Dragon 23560 0 -1 0
|
||||||
403 Bane_Magic_Elemental 23562 0 -1 0
|
402 Bane_Magic_Dwarf 23561 0 -1 0
|
||||||
404 Bane_Magic_Elf 23563 0 -1 0
|
403 Bane_Magic_Elemental 23562 0 -1 0
|
||||||
405 Bane_Magic_Fey 23564 0 -1 0
|
404 Bane_Magic_Elf 23563 0 -1 0
|
||||||
406 Bane_Magic_Giant 23565 0 -1 0
|
405 Bane_Magic_Fey 23564 0 -1 0
|
||||||
407 Bane_Magic_Gnome 23566 0 -1 0
|
406 Bane_Magic_Giant 23565 0 -1 0
|
||||||
408 Bane_Magic_HalfElf 23567 0 -1 0
|
407 Bane_Magic_Gnome 23566 0 -1 0
|
||||||
409 Bane_Magic_Halfling 23568 0 -1 0
|
408 Bane_Magic_HalfElf 23567 0 -1 0
|
||||||
410 Bane_Magic_HalfOrc 23569 0 -1 0
|
409 Bane_Magic_Halfling 23568 0 -1 0
|
||||||
411 Bane_Magic_Human 23570 0 -1 0
|
410 Bane_Magic_HalfOrc 23569 0 -1 0
|
||||||
412 Bane_Magic_Humanoid_Goblinoid 23571 0 -1 0
|
411 Bane_Magic_Human 23570 0 -1 0
|
||||||
413 Bane_Magic_Humanoid_Monstrous 23572 0 -1 0
|
412 Bane_Magic_Humanoid_Goblinoid 23571 0 -1 0
|
||||||
414 Bane_Magic_Humanoid_Orc 23573 0 -1 0
|
413 Bane_Magic_Humanoid_Monstrous 23572 0 -1 0
|
||||||
415 Bane_Magic_Humanoid_Reptilian 23574 0 -1 0
|
414 Bane_Magic_Humanoid_Orc 23573 0 -1 0
|
||||||
416 Bane_Magic_Magical_Beast 23575 0 -1 0
|
415 Bane_Magic_Humanoid_Reptilian 23574 0 -1 0
|
||||||
417 Bane_Magic_Outsider 23576 0 -1 0
|
416 Bane_Magic_Magical_Beast 23575 0 -1 0
|
||||||
418 Bane_Magic_Shapechanger 23577 0 -1 0
|
417 Bane_Magic_Outsider 23576 0 -1 0
|
||||||
419 Bane_Magic_Undead 23578 0 -1 0
|
418 Bane_Magic_Shapechanger 23577 0 -1 0
|
||||||
420 Bane_Magic_Vermin 23579 0 -1 0
|
419 Bane_Magic_Undead 23578 0 -1 0
|
||||||
|
420 Bane_Magic_Vermin 23579 0 -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
|
||||||
|
|||||||
@@ -1,73 +1,70 @@
|
|||||||
2DA V2.0
|
2DA V2.0
|
||||||
|
|
||||||
FeatLabel FeatIndex List GrantedOnLevel OnMenu
|
FeatLabel FeatIndex List GrantedOnLevel OnMenu
|
||||||
0 DefArrow 8 0 -1 0
|
0 DefArrow 8 0 -1 0
|
||||||
1 Quicken 29 0 -1 0
|
1 Quicken 29 0 -1 0
|
||||||
2 TwoWeap 41 0 -1 0
|
2 TwoWeap 41 0 -1 0
|
||||||
3 Ambidex 1 0 -1 0
|
3 Ambidex 1 0 -1 0
|
||||||
4 HIDE_IN_PLAIN_SIGHT 433 3 1 0
|
4 HIDE_IN_PLAIN_SIGHT 433 3 1 0
|
||||||
5 SHADOW_DAZE 434 3 3 1
|
5 SHADOW_DAZE 434 3 3 1
|
||||||
6 SUMMON_SHADOW 435 3 3 1
|
6 SUMMON_SHADOW 435 3 3 1
|
||||||
7 SHADOW_EVADE 436 3 4 1
|
7 SHADOW_EVADE 436 3 4 1
|
||||||
8 Evasion 206 3 2 0
|
8 Evasion 206 3 2 0
|
||||||
9 darkvision 228 3 2 0
|
9 darkvision 228 3 2 0
|
||||||
10 UncannyDodge1 195 3 2 0
|
10 UncannyDodge1 195 3 2 0
|
||||||
11 DefensiveRoll 223 3 5 0
|
11 DefensiveRoll 223 3 5 0
|
||||||
12 UncannyDodge2 251 3 5 0
|
12 UncannyDodge2 251 3 5 0
|
||||||
13 SlipperMind 259 3 7 0
|
13 SlipperMind 259 3 7 0
|
||||||
14 ImprovedEvasion 212 3 10 0
|
14 ImprovedEvasion 212 3 10 0
|
||||||
15 UncannyDodge3 252 3 10 0
|
15 UncannyDodge3 252 3 10 0
|
||||||
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
|
||||||
|
|||||||
@@ -1,129 +1,129 @@
|
|||||||
2DA V2.0
|
2DA V2.0
|
||||||
|
|
||||||
LABEL STRREF DESCRIPTION ICON
|
LABEL STRREF DESCRIPTION ICON
|
||||||
0 ImprovedCritical 6489 228 ife_impcrit
|
0 ImprovedCritical 6489 228 ife_impcrit
|
||||||
1 WeaponFocus 6490 436 ife_wepfoc
|
1 WeaponFocus 6490 436 ife_wepfoc
|
||||||
2 WeaponSpecialization 6491 444 ife_wepspec
|
2 WeaponSpecialization 6491 444 ife_wepspec
|
||||||
3 SpellFocus 6492 426 ife_magic
|
3 SpellFocus 6492 426 ife_magic
|
||||||
4 SkillFocus 6493 424 ife_skfoc
|
4 SkillFocus 6493 424 ife_skfoc
|
||||||
5 FavoredEnemy 6566 6079 ife_racehate
|
5 FavoredEnemy 6566 6079 ife_racehate
|
||||||
6 GreaterSpellFocus 2838 2791 ife_magic
|
6 GreaterSpellFocus 2838 2791 ife_magic
|
||||||
7 ArcaneDefense 2839 2823 ife_magic
|
7 ArcaneDefense 2839 2823 ife_magic
|
||||||
8 ResistEnergy 2840 2835 ife_magic
|
8 ResistEnergy 2840 2835 ife_magic
|
||||||
9 WeaponOfChoice 83313 8728 ife_X2WpCh
|
9 WeaponOfChoice 83313 8728 ife_X2WpCh
|
||||||
10 EpicWeaponFocus 83475 8415 ife_X2EWpFo
|
10 EpicWeaponFocus 83475 8415 ife_X2EWpFo
|
||||||
11 EpicWeaponSpec 83481 8456 ife_X2WpSpec
|
11 EpicWeaponSpec 83481 8456 ife_X2WpSpec
|
||||||
12 OverwhelmingCritical 83480 8524 ife_X2OvCrit
|
12 OverwhelmingCritical 83480 8524 ife_X2OvCrit
|
||||||
13 DevastatingCrit 83482 3909 ife_X2DevCrit
|
13 DevastatingCrit 83482 3909 ife_X2DevCrit
|
||||||
14 EpicSpell 83483 83484 ife_X2ESpell
|
14 EpicSpell 83483 83484 ife_X2ESpell
|
||||||
15 EpicSkillFocus 83485 4063 ife_X2skfoc
|
15 EpicSkillFocus 83485 4063 ife_X2skfoc
|
||||||
16 EpicSpellFocus 83486 4084 ife_X2magic
|
16 EpicSpellFocus 83486 4084 ife_X2magic
|
||||||
17 EpicEnergyResistance 83487 83488 ife_X2EResi
|
17 EpicEnergyResistance 83487 83488 ife_X2EResi
|
||||||
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 **** **** **** ****
|
40 **** **** **** ****
|
||||||
41 **** **** **** ****
|
41 **** **** **** ****
|
||||||
42 **** **** **** ****
|
42 **** **** **** ****
|
||||||
43 **** **** **** ****
|
43 **** **** **** ****
|
||||||
44 **** **** **** ****
|
44 **** **** **** ****
|
||||||
45 **** **** **** ****
|
45 **** **** **** ****
|
||||||
46 **** **** **** ****
|
46 **** **** **** ****
|
||||||
47 **** **** **** ****
|
47 **** **** **** ****
|
||||||
48 **** **** **** ****
|
48 **** **** **** ****
|
||||||
49 **** **** **** ****
|
49 **** **** **** ****
|
||||||
50 SpellLikeAbility 16822760 16822761 ife_X2ESpell
|
50 SpellLikeAbility 16822760 16822761 ife_X2ESpell
|
||||||
51 **** **** **** ****
|
51 **** **** **** ****
|
||||||
52 BindingFeats 16835231 16835232 fot_oracle
|
52 BindingFeats 16835231 16835232 fot_oracle
|
||||||
53 IncarnumFeats 16838110 16838111 ife_psi_focus
|
53 IncarnumFeats 16838110 16838111 ife_psi_focus
|
||||||
54 ShadowcastingFeats 16836244 16836245 ife_X1SDaze
|
54 ShadowcastingFeats 16836244 16836245 ife_X1SDaze
|
||||||
55 HatedFoe 16824268 16824269 ife_racehate
|
55 HatedFoe 16824268 16824269 ife_racehate
|
||||||
56 Gather_Horde 16824322 16824323 ife_unseenwander
|
56 Gather_Horde 16824322 16824323 ife_unseenwander
|
||||||
57 Gather_Horde 16824324 16824325 ife_unseenwander
|
57 Gather_Horde 16824324 16824325 ife_unseenwander
|
||||||
58 Summon_Demon 16824528 16824529 ife_alertness
|
58 Summon_Demon 16824528 16824529 ife_alertness
|
||||||
59 DragonHeritage 16832504 16832505 ife_drag_group
|
59 DragonHeritage 16832504 16832505 ife_drag_group
|
||||||
60 DraconicFeats 16832502 16832503 ife_drag_group
|
60 DraconicFeats 16832502 16832503 ife_drag_group
|
||||||
61 Psionic_Breath 16832466 16832467 ife_X2DDBreath
|
61 Psionic_Breath 16832466 16832467 ife_X2DDBreath
|
||||||
62 Dragonwrought 16832408 16832409 ife_drag_group
|
62 Dragonwrought 16832408 16832409 ife_drag_group
|
||||||
63 DragonBlood 16832131 16832132 ife_DDHDincrease
|
63 DragonBlood 16832131 16832132 ife_DDHDincrease
|
||||||
64 Minor_Aura 16828301 16828302 ife_lliiraaura
|
64 Minor_Aura 16828301 16828302 ife_lliiraaura
|
||||||
65 Major_Aura 16828303 16828304 ife_lliiraaura
|
65 Major_Aura 16828303 16828304 ife_lliiraaura
|
||||||
66 Dragon_Affinity 16832585 16832586 ife_drag_group
|
66 Dragon_Affinity 16832585 16832586 ife_drag_group
|
||||||
67 Draconic_Surge_Phys 16832587 16832588 ife_drag_group
|
67 Draconic_Surge_Phys 16832587 16832588 ife_drag_group
|
||||||
68 Draconic_Surge_Mental 16832589 16832590 ife_drag_group
|
68 Draconic_Surge_Mental 16832589 16832590 ife_drag_group
|
||||||
69 ToT_Immunities 16832661 16832662 dradis_immune
|
69 ToT_Immunities 16832661 16832662 dradis_immune
|
||||||
70 TattooFocus 16822436 16822437 rw_scribetatoo
|
70 TattooFocus 16822436 16822437 rw_scribetatoo
|
||||||
71 Dragon_Shaman_Auras 16832707 16832708 ife_lliiraaura
|
71 Dragon_Shaman_Auras 16832707 16832708 ife_lliiraaura
|
||||||
72 Totem_Dragons 16832709 16832710 dradis_gen
|
72 Totem_Dragons 16832709 16832710 dradis_gen
|
||||||
73 Bonus_Draconic_Auras 16832802 16832832 ife_lliiraaura
|
73 Bonus_Draconic_Auras 16832802 16832832 ife_lliiraaura
|
||||||
74 Major_Aura_Draconic 16832818 16832819 ife_lliiraaura
|
74 Major_Aura_Draconic 16832818 16832819 ife_lliiraaura
|
||||||
75 MetabreathFeats 16832867 16832868 ife_X2DDBreath
|
75 MetabreathFeats 16832867 16832868 ife_X2DDBreath
|
||||||
76 BreathChanneling 16832869 16832870 ife_DDHDincrease
|
76 BreathChanneling 16832869 16832870 ife_DDHDincrease
|
||||||
77 BreathEffects 16832922 16832923 ife_X2DDBreath
|
77 BreathEffects 16832922 16832923 ife_X2DDBreath
|
||||||
78 BladeMeditation 16827008 16827009 ife_X2EpWM
|
78 BladeMeditation 16827008 16827009 ife_X2EpWM
|
||||||
79 WarforgedArmor 16828215 16828216 ife_armor_h
|
79 WarforgedArmor 16828215 16828216 ife_armor_h
|
||||||
80 PsionicFeats 16822911 16822912 ife_psifeats
|
80 PsionicFeats 16822911 16822912 ife_psifeats
|
||||||
81 MetaPsionicFeats 16822913 16822914 ife_metapsifeat
|
81 MetaPsionicFeats 16822913 16822914 ife_metapsifeat
|
||||||
82 AntiPsionicFeats 16826474 16826475 ife_antipsifeats
|
82 AntiPsionicFeats 16826474 16826475 ife_antipsifeats
|
||||||
83 DragonAugment 16832444 16832445 dradis_gen
|
83 DragonAugment 16832444 16832445 dradis_gen
|
||||||
84 ShifterFeats 16828112 16828113 ife_X2OutShape
|
84 ShifterFeats 16828112 16828113 ife_X2OutShape
|
||||||
85 PnP_Weapon_Prof_Simp 16834217 16834260 ife_weppro_sim
|
85 PnP_Weapon_Prof_Simp 16834217 16834260 ife_weppro_sim
|
||||||
86 PnP_Weapon_Prof_Mart 16834218 16834261 ife_weppro_mar
|
86 PnP_Weapon_Prof_Mart 16834218 16834261 ife_weppro_mar
|
||||||
87 PnP_Weapon_Prof_Exot 16834219 16834262 ife_weppro_ex
|
87 PnP_Weapon_Prof_Exot 16834219 16834262 ife_weppro_ex
|
||||||
88 UFavoredEnemy 16825439 6079 ife_racehate
|
88 UFavoredEnemy 16825439 6079 ife_racehate
|
||||||
89 VileMartial 16825479 16825480 ife_combat
|
89 VileMartial 16825479 16825480 ife_combat
|
||||||
90 FocusedSpellPenetr 16825325 16825324 ife_magic
|
90 FocusedSpellPenetr 16825325 16825324 ife_magic
|
||||||
91 BondedSummoner 16826038 16826039 ife_mastelem
|
91 BondedSummoner 16826038 16826039 ife_mastelem
|
||||||
92 ElementalConflag 16823300 16823301 ife_mastelem
|
92 ElementalConflag 16823300 16823301 ife_mastelem
|
||||||
93 SanctifyMartial 16823244 16823245 ife_combat
|
93 SanctifyMartial 16823244 16823245 ife_combat
|
||||||
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 **** **** **** ****
|
||||||
101 MinorOozyTouch 16825040 16825041 is_ghoultch
|
101 MinorOozyTouch 16825040 16825041 is_ghoultch
|
||||||
102 MajorOozyTouch 16825050 16825051 is_ghoultch
|
102 MajorOozyTouch 16825050 16825051 is_ghoultch
|
||||||
103 ToBFeats 16836033 16836034 im_MithTornado
|
103 ToBFeats 16836033 16836034 im_MithTornado
|
||||||
104 BaneMagic 16793665 16793666 ife_banemagic
|
104 BaneMagic 16793665 16793666 ife_banemagic
|
||||||
105 MinstrelSongTier1 16823496 16823497 ife_minstrel
|
105 MinstrelSongTier1 16823496 16823497 ife_minstrel
|
||||||
106 FavoredDivSong1 16823500 16823505 ife_fom
|
106 FavoredDivSong1 16823500 16823505 ife_fom
|
||||||
107 FavoredDivSong2 16823501 16823505 ife_fom
|
107 FavoredDivSong2 16823501 16823505 ife_fom
|
||||||
108 FavoredDivSong3 16823502 16823505 ife_fom
|
108 FavoredDivSong3 16823502 16823505 ife_fom
|
||||||
109 FavoredDivSong4 16823503 16823505 ife_fom
|
109 FavoredDivSong4 16823503 16823505 ife_fom
|
||||||
110 FavoredDivSong5 16823504 16823505 ife_fom
|
110 FavoredDivSong5 16823504 16823505 ife_fom
|
||||||
111 BonusDomains 16827845 16827846 rw_specialistdef
|
111 BonusDomains 16827845 16827846 rw_specialistdef
|
||||||
112 FocusedLexicon 16827469 16827468 ife_racehate
|
112 FocusedLexicon 16827469 16827468 ife_racehate
|
||||||
113 UtteranceFocus 16827483 16827482 ife_foc_spel
|
113 UtteranceFocus 16827483 16827482 ife_foc_spel
|
||||||
114 ReserveFeats 16852238 16852239 ife_foc_spel
|
114 ReserveFeats 16852238 16852239 ife_foc_spel
|
||||||
115 **** **** **** ****
|
115 **** **** **** ****
|
||||||
116 **** **** **** ****
|
116 **** **** **** ****
|
||||||
117 DivineGift 16854432 16854433 ife_magic
|
117 DivineGift 16854432 16854433 ife_magic
|
||||||
118 **** **** **** ****
|
118 **** **** **** ****
|
||||||
119 **** **** **** ****
|
119 **** **** **** ****
|
||||||
120 HiddenTalent 16990417 16990418 ife_psifeats
|
120 HiddenTalent 16990417 16990418 ife_psifeats
|
||||||
121 SpecialAttack 16987216 16987217 ife_combat
|
121 SpecialAttack 16987216 16987217 ife_combat
|
||||||
122 InvokerMarkerFeats 16854434 16854435 ife_magic
|
122 InvokerMarkerFeats 16854434 16854435 ife_magic
|
||||||
123 AbilityFocus 16854430 16854431 ife_magic
|
123 AbilityFocus 16854430 16854431 ife_magic
|
||||||
124 PsionDiscipline 16854428 16854429 ife_psifeats
|
124 PsionDiscipline 16854428 16854429 ife_psifeats
|
||||||
125 SpellcastingMarkerFeats 16854426 16854427 ife_magic
|
125 SpellcastingMarkerFeats 16854426 16854427 ife_magic
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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,43 +1,422 @@
|
|||||||
//:://////////////////////////////////////////////
|
//::////////////////////////////////////////////////////////
|
||||||
|
//:: ;-. ,-. ,-. ,-.
|
||||||
|
//:: | ) | ) / ( )
|
||||||
|
//:: |-' |-< | ;-:
|
||||||
|
//:: | | \ \ ( )
|
||||||
|
//:: ' ' ' `-' `-'
|
||||||
|
//::////////////////////////////////////////////////////////
|
||||||
//:: 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;
|
||||||
|
|
||||||
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;
|
||||||
switch(d10())
|
switch(d10())
|
||||||
{
|
{
|
||||||
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//:: Summoned Illithid and Drider have class levels & only get a partial json treatment.
|
||||||
|
if(sSummon == "ep_sum_aberrat01" || sSummon == "ep_sum_aberrat02")
|
||||||
|
{
|
||||||
|
|
||||||
effect eSummon = ExtraordinaryEffect(EffectSummonCreature(sSummon, VFX_FNF_SUMMON_EPIC_UNDEAD, 1.0f));
|
//:: Create the creature
|
||||||
//Apply the summon visual and summon the aberration.
|
object oAberration = MakePsuedonaturalCreatureFromTemplate(sSummon, lTarget);
|
||||||
MultisummonPreSummon();
|
|
||||||
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, PRCGetSpellTargetLocation(), HoursToSeconds(20));
|
|
||||||
|
|
||||||
DelayCommand(0.5, AugmentSummonedCreature(sSummon));
|
effect eSummon = ExtraordinaryEffect(EffectSummonCreature("", VFX_FNF_SUMMON_EPIC_UNDEAD, 0.0, 0, VFX_IMP_UNSUMMON, oAberration));
|
||||||
}
|
//Apply the summon visual and summon the aberration.
|
||||||
PRCSetSchool();
|
MultisummonPreSummon();
|
||||||
|
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));
|
||||||
|
|
||||||
|
//:: 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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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 SpawnTwinFiend(object oPC, json jDevil, location lTarget, float fDuration)
|
||||||
|
{
|
||||||
|
MultisummonPreSummon();
|
||||||
|
|
||||||
|
object oFiend = JsonToObject(jDevil, lTarget);
|
||||||
|
|
||||||
|
int nHD = GetHitDice(oFiend);
|
||||||
|
|
||||||
|
SetLocalInt(oFiend, "PRC_CASTERLEVEL_OVERRIDE", nHD);
|
||||||
|
|
||||||
|
int nCasterLvl = GetTotalCastingLevel(oPC);
|
||||||
|
|
||||||
|
if (!GetIsObjectValid(oFiend))
|
||||||
|
{
|
||||||
|
SendMessageToPC(oPC, "ss_ep_twinfiend | SpawnTwinFiend() >> oFiend not passed to function.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string sSummon = "twinfiend_demon";
|
||||||
|
|
||||||
|
// effect eSummon;
|
||||||
|
effect eVis = EffectVisualEffect(460);
|
||||||
|
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()
|
void main()
|
||||||
{
|
{
|
||||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
object oPC = OBJECT_SELF;
|
||||||
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_CONJURATION);
|
|
||||||
|
|
||||||
if (!X2PreSpellCastCode())
|
if (!X2PreSpellCastCode())
|
||||||
{
|
{
|
||||||
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
DeleteLocalInt(oPC, "X2_L_LAST_SPELLSCHOOL_VAR");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (GetCanCastSpell(OBJECT_SELF, SPELL_EPIC_TWINF))
|
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
//Declare major variables
|
SendMessageToPC(oPC, "ss_ep_twinfiend >> TemplateToJson failed <20> bad resref or resource missing.");
|
||||||
float fDuration = RoundsToSeconds(20);
|
return;
|
||||||
object oFiend, oFiend2;
|
}
|
||||||
|
|
||||||
|
//:: 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 eSummon;
|
||||||
effect eVis = EffectVisualEffect(460);
|
effect eVis = EffectVisualEffect(460);
|
||||||
effect eVis2 = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
effect eVis2 = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
||||||
if(GetPRCSwitch(PRC_MULTISUMMON))
|
|
||||||
|
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))
|
||||||
{
|
{
|
||||||
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);
|
||||||
AssignCommand(oFiend, DetermineCombatRound());
|
|
||||||
AssignCommand(oFiend2, DetermineCombatRound());
|
//:: Update creature weapons for Size increase
|
||||||
DestroyObject(oFiend, fDuration);
|
if (nCasterLvl > 14)
|
||||||
DelayCommand(fDuration, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis2, GetLocation(oFiend)));
|
{
|
||||||
DestroyObject(oFiend2, fDuration);
|
if(DEBUG) DoDebug("ss_ep_twinfiend >> Updating Creature weapons for size increase.");
|
||||||
DelayCommand(fDuration, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis2, GetLocation(oFiend2)));
|
|
||||||
|
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(oFiend2, DetermineCombatRound());
|
||||||
|
|
||||||
|
DestroyObject(oFiend, fDuration);
|
||||||
|
DelayCommand(fDuration, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis2, GetLocation(oFiend)));
|
||||||
|
DestroyObject(oFiend2, fDuration);
|
||||||
|
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,8 +11,123 @@ 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";
|
||||||
|
void LycanthropePoly(object oPC, int nPoly)
|
||||||
|
{
|
||||||
|
effect eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
|
||||||
|
effect ePoly = SupernaturalEffect(EffectPolymorph(nPoly));
|
||||||
|
|
||||||
////////////////Begin Werewolf//////////////////
|
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||||
|
int bArmsSlotAllowed = GetPRCSwitch(PRC_WILDSHAPE_ALLOWS_ARMS_SLOT); // <--- new
|
||||||
|
|
||||||
|
int bWeapon = StringToInt(Get2DACache("polymorph","MergeW",nPoly)) == 1;
|
||||||
|
int bArmor = StringToInt(Get2DACache("polymorph","MergeA",nPoly)) == 1;
|
||||||
|
int bItems = StringToInt(Get2DACache("polymorph","MergeI",nPoly)) == 1;
|
||||||
|
|
||||||
|
object oWeaponOld = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||||||
|
object oArmorOld = GetItemInSlot(INVENTORY_SLOT_CHEST,oPC);
|
||||||
|
object oRing1Old = GetItemInSlot(INVENTORY_SLOT_LEFTRING,oPC);
|
||||||
|
object oRing2Old = GetItemInSlot(INVENTORY_SLOT_RIGHTRING,oPC);
|
||||||
|
object oAmuletOld = GetItemInSlot(INVENTORY_SLOT_NECK,oPC);
|
||||||
|
object oCloakOld = GetItemInSlot(INVENTORY_SLOT_CLOAK,oPC);
|
||||||
|
object oBootsOld = GetItemInSlot(INVENTORY_SLOT_BOOTS,oPC);
|
||||||
|
object oBeltOld = GetItemInSlot(INVENTORY_SLOT_BELT,oPC);
|
||||||
|
object oHelmetOld = GetItemInSlot(INVENTORY_SLOT_HEAD,oPC);
|
||||||
|
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND,oPC);
|
||||||
|
object oGlovesOld = GetItemInSlot(INVENTORY_SLOT_ARMS,oPC);
|
||||||
|
|
||||||
|
if (GetIsObjectValid(oShield))
|
||||||
|
{
|
||||||
|
int nShieldType = GetBaseItemType(oShield);
|
||||||
|
if (nShieldType != BASE_ITEM_LARGESHIELD &&
|
||||||
|
nShieldType != BASE_ITEM_SMALLSHIELD &&
|
||||||
|
nShieldType != BASE_ITEM_TOWERSHIELD)
|
||||||
|
{
|
||||||
|
oShield = OBJECT_INVALID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ShifterCheck(oPC);
|
||||||
|
ClearAllActions();
|
||||||
|
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, oPC);
|
||||||
|
|
||||||
|
object oWeaponNewRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
|
||||||
|
object oWeaponNewLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
||||||
|
object oWeaponNewBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
|
||||||
|
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
Weapon merge block
|
||||||
|
If 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)
|
void LycanthropePoly(object oPC, int nPoly)
|
||||||
{
|
{
|
||||||
@@ -21,6 +136,9 @@ void LycanthropePoly(object oPC, int nPoly)
|
|||||||
|
|
||||||
ePoly = EffectPolymorph(nPoly);
|
ePoly = EffectPolymorph(nPoly);
|
||||||
ePoly = SupernaturalEffect(ePoly);
|
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 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 +154,7 @@ 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))
|
if (GetIsObjectValid(oShield))
|
||||||
{
|
{
|
||||||
if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD &&
|
if (GetBaseItemType(oShield) !=BASE_ITEM_LARGESHIELD &&
|
||||||
@@ -55,16 +174,26 @@ void LycanthropePoly(object oPC, int nPoly)
|
|||||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
||||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, oPC);
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, ePoly, oPC);
|
||||||
|
|
||||||
object oWeaponNewRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
|
object oWeaponNewRight = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R,oPC);
|
||||||
object oWeaponNewLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
object oWeaponNewLeft = GetItemInSlot(INVENTORY_SLOT_CWEAPON_L,oPC);
|
||||||
object oWeaponNewBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
|
object oWeaponNewBite = GetItemInSlot(INVENTORY_SLOT_CWEAPON_B,oPC);
|
||||||
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
object oArmorNew = GetItemInSlot(INVENTORY_SLOT_CARMOUR,oPC);
|
||||||
|
|
||||||
if (bWeapon)
|
if (bWeapon)
|
||||||
{
|
{
|
||||||
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewLeft, TRUE);
|
if(!bMonkGloves)
|
||||||
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewRight, TRUE);
|
{
|
||||||
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewBite, TRUE);
|
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewLeft, TRUE);
|
||||||
|
IPWildShapeCopyItemProperties(oWeaponOld,oWeaponNewRight, 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)
|
||||||
{
|
{
|
||||||
@@ -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)
|
||||||
{
|
{
|
||||||
@@ -246,4 +487,6 @@ void DoTail(object oPC, int nTailType)
|
|||||||
SetCreatureTailType(nTailType, oPC);
|
SetCreatureTailType(nTailType, oPC);
|
||||||
//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);
|
//:: Retrieve the RacialType field
|
||||||
|
json jRacialTypeField = JsonObjectGet(jCreature, "Race");
|
||||||
|
int nRacialType = JsonGetInt(jRacialTypeField);
|
||||||
|
|
||||||
|
//:: 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);
|
||||||
|
|
||||||
int nConBonusHP = iMod * iHD;
|
if(nRacialType == RACIAL_TYPE_CONSTRUCT)
|
||||||
int iNewMaxHP = (iHitDieValue * iHD); /* nConBonusHP */
|
{
|
||||||
|
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, "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())
|
||||||
@@ -261,6 +807,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)
|
||||||
{
|
{
|
||||||
@@ -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,8 +363,11 @@ 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)
|
||||||
bFlying = TRUE;
|
|| (nWings > 1959 && nWings < 1962)
|
||||||
|
|| (nWings > 1962 && nWings < 1966)
|
||||||
|
|| nWings == 90))//CEP and Project Q wing models
|
||||||
|
bFlying = TRUE;
|
||||||
|
|
||||||
if (GetHasSpellEffect(MOVE_SH_BALANCE_SKY, oCreature))
|
if (GetHasSpellEffect(MOVE_SH_BALANCE_SKY, oCreature))
|
||||||
bFlying = TRUE;
|
bFlying = TRUE;
|
||||||
|
|||||||
@@ -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 *
|
||||||
|
|||||||
@@ -672,13 +672,13 @@ void UnarmedFists(object oCreature)
|
|||||||
|
|
||||||
// Sacred Fists who break their code get no benefits.
|
// Sacred Fists who break their code get no benefits.
|
||||||
if (GetHasFeat(FEAT_SF_CODE,oCreature)) iSacFist = 0;
|
if (GetHasFeat(FEAT_SF_CODE,oCreature)) iSacFist = 0;
|
||||||
|
|
||||||
// The monk adds all these classes.
|
// The monk adds all these classes.
|
||||||
int iMonkEq = iMonk + iShou + iSacFist + iHenshin + iZuoken + iShadowSunNinja;
|
int iMonkEq = iMonk + iShou + iSacFist + iHenshin + iZuoken + iShadowSunNinja;
|
||||||
|
|
||||||
// Ascetic Stalker
|
// Ascetic Stalker
|
||||||
if (GetHasFeat(FEAT_ASCETIC_STALKER, oCreature))
|
if (GetHasFeat(FEAT_ASCETIC_STALKER, oCreature))
|
||||||
iMonkEq += iAscetic;
|
iMonkEq += iAscetic;
|
||||||
|
|
||||||
// Determine the type of damage the character should do.
|
// Determine the type of damage the character should do.
|
||||||
string sWeapType;
|
string sWeapType;
|
||||||
|
|||||||
@@ -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,23 +1509,11 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishLevelUp(int nClass, object oPC=OBJECT_SELF)
|
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);
|
|
||||||
}
|
|
||||||
CloseNUILevelUpWindow(oPC); // Close while selected-class var is still set
|
|
||||||
ClearLevelUpNUICaches(nClass, oPC);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* void FinishLevelUp(int nClass, object oPC=OBJECT_SELF)
|
|
||||||
{
|
{
|
||||||
RemoveSpells(nClass, oPC);
|
RemoveSpells(nClass, oPC);
|
||||||
LearnSpells(nClass, oPC);
|
LearnSpells(nClass, oPC);
|
||||||
@@ -1581,7 +1523,7 @@ void FinishLevelUp(int nClass, object oPC=OBJECT_SELF)
|
|||||||
SetPersistantLocalInt(oPC, "LastSpellGainLevel", nLevel);
|
SetPersistantLocalInt(oPC, "LastSpellGainLevel", nLevel);
|
||||||
}
|
}
|
||||||
ClearLevelUpNUICaches(nClass, oPC);
|
ClearLevelUpNUICaches(nClass, oPC);
|
||||||
} */
|
}
|
||||||
|
|
||||||
void ClearLevelUpNUICaches(int nClass, object oPC=OBJECT_SELF)
|
void ClearLevelUpNUICaches(int nClass, object oPC=OBJECT_SELF)
|
||||||
{
|
{
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2584,7 +2540,7 @@ int HasPreRequisitesForManeuver(int nClass, int spellbookId, object oPC=OBJECT_S
|
|||||||
if (chosenDisc != JsonNull())
|
if (chosenDisc != JsonNull())
|
||||||
{
|
{
|
||||||
int nManCount = (JsonGetInt(JsonObjectGet(chosenDisc, IntToString(MANEUVER_TYPE_MANEUVER)))
|
int nManCount = (JsonGetInt(JsonObjectGet(chosenDisc, IntToString(MANEUVER_TYPE_MANEUVER)))
|
||||||
+ JsonGetInt(JsonObjectGet(chosenDisc, IntToString(MANEUVER_TYPE_STANCE))));
|
+ JsonGetInt(JsonObjectGet(chosenDisc, IntToString(MANEUVER_TYPE_STANCE))));
|
||||||
if (nManCount >= prereqs)
|
if (nManCount >= prereqs)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -1612,31 +1612,140 @@ int IPGetDamageBonusConstantFromNumber(int nNumber)
|
|||||||
// oOld - Item equipped before polymorphing (source for item props)
|
// oOld - Item equipped before polymorphing (source for item props)
|
||||||
// oNew - Item equipped after polymorphing (target for item props)
|
// oNew - Item equipped after polymorphing (target for item props)
|
||||||
// bWeapon - Must be set TRUE when oOld is a weapon.
|
// bWeapon - Must be set TRUE when oOld is a weapon.
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
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))
|
||||||
itemproperty ip = GetFirstItemProperty(oOld);
|
return;
|
||||||
while (GetIsItemPropertyValid(ip))
|
|
||||||
{
|
// Determine possessor
|
||||||
if (bWeapon)
|
object oPC = GetItemPossessor(oOld);
|
||||||
{
|
if (!GetIsObjectValid(oPC))
|
||||||
if (GetWeaponRanged(oOld) == GetWeaponRanged(oNew) )
|
oPC = GetItemPossessor(oNew);
|
||||||
{
|
|
||||||
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
|
||||||
}
|
|
||||||
ip = GetNextItemProperty(oOld);
|
|
||||||
|
|
||||||
}
|
if (!GetIsObjectValid(oPC))
|
||||||
}
|
{
|
||||||
|
if (DEBUG) DoDebug("IPWS: Unable to determine item possessor");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine glove state once
|
||||||
|
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||||
|
|
||||||
|
// Weapon ranged mismatch = do nothing (intent is no partial copy)
|
||||||
|
if (bWeapon && GetWeaponRanged(oOld) != GetWeaponRanged(oNew))
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("IPWS: Weapon ranged mismatch <20> skipping all IP copy");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin property copy
|
||||||
|
itemproperty ip = GetFirstItemProperty(oOld);
|
||||||
|
while (GetIsItemPropertyValid(ip))
|
||||||
|
{
|
||||||
|
int nType = GetItemPropertyType(ip);
|
||||||
|
|
||||||
|
// If copying from gloves and monk gloves are active
|
||||||
|
if (bMonkGloves
|
||||||
|
&& (nType == ITEM_PROPERTY_DAMAGE_BONUS
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP))
|
||||||
|
{
|
||||||
|
// Always apply glove damage IPs
|
||||||
|
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||||
|
ip = GetNextItemProperty(oOld);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normal weapon pass
|
||||||
|
if (bWeapon)
|
||||||
|
{
|
||||||
|
// If monk gloves active ? skip ALL weapon damage IPs
|
||||||
|
if (bMonkGloves
|
||||||
|
&& (nType == ITEM_PROPERTY_DAMAGE_BONUS
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP))
|
||||||
|
{
|
||||||
|
ip = GetNextItemProperty(oOld);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||||
|
}
|
||||||
|
|
||||||
|
ip = GetNextItemProperty(oOld);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* // ----------------------------------------------------------------------------
|
||||||
|
// GZ, Sept. 30 2003
|
||||||
|
// Special Version of Copy Item Properties for use with greater wild shape
|
||||||
|
// oOld - Item equipped before polymorphing (source for item props)
|
||||||
|
// oNew - Item equipped after polymorphing (target for item props)
|
||||||
|
// bWeapon - Must be set TRUE when oOld is a weapon.
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
void IPWildShapeCopyItemProperties(object oOld, object oNew, int bWeapon = FALSE)
|
||||||
|
{
|
||||||
|
if (!GetIsObjectValid(oOld) || !GetIsObjectValid(oNew))
|
||||||
|
return;
|
||||||
|
|
||||||
|
object oPC = GetItemPossessor(oOld);
|
||||||
|
if (!GetIsObjectValid(oPC))
|
||||||
|
{
|
||||||
|
oPC = GetItemPossessor(oNew);
|
||||||
|
}
|
||||||
|
if (!GetIsObjectValid(oPC))
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("IPWS: Unable to determine item possessor");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bMonkGloves = GetLocalInt(oPC, "WEARING_MONK_GLOVES");
|
||||||
|
|
||||||
|
itemproperty ip = GetFirstItemProperty(oOld);
|
||||||
|
while (GetIsItemPropertyValid(ip))
|
||||||
|
{
|
||||||
|
if (bWeapon)
|
||||||
|
{
|
||||||
|
// Gloves override weapon damage <20> skip weapon damage properties
|
||||||
|
if (bMonkGloves)
|
||||||
|
{
|
||||||
|
int nType = GetItemPropertyType(ip);
|
||||||
|
|
||||||
|
// skip damage props
|
||||||
|
if (nType == ITEM_PROPERTY_DAMAGE_BONUS
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|
||||||
|
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP)
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("IPWS: SKIPPED weapon damage IP");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (DEBUG) DoDebug("IPWS: Applied non-damage weapon IP");
|
||||||
|
AddItemProperty(DURATION_TYPE_PERMANENT, ip, oNew);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (GetWeaponRanged(oOld) == GetWeaponRanged(oNew) )
|
||||||
|
{
|
||||||
|
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AddItemProperty(DURATION_TYPE_PERMANENT,ip,oNew);
|
||||||
|
}
|
||||||
|
|
||||||
|
ip = GetNextItemProperty(oOld);
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Returns the current enhancement bonus of a weapon (+1 to +20), 0 if there is
|
// Returns the current enhancement bonus of a weapon (+1 to +20), 0 if there is
|
||||||
// no enhancement bonus. You can test for a specific type of enhancement bonus
|
// no enhancement bonus. You can test for a specific type of enhancement bonus
|
||||||
@@ -2018,4 +2127,6 @@ int IPOnHitSaveDC(int nSaveDC)
|
|||||||
if (nSaveDC > 26) nIPBonus = IP_CONST_ONHIT_SAVEDC_26;
|
if (nSaveDC > 26) nIPBonus = IP_CONST_ONHIT_SAVEDC_26;
|
||||||
|
|
||||||
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)
|
||||||
@@ -125,8 +190,8 @@ void CheckSpellbooks(object oPC)
|
|||||||
CheckMissingSpells(oPC, CLASS_TYPE_ARCHIVIST, 0, 9);
|
CheckMissingSpells(oPC, CLASS_TYPE_ARCHIVIST, 0, 9);
|
||||||
CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 9);
|
CheckMissingSpells(oPC, CLASS_TYPE_BEGUILER, 0, 9);
|
||||||
CheckMissingSpells(oPC, CLASS_TYPE_HARPER, 1, 3);
|
CheckMissingSpells(oPC, CLASS_TYPE_HARPER, 1, 3);
|
||||||
CheckMissingSpells(oPC, CLASS_TYPE_CELEBRANT_SHARESS, 1, 4);
|
CheckMissingSpells(oPC, CLASS_TYPE_CELEBRANT_SHARESS, 1, 4);
|
||||||
//CheckMissingSpells(oPC, CLASS_TYPE_ASSASSIN, 1, 4);
|
//CheckMissingSpells(oPC, CLASS_TYPE_ASSASSIN, 1, 4);
|
||||||
|
|
||||||
// Check psionics
|
// Check psionics
|
||||||
DelayCommand(0.0f, CheckPsionics(oPC));
|
DelayCommand(0.0f, CheckPsionics(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"
|
||||||
@@ -31,6 +30,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) + "'");
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
@@ -48,6 +49,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")));
|
||||||
@@ -55,6 +76,8 @@ void main()
|
|||||||
//if(DEBUG) DoDebug("Running OnUnEquip, creature = '" + GetName(oPC) + "' is PC: " + DebugBool2String(GetIsPC(oPC)) + "; Item = '" + GetName(oItem) + "' - '" + GetTag(oItem) + "'");
|
//if(DEBUG) DoDebug("Running OnUnEquip, creature = '" + GetName(oPC) + "' is PC: " + DebugBool2String(GetIsPC(oPC)) + "; Item = '" + GetName(oItem) + "' - '" + GetTag(oItem) + "'");
|
||||||
|
|
||||||
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();
|
||||||
|
|||||||
@@ -78,8 +78,16 @@ void main()
|
|||||||
//Decrement the stack
|
//Decrement the stack
|
||||||
int nNewStack = GetItemStackSize(oStack);
|
int nNewStack = GetItemStackSize(oStack);
|
||||||
nNewStack--;
|
nNewStack--;
|
||||||
|
|
||||||
|
if (nNewStack < 1)
|
||||||
|
{
|
||||||
|
DestroyObject(oStack);
|
||||||
|
}
|
||||||
|
|
||||||
SetItemStackSize(oStack, nNewStack);
|
if( oStack != OBJECT_INVALID)
|
||||||
|
{
|
||||||
|
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.
|
||||||
@@ -27152,11 +27152,18 @@ Major Auras are granted on levels
|
|||||||
~Grant Move Action~
|
~Grant Move Action~
|
||||||
A marshal can haste himself and his allies for 1 round. This ability may be used once per day per 4 class levels.</entry>
|
A marshal can haste himself and his allies for 1 round. This ability may be used once per day per 4 class levels.</entry>
|
||||||
<entry id="51043" lang="en" sex="m">Epic Swashbuckler</entry>
|
<entry id="51043" lang="en" sex="m">Epic Swashbuckler</entry>
|
||||||
<entry id="51044" lang="en" sex="m">You have become the embodiment of panache and daring. You are an epic Swashbuckler.
|
<entry id="51044" lang="en" sex="m">You have become the embodiment of panache and daring. You are an epic Swashbuckler.
|
||||||
|
|
||||||
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