146 lines
5.6 KiB
Plaintext
146 lines
5.6 KiB
Plaintext
|
//:://////////////////////////////////////////////
|
||
|
//:: Vow of Poverty Extra Feat
|
||
|
//:: ft_vowpoverty_ft
|
||
|
//:://////////////////////////////////////////////
|
||
|
/** @file
|
||
|
This allows you to choose the extra feat each even level.
|
||
|
|
||
|
@original author Fencas
|
||
|
@date Created - 2025-01-12
|
||
|
*/
|
||
|
//:://////////////////////////////////////////////
|
||
|
//:://////////////////////////////////////////////
|
||
|
|
||
|
#include "inc_dynconv"
|
||
|
#include "prc_inc_function"
|
||
|
#include "NW_I0_GENERIC"
|
||
|
#include "inc_persist_loca"
|
||
|
|
||
|
//////////////////////////////////////////////////
|
||
|
/* Constant defintions */
|
||
|
//////////////////////////////////////////////////
|
||
|
|
||
|
const int STAGE_SELECT_ABIL = 0;
|
||
|
|
||
|
//////////////////////////////////////////////////
|
||
|
/* Function defintions */
|
||
|
//////////////////////////////////////////////////
|
||
|
|
||
|
void main()
|
||
|
{
|
||
|
object oPC = GetPCSpeaker();
|
||
|
object oSkin = GetPCSkin(oPC);
|
||
|
int i, j, nTest, nRow;
|
||
|
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
|
||
|
int nStage = GetStage(oPC);
|
||
|
int nLevel = GetPersistantLocalInt(oPC, "VoPFeatCheck");
|
||
|
|
||
|
// 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
|
||
|
{
|
||
|
if(DEBUG) DoDebug("ft_vowpoverty_ft: Aborting due to error.");
|
||
|
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))
|
||
|
{
|
||
|
// Maneuver selection stage
|
||
|
if(nStage == STAGE_SELECT_ABIL)
|
||
|
{
|
||
|
//Check which Feats have been added by this ability
|
||
|
int nTotalRows = Get2DARowCount("prc_vop_feats");
|
||
|
effect eCheckEffect = GetFirstEffect(oPC);
|
||
|
while (GetIsEffectValid(eCheckEffect))
|
||
|
{
|
||
|
for(nRow=0; nRow <= nTotalRows; nRow++)
|
||
|
{
|
||
|
string nFeat = Get2DAString("prc_vop_feats","FeatIndex",nRow);
|
||
|
if(GetEffectTag(eCheckEffect) == "VoPFeat"+nFeat) SetLocalInt(oPC,"VoPFeat"+nFeat,1);
|
||
|
}
|
||
|
eCheckEffect = GetNextEffect(oPC);
|
||
|
}
|
||
|
|
||
|
SetHeader("Choose an Exalted Feat for this new level under a Vow of Poverty:");
|
||
|
//Add new option depending if it was not selected and char has all prereqs
|
||
|
for(nRow=0; nRow <= nTotalRows; nRow++)
|
||
|
{
|
||
|
//Get prereqs from 2DA
|
||
|
string sName = Get2DAString("prc_vop_feats","Name",nRow);
|
||
|
int nFeat = StringToInt(Get2DAString("prc_vop_feats","FeatIndex",nRow));
|
||
|
int nPreReq1 = StringToInt(Get2DAString("prc_vop_feats","PreReq1",nRow));
|
||
|
int nPreReq2 = StringToInt(Get2DAString("prc_vop_feats","PreReq2",nRow));
|
||
|
int nCon = StringToInt(Get2DAString("prc_vop_feats","Con",nRow));
|
||
|
int nWis = StringToInt(Get2DAString("prc_vop_feats","Wis",nRow));
|
||
|
int nCha = StringToInt(Get2DAString("prc_vop_feats","Cha",nRow));
|
||
|
int nBAB = StringToInt(Get2DAString("prc_vop_feats","BAB",nRow));
|
||
|
int nLaw = StringToInt(Get2DAString("prc_vop_feats","Law",nRow));
|
||
|
|
||
|
int nAllPreReq = 1;
|
||
|
|
||
|
//Check if prereqs exist and, if so, if they are met - if not, set bol to 0
|
||
|
if(nPreReq1>0 && !GetHasFeat(nPreReq1, oPC)) nAllPreReq = 0;
|
||
|
if(nPreReq1==213 && GetLevelByClass(CLASS_TYPE_MONK, oPC) >= 1) nAllPreReq = 1; //for Ki Strike and monks
|
||
|
if(nPreReq2>0 && !GetHasFeat(nPreReq2, oPC)) nAllPreReq = 0;
|
||
|
if(nCon>0 && !GetAbilityScore(oPC,ABILITY_CONSTITUTION) >= nCon) nAllPreReq = 0;
|
||
|
if(nWis>0 && !GetAbilityScore(oPC,ABILITY_CONSTITUTION) >= nWis) nAllPreReq = 0;
|
||
|
if(nCha>0 && !GetAbilityScore(oPC,ABILITY_CONSTITUTION) >= nCha) nAllPreReq = 0;
|
||
|
if(nBAB>0 && !GetBaseAttackBonus(oPC) >= nBAB) nAllPreReq = 0;
|
||
|
if(nLaw>0 && !GetAlignmentLawChaos(oPC) == ALIGNMENT_LAWFUL) nAllPreReq = 0;
|
||
|
|
||
|
if (!GetHasFeat(nFeat, oPC) && !GetLocalInt(oPC, "VoPFeat"+IntToString(nFeat)) && nAllPreReq == 1) AddChoice(sName, nFeat, oPC);
|
||
|
}
|
||
|
|
||
|
AddChoice("Cancel (you will get no Exalted Feats this level)", 0, oPC);
|
||
|
SetDefaultTokens(); //If there are more than 10 options, add Next
|
||
|
MarkStageSetUp(STAGE_SELECT_ABIL, oPC);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Do token setup
|
||
|
SetupTokens();
|
||
|
}
|
||
|
else if(nValue == DYNCONV_EXITED)
|
||
|
{
|
||
|
if(DEBUG) DoDebug("ft_vowpoverty_ft: Running exit handler");
|
||
|
}
|
||
|
else if(nValue == DYNCONV_ABORTED)
|
||
|
{
|
||
|
// This section should never be run, since aborting this conversation should
|
||
|
// always be forbidden and as such, any attempts to abort the conversation
|
||
|
// should be handled transparently by the system
|
||
|
if(DEBUG) DoDebug("ft_vowpoverty_ft: ERROR: Conversation abort section run");
|
||
|
}
|
||
|
// Handle PC response
|
||
|
else
|
||
|
{
|
||
|
int nChoice = GetChoice(oPC);
|
||
|
if(nStage == STAGE_SELECT_ABIL)
|
||
|
{
|
||
|
SetPersistantLocalInt(oPC, "VoPFeat"+IntToString(nLevel),1); //Register the choice was made
|
||
|
|
||
|
//If it was not cancelled, give chosen feat to PC (as EffectBonusFeat)
|
||
|
if(nChoice > 0)
|
||
|
{
|
||
|
effect eBonusFeat = EffectBonusFeat(nChoice);
|
||
|
eBonusFeat = UnyieldingEffect(eBonusFeat);
|
||
|
eBonusFeat = TagEffect(eBonusFeat, "VoPFeat"+IntToString(nChoice));
|
||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBonusFeat, oPC);
|
||
|
}
|
||
|
|
||
|
// And we're all done
|
||
|
DeletePersistantLocalInt(oPC,"VoPFeatCheck");
|
||
|
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
|
||
|
}
|
||
|
|
||
|
if(DEBUG) DoDebug("ft_vowpoverty_ft: New stage: " + IntToString(nStage));
|
||
|
|
||
|
// Store the stage value. If it has been changed, this clears out the choices
|
||
|
SetStage(nStage, oPC);
|
||
|
}
|
||
|
}
|
||
|
|