2026/01/12 Update 2

Fixed Hidden Talent.
Potions are usable w/ Tenser's Transformation.
Defaulted to Fire damage for Dragon breath.
Corrected Dragonfire Channeling TLK entry.
This commit is contained in:
Jaysyn904
2026-01-12 20:12:40 -05:00
parent 11a75d23c9
commit 2961d49e7d
12 changed files with 210 additions and 838 deletions

View File

@@ -1724,7 +1724,7 @@ int IsHiddenTalent(object oPC = OBJECT_SELF)
GetHasFeat(FEAT_HIDDEN_TALENT_ELFSIGHT, oPC) || GetHasFeat(FEAT_HIDDEN_TALENT_ELFSIGHT, oPC) ||
GetHasFeat(FEAT_HIDDEN_TALENT_EMPATHY, oPC) || GetHasFeat(FEAT_HIDDEN_TALENT_EMPATHY, oPC) ||
GetHasFeat(FEAT_HIDDEN_TALENT_EMPTYMIND, oPC) || GetHasFeat(FEAT_HIDDEN_TALENT_EMPTYMIND, oPC) ||
//GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC) || GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC) ||
GetHasFeat(FEAT_HIDDEN_TALENT_ENTANGLE, oPC) || GetHasFeat(FEAT_HIDDEN_TALENT_ENTANGLE, oPC) ||
GetHasFeat(FEAT_HIDDEN_TALENT_EXPANSION, oPC) || GetHasFeat(FEAT_HIDDEN_TALENT_EXPANSION, oPC) ||
GetHasFeat(FEAT_HIDDEN_TALENT_FARHAND, oPC) || GetHasFeat(FEAT_HIDDEN_TALENT_FARHAND, oPC) ||
@@ -1836,7 +1836,7 @@ int GetHiddenTalentCount(object oPC = OBJECT_SELF)
if (GetHasFeat(FEAT_HIDDEN_TALENT_ELFSIGHT, oPC)) nCount++; if (GetHasFeat(FEAT_HIDDEN_TALENT_ELFSIGHT, oPC)) nCount++;
if (GetHasFeat(FEAT_HIDDEN_TALENT_EMPATHY, oPC)) nCount++; if (GetHasFeat(FEAT_HIDDEN_TALENT_EMPATHY, oPC)) nCount++;
if (GetHasFeat(FEAT_HIDDEN_TALENT_EMPTYMIND, oPC)) nCount++; if (GetHasFeat(FEAT_HIDDEN_TALENT_EMPTYMIND, oPC)) nCount++;
//if (GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC)) nCount++; if (GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC)) nCount++;
if (GetHasFeat(FEAT_HIDDEN_TALENT_ENTANGLE, oPC)) nCount++; if (GetHasFeat(FEAT_HIDDEN_TALENT_ENTANGLE, oPC)) nCount++;
if (GetHasFeat(FEAT_HIDDEN_TALENT_EXPANSION, oPC)) nCount++; if (GetHasFeat(FEAT_HIDDEN_TALENT_EXPANSION, oPC)) nCount++;
if (GetHasFeat(FEAT_HIDDEN_TALENT_FARHAND, oPC)) nCount++; if (GetHasFeat(FEAT_HIDDEN_TALENT_FARHAND, oPC)) nCount++;
@@ -1889,7 +1889,10 @@ int GetIsHiddenTalentPower(object oPC, int nPower)
if(nPower == POWER_ELFSIGHT && GetHasFeat(FEAT_HIDDEN_TALENT_ELFSIGHT, oPC)) return TRUE; if(nPower == POWER_ELFSIGHT && GetHasFeat(FEAT_HIDDEN_TALENT_ELFSIGHT, oPC)) return TRUE;
if(nPower == POWER_EMPATHY && GetHasFeat(FEAT_HIDDEN_TALENT_EMPATHY, oPC)) return TRUE; if(nPower == POWER_EMPATHY && GetHasFeat(FEAT_HIDDEN_TALENT_EMPATHY, oPC)) return TRUE;
if(nPower == POWER_EMPTYMIND && GetHasFeat(FEAT_HIDDEN_TALENT_EMPTYMIND, oPC)) return TRUE; if(nPower == POWER_EMPTYMIND && GetHasFeat(FEAT_HIDDEN_TALENT_EMPTYMIND, oPC)) return TRUE;
//if(nPower == POWER_ENERGYRAY && GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC)) return TRUE; if(nPower == POWER_ENERGYRAY_FIRE && GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC)) return TRUE;
if(nPower == POWER_ENERGYRAY_COLD && GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC)) return TRUE;
if(nPower == POWER_ENERGYRAY_ELEC && GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC)) return TRUE;
if(nPower == POWER_ENERGYRAY_SONIC && GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC)) return TRUE;
if(nPower == POWER_ENTANGLE && GetHasFeat(FEAT_HIDDEN_TALENT_ENTANGLE, oPC)) return TRUE; if(nPower == POWER_ENTANGLE && GetHasFeat(FEAT_HIDDEN_TALENT_ENTANGLE, oPC)) return TRUE;
if(nPower == POWER_EXPANSION && GetHasFeat(FEAT_HIDDEN_TALENT_EXPANSION, oPC)) return TRUE; if(nPower == POWER_EXPANSION && GetHasFeat(FEAT_HIDDEN_TALENT_EXPANSION, oPC)) return TRUE;
if(nPower == POWER_FARHAND && GetHasFeat(FEAT_HIDDEN_TALENT_FARHAND, oPC)) return TRUE; if(nPower == POWER_FARHAND && GetHasFeat(FEAT_HIDDEN_TALENT_FARHAND, oPC)) return TRUE;

