Files
PRC8/nwn/nwnprc/trunk/scripts/prc_switchesc.nss
Jaysyn904 41a3c945f9 2026/02/14 Updates
Updated PRC8 version.
Hathran can now select an ethran as a cohort.
Preliminary Circle Magic work done.
Added Choke Hold, Pain Touch, Ki Shout, Great Ki Shout, Freezing the Lifeblood, Falling Star Strikea nd Unbalancing Strike feats.
Warforged get Immunity Energy Drain, not Immunity: Ability Drain.
Forsakers can use alchemical items.
Added VectorToPerpendicular().
Added GetIsAlchemical().
Added GenerateRandomName().
Added _DoChokeHold().
Updated Shaman bonus feat list.
Updated fighter bonus feat lists.
Added Favored of the Companions to the Vow of Poverty bonus feat list.
Ur-Priest can't enter RKV, BFZ or Thrall of Orcus.
2026-02-14 19:53:55 -05:00

2593 lines
104 KiB
Plaintext

//:://////////////////////////////////////////////
//:: PRC Switch manipulation conversation
//:: prc_switchesc
//:://////////////////////////////////////////////
/** @file
This conversation is used for changing values
of the PRC switches ingame.
@todo Primo: TLKify this
@author Primogenitor
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "inc_dynconv"
#include "inc_epicspells"
#include "prc_inc_leadersh"
#include "prc_inc_natweap"
#include "prc_inc_template"
#include "inc_switch_setup"
#include "pnp_shft_poly"
#include "inc_sql"
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
const int STAGE_ENTRY = 0;
const int STAGE_SWITCHES = 1;
const int STAGE_SWITCHES_VALUE = 2;
const int STAGE_EPIC_SPELLS = 3;
const int STAGE_EPIC_SPELLS_ADD = 4;
const int STAGE_EPIC_SPELLS_REMOVE = 5;
const int STAGE_EPIC_SPELLS_CONTING = 6;
const int STAGE_SHOPS = 8;
const int STAGE_TEFLAMMAR_SHADOWLORD = 9;
const int STAGE_LEADERSHIP = 10;
const int STAGE_LEADERSHIP_ADD_STANDARD = 11;
const int STAGE_LEADERSHIP_ADD_STANDARD_CONFIRM = 12;
const int STAGE_LEADERSHIP_ADD_CUSTOM_RACE = 13;
const int STAGE_LEADERSHIP_ADD_CUSTOM_GENDER = 14;
const int STAGE_LEADERSHIP_ADD_CUSTOM_CLASS = 15;
const int STAGE_LEADERSHIP_ADD_CUSTOM_ALIGN = 16;
const int STAGE_LEADERSHIP_ADD_CUSTOM_CONFIRM = 17;
const int STAGE_LEADERSHIP_REMOVE = 18;
const int STAGE_LEADERSHIP_DELETE = 19;
const int STAGE_LEADERSHIP_DELETE_CONFIRM = 20;
const int STAGE_MISC_OPTIONS = 21;
const int STAGE_SPELLS = 22;
const int STAGE_WILDSHAPE_SLOTS = 23;
const int STAGE_WILDSHAPE_SHAPE = 24;
const int STAGE_ELEMENTALSHAPE_SLOTS = 25;
const int STAGE_ELEMENTALSHAPE_SHAPE = 26;
const int STAGE_DRAGONSHAPE_SLOTS = 27;
const int STAGE_DRAGONSHAPE_SHAPE = 28;
const int STAGE_PNP_FAMILIAR_COMPANION = 29;
const int STAGE_NATURAL_WEAPON = 30;
const int STAGE_TEMPLATE = 31;
const int STAGE_TEMPLATE_CONFIRM = 32;
const int STAGE_TEMPLATE_HALF_DRAGON = 33;
const int STAGE_TEMPLATE_HALF_DRAGON_CONFIRM = 34;
const int STAGE_WOL_PURCHASE = 35;
const int STAGE_WOL_CONFIRM = 36;
const int STAGE_WOL_RITUALS = 37;
const int STAGE_WOL_HEADER = 38;
const int STAGE_WOL_RESEARCH = 39;
const int STAGE_WOL_RESEARCH_2 = 40;
const int STAGE_LA_BUYOFF = 41;
const int STAGE_ENCOUNTER_AREAS = 42;
const int STAGE_ENCOUNTER_CONFIRM = 43;
const int STAGE_ABERRANT_SLOTS = 44;
const int STAGE_ABERRANT_SHAPE = 45;
const int STAGE_SPELL_SHOPS = 46;
const int STAGE_SPELL_SHOPS_CLASS_FILTER = 47;
const int STAGE_SPELL_SHOPS_LEVEL_FILTER = 48;
const int STAGE_SPELL_SHOPS_ALPHABETICAL_FILTER = 49;
const int STAGE_PLANTSHAPE_SLOTS = 50;
const int STAGE_PLANTSHAPE_SHAPE = 51;
const int STAGE_WIELDING = 52;
const int STAGE_WIELDING_ONE = 53;
const int STAGE_WIELDING_TWO = 54;
const int STAGE_WIELDING_POLEARM = 55;
const int STAGE_HATHRAN_COHORT = 56;
// Confirmation stage for registering cohort
const int STAGE_REGISTER_CONFIRM = 200;
const int STAGE_CDKEY_ADD = 509;
const int STAGE_APPEARANCE = 510;
const int STAGE_HEAD = 520;
const int STAGE_WINGS = 530;
const int STAGE_TAIL = 540;
const int STAGE_BODYPART = 550;
const int STAGE_BODYPART_CHANGE = 551;
const int STAGE_PORTRAIT = 560;
const int STAGE_EQUIPMENT = 590;
const int STAGE_EQUIPMENT_SIMPLE = 591; //e.g. shield
const int STAGE_EQUIPMENT_LAYERED = 592; //e.g. helm
const int STAGE_EQUIPMENT_COMPOSITE = 593; //e.g. sword
const int STAGE_EQUIPMENT_COMPOSITE_B = 594;
const int STAGE_EQUIPMENT_ARMOR = 595; //e.g. armor
const int CHOICE_RETURN_TO_PREVIOUS = 0xEFFFFFFF;
const int CHOICE_SWITCHES_USE_2DA = 0xEFFFFFFE;
//:: PnP shifting constants
const int TYPE_WILD_SHAPE = 1; //0x01
const int TYPE_ELEMENTAL_SHAPE = 2; //0x02
const int TYPE_DRAGON_SHAPE = 4; //0x04
const int TYPE_POLYMORPH_SELF = 8; //0x08
const int TYPE_ABERRANT_SHAPE = 16; //0x16
const int TYPE_PLANT_SHAPE = 32; //0x20
//////////////////////////////////////////////////
/* Aid functions */
//////////////////////////////////////////////////
void AddPortraits(int nMin, int nMax, object oPC)
{
int i;
string sName;
for(i=nMin;i<nMin+100;i++)
{
//test for model
if(Get2DACache("portraits", "Race", i) != "")
{
sName = Get2DACache("portraits", "BaseResRef", i);
AddChoice(sName, i, oPC);
}
}
if(i < nMax)
DelayCommand(0.00, AddPortraits(i, nMax, oPC));
}
void AddTails(int nMin, int nMax, object oPC)
{
int i;
string sName;
for(i=nMin;i<nMin+100;i++)
{
//test for model
if(Get2DACache("tailmodel", "MODEL", i) != "")
{
sName = Get2DACache("tailmodel", "LABEL", i);
AddChoice(sName, i, oPC);
}
}
if(i < nMax)
DelayCommand(0.00, AddTails(i, nMax, oPC));
}
void AddWings(int nMin, int nMax, object oPC)
{
int i;
string sName;
for(i=nMin;i<nMin+100;i++)
{
//test for model
if(Get2DACache("wingmodel", "MODEL", i) != "")
{
sName = Get2DACache("wingmodel", "LABEL", i);
AddChoice(sName, i, oPC);
}
}
if(i < nMax)
DelayCommand(0.00, AddWings(i, nMax, oPC));
}
void AddAppearances(int nMin, int nMax, object oPC)
{
int i;
string sName;
for(i=nMin;i<nMin+100;i++)
{
//test for model
if(Get2DACache("appearance", "RACE", i) != "")
{
//test for tlk name
sName = GetStringByStrRef(StringToInt(Get2DACache("appearance", "STRING_REF", i)));
//no tlk name, use label
if(sName == "")
sName = Get2DACache("appearance", "LABEL", i);
AddChoice(sName, i, oPC);
}
}
if(i < nMax)
DelayCommand(0.00, AddAppearances(i, nMax, oPC));
}
void AddCohortRaces(int nMin, int nMax, object oPC)
{
int i;
int nMaxHD = GetCohortMaxLevel(GetLeadershipScore(oPC), oPC);
int bUseSimpleRacialHD = GetPRCSwitch(PRC_XP_USE_SIMPLE_RACIAL_HD);
string sName;
for(i=nMin;i<nMin+100;i++)
{
if(Get2DACache("racialtypes", "PlayerRace", i) == "1")
{
sName = GetStringByStrRef(StringToInt(Get2DACache("racialtypes", "Name", i)));
//if using racial HD, dont add them untill they can afford the minimum racial hd
if(bUseSimpleRacialHD)
{
if(nMaxHD > StringToInt(Get2DACache("ECL", "RaceHD", i)))
AddChoice(sName, i, oPC);
}
else
AddChoice(sName, i, oPC);
}
}
if(i < nMax)
DelayCommand(0.00, AddCohortRaces(i, nMax, oPC));
}
void AddTemplates(int nMin, int nMax, object oPC)
{
int i;
for(i=nMin;i<=nMax;i++)
{
string sName;
string sScript = Get2DACache("templates", "MaintainScript", i);
int nNameID = StringToInt(Get2DACache("templates", "Name", i));
if(nNameID != 0)
sName = GetStringByStrRef(nNameID);
else
sName = Get2DACache("templates", "Label", i);
//check type
//inherited templates can only be taken with 1 HD
if(((StringToInt(Get2DACache("templates", "Type", i)) & 1)
&& GetHitDice(oPC) > 1)
|| !ApplyTemplateToObject(i, oPC, FALSE))
{
sName = PRC_TEXT_GRAY+sName+"</c>";
}
if(sScript != "")
AddChoice(sName, i);
}
}
void AddLegacies(object oPC, int nResearch = FALSE)
{
//DoDebug("Entered AddLegacies");
//Weapons of Legacy never stack, so dont let them
if(GetPersistantLocalInt(oPC, "LegacyOwner") && !nResearch)
return;
int i;
for(i=1;i<=60;i++)
{
string sName;
int nNameID = StringToInt(Get2DACache("wol_items", "Name", i));
if(nNameID != 0)
sName = GetStringByStrRef(nNameID);
else
sName = Get2DACache("wol_items", "Label", i);
// Test if they can purchase a legacy
string sScript = Get2DACache("wol_items", "TestScript", i);
int nGold = StringToInt(Get2DACache("wol_items", "Cost", i));
if (DEBUG) DoDebug("AddLegacies: "+sName+" - "+sScript+", Gold needed "+IntToString(nGold)+", Gold possessed "+IntToString(GetGold(oPC)));
if(sScript != "" && !ExecuteScriptAndReturnInt(sScript, oPC) && GetGold(oPC) >= nGold && !nResearch)
AddChoice(sName, i);
else if (sScript != "" && nResearch) // Research mode
AddChoice(sName, i);
}
}
void AddRitualCost(object oPC)
{
// Which weapon do we have?
int nWoL = GetPersistantLocalInt(oPC, "LegacyOwner");
string sName;
int nNameID = StringToInt(Get2DACache("wol_items", "Name", nWoL));
if(nNameID != 0)
sName = GetStringByStrRef(nNameID);
// They've paid for everything
if (GetHasFeat(FEAT_GREATER_LEGACY)) return;
// Pay for greater rituals
if (GetHasFeat(FEAT_LESSER_LEGACY))
{
int nGold = StringToInt(Get2DACache("wol_items", "Greater", nWoL));
if (GetGold(oPC) >= nGold && nGold > 999) AddChoice("Purchase the Greater Legacy for "+sName+", at a cost of "+IntToString(nGold)+" gold", nGold);
}
else if (GetHasFeat(FEAT_LEAST_LEGACY))
{
int nGold = StringToInt(Get2DACache("wol_items", "Lesser", nWoL));
if (GetGold(oPC) >= nGold && nGold > 999) AddChoice("Purchase the Lesser Legacy for "+sName+", at a cost of "+IntToString(nGold)+" gold", nGold);
}
else
{
int nGold = StringToInt(Get2DACache("wol_items", "Least", nWoL));
if (GetGold(oPC) >= nGold) AddChoice("Purchase the Least Legacy for "+sName+", at a cost of "+IntToString(nGold)+" gold", nGold);
}
}
void AddShapes(int nMin, int nMax, object oPC, int nType)
{
int i;
string sName;
for(i=nMin;i<nMin+100;i++)
{
int nLimit = GetPRCSwitch(PNP_SHFT_USECR) ? StringToInt(Get2DACache("prc_polymorph", "CR", i)) : StringToInt(Get2DACache("prc_polymorph", "HD", i));
if(nLimit <= GetHitDice(oPC))
{
int nName = StringToInt(Get2DACache("prc_polymorph", "Name", i));
sName = nName != 0 ? GetStringByStrRef(nName) : Get2DACache("prc_polymorph", "Label", i);
if(sName != "" && HexToInt(Get2DACache("prc_polymorph", "Type", i)) & nType)
AddChoice(sName, i, oPC);
}
}
if(i < nMax)
{
DelayCommand(0.00f, AddShapes(i, nMax, oPC, nType));
}
else
{
FloatingTextStringOnCreature("Done", oPC, FALSE);
DeleteLocalInt(oPC, "DynConv_Waiting");
}
}
void CohortSetAlignment(int nMoral, int nOrder, object oCohort)
{
if(!GetIsObjectValid(oCohort))
return;
if(GetIsPC(oCohort))
return;
int nCurrentOrder = GetLawChaosValue(oCohort);
int nCurrentMoral = GetGoodEvilValue(oCohort);
if(nCurrentOrder == -1
|| nCurrentMoral == -1)
return;
if(nCurrentMoral < nMoral)
AdjustAlignment(oCohort, ALIGNMENT_GOOD, nMoral-nCurrentMoral, FALSE);
else if(nCurrentMoral > nMoral)
AdjustAlignment(oCohort, ALIGNMENT_EVIL, nCurrentMoral-nMoral, FALSE);
if(nCurrentOrder < nOrder)
AdjustAlignment(oCohort, ALIGNMENT_LAWFUL, nOrder-nCurrentOrder, FALSE);
else if(nCurrentOrder > nOrder)
AdjustAlignment(oCohort, ALIGNMENT_CHAOTIC, nCurrentOrder-nOrder, FALSE);
}
int GetStrRefForTemplate(int nTemplate)
{
int nStrRef = (16838640 + 2 * nTemplate) - 2;//Starts at 'Black Half-Dragon' = 16838640
return nStrRef;
}
//Part of Server Security Script by FunkySwerve
int GetCanAddNewKey(object oPC)
{
string sPlayer = GetStringLowerCase(GetPCPlayerName(oPC));
if(GetPRCSwitch(PRC_USE_DATABASE))
{
sPlayer = ReplaceSingleChars(sPlayer,"'","~");
string sSQL = "SELECT val FROM pwdata WHERE name='PlayernameKey_" + sPlayer + "'";
PRC_SQLExecDirect(sSQL);
if (PRC_SQLFetch() == PRC_SQL_SUCCESS) /* there's at least one key stored already */
{
string sStoredKey = PRC_SQLGetData(1);
int nLength = GetStringLength(sStoredKey);
if (nLength > 61) /* allow 7 keys max key-key-key-key-key-key-key 6 spacers + 7x8 keys = 62 */
{
return TRUE;
}
else return FALSE;
}
}
else
{
string sStoredKey = GetCampaignString("PlayernameKey", sPlayer );
if (sStoredKey != "")
{
int nLength = GetStringLength(sStoredKey);
if (nLength > 65) /* allow 7 keys max SET-key-key-key-key-key-key-key SET/ADD + 7 spacers + 7x8 keys = 66 */
return TRUE;
}
return FALSE;
}
return FALSE; /* this should never be reached if your database is running, since the first key add is automatic oncliententer */
}
void AddNewCDKey(object oPC)
{
string sPlayer = GetStringLowerCase(GetPCPlayerName(oPC));
if(GetPRCSwitch(PRC_USE_DATABASE))
{
sPlayer = ReplaceSingleChars(sPlayer,"'","~");
string sSQL = "UPDATE pwdata SET tag='Adding' WHERE name='PlayernameKey_"+ sPlayer + "'"; //must mark as adding
PRC_SQLExecDirect(sSQL);
}
else
{
string sStoredKey = GetCampaignString("PlayernameKey", sPlayer);
string sKeys = "ADD" + GetStringRight(sStoredKey, GetStringLength(sStoredKey) - 3);//mark as adding
SetCampaignString("PlayernameKey", sPlayer, sKeys);
}
}
object InitializeStore(string shopName) {
object oStore = GetObjectByTag(shopName);
if(!GetIsObjectValid(oStore))
{
location lLimbo = GetLocation(GetObjectByTag("HEARTOFCHAOS"));
oStore = CreateObject(OBJECT_TYPE_STORE, shopName, lLimbo);
}
return oStore;
}
void OpenShop(string shopName) {
object oPC = GetPCSpeaker();
object oStore = InitializeStore(shopName);
DelayCommand(1.0, OpenStore(oStore, oPC));
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
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);
object oWeaponR = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
object oWeaponL = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);
int bRanged = GetWeaponRanged(oWeaponR);
// 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))
{
if(nStage == STAGE_ENTRY)
{
SetHeader("What do you want to do?");
if(!GetPRCSwitch(PRC_DISABLE_SWITCH_CHANGING_CONVO) || GetIsDMPossessed(oPC) || GetIsDM(oPC))
AddChoice("Alter code switches.", 1);
if(GetIsEpicSpellcaster(oPC))
AddChoice("Manage Epic Spells.", 2);
AddChoice("Purchase general items, such as scrolls or crafting materials.", 3);
AddChoice("Attempt to identify everything in my inventory.", 4);
if(GetAlignmentGoodEvil(oPC) != ALIGNMENT_GOOD
&& !GetPersistantLocalInt(oPC, "shadowwalkerstok"))
AddChoice("Join the Shadowlords as a prerequisite for the Teflammar Shadowlord class.", 5);
if(!GetPRCSwitch(PRC_DISABLE_REGISTER_COHORTS) && GetCanRegister(oPC))
AddChoice("Register this character as a cohort.", 6);
if(GetMaximumCohortCount(oPC))
AddChoice("Manage cohorts.", 7);
if(GetPrimaryNaturalWeaponCount(oPC))
AddChoice("Select primary natural weapon.", 8);
if(!GetPRCSwitch(PRC_DISABLE_CONVO_TEMPLATE_GAIN))
AddChoice("Gain a template.", 9);
if(!GetPRCSwitch(PRC_DISABLE_WOL_GAIN))
AddChoice("Weapons of Legacy.", 35);
if(GetCanBuyoffLA(oPC))
AddChoice("LA Buyoff.", 41);
if(!GetPRCSwitch(PRC_DISABLE_ENCOUNTERS))
AddChoice("Visit an encounter area", 42);
if(DEBUG) //this doesn't work at all
//if(!GetPRCSwitch(PRC_APPEARNCE_CHANGE_DISABLE))
AddChoice("Change appearance.", 10);
AddChoice("Miscellaneous options.", 11);
if(DEBUG)//TO DO: add separate switch
AddChoice("Wipe PRC Spellbooks", 12);
AddChoice("Hathran Cohort Selection", 56);
if((!bRanged && oWeaponR != OBJECT_INVALID) && (PRCGetCreatureSize(oPC) > 1 && PRCGetCreatureSize(oPC) < 5))
{
AddChoice("Set weapon wielding.", 52);
}
MarkStageSetUp(nStage, oPC);
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
}
else if(nStage == STAGE_SWITCHES)
{
SetHeader("Select a variable to modify.\n"
+ "See prc_inc_switches for descriptions.\n"
+ "In most cases zero is off and any other value is on."
);
// First choice is Back, so people don't have to scroll ten pages to find it
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
// Add a special choices
AddChoice("Read personal_switch.2da and set switches based on it's contents", CHOICE_SWITCHES_USE_2DA);
// Get the switches container waypoint, and call the builder function if it doesn't exist yet (it should)
object oWP = GetWaypointByTag("PRC_Switch_Name_WP");
if(!GetIsObjectValid(oWP))
{
if(DEBUG) DoDebug("prc_switchesc: PRC_Switch_Name_WP did not exist, attempting creation");
CreateSwitchNameArray();
oWP = GetWaypointByTag("PRC_Switch_Name_WP");
if(DEBUG) DoDebug("prc_switchesc: PRC_Switch_Name_WP " + (GetIsObjectValid(oWP) ? "created":"not created"));
}
int i;
for(i = 0; i < array_get_size(oWP, "Switch_Name"); i++)
{
AddChoice(array_get_string(oWP, "Switch_Name", i), i, oPC);
}
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_SWITCHES_VALUE)
{
string sVarName = GetLocalString(oPC, "VariableName");
int nVal = GetPRCSwitch(sVarName);
SetHeader("CurrentValue is: " + IntToString(nVal) + "\n"
+ "CurrentVariable is: " + sVarName + "\n"
+ "Select an ammount to modify the variable by:"
);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
AddChoice("-10", -10);
AddChoice("-5", -5);
AddChoice("-4", -4);
AddChoice("-3", -3);
AddChoice("-2", -2);
AddChoice("-1", -1);
AddChoice("+1", 1);
AddChoice("+2", 2);
AddChoice("+3", 3);
AddChoice("+4", 4);
AddChoice("+5", 5);
AddChoice("+10", 10);
}
else if(nStage == STAGE_EPIC_SPELLS)
{
SetHeader("Make a selection.");
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
if(GetCastableFeatCount(oPC)>0)
AddChoice("Remove an Epic Spell from the radial menu.", 1);
if(GetCastableFeatCount(oPC)<7)
AddChoice("Add an Epic Spell to the radial menu.", 2);
AddChoice("Manage any active contingencies.", 3);
if(!GetPRCSwitch(PRC_EPIC_CONVO_LEARNING_DISABLE))
AddChoice("Research an Epic Spell.", 4);
AddChoice("List known epic spells.", 5);
AddChoice("List known epic seeds.", 6);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_EPIC_SPELLS_ADD)
{
SetHeader("Choose the spell to add.");
int i;
for(i = 0; i < 71; i++)
{
int nSpellFeat = GetFeatForSpell(i);
if(GetHasEpicSpellKnown(i, oPC)
&& !GetHasFeat(nSpellFeat, oPC))
{
string sName = GetNameForSpell(i);
AddChoice(sName, i, oPC);
}
}
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_EPIC_SPELLS_REMOVE)
{
SetHeader("Choose the spell to remove.");
int i;
for(i = 0; i < 71; i++)
{
int nFeat = GetFeatForSpell(i);
if(GetHasFeat(nFeat, oPC))
{
string sName = GetNameForSpell(i);
AddChoice(sName, i, oPC);
}
}
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_EPIC_SPELLS_CONTING)
{
SetHeader("Choose an active contingency to dispel. Dispelling will pre-emptively end the contingency and restore the reserved epic spell slot for your use.");
if(GetLocalInt(oPC, "nContingentRez"))
AddChoice("Dispel any contingent resurrections.", 1);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_SHOPS)
{
SetHeader("Select what type of item you wish to purchase.");
if(GetHasFeat(FEAT_BREW_POTION, oPC)
|| GetHasFeat(FEAT_SCRIBE_SCROLL, oPC)
|| GetHasFeat(FEAT_CRAFT_WAND, oPC))
AddChoice("Magic item raw materials", 1);
if(!GetPRCSwitch(PRC_DISABLE_COMPONENTS_SHOP))
AddChoice("Material components for spells", 2);
if(!GetPRCSwitch(PRC_SPELLSLAB_NOSCROLLS))
AddChoice("Spell scrolls", 3);
if (GetIsEpicSpellcaster(oPC)
&& GetPRCSwitch(PRC_SPELLSLAB) != 3
)
AddChoice("Epic spell books", 4);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_SPELL_SHOPS) {
string lastSpellClass = GetLocalString(oPC, "SpellShopClassFilterName");
SetHeader("Select what types of spells you wish to purchase.");
AddChoice("All Spells", -1);
if (lastSpellClass != "") {
AddChoice("By " + lastSpellClass, GetLocalInt(oPC, "SpellShopClassFilter"));
}
AddChoice("By Class", -2);
AddChoice("Search Alphabetically", -3);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
} else if (nStage == STAGE_SPELL_SHOPS_CLASS_FILTER) {
SetHeader("Select what class to buy spell scrolls for.");
AddChoice("Any", -1);
int nRow;
int choiceNumber = 2;
for(nRow = 0; nRow < GetPRCSwitch(FILE_END_CLASSES); nRow++) {
string className = GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", nRow)));
int isSpellCaster = Get2DACache("classes", "SpellCaster", nRow) == "1";
if (isSpellCaster) {
string expectedShopName = "prcSS_C" + IntToString(nRow);
object allClassScrollsShop = InitializeStore(expectedShopName);
if(GetIsObjectValid(allClassScrollsShop)) {
AddChoice(className, nRow);
}
}
}
} else if (nStage == STAGE_SPELL_SHOPS_LEVEL_FILTER) {
SetHeader("What Level spells:");
AddChoice("Any", -1);
int spellLevel;
for(spellLevel = 0; spellLevel <= 9; spellLevel++) {
string shopName = "prcSS_C" + IntToString(GetLocalInt(oPC, "SpellShopClassFilter")) + "L" + IntToString(spellLevel);
object shop = InitializeStore(shopName);
if (GetIsObjectValid(shop)) {
AddChoice(IntToString(spellLevel), spellLevel);
}
}
}
else if (nStage == STAGE_SPELL_SHOPS_ALPHABETICAL_FILTER) {
SetHeader("What Level spells:");
AddChoice("a", 1);
AddChoice("b", 2);
AddChoice("c", 3);
AddChoice("d", 4);
AddChoice("e", 5);
AddChoice("f", 6);
AddChoice("g", 7);
AddChoice("h", 8);
AddChoice("i", 9);
AddChoice("j", 10);
AddChoice("k", 11);
AddChoice("l", 12);
AddChoice("m", 13);
AddChoice("n", 14);
AddChoice("o", 15);
AddChoice("p", 16);
AddChoice("q", 17);
AddChoice("r", 18);
AddChoice("s", 19);
AddChoice("t", 20);
AddChoice("u", 21);
AddChoice("v", 22);
AddChoice("w", 23);
AddChoice("x", 24);
AddChoice("y", 25);
AddChoice("z", 26);
}
else if(nStage == STAGE_TEFLAMMAR_SHADOWLORD)
{
SetHeader("This will cost you 10,000 GP, are you prepared to pay this?");
if(GetHasGPToSpend(oPC, 10000))
AddChoice("Yes", 1);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP)
{
SetHeader("What do you want to change?");
if(GetCurrentCohortCount(oPC) < GetMaximumCohortCount(oPC)
&& !GetLocalInt(oPC, "CohortRecruited")
&& !GetPRCSwitch(PRC_DISABLE_CUSTOM_COHORTS))
AddChoice("Recruit a custom cohort", 1);
if(GetCurrentCohortCount(oPC) < GetMaximumCohortCount(oPC)
&& !GetLocalInt(oPC, "CohortRecruited")
&& !GetPRCSwitch(PRC_DISABLE_STANDARD_COHORTS))
AddChoice("Recruit a standard cohort", 4);
//not implemented, remove via radial or conversation
//if(GetCurrentCohortCount(oPC))
// AddChoice("Dismiss an existing cohort", 2);
if(GetCampaignInt(COHORT_DATABASE, "CohortCount")>0)
AddChoice("Delete a stored custom cohort", 3);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_REGISTER_CONFIRM)
{
SetHeader("Are you sure you want to register this character as a cohort?");
AddChoice("Yes", 1);
AddChoice("No", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
SetDefaultTokens();
}
else if(nStage == STAGE_LEADERSHIP_ADD_STANDARD)
{
SetHeader("Select a cohort:");
int nCohortCount = GetCampaignInt(COHORT_DATABASE, "CohortCount");
int i;
for(i=1;i<=nCohortCount;i++)
{
if(GetIsCohortChoiceValidByID(i, oPC))
{
string sName = GetCampaignString(COHORT_DATABASE, "Cohort_"+IntToString(i)+"_name");
AddChoice(sName, i);
}
}
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_STANDARD_CONFIRM)
{
string sHeader = "Are you sure you want this cohort?";
int nCohortID = GetLocalInt(oPC, "CohortID");
string sName = GetCampaignString( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_name");
int nRace = GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_race");
int nClass1=GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_class1");
int nClass2=GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_class2");
int nClass3=GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_class3");
int nOrder= GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_order");
int nMoral= GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_moral");
sHeader +="\n"+sName;
sHeader +="\n"+GetStringByStrRef(StringToInt(Get2DACache("racialtypes", "Name", nRace)));
sHeader +="\n"+GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", nClass1)));
if(nClass2 != CLASS_TYPE_INVALID)
sHeader +=" / "+GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", nClass2)));
if(nClass3 != CLASS_TYPE_INVALID)
sHeader +=" / "+GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", nClass3)));
SetHeader(sHeader);
AddChoice("Yes", 1);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_CUSTOM_RACE)
{
SetHeader("Select a race for the cohort:");
AddCohortRaces( 0, 255, oPC);/*
DelayCommand(0.0f, AddCohortRaces(101, 200, oPC));
DelayCommand(0.0f, AddCohortRaces(201, 255, oPC));
*/
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_CUSTOM_GENDER)
{
SetHeader("Select a gender for the cohort:");
AddChoice("Male", GENDER_MALE);
AddChoice("Female", GENDER_FEMALE);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_CUSTOM_CLASS)
{
SetHeader("Select a class for the cohort:");
int i;
//only do bioware base classes for now otherwise the AI will fubar
for(i=0;i<=10;i++)
{
string sName = GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", i)));
AddChoice(sName, i);
}
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_CUSTOM_ALIGN)
{
SetHeader("Select an alignment for the cohort:");
int nClass = GetLocalInt(oPC, "CustomCohortClass");
if(GetIsValidAlignment(ALIGNMENT_LAWFUL, ALIGNMENT_GOOD,
HexToInt(Get2DACache("classes", "AlignRestrict",nClass)),
HexToInt(Get2DACache("classes", "AlignRstrctType",nClass)),
HexToInt(Get2DACache("classes", "InvertRestrict",nClass))))
{
AddChoice(GetStringByStrRef(112), 0);
}
if(GetIsValidAlignment(ALIGNMENT_NEUTRAL, ALIGNMENT_GOOD,
HexToInt(Get2DACache("classes", "AlignRestrict",nClass)),
HexToInt(Get2DACache("classes", "AlignRstrctType",nClass)),
HexToInt(Get2DACache("classes", "InvertRestrict",nClass))))
{
AddChoice(GetStringByStrRef(115), 1);
}
if(GetIsValidAlignment(ALIGNMENT_CHAOTIC, ALIGNMENT_GOOD,
HexToInt(Get2DACache("classes", "AlignRestrict",nClass)),
HexToInt(Get2DACache("classes", "AlignRstrctType",nClass)),
HexToInt(Get2DACache("classes", "InvertRestrict",nClass))))
{
AddChoice(GetStringByStrRef(118), 2);
}
if(GetIsValidAlignment(ALIGNMENT_LAWFUL, ALIGNMENT_NEUTRAL,
HexToInt(Get2DACache("classes", "AlignRestrict",nClass)),
HexToInt(Get2DACache("classes", "AlignRstrctType",nClass)),
HexToInt(Get2DACache("classes", "InvertRestrict",nClass))))
{
AddChoice(GetStringByStrRef(113), 3);
}
if(GetIsValidAlignment(ALIGNMENT_NEUTRAL, ALIGNMENT_NEUTRAL,
HexToInt(Get2DACache("classes", "AlignRestrict",nClass)),
HexToInt(Get2DACache("classes", "AlignRstrctType",nClass)),
HexToInt(Get2DACache("classes", "InvertRestrict",nClass))))
{
AddChoice(GetStringByStrRef(116), 4);
}
if(GetIsValidAlignment(ALIGNMENT_CHAOTIC, ALIGNMENT_NEUTRAL,
HexToInt(Get2DACache("classes", "AlignRestrict",nClass)),
HexToInt(Get2DACache("classes", "AlignRstrctType",nClass)),
HexToInt(Get2DACache("classes", "InvertRestrict",nClass))))
{
AddChoice(GetStringByStrRef(119), 5);
}
if(GetIsValidAlignment(ALIGNMENT_LAWFUL, ALIGNMENT_EVIL,
HexToInt(Get2DACache("classes", "AlignRestrict",nClass)),
HexToInt(Get2DACache("classes", "AlignRstrctType",nClass)),
HexToInt(Get2DACache("classes", "InvertRestrict",nClass))))
{
AddChoice(GetStringByStrRef(114), 6);
}
if(GetIsValidAlignment(ALIGNMENT_NEUTRAL, ALIGNMENT_EVIL,
HexToInt(Get2DACache("classes", "AlignRestrict",nClass)),
HexToInt(Get2DACache("classes", "AlignRstrctType",nClass)),
HexToInt(Get2DACache("classes", "InvertRestrict",nClass))))
{
AddChoice(GetStringByStrRef(117), 7);
}
if(GetIsValidAlignment(ALIGNMENT_CHAOTIC, ALIGNMENT_EVIL,
HexToInt(Get2DACache("classes", "AlignRestrict",nClass)),
HexToInt(Get2DACache("classes", "AlignRstrctType",nClass)),
HexToInt(Get2DACache("classes", "InvertRestrict",nClass))))
{
AddChoice(GetStringByStrRef(120), 8);
}
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_CUSTOM_CONFIRM)
{
string sHeader = "Are you sure you want this cohort?";
int nRace = GetLocalInt(oPC, "CustomCohortRace");
int nClass= GetLocalInt(oPC, "CustomCohortClass");
int nOrder= GetLocalInt(oPC, "CustomCohortOrder");
int nMoral= GetLocalInt(oPC, "CustomCohortMoral");
int nGender=GetLocalInt(oPC, "CustomCohortGender");
string sKey= GetPCPublicCDKey(oPC);
sHeader +="\n"+GetStringByStrRef(StringToInt(Get2DACache("racialtypes", "Name", nRace)));
sHeader +="\n"+GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", nClass)));
SetHeader(sHeader);
// GetIsCohortChoiceValid(sName, nRace, nClass1, nClass2, nClass3, nOrder, nMoral, nEthran, sKey, nDeleted, oPC);
if(GetIsCohortChoiceValid("", nRace, nClass, CLASS_TYPE_INVALID, CLASS_TYPE_INVALID, CLASS_TYPE_INVALID, CLASS_TYPE_INVALID, CLASS_TYPE_INVALID, CLASS_TYPE_INVALID, CLASS_TYPE_INVALID, nOrder, nMoral, FALSE, sKey, FALSE, oPC))
{
AddChoice("Yes", 1);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
}
else
AddChoice("This cohort is invalid", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_DELETE)
{
SetHeader("Select a cohort to delete:");
int nCohortCount = GetCampaignInt(COHORT_DATABASE, "CohortCount");
int i;
for(i=1;i<=nCohortCount;i++)
{
if(GetIsCohortChoiceValidByID(i, oPC))
{
string sName = GetCampaignString(COHORT_DATABASE, "Cohort_"+IntToString(i)+"_name");
AddChoice(sName, i);
}
}
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_DELETE_CONFIRM)
{
string sHeader = "Are you sure you want to delete this cohort?";
int nCohortID = GetLocalInt(oPC, "CohortID");
string sName = GetCampaignString( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_name");
int nRace = GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_race");
int nClass1=GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_class1");
int nClass2=GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_class2");
int nClass3=GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_class3");
int nOrder= GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_order");
int nMoral= GetCampaignInt( COHORT_DATABASE, "Cohort_"+IntToString(nCohortID)+"_moral");
sHeader +="\n"+sName;
sHeader +="\n"+GetStringByStrRef(StringToInt(Get2DACache("racialtypes", "Name", nRace)));
sHeader +="\n"+GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", nClass1)));
if(nClass2 != CLASS_TYPE_INVALID)
sHeader +=" / "+GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", nClass2)));
if(nClass3 != CLASS_TYPE_INVALID)
sHeader +=" / "+GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", nClass3)));
SetHeader(sHeader);
AddChoice("Yes", 1);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_NATURAL_WEAPON)
{
string sHeader = "Select a natural weapon to use.";
SetHeader(sHeader);
AddChoice("Unarmed", -1);
int i;
for(i=0;i<GetPrimaryNaturalWeaponCount(oPC);i++)
{
string sName;
//use resref for now
sName = array_get_string(oPC, ARRAY_NAT_PRI_WEAP_RESREF, i);
if(sName != "")
{
AddChoice(sName, i);
if (DEBUG) DoDebug("STAGE_NATURAL_WEAPON "+sName+" "+IntToString(i));
}
}
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WOL_HEADER)
{
string sHeader = "Do you wish to purchase a legacy or research legacy weapons?";
SetHeader(sHeader);
AddChoice("Purchase", 1);
AddChoice("Research", 2);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WOL_RESEARCH)
{
string sHeader = "Select a Weapon of Legacy to research:";
SetHeader(sHeader);
AddLegacies(oPC, TRUE);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WOL_RESEARCH_2)
{
int nWoL = GetLocalInt(oPC, "WoLToResearch");
string sName;
string sHeader;
int nNameID = StringToInt(Get2DACache("wol_items", "Name", nWoL));
int nDescID = StringToInt(Get2DACache("wol_items", "Description", nWoL));
if(nNameID != 0)
sName = GetStringByStrRef(nNameID);
else
sName = Get2DACache("wol_items", "Label", nWoL);
sHeader = "You have selected: "+sName+"\n";
sHeader += GetStringByStrRef(nDescID);
SetHeader(sHeader);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WOL_PURCHASE)
{
string sHeader = "Select a Weapon of Legacy to purchase. You can only ever have one legacy:";
SetHeader(sHeader);
AddLegacies(oPC);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WOL_RITUALS)
{
string sHeader = "Select a Legacy Ritual to Perform";
SetHeader(sHeader);
AddRitualCost(oPC);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WOL_CONFIRM)
{
int nWoL = GetLocalInt(oPC, "WoLToBuy");
string sName;
string sHeader;
int nNameID = StringToInt(Get2DACache("wol_items", "Name", nWoL));
int nDescID = StringToInt(Get2DACache("wol_items", "Description", nWoL));
if(nNameID != 0)
sName = GetStringByStrRef(nNameID);
else
sName = Get2DACache("wol_items", "Label", nWoL);
sHeader = "You have selected: "+sName+"\n";
sHeader += GetStringByStrRef(nDescID)+"\n";
sHeader += "\nAre you sure you want this weapon of legacy?";
SetHeader(sHeader);
AddChoice("Yes", TRUE);
AddChoice("No", FALSE);
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_LA_BUYOFF)
{
string sHeader = "Do you wish to buyoff a point of LA? It will cost "+IntToString(GetBuyoffCost(oPC))+" XP";
SetHeader(sHeader);
AddChoice("Yes", TRUE);
AddChoice("No", FALSE);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_ENCOUNTER_AREAS)
{
string sHeader = "Please choose which encounter area to travel to. The encounter level given is the expected level of PC to travel there.";
SetHeader(sHeader);
AddChoice("Basin of Deadly Dust (EL 4)", 10);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_ENCOUNTER_CONFIRM)
{
// Yes, there's an offset
int nEA = GetLocalInt(oPC, "EncounterChoice") - 10;
string sHeader;
int nNameID = StringToInt(Get2DACache("encounter_areas", "Name", nEA));
int nDescID = StringToInt(Get2DACache("encounter_areas", "Description", nEA));
string sName = GetStringByStrRef(nNameID);
sHeader = "You have selected: "+sName+"\n";
sHeader += GetStringByStrRef(nDescID)+"\n";
sHeader += "\nAre you sure you want to travel to this encounter area?";
SetHeader(sHeader);
AddChoice("Yes", TRUE);
AddChoice("No", FALSE);
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_TEMPLATE)
{
string sHeader = "Select a template to gain:";
SetHeader(sHeader);
AddTemplates(0, PRCGetFileEnd("templates"), oPC);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_TEMPLATE_HALF_DRAGON)
{
int nTemplateID = GetLocalInt(oPC, "TemplateIDToGain");
string sName;
string sHeader;
int nNameID = StringToInt(Get2DACache("templates", "Name", nTemplateID));
int nDescID = StringToInt(Get2DACache("templates", "Description", nTemplateID));
if(nNameID != 0)
sName = GetStringByStrRef(nNameID);
else
sName = Get2DACache("templates", "Label", nTemplateID);
if(((StringToInt(Get2DACache("templates", "Type", nTemplateID)) & 1) && GetHitDice(oPC) > 1)
|| !ApplyTemplateToObject(nTemplateID, oPC, FALSE))
{
sHeader = GetStringByStrRef(nDescID)+"\n";
SetHeader(sHeader);
AddChoice("Back", FALSE);
}
else
{
sHeader = GetStringByStrRef(nDescID)+"\n\n";
sHeader += "Select your draconic heritage:";
SetHeader(sHeader);
int i;
for(i = 1; i < 38; i++)
{
AddChoice(GetStringByStrRef(GetStrRefForTemplate(i)), i, oPC);
}
MarkStageSetUp(STAGE_TEMPLATE_HALF_DRAGON, 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_TEMPLATE_HALF_DRAGON_CONFIRM)
{
int nDragID = GetLocalInt(oPC, "PRC_HalfDragon_Choice");
string sName = GetStringByStrRef(GetStrRefForTemplate(nDragID));
string sText = "You have selected " + sName + " template.\n\n";
sText += GetStringByStrRef(GetStrRefForTemplate(nDragID)+1) + "\n\n";
sText += "Is this correct?";
SetHeader(sText);
AddChoice(GetStringByStrRef(4752), TRUE); // "Yes"
AddChoice(GetStringByStrRef(4753), FALSE); // "No"
MarkStageSetUp(STAGE_TEMPLATE_HALF_DRAGON_CONFIRM, oPC);
}
else if (nStage == STAGE_TEMPLATE_CONFIRM)
{
int nTemplateID = GetLocalInt(oPC, "TemplateIDToGain");
string sName;
string sHeader;
int nNameID = StringToInt(Get2DACache("templates", "Name", nTemplateID));
int nDescID = StringToInt(Get2DACache("templates", "Description", nTemplateID));
if(nNameID != 0)
sName = GetStringByStrRef(nNameID);
else
sName = Get2DACache("templates", "Label", nTemplateID);
if(((StringToInt(Get2DACache("templates", "Type", nTemplateID)) & 1) && GetHitDice(oPC) > 1)
|| !ApplyTemplateToObject(nTemplateID, oPC, FALSE))
{
sHeader = GetStringByStrRef(nDescID)+"\n";
SetHeader(sHeader);
AddChoice("Back", FALSE);
}
else
{
sHeader = "You have selected: "+sName+"\n";
sHeader += GetStringByStrRef(nDescID)+"\n";
sHeader += "\nAre you sure you want this template?";
SetHeader(sHeader);
AddChoice("Yes", TRUE);
AddChoice("No", FALSE);
}
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_MISC_OPTIONS)
{
SetHeader("You can setup various options for PRC spells and abilities here:");
if(GetHasFeat(FEAT_WILD_SHAPE, oPC))
AddChoice(GetStringByStrRef(504), 1);//Wild Shape
if(GetHasFeat(FEAT_ELEMENTAL_SHAPE, oPC))
AddChoice(GetStringByStrRef(505), 2);//Elemental Shape
if(GetHasFeat(FEAT_EPIC_WILD_SHAPE_DRAGON, oPC))
AddChoice(GetStringByStrRef(8667), 3);//Dragon Shape
if(GetHasFeat(FEAT_ABERRANT_WILD_SHAPE, oPC))
AddChoice(GetStringByStrRef(16790272), 4);//Aberration Wild Shape
//AddChoice("Spell options.", 5);
//AddChoice("PnP familiar/animal compnion.", 6);
//PW Security System by FunkySwerve
if(GetPCPublicCDKey(oPC)!="" && GetPRCSwitch(PRC_PW_SECURITY_CD_CHECK))//only in multiplayer mode
{
if(GetCanAddNewKey(oPC))
{
AddChoice("PW - add new CD Key", 100);
}
}
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WILDSHAPE_SLOTS)
{
SetHeader("You attune yourself to nature, recallling animal forms.");
AddChoice(GetStringByStrRef(8178), 401);//Brown Bear
AddChoice(GetStringByStrRef(8179), 402);//Wolf
AddChoice(GetStringByStrRef(8180), 403);//Panther
AddChoice(GetStringByStrRef(8181), 404);//Boar
AddChoice(GetStringByStrRef(8182), 405);//Badger
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WILDSHAPE_SHAPE)
{
SetHeader("Assign which shape to this form?");
SetLocalInt(oPC, "DynConv_Waiting", TRUE);
AddShapes(0, 500/*PRCGetFileEnd("prc_polymorph")*/, oPC, TYPE_WILD_SHAPE);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_ELEMENTALSHAPE_SLOTS)
{
SetHeader("You attune yourself to nature, recallling elemental forms.");
AddChoice(GetStringByStrRef(8174), 397);//Fire
AddChoice(GetStringByStrRef(8175), 398);//Water
AddChoice(GetStringByStrRef(8176), 399);//Earth
AddChoice(GetStringByStrRef(8177), 400);//Air
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_ELEMENTALSHAPE_SHAPE)
{
SetHeader("Assign which shape to this form?");
SetLocalInt(oPC, "DynConv_Waiting", TRUE);
AddShapes(0, 500/*PRCGetFileEnd("prc_polymorph")*/, oPC, TYPE_ELEMENTAL_SHAPE);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_DRAGONSHAPE_SLOTS)
{
SetHeader("You attune yourself to nature, recallling dragon forms.");
AddChoice(GetStringByStrRef(12491), 707);//Red
AddChoice(GetStringByStrRef(12467), 708);//Blue
AddChoice(GetStringByStrRef(12487), 709);//Green
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_DRAGONSHAPE_SHAPE)
{
SetHeader("Assign which shape to this form?");
SetLocalInt(oPC, "DynConv_Waiting", TRUE);
AddShapes(0, 500/*PRCGetFileEnd("prc_polymorph")*/, oPC, TYPE_DRAGON_SHAPE);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_ABERRANT_SLOTS)
{
SetHeader("You attune yourself to nature, recallling animal forms.");
AddChoice(GetStringByStrRef(8178), 401);//Brown Bear
AddChoice(GetStringByStrRef(8179), 402);//Wolf
AddChoice(GetStringByStrRef(8180), 403);//Panther
AddChoice(GetStringByStrRef(8181), 404);//Boar
AddChoice(GetStringByStrRef(8182), 405);//Badger
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_ABERRANT_SHAPE)
{
SetHeader("Assign which shape to this form?");
SetLocalInt(oPC, "DynConv_Waiting", TRUE);
AddShapes(0, 500/*PRCGetFileEnd("prc_polymorph")*/, oPC, TYPE_ABERRANT_SHAPE);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_PLANTSHAPE_SLOTS)
{
SetHeader("You attune yourself to nature, recallling plant forms.");
AddChoice(GetStringByStrRef(16793773), 3642); //:: Treant
AddChoice(GetStringByStrRef(16793774), 3643); //:: Shambling Mound
AddChoice(GetStringByStrRef(16793775), 3644); //:: Twig Blight
AddChoice(GetStringByStrRef(16793776), 3645); //:: Myconid
AddChoice(GetStringByStrRef(16793777), 3646); //:: Algoid
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_PLANTSHAPE_SHAPE)
{
SetHeader("Assign which shape to this form?");
SetLocalInt(oPC, "DynConv_Waiting", TRUE);
AddShapes(0, 500/*PRCGetFileEnd("prc_polymorph")*/, oPC, TYPE_PLANT_SHAPE);
SetDefaultTokens();
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_PNP_FAMILIAR_COMPANION)
{
string sHeader = "This will remove all information about your pnp familiars.";
SetHeader(sHeader);
AddChoice("Dismiss familiar.", 1);
AddChoice("Dismiss animal companion.", 2);
AddChoice("Dismiss shaman's animal companion.", 3);
AddChoice("Dismiss ultimate ranger's animal companion.", 4);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_CDKEY_ADD)
{
string sHeader = "With this option you can add new CD Key to your account (max 7 keys allowed). After selecting OK please logout, swap to the new key and login again.";
SetHeader(sHeader);
AddChoice("OK", 1);
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WIELDING)
{
string sHeader = "With this option you can change the how you wield certain melee weapons.";
SetHeader(sHeader);
int bShield = GetIsShield(oWeaponL);
int bTorch = (GetBaseItemType(oWeaponL) == BASE_ITEM_TORCH);
int bUnarmed = (oWeaponR == OBJECT_INVALID);
int bOneHand = (!bUnarmed && oWeaponL == OBJECT_INVALID);
int bMonkey = GetHasFeat(FEAT_MONKEY_GRIP);
int bPowerful = GetHasFeat(FEAT_RACE_POWERFUL_BUILD);
int bTwoHand = GetIsTwoHandedMeleeWeapon(oWeaponR);
int bDouble = GetIsDoubleSidedWeapon(oWeaponR);
int bPolearm = (GetBaseItemType(oWeaponR) == BASE_ITEM_HALBERD ||
GetBaseItemType(oWeaponR) == BASE_ITEM_QUARTERSTAFF ||
GetBaseItemType(oWeaponR) == BASE_ITEM_SHORTSPEAR ||
GetBaseItemType(oWeaponR) == BASE_ITEM_MAGICSTAFF);
int iSize = PRCGetCreatureSize(oPC);
int iWeaponSize = GetWeaponSize(oWeaponR);
if (iSize == CREATURE_SIZE_TINY)
{
int bAdded1H = FALSE;
if (iWeaponSize == 1 && !bShield && !bTorch)
{
AddChoice("Wield tiny weapon one-handed.", 1);
AddChoice("Wield tiny weapon two-handed.", 2);
bAdded1H = TRUE;
}
else if (iWeaponSize == 1 && (bShield || bTorch))
{
AddChoice("Wield tiny weapon one-handed.", 1);
bAdded1H = TRUE;
}
if (iWeaponSize == 2 && (bMonkey || bPowerful))
{
AddChoice("Wield small weapon one-handed.", 1);
AddChoice("Wield small weapon two-handed.", 2);
bAdded1H = TRUE;
}
else if (iWeaponSize == 2 && !bMonkey && !bPowerful && !bShield && !bTorch)
{
AddChoice("Wield small weapon two-handed.", 2);
bAdded1H = TRUE;
}
}
else if (iSize == CREATURE_SIZE_SMALL)
{
int bAdded1H = FALSE;
if (!bShield && !bTorch && bTwoHand && !bPolearm)
{
AddChoice("Wield a large weapon two-handed.", 2);
}
else if (!bShield && !bTorch && bTwoHand && bPolearm)
{
AddChoice("Wield a polearm two-handed.", 2);
}
if (iWeaponSize == 1 && !bShield && !bTorch)
{
AddChoice("Wield tiny weapon one-handed.", 1);
AddChoice("Wield tiny weapon two-handed.", 2);
bAdded1H = TRUE;
}
else if (iWeaponSize == 1 && (bShield || bTorch))
{
AddChoice("Wield tiny weapon one-handed.", 1);
bAdded1H = TRUE;
}
if (iWeaponSize == 2 && (bShield || bTorch))
{
AddChoice("Wield small weapon one-handed.", 1);
bAdded1H = TRUE;
}
else if (iWeaponSize == 2 && !bShield && !bTorch)
{
AddChoice("Wield small weapon one-handed.", 1);
AddChoice("Wield small weapon two-handed.", 2);
bAdded1H = TRUE;
}
if (iWeaponSize == 3 && !bShield && !bTorch && !bMonkey && !bPowerful)
{
AddChoice("Wield medium weapon two-handed.", 2);
}
else if (iWeaponSize == 3 && !bShield && !bTorch && (bMonkey || bPowerful))
{
AddChoice("Wield medium weapon one-handed.", 1);
AddChoice("Wield medium weapon two-handed.", 2);
}
else if (iWeaponSize == 3 && (bMonkey || bPowerful) && (bShield && bTorch))
{
AddChoice("Wield medium weapon one-handed.", 1);
}
}
else if (iSize == CREATURE_SIZE_MEDIUM)
{
int bAdded1H = FALSE;
if (bDouble && !bShield && !bTorch && (!bMonkey || !bPowerful))
{
AddChoice("Wield a double-sided weapon two-handed.", 3);
}
else if (bDouble && !bShield && !bTorch && (bMonkey || bPowerful))
{
AddChoice("Wield a double-sided weapon one-handed.", 1);
AddChoice("Wield a double-sided weapon two-handed.", 3);
bAdded1H = TRUE;
}
else if (bDouble && (bMonkey || bPowerful) && (bShield || bTorch))
{
AddChoice("Wield a double-sided weapon one-handed.", 1);
bAdded1H = TRUE;
}
if (!bTwoHand && !bPolearm && !bDouble && (bShield || bTorch))
{
AddChoice("Wield a small or medium weapon one-handed.", 1);
bAdded1H = TRUE;
}
else if (!bTwoHand && !bPolearm && !bDouble && (bMonkey || bPowerful) && (!bShield || !bTorch))
{
AddChoice("Wield a small or medium weapon one-handed.", 1);
AddChoice("Wield a small or medium weapon two-handed.", 2);
bAdded1H = TRUE;
}
if (bTwoHand && !bDouble && !bPolearm && !bDouble && (bMonkey || bPowerful) && (bShield || bTorch))
{
AddChoice("Wield a large weapon one-handed.", 1);
}
else if (bTwoHand && !bDouble && bPolearm && !bDouble && (bMonkey || bPowerful) && (bShield || bTorch))
{
AddChoice("Wield a polearm one-handed.", 1);
}
if (!bShield && !bTorch && !bDouble && bTwoHand && !bPolearm && (bMonkey || bPowerful))
{
AddChoice("Wield a large weapon one-handed.", 1);
AddChoice("Wield a large weapon two-handed.", 2);
}
if (!bShield && !bTorch && bTwoHand && !bMonkey && !bPowerful && !bPolearm && !bDouble)
{
AddChoice("Wield a large weapon two-handed.", 2);
}
if (!bShield && !bTorch && bPolearm && !bDouble && (bMonkey || bPowerful))
{
AddChoice("Wield a polearm one-handed.", 1);
AddChoice("Wield a polearm two-handed.", 3);
}
else if (bShield && bTorch && bPolearm && !bDouble && (bMonkey || bPowerful))
{
AddChoice("Wield a polearm one-handed.", 1);
}
if (!bShield && !bTorch && bPolearm && !bDouble && !bMonkey && !bPowerful)
{
AddChoice("Wield a polearm two-handed.", 3);
}
if (!bAdded1H && !bShield && !bTorch && !bPolearm && !bDouble && !bTwoHand)
{
AddChoice("Wield a small or medium weapon one-handed.", 1);
}
}
else if (iSize == CREATURE_SIZE_LARGE)
{
int bAdded1H = FALSE;
if (bDouble && bOneHand && !bShield && !bTorch )
{
AddChoice("Wield a double-sided weapon one-handed.", 1);
AddChoice("Wield a double-sided weapon two-handed.", 3);
}
else if (bDouble && (!bOneHand || bShield || bTorch))
{
AddChoice("Wield a double-sided weapon one-handed.", 1);
}
if (bTwoHand && !bPolearm && bOneHand && !bShield && !bTorch )
{
AddChoice("Wield a large weapon one-handed.", 1);
AddChoice("Wield a large weapon two-handed.", 2);
}
else if (bTwoHand && !bPolearm && (!bOneHand || bShield || bTorch))
{
AddChoice("Wield a large weapon one-handed.", 1);
}
if (bPolearm && bOneHand && !bShield && !bTorch )
{
AddChoice("Wield a polearm one-handed.", 1);
AddChoice("Wield a polearm two-handed.", 3);
}
else if (bPolearm && (!bOneHand || bShield || bTorch))
{
AddChoice("Wield a polearm one-handed.", 1);
}
if((iWeaponSize == 3) && bOneHand && !bShield && !bTorch )
{
AddChoice("Wield a medium weapon one-handed.", 1);
AddChoice("Wield a medium weapon two-handed.", 2);
}
else if(iWeaponSize == 3 && (!bOneHand || bShield || bTorch))
{
AddChoice("Wield a medium weapon one-handed.", 1);
}
else if(iWeaponSize == 2)
{
AddChoice("Wield a small weapon one-handed.", 1);
}
}
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WIELDING_ONE)
{
string sHeader = "One handed attack animations set.";
SetHeader(sHeader);
ReplaceObjectAnimation(oPC, "1hreadyr", "");
ReplaceObjectAnimation(oPC, "1hreadyl", "");
ReplaceObjectAnimation(oPC, "1hslashl", "");
ReplaceObjectAnimation(oPC, "1hslashr", "");
ReplaceObjectAnimation(oPC, "1hstab", "");
ReplaceObjectAnimation(oPC, "1hcloseh", "");
ReplaceObjectAnimation(oPC, "1hclosel", "");
ReplaceObjectAnimation(oPC, "1hreach", "");
ReplaceObjectAnimation(oPC, "1hparryl", "");
ReplaceObjectAnimation(oPC, "1hparryr", "");
ReplaceObjectAnimation(oPC, "1hslasho", "");
ReplaceObjectAnimation(oPC, "2hreadyr", "1hreadyr");
ReplaceObjectAnimation(oPC, "2hreadyl", "1hreadyl");
ReplaceObjectAnimation(oPC, "2hslashl", "1hslashl");
ReplaceObjectAnimation(oPC, "2hslashr", "1hslashr");
ReplaceObjectAnimation(oPC, "2hstab", "1hstab");
ReplaceObjectAnimation(oPC, "2hcloseh", "1hcloseh");
ReplaceObjectAnimation(oPC, "2hclosel", "1hclosel");
ReplaceObjectAnimation(oPC, "2hreach", "1hreach");
ReplaceObjectAnimation(oPC, "2hparryl", "1hparryl");
ReplaceObjectAnimation(oPC, "2hparryr", "1hparryr");
ReplaceObjectAnimation(oPC, "2hslasho", "1hslasho");
ReplaceObjectAnimation(oPC, "plreadyr", "1hreadyr");
ReplaceObjectAnimation(oPC, "plreadyl", "1hreadyl");
ReplaceObjectAnimation(oPC, "plslashl", "1hslashl");
ReplaceObjectAnimation(oPC, "plslashr", "1hslashr");
ReplaceObjectAnimation(oPC, "plstab", "1hstab");
ReplaceObjectAnimation(oPC, "plcloseh", "1hcloseh");
ReplaceObjectAnimation(oPC, "plclosel", "1hclosel");
ReplaceObjectAnimation(oPC, "plreach", "1hreach");
ReplaceObjectAnimation(oPC, "plparryl", "1hparryl");
ReplaceObjectAnimation(oPC, "plparryr", "1hparryr");
ReplaceObjectAnimation(oPC, "plslasho", "1hslasho");
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WIELDING_TWO)
{
string sHeader = "Two-handed attack animations set.";
SetHeader(sHeader);
ReplaceObjectAnimation(oPC, "1hreadyr", "2hreadyr");
ReplaceObjectAnimation(oPC, "1hreadyl", "2hreadyl");
ReplaceObjectAnimation(oPC, "1hslashl", "2hslashl");
ReplaceObjectAnimation(oPC, "1hslashr", "2hslashr");
ReplaceObjectAnimation(oPC, "1hstab", "2hstab");
ReplaceObjectAnimation(oPC, "1hcloseh", "2hcloseh");
ReplaceObjectAnimation(oPC, "1hclosel", "2hclosel");
ReplaceObjectAnimation(oPC, "1hreach", "2hreach");
ReplaceObjectAnimation(oPC, "1hparryl", "2hparryl");
ReplaceObjectAnimation(oPC, "1hparryr", "2hparryr");
ReplaceObjectAnimation(oPC, "1hslasho", "2hslasho");
ReplaceObjectAnimation(oPC, "2hreadyr", "");
ReplaceObjectAnimation(oPC, "2hreadyl", "");
ReplaceObjectAnimation(oPC, "2hslashl", "");
ReplaceObjectAnimation(oPC, "2hslashr", "");
ReplaceObjectAnimation(oPC, "2hstab", "");
ReplaceObjectAnimation(oPC, "2hcloseh", "");
ReplaceObjectAnimation(oPC, "2hclosel", "");
ReplaceObjectAnimation(oPC, "2hreach", "");
ReplaceObjectAnimation(oPC, "2hparryl", "");
ReplaceObjectAnimation(oPC, "2hparryr", "");
ReplaceObjectAnimation(oPC, "2hslasho", "");
ReplaceObjectAnimation(oPC, "plreadyr", "");
ReplaceObjectAnimation(oPC, "plreadyl", "");
ReplaceObjectAnimation(oPC, "plslashl", "");
ReplaceObjectAnimation(oPC, "plslashr", "");
ReplaceObjectAnimation(oPC, "plstab", "");
ReplaceObjectAnimation(oPC, "plcloseh", "");
ReplaceObjectAnimation(oPC, "plclosel", "");
ReplaceObjectAnimation(oPC, "plreach", "");
ReplaceObjectAnimation(oPC, "plparryl", "");
ReplaceObjectAnimation(oPC, "plparryr", "");
ReplaceObjectAnimation(oPC, "plslasho", "");
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if (nStage == STAGE_WIELDING_POLEARM)
{
string sHeader = "Polearm attack animations set.";
SetHeader(sHeader);
ReplaceObjectAnimation(oPC, "plreadyr", "");
ReplaceObjectAnimation(oPC, "plreadyl", "");
ReplaceObjectAnimation(oPC, "plslashl", "");
ReplaceObjectAnimation(oPC, "plslashr", "");
ReplaceObjectAnimation(oPC, "plstab", "");
ReplaceObjectAnimation(oPC, "plcloseh", "");
ReplaceObjectAnimation(oPC, "plclosel", "");
ReplaceObjectAnimation(oPC, "plreach", "");
ReplaceObjectAnimation(oPC, "plparryl", "");
ReplaceObjectAnimation(oPC, "plparryr", "");
ReplaceObjectAnimation(oPC, "plslasho", "");
AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
else if(nStage == STAGE_HATHRAN_COHORT)
{
SetHeader("Select your Hathran cohort type:");
AddChoice("Barbarian", 0);
AddChoice("Ethran", 1);
AddChoice("Back", STAGE_ENTRY);
MarkStageSetUp(nStage, oPC);
SetDefaultTokens();
}
}
// Do token setup
SetupTokens();
}
else if(nValue == DYNCONV_EXITED)
{
//end of conversation cleanup
array_delete(oPC, "StagesSetup");
DeleteLocalString(oPC, "VariableName");
DeleteLocalInt(oPC, "CohortID");
DeleteLocalInt(oPC, "CustomCohortRace");
DeleteLocalInt(oPC, "CustomCohortClass");
DeleteLocalInt(oPC, "CustomCohortMoral");
DeleteLocalInt(oPC, "CustomCohortOrder");
DeleteLocalInt(oPC, "CustomCohortGender");
DeleteLocalInt(oPC, "TemplateIDToGain");
DeleteLocalInt(oPC, "WildShapeSlot");
DeleteLocalInt(oPC, "PRC_HalfDragon_Choice");
DeleteLocalInt(oPC, "EncounterChoice");
}
else if(nValue == DYNCONV_ABORTED)
{
//abort conversation cleanup
array_delete(oPC, "StagesSetup");
DeleteLocalString(oPC, "VariableName");
DeleteLocalInt(oPC, "CohortID");
DeleteLocalInt(oPC, "CustomCohortRace");
DeleteLocalInt(oPC, "CustomCohortClass");
DeleteLocalInt(oPC, "CustomCohortMoral");
DeleteLocalInt(oPC, "CustomCohortOrder");
DeleteLocalInt(oPC, "CustomCohortGender");
DeleteLocalInt(oPC, "TemplateIDToGain");
DeleteLocalInt(oPC, "WildShapeSlot");
DeleteLocalInt(oPC, "PRC_HalfDragon_Choice");
DeleteLocalInt(oPC, "EncounterChoice");
}
else
{
// PC response handling
int nChoice = GetChoice(oPC);
if(nStage == STAGE_ENTRY)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_ENTRY;
else if(nChoice == 1)
nStage = STAGE_SWITCHES;
else if(nChoice == 2)
nStage = STAGE_EPIC_SPELLS;
else if(nChoice == 3)
nStage = STAGE_SHOPS;
else if(nChoice == 4)
{
AssignCommand(oPC, TryToIDItems(oPC));
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else if(nChoice == 5)
nStage = STAGE_TEFLAMMAR_SHADOWLORD;
else if(nChoice == 6)
{
// Redirect to confirmation stage
nStage = STAGE_REGISTER_CONFIRM;
MarkStageNotSetUp(nStage, oPC);
}
/* else if(nChoice == 6)
{
RegisterAsCohort(oPC);
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
} */
else if(nChoice == 7)
nStage = STAGE_LEADERSHIP;
else if(nChoice == 8)
nStage = STAGE_NATURAL_WEAPON;
else if(nChoice == 9)
nStage = STAGE_TEMPLATE;
else if(nChoice == 35)
nStage = STAGE_WOL_HEADER;
else if(nChoice == 41)
nStage = STAGE_LA_BUYOFF;
else if(nChoice == 42)
nStage = STAGE_ENCOUNTER_AREAS;
else if(nChoice == 52)
nStage = STAGE_WIELDING;
else if(nChoice == 10)
nStage = STAGE_APPEARANCE;
else if(nChoice == 11)
nStage = STAGE_MISC_OPTIONS;
else if(nChoice == 12)
{
DelayCommand(1.0, ExecuteScript("prc_wipeNSB", oPC));
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else if(nChoice == 56)
nStage = STAGE_HATHRAN_COHORT;
// Mark the target stage to need building if it was changed (ie, selection was other than ID all)
if(nStage != STAGE_ENTRY)
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_REGISTER_CONFIRM)
{
if(nChoice == 1) // Yes
{
RegisterAsCohort(oPC);
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else if(nChoice == CHOICE_RETURN_TO_PREVIOUS) // No
{
nStage = STAGE_ENTRY;
}
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_SWITCHES)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_ENTRY;
else if(nChoice == CHOICE_SWITCHES_USE_2DA)
{
object oModule = GetModule();
int i = 0;
string sSwitchName, sSwitchType, sSwitchValue;
// Use Get2DAString() instead of Get2DACache() to avoid caching.
// People might want to set different switch values when playing in different modules.
// Or just change the switch values midplay.
while((sSwitchName = Get2DAString("personal_switch", "SwitchName", i)) != "")
{
// Read rest of the line
sSwitchType = Get2DAString("personal_switch", "SwitchType", i);
sSwitchValue = Get2DAString("personal_switch", "SwitchValue", i);
// Determine switch type and set the var
if(sSwitchType == "float")
SetLocalFloat(oModule, sSwitchName, StringToFloat(sSwitchValue));
else if(sSwitchType == "int")
SetPRCSwitch(sSwitchName, StringToInt(sSwitchValue));
else if(sSwitchType == "string")
SetLocalString(oModule, sSwitchName, sSwitchValue);
// Increment loop counter
i += 1;
}
}
else
{
//move to another stage based on response
SetLocalString(oPC, "VariableName", GetChoiceText(oPC));
nStage = STAGE_SWITCHES_VALUE;
}
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_SWITCHES_VALUE)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
{
nStage = STAGE_SWITCHES;
}
else
{
string sVarName = GetLocalString(oPC, "VariableName");
SetPRCSwitch(sVarName, GetPRCSwitch(sVarName) + nChoice);
}
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_EPIC_SPELLS)
{
int nOldStage = nStage;
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_ENTRY;
else if (nChoice == 1)
nStage = STAGE_EPIC_SPELLS_REMOVE;
else if (nChoice == 2)
nStage = STAGE_EPIC_SPELLS_ADD;
else if (nChoice == 3)
nStage = STAGE_EPIC_SPELLS_CONTING;
else if (nChoice == 4)
{
//research an epic spell
object oPlaceable = CreateObject(OBJECT_TYPE_PLACEABLE, "prc_ess_research", GetLocation(oPC));
if(!GetIsObjectValid(oPlaceable))
DoDebug("Research placeable not valid.");
AssignCommand(oPC, ClearAllActions());
AssignCommand(oPC, DoPlaceableObjectAction(oPlaceable, PLACEABLE_ACTION_USE));
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oPlaceable);
DestroyObject(oPlaceable, 60.0);
//end the conversation
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else if (nChoice == 5)
{
int i;
for(i = 0; i < 71; i++)
{
if(GetHasEpicSpellKnown(i, oPC))
{
SendMessageToPC(oPC, GetNameForSpell(i)+" is known.");
}
}
}
else if (nChoice == 6)
{
int i;
for(i = 0; i < 28; i++)
{
if(GetHasEpicSeedKnown(i, oPC))
{
SendMessageToPC(oPC, GetNameForSeed(i)+" is known.");
}
}
}
if(nOldStage != nStage)
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_EPIC_SPELLS_ADD)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_EPIC_SPELLS;
else
{
GiveFeat(oPC, StringToInt(Get2DACache("epicspells", "SpellFeatIPID", nChoice)));
ClearCurrentStage();
}
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_EPIC_SPELLS_REMOVE)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_EPIC_SPELLS;
else
{
TakeFeat(oPC, StringToInt(Get2DACache("epicspells", "SpellFeatIPID", nChoice)));
ClearCurrentStage();
}
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_EPIC_SPELLS_CONTING)
{
//contingencies
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_EPIC_SPELLS;
else if(nChoice == 1) //contingent resurrection
SetLocalInt(oPC, "nContingentRez", 0);
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_SHOPS)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_ENTRY;
else if (nChoice == 1)
{
//Magic item raw materials
object oStore = GetObjectByTag("prc_magiccraft");
if(!GetIsObjectValid(oStore))
{
location lLimbo = GetLocation(GetObjectByTag("HEARTOFCHAOS"));
oStore = CreateObject(OBJECT_TYPE_STORE, "prc_magiccraft", lLimbo);
}
DelayCommand(1.0, OpenStore(oStore, oPC));
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else if (nChoice == 2)
{
OpenShop("prc_materialcomp");
}
else if (nChoice == 3)
{
nStage = STAGE_SPELL_SHOPS;
}
else if (nChoice == 4)
{
//Epic spell books
object oStore = GetObjectByTag("prc_epicspells");
if(!GetIsObjectValid(oStore))
{
location lLimbo = GetLocation(GetObjectByTag("HEARTOFCHAOS"));
oStore = CreateObject(OBJECT_TYPE_STORE, "prc_epicspells", lLimbo);
}
DelayCommand(1.0, OpenStore(oStore, oPC));
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
//MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_SPELL_SHOPS) {
if (nChoice == CHOICE_RETURN_TO_PREVIOUS) {
nStage = STAGE_SHOPS;
} else if (nChoice > 0) {
nStage = STAGE_SPELL_SHOPS_LEVEL_FILTER;
} else if (nChoice == -1) {
OpenShop("prc_scrolls");
} else if (nChoice == -2) { // adding class filter for spells
nStage = STAGE_SPELL_SHOPS_CLASS_FILTER;
} else if (nChoice == -3) { // adding other spell filters
nStage = STAGE_SPELL_SHOPS_ALPHABETICAL_FILTER;
//nStage = STAGE_SPELL_SHOPS_OTHER_FILTER;
}
}
else if (nStage == STAGE_SPELL_SHOPS_CLASS_FILTER) {
SetLocalInt(oPC, "SpellShopClassFilter", nChoice);
SetLocalString(oPC, "SpellShopClassFilterName", GetChoiceText());
nStage = STAGE_SPELL_SHOPS_LEVEL_FILTER;
}
else if (nStage == STAGE_SPELL_SHOPS_LEVEL_FILTER) {
string shopName = "prcSS_C" + IntToString(GetLocalInt(oPC, "SpellShopClassFilter"));
if (nChoice != -1) {
shopName = shopName + "L" + IntToString(nChoice);
}
OpenShop(shopName);
}
else if (nStage == STAGE_SPELL_SHOPS_ALPHABETICAL_FILTER) {
string shopName = "prcSS_alpha_" + GetChoiceText(oPC);
OpenShop(shopName);
}
else if(nStage == STAGE_TEFLAMMAR_SHADOWLORD)
{
nStage = STAGE_ENTRY;
if(nChoice == 1)
{
AssignCommand(oPC, ClearAllActions());
AssignCommand(oPC, TakeGoldFromCreature(10000, oPC, TRUE));
//use a persistant local instead of an item
//CreateItemOnObject("shadowwalkerstok", oPC);
SetPersistantLocalInt(oPC, "shadowwalkerstok", TRUE);
SetLocalInt(oPC, "PRC_PrereqTelflam", 0);
}
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP)
{
if(nChoice == 1)
nStage = STAGE_LEADERSHIP_ADD_STANDARD;
else if(nChoice == 2)
nStage = STAGE_LEADERSHIP_REMOVE;
else if(nChoice == 3)
nStage = STAGE_LEADERSHIP_DELETE;
else if(nChoice == 4)
nStage = STAGE_LEADERSHIP_ADD_CUSTOM_RACE;
else if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_REMOVE)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
{
}
else
{
int nCohortID = GetLocalInt(oPC, "CohortID");
RemoveCohortFromPlayer(GetCohort(nCohortID, oPC), oPC);
}
nStage = STAGE_LEADERSHIP;
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_STANDARD)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_LEADERSHIP;
else
{
SetLocalInt(oPC, "CohortID", nChoice);
nStage = STAGE_LEADERSHIP_ADD_STANDARD_CONFIRM;
}
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_STANDARD_CONFIRM)
{
if(nChoice == 1)
{
int nCohortID = GetLocalInt(oPC, "CohortID");
AddCohortToPlayer(nCohortID, oPC);
//mark the player as having recruited for the day
SetLocalInt(oPC, "CohortRecruited", TRUE);
nStage = STAGE_LEADERSHIP;
}
else if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_LEADERSHIP_ADD_STANDARD;
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_CUSTOM_RACE)
{
SetLocalInt(oPC, "CustomCohortRace", nChoice);
nStage = STAGE_LEADERSHIP_ADD_CUSTOM_GENDER;
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_CUSTOM_GENDER)
{
SetLocalInt(oPC, "CustomCohortGender", nChoice);
nStage = STAGE_LEADERSHIP_ADD_CUSTOM_CLASS;
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_CUSTOM_CLASS)
{
SetLocalInt(oPC, "CustomCohortClass", nChoice);
nStage = STAGE_LEADERSHIP_ADD_CUSTOM_ALIGN;
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_CUSTOM_ALIGN)
{
switch(nChoice)
{
case 0: //lawful good
SetLocalInt(OBJECT_SELF, "CustomCohortOrder", 85);
SetLocalInt(OBJECT_SELF, "CustomCohortMoral", 85);
break;
case 1: //neutral good
SetLocalInt(OBJECT_SELF, "CustomCohortOrder", 50);
SetLocalInt(OBJECT_SELF, "CustomCohortMoral", 85);
break;
case 2: //chaotic good
SetLocalInt(OBJECT_SELF, "CustomCohortOrder", 15);
SetLocalInt(OBJECT_SELF, "CustomCohortMoral", 85);
break;
case 3: //lawful neutral
SetLocalInt(OBJECT_SELF, "CustomCohortOrder", 85);
SetLocalInt(OBJECT_SELF, "CustomCohortMoral", 50);
break;
case 4: //true neutral
SetLocalInt(OBJECT_SELF, "CustomCohortOrder", 50);
SetLocalInt(OBJECT_SELF, "CustomCohortMoral", 50);
break;
case 5: //chaotic neutral
SetLocalInt(OBJECT_SELF, "CustomCohortOrder", 15);
SetLocalInt(OBJECT_SELF, "CustomCohortMoral", 50);
break;
case 6: //lawful evil
SetLocalInt(OBJECT_SELF, "CustomCohortOrder", 85);
SetLocalInt(OBJECT_SELF, "CustomCohortMoral", 15);
break;
case 7: //neutral evil
SetLocalInt(OBJECT_SELF, "CustomCohortOrder", 50);
SetLocalInt(OBJECT_SELF, "CustomCohortMoral", 15);
break;
case 8: //chaotic evil
SetLocalInt(OBJECT_SELF, "CustomCohortOrder", 15);
SetLocalInt(OBJECT_SELF, "CustomCohortMoral", 15);
break;
}
nStage = STAGE_LEADERSHIP_ADD_CUSTOM_CONFIRM;
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_ADD_CUSTOM_CONFIRM)
{
if(nChoice == 1)
{
int nRace = GetLocalInt(oPC, "CustomCohortRace");
int nClass= GetLocalInt(oPC, "CustomCohortClass");
int nOrder= GetLocalInt(oPC, "CustomCohortOrder");
int nMoral= GetLocalInt(oPC, "CustomCohortMoral");
int nGender= GetLocalInt(oPC, "CustomCohortGender");
string sResRef = "prc_npc_"+IntToString(nRace)+"_"+IntToString(nClass)+"_"+IntToString(nGender);
location lSpawn = GetLocation(oPC);
object oCohort = CreateObject(OBJECT_TYPE_CREATURE, sResRef, lSpawn, TRUE, COHORT_TAG);
//change alignment
CohortSetAlignment(nMoral, nOrder, oCohort);
DelayCommand(1.0, CohortSetAlignment(nMoral, nOrder, oCohort));
DelayCommand(3.0, CohortSetAlignment(nMoral, nOrder, oCohort));
DelayCommand(5.0, CohortSetAlignment(nMoral, nOrder, oCohort));
//level it up
int i;
//if simple racial HD on, give them racial HD
if(GetPRCSwitch(PRC_XP_USE_SIMPLE_RACIAL_HD))
{
//get the real race
int nRace = GetRacialType(oCohort);
int nRacialHD = StringToInt(Get2DACache("ECL", "RaceHD", nRace));
int nRacialClass = StringToInt(Get2DACache("ECL", "RaceClass", nRace));
for(i=0;i<nRacialHD;i++)
{
LevelUpHenchman(oCohort, nRacialClass, TRUE);
}
}
//give them their levels in their class
int nLevel = GetCohortMaxLevel(GetLeadershipScore(oPC), oPC);
for(i=GetHitDice(oCohort);i<nLevel;i++)
{
LevelUpHenchman(oCohort, CLASS_TYPE_INVALID, TRUE);
}
//add to player
//also does name/portrait/bodypart changes via DoDisguise
DelayCommand(0.01, AddCohortToPlayerByObject(oCohort, oPC));
//mark the player as having recruited for the day
SetLocalInt(oPC, "CohortRecruited", TRUE);
nStage = STAGE_LEADERSHIP;
}
else if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_LEADERSHIP;
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_DELETE)
{
SetLocalInt(oPC, "CohortID", nChoice);
nStage = STAGE_LEADERSHIP_DELETE_CONFIRM;
MarkStageNotSetUp(nStage, oPC);
}
else if(nStage == STAGE_LEADERSHIP_DELETE_CONFIRM)
{
if(nChoice == 1)
{
int nCohortID = GetLocalInt(oPC, "CohortID");
DeleteCohort(nCohortID);
nStage = STAGE_LEADERSHIP;
}
else if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_LEADERSHIP_DELETE;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_NATURAL_WEAPON)
{
/*if(nChoice = -512)
//no primary natural weapon
SetPersistantLocalInt(oPC, "NaturalWeaponPlayerOverride", -1);
else
//specific natural weapon
SetPersistantLocalInt(oPC, "NaturalWeaponPlayerOverride", nChoice);*/
SetPrimaryNaturalWeapon(oPC, nChoice);
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_WOL_HEADER)
{
if(nChoice == 1)
{
if(GetPersistantLocalInt(oPC, "LegacyOwner"))
nStage = STAGE_WOL_RITUALS;
else
nStage = STAGE_WOL_PURCHASE;
}
else if(nChoice == 2)
nStage = STAGE_WOL_RESEARCH;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_WOL_RESEARCH)
{
SetLocalInt(oPC, "WoLToResearch", nChoice);
nStage = STAGE_WOL_RESEARCH_2;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_WOL_RESEARCH_2)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
nStage = STAGE_WOL_RESEARCH;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_WOL_PURCHASE)
{
SetLocalInt(oPC, "WoLToBuy", nChoice);
nStage = STAGE_WOL_CONFIRM;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_WOL_RITUALS)
{
// Cost is always over 999
if(nChoice > 999)
{
// Pay for the item, create it and equip it
TakeGoldFromCreature(nChoice, oPC, TRUE);
UpgradeLegacy(oPC);
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else
{
nStage = STAGE_WOL_CONFIRM;
MarkStageNotSetUp(nStage, oPC);
}
}
else if (nStage == STAGE_WOL_CONFIRM)
{
if(nChoice)
{
int nWoL = GetLocalInt(oPC, "WoLToBuy");
if (!GetPRCSwitch(PRC_DISABLE_WOL_AREA) && Get2DACache("wol_items", "Area", nWoL) != "") JumpToEncounterArea(oPC, nWoL);
else ApplyWoLToObject(nWoL, oPC);
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else
{
nStage = STAGE_WOL_PURCHASE;
MarkStageNotSetUp(nStage, oPC);
}
}
else if (nStage == STAGE_LA_BUYOFF)
{
if(nChoice)
{
BuyoffLevel(oPC);
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else
{
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
}
else if (nStage == STAGE_ENCOUNTER_AREAS)
{
if(nChoice)
{
SetLocalInt(oPC, "EncounterChoice", nChoice);
nStage = STAGE_ENCOUNTER_CONFIRM;
}
else
{
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
}
else if (nStage == STAGE_ENCOUNTER_CONFIRM)
{
if(nChoice)
{
int nEA = GetLocalInt(oPC, "EncounterChoice");
ClearAllActions();
if (nEA == 10)
{
//FloatingTextStringOnCreature("Jumping to the Basin of Deadly Dust", oPC, FALSE);
SetLocalInt(oPC, "BDD_Enter", TRUE);
SetLocalLocation(oPC, "EA_Return", GetLocation(oPC));
CreateArea("bdd_basinrim");
CreateArea("bdd_cave");
CreateArea("bdd_smelter");
DelayCommand(1.5, AssignCommand(oPC, JumpToLocation(GetLocation(GetWaypointByTag("bdd_enter")))));
}
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else
{
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
}
else if (nStage == STAGE_TEMPLATE)
{
SetLocalInt(oPC, "TemplateIDToGain", nChoice);
nStage = nChoice == TEMPLATE_HALF_DRAGON ? STAGE_TEMPLATE_HALF_DRAGON : STAGE_TEMPLATE_CONFIRM;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_TEMPLATE_HALF_DRAGON)
{
if(nChoice)
{
SetLocalInt(oPC, "PRC_HalfDragon_Choice", nChoice);
nStage = STAGE_TEMPLATE_HALF_DRAGON_CONFIRM;
}
else
{
nStage = STAGE_TEMPLATE;
MarkStageNotSetUp(nStage, oPC);
}
}
else if (nStage == STAGE_TEMPLATE_HALF_DRAGON_CONFIRM)
{
if(nChoice == TRUE)
{
int nTemplate = GetLocalInt(oPC, "PRC_HalfDragon_Choice");
ApplyTemplateToObject(TEMPLATE_HALF_DRAGON, oPC);
SetPersistantLocalInt(oPC, "HalfDragon_Template", nTemplate);
DelayCommand(0.01, EvalPRCFeats(oPC));
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else
{
nStage = STAGE_TEMPLATE_HALF_DRAGON;
DeleteLocalInt(oPC, "PRC_HalfDragon_Choice");
MarkStageNotSetUp(nStage, oPC);
MarkStageNotSetUp(STAGE_TEMPLATE_HALF_DRAGON_CONFIRM, oPC);
}
}
else if (nStage == STAGE_TEMPLATE_CONFIRM)
{
if(nChoice)
{
int nTemplateID = GetLocalInt(oPC, "TemplateIDToGain");
ApplyTemplateToObject(nTemplateID, oPC);
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else
{
nStage = STAGE_TEMPLATE;
MarkStageNotSetUp(nStage, oPC);
}
}
else if (nStage == STAGE_MISC_OPTIONS)
{
if(nChoice == 1)
{
nStage = STAGE_WILDSHAPE_SLOTS;
MarkStageNotSetUp(nStage, oPC);
}
else if(nChoice == 2)
{
nStage = STAGE_ELEMENTALSHAPE_SLOTS;
MarkStageNotSetUp(nStage, oPC);
}
else if(nChoice == 3)
{
nStage = STAGE_DRAGONSHAPE_SLOTS;
MarkStageNotSetUp(nStage, oPC);
}
else if(nChoice == 4)
{
nStage = STAGE_ABERRANT_SLOTS;
MarkStageNotSetUp(nStage, oPC);
}
else if(nChoice == 100)
{
nStage = STAGE_CDKEY_ADD;
MarkStageNotSetUp(nStage, oPC);
}
}
else if (nStage == STAGE_WILDSHAPE_SLOTS)
{
SetLocalInt(oPC, "WildShapeSlot", nChoice);
nStage = STAGE_WILDSHAPE_SHAPE;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_WILDSHAPE_SHAPE)
{
int nSlot = GetLocalInt(oPC, "WildShapeSlot");
SetPersistantLocalInt(oPC, PRC_PNP_SHIFTING + IntToString(nSlot), nChoice);
nStage = STAGE_WILDSHAPE_SLOTS;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_ELEMENTALSHAPE_SLOTS)
{
SetLocalInt(oPC, "WildShapeSlot", nChoice);
nStage = STAGE_ELEMENTALSHAPE_SHAPE;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_ELEMENTALSHAPE_SHAPE)
{
int nSlot = GetLocalInt(oPC, "WildShapeSlot");
SetPersistantLocalInt(oPC, PRC_PNP_SHIFTING + IntToString(nSlot), nChoice);
nStage = STAGE_ELEMENTALSHAPE_SLOTS;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_DRAGONSHAPE_SLOTS)
{
SetLocalInt(oPC, "WildShapeSlot", nChoice);
nStage = STAGE_DRAGONSHAPE_SHAPE;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_DRAGONSHAPE_SHAPE)
{
int nSlot = GetLocalInt(oPC, "WildShapeSlot");
SetPersistantLocalInt(oPC, PRC_PNP_SHIFTING + IntToString(nSlot), nChoice);
nStage = STAGE_DRAGONSHAPE_SLOTS;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_ABERRANT_SLOTS)
{
SetLocalInt(oPC, "WildShapeSlot", nChoice);
nStage = STAGE_ABERRANT_SHAPE;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_ABERRANT_SHAPE)
{
int nSlot = GetLocalInt(oPC, "WildShapeSlot");
SetPersistantLocalInt(oPC, PRC_PNP_SHIFTING + IntToString(nSlot), nChoice);
nStage = STAGE_ABERRANT_SLOTS;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_PNP_FAMILIAR_COMPANION)
{
if(nChoice == 1)
{
DeletePersistantLocalInt(oPC, "PnPFamiliarType");
MyDestroyObject(GetLocalObject(oPC, "Familiar"));
MyDestroyObject(GetItemPossessedBy(oPC, "prc_pnp_familiar"));
}
}
else if (nStage == STAGE_CDKEY_ADD)
{
if(nChoice == 1)
AddNewCDKey(oPC);
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
else if (nStage == STAGE_HATHRAN_COHORT)
{
if(nChoice == STAGE_ENTRY)
{
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
else
{
SetPersistantLocalInt(oPC, "PRC_HATHRAN_COHORT_TYPE", nChoice);
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
}
else if (nStage == STAGE_WIELDING)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
{
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
if(nChoice == 1)
{
string sHeader = "One handed attack animations set.";
SetHeader(sHeader);
ReplaceObjectAnimation(oPC, "1hreadyr", "");
ReplaceObjectAnimation(oPC, "1hreadyl", "");
ReplaceObjectAnimation(oPC, "1hslashl", "");
ReplaceObjectAnimation(oPC, "1hslashr", "");
ReplaceObjectAnimation(oPC, "1hstab", "");
ReplaceObjectAnimation(oPC, "1hcloseh", "");
ReplaceObjectAnimation(oPC, "1hclosel", "");
ReplaceObjectAnimation(oPC, "1hreach", "");
ReplaceObjectAnimation(oPC, "1hparryl", "");
ReplaceObjectAnimation(oPC, "1hparryr", "");
ReplaceObjectAnimation(oPC, "1hslasho", "");
ReplaceObjectAnimation(oPC, "2hreadyr", "1hreadyr");
ReplaceObjectAnimation(oPC, "2hreadyl", "1hreadyl");
ReplaceObjectAnimation(oPC, "2hslashl", "1hslashl");
ReplaceObjectAnimation(oPC, "2hslashr", "1hslashr");
ReplaceObjectAnimation(oPC, "2hstab", "1hstab");
ReplaceObjectAnimation(oPC, "2hcloseh", "1hcloseh");
ReplaceObjectAnimation(oPC, "2hclosel", "1hclosel");
ReplaceObjectAnimation(oPC, "2hreach", "1hreach");
ReplaceObjectAnimation(oPC, "2hparryl", "1hparryl");
ReplaceObjectAnimation(oPC, "2hparryr", "1hparryr");
ReplaceObjectAnimation(oPC, "2hslasho", "1hslasho");
ReplaceObjectAnimation(oPC, "plreadyr", "1hreadyr");
ReplaceObjectAnimation(oPC, "plreadyl", "1hreadyl");
ReplaceObjectAnimation(oPC, "plslashl", "1hslashl");
ReplaceObjectAnimation(oPC, "plslashr", "1hslashr");
ReplaceObjectAnimation(oPC, "plstab", "1hstab");
ReplaceObjectAnimation(oPC, "plcloseh", "1hcloseh");
ReplaceObjectAnimation(oPC, "plclosel", "1hclosel");
ReplaceObjectAnimation(oPC, "plreach", "1hreach");
ReplaceObjectAnimation(oPC, "plparryl", "1hparryl");
ReplaceObjectAnimation(oPC, "plparryr", "1hparryr");
ReplaceObjectAnimation(oPC, "plslasho", "1hslasho");
//AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
if(nChoice == 2)
{
string sHeader = "Two-handed attack animations set.";
SetHeader(sHeader);
ReplaceObjectAnimation(oPC, "1hreadyr", "2hreadyr");
ReplaceObjectAnimation(oPC, "1hreadyl", "2hreadyl");
ReplaceObjectAnimation(oPC, "1hslashl", "2hslashl");
ReplaceObjectAnimation(oPC, "1hslashr", "2hslashr");
ReplaceObjectAnimation(oPC, "1hstab", "2hstab");
ReplaceObjectAnimation(oPC, "1hcloseh", "2hcloseh");
ReplaceObjectAnimation(oPC, "1hclosel", "2hclosel");
ReplaceObjectAnimation(oPC, "1hreach", "2hreach");
ReplaceObjectAnimation(oPC, "1hparryl", "2hparryl");
ReplaceObjectAnimation(oPC, "1hparryr", "2hparryr");
ReplaceObjectAnimation(oPC, "1hslasho", "2hslasho");
ReplaceObjectAnimation(oPC, "2hreadyr", "");
ReplaceObjectAnimation(oPC, "2hreadyl", "");
ReplaceObjectAnimation(oPC, "2hslashl", "");
ReplaceObjectAnimation(oPC, "2hslashr", "");
ReplaceObjectAnimation(oPC, "2hstab", "");
ReplaceObjectAnimation(oPC, "2hcloseh", "");
ReplaceObjectAnimation(oPC, "2hclosel", "");
ReplaceObjectAnimation(oPC, "2hreach", "");
ReplaceObjectAnimation(oPC, "2hparryl", "");
ReplaceObjectAnimation(oPC, "2hparryr", "");
ReplaceObjectAnimation(oPC, "2hslasho", "");
ReplaceObjectAnimation(oPC, "plreadyr", "");
ReplaceObjectAnimation(oPC, "plreadyl", "");
ReplaceObjectAnimation(oPC, "plslashl", "");
ReplaceObjectAnimation(oPC, "plslashr", "");
ReplaceObjectAnimation(oPC, "plstab", "");
ReplaceObjectAnimation(oPC, "plcloseh", "");
ReplaceObjectAnimation(oPC, "plclosel", "");
ReplaceObjectAnimation(oPC, "plreach", "");
ReplaceObjectAnimation(oPC, "plparryl", "");
ReplaceObjectAnimation(oPC, "plparryr", "");
ReplaceObjectAnimation(oPC, "plslasho", "");
//AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
if(nChoice == 3)
{
string sHeader = "Polearm attack animations set.";
SetHeader(sHeader);
ReplaceObjectAnimation(oPC, "plreadyr", "");
ReplaceObjectAnimation(oPC, "plreadyl", "");
ReplaceObjectAnimation(oPC, "plslashl", "");
ReplaceObjectAnimation(oPC, "plslashr", "");
ReplaceObjectAnimation(oPC, "plstab", "");
ReplaceObjectAnimation(oPC, "plcloseh", "");
ReplaceObjectAnimation(oPC, "plclosel", "");
ReplaceObjectAnimation(oPC, "plreach", "");
ReplaceObjectAnimation(oPC, "plparryl", "");
ReplaceObjectAnimation(oPC, "plparryr", "");
ReplaceObjectAnimation(oPC, "plslasho", "");
//AddChoice("Back", CHOICE_RETURN_TO_PREVIOUS);
MarkStageSetUp(nStage, oPC);
}
}
// Store the stage value. If it has been changed, this clears out the choices
SetStage(nStage, oPC);
}
}