//::////////////////////////////////////////////// //:: 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_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 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+""; } 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 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); // 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); 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_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 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); } } // 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) { 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 == 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); } // 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_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 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); } // Store the stage value. If it has been changed, this clears out the choices SetStage(nStage, oPC); } }