View File

@@ -2161,10 +2161,35 @@ int PRCSpellEffects(object oCaster, object oTarget, int nSpellID, int nSpellLeve
{ {
// Pnp Tensers Transformation // Pnp Tensers Transformation
if(GetPRCSwitch(PRC_PNP_TENSERS_TRANSFORMATION)) if(GetPRCSwitch(PRC_PNP_TENSERS_TRANSFORMATION))
{ {
if(GetHasSpellEffect(SPELL_TENSERS_TRANSFORMATION, oCaster))
{
// Allow potions - they are not spell trigger/completion items
object oSpellCastItem = PRCGetSpellCastItem();
if(GetIsObjectValid(oSpellCastItem))
{
int nItemType = GetBaseItemType(oSpellCastItem);
if(nItemType == BASE_ITEM_ENCHANTED_POTION
|| nItemType == BASE_ITEM_POTIONS)
{
// Continue with other checks
}
else
{
return FALSE; // Block other magic items
}
}
else
{
return FALSE; // Block regular spellcasting
}
}
}
/* {
if(GetHasSpellEffect(SPELL_TENSERS_TRANSFORMATION, oCaster)) if(GetHasSpellEffect(SPELL_TENSERS_TRANSFORMATION, oCaster))
return FALSE; return FALSE;
} } */
// Gaseous Form check // Gaseous Form check
if(GetHasSpellEffect(SPELL_GASEOUS_FORM, oCaster)) if(GetHasSpellEffect(SPELL_GASEOUS_FORM, oCaster))
@@ -3757,4 +3782,4 @@ int X2PreSpellCastCode2()
// Test main // Test main
//::void main(){} //:: void main(){}

View File

@@ -0,0 +1,161 @@
//:://////////////////////////////////////////////////////////////////
//:: Hidden Talent
//:: ft_hidntalent_ft
//:://////////////////////////////////////////////////////////////////
/** @file
This allows you to pick a hidden talent @ 1st level
@original author Fencas
@date Created - 2025-01-12
@revised by Jaysyn (for Hidden Talent)
@date Revised - 2025-01-30 07:42:03
*/
//:://////////////////////////////////////////////////////////////////
#include "inc_dynconv"
#include "prc_inc_function"
#include "NW_I0_GENERIC"
#include "inc_persist_loca"
//////////////////////////////////////////////////
// Constant Definitions
//////////////////////////////////////////////////
const int STAGE_SELECT_ABIL = 0;
const int STAGE_CONFIRMATION = 1;
//////////////////////////////////////////////////
// Main Function
//////////////////////////////////////////////////
void main()
{
object oPC = GetPCSpeaker();
object oSkin = GetPCSkin(oPC);
int nRow;
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
int nStage = GetStage(oPC);
int nLevel = GetPersistantLocalInt(oPC, "HiddenTalentCheck");
// Abort if DynConv_Var is not set properly
if (nValue == 0)
{
if (DEBUG) DoDebug("ft_hidntalent_ft: Aborting due to error.");
return;
}
// Conversation Setup Stage
if (nValue == DYNCONV_SETUP_STAGE)
{
if (!GetIsStageSetUp(nStage, oPC))
{
if (nStage == STAGE_SELECT_ABIL)
{
// --- Step 1: Mark Already Selected Hidden Talents ---
int nStartFeat = 25901;
int nEndFeat = 25946;
effect eEffect = GetFirstEffect(oPC);
while (GetIsEffectValid(eEffect))
{
string sTag = GetEffectTag(eEffect);
// Check if effect tag matches Hidden Talent pattern
if(GetStringLeft(sTag, 13) == "HiddenTalent_")
{
int nFeatID = StringToInt(GetSubString(sTag, 13, GetStringLength(sTag) - 13));
SetLocalInt(oPC, "HiddenTalent_" + IntToString(nFeatID), 1);
}
eEffect = GetNextEffect(oPC);
}
// --- Step 2: Display Available Feats ---
SetHeader("Choose a Hidden Talent:");
for (nRow = nStartFeat; nRow <= nEndFeat; nRow++)
{
string sTextRef = Get2DAString("feat", "FEAT", nRow);
string sName = GetStringByStrRef(StringToInt(sTextRef));
if(sName == "") sName = "Power " + IntToString(nRow);
if (!GetHasFeat(nRow, oPC) && !GetLocalInt(oPC, "HiddenTalent_" + IntToString(nRow)))
{
AddChoice(sName, nRow, oPC);
}
}
SetDefaultTokens();
MarkStageSetUp(STAGE_SELECT_ABIL, oPC);
}
else if (nStage == STAGE_CONFIRMATION)
{
int nChoice = GetLocalInt(oPC, "HiddenTalentChoice");
string sFeatName = GetStringByStrRef(StringToInt(Get2DAString("feat", "FEAT", nChoice)));
if(sFeatName == "") sFeatName = "Power " + IntToString(nChoice);
AddChoice(GetStringByStrRef(4752), TRUE); // "Yes"
AddChoice(GetStringByStrRef(4753), FALSE); // "No"
string sText = "You have selected " + sFeatName + ".\n";
sText += "Is this correct?";
SetHeader(sText);
MarkStageSetUp(STAGE_CONFIRMATION, oPC);
}
}
// Token Setup
SetupTokens();
}
else if (nValue == DYNCONV_EXITED)
{
if (DEBUG) DoDebug("ft_hidntalent_ft: Running exit handler");
DeleteLocalInt(oPC, "HiddenTalentChoice");
}
else if (nValue == DYNCONV_ABORTED)
{
if (DEBUG) DoDebug("ft_hidntalent_ft: ERROR: Conversation abort section run");
DeleteLocalInt(oPC, "HiddenTalentChoice");
}
// --- Stage Selection & Feat Application ---
else
{
int nChoice = GetChoice(oPC);
int nLevel = GetHitDice(oPC);
if (nStage == STAGE_SELECT_ABIL)
{
// Store the choice and go to confirmation
SetLocalInt(oPC, "HiddenTalentChoice", nChoice);
nStage = STAGE_CONFIRMATION;
MarkStageNotSetUp(STAGE_SELECT_ABIL, oPC);
}
else if (nStage == STAGE_CONFIRMATION)
{
if (nChoice == TRUE) // User confirmed "Yes"
{
int nFeatChoice = GetLocalInt(oPC, "HiddenTalentChoice");
if (nFeatChoice > 0)
{
effect eBonusFeat = EffectBonusFeat(nFeatChoice);
eBonusFeat = UnyieldingEffect(eBonusFeat);
eBonusFeat = TagEffect(eBonusFeat, "HiddenTalent_" + IntToString(nFeatChoice));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusFeat, oPC);
}
SetPersistantLocalInt(oPC, "HiddenTalentChosen", 1);
SetPersistantLocalInt(oPC, "HiddenTalent_" + IntToString(nLevel), 1);
DeletePersistantLocalInt(oPC, "HiddenTalentCheck");
DeleteLocalInt(oPC, "HiddenTalentChoice");
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else // User chose "No"
{
nStage = STAGE_SELECT_ABIL;
MarkStageNotSetUp(STAGE_SELECT_ABIL, oPC);
MarkStageNotSetUp(STAGE_CONFIRMATION, oPC);
}
}
if (DEBUG) DoDebug("ft_hidntalent_ft: New stage: " + IntToString(nStage));
SetStage(nStage, oPC);
}
}

View File

@@ -1,174 +0,0 @@
//:://////////////////////////////////////////////
//:: Hidden Talent Power Conversation
//:: hidden_talent_cv
//:://////////////////////////////////////////////
/** @file
This allows you to choose a psionic power for Hidden Talent feat
@author Modified from prc_favsoulweap.nss
@date Created - 2025.12.14
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "prc_inc_fork"
#include "inc_item_props"
#include "prc_x2_itemprop"
#include "inc_dynconv"
#include "psi_inc_psifunc"
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
const int STAGE_POWER_CHOICE = 0;
const int STAGE_CONFIRMATION = 1;
//////////////////////////////////////////////////
/* Aid functions */
//////////////////////////////////////////////////
//////////////////////////////////////////////////
/* Main function */
//////////////////////////////////////////////////
void main()
{
//object oPC = GetPCSpeaker();
object oPC = OBJECT_SELF;
/* Get the value of the local variable set by the conversation script calling
* this script. Values:
* DYNCONV_ABORTED Conversation aborted
* DYNCONV_EXITED Conversation exited via the exit node
* DYNCONV_SETUP_STAGE System's reply turn
* 0 Error - something else called the script
* Other The user made a choice
*/
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
// The stage is used to determine the active conversation node.
// 0 is the entry node.
int nStage = GetStage(oPC);
if(DEBUG) DoDebug("hidden_talent_cv: Entering Hidden Talent conversation");
// Check which of the conversation scripts called the scripts
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
return;
if(nValue == DYNCONV_SETUP_STAGE)
{
// Check if this stage is marked as already set up
// This stops list duplication when scrolling
if(!GetIsStageSetUp(nStage, oPC))
{
// variable named nStage determines the current conversation node
// Function SetHeader to set the text displayed to the PC
// Function AddChoice to add a response option for the PC. The responses are show in order added
if(nStage == STAGE_POWER_CHOICE)
{
string sHeader1 = "Select a 1st-level psionic power for Hidden Talent.\n";
sHeader1 += "This will grant you the ability to manifest this power as a psionic-like ability.";
SetHeader(sHeader1);
// Loop through all Hidden Talent feats (25901-25946)
int added = 0;
int i;
string sFeatName;
for(i = 25901; i <= 25946; i++)
{
// Get the feat name from the feats.2da
sFeatName = Get2DACache("feats", "NAME", i);
if(sFeatName != "" && sFeatName != "****")
{
// Convert the feat constant name to display name
// Remove "FEAT_HIDDEN_TALENT_" and replace underscores with spaces
string sDisplayName = GetStringByStrRef(StringToInt(sFeatName));
if(sDisplayName == "") sDisplayName = "Power " + IntToString(i);
AddChoice(sDisplayName, i, oPC);
added++;
}
}
if(added == 0)
{
AddChoice("No valid powers found.", 0, oPC);
}
MarkStageSetUp(STAGE_POWER_CHOICE, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
}
else if(nStage == STAGE_CONFIRMATION)//confirmation
{
int nChoice = GetLocalInt(oPC, "HiddenTalentPower");
AddChoice(GetStringByStrRef(4752), TRUE); // "Yes"
AddChoice(GetStringByStrRef(4753), FALSE); // "No"
string sText = "You have selected the Hidden Talent power.\n";
sText += "Is this correct?";
SetHeader(sText);
MarkStageSetUp(STAGE_CONFIRMATION, oPC);
}
}
// Do token setup
SetupTokens();
}
// End of conversation cleanup
else if(nValue == DYNCONV_EXITED)
{
// End of conversation cleanup
DeleteLocalInt(oPC, "HiddenTalentPower");
}
// Abort conversation cleanup.
// NOTE: This section is only run when the conversation is aborted
// while aborting is allowed. When it isn't, the dynconvo infrastructure
// handles restoring the conversation in a transparent manner
else if(nValue == DYNCONV_ABORTED)
{
// End of conversation cleanup
DeleteLocalInt(oPC, "HiddenTalentPower");
}
// Handle PC responses
else
{
// variable named nChoice is the value of the player's choice as stored when building the choice list
// variable named nStage determines the current conversation node
int nChoice = GetChoice(oPC);
if(nStage == STAGE_POWER_CHOICE)
{
// Go to this stage next
nStage = STAGE_CONFIRMATION;
SetLocalInt(oPC, "HiddenTalentPower", nChoice);
}
else if(nStage == STAGE_CONFIRMATION)//confirmation
{
if(nChoice == TRUE)
{
int nFeatID = GetLocalInt(oPC, "HiddenTalentPower");
// Grant the Hidden Talent feat directly
AddSkinFeat(nFeatID, nFeatID, GetPCSkin(oPC), oPC);
// Mark that Hidden Talent has been chosen
SetPersistantLocalInt(oPC, "HiddenTalentChosen", TRUE);
// And we're all done
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else
{
nStage = STAGE_POWER_CHOICE;
MarkStageNotSetUp(STAGE_POWER_CHOICE, oPC);
MarkStageNotSetUp(STAGE_CONFIRMATION, oPC);
}
DeleteLocalInt(oPC, "HiddenTalentPower");
}
// Store the stage value. If it has been changed, this clears out the choices
SetStage(nStage, oPC);
}
}

View File

@@ -1,529 +0,0 @@
//::///////////////////////////////////////////////
//:: Hidden Talent
//:: psi_hiddentalent.nss
//:://////////////////////////////////////////////
/*
Your latent power of psionics flares to life, conferring upon you
the designation of a psionic character. As a psionic character,
you gain a reserve of 2 power points, and you can take psionic
feats, metapsionic feats, and psionic item creation feats. If you
have or take a class that grants power points, the power points
gained from Hidden Talent are added to your total power point
reserve.
When you take this feat, choose one 1st-level power from any
psionic class list. You know this power (it becomes one of your
powers known). You can manifest this power with the power points
provided by this feat if you have a Charisma score of 11 or higher.
If you have no psionic class levels, you are considered a
1st-level manifester when manifesting this power. If you have
psionic class levels, you can manifest the power at the highest
manifester level you have attained. (This is not a manifester
level, and it does not add to any manifester levels gained by
taking psionic classes.) If you have no psionic class levels,
use Charisma to determine how powerful a power you can manifest
and how hard those powers are to resist.
*/
//:://////////////////////////////////////////////
//:: Created By: Jaysyn
//:: Created On: 2025-01-29 09:52:24
//:://////////////////////////////////////////////
#include "prc_feat_const"
#include "psi_inc_core"
#include "psi_inc_powknown"
int GetPowerRowID(int nPowerList, int nPower)
{
string sPowerFile = GetAMSDefinitionFileName(nPowerList);
int nCheck = -1;
int i;
for(i = 0; i < GetPRCSwitch(FILE_END_CLASS_POWER); i++)
{
nCheck = StringToInt(Get2DACache(sPowerFile, "RealSpellID", i));
// Find the row ID of the power we need and return it
if(nCheck == nPower)
{
return i;
}
}
// this should never trigger
return -1;
}
void GrantHiddenTalent(object oPC, int nPowerList, int nFeat, int nPower, string sTag)
{
if (GetHasFeat(nFeat, oPC) && !GetPersistantLocalInt(oPC, sTag))
{
if(DEBUG) DoDebug("psi_hiddentalent: Adding power ID " + IntToString(nPower));
AddPowerKnown(oPC, nPowerList, GetPowerRowID(nPowerList, nPower), TRUE, 1);
SetKnownPowersModifier(oPC, nPowerList, GetKnownPowersModifier(oPC, nPowerList) + 1);
SetPersistantLocalInt(oPC, sTag, TRUE);
}
}
void main()
{
object oPC = OBJECT_SELF;
int nPowerTotal = 1; //:: Can't have more than one Hidden Talent.
int nClass = CLASS_TYPE_INVALID;
int nPowerList = POWER_LIST_MISC;
// Determine why this script is running
if(GetRunningEvent() != EVENT_ONPLAYERLEVELDOWN)
{
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_BIOFEEDBACK, POWER_BIOFEEDBACK, "PRC_HT_BiofeedbackGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_BITE_WOLF, POWER_BITE_WOLF, "PRC_HT_BiteOfTheWolfGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_BOLT, POWER_BOLT, "PRC_HT_BoltGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_BURST, POWER_BURST, "PRC_HT_BurstGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_CALLTOMIND, POWER_CALLTOMIND, "PRC_HT_CallToMindGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_CALL_WEAPONRY, POWER_CALL_WEAPONRY, "PRC_HT_CallWeaponryGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_CHAMELEON, POWER_CHAMELEON, "PRC_HT_ChameleonGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_CLAWS_BEAST, POWER_CLAWS_BEAST, "PRC_HT_ClawsOfTheBeastGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_COMPRESSION, POWER_COMPRESSION, "PRC_HT_CompressionGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_CONCEALTHOUGHT, POWER_CONCEALTHOUGHT, "PRC_HT_ConcealThoughtsGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_CREATESOUND, POWER_CREATESOUND, "PRC_HT_CreateSoundGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_CRYSTALSHARD, POWER_CRYSTALSHARD, "PRC_HT_CrystalShardGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_DAZE, POWER_DAZE, "PRC_HT_DazeGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_DECELERATION, POWER_DECELERATION, "PRC_HT_DecelerationGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_DEFPRECOG, POWER_DEFPRECOG, "PRC_HT_DefensivePrecognitionGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_DEMORALIZE, POWER_DEMORALIZE, "PRC_HT_DemoralizeGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_DISABLE, POWER_DISABLE, "PRC_HT_DisableGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_DISSIPATINGTOUCH, POWER_DISSIPATINGTOUCH, "PRC_HT_DissipatingTouchGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_DISTRACT, POWER_DISTRACT, "PRC_HT_DistractGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_ELFSIGHT, POWER_ELFSIGHT, "PRC_HT_ElfSightGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_EMPATHY, POWER_EMPATHY, "PRC_HT_EmpathyGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_EMPTYMIND, POWER_EMPTYMIND, "PRC_HT_EmptyMindGained");
//GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_ENERGYRAY, POWER_ENERGYRAY, "PRC_HT_EnergyRayGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_ENTANGLE, POWER_ENTANGLE, "PRC_HT_EntangleGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_EXPANSION, POWER_EXPANSION, "PRC_HT_ExpansionGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_FARHAND, POWER_FARHAND, "PRC_HT_FarHandGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_FORCESCREEN, POWER_FORCESCREEN, "PRC_HT_ForceScreenGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_GREASE, POWER_GREASE, "PRC_HT_GreaseGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_GRIP_IRON, POWER_GRIP_IRON, "PRC_HT_GripIronGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_HAMMER, POWER_HAMMER, "PRC_HT_HammerGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_INERTIALARMOUR, POWER_INERTIALARMOUR, "PRC_HT_InertialArmourGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_MATTERAGITATION, POWER_MATTERAGITATION, "PRC_HT_MatterAgitationGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_METAPHYSICAL_CLAW, POWER_METAPHYSICAL_CLAW, "PRC_HT_MetaClawGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_METAPHYSICAL_WEAPON, POWER_METAPHYSICAL_WEAPON, "PRC_HT_MetaWeaponGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_MINDTHRUST, POWER_MINDTHRUST, "PRC_HT_MindThrustGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_MYLIGHT, POWER_MYLIGHT, "PRC_HT_MyLightGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_OFFPRECOG, POWER_OFFPRECOG, "PRC_HT_OffPrecogGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_OFFPRESC, POWER_OFFPRESC, "PRC_HT_OffPrescGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_PREVENOM, POWER_PREVENOM, "PRC_HT_PrevenomGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_PREVENOM_WEAPON, POWER_PREVENOM_WEAPON, "PRC_HT_PrevenomWeaponGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_SKATE, POWER_SKATE, "PRC_HT_SkateGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_STOMP, POWER_STOMP, "PRC_HT_StompGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_SYNESTHETE, POWER_SYNESTHETE, "PRC_HT_SynestheteGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_TELEMPATHICPRO, POWER_TELEMPATHICPRO, "PRC_HT_TeleProjGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_THICKSKIN, POWER_THICKSKIN, "PRC_HT_ThickSkinGained");
GrantHiddenTalent(oPC, POWER_LIST_MISC, FEAT_HIDDEN_TALENT_VIGOR, POWER_VIGOR, "PRC_HT_VigorGained");
}
else if(GetRunningEvent() == EVENT_ONPLAYERLEVELDOWN)
{
// Has lost Biofeedback, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_BiofeedbackGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_BIOFEEDBACK, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_BiofeedbackGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Bite of the Wolf, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_BiteOfTheWolfGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_BITE_WOLF, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_BiteOfTheWolfGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Bolt, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_BoltGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_BOLT, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_BoltGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Burst, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_BurstGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_BURST, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_BurstGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Call to Mind, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_CallToMindGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_CALLTOMIND, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_CallToMindGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Call Weaponry, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_CallWeaponryGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_CALL_WEAPONRY, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_CallWeaponryGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Chameleon, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_ChameleonGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_CHAMELEON, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_ChameleonGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Claws of the Beast, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_ClawsOfTheBeastGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_CLAWS_BEAST, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_ClawsOfTheBeastGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Compression, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_CompressionGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_COMPRESSION, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_CompressionGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Conceal Thought, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_ConcealThoughtGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_CONCEALTHOUGHT, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_ConcealThoughtGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Create Sound, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_CreateSoundGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_CREATESOUND, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_CreateSoundGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Crystal Shard, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_CrystalShardGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_CRYSTALSHARD, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_CrystalShardGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Daze, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_DazeGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_DAZE, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_DazeGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Deceleration, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_DecelerationGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_DECELERATION, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_DecelerationGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Deflection Precognition, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_DeflectionPrecognitionGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_DEFPRECOG, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_DeflectionPrecognitionGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Demoralize, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_DemoralizeGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_DEMORALIZE, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_DemoralizeGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Disable, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_DisableGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_DISABLE, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_DisableGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Dissipating Touch, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_DissipatingTouchGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_DISSIPATINGTOUCH, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_DissipatingTouchGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Distract, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_DistractGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_DISTRACT, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_DistractGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Elf Sight, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_ElfSightGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_ELFSIGHT, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_ElfSightGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Empathy, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_EmpathyGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_EMPATHY, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_EmpathyGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Empty Mind, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_EmptyMindGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_EMPTYMIND, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_EmptyMindGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Energy Ray, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_EnergyRayGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_ENERGYRAY, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_EnergyRayGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Entangling Ectoplasm, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_EntangleEctoGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_ENTANGLE, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_EntangleEctoGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Expansion, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_ExpansionGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_EXPANSION, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_ExpansionGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Far Hand, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_FarHandGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_FARHAND, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_FarHandGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Force Screen, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_ForceScreenGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_FORCESCREEN, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_ForceScreenGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Grease, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_GreaseGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_GREASE, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_GreaseGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Hammer, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_HammerGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_HAMMER, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_HammerGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Inertial Armour, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_InertialArmourGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_INERTIALARMOUR, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_InertialArmourGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Matter Agitation, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_MatterAgitationGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_MATTERAGITATION, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_MatterAgitationGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Metaphysical Claw, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_MetaClawGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_METAPHYSICAL_CLAW, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_MetaClawGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Metaphysical Weapon, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_MetaWeaponGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_METAPHYSICAL_WEAPON, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_MetaWeaponGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Mind Thrust, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_MindThrustGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_MINDTHRUST, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_MindThrustGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost My Light, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_MyLightGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_MYLIGHT, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_MyLightGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Precognition, Offensive, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_OffPrecogGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_OFFPRECOG, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_OffPrecogGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Prescience, Offensive, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_OffPrescGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_OFFPRESC, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_OffPrescGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Prevenom, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_PrevenomGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_PREVENOM, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_PrevenomGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Prevenom Weapon, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_PrevenomWeaponGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_PREVENOM_WEAPON, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_PrevenomWeaponGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Skate, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_SkateGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_SKATE, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_SkateGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Stomp, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_StompGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_STOMP, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_StompGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Synesthete, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_SynestheteGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_SYNESTHETE, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_SynestheteGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Telempathic Projection, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_TeleProjGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_TELEMPATHICPRO, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_TeleProjGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Thicken Skin, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_ThickSkinGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_THICKSKIN, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_ThickSkinGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Vigor, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_VigorGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_VIGOR, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_VigorGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Grip of Iron, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_GripIronGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_GRIP_IRON, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_GripIronGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
//:: Remove eventhook if the character no longer has any Hidden Talent feats
if(!IsHiddenTalent())
RemoveEventScript(oPC, EVENT_ONPLAYERLEVELDOWN, "psi_hiddentalent", TRUE, FALSE);
}
}
/* #include "psi_inc_core"
#include "psi_inc_powknown"
int GetPowerRowID(int nPowerList, int nPower)
{
string sPowerFile = GetAMSDefinitionFileName(nPowerList);
int nCheck = -1;
int i;
for(i = 0; i < GetPRCSwitch(FILE_END_CLASS_POWER) ; i++)
{
nCheck = StringToInt(Get2DACache(sPowerFile, "RealSpellID", i));
// Find the row ID of the power we need and return it
if(nCheck == nPower)
{
return i;
}
}
// this should never trigger
return -1;
}
void main()
{
object oPC = OBJECT_SELF;
int nPowerList = GetPrimaryPsionicClass(oPC);
int nPowerTotal = GetKnownPowersModifier(oPC, nPowerList);
// Determine why this script is running
if(GetRunningEvent() == EVENT_ONPLAYERLEVELUP)
{
if (GetHasFeat(FEAT_HIDDEN_TALENT_BIOFEEDBACK, oPC) && !GetPersistantLocalInt(oPC, "PRC_HT_BiofeedbackGained"))
{
if(DEBUG) DoDebug("psi_hiddentalent: Adding Biofeedback");
AddPowerKnown(oPC, nPowerList, GetPowerRowID(nPowerList, POWER_BIOFEEDBACK), TRUE, GetHitDice(oPC));
SetKnownPowersModifier(oPC, nPowerList, ++nPowerTotal);
SetPersistantLocalInt(oPC, "PRC_HT_BiofeedbackGained", TRUE);
}
if (GetHasFeat(FEAT_HIDDEN_TALENT_BITE_WOLF, oPC) && !GetPersistantLocalInt(oPC, "PRC_HT_BiteOfTheWolfGained"))
{
if(DEBUG) DoDebug("psi_hiddentalent: Adding Bite of the Wolf");
AddPowerKnown(oPC, nPowerList, GetPowerRowID(nPowerList, POWER_BITEWOLF), TRUE, GetHitDice(oPC));
SetKnownPowersModifier(oPC, nPowerList, ++nPowerTotal);
SetPersistantLocalInt(oPC, "PRC_HT_BiteOfTheWolfGained", TRUE);
}
if (GetHasFeat(FEAT_HIDDEN_TALENT_BOLT, oPC) && !GetPersistantLocalInt(oPC, "PRC_HT_BoltGained"))
{
if(DEBUG) DoDebug("psi_hiddentalent: Adding Bolt");
AddPowerKnown(oPC, nPowerList, GetPowerRowID(nPowerList, POWER_BOLT), TRUE, GetHitDice(oPC));
SetKnownPowersModifier(oPC, nPowerList, ++nPowerTotal);
SetPersistantLocalInt(oPC, "PRC_HT_BoltGained", TRUE);
}
if (GetHasFeat(FEAT_HIDDEN_TALENT_BURST, oPC) && !GetPersistantLocalInt(oPC, "PRC_HT_BurstGained"))
{
if(DEBUG) DoDebug("psi_hiddentalent: Adding Burst");
AddPowerKnown(oPC, nPowerList, GetPowerRowID(nPowerList, POWER_BURST), TRUE, GetHitDice(oPC));
SetKnownPowersModifier(oPC, nPowerList, ++nPowerTotal);
SetPersistantLocalInt(oPC, "PRC_HT_BurstGained", TRUE);
}
if (GetHasFeat(FEAT_HIDDEN_TALENT_CALLTOMIND, oPC) && !GetPersistantLocalInt(oPC, "PRC_HT_CallToMindGained"))
{
if(DEBUG) DoDebug("psi_hiddentalent: Adding Call To Mind");
AddPowerKnown(oPC, nPowerList, GetPowerRowID(nPowerList, POWER_CALLTOMIND), TRUE, GetHitDice(oPC));
SetKnownPowersModifier(oPC, nPowerList, ++nPowerTotal);
SetPersistantLocalInt(oPC, "PRC_HT_CallToMindGained", TRUE);
}
// Hook to OnLevelDown to remove the power slots granted here
AddEventScript(oPC, EVENT_ONPLAYERLEVELDOWN, "psi_hiddentalent", TRUE, FALSE);
}
else if(GetRunningEvent() == EVENT_ONPLAYERLEVELDOWN)
{
// Has lost Biofeedback, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_BiofeedbackGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_BIOFEEDBACK, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_BiofeedbackGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Bolt, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_BiteOfTheWolfGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_BITE_WOLF, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_BiteOfTheWolfGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Has lost Bolt, but the slot is still present
if(GetPersistantLocalInt(oPC, "PRC_HT_BoltGained") && !GetHasFeat(FEAT_HIDDEN_TALENT_BOLT, oPC))
{
DeletePersistantLocalInt(oPC, "PRC_HT_BoltGained");
SetKnownPowersModifier(oPC, nPowerList, --nPowerTotal);
}
// Remove eventhook if the character no longer has any Hidden Talent feats
if(!IsHiddenTalent)
RemoveEventScript(oPC, EVENT_ONPLAYERLEVELDOWN, "psi_hiddentalent", TRUE, FALSE);
}
} */

View File

@@ -1,125 +0,0 @@
//:://////////////////////////////////////////////////////////////////
//:: Hidden Talen
//:: ft_hidntalent_ft
//:://////////////////////////////////////////////////////////////////
/** @file
THis allows you to pick a hidden talent @ 1st level
@original author Fencas
@date Created - 2025-01-12
@revised by Jaysyn (for Hidden Talent)
@date Revised - 2025-01-30 07:42:03
*/
//:://////////////////////////////////////////////////////////////////
#include "inc_dynconv"
#include "prc_inc_function"
#include "NW_I0_GENERIC"
#include "inc_persist_loca"
//////////////////////////////////////////////////
// Constant Definitions
//////////////////////////////////////////////////
const int STAGE_SELECT_ABIL = 0;
//////////////////////////////////////////////////
// Main Function
//////////////////////////////////////////////////
void main()
{
object oPC = GetPCSpeaker();
object oSkin = GetPCSkin(oPC);
int nRow;
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
int nStage = GetStage(oPC);
int nLevel = GetPersistantLocalInt(oPC, "HiddenTalentCheck");
// Abort if DynConv_Var is not set properly
if (nValue == 0)
{
if (DEBUG) DoDebug("ft_hidntalent_ft: Aborting due to error.");
return;
}
// Conversation Setup Stage
if (nValue == DYNCONV_SETUP_STAGE)
{
if (!GetIsStageSetUp(nStage, oPC))
{
if (nStage == STAGE_SELECT_ABIL)
{
// --- Step 1: Mark Already Selected Hidden Talents ---
int nStartFeat = 25901;
int nTotalRows = FEAT_HIDDEN_TALENT_BIOFEEDBACK - FEAT_HIDDEN_TALENT_GRIP_IRON;
int nEndFeat = nStartFeat + nTotalRows;
string sFeat = Get2DAString("feat", "LABEL", nRow);
effect eEffect = GetFirstEffect(oPC);
while (GetIsEffectValid(eEffect))
{
if (GetEffectTag(eEffect) == "HiddenTalent_" + sFeat)
{
SetLocalInt(oPC, "HiddenTalent_" + IntToString(nRow), 1);
}
eEffect = GetNextEffect(oPC);
}
// --- Step 2: Display Available Feats ---
SetHeader("Choose a Hidden Talent:");
for (nRow = nStartFeat; nRow <= nEndFeat; nRow++)
{
string sName = Get2DAString("feats", "LABEL", nRow);
int nFeat = StringToInt(Get2DAString("feats", "FEAT", nRow));
if (!GetHasFeat(nRow, oPC) && !GetLocalInt(oPC, "HiddenTalent_" + IntToString(nRow)))
{
AddChoice(sName, nRow, oPC);
}
}
SetDefaultTokens();
MarkStageSetUp(STAGE_SELECT_ABIL, oPC);
}
}
// Token Setup
SetupTokens();
}
else if (nValue == DYNCONV_EXITED)
{
if (DEBUG) DoDebug("ft_hidntalent_ft: Running exit handler");
}
else if (nValue == DYNCONV_ABORTED)
{
if (DEBUG) DoDebug("ft_hidntalent_ft: ERROR: Conversation abort section run");
}
// --- Stage Selection & Feat Application ---
else
{
int nChoice = GetChoice(oPC);
int nLevel = GetHitDice(oPC);
if (nStage == STAGE_SELECT_ABIL)
{
SetPersistantLocalInt(oPC, "HiddenTalent_" + IntToString(nLevel), 1);
if (nChoice > 0)
{
effect eBonusFeat = EffectBonusFeat(nChoice);
eBonusFeat = UnyieldingEffect(eBonusFeat);
eBonusFeat = TagEffect(eBonusFeat, "HiddenTalent_" + IntToString(nChoice));
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusFeat, oPC);
}
DeletePersistantLocalInt(oPC, "HiddenTalentCheck");
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
if (DEBUG) DoDebug("ft_hidntalent_ft: New stage: " + IntToString(nStage));
SetStage(nStage, oPC);
}
}

View File

@@ -40,7 +40,7 @@ void ActivateBreath(int nSpellLevel, object oPC = OBJECT_SELF)
//if none left, exit //if none left, exit
if(!bCanUse) return; if(!bCanUse) return;
int nDamageType; int nDamageType = DAMAGE_TYPE_FIRE;
struct breath DracBreath; struct breath DracBreath;
//Acid //Acid

View File

@@ -64,8 +64,10 @@ void main()
// Handle Hidden Talent // Handle Hidden Talent
if(GetHasFeat(FEAT_HIDDEN_TALENT, oPC) && !GetPersistantLocalInt(oPC, "HiddenTalentChosen")) if(GetHasFeat(FEAT_HIDDEN_TALENT, oPC) && !GetPersistantLocalInt(oPC, "HiddenTalentChosen"))
{ {
if(DEBUG) DoDebug("prc_levelup: Entering Hidden Talent Branch");
// Trigger Hidden Talent power selection conversation // Trigger Hidden Talent power selection conversation
AssignCommand(oPC, ActionStartConversation(oPC, "hidden_talent_cv", TRUE, FALSE)); //DelayCommand(0.5, ExecuteScript("psi_hidntalent", oPC));
DelayCommand(1.0f, StartDynamicConversation("ft_hidntalent_ft", oPC, DYNCONV_EXIT_ALLOWED_SHOW_CHOICE, TRUE, FALSE, oPC));
} }
// Execute scripts hooked to this event for the player triggering it // Execute scripts hooked to this event for the player triggering it

View File

@@ -400,7 +400,16 @@ void main()
if(GetHasFeat(FEAT_SPELLFIRE_WIELDER, oPC)) if(GetHasFeat(FEAT_SPELLFIRE_WIELDER, oPC))
SpawnNewThread("PRC_Spellfire", "prc_spellfire_hb", 6.0f, oPC); SpawnNewThread("PRC_Spellfire", "prc_spellfire_hb", 6.0f, oPC);
// Handle Hidden Talent
if(GetHasFeat(FEAT_HIDDEN_TALENT, oPC) && !GetPersistantLocalInt(oPC, "HiddenTalentChosen"))
{
if(DEBUG) DoDebug("prc_onenter: Entering Hidden Talent Branch");
// Trigger Hidden Talent power selection conversation
//DelayCommand(0.5, ExecuteScript("psi_hidntalent", oPC));
DelayCommand(1.0f, StartDynamicConversation("ft_hidntalent_ft", oPC, DYNCONV_EXIT_ALLOWED_SHOW_CHOICE, TRUE, FALSE, oPC));
}
//if the player logged off while being registered as a cohort //if the player logged off while being registered as a cohort
if(GetPersistantLocalInt(oPC, "RegisteringAsCohort")) if(GetPersistantLocalInt(oPC, "RegisteringAsCohort"))
AssignCommand(GetModule(), CheckHB(oPC)); AssignCommand(GetModule(), CheckHB(oPC));

View File

@@ -44159,7 +44159,7 @@ Use: Selected.
<entry id="55633" lang="en" sex="m">Type of Feat: Draconic <entry id="55633" lang="en" sex="m">Type of Feat: Draconic
Prerequisite: Cha 11, Dragonblood subtype*, Turn Undead Prerequisite: Cha 11, Dragonblood subtype*, Turn Undead
When you activate this feat, you use up a Turn Undead use for the day and breathe a 15' cone of an element related your draconic ancestry. If your dragon type is not related to one of the 5 main elements, or you are not related to a specific dragon, the damage defaults to fire. The damage is a number of d6 equal to your turning level divided by 2, and the save is a Reflex save vs 10 + your Charisma modifier + your turning level divided by 2. When you activate this feat, you use up a Turn Undead use for the day and channel via your holy symbol a 15' cone of an element related your draconic ancestry. If your dragon type is not related to one of the 5 main elements, or you are not related to a specific dragon, the damage defaults to fire. The damage is a number of d6 equal to your turning level divided by 2, and the save is a Reflex save vs 10 + your Charisma modifier + your turning level divided by 2.
Use: Selected. Use: Selected.
*Note: In addition to race, you can gain the dragonblood subtype through the Dragon Devotee or Dragon Disciple classes, or through the Dragontouched or Dragon Heritage feats. If you take this feat and are not dragonblooded, you will be deleveled or unable to level.</entry> *Note: In addition to race, you can gain the dragonblood subtype through the Dragon Devotee or Dragon Disciple classes, or through the Dragontouched or Dragon Heritage feats. If you take this feat and are not dragonblooded, you will be deleveled or unable to level.</entry>