forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
1048 lines
49 KiB
Plaintext
1048 lines
49 KiB
Plaintext
//:://////////////////////////////////////////////
|
|
//:: Shifter shifting options management conversation
|
|
//:: prc_shift_convo
|
|
//:://////////////////////////////////////////////
|
|
/** @file
|
|
PnP Shifter shifting & shifting options management
|
|
conversation script.
|
|
|
|
|
|
@author Ornedan
|
|
@date Created - 2006.03.01
|
|
@date Modified - 2006.10.07 - Finished
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "inc_dynconv"
|
|
#include "prc_inc_shifting"
|
|
#include "prc_shifter_info"
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Constant defintions */
|
|
//////////////////////////////////////////////////
|
|
|
|
const int STAGE_ENTRY = 0;
|
|
const int STAGE_CHANGESHAPE = 1;
|
|
const int STAGE_LISTQUICKSHIFTS = 2;
|
|
const int STAGE_DELETESHAPE = 3;
|
|
const int STAGE_SETTINGS = 4;
|
|
const int STAGE_SELECTQUICKSHIFTTYPE = 5;
|
|
const int STAGE_SELECTQUICKSHIFTSHAPE = 6;
|
|
const int STAGE_COULDNTSHIFT = 7;
|
|
const int STAGE_CHANGESHAPE_FILTER = 8;
|
|
const int STAGE_CHOOSE_NEW_SHAPE_PACKAGE = 9;
|
|
const int STAGE_CHOOSE_NEW_SHAPE = 10;
|
|
const int STAGE_SHAPE_PACKAGE_HELP = 11;
|
|
const int STAGE_PRINTSHAPE = 12;
|
|
|
|
const int CHOICE_CHANGESHAPE = 1;
|
|
const int CHOICE_CHANGESHAPE_EPIC = 2;
|
|
const int CHOICE_LISTQUICKSHIFTS = 3;
|
|
const int CHOICE_DELETESHAPE = 6;
|
|
const int CHOICE_SETTINGS = 7;
|
|
const int CHOICE_CHANGESHAPE_FILTER = 8;
|
|
const int CHOICE_CHANGESHAPE_FILTER_ALL = -2;
|
|
const int CHOICE_NORMAL_SHAPE_ORDER = -3;
|
|
const int CHOICE_REVERSE_SHAPE_ORDER = -4;
|
|
const int CHOICE_CHOOSE_NEW_SHAPE_PACKAGE = 9;
|
|
const int CHOICE_CHOOSE_NEW_SHAPE = 10;
|
|
const int CHOICE_SHAPE_PACKAGE_HELP = -5;
|
|
const int CHOICE_USE_GENERAL_PACKAGE = -6;
|
|
const int CHOICE_USE_MAJOR_FOCUS_PACKAGE = -7;
|
|
const int CHOICE_USE_MINOR_FOCUS_PACKAGE = -8;
|
|
const int CHOICE_SKIP_LEVEL = -9;
|
|
const int CHOICE_PRINTSHAPE = 11;
|
|
const int CHOICE_EXPLORE_SHAPE_PACKAGES = 12;
|
|
|
|
const int CHOICE_DRUIDWS = 1;
|
|
const int CHOICE_STORE_TRUEAPPEARANCE = 2;
|
|
const int CHOICE_UPDATE_RACIAL_TYPES = 3;
|
|
const int CHOICE_DELETE_MARKED_SHAPES = 4;
|
|
|
|
const int CHOICE_NORMAL = 1;
|
|
const int CHOICE_EPIC = 2;
|
|
|
|
const int CHOICE_BACK_TO_MAIN = -1;
|
|
const int STRREF_BACK_TO_MAIN = 16824794; // "Back to main menu"
|
|
|
|
const string EPICVAR = "PRC_ShiftConvo_Epic";
|
|
const string QSMODIFYVAR = "PRC_ShiftConvo_QSToModify";
|
|
const string SHAPEFILTERVALUEVAR = "PRC_ShiftConvo_Shape_Filter_Value";
|
|
const string SHAPEFILTERNEXTSTAGEVAR = "PRC_ShiftConvo_Shape_Filter_Next_Stage";
|
|
const string SHAPEREVERSEORDERVAR = "PRC_ShiftConvo_Shape_Reverse_Order";
|
|
const string SHAPE_PACKAGE_2DA = "PRC_ShiftConvo_Shape_Package_2da";
|
|
const string SHAPE_PACKAGE_USE_COUNT = "PRC_ShiftConvo_Shape_Package_Use_Count";
|
|
const string PRINT_MODE = "PRC_ShiftConvo_Print_Mode";
|
|
|
|
const string SHIFTER_LEVELLING_ARRAY = "PRC_Shifter_Levelling_Array";
|
|
const string SHIFTER_SHAPE_LEARNED_LEVEL = "PRC_Shifter_AutoGranted";
|
|
|
|
const string SHIFTER_SHAPE_PACKAGE_LIST_2DA = "shft_packages";
|
|
const int SHIFTER_MAJOR_FOCUS_PACKAGE_USES_1 = 2;
|
|
const int SHIFTER_MAJOR_FOCUS_PACKAGE_USES_2 = 2;
|
|
const int SHIFTER_MINOR_FOCUS_PACKAGE_USES_1 = 1;
|
|
const int SHIFTER_MINOR_FOCUS_PACKAGE_USES_2 = 1;
|
|
|
|
const string SHIFTER_GENERAL_PACKAGE_2DA = "PRC_Shifter_General_Package_2da";
|
|
const string SHIFTER_GENERAL_PACKAGE_NAME = "PRC_Shifter_General_Package_Name";
|
|
|
|
const string SHIFTER_MAJOR_FOCUS_PACKAGE_2DA = "PRC_Shifter_Major_Focus_Package_2da";
|
|
const string SHIFTER_MAJOR_FOCUS_PACKAGE_NAME = "PRC_Shifter_Major_Focus_Package_Name";
|
|
const string SHIFTER_MAJOR_FOCUS_PACKAGE_USE_COUNT_1 = "PRC_Shifter_Major_Focus_Package_Use_Count_1";
|
|
const string SHIFTER_MAJOR_FOCUS_PACKAGE_USE_COUNT_2 = "PRC_Shifter_Mafjor_Focus_Package_Use_Count_2";
|
|
|
|
const string SHIFTER_MINOR_FOCUS_PACKAGE_2DA = "PRC_Shifter_Minor_Focus_Package_2da";
|
|
const string SHIFTER_MINOR_FOCUS_PACKAGE_NAME = "PRC_Shifter_Minor_Focus_Package_Name";
|
|
const string SHIFTER_MINOR_FOCUS_PACKAGE_USE_COUNT_1 = "PRC_Shifter_Minor_Focus_Package_Use_Count_1";
|
|
const string SHIFTER_MINOR_FOCUS_PACKAGE_USE_COUNT_2 = "PRC_Shifter_Minor_Focus_Package_Use_Count_2";
|
|
|
|
const int DEBUG_NEW_SHAPE_LIST = FALSE;
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Aid functions */
|
|
//////////////////////////////////////////////////
|
|
|
|
void AddShape(object oPC, int nShape, string sShapeRaceFilter)
|
|
{
|
|
if(sShapeRaceFilter == "" || FindSubString(sShapeRaceFilter, "_" + IntToString(GetStoredTemplateRacialType(oPC, SHIFTER_TYPE_SHIFTER, nShape)) + "_") != -1)
|
|
AddChoice(GetStoredTemplateName(oPC, SHIFTER_TYPE_SHIFTER, nShape), nShape, oPC);
|
|
}
|
|
|
|
void GenerateShapeList(object oPC, string sShapeRaceFilter, int nReverseShapeOrder)
|
|
{
|
|
int i, nArraySize = GetNumberOfStoredTemplates(oPC, SHIFTER_TYPE_SHIFTER);
|
|
if(nReverseShapeOrder)
|
|
for(i = nArraySize-1; i >= 0; i--)
|
|
AddShape(oPC, i, sShapeRaceFilter);
|
|
else
|
|
for(i = 0; i < nArraySize; i++)
|
|
AddShape(oPC, i, sShapeRaceFilter);
|
|
}
|
|
|
|
void GenerateNewShapePackageList(object oPC, string sFilter)
|
|
{
|
|
string sPackageType;
|
|
int nPackage = 0;
|
|
while((sPackageType = Get2DACache(SHIFTER_SHAPE_PACKAGE_LIST_2DA, "Type", nPackage)) != "")
|
|
{
|
|
if(sFilter == "" || sPackageType == sFilter)
|
|
{
|
|
string sPackageName = GetStringByStrRef(StringToInt(Get2DACache(SHIFTER_SHAPE_PACKAGE_LIST_2DA, "Name", nPackage)));
|
|
AddChoice(sPackageName, nPackage, oPC);
|
|
}
|
|
nPackage++;
|
|
}
|
|
}
|
|
|
|
int AddNewShape(string sShapeList, object oPC, int nShape, int nShifterLevel, int nCharacterLevel, string sShapeResRefFilter, int bUseCR, int nExactMatchSL, int bShowAllShapes, int bUseCR)
|
|
{
|
|
string sShapeResRef = Get2DACache(sShapeList, "ResRef", nShape);
|
|
if (DEBUG_NEW_SHAPE_LIST) DoDebug("AddNewShape, ShapeList:" + sShapeList + ", Shape: " + IntToString(nShape) + "='" + sShapeResRef + "', ShifterLevel: " + IntToString(nShifterLevel) + ", CharacterLevel: " + IntToString(nCharacterLevel) + ", UseCR: " + IntToString(bUseCR));
|
|
|
|
if (!bShowAllShapes)
|
|
{
|
|
//Filter out shapes for which our Shifter level isn't high enough
|
|
//Note: "SL" is the minimum Shifter Level required to be able
|
|
//use a shape; "SLS" is the number of Shifter levels we
|
|
//require before allowing the shape to be learned automatically
|
|
//(though the Shifter could still learn the shape at an earlier
|
|
//level if it is met "in the wild").
|
|
string sShapeSL = Get2DACache(sShapeList, "SL", nShape);
|
|
int nShapeSL = StringToInt(sShapeSL);
|
|
if(nExactMatchSL)
|
|
{
|
|
if(nShapeSL != nShifterLevel)
|
|
{
|
|
if (DEBUG_NEW_SHAPE_LIST) DoDebug(" SL not exact match: " + sShapeSL);
|
|
return 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(nShapeSL > nShifterLevel)
|
|
{
|
|
if (DEBUG_NEW_SHAPE_LIST) DoDebug(" SL not qualified: " + sShapeSL);
|
|
return 0;
|
|
}
|
|
}
|
|
string sShapeSLS = Get2DACache(sShapeList, "SLS", nShape);
|
|
int nShapeSLS;
|
|
if (sShapeSLS == "")
|
|
nShapeSLS = nShapeSL;
|
|
else
|
|
nShapeSLS = StringToInt(sShapeSLS);
|
|
if(nShapeSLS > nShifterLevel)
|
|
{
|
|
if (DEBUG_NEW_SHAPE_LIST) DoDebug(" SLS not qualified: " + sShapeSLS);
|
|
return 0;
|
|
}
|
|
|
|
//Filter out shapes for which our character level isn't high enough
|
|
if(bUseCR)
|
|
{
|
|
string sShapeCR = Get2DACache(sShapeList, "CR", nShape);
|
|
float fShapeCR = StringToFloat(sShapeCR);
|
|
if(FloatToInt(fShapeCR) > nCharacterLevel)
|
|
{
|
|
if (DEBUG_NEW_SHAPE_LIST) DoDebug(" CL not qualified by CR: " + sShapeCR);
|
|
return 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
string sShapeHD = Get2DACache(sShapeList, "HD", nShape);
|
|
int nShapeHD = StringToInt(sShapeHD);
|
|
if(nShapeHD > nCharacterLevel)
|
|
{
|
|
if (DEBUG_NEW_SHAPE_LIST) DoDebug(" CL not qualified by HD: " + sShapeHD);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
//Filter out already-known shapes
|
|
if(FindSubString(sShapeResRefFilter, "|" + sShapeResRef + "|") != -1)
|
|
{
|
|
if (DEBUG_NEW_SHAPE_LIST) DoDebug(" Shape already known");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
//Add the shape to the list
|
|
object oTemplate = _prc_inc_load_template_from_resref(sShapeResRef, 0);
|
|
if(GetIsObjectValid(oTemplate))
|
|
{
|
|
string sShapeName = _prc_inc_get_stored_name_from_template(oTemplate);
|
|
if (DEBUG_NEW_SHAPE_LIST) DoDebug(" New Shape Name: " + sShapeName);
|
|
MyDestroyObject(oTemplate);
|
|
AddChoice(sShapeName, nShape, oPC);
|
|
}
|
|
else
|
|
{
|
|
if (DEBUG_NEW_SHAPE_LIST) DoDebug(" Could not load shape");
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
int GenerateNewShapeList(string sShapeList, object oPC, int nShifterLevel, int nCharacterLevel, string sShapeResRefFilter, int bUseCR, int nReverseShapeOrder, int bShowAllShapes)
|
|
{
|
|
int nShapesAdded = 0;
|
|
int nExactMatchSL = (nShifterLevel <= 9);
|
|
int bUseCR = GetPRCSwitch(PNP_SHFT_USECR);
|
|
if(nReverseShapeOrder)
|
|
{
|
|
string sResRef;
|
|
int nCount = 0;
|
|
while((sResRef = Get2DACache(sShapeList, "ResRef", nCount)) != "")
|
|
nCount++;
|
|
int i;
|
|
for(i=nCount-1; i>=0; i--)
|
|
nShapesAdded += AddNewShape(sShapeList, oPC, i, nShifterLevel, nCharacterLevel, sShapeResRefFilter, bUseCR, nExactMatchSL, bShowAllShapes, bUseCR);
|
|
}
|
|
else
|
|
{
|
|
string sResRef;
|
|
int i = 0;
|
|
while((sResRef = Get2DACache(sShapeList, "ResRef", i)) != "")
|
|
{
|
|
nShapesAdded += AddNewShape(sShapeList, oPC, i, nShifterLevel, nCharacterLevel, sShapeResRefFilter, bUseCR, nExactMatchSL, bShowAllShapes, bUseCR);
|
|
i++;
|
|
}
|
|
}
|
|
return nShapesAdded;
|
|
}
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Main function */
|
|
//////////////////////////////////////////////////
|
|
|
|
void main()
|
|
{
|
|
object oPC = GetPCSpeaker();
|
|
/* Get the value of the local variable set by the conversation script calling
|
|
* this script. Values:
|
|
* DYNCONV_ABORTED Conversation aborted
|
|
* DYNCONV_EXITED Conversation exited via the exit node
|
|
* DYNCONV_SETUP_STAGE System's reply turn
|
|
* 0 Error - something else called the script
|
|
* Other The user made a choice
|
|
*/
|
|
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
|
|
// The stage is used to determine the active conversation node.
|
|
// 0 is the entry node.
|
|
int nStage = GetStage(oPC);
|
|
|
|
// Check which of the conversation scripts called the scripts
|
|
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
|
|
return;
|
|
|
|
if(nValue == DYNCONV_SETUP_STAGE)
|
|
{
|
|
// Check if this stage is marked as already set up
|
|
// This stops list duplication when scrolling
|
|
if(!GetIsStageSetUp(nStage, oPC))
|
|
{
|
|
// variable named nStage determines the current conversation node
|
|
// Function SetHeader to set the text displayed to the PC
|
|
// Function AddChoice to add a response option for the PC. The responses are show in order added
|
|
if(nStage == STAGE_ENTRY)
|
|
{
|
|
SetHeader(GetStringByStrRef(16824364) + " :"); // "Shifter Options :"
|
|
|
|
AddChoiceStrRef(16828366, CHOICE_CHANGESHAPE, oPC); // "Change shape"
|
|
if(GetLevelByClass(CLASS_TYPE_PNP_SHIFTER, oPC) > 10) // Show the epic shift choice only if the character could use it
|
|
AddChoiceStrRef(16828367, CHOICE_CHANGESHAPE_EPIC, oPC); // "Change shape (epic)"
|
|
AddChoiceStrRef(57482+0x01000000, CHOICE_PRINTSHAPE, oPC); // "Print shape"
|
|
//TODO: WHY DOESN'T THIS PRINT DEBUG INFORMATION?
|
|
AddChoiceStrRef(16828368, CHOICE_LISTQUICKSHIFTS, oPC); // "View / Assign shapes to your 'Quick Shift Slots'"
|
|
AddChoiceStrRef(16828369, CHOICE_DELETESHAPE, oPC); // "Mark / unmark shapes to be deleted"
|
|
|
|
int nShifterLevel = GetLevelByClass(CLASS_TYPE_PNP_SHIFTER, oPC);
|
|
int nShifterLevelToLearn = GetPersistantLocalInt(oPC, SHIFTER_SHAPE_LEARNED_LEVEL) + 1;
|
|
int nCharacterLevel = persistant_array_get_int(oPC, SHIFTER_LEVELLING_ARRAY, nShifterLevelToLearn-1);
|
|
if (nShifterLevelToLearn <= nShifterLevel && nCharacterLevel > 0)
|
|
AddChoiceStrRef(57439+0x01000000, CHOICE_CHOOSE_NEW_SHAPE_PACKAGE, oPC); // "Learn new shape"
|
|
AddChoiceStrRef(57485+0x01000000, CHOICE_EXPLORE_SHAPE_PACKAGES, oPC); // "Explore Shape Packages"
|
|
|
|
AddChoiceStrRef(16828370, CHOICE_SETTINGS, oPC); // "Special settings"
|
|
|
|
MarkStageSetUp(nStage, 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_CHANGESHAPE_FILTER)
|
|
{
|
|
SetHeader(GetStringByStrRef(57422+0x01000000)); //"Select the racial type of the shape you want to become"
|
|
|
|
AddChoiceStrRef(STRREF_BACK_TO_MAIN, CHOICE_BACK_TO_MAIN, oPC);
|
|
|
|
AddChoiceStrRef(57400+0x01000000, CHOICE_CHANGESHAPE_FILTER_ALL, oPC); //"All"
|
|
|
|
string sRacialType;
|
|
int i = 0;
|
|
while((sRacialType = Get2DACache("shifter_races", "Type", i)) != "")
|
|
{
|
|
string sRacialTypeName = GetStringByStrRef(StringToInt(Get2DACache("shifter_races", "Name", i)));
|
|
AddChoice(sRacialTypeName, i, oPC);
|
|
i++;
|
|
}
|
|
|
|
MarkStageSetUp(nStage, oPC);
|
|
SetDefaultTokens();
|
|
}
|
|
else if(nStage == STAGE_CHANGESHAPE)
|
|
{
|
|
SetHeaderStrRef(GetLocalInt(oPC, EPICVAR) ?
|
|
16828371 : // "Select epic shape to become"
|
|
16828372 // "Select shape to become"
|
|
);
|
|
|
|
// The list may be long, so list the back choice first
|
|
AddChoiceStrRef(STRREF_BACK_TO_MAIN, CHOICE_BACK_TO_MAIN, oPC);
|
|
|
|
if(GetLocalInt(oPC, SHAPEREVERSEORDERVAR))
|
|
AddChoiceStrRef(57425+0x01000000, CHOICE_NORMAL_SHAPE_ORDER, oPC); //"Show oldest shapes first"
|
|
else
|
|
AddChoiceStrRef(57426+0x01000000, CHOICE_REVERSE_SHAPE_ORDER, oPC); //"Show newest shapes first"
|
|
|
|
GenerateShapeList(oPC, GetLocalString(oPC, SHAPEFILTERVALUEVAR), GetLocalInt(oPC, SHAPEREVERSEORDERVAR));
|
|
|
|
MarkStageSetUp(nStage, oPC);
|
|
}
|
|
else if(nStage == STAGE_COULDNTSHIFT)
|
|
{
|
|
SetHeaderStrRef(16828373); // "You didn't have (Epic) Greater Wildshape uses available."
|
|
|
|
AddChoiceStrRef(STRREF_BACK_TO_MAIN, CHOICE_BACK_TO_MAIN, oPC);
|
|
}
|
|
else if(nStage == STAGE_LISTQUICKSHIFTS)
|
|
{
|
|
SetHeaderStrRef(57440+0x01000000);
|
|
|
|
int i;
|
|
for(i = 1; i <= 10; i++)
|
|
AddChoice(GetStringByStrRef(16828374) + " " + IntToString(i) + " - " // "Quick Shift Slot N - "
|
|
+ (GetPersistantLocalString(oPC, "PRC_Shifter_Quick_" + IntToString(i) + "_ResRef") != "" ?
|
|
GetPersistantLocalString(oPC, "PRC_Shifter_Quick_" + IntToString(i) + "_Name") :
|
|
GetStringByStrRef(16825282) // "Blank"
|
|
),
|
|
i, oPC);
|
|
|
|
AddChoiceStrRef(STRREF_BACK_TO_MAIN, CHOICE_BACK_TO_MAIN, oPC);
|
|
|
|
MarkStageSetUp(nStage, oPC);
|
|
}
|
|
else if(nStage == STAGE_SELECTQUICKSHIFTTYPE)
|
|
{
|
|
SetHeaderStrRef(16828375); // "Select whether you want this 'Quick Shift Slot' to use a normal shift or an epic shift."
|
|
|
|
AddChoiceStrRef(66788, CHOICE_NORMAL, oPC); // "Normal"
|
|
AddChoiceStrRef(83333, CHOICE_EPIC, oPC); // "Epic"
|
|
|
|
MarkStageSetUp(nStage, oPC);
|
|
}
|
|
else if(nStage == STAGE_SELECTQUICKSHIFTSHAPE)
|
|
{
|
|
SetHeaderStrRef(GetLocalInt(oPC, EPICVAR) ?
|
|
16828376 : // "Select epic shape to store"
|
|
16828377 // "Select shape to store"
|
|
);
|
|
|
|
// The list may be long, so list the back choice first
|
|
AddChoiceStrRef(STRREF_BACK_TO_MAIN, CHOICE_BACK_TO_MAIN, oPC);
|
|
|
|
if(GetLocalInt(oPC, SHAPEREVERSEORDERVAR))
|
|
AddChoiceStrRef(57425+0x01000000, CHOICE_NORMAL_SHAPE_ORDER, oPC); //"Show oldest shapes first"
|
|
else
|
|
AddChoiceStrRef(57426+0x01000000, CHOICE_REVERSE_SHAPE_ORDER, oPC); //"Show newest shapes first"
|
|
|
|
GenerateShapeList(oPC, GetLocalString(oPC, SHAPEFILTERVALUEVAR), GetLocalInt(oPC, SHAPEREVERSEORDERVAR));
|
|
|
|
MarkStageSetUp(nStage, oPC);
|
|
}
|
|
else if(nStage == STAGE_PRINTSHAPE)
|
|
{
|
|
SetHeaderStrRef(57483+0x01000000); // "Select shape to print."
|
|
|
|
// The list may be long, so list the back choice first
|
|
AddChoiceStrRef(STRREF_BACK_TO_MAIN, CHOICE_BACK_TO_MAIN, oPC);
|
|
|
|
if(GetLocalInt(oPC, SHAPEREVERSEORDERVAR))
|
|
AddChoiceStrRef(57425+0x01000000, CHOICE_NORMAL_SHAPE_ORDER, oPC); //"Show oldest shapes first"
|
|
else
|
|
AddChoiceStrRef(57426+0x01000000, CHOICE_REVERSE_SHAPE_ORDER, oPC); //"Show newest shapes first"
|
|
|
|
GenerateShapeList(oPC, GetLocalString(oPC, SHAPEFILTERVALUEVAR), GetLocalInt(oPC, SHAPEREVERSEORDERVAR));
|
|
|
|
MarkStageSetUp(nStage, oPC);
|
|
}
|
|
else if(nStage == STAGE_DELETESHAPE)
|
|
{
|
|
SetHeaderStrRef(16828378); // "Select shape to delete.\nNote that if the shape is stored in any quickslots, the shape will still remain in those until you change their contents."
|
|
|
|
// The list may be long, so list the back choice first
|
|
AddChoiceStrRef(STRREF_BACK_TO_MAIN, CHOICE_BACK_TO_MAIN, oPC);
|
|
|
|
if(GetLocalInt(oPC, SHAPEREVERSEORDERVAR))
|
|
AddChoiceStrRef(57425+0x01000000, CHOICE_NORMAL_SHAPE_ORDER, oPC); //"Show oldest shapes first"
|
|
else
|
|
AddChoiceStrRef(57426+0x01000000, CHOICE_REVERSE_SHAPE_ORDER, oPC); //"Show newest shapes first"
|
|
|
|
GenerateShapeList(oPC, GetLocalString(oPC, SHAPEFILTERVALUEVAR), GetLocalInt(oPC, SHAPEREVERSEORDERVAR));
|
|
|
|
MarkStageSetUp(nStage, oPC);
|
|
}
|
|
else if(nStage == STAGE_SETTINGS)
|
|
{
|
|
SetHeaderStrRef(16828384); // "Select special setting to alter."
|
|
|
|
AddChoice(GetStringByStrRef(16828379) // "Toggle using Druid Wildshape uses for Shifter Greater Wildshape when out of GWS uses. Current state: "
|
|
+ (GetPersistantLocalInt(oPC, "PRC_Shifter_UseDruidWS") ?
|
|
GetStringByStrRef(16828380) : // "On"
|
|
GetStringByStrRef(16828381) // "Off"
|
|
),
|
|
CHOICE_DRUIDWS, oPC);
|
|
AddChoiceStrRef(16828385, CHOICE_STORE_TRUEAPPEARANCE, oPC); // "Store your current appearance as your true appearance (will not work if polymorphed or shifted)."
|
|
AddChoiceStrRef(57423+0x01000000, CHOICE_UPDATE_RACIAL_TYPES, oPC); //"Update racial type information"
|
|
AddChoiceStrRef(57487+0x01000000, CHOICE_DELETE_MARKED_SHAPES, oPC); // "Delete marked shapes"
|
|
AddChoiceStrRef(STRREF_BACK_TO_MAIN, CHOICE_BACK_TO_MAIN, oPC);
|
|
|
|
MarkStageSetUp(nStage, oPC);
|
|
}
|
|
else if(nStage == STAGE_CHOOSE_NEW_SHAPE_PACKAGE)
|
|
{
|
|
AddChoiceStrRef(STRREF_BACK_TO_MAIN, CHOICE_BACK_TO_MAIN, oPC);
|
|
|
|
AddChoiceStrRef(57441+0x01000000, CHOICE_SHAPE_PACKAGE_HELP, oPC); //"Explanation of shape packages"
|
|
|
|
int nShifterLevel = GetLevelByClass(CLASS_TYPE_PNP_SHIFTER, oPC);
|
|
int nShifterLevelToLearn = GetPersistantLocalInt(oPC, SHIFTER_SHAPE_LEARNED_LEVEL) + 1;
|
|
int nCharacterLevel = persistant_array_get_int(oPC, SHIFTER_LEVELLING_ARRAY, nShifterLevelToLearn-1);
|
|
int bPrintMode = GetLocalInt(oPC, PRINT_MODE);
|
|
|
|
if(bPrintMode)
|
|
{
|
|
string sString = GetStringByStrRef(57448+0x01000000);
|
|
GenerateNewShapePackageList(oPC, "");
|
|
}
|
|
else if(GetPersistantLocalString(oPC, SHIFTER_GENERAL_PACKAGE_2DA) == "")
|
|
{
|
|
SetHeaderStrRef(57442+0x01000000); //"Select general shape package"
|
|
GenerateNewShapePackageList(oPC, "general");
|
|
}
|
|
else if(GetPersistantLocalString(oPC, SHIFTER_MAJOR_FOCUS_PACKAGE_2DA) == "" && nShifterLevelToLearn >= 11)
|
|
{
|
|
SetHeaderStrRef(57443+0x01000000); //"Select major focus shape package"
|
|
GenerateNewShapePackageList(oPC, "focus");
|
|
}
|
|
else if(GetPersistantLocalString(oPC, SHIFTER_MINOR_FOCUS_PACKAGE_2DA) == "" && nShifterLevelToLearn >= 11)
|
|
{
|
|
SetHeaderStrRef(57444+0x01000000); //"Select minor focus shape package"
|
|
GenerateNewShapePackageList(oPC, "focus");
|
|
}
|
|
else if(nShifterLevelToLearn == 10)
|
|
{
|
|
string sString = GetStringByStrRef(57448+0x01000000);
|
|
sString = ReplaceString(sString, "%(SL)", IntToString(nShifterLevelToLearn));
|
|
sString = ReplaceString(sString, "%(CL)", IntToString(nCharacterLevel));
|
|
SetHeader(sString);
|
|
GenerateNewShapePackageList(oPC, "");
|
|
AddChoiceStrRef(57446+0x01000000, CHOICE_SKIP_LEVEL, oPC); //"Skip this level"
|
|
}
|
|
else
|
|
{
|
|
string sString = GetStringByStrRef(57449+0x01000000);
|
|
sString = ReplaceString(sString, "%(SL)", IntToString(nShifterLevelToLearn));
|
|
sString = ReplaceString(sString, "%(CL)", IntToString(nCharacterLevel));
|
|
SetHeader(sString);
|
|
|
|
string sPackageName = GetPersistantLocalString(oPC, SHIFTER_GENERAL_PACKAGE_NAME);
|
|
sString = GetStringByStrRef(57451+0x01000000); //"General package"
|
|
sString = ReplaceString(sString, "%(PACKAGE_NAME)", sPackageName);
|
|
AddChoice(sString, CHOICE_USE_GENERAL_PACKAGE, oPC);
|
|
|
|
int nUsesRemaining = 0;
|
|
if(nShifterLevelToLearn >= 21)
|
|
nUsesRemaining = SHIFTER_MAJOR_FOCUS_PACKAGE_USES_2 - GetPersistantLocalInt(oPC, SHIFTER_MAJOR_FOCUS_PACKAGE_USE_COUNT_2);
|
|
else if(nShifterLevelToLearn >= 11)
|
|
nUsesRemaining = SHIFTER_MAJOR_FOCUS_PACKAGE_USES_1 - GetPersistantLocalInt(oPC, SHIFTER_MAJOR_FOCUS_PACKAGE_USE_COUNT_1);
|
|
if(nUsesRemaining > 0)
|
|
{
|
|
sPackageName = GetPersistantLocalString(oPC, SHIFTER_MAJOR_FOCUS_PACKAGE_NAME);
|
|
sString = GetStringByStrRef(57452+0x01000000); //"Major focus package"
|
|
sString = ReplaceString(sString, "%(PACKAGE_NAME)", sPackageName);
|
|
sString = ReplaceString(sString, "%(USES_REMAINING)", IntToString(nUsesRemaining));
|
|
AddChoice(sString, CHOICE_USE_MAJOR_FOCUS_PACKAGE, oPC);
|
|
}
|
|
|
|
nUsesRemaining = 0;
|
|
if(nShifterLevelToLearn >= 21)
|
|
nUsesRemaining = SHIFTER_MINOR_FOCUS_PACKAGE_USES_2 - GetPersistantLocalInt(oPC, SHIFTER_MINOR_FOCUS_PACKAGE_USE_COUNT_2);
|
|
else if(nShifterLevelToLearn >= 11)
|
|
nUsesRemaining = SHIFTER_MINOR_FOCUS_PACKAGE_USES_1 - GetPersistantLocalInt(oPC, SHIFTER_MINOR_FOCUS_PACKAGE_USE_COUNT_1);
|
|
if(nUsesRemaining > 0)
|
|
{
|
|
sPackageName = GetPersistantLocalString(oPC, SHIFTER_MINOR_FOCUS_PACKAGE_NAME);
|
|
sString = GetStringByStrRef(57453+0x01000000); //"Minor focus package"
|
|
sString = ReplaceString(sString, "%(PACKAGE_NAME)", sPackageName);
|
|
sString = ReplaceString(sString, "%(USES_REMAINING)", IntToString(nUsesRemaining));
|
|
AddChoice(sString, CHOICE_USE_MINOR_FOCUS_PACKAGE, oPC);
|
|
}
|
|
|
|
AddChoiceStrRef(57446+0x01000000, CHOICE_SKIP_LEVEL, oPC); //"Skip this level"
|
|
}
|
|
|
|
MarkStageSetUp(nStage, oPC);
|
|
}
|
|
else if (nStage == STAGE_CHOOSE_NEW_SHAPE)
|
|
{
|
|
int nShifterLevel = GetLevelByClass(CLASS_TYPE_PNP_SHIFTER, oPC);
|
|
int nShifterLevelToLearn = GetPersistantLocalInt(oPC, SHIFTER_SHAPE_LEARNED_LEVEL) + 1;
|
|
int nCharacterLevel = persistant_array_get_int(oPC, SHIFTER_LEVELLING_ARRAY, nShifterLevelToLearn-1);
|
|
int bPrintMode = GetLocalInt(oPC, PRINT_MODE);
|
|
|
|
AddChoiceStrRef(STRREF_BACK_TO_MAIN, CHOICE_BACK_TO_MAIN, oPC);
|
|
|
|
if (bPrintMode)
|
|
{
|
|
SetHeaderStrRef(57483+0x01000000);
|
|
|
|
if(GetLocalInt(oPC, SHAPEREVERSEORDERVAR))
|
|
AddChoiceStrRef(57425+0x01000000, CHOICE_NORMAL_SHAPE_ORDER, oPC); //"Show oldest shapes first"
|
|
else
|
|
AddChoiceStrRef(57426+0x01000000, CHOICE_REVERSE_SHAPE_ORDER, oPC); //"Show newest shapes first"
|
|
|
|
string sPackage2da = GetLocalString(oPC, SHAPE_PACKAGE_2DA);
|
|
GenerateNewShapeList(
|
|
sPackage2da,
|
|
oPC,
|
|
nShifterLevelToLearn,
|
|
nCharacterLevel,
|
|
GetStoredTemplateFilter(oPC, SHIFTER_TYPE_SHIFTER),
|
|
GetPRCSwitch(PNP_SHFT_USECR),
|
|
GetLocalInt(oPC, SHAPEREVERSEORDERVAR),
|
|
TRUE
|
|
);
|
|
}
|
|
else if(nShifterLevelToLearn <= nShifterLevel && nCharacterLevel > 0)
|
|
{
|
|
string sString = GetStringByStrRef(57450+0x01000000);
|
|
sString = ReplaceString(sString, "%(SL)", IntToString(nShifterLevelToLearn));
|
|
sString = ReplaceString(sString, "%(CL)", IntToString(nCharacterLevel));
|
|
SetHeader(sString);
|
|
|
|
if(GetLocalInt(oPC, SHAPEREVERSEORDERVAR))
|
|
AddChoiceStrRef(57425+0x01000000, CHOICE_NORMAL_SHAPE_ORDER, oPC); //"Show oldest shapes first"
|
|
else
|
|
AddChoiceStrRef(57426+0x01000000, CHOICE_REVERSE_SHAPE_ORDER, oPC); //"Show newest shapes first"
|
|
|
|
string sPackage2da = GetLocalString(oPC, SHAPE_PACKAGE_2DA);
|
|
int nShapesAdded = GenerateNewShapeList(
|
|
sPackage2da,
|
|
oPC,
|
|
nShifterLevelToLearn,
|
|
nCharacterLevel,
|
|
GetStoredTemplateFilter(oPC, SHIFTER_TYPE_SHIFTER),
|
|
GetPRCSwitch(PNP_SHFT_USECR),
|
|
GetLocalInt(oPC, SHAPEREVERSEORDERVAR),
|
|
FALSE
|
|
);
|
|
|
|
if(!nShapesAdded)
|
|
{
|
|
SetHeaderStrRef(57445+0x01000000); //"Sorry, you've already learned all of the shapes available at this level."
|
|
AddChoiceStrRef(57446+0x01000000, CHOICE_SKIP_LEVEL, oPC); //"Skip this level"
|
|
}
|
|
}
|
|
else
|
|
{
|
|
SetHeaderStrRef(57447+0x01000000); //"No shapes to learn; already up to date"
|
|
}
|
|
|
|
MarkStageSetUp(nStage, oPC);
|
|
}
|
|
else if (nStage == STAGE_SHAPE_PACKAGE_HELP)
|
|
{
|
|
SetHeaderStrRef(57441+0x01000000);
|
|
AddChoiceStrRef(57466+0x01000000, CHOICE_BACK_TO_MAIN, oPC);
|
|
AddChoiceStrRef(57467+0x01000000, CHOICE_BACK_TO_MAIN, oPC);
|
|
AddChoiceStrRef(57468+0x01000000, CHOICE_BACK_TO_MAIN, oPC);
|
|
AddChoiceStrRef(57469+0x01000000, CHOICE_BACK_TO_MAIN, oPC);
|
|
AddChoiceStrRef(57470+0x01000000, CHOICE_BACK_TO_MAIN, oPC);
|
|
AddChoiceStrRef(57471+0x01000000, CHOICE_BACK_TO_MAIN, oPC);
|
|
AddChoiceStrRef(57472+0x01000000, CHOICE_BACK_TO_MAIN, oPC);
|
|
AddChoiceStrRef(STRREF_BACK_TO_MAIN, CHOICE_BACK_TO_MAIN, oPC);
|
|
MarkStageSetUp(nStage, oPC);
|
|
}
|
|
}
|
|
|
|
// Do token setup
|
|
SetupTokens();
|
|
}
|
|
// End of conversation cleanup
|
|
else if(nValue == DYNCONV_EXITED)
|
|
{
|
|
// Add any locals set through this conversation
|
|
DeleteLocalInt(oPC, EPICVAR);
|
|
DeleteLocalInt(oPC, QSMODIFYVAR);
|
|
DeleteLocalString(oPC, SHAPEFILTERVALUEVAR);
|
|
DeleteLocalInt(oPC, SHAPEFILTERNEXTSTAGEVAR);
|
|
//Don't DeleteLocalInt(oPC, SHAPEREVERSEORDERVAR);
|
|
DeleteLocalString(oPC, SHAPE_PACKAGE_2DA);
|
|
DeleteLocalString(oPC, SHAPE_PACKAGE_USE_COUNT);
|
|
}
|
|
// Abort conversation cleanup.
|
|
// NOTE: This section is only run when the conversation is aborted
|
|
// while aborting is allowed. When it isn't, the dynconvo infrastructure
|
|
// handles restoring the conversation in a transparent manner
|
|
else if(nValue == DYNCONV_ABORTED)
|
|
{
|
|
// Add any locals set through this conversation
|
|
DeleteLocalInt(oPC, EPICVAR);
|
|
DeleteLocalInt(oPC, QSMODIFYVAR);
|
|
DeleteLocalString(oPC, SHAPEFILTERVALUEVAR);
|
|
DeleteLocalInt(oPC, SHAPEFILTERNEXTSTAGEVAR);
|
|
//Don't DeleteLocalInt(oPC, SHAPEREVERSEORDERVAR);
|
|
DeleteLocalString(oPC, SHAPE_PACKAGE_2DA);
|
|
DeleteLocalString(oPC, SHAPE_PACKAGE_USE_COUNT);
|
|
}
|
|
// Handle PC responses
|
|
else
|
|
{
|
|
// variable named nChoice is the value of the player's choice as stored when building the choice list
|
|
// variable named nStage determines the current conversation node
|
|
int nChoice = GetChoice(oPC);
|
|
ClearCurrentStage(oPC);
|
|
if(nStage == STAGE_ENTRY)
|
|
{
|
|
switch(nChoice)
|
|
{
|
|
case CHOICE_CHANGESHAPE_EPIC:
|
|
SetLocalInt(oPC, EPICVAR, TRUE);
|
|
case CHOICE_CHANGESHAPE:
|
|
nStage = STAGE_CHANGESHAPE_FILTER;
|
|
SetLocalInt(oPC, SHAPEFILTERNEXTSTAGEVAR, STAGE_CHANGESHAPE);
|
|
break;
|
|
|
|
case CHOICE_LISTQUICKSHIFTS:
|
|
nStage = STAGE_LISTQUICKSHIFTS;
|
|
break;
|
|
case CHOICE_PRINTSHAPE:
|
|
nStage = STAGE_CHANGESHAPE_FILTER;
|
|
SetLocalInt(oPC, SHAPEFILTERNEXTSTAGEVAR, STAGE_PRINTSHAPE);
|
|
break;
|
|
case CHOICE_DELETESHAPE:
|
|
nStage = STAGE_CHANGESHAPE_FILTER;
|
|
SetLocalInt(oPC, SHAPEFILTERNEXTSTAGEVAR, STAGE_DELETESHAPE);
|
|
break;
|
|
case CHOICE_SETTINGS:
|
|
nStage = STAGE_SETTINGS;
|
|
break;
|
|
case CHOICE_CHOOSE_NEW_SHAPE_PACKAGE:
|
|
SetLocalInt(oPC, PRINT_MODE, FALSE);
|
|
nStage = STAGE_CHOOSE_NEW_SHAPE_PACKAGE;
|
|
break;
|
|
case CHOICE_EXPLORE_SHAPE_PACKAGES:
|
|
SetLocalInt(oPC, PRINT_MODE, TRUE);
|
|
nStage = STAGE_CHOOSE_NEW_SHAPE_PACKAGE;
|
|
break;
|
|
|
|
default:
|
|
DoDebug("prc_shift_convo: ERROR: Unknown choice value at STAGE_ENTRY: " + IntToString(nChoice));
|
|
}
|
|
}
|
|
else if(nStage == STAGE_CHANGESHAPE_FILTER)
|
|
{
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
nStage = STAGE_ENTRY;
|
|
else
|
|
{
|
|
if(nChoice == CHOICE_CHANGESHAPE_FILTER_ALL)
|
|
SetLocalString(oPC, SHAPEFILTERVALUEVAR, "");
|
|
else
|
|
{
|
|
string sRacialType = Get2DACache("shifter_races", "Type", nChoice);
|
|
SetLocalString(oPC, SHAPEFILTERVALUEVAR, "_" + sRacialType + "_");
|
|
}
|
|
nStage = GetLocalInt(oPC, SHAPEFILTERNEXTSTAGEVAR);
|
|
}
|
|
}
|
|
else if(nStage == STAGE_CHANGESHAPE)
|
|
{
|
|
// Return to main menu?
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
nStage = STAGE_ENTRY;
|
|
else if(nChoice == CHOICE_NORMAL_SHAPE_ORDER)
|
|
SetLocalInt(oPC, SHAPEREVERSEORDERVAR, 0);
|
|
else if (nChoice == CHOICE_REVERSE_SHAPE_ORDER)
|
|
SetLocalInt(oPC, SHAPEREVERSEORDERVAR, 1);
|
|
else
|
|
{
|
|
// Make sure the character has uses left for shifting
|
|
int bPaid = FALSE;
|
|
if(!GetLocalInt(oPC, EPICVAR)) // Normal shapechange
|
|
{
|
|
// First try paying using Greater Wildshape uses
|
|
if(GetHasFeat(FEAT_PRESTIGE_SHIFTER_GWSHAPE_1, oPC))
|
|
{
|
|
DecrementRemainingFeatUses(oPC, FEAT_PRESTIGE_SHIFTER_GWSHAPE_1);
|
|
|
|
// If we would reach 0 uses this way, see if we could pay with Druid Wildshape uses instead
|
|
if(!GetHasFeat(FEAT_PRESTIGE_SHIFTER_GWSHAPE_1, oPC) &&
|
|
GetPersistantLocalInt(oPC, "PRC_Shifter_UseDruidWS") &&
|
|
GetHasFeat(FEAT_WILD_SHAPE, oPC)
|
|
)
|
|
{
|
|
IncrementRemainingFeatUses(oPC, FEAT_PRESTIGE_SHIFTER_GWSHAPE_1);
|
|
DecrementRemainingFeatUses(oPC, FEAT_WILD_SHAPE);
|
|
}
|
|
|
|
bPaid = TRUE;
|
|
}
|
|
// Otherwise try paying with Druid Wildshape uses
|
|
else if(GetPersistantLocalInt(oPC, "PRC_Shifter_UseDruidWS") &&
|
|
GetHasFeat(FEAT_WILD_SHAPE, oPC)
|
|
)
|
|
{
|
|
DecrementRemainingFeatUses(oPC, FEAT_WILD_SHAPE);
|
|
bPaid = TRUE;
|
|
}
|
|
}
|
|
// Epic shift, uses Epic Greater Wildshape
|
|
else if(GetHasFeat(FEAT_PRESTIGE_SHIFTER_EGWSHAPE_1, oPC))
|
|
{
|
|
DecrementRemainingFeatUses(oPC, FEAT_PRESTIGE_SHIFTER_EGWSHAPE_1);
|
|
bPaid = TRUE;
|
|
}
|
|
|
|
// If the user could pay for the shifting, do it
|
|
if(bPaid)
|
|
{
|
|
// Choice is index into the template list
|
|
if(!ShiftIntoResRef(oPC, SHIFTER_TYPE_SHIFTER,
|
|
GetStoredTemplate(oPC, SHIFTER_TYPE_SHIFTER, nChoice),
|
|
GetLocalInt(oPC, EPICVAR)
|
|
)
|
|
)
|
|
{
|
|
// In case of shifting failure, refund the shifting use
|
|
if(GetLocalInt(oPC, EPICVAR))
|
|
IncrementRemainingFeatUses(oPC, FEAT_PRESTIGE_SHIFTER_EGWSHAPE_1);
|
|
else
|
|
IncrementRemainingFeatUses(oPC, FEAT_PRESTIGE_SHIFTER_GWSHAPE_1);
|
|
}
|
|
|
|
// The convo should end now
|
|
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
|
|
}
|
|
// Otherwise, move to nag at them about it
|
|
else
|
|
nStage = STAGE_COULDNTSHIFT;
|
|
}
|
|
}
|
|
else if(nStage == STAGE_COULDNTSHIFT)
|
|
{
|
|
// Clear the epicness variable and return to main menu
|
|
DeleteLocalInt(oPC, EPICVAR);
|
|
|
|
nStage = STAGE_ENTRY;
|
|
}
|
|
else if(nStage == STAGE_LISTQUICKSHIFTS)
|
|
{
|
|
// Return to main menu?
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
nStage = STAGE_ENTRY;
|
|
// Something slot chosen to be modified
|
|
else
|
|
{
|
|
// Store the number of the slot to be modified
|
|
SetLocalInt(oPC, QSMODIFYVAR, nChoice);
|
|
// If the character is an epic shifter, they can select whether the quickselection is normal or epic shift
|
|
if(GetLevelByClass(CLASS_TYPE_PNP_SHIFTER, oPC) > 10)
|
|
nStage = STAGE_SELECTQUICKSHIFTTYPE;
|
|
else
|
|
{
|
|
nStage = STAGE_CHANGESHAPE_FILTER;
|
|
SetLocalInt(oPC, SHAPEFILTERNEXTSTAGEVAR, STAGE_SELECTQUICKSHIFTSHAPE);
|
|
}
|
|
}
|
|
}
|
|
else if(nStage == STAGE_SELECTQUICKSHIFTTYPE)
|
|
{
|
|
// Set the marker variable if they chose epic
|
|
if(nChoice == CHOICE_EPIC)
|
|
SetLocalInt(oPC, EPICVAR, TRUE);
|
|
|
|
nStage = STAGE_CHANGESHAPE_FILTER;
|
|
SetLocalInt(oPC, SHAPEFILTERNEXTSTAGEVAR, STAGE_SELECTQUICKSHIFTSHAPE);
|
|
}
|
|
else if(nStage == STAGE_SELECTQUICKSHIFTSHAPE)
|
|
{
|
|
// Return to main menu?
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
nStage = STAGE_ENTRY;
|
|
else if(nChoice == CHOICE_NORMAL_SHAPE_ORDER)
|
|
SetLocalInt(oPC, SHAPEREVERSEORDERVAR, 0);
|
|
else if (nChoice == CHOICE_REVERSE_SHAPE_ORDER)
|
|
SetLocalInt(oPC, SHAPEREVERSEORDERVAR, 1);
|
|
else
|
|
{
|
|
// Store the chosen template into the quickslot, choice is the template's index in the main list
|
|
int nSlot = GetLocalInt(oPC, QSMODIFYVAR);
|
|
int bEpic = GetLocalInt(oPC, EPICVAR);
|
|
SetPersistantLocalString(oPC, "PRC_Shifter_Quick_" + IntToString(nSlot) + "_ResRef",
|
|
GetStoredTemplate(oPC, SHIFTER_TYPE_SHIFTER, nChoice)
|
|
);
|
|
SetPersistantLocalString(oPC, "PRC_Shifter_Quick_" + IntToString(nSlot) + "_Name",
|
|
GetStoredTemplateName(oPC, SHIFTER_TYPE_SHIFTER, nChoice)
|
|
+ (bEpic ? " (epic)" : "")
|
|
);
|
|
SetPersistantLocalInt(oPC, "PRC_Shifter_Quick_" + IntToString(nSlot) + "_Epic", bEpic);
|
|
|
|
// Clean up
|
|
DeleteLocalInt(oPC, EPICVAR);
|
|
DeleteLocalInt(oPC, QSMODIFYVAR);
|
|
|
|
// Return to main menu
|
|
nStage = STAGE_ENTRY;
|
|
}
|
|
}
|
|
else if(nStage == STAGE_PRINTSHAPE)
|
|
{
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
nStage = STAGE_ENTRY;
|
|
else if(nChoice == CHOICE_NORMAL_SHAPE_ORDER)
|
|
SetLocalInt(oPC, SHAPEREVERSEORDERVAR, 0);
|
|
else if (nChoice == CHOICE_REVERSE_SHAPE_ORDER)
|
|
SetLocalInt(oPC, SHAPEREVERSEORDERVAR, 1);
|
|
else
|
|
{
|
|
string sResRef = GetStoredTemplate(oPC, SHIFTER_TYPE_SHIFTER, nChoice);
|
|
object oTemplate = _prc_inc_load_template_from_resref(sResRef, 0);
|
|
DelayCommand(0.0, _prc_inc_PrintShape(oPC, oTemplate, TRUE));
|
|
DelayCommand(1.0, MyDestroyObject(oTemplate));
|
|
nStage = STAGE_PRINTSHAPE;
|
|
}
|
|
}
|
|
else if(nStage == STAGE_DELETESHAPE)
|
|
{
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
nStage = STAGE_ENTRY;
|
|
else if(nChoice == CHOICE_NORMAL_SHAPE_ORDER)
|
|
SetLocalInt(oPC, SHAPEREVERSEORDERVAR, 0);
|
|
else if (nChoice == CHOICE_REVERSE_SHAPE_ORDER)
|
|
SetLocalInt(oPC, SHAPEREVERSEORDERVAR, 1);
|
|
else
|
|
{
|
|
SetStoredTemplateDeleteMark(oPC, SHIFTER_TYPE_SHIFTER, nChoice, !GetStoredTemplateDeleteMark(oPC, SHIFTER_TYPE_SHIFTER, nChoice));
|
|
nStage = STAGE_DELETESHAPE;
|
|
}
|
|
}
|
|
else if(nStage == STAGE_SETTINGS)
|
|
{
|
|
// Return to main menu?
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
nStage = STAGE_ENTRY;
|
|
// Toggle using Druid Wildshape for Greater Wildshape
|
|
else if(nChoice == CHOICE_DRUIDWS)
|
|
{
|
|
SetPersistantLocalInt(oPC, "PRC_Shifter_UseDruidWS", !GetPersistantLocalInt(oPC, "PRC_Shifter_UseDruidWS"));
|
|
nStage = STAGE_ENTRY;
|
|
}
|
|
else if(nChoice == CHOICE_STORE_TRUEAPPEARANCE)
|
|
{
|
|
// Probably should give feedback about whether this was successful or not. Though the warning in the selection text could be enough
|
|
StoreCurrentAppearanceAsTrueAppearance(oPC, TRUE);
|
|
nStage = STAGE_ENTRY;
|
|
}
|
|
else if (nChoice == CHOICE_UPDATE_RACIAL_TYPES)
|
|
{
|
|
UpdateStoredTemplateInfo(oPC, SHIFTER_TYPE_SHIFTER);
|
|
nStage = STAGE_ENTRY;
|
|
}
|
|
else if (nChoice == CHOICE_DELETE_MARKED_SHAPES)
|
|
{
|
|
DeleteMarkedStoredTemplates(oPC, SHIFTER_TYPE_SHIFTER);
|
|
nStage = STAGE_ENTRY;
|
|
}
|
|
}
|
|
else if(nStage == STAGE_CHOOSE_NEW_SHAPE_PACKAGE)
|
|
{
|
|
DeleteLocalString(oPC, SHAPE_PACKAGE_USE_COUNT);
|
|
|
|
int nShifterLevel = GetLevelByClass(CLASS_TYPE_PNP_SHIFTER, oPC);
|
|
int nShifterLevelToLearn = GetPersistantLocalInt(oPC, SHIFTER_SHAPE_LEARNED_LEVEL) + 1;
|
|
int nCharacterLevel = persistant_array_get_int(oPC, SHIFTER_LEVELLING_ARRAY, nShifterLevelToLearn-1);
|
|
int bPrintMode = GetLocalInt(oPC, PRINT_MODE);
|
|
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
nStage = STAGE_ENTRY;
|
|
else if(nChoice == CHOICE_SHAPE_PACKAGE_HELP)
|
|
nStage = STAGE_SHAPE_PACKAGE_HELP;
|
|
else if (nChoice == CHOICE_SKIP_LEVEL)
|
|
{
|
|
SetPersistantLocalInt(oPC, SHIFTER_SHAPE_LEARNED_LEVEL, nShifterLevelToLearn);
|
|
nStage = STAGE_ENTRY;
|
|
}
|
|
else if(nChoice == CHOICE_USE_GENERAL_PACKAGE)
|
|
{
|
|
string sGeneralPackage2da = GetPersistantLocalString(oPC, SHIFTER_GENERAL_PACKAGE_2DA);
|
|
SetLocalString(oPC, SHAPE_PACKAGE_2DA, sGeneralPackage2da);
|
|
nStage = STAGE_CHOOSE_NEW_SHAPE;
|
|
}
|
|
else if(nChoice == CHOICE_USE_MAJOR_FOCUS_PACKAGE)
|
|
{
|
|
string sFocusPackage2da = GetPersistantLocalString(oPC, SHIFTER_MAJOR_FOCUS_PACKAGE_2DA);
|
|
SetLocalString(oPC, SHAPE_PACKAGE_2DA, sFocusPackage2da);
|
|
if(nShifterLevelToLearn >= 21)
|
|
SetLocalString(oPC, SHAPE_PACKAGE_USE_COUNT, SHIFTER_MAJOR_FOCUS_PACKAGE_USE_COUNT_2);
|
|
else
|
|
SetLocalString(oPC, SHAPE_PACKAGE_USE_COUNT, SHIFTER_MAJOR_FOCUS_PACKAGE_USE_COUNT_1);
|
|
nStage = STAGE_CHOOSE_NEW_SHAPE;
|
|
}
|
|
else if(nChoice == CHOICE_USE_MINOR_FOCUS_PACKAGE)
|
|
{
|
|
string sFocusPackage2da = GetPersistantLocalString(oPC, SHIFTER_MINOR_FOCUS_PACKAGE_2DA);
|
|
SetLocalString(oPC, SHAPE_PACKAGE_2DA, sFocusPackage2da);
|
|
if(nShifterLevelToLearn >= 21)
|
|
SetLocalString(oPC, SHAPE_PACKAGE_USE_COUNT, SHIFTER_MINOR_FOCUS_PACKAGE_USE_COUNT_2);
|
|
else
|
|
SetLocalString(oPC, SHAPE_PACKAGE_USE_COUNT, SHIFTER_MINOR_FOCUS_PACKAGE_USE_COUNT_1);
|
|
nStage = STAGE_CHOOSE_NEW_SHAPE;
|
|
}
|
|
else
|
|
{
|
|
string sPackageName = GetStringByStrRef(StringToInt(Get2DACache(SHIFTER_SHAPE_PACKAGE_LIST_2DA, "Name", nChoice)));
|
|
string sPackage2da = Get2DACache(SHIFTER_SHAPE_PACKAGE_LIST_2DA, "Package2da", nChoice);
|
|
if (bPrintMode)
|
|
{
|
|
SetLocalString(oPC, SHAPE_PACKAGE_2DA, sPackage2da);
|
|
nStage = STAGE_CHOOSE_NEW_SHAPE;
|
|
}
|
|
else if(GetPersistantLocalString(oPC, SHIFTER_GENERAL_PACKAGE_2DA) == "")
|
|
{
|
|
SetPersistantLocalString(oPC, SHIFTER_GENERAL_PACKAGE_2DA, sPackage2da);
|
|
SetPersistantLocalString(oPC, SHIFTER_GENERAL_PACKAGE_NAME, sPackageName);
|
|
nStage = STAGE_CHOOSE_NEW_SHAPE_PACKAGE;
|
|
}
|
|
else if(GetPersistantLocalString(oPC, SHIFTER_MAJOR_FOCUS_PACKAGE_2DA) == "" && nShifterLevelToLearn >= 11)
|
|
{
|
|
SetPersistantLocalString(oPC, SHIFTER_MAJOR_FOCUS_PACKAGE_2DA, sPackage2da);
|
|
SetPersistantLocalString(oPC, SHIFTER_MAJOR_FOCUS_PACKAGE_NAME, sPackageName);
|
|
nStage = STAGE_CHOOSE_NEW_SHAPE_PACKAGE;
|
|
}
|
|
else if(GetPersistantLocalString(oPC, SHIFTER_MINOR_FOCUS_PACKAGE_2DA) == "" && nShifterLevelToLearn >= 11)
|
|
{
|
|
SetPersistantLocalString(oPC, SHIFTER_MINOR_FOCUS_PACKAGE_2DA, sPackage2da);
|
|
SetPersistantLocalString(oPC, SHIFTER_MINOR_FOCUS_PACKAGE_NAME, sPackageName);
|
|
nStage = STAGE_CHOOSE_NEW_SHAPE_PACKAGE;
|
|
}
|
|
else if(nShifterLevelToLearn == 10)
|
|
{
|
|
SetLocalString(oPC, SHAPE_PACKAGE_2DA, sPackage2da);
|
|
nStage = STAGE_CHOOSE_NEW_SHAPE;
|
|
}
|
|
}
|
|
}
|
|
else if(nStage == STAGE_CHOOSE_NEW_SHAPE)
|
|
{
|
|
int nShifterLevel = GetLevelByClass(CLASS_TYPE_PNP_SHIFTER, oPC);
|
|
int nShifterLevelToLearn = GetPersistantLocalInt(oPC, SHIFTER_SHAPE_LEARNED_LEVEL) + 1;
|
|
int nCharacterLevel = persistant_array_get_int(oPC, SHIFTER_LEVELLING_ARRAY, nShifterLevelToLearn-1);
|
|
int bPrintMode = GetLocalInt(oPC, PRINT_MODE);
|
|
|
|
if(nChoice == CHOICE_BACK_TO_MAIN)
|
|
nStage = STAGE_ENTRY;
|
|
else if(nChoice == CHOICE_NORMAL_SHAPE_ORDER)
|
|
SetLocalInt(oPC, SHAPEREVERSEORDERVAR, 0);
|
|
else if (nChoice == CHOICE_REVERSE_SHAPE_ORDER)
|
|
SetLocalInt(oPC, SHAPEREVERSEORDERVAR, 1);
|
|
else if (nChoice == CHOICE_SKIP_LEVEL)
|
|
{
|
|
SetPersistantLocalInt(oPC, SHIFTER_SHAPE_LEARNED_LEVEL, nShifterLevelToLearn);
|
|
nStage = STAGE_ENTRY;
|
|
}
|
|
else
|
|
{
|
|
object oSpawnWP = GetWaypointByTag(SHIFTING_TEMPLATE_WP_TAG);
|
|
if(!GetIsObjectValid(oSpawnWP))
|
|
oSpawnWP = CreateObject(OBJECT_TYPE_WAYPOINT, "nw_waypoint001", GetLocation(GetObjectByTag("HEARTOFCHAOS")), FALSE, SHIFTING_TEMPLATE_WP_TAG);
|
|
location lSpawn = GetLocation(oSpawnWP);
|
|
|
|
string sPackage2da = GetLocalString(oPC, SHAPE_PACKAGE_2DA);
|
|
string sResRef = Get2DACache(sPackage2da, "ResRef", nChoice);
|
|
object oTemplate = CreateObject(OBJECT_TYPE_CREATURE, sResRef, lSpawn);
|
|
|
|
if (bPrintMode)
|
|
{
|
|
DelayCommand(0.0, _prc_inc_PrintShape(oPC, oTemplate, TRUE));
|
|
DelayCommand(1.0, MyDestroyObject(oTemplate));
|
|
}
|
|
else
|
|
{
|
|
if(StoreShiftingTemplate(oPC, SHIFTER_TYPE_SHIFTER, oTemplate))
|
|
{
|
|
DestroyObject(oTemplate, 0.5f);
|
|
|
|
SetPersistantLocalInt(oPC, SHIFTER_SHAPE_LEARNED_LEVEL, nShifterLevelToLearn);
|
|
|
|
string sUseCountVariable = GetLocalString(oPC, SHAPE_PACKAGE_USE_COUNT);
|
|
int nUseCount = GetPersistantLocalInt(oPC, sUseCountVariable);
|
|
SetPersistantLocalInt(oPC, sUseCountVariable, nUseCount+1);
|
|
|
|
nStage = STAGE_ENTRY;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if(nStage == STAGE_SHAPE_PACKAGE_HELP)
|
|
{
|
|
nStage = STAGE_ENTRY;
|
|
}
|
|
|
|
// Store the stage value. If it has been changed, this clears out the choices
|
|
SetStage(nStage, oPC);
|
|
}
|
|
}
|