Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
245 lines
11 KiB
Plaintext
245 lines
11 KiB
Plaintext
//:://////////////////////////////////////////////
|
|
//:: Psychofeedback Conversation
|
|
//:: psi_psychofeed
|
|
//:://////////////////////////////////////////////
|
|
/** @file
|
|
This allows you to drain some stats to boost others
|
|
|
|
|
|
@author Stratovarius
|
|
@date Created - 29.10.2005
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "inc_dynconv"
|
|
#include "psi_inc_psifunc"
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Constant defintions */
|
|
//////////////////////////////////////////////////
|
|
|
|
const int STAGE_STAT_BOOST_CHOICE = 0;
|
|
const int STAGE_CONFIRMATION = 1;
|
|
const int STAGE_STAT_BURN_CHOICE = 2;
|
|
const int STAGE_STAT_AMOUNT = 3;
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Aid functions */
|
|
//////////////////////////////////////////////////
|
|
|
|
// Just takes the stat and returns the name
|
|
string StatToName(int nStat)
|
|
{
|
|
if (nStat == ABILITY_STRENGTH) return GetStringByStrRef(135);
|
|
else if (nStat == ABILITY_DEXTERITY) return GetStringByStrRef(133);
|
|
else if (nStat == ABILITY_CONSTITUTION) return GetStringByStrRef(132);
|
|
else if (nStat == ABILITY_WISDOM) return GetStringByStrRef(136);
|
|
else if (nStat == ABILITY_INTELLIGENCE) return GetStringByStrRef(134);
|
|
else if (nStat == ABILITY_CHARISMA) return GetStringByStrRef(131);
|
|
|
|
// if its not a stat
|
|
return "";
|
|
}
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Main function */
|
|
//////////////////////////////////////////////////
|
|
|
|
void main()
|
|
{
|
|
object oPC = GetPCSpeaker();
|
|
/* 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);
|
|
|
|
// 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_STAT_BOOST_CHOICE)
|
|
{
|
|
// Set the header
|
|
SetHeader("Select the Ability Score you would like to boost.");
|
|
|
|
// Add responses for the PC
|
|
AddChoice(StatToName(ABILITY_STRENGTH), ABILITY_STRENGTH, oPC);
|
|
AddChoice(StatToName(ABILITY_DEXTERITY), ABILITY_DEXTERITY, oPC);
|
|
AddChoice(StatToName(ABILITY_CONSTITUTION), ABILITY_CONSTITUTION, oPC);
|
|
|
|
MarkStageSetUp(STAGE_STAT_BOOST_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_STAT_BURN_CHOICE)//Stat to burn
|
|
{
|
|
// Set the header
|
|
SetHeader("Select the Ability Score you would like to burn for this power.");
|
|
|
|
// Add responses for the PC
|
|
AddChoice(StatToName(ABILITY_STRENGTH), ABILITY_STRENGTH, oPC);
|
|
AddChoice(StatToName(ABILITY_DEXTERITY), ABILITY_DEXTERITY, oPC);
|
|
AddChoice(StatToName(ABILITY_CONSTITUTION), ABILITY_CONSTITUTION, oPC);
|
|
AddChoice(StatToName(ABILITY_WISDOM), ABILITY_WISDOM, oPC);
|
|
AddChoice(StatToName(ABILITY_INTELLIGENCE), ABILITY_INTELLIGENCE, oPC);
|
|
AddChoice(StatToName(ABILITY_CHARISMA), ABILITY_CHARISMA, oPC);
|
|
|
|
MarkStageSetUp(STAGE_STAT_BURN_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_STAT_AMOUNT)//Stat to burn
|
|
{
|
|
// Set the header
|
|
string sAmount = "How much would you like to burn and increase your stat by?\n";
|
|
sAmount += "If you select a value higher than your manifester level, it will be set to your manifester leve.\n";
|
|
sAmount += "Your manifester level is " + IntToString(GetLocalInt(oPC, "PsychoFeedManifesterLevel")) + "\n";
|
|
sAmount += "Your current value is " + IntToString(GetLocalInt(oPC, "PsychoFeedbackAmount"));
|
|
SetHeader(sAmount);
|
|
|
|
AddChoice("Add 1", 1);
|
|
AddChoice("Add 5", 5);
|
|
AddChoice("Add 10", 10);
|
|
AddChoice("Subtract 1", -1);
|
|
AddChoice("Subtract 5", -5);
|
|
AddChoice("Subtract 10", -10);
|
|
AddChoice("Finished", 666);
|
|
|
|
MarkStageSetUp(STAGE_STAT_AMOUNT, 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, "PsychoFeedbackStat");
|
|
int nBurn = GetLocalInt(oPC, "PsychoFeedbackBurn");
|
|
int nAmount = GetLocalInt(oPC, "PsychoFeedbackAmount");
|
|
AddChoice(GetStringByStrRef(4752), TRUE); // "Yes"
|
|
AddChoice(GetStringByStrRef(4753), FALSE); // "No"
|
|
|
|
string sName = StatToName(nChoice);
|
|
string sText = "You have selected " + sName + " as the ability to boost.\n";
|
|
sName = StatToName(nBurn);
|
|
sText += "You have selected " + sName + " as the ability to burn.\n";
|
|
sText += "You have selected " + IntToString(nAmount) + " as the value.\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, "PsychoFeedbackStat");
|
|
DeleteLocalInt(oPC, "PsychoFeedbackBurn");
|
|
DeleteLocalInt(oPC, "PsychoFeedbackAmount");
|
|
}
|
|
// 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, "PsychoFeedbackStat");
|
|
DeleteLocalInt(oPC, "PsychoFeedbackBurn");
|
|
DeleteLocalInt(oPC, "PsychoFeedbackAmount");
|
|
}
|
|
// 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_STAT_BOOST_CHOICE)
|
|
{
|
|
nStage = STAGE_STAT_BURN_CHOICE;
|
|
SetLocalInt(oPC, "PsychoFeedbackStat", nChoice);
|
|
}
|
|
else if(nStage == STAGE_STAT_BURN_CHOICE)
|
|
{
|
|
nStage = STAGE_STAT_AMOUNT;
|
|
SetLocalInt(oPC, "PsychoFeedbackBurn", nChoice);
|
|
}
|
|
else if(nStage == STAGE_STAT_AMOUNT)
|
|
{
|
|
// Exit value for this stage
|
|
if (nChoice == 666)
|
|
{
|
|
nStage = STAGE_CONFIRMATION;
|
|
}
|
|
else
|
|
{
|
|
int nPFAmount = GetLocalInt(oPC, "PsychoFeedbackAmount");
|
|
SetLocalInt(oPC, "PsychoFeedbackAmount", (nPFAmount + nChoice));
|
|
nStage = STAGE_STAT_AMOUNT;
|
|
}
|
|
ClearCurrentStage();
|
|
}
|
|
else if(nStage == STAGE_CONFIRMATION)//confirmation
|
|
{
|
|
// No point in letting them finish if they haven't burned anything
|
|
if(nChoice == TRUE && GetLocalInt(oPC, "PsychoFeedbackAmount") > 0)
|
|
{
|
|
int nStat = GetLocalInt(oPC, "PsychoFeedbackStat");
|
|
int nBurn = GetLocalInt(oPC, "PsychoFeedbackBurn");
|
|
int nAmount = GetLocalInt(oPC, "PsychoFeedbackAmount");
|
|
if (nAmount > GetLocalInt(oPC, "PsychoFeedManifesterLevel")) nAmount = GetLocalInt(oPC, "PsychoFeedManifesterLevel");
|
|
|
|
effect eVis = EffectVisualEffect(VFX_IMP_IMPROVE_ABILITY_SCORE);
|
|
effect eVis2 = EffectVisualEffect(VFX_IMP_REDUCE_ABILITY_SCORE);
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
|
|
|
ApplyAbilityDamage(oPC, nBurn, nAmount, DURATION_TYPE_TEMPORARY, FALSE, -1.0f);
|
|
|
|
effect eStr = EffectAbilityIncrease(nStat,nAmount);
|
|
effect eLink = EffectLinkEffects(eStr, eDur);
|
|
|
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, GetLocalFloat(oPC, "PsychoFeedDuration"), TRUE, POWER_PSYCHOFEEDBACK, GetLocalInt(oPC, "PsychoFeedManifesterLevel"));
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oPC);
|
|
|
|
// And we're all done
|
|
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
|
|
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_STAT_BOOST_CHOICE;
|
|
MarkStageNotSetUp(STAGE_STAT_BOOST_CHOICE, oPC);
|
|
MarkStageNotSetUp(STAGE_STAT_BURN_CHOICE, oPC);
|
|
MarkStageNotSetUp(STAGE_STAT_AMOUNT, oPC);
|
|
MarkStageNotSetUp(STAGE_CONFIRMATION, oPC);
|
|
}
|
|
|
|
DeleteLocalInt(oPC, "PsychoFeedbackStat");
|
|
DeleteLocalInt(oPC, "PsychoFeedbackBurn");
|
|
DeleteLocalInt(oPC, "PsychoFeedbackAmount");
|
|
}
|
|
|
|
// Store the stage value. If it has been changed, this clears out the choices
|
|
SetStage(nStage, oPC);
|
|
}
|
|
}
|