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.
1846 lines
79 KiB
Plaintext
1846 lines
79 KiB
Plaintext
#include "ccc_inc_misc"
|
|
|
|
// sets up the header and the choices for each stage of the convoCC
|
|
void DoHeaderAndChoices(int nStage);
|
|
|
|
// processes the player choices for each stage of the convoCC
|
|
int HandleChoice(int nStage, int nChoice);
|
|
|
|
void DoHeaderAndChoices(int nStage)
|
|
{
|
|
string sText;
|
|
string sName;
|
|
int i = 0; // loop counter
|
|
switch(nStage)
|
|
{
|
|
case STAGE_INTRODUCTION: {
|
|
sText = "This is the PRC Conversation Character Creator (CCC).\n";
|
|
sText+= "This is a replicate of the bioware character creator, but it will allow you to select custom content at level 1. ";
|
|
sText+= "Simply follow the step by step instructions and select what you want. ";
|
|
sText+= "If you dont get all the options you think you should at a stage, select one, then select No at the confirmation step.";
|
|
SetHeader(sText);
|
|
// setup the choices
|
|
AddChoice("continue", 0);
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_GENDER: {
|
|
sText = GetStringByStrRef(158);
|
|
SetHeader(sText);
|
|
// set up the choices
|
|
Do2daLoop("gender", "name", GetPRCSwitch(FILE_END_GENDER));
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_GENDER_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
sText+= GetStringByStrRef(StringToInt(Get2DACache("gender", "NAME", GetLocalInt(OBJECT_SELF, "Gender"))));
|
|
sText+= "\n"+GetStringByStrRef(16824210);
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_RACE: {
|
|
sText = GetStringByStrRef(162); // Select a Race for your Character
|
|
SetHeader(sText);
|
|
// set up choices
|
|
// try with waiting set up first
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
DelayCommand(0.01, DoRacialtypesLoop());
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_RACE_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("racialtypes", "Name", GetLocalInt(OBJECT_SELF, "Race"))));
|
|
sText += "\n";
|
|
sText+= GetStringByStrRef(StringToInt(Get2DACache("racialtypes", "Description", GetLocalInt(OBJECT_SELF, "Race"))));
|
|
sText+= "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_CLASS: {
|
|
sText = GetStringByStrRef(61920); // Select a Class for Your Character
|
|
SetHeader(sText);
|
|
// set up choices
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
DelayCommand(0.01, DoClassesLoop());
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_CLASS_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", GetLocalInt(OBJECT_SELF, "Class"))));
|
|
sText += "\n";
|
|
sText+= GetStringByStrRef(StringToInt(Get2DACache("classes", "Description", GetLocalInt(OBJECT_SELF, "Class"))));
|
|
sText+= "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_ALIGNMENT: {
|
|
sText = GetStringByStrRef(111); // Select an Alignment for your Character
|
|
SetHeader(sText);
|
|
// get the restriction info from classes.2da
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
int nClass = GetLocalInt(OBJECT_SELF, "Class");
|
|
int iAlignRestrict = HexToInt(Get2DACache("classes", "AlignRestrict",nClass));
|
|
int iAlignRstrctType = HexToInt(Get2DACache("classes", "AlignRstrctType",nClass));
|
|
int iInvertRestrict = HexToInt(Get2DACache("classes", "InvertRestrict",nClass));
|
|
// set up choices
|
|
if(GetIsValidAlignment(ALIGNMENT_LAWFUL, ALIGNMENT_GOOD,iAlignRestrict, iAlignRstrctType, iInvertRestrict))
|
|
AddChoice(GetStringByStrRef(112), 112);
|
|
if(GetIsValidAlignment(ALIGNMENT_NEUTRAL, ALIGNMENT_GOOD,iAlignRestrict, iAlignRstrctType, iInvertRestrict))
|
|
AddChoice(GetStringByStrRef(115), 115);
|
|
if(GetIsValidAlignment(ALIGNMENT_CHAOTIC, ALIGNMENT_GOOD,iAlignRestrict, iAlignRstrctType, iInvertRestrict))
|
|
AddChoice(GetStringByStrRef(118), 118);
|
|
if(GetIsValidAlignment(ALIGNMENT_LAWFUL, ALIGNMENT_NEUTRAL,iAlignRestrict, iAlignRstrctType, iInvertRestrict))
|
|
AddChoice(GetStringByStrRef(113), 113);
|
|
if(GetIsValidAlignment(ALIGNMENT_NEUTRAL, ALIGNMENT_NEUTRAL,iAlignRestrict, iAlignRstrctType, iInvertRestrict))
|
|
AddChoice(GetStringByStrRef(116), 116);
|
|
if(GetIsValidAlignment(ALIGNMENT_CHAOTIC, ALIGNMENT_NEUTRAL,iAlignRestrict, iAlignRstrctType, iInvertRestrict))
|
|
AddChoice(GetStringByStrRef(119), 119);
|
|
if(GetIsValidAlignment(ALIGNMENT_LAWFUL, ALIGNMENT_EVIL,iAlignRestrict, iAlignRstrctType, iInvertRestrict))
|
|
AddChoice(GetStringByStrRef(114), 114);
|
|
if(GetIsValidAlignment(ALIGNMENT_NEUTRAL, ALIGNMENT_EVIL,iAlignRestrict, iAlignRstrctType, iInvertRestrict))
|
|
AddChoice(GetStringByStrRef(117), 117);
|
|
if(GetIsValidAlignment(ALIGNMENT_CHAOTIC, ALIGNMENT_EVIL,iAlignRestrict, iAlignRstrctType, iInvertRestrict))
|
|
AddChoice(GetStringByStrRef(120), 120);
|
|
DelayCommand(0.01, DeleteLocalInt(OBJECT_SELF, "DynConv_Waiting"));
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_ALIGNMENT_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
int nStrRef = GetLocalInt(OBJECT_SELF, "AlignChoice"); // strref for the alignment
|
|
sText += GetStringByStrRef(nStrRef);
|
|
sText += "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_ABILITY: {
|
|
// the first time through this stage set everything up
|
|
if(GetLocalInt(OBJECT_SELF, "Str") == 0)
|
|
{
|
|
// get the starting points to allocate
|
|
int nPoints = GetPRCSwitch(PRC_CONVOCC_STAT_POINTS);
|
|
if(nPoints == 0)
|
|
nPoints = 30; // default
|
|
SetLocalInt(OBJECT_SELF, "Points", nPoints);
|
|
// get the max stat level (before racial modifiers)
|
|
int nMaxStat = GetPRCSwitch(PRC_CONVOCC_MAX_STAT);
|
|
if(nMaxStat == 0)
|
|
nMaxStat = 18; // default
|
|
SetLocalInt(OBJECT_SELF, "MaxStat", nMaxStat);
|
|
// set the starting stat values
|
|
SetLocalInt(OBJECT_SELF, "Str", 8);
|
|
SetLocalInt(OBJECT_SELF, "Dex", 8);
|
|
SetLocalInt(OBJECT_SELF, "Con", 8);
|
|
SetLocalInt(OBJECT_SELF, "Int", 8);
|
|
SetLocalInt(OBJECT_SELF, "Wis", 8);
|
|
SetLocalInt(OBJECT_SELF, "Cha", 8);
|
|
}
|
|
sText = GetStringByStrRef(130) + "\n"; // Select Ability Scores for your Character
|
|
sText += GetStringByStrRef(138) + ": "; // Remaining Points
|
|
sText += IntToString(GetLocalInt(OBJECT_SELF, "Points"));
|
|
SetHeader(sText);
|
|
// get the racial adjustment
|
|
int nRace = GetLocalInt(OBJECT_SELF, "Race");
|
|
string sStrAdjust = Get2DACache("racialtypes", "StrAdjust", nRace);
|
|
string sDexAdjust = Get2DACache("racialtypes", "DexAdjust", nRace);
|
|
string sConAdjust = Get2DACache("racialtypes", "ConAdjust", nRace);
|
|
string sIntAdjust = Get2DACache("racialtypes", "IntAdjust", nRace);
|
|
string sWisAdjust = Get2DACache("racialtypes", "WisAdjust", nRace);
|
|
string sChaAdjust = Get2DACache("racialtypes", "ChaAdjust", nRace);
|
|
// set up the choices in "<statvalue> (racial <+/-modifier>) <statname>. Cost to increase <cost>" format
|
|
AddAbilityChoice(GetLocalInt(OBJECT_SELF, "Str"), GetStringByStrRef(135), sStrAdjust, ABILITY_STRENGTH);
|
|
AddAbilityChoice(GetLocalInt(OBJECT_SELF, "Dex"), GetStringByStrRef(133), sDexAdjust, ABILITY_DEXTERITY);
|
|
AddAbilityChoice(GetLocalInt(OBJECT_SELF, "Con"), GetStringByStrRef(132), sConAdjust, ABILITY_CONSTITUTION);
|
|
AddAbilityChoice(GetLocalInt(OBJECT_SELF, "Int"), GetStringByStrRef(134), sIntAdjust, ABILITY_INTELLIGENCE);
|
|
AddAbilityChoice(GetLocalInt(OBJECT_SELF, "Wis"), GetStringByStrRef(136), sWisAdjust, ABILITY_WISDOM);
|
|
AddAbilityChoice(GetLocalInt(OBJECT_SELF, "Cha"), GetStringByStrRef(131), sChaAdjust, ABILITY_CHARISMA);
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_ABILITY_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + "\n"; // You have selected:
|
|
// get the racial adjustment
|
|
int nRace = GetLocalInt(OBJECT_SELF, "Race");
|
|
string sStrAdjust = Get2DACache("racialtypes", "StrAdjust", nRace);
|
|
string sDexAdjust = Get2DACache("racialtypes", "DexAdjust", nRace);
|
|
string sConAdjust = Get2DACache("racialtypes", "ConAdjust", nRace);
|
|
string sIntAdjust = Get2DACache("racialtypes", "IntAdjust", nRace);
|
|
string sWisAdjust = Get2DACache("racialtypes", "WisAdjust", nRace);
|
|
string sChaAdjust = Get2DACache("racialtypes", "ChaAdjust", nRace);
|
|
sText += GetStringByStrRef(135) + ": " + IntToString(GetLocalInt(OBJECT_SELF, "Str") + StringToInt(sStrAdjust)) + "\n"; // str
|
|
sText += GetStringByStrRef(133) + ": " + IntToString(GetLocalInt(OBJECT_SELF, "Dex") + StringToInt(sDexAdjust)) + "\n"; // dex
|
|
sText += GetStringByStrRef(132) + ": " + IntToString(GetLocalInt(OBJECT_SELF, "Con") + StringToInt(sConAdjust)) + "\n"; // con
|
|
sText += GetStringByStrRef(134) + ": " + IntToString(GetLocalInt(OBJECT_SELF, "Int") + StringToInt(sIntAdjust)) + "\n"; // int
|
|
sText += GetStringByStrRef(136) + ": " + IntToString(GetLocalInt(OBJECT_SELF, "Wis") + StringToInt(sWisAdjust)) + "\n"; // wis
|
|
sText += GetStringByStrRef(131) + ": " + IntToString(GetLocalInt(OBJECT_SELF, "Cha") + StringToInt(sChaAdjust)) + "\n"; // cha
|
|
sText += "\n" + GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_SKILL: {
|
|
// the first time through this stage set everything up
|
|
int nPoints = GetLocalInt(OBJECT_SELF, "Points");
|
|
if(nPoints == 0)
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
//calculate number of points
|
|
nPoints += StringToInt(Get2DACache("classes", "SkillPointBase", GetLocalInt(OBJECT_SELF, "Class")));
|
|
// calculate the intelligence bonus/penalty
|
|
int nInt = GetLocalInt(OBJECT_SELF, "Int");
|
|
int nRace = GetLocalInt(OBJECT_SELF, "Race");
|
|
nPoints += (nInt-10+StringToInt(Get2DACache("racialtypes", "IntAdjust", nRace)))/2;
|
|
if(GetPRCSwitch(PRC_CONVOCC_SKILL_MULTIPLIER))
|
|
nPoints *= GetPRCSwitch(PRC_CONVOCC_SKILL_MULTIPLIER);
|
|
else
|
|
nPoints *= 4;
|
|
// humans get an extra 4 skill points at level 1
|
|
if (GetLocalInt(OBJECT_SELF, "Race") == RACIAL_TYPE_HUMAN)
|
|
nPoints += 4;
|
|
nPoints += GetPRCSwitch(PRC_CONVOCC_SKILL_BONUS);
|
|
// minimum of 4, regardless of int
|
|
if(nPoints < 4)
|
|
nPoints = 4;
|
|
SetLocalInt(OBJECT_SELF, "Points", nPoints);
|
|
DelayCommand(0.01, DoSkillsLoop());
|
|
}
|
|
else
|
|
DoSkillsLoop();
|
|
// do header
|
|
sText = GetStringByStrRef(396) + "\n"; // Allocate skill points
|
|
sText += GetStringByStrRef(395) + ": "; // Remaining Points
|
|
sText += IntToString(GetLocalInt(OBJECT_SELF, "Points"));
|
|
SetHeader(sText);
|
|
/* Hack - Returning to the skill selection stage, restore the
|
|
* offset to be the same as it was choosing the skill.
|
|
*/
|
|
if(GetLocalInt(OBJECT_SELF, "SkillListChoiceOffset"))
|
|
{
|
|
SetLocalInt(OBJECT_SELF, DYNCONV_CHOICEOFFSET, GetLocalInt(OBJECT_SELF, "SkillListChoiceOffset") - 1);
|
|
DeleteLocalInt(OBJECT_SELF, "SkillListChoiceOffset");
|
|
}
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_SKILL_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + "\n"; // You have selected:
|
|
if(GetPRCSwitch(PRC_CONVOCC_ALLOW_SKILL_POINT_ROLLOVER))
|
|
{
|
|
sText += "Stored skill points: ";
|
|
sText += IntToString(GetLocalInt(OBJECT_SELF, "SavedSkillPoints")) + "\n";
|
|
}
|
|
// loop through the "Skills" array
|
|
for(i=0; i <= GetPRCSwitch(FILE_END_SKILLS); i++) // the array can't be bigger than the skills 2da
|
|
{
|
|
if(array_get_int(OBJECT_SELF, "Skills",i) != 0) // if there are points in the skill, add it to the header
|
|
{
|
|
sText+= GetStringByStrRef(StringToInt(Get2DACache("skills", "Name", i)));
|
|
sText+= " "+IntToString(array_get_int(OBJECT_SELF, "Skills",i))+"\n";
|
|
}
|
|
}
|
|
sText += "\n" + GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_FEAT: {
|
|
sText = GetStringByStrRef(397) + "\n"; // Select Feats
|
|
sText += GetStringByStrRef(398) + ": "; // Feats remaining
|
|
// if it's the first time through, work out the number of feats
|
|
int nFeatsRemaining = GetLocalInt(OBJECT_SELF, "Points");
|
|
if (!nFeatsRemaining) // first time through
|
|
{
|
|
nFeatsRemaining = 1; // always have at least 1
|
|
// check for quick to master
|
|
nFeatsRemaining += GetLocalInt(OBJECT_SELF, "QTM");
|
|
// set how many times to go through this stage
|
|
SetLocalInt(OBJECT_SELF, "Points", nFeatsRemaining);
|
|
// mark skill focus feat prereq here so it's only done once
|
|
// note: any other skill that is restricted to certain classes needs to be added here
|
|
// and the local ints deleted in the STAGE_BONUS_FEAT_CHECK case of HandleChoice()
|
|
// and it enforced in CheckSkillPrereq()
|
|
// UMD and animal empathy are the only ones so far
|
|
MarkSkillFocusPrereq(SKILL_ANIMAL_EMPATHY, "bHasAnimalEmpathy");
|
|
MarkSkillFocusPrereq(SKILL_USE_MAGIC_DEVICE, "bHasUMD");
|
|
}
|
|
// check for bonus feat(s) from class - show the player the total feats
|
|
// even though class bonuses are a different stage
|
|
int nClass = GetLocalInt(OBJECT_SELF, "Class");
|
|
nFeatsRemaining += StringToInt(Get2DACache(Get2DACache("Classes", "BonusFeatsTable", nClass), "Bonus", 0));
|
|
sText += IntToString(nFeatsRemaining);
|
|
SetHeader(sText);
|
|
// do feat list
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
if (array_exists(OBJECT_SELF, "CachedChoiceTokens"))
|
|
{
|
|
// add cached choices to convo
|
|
AddChoicesFromCache();
|
|
DeleteLocalInt(OBJECT_SELF, "DynConv_Waiting");
|
|
}
|
|
else
|
|
{
|
|
DoFeatLoop();
|
|
}
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_FEAT_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
// get feat
|
|
int nFeat = array_get_int(OBJECT_SELF, "Feats", (array_get_size(OBJECT_SELF, "Feats") - 1));
|
|
// alertness fix
|
|
if (nFeat == -1)
|
|
nFeat = 0;
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", nFeat))) + "\n"; // name
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("feat", "DESCRIPTION", nFeat))) + "\n"; // description
|
|
sText+= "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_BONUS_FEAT: {
|
|
sText = GetStringByStrRef(397) + "\n"; // Select Feats
|
|
sText += GetStringByStrRef(398) + ": "; // Feats remaining
|
|
int nFeatsRemaining = GetLocalInt(OBJECT_SELF, "Points");
|
|
if (!nFeatsRemaining) // first time through
|
|
{
|
|
// check for bonus feat(s) from class
|
|
int nClass = GetLocalInt(OBJECT_SELF, "Class");
|
|
nFeatsRemaining += StringToInt(Get2DACache(Get2DACache("Classes", "BonusFeatsTable", nClass), "Bonus", 0));
|
|
// set how many times to go through this stage
|
|
SetLocalInt(OBJECT_SELF, "Points", nFeatsRemaining);
|
|
}
|
|
sText += IntToString(nFeatsRemaining);
|
|
SetHeader(sText);
|
|
// do feat list
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
if (array_exists(OBJECT_SELF, "CachedChoiceTokens"))
|
|
{
|
|
// add cached choices to convo
|
|
AddChoicesFromCache();
|
|
DeleteLocalInt(OBJECT_SELF, "DynConv_Waiting");
|
|
}
|
|
else
|
|
{
|
|
DoBonusFeatLoop();
|
|
}
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_BONUS_FEAT_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
// get feat
|
|
int nFeat = array_get_int(OBJECT_SELF, "Feats", (array_get_size(OBJECT_SELF, "Feats") - 1));
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("feat", "FEAT", nFeat))) + "\n"; // name
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("feat", "DESCRIPTION", nFeat))) + "\n"; // description
|
|
sText+= "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_WIZ_SCHOOL: {
|
|
sText = GetStringByStrRef(381); // Select a School of Magic
|
|
SetHeader(sText);
|
|
// choices
|
|
if(GetPRCSwitch(PRC_PNP_SPELL_SCHOOLS))
|
|
{
|
|
AddChoice(GetStringByStrRef(StringToInt(Get2DACache("spellschools", "StringRef", 9))), 9);
|
|
}
|
|
else
|
|
{
|
|
for(i = 0; i < 9; i++)
|
|
{
|
|
AddChoice(GetStringByStrRef(StringToInt(Get2DACache("spellschools", "StringRef", i))), i);
|
|
}
|
|
}
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_WIZ_SCHOOL_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
sText+= GetStringByStrRef(StringToInt(Get2DACache("spellschools", "StringRef", GetLocalInt(OBJECT_SELF, "School"))));
|
|
sText+= "\n\n";
|
|
sText+= GetStringByStrRef(StringToInt(Get2DACache("spellschools", "Description", GetLocalInt(OBJECT_SELF, "School"))));
|
|
sText+= "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_SPELLS_0: {
|
|
// if the first time through, set up the number of cantrips to pick
|
|
int nPoints = GetLocalInt(OBJECT_SELF, "Points");
|
|
int nClass = GetLocalInt(OBJECT_SELF, "Class");
|
|
if(nPoints == 0)
|
|
{
|
|
// set up the number of spells to pick
|
|
// get the cls_spkn_***2da to use
|
|
string sSpkn = Get2DACache("classes", "SpellKnownTable", nClass);
|
|
// set the number of spells to pick
|
|
nPoints = StringToInt(Get2DACache(sSpkn, "SpellLevel0", 0));
|
|
SetLocalInt(OBJECT_SELF, "Points", nPoints);
|
|
// don't want to be waiting every time
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
}
|
|
sText = GetStringByStrRef(372) + "\n"; // Select Cantrips
|
|
sText += GetStringByStrRef(371) + ": "; // Remaining Spells
|
|
sText += IntToString(nPoints);
|
|
SetHeader(sText);
|
|
// choices, uses nStage to see if it's listing level 0 or level 1 spells
|
|
DoSpellsLoop(nStage);
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_SPELLS_1: {
|
|
// if the first time through, set up the number of spells to pick
|
|
int nPoints = GetLocalInt(OBJECT_SELF, "Points");
|
|
int nClass = GetLocalInt(OBJECT_SELF, "Class");
|
|
if(nPoints == 0)
|
|
{
|
|
switch(nClass)
|
|
{
|
|
case CLASS_TYPE_WIZARD: {
|
|
// spells to pick is 3 + int modifier
|
|
int nIntMod = GetLocalInt(OBJECT_SELF, "Int");
|
|
nIntMod += StringToInt(Get2DACache("racialtypes", "IntAdjust", GetLocalInt(OBJECT_SELF, "Race")));
|
|
nIntMod = (nIntMod - 10)/2;
|
|
nPoints = 3 + nIntMod;
|
|
break;
|
|
}
|
|
case CLASS_TYPE_SORCERER: {
|
|
// get the cls_spkn_***2da to use
|
|
string sSpkn = Get2DACache("classes", "SpellKnownTable", nClass);
|
|
// set the number of spells to pick
|
|
nPoints = StringToInt(Get2DACache(sSpkn, "SpellLevel1", 0));
|
|
break;
|
|
}
|
|
}
|
|
SetLocalInt(OBJECT_SELF, "Points", nPoints);
|
|
// don't want to be waiting every time
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
}
|
|
sText = GetStringByStrRef(368) + "\n"; // Select Spells for your Character
|
|
sText += GetStringByStrRef(371) + ": "; // Remaining Spells
|
|
sText += IntToString(GetLocalInt(OBJECT_SELF, "Points"));
|
|
SetHeader(sText);
|
|
// choices, uses nStage to see if it's listing level 0 or level 1 spells
|
|
DoSpellsLoop(nStage);
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_SPELLS_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + "\n"; // You have selected:
|
|
int spellID = 0;
|
|
sText += GetStringByStrRef(691) + " - \n"; // Cantrips
|
|
// loop through the spell choices
|
|
for (i = 0; i < array_get_size(OBJECT_SELF, "SpellLvl0"); i++)
|
|
{
|
|
spellID = array_get_int(OBJECT_SELF, "SpellLvl0", i);
|
|
sText+= GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellID)));
|
|
sText += "\n";
|
|
}
|
|
sText += GetStringByStrRef(61924) + " - \n"; // Level 1 Spells
|
|
// loop through the spell choices
|
|
for (i = 0; i < array_get_size(OBJECT_SELF, "SpellLvl1"); i++)
|
|
{
|
|
spellID = array_get_int(OBJECT_SELF, "SpellLvl1", i);
|
|
sText+= GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", spellID)));
|
|
sText += "\n";
|
|
}
|
|
sText+= "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_FAMILIAR: {
|
|
int nClass = GetLocalInt(OBJECT_SELF, "Class");
|
|
sText = GetStringByStrRef(5607) + "\n"; // Choose a Familiar for your Character
|
|
sText += "(" + GetStringByStrRef(StringToInt(Get2DACache("classes", "Name", nClass))) + ")";
|
|
SetHeader(sText);
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
// do choices
|
|
if (nClass == CLASS_TYPE_DRUID)
|
|
Do2daLoop("hen_companion", "strref", GetPRCSwitch(FILE_END_ANIMALCOMP));
|
|
else // wizard or sorc
|
|
Do2daLoop("hen_familiar", "strref", GetPRCSwitch(FILE_END_FAMILIAR));
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", FALSE);
|
|
FloatingTextStringOnCreature("Done", OBJECT_SELF, FALSE);
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_FAMILIAR_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
if (GetLocalInt(OBJECT_SELF, "Class") == CLASS_TYPE_DRUID)
|
|
{
|
|
int nCompanion = GetLocalInt(OBJECT_SELF, "Companion");
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("hen_companion", "STRREF", nCompanion)));
|
|
sText += "\n";
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("hen_companion", "DESCRIPTION", nCompanion)));
|
|
sText += "\n";
|
|
}
|
|
else
|
|
{
|
|
int nFamiliar = GetLocalInt(OBJECT_SELF, "Familiar");
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("hen_familiar", "STRREF", nFamiliar)));
|
|
sText += "\n";
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("hen_familiar", "DESCRIPTION", nFamiliar)));
|
|
sText += "\n";
|
|
}
|
|
sText += "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_DOMAIN: {
|
|
sText = GetStringByStrRef(5982); // Pick Cleric Domain
|
|
SetHeader(sText);
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
// choices
|
|
DoDomainsLoop();
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_DOMAIN_CHECK1: {
|
|
sText = GetStringByStrRef(16824209) + "\n"; // You have selected:
|
|
// first domain
|
|
int nDomain = GetLocalInt(OBJECT_SELF,"Domain1");
|
|
// fix for air domain being 0
|
|
if (nDomain == -1)
|
|
nDomain = 0;
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("domains", "Name", nDomain))) + "\n";
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("domains", "Description", nDomain))) + "\n";
|
|
sText += "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_DOMAIN_CHECK2: {
|
|
sText = GetStringByStrRef(16824209) + "\n"; // You have selected:
|
|
// second domain
|
|
int nDomain = GetLocalInt(OBJECT_SELF,"Domain2");
|
|
// fix for air domain being 0
|
|
if (nDomain == -1)
|
|
nDomain = 0;
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("domains", "Name", nDomain))) + "\n";
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("domains", "Description", nDomain))) + "\n";
|
|
sText += "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_APPEARANCE: {
|
|
sText = GetStringByStrRef(124); // Select the Appearance of your Character
|
|
SetHeader(sText);
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
if(GetPRCSwitch(PRC_CONVOCC_USE_RACIAL_APPEARANCES)) // restrict to what is given in the 2da
|
|
SetupRacialAppearances();
|
|
else
|
|
DoAppearanceLoop();
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_APPEARANCE_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
int nAppearance = GetLocalInt(OBJECT_SELF, "Appearance");
|
|
int nStrRef = StringToInt(Get2DACache("appearance", "STRING_REF", nAppearance));
|
|
if(nStrRef)
|
|
sText += GetStringByStrRef(nStrRef);
|
|
else
|
|
sText += Get2DACache("appearance", "LABEL", nAppearance);
|
|
sText += "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_PORTRAIT: {
|
|
sText = GetStringByStrRef(7383); // Select a portrait
|
|
SetHeader(sText);
|
|
if(GetPRCSwitch(PRC_CONVOCC_ALLOW_TO_KEEP_PORTRAIT))
|
|
AddChoice("Keep existing portrait.", -1);
|
|
// if(GetPRCSwitch(PRC_CONVOCC_USE_RACIAL_PORTRAIT))
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
DoPortraitsLoop();
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_PORTRAIT_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
int nPortrait = GetPortraitId(OBJECT_SELF);
|
|
sText += Get2DACache("portraits", "BaseResRef", nPortrait);
|
|
sText += "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice("View this portrait.", 2);
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_SOUNDSET: {
|
|
sText = GetStringByStrRef(7535); // Select a sound set
|
|
SetHeader(sText);
|
|
if(GetPRCSwitch(PRC_CONVOCC_ALLOW_TO_KEEP_VOICESET))
|
|
AddChoice("keep existing soundset.", -1);
|
|
SetLocalInt(OBJECT_SELF, "DynConv_Waiting", TRUE);
|
|
DoSoundsetLoop();
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_SOUNDSET_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
int nSoundset = GetLocalInt(OBJECT_SELF, "Soundset");
|
|
sText += GetStringByStrRef(StringToInt(Get2DACache("soundset", "STRREF", nSoundset)));
|
|
sText += "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice("Listen to this soundset.", 2);
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_HEAD: {
|
|
sText = GetStringByStrRef(124); // Select the Appearance of your Character
|
|
sText += "(" + GetStringByStrRef(123) + ")"; // Head
|
|
SetHeader(sText);
|
|
AddChoice("keep existing head", -1);
|
|
SetupHeadChoices();
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_HEAD_CHECK: {
|
|
sText = "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_TATTOO: {
|
|
sText = GetStringByStrRef(124); // Select the Appearance of your Character
|
|
sText += "(" + GetStringByStrRef(1591) + ")"; // Tattoo
|
|
SetHeader(sText);
|
|
AddChoice("keep current tatoos", -1);
|
|
AddChoice("torso", CREATURE_PART_TORSO);
|
|
AddChoice("right shin", CREATURE_PART_RIGHT_SHIN);
|
|
AddChoice("left shin", CREATURE_PART_LEFT_SHIN);
|
|
AddChoice("right thigh", CREATURE_PART_RIGHT_THIGH);
|
|
AddChoice("left thigh", CREATURE_PART_LEFT_THIGH);
|
|
AddChoice("right forearm", CREATURE_PART_RIGHT_FOREARM);
|
|
AddChoice("left forearm", CREATURE_PART_LEFT_FOREARM);
|
|
AddChoice("right bicep", CREATURE_PART_RIGHT_BICEP);
|
|
AddChoice("left bicep", CREATURE_PART_LEFT_BICEP);
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_TATTOO_CHECK: {
|
|
sText = "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_WINGS: {
|
|
sText = GetStringByStrRef(124); // Select the Appearance of your Character
|
|
sText += "(" + GetStringByStrRef(2409) + ")"; // Wings
|
|
SetHeader(sText);
|
|
DoWingmodelLoop();
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_WINGS_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
int nWingType = GetCreatureWingType();
|
|
sText += Get2DACache("wingmodel", "label", nWingType);
|
|
sText += "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_TAIL: {
|
|
sText = GetStringByStrRef(124); // Select the Appearance of your Character
|
|
sText += "(" + GetStringByStrRef(2410) + ")"; // Tail
|
|
SetHeader(sText);
|
|
DoTailmodelLoop();
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_TAIL_CHECK: {
|
|
sText = GetStringByStrRef(16824209) + " "; // You have selected:
|
|
int nTailType = GetCreatureTailType();
|
|
sText += Get2DACache("tailmodel", "label", nTailType);
|
|
sText += "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_SKIN_COLOUR: {
|
|
sText = "Pick a colour category ";
|
|
sText += "(" + GetStringByStrRef(128) + ")"; // Skin Color
|
|
SetHeader(sText);
|
|
AddChoice("Keep current skin colour", -1);
|
|
AddChoice("Tan colours", 1);
|
|
AddChoice("Sand & Rose brown", 2);
|
|
AddChoice("Tan-Greys and blues", 3);
|
|
AddChoice("Gold and obsidian", 4);
|
|
AddChoice("Greens", 5);
|
|
AddChoice("Greys and reds", 6);
|
|
AddChoice("Bright blues, greens and yellows", 7);
|
|
// new colours
|
|
AddChoice("Metallic & pure white and black", 8);
|
|
AddChoice("Smoky Group 1", 9);
|
|
AddChoice("Smoky Group 2", 10);
|
|
AddChoice("Smoky Group 3", 11);
|
|
AddChoice("Smoky Group 4", 12);
|
|
AddChoice("Black Cherry & Cinnamon", 13);
|
|
AddChoice("Hunter Green & Druid Green", 14);
|
|
AddChoice("Graveyard Fog & Chestnut", 15);
|
|
AddChoice("Clay & Toasted Ash", 16);
|
|
AddChoice("Snail Brown & Cobalt Blue", 17);
|
|
AddChoice("Midnight Blue & Peacock Green", 18);
|
|
AddChoice("Royal Purple, Mountain Blue, & Sea Foam Green", 19);
|
|
AddChoice("Spring Green, Honey Gold, Copper Coin & Berry Ice", 20);
|
|
AddChoice("Sugar Plum, Ice Blue, Black, & White", 21);
|
|
AddChoice("Greens, Mystics, & Browns", 22);
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_SKIN_COLOUR_CHOICE: {
|
|
sText = "Pick a colour ";
|
|
sText += "(" + GetStringByStrRef(128) + ")"; // Skin Color
|
|
SetHeader(sText);
|
|
int nCategory = GetLocalInt(OBJECT_SELF, "CATEGORY_SELECTED");
|
|
AddColourChoices(nStage, nCategory);
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_SKIN_COLOUR_CHECK: {
|
|
sText = "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_HAIR_COLOUR: {
|
|
sText = "Pick a colour category ";
|
|
sText += "(" + GetStringByStrRef(125) + ")"; // Hair Color
|
|
SetHeader(sText);
|
|
AddChoice("Keep current hair colour", -1);
|
|
AddChoice("Chestnuts and Reds", 1);
|
|
AddChoice("Blondes and Browns", 2);
|
|
AddChoice("White, Greys and Black", 3);
|
|
AddChoice("Blues", 4);
|
|
AddChoice("Greens", 5);
|
|
AddChoice("Spring Greens and Yellows", 6);
|
|
AddChoice("Oranges and Pinks", 7);
|
|
// new colours
|
|
AddChoice("Metallic & pure white and black", 8);
|
|
AddChoice("Smoky Group 1", 9);
|
|
AddChoice("Smoky Group 2", 10);
|
|
AddChoice("Smoky Group 3", 11);
|
|
AddChoice("Smoky Group 4", 12);
|
|
AddChoice("Black Cherry & Cinnamon", 13);
|
|
AddChoice("Hunter Green & Druid Green", 14);
|
|
AddChoice("Graveyard Fog & Chestnut", 15);
|
|
AddChoice("Clay & Toasted Ash", 16);
|
|
AddChoice("Snail Brown & Cobalt Blue", 17);
|
|
AddChoice("Midnight Blue & Peacock Green", 18);
|
|
AddChoice("Royal Purple, Mountain Blue, & Sea Foam Green", 19);
|
|
AddChoice("Spring Green, Honey Gold, Copper Coin & Berry Ice", 20);
|
|
AddChoice("Sugar Plum, Ice Blue, Black, & White", 21);
|
|
AddChoice("Greens, Mystics, & Browns", 22);
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_HAIR_COLOUR_CHOICE: {
|
|
sText = "Pick a colour ";
|
|
sText += "(" + GetStringByStrRef(125) + ")"; // Hair Color
|
|
SetHeader(sText);
|
|
int nCategory = GetLocalInt(OBJECT_SELF, "CATEGORY_SELECTED");
|
|
AddColourChoices(nStage, nCategory);
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_HAIR_COLOUR_CHECK: {
|
|
sText = "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_TATTOO1_COLOUR: {
|
|
sText = "Pick a colour category ";
|
|
sText += "(" + GetStringByStrRef(337) + ")"; // Tattoo Colors
|
|
SetHeader(sText);
|
|
AddChoice("Keep current tattoo 1 colour", -1);
|
|
AddChoice("Tan/Brown & Tan/Red", 1);
|
|
AddChoice("Tan/Yellow & Tan/Grey", 2);
|
|
AddChoice("Olive, White, Grey & Charcoal", 3);
|
|
AddChoice("Blue, Aqua, Teal & Green", 4);
|
|
AddChoice("Yellow, Orange, Red & Pink", 5);
|
|
AddChoice("Purple, Violet & Shiny/Metallic group 1", 6);
|
|
AddChoice("Shiny/Metallic group 2", 7);
|
|
// new colours
|
|
AddChoice("Metallic & pure white and black", 8);
|
|
AddChoice("Smoky Group 1", 9);
|
|
AddChoice("Smoky Group 2", 10);
|
|
AddChoice("Smoky Group 3", 11);
|
|
AddChoice("Smoky Group 4", 12);
|
|
AddChoice("Black Cherry & Cinnamon", 13);
|
|
AddChoice("Hunter Green & Druid Green", 14);
|
|
AddChoice("Graveyard Fog & Chestnut", 15);
|
|
AddChoice("Clay & Toasted Ash", 16);
|
|
AddChoice("Snail Brown & Cobalt Blue", 17);
|
|
AddChoice("Midnight Blue & Peacock Green", 18);
|
|
AddChoice("Royal Purple, Mountain Blue, & Sea Foam Green", 19);
|
|
AddChoice("Spring Green, Honey Gold, Copper Coin & Berry Ice", 20);
|
|
AddChoice("Sugar Plum, Ice Blue, Black, & White", 21);
|
|
AddChoice("Greens, Mystics, & Browns", 22);
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_TATTOO1_COLOUR_CHOICE: {
|
|
sText = "Pick a colour ";
|
|
sText += "(" + GetStringByStrRef(337) + ")"; // Tattoo Colors
|
|
SetHeader(sText);
|
|
int nCategory = GetLocalInt(OBJECT_SELF, "CATEGORY_SELECTED");
|
|
AddColourChoices(nStage, nCategory);
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_TATTOO1_COLOUR_CHECK: {
|
|
sText = "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case STAGE_TATTOO2_COLOUR: {
|
|
sText = "Pick a colour category ";
|
|
sText += "(" + GetStringByStrRef(337) + ")"; // Tattoo Colors
|
|
SetHeader(sText);
|
|
AddChoice("Keep current tattoo 2 colour", -1);
|
|
AddChoice("Tan/Brown & Tan/Red", 1);
|
|
AddChoice("Tan/Yellow & Tan/Grey", 2);
|
|
AddChoice("Olive, White, Grey & Charcoal", 3);
|
|
AddChoice("Blue, Aqua, Teal & Green", 4);
|
|
AddChoice("Yellow, Orange, Red & Pink", 5);
|
|
AddChoice("Purple, Violet & Shiny/Metallic group 1", 6);
|
|
AddChoice("Shiny/Metallic group 2", 7);
|
|
// new colours
|
|
AddChoice("Metallic & pure white and black", 8);
|
|
AddChoice("Smoky Group 1", 9);
|
|
AddChoice("Smoky Group 2", 10);
|
|
AddChoice("Smoky Group 3", 11);
|
|
AddChoice("Smoky Group 4", 12);
|
|
AddChoice("Black Cherry & Cinnamon", 13);
|
|
AddChoice("Hunter Green & Druid Green", 14);
|
|
AddChoice("Graveyard Fog & Chestnut", 15);
|
|
AddChoice("Clay & Toasted Ash", 16);
|
|
AddChoice("Snail Brown & Cobalt Blue", 17);
|
|
AddChoice("Midnight Blue & Peacock Green", 18);
|
|
AddChoice("Royal Purple, Mountain Blue, & Sea Foam Green", 19);
|
|
AddChoice("Spring Green, Honey Gold, Copper Coin & Berry Ice", 20);
|
|
AddChoice("Sugar Plum, Ice Blue, Black, & White", 21);
|
|
AddChoice("Greens, Mystics, & Browns", 22);
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_TATTOO2_COLOUR_CHOICE: {
|
|
sText = "Pick a colour ";
|
|
sText += "(" + GetStringByStrRef(337) + ")"; // Tattoo Colors
|
|
SetHeader(sText);
|
|
int nCategory = GetLocalInt(OBJECT_SELF, "CATEGORY_SELECTED");
|
|
AddColourChoices(nStage, nCategory);
|
|
MarkStageSetUp(nStage);
|
|
SetDefaultTokens();
|
|
break;
|
|
}
|
|
case STAGE_TATTOO2_COLOUR_CHECK: {
|
|
sText = "\n"+GetStringByStrRef(16824210); // Is this correct?
|
|
SetHeader(sText);
|
|
// choices Y/N
|
|
AddChoice(GetStringByStrRef(4753), -1); // no
|
|
AddChoice(GetStringByStrRef(4752), 1); // yes
|
|
MarkStageSetUp(nStage);
|
|
break;
|
|
}
|
|
case FINAL_STAGE: {
|
|
sText = "Your character will now be generated. As part of this process, you will be booted. Please exit NWN completely before rejoining.";
|
|
SetHeader(sText);
|
|
AddChoice("Make Character", 1);
|
|
MarkStageSetUp(nStage);
|
|
// give the PC the woodsman outfit so they don't have to be naked
|
|
CreateItemOnObject("NW_CLOTH001", OBJECT_SELF);
|
|
break;
|
|
}
|
|
default:
|
|
DoDebug("ccc_inc_convo: DoHeaderAndChoices(): Unknown nStage value: " + IntToString(nStage));
|
|
}
|
|
}
|
|
|
|
int HandleChoice(int nStage, int nChoice)
|
|
{
|
|
switch(nStage)
|
|
{
|
|
case STAGE_INTRODUCTION:
|
|
nStage++;
|
|
break;
|
|
|
|
case STAGE_GENDER:
|
|
SetLocalInt(OBJECT_SELF, "Gender", nChoice);
|
|
nStage++;
|
|
break;
|
|
|
|
case STAGE_GENDER_CHECK: {
|
|
if(nChoice == 1)
|
|
nStage++;
|
|
else // go back to pick gender
|
|
{
|
|
nStage = STAGE_GENDER;
|
|
MarkStageNotSetUp(STAGE_GENDER_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_GENDER, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "Gender");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_RACE:
|
|
SetLocalInt(OBJECT_SELF, "Race", nChoice);
|
|
nStage++;
|
|
break;
|
|
case STAGE_RACE_CHECK: {
|
|
if(nChoice == 1)
|
|
{
|
|
nStage++;
|
|
DoCutscene(OBJECT_SELF);
|
|
// store racial feat variables
|
|
AddRaceFeats(GetLocalInt(OBJECT_SELF, "Race"));
|
|
}
|
|
else // go back and pick race
|
|
{
|
|
nStage = STAGE_RACE;
|
|
MarkStageNotSetUp(STAGE_RACE_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_RACE, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "Race");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_CLASS:
|
|
SetLocalInt(OBJECT_SELF, "Class", nChoice);
|
|
nStage++;
|
|
break;
|
|
case STAGE_CLASS_CHECK: {
|
|
if(nChoice == 1)
|
|
{
|
|
nStage++;
|
|
// add class feats
|
|
AddClassFeats(GetLocalInt(OBJECT_SELF, "Class"));
|
|
// now for hitpoints (without con alteration)
|
|
SetLocalInt(OBJECT_SELF, "HitPoints",
|
|
StringToInt(Get2DACache("classes", "HitDie",
|
|
GetLocalInt(OBJECT_SELF, "Class"))));
|
|
}
|
|
else // go back and pick class
|
|
{
|
|
nStage = STAGE_CLASS;
|
|
MarkStageNotSetUp(STAGE_CLASS_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_CLASS, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "Class");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_ALIGNMENT: {
|
|
// for stage check later
|
|
SetLocalInt(OBJECT_SELF, "AlignChoice", nChoice);
|
|
switch(nChoice)
|
|
{
|
|
case 112: //lawful good
|
|
SetLocalInt(OBJECT_SELF, "LawfulChaotic", 85);
|
|
SetLocalInt(OBJECT_SELF, "GoodEvil", 85);
|
|
break;
|
|
case 115: //neutral good
|
|
SetLocalInt(OBJECT_SELF, "LawfulChaotic", 50);
|
|
SetLocalInt(OBJECT_SELF, "GoodEvil", 85);
|
|
break;
|
|
case 118: //chaotic good
|
|
SetLocalInt(OBJECT_SELF, "LawfulChaotic", 15);
|
|
SetLocalInt(OBJECT_SELF, "GoodEvil", 85);
|
|
break;
|
|
case 113: //lawful neutral
|
|
SetLocalInt(OBJECT_SELF, "LawfulChaotic", 85);
|
|
SetLocalInt(OBJECT_SELF, "GoodEvil", 50);
|
|
break;
|
|
case 116: //true neutral
|
|
SetLocalInt(OBJECT_SELF, "LawfulChaotic", 50);
|
|
SetLocalInt(OBJECT_SELF, "GoodEvil", 50);
|
|
break;
|
|
case 119: //chaotic neutral
|
|
SetLocalInt(OBJECT_SELF, "LawfulChaotic", 15);
|
|
SetLocalInt(OBJECT_SELF, "GoodEvil", 50);
|
|
break;
|
|
case 114: //lawful evil
|
|
SetLocalInt(OBJECT_SELF, "LawfulChaotic", 85);
|
|
SetLocalInt(OBJECT_SELF, "GoodEvil", 15);
|
|
break;
|
|
case 117: //neutral evil
|
|
SetLocalInt(OBJECT_SELF, "LawfulChaotic", 50);
|
|
SetLocalInt(OBJECT_SELF, "GoodEvil", 15);
|
|
break;
|
|
case 120: //chaotic evil
|
|
SetLocalInt(OBJECT_SELF, "LawfulChaotic", 15);
|
|
SetLocalInt(OBJECT_SELF, "GoodEvil", 15);
|
|
break;
|
|
default:
|
|
DoDebug("Duh, that clearly didn't work right");
|
|
}
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_ALIGNMENT_CHECK: {
|
|
if(nChoice == 1)
|
|
{
|
|
nStage++;
|
|
}
|
|
else // go back and pick alignment
|
|
{
|
|
nStage = STAGE_ALIGNMENT;
|
|
MarkStageNotSetUp(STAGE_ALIGNMENT_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_ALIGNMENT, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "AlignChoice");
|
|
DeleteLocalInt(OBJECT_SELF, "LawfulChaotic");
|
|
DeleteLocalInt(OBJECT_SELF, "GoodEvil");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_ABILITY: {
|
|
int nAbilityScore;
|
|
switch(nChoice)
|
|
{
|
|
case ABILITY_STRENGTH:
|
|
nAbilityScore = IncreaseAbilityScore(GetLocalInt(OBJECT_SELF, "Str"));
|
|
SetLocalInt(OBJECT_SELF, "Str", nAbilityScore);
|
|
break;
|
|
case ABILITY_DEXTERITY:
|
|
nAbilityScore = IncreaseAbilityScore(GetLocalInt(OBJECT_SELF, "Dex"));
|
|
SetLocalInt(OBJECT_SELF, "Dex", nAbilityScore);
|
|
break;
|
|
case ABILITY_CONSTITUTION:
|
|
nAbilityScore = IncreaseAbilityScore(GetLocalInt(OBJECT_SELF, "Con"));
|
|
SetLocalInt(OBJECT_SELF, "Con", nAbilityScore);
|
|
break;
|
|
case ABILITY_INTELLIGENCE:
|
|
nAbilityScore = IncreaseAbilityScore(GetLocalInt(OBJECT_SELF, "Int"));
|
|
SetLocalInt(OBJECT_SELF, "Int", nAbilityScore);
|
|
break;
|
|
case ABILITY_WISDOM:
|
|
nAbilityScore = IncreaseAbilityScore(GetLocalInt(OBJECT_SELF, "Wis"));
|
|
SetLocalInt(OBJECT_SELF, "Wis", nAbilityScore);
|
|
break;
|
|
case ABILITY_CHARISMA:
|
|
nAbilityScore = IncreaseAbilityScore(GetLocalInt(OBJECT_SELF, "Cha"));
|
|
SetLocalInt(OBJECT_SELF, "Cha", nAbilityScore);
|
|
break;
|
|
}
|
|
int nPoints = GetLocalInt(OBJECT_SELF, "Points"); // new total
|
|
if (nPoints) // if there's still points to allocate
|
|
{
|
|
// resets the stage so that the convo choices reflect the new ability scores
|
|
ClearCurrentStage();
|
|
}
|
|
else
|
|
nStage++; // go to next stage
|
|
break;
|
|
}
|
|
case STAGE_ABILITY_CHECK:{
|
|
if(nChoice == 1)
|
|
{
|
|
nStage++;
|
|
}
|
|
else // go back and reselect ability score
|
|
{
|
|
nStage = STAGE_ABILITY;
|
|
MarkStageNotSetUp(STAGE_ABILITY_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_ABILITY, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "Str");
|
|
DeleteLocalInt(OBJECT_SELF, "Dex");
|
|
DeleteLocalInt(OBJECT_SELF, "Con");
|
|
DeleteLocalInt(OBJECT_SELF, "Int");
|
|
DeleteLocalInt(OBJECT_SELF, "Wis");
|
|
DeleteLocalInt(OBJECT_SELF, "Cha");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_SKILL: {
|
|
// first time through, create the skills array
|
|
if(!array_exists(OBJECT_SELF, "Skills"))
|
|
array_create(OBJECT_SELF, "Skills");
|
|
// get current points
|
|
int nPoints = GetLocalInt(OBJECT_SELF, "Points");
|
|
if(GetChoice(OBJECT_SELF) == -2) // save all remaining points
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "SavedSkillPoints", nPoints);
|
|
nPoints = 0;
|
|
}
|
|
else // chosen a skill to increase
|
|
{
|
|
// get the cls_skill_*** 2da to use
|
|
string sFile = Get2DACache("classes", "SkillsTable", GetLocalInt(OBJECT_SELF, "Class"));
|
|
// work out what line in skills.2da it corresponds to
|
|
int nSkillIndex = StringToInt(Get2DAString(sFile, "SkillIndex", nChoice));
|
|
//increase the points in that skill
|
|
// the array index is the line number in skills.2da
|
|
array_set_int(OBJECT_SELF, "Skills", nSkillIndex,
|
|
array_get_int(OBJECT_SELF, "Skills", nSkillIndex)+1);
|
|
//decrease points remaining
|
|
// see if it's class or cross-class
|
|
int nClassSkill = StringToInt(Get2DAString(sFile, "ClassSkill", nChoice));
|
|
if (nClassSkill) // class skill
|
|
nPoints -= 1;
|
|
else // cross class skill
|
|
nPoints -= 2;
|
|
}
|
|
// store new points total
|
|
SetLocalInt(OBJECT_SELF, "Points", nPoints);
|
|
if (nPoints) // still some left to allocate
|
|
{
|
|
// Store offset so that if the user decides not to take the power,
|
|
// we can return to the same page in the power list instead of resetting to the beginning
|
|
// Store the value +1 in order to be able to differentiate between offset 0 and undefined
|
|
SetLocalInt(OBJECT_SELF, "SkillListChoiceOffset", GetLocalInt(OBJECT_SELF, DYNCONV_CHOICEOFFSET) + 1);
|
|
ClearCurrentStage();
|
|
}
|
|
else
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_SKILL_CHECK: {
|
|
if (nChoice == 1)
|
|
nStage++;
|
|
else
|
|
{
|
|
nStage = STAGE_SKILL;
|
|
MarkStageNotSetUp(STAGE_SKILL_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_SKILL, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "SavedSkillPoints");
|
|
DeleteLocalInt(OBJECT_SELF, "Points");
|
|
array_delete(OBJECT_SELF, "Skills");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_FEAT: {
|
|
int nArraySize = array_get_size(OBJECT_SELF, "Feats");
|
|
// alertness fix
|
|
if (nChoice == 0)
|
|
nChoice = -1;
|
|
// add the feat chosen to the feat array
|
|
array_set_int(OBJECT_SELF, "Feats", array_get_size(OBJECT_SELF, "Feats"), nChoice);
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_FEAT_CHECK: {
|
|
if (nChoice == 1)
|
|
{
|
|
// delete the stored convo choice list
|
|
ClearCachedChoices();
|
|
// decrement the number of feats left to pick
|
|
int nFeatsRemaining = GetLocalInt(OBJECT_SELF, "Points");
|
|
--nFeatsRemaining;
|
|
// check new number of feats left
|
|
if (nFeatsRemaining == 0)
|
|
{
|
|
// no more feats left to pick
|
|
// if there's a bonus feat to pick, go to next stage
|
|
nFeatsRemaining = StringToInt(Get2DACache(Get2DACache("Classes", "BonusFeatsTable",
|
|
GetLocalInt(OBJECT_SELF, "Class")), "Bonus", 0));
|
|
if (nFeatsRemaining)
|
|
{
|
|
// go to bonus feat stage
|
|
nStage = STAGE_BONUS_FEAT;
|
|
}
|
|
else
|
|
{
|
|
// go to next stage after that the PC qualifies for
|
|
nStage = GetNextCCCStage(nStage);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// go back to feat stage to pick next feat
|
|
nStage = STAGE_FEAT;
|
|
MarkStageNotSetUp(STAGE_FEAT_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_FEAT, OBJECT_SELF);
|
|
}
|
|
SetLocalInt(OBJECT_SELF, "Points", nFeatsRemaining);
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_FEAT;
|
|
MarkStageNotSetUp(STAGE_FEAT_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_FEAT, OBJECT_SELF);
|
|
// delete the chosen feat
|
|
if(array_shrink(OBJECT_SELF, "Feats", (array_get_size(OBJECT_SELF, "Feats") - 1)) != SDL_SUCCESS)
|
|
DoDebug("No feats array!");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_BONUS_FEAT: {
|
|
int nArraySize = array_get_size(OBJECT_SELF, "Feats");
|
|
// alertness fix
|
|
if (nChoice == 0)
|
|
nChoice = -1;
|
|
// add the feat chosen to the feat array
|
|
array_set_int(OBJECT_SELF, "Feats", array_get_size(OBJECT_SELF, "Feats"), nChoice);
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_BONUS_FEAT_CHECK: {
|
|
if (nChoice == 1)
|
|
{
|
|
// delete the stored convo choice list
|
|
ClearCachedChoices();
|
|
// decrement the number of feats left to pick
|
|
int nFeatsRemaining = GetLocalInt(OBJECT_SELF, "Points");
|
|
--nFeatsRemaining;
|
|
// check new number of feats left
|
|
if (nFeatsRemaining == 0)
|
|
{
|
|
// no more feats left to pick
|
|
// tidy up locals
|
|
DeleteLocalInt(OBJECT_SELF, "bHasAnimalEmpathy");
|
|
DeleteLocalInt(OBJECT_SELF, "bHasUMD");
|
|
// go to next stage after that the PC qualifies for
|
|
nStage = GetNextCCCStage(nStage);
|
|
}
|
|
else
|
|
{
|
|
// go back to feat stage to pick next feat
|
|
nStage = STAGE_BONUS_FEAT;
|
|
MarkStageNotSetUp(STAGE_BONUS_FEAT_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_BONUS_FEAT, OBJECT_SELF);
|
|
}
|
|
SetLocalInt(OBJECT_SELF, "Points", nFeatsRemaining);
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_BONUS_FEAT;
|
|
MarkStageNotSetUp(STAGE_BONUS_FEAT_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_BONUS_FEAT, OBJECT_SELF);
|
|
// delete the chosen feat
|
|
if(array_shrink(OBJECT_SELF, "Feats", (array_get_size(OBJECT_SELF, "Feats") - 1)) != SDL_SUCCESS)
|
|
DoDebug("No feats array!");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_WIZ_SCHOOL: {
|
|
SetLocalInt(OBJECT_SELF, "School", GetChoice());
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_WIZ_SCHOOL_CHECK: {
|
|
if(nChoice == 1)
|
|
{
|
|
// go to next stage after that the PC qualifies for
|
|
nStage = GetNextCCCStage(nStage);
|
|
// add cantrips - wizards know all of them so don't need to choose
|
|
SetWizCantrips(GetLocalInt(OBJECT_SELF, "School"));
|
|
}
|
|
else // go back and pick the school again
|
|
{
|
|
nStage = STAGE_WIZ_SCHOOL;
|
|
MarkStageNotSetUp(STAGE_WIZ_SCHOOL_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_WIZ_SCHOOL, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "School");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_SPELLS_0: {
|
|
// create the array first time through
|
|
if (!array_exists(OBJECT_SELF, "SpellLvl0"))
|
|
array_create(OBJECT_SELF, "SpellLvl0");
|
|
int nPoints = GetLocalInt(OBJECT_SELF, "Points");
|
|
// add the choice to the spells known array
|
|
array_set_int(OBJECT_SELF, "SpellLvl0", array_get_size(OBJECT_SELF, "SpellLvl0"), nChoice);
|
|
// decrement the number of spells left to select
|
|
SetLocalInt(OBJECT_SELF, "Points", --nPoints);
|
|
if (nPoints) // still some left to allocate
|
|
ClearCurrentStage();
|
|
else // go to next stage after that the PC qualifies for
|
|
nStage = GetNextCCCStage(nStage);
|
|
break;
|
|
}
|
|
case STAGE_SPELLS_1: {
|
|
// create the array first time through
|
|
if (!array_exists(OBJECT_SELF, "SpellLvl1"))
|
|
array_create(OBJECT_SELF, "SpellLvl1");
|
|
int nPoints = GetLocalInt(OBJECT_SELF, "Points");
|
|
// add the choice to the spells known array
|
|
array_set_int(OBJECT_SELF, "SpellLvl1", array_get_size(OBJECT_SELF, "SpellLvl1"), nChoice);
|
|
// decrement the number of spells left to select
|
|
SetLocalInt(OBJECT_SELF, "Points", --nPoints);
|
|
if (nPoints) // still some left to allocate
|
|
ClearCurrentStage();
|
|
else // go to next stage after that the PC qualifies for
|
|
nStage = GetNextCCCStage(nStage);
|
|
break;
|
|
}
|
|
case STAGE_SPELLS_CHECK: {
|
|
if(nChoice == 1)
|
|
{
|
|
// go to next stage after that the PC qualifies for
|
|
nStage = GetNextCCCStage(nStage);
|
|
int nClass = GetLocalInt(OBJECT_SELF, "Class");
|
|
// get the cls_spgn_***2da to use
|
|
string sSpgn = Get2DACache("classes", "SpellGainTable", nClass);
|
|
int nSpellsPerDay;
|
|
// level 1 spells
|
|
if (array_exists(OBJECT_SELF, "SpellLvl1"))
|
|
{
|
|
nSpellsPerDay = StringToInt(Get2DACache(sSpgn, "SpellLevel1", 0));
|
|
SetLocalInt(OBJECT_SELF, "SpellsPerDay1", nSpellsPerDay);
|
|
}
|
|
// cantrips
|
|
if (array_exists(OBJECT_SELF, "SpellLvl0"))
|
|
{
|
|
nSpellsPerDay = StringToInt(Get2DACache(sSpgn, "SpellLevel0", 0));
|
|
SetLocalInt(OBJECT_SELF, "SpellsPerDay0", nSpellsPerDay);
|
|
}
|
|
}
|
|
else // go back and pick the spells again
|
|
{
|
|
// hacky...but returns the right stage, depending on the class
|
|
nStage = GetNextCCCStage(STAGE_WIZ_SCHOOL_CHECK);
|
|
MarkStageNotSetUp(STAGE_SPELLS_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_SPELLS_1, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_SPELLS_0, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "Points");
|
|
array_delete(OBJECT_SELF, "SpellLvl1");
|
|
if(nStage == STAGE_SPELLS_0)
|
|
{
|
|
// if the new value of nStage takes us back to picking cantrips,
|
|
// then also delete the level 0 array
|
|
array_delete(OBJECT_SELF, "SpellLvl0");
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_FAMILIAR: {
|
|
if(GetLocalInt(OBJECT_SELF, "Class") == CLASS_TYPE_DRUID)
|
|
SetLocalInt(OBJECT_SELF, "Companion", nChoice);
|
|
else // sorc or wiz
|
|
SetLocalInt(OBJECT_SELF, "Familiar", nChoice);
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_FAMILIAR_CHECK: {
|
|
if (nChoice == 1)
|
|
nStage = GetNextCCCStage(nStage);
|
|
else
|
|
{
|
|
nStage = STAGE_FAMILIAR;
|
|
MarkStageNotSetUp(STAGE_FAMILIAR_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_FAMILIAR, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "Familiar");
|
|
DeleteLocalInt(OBJECT_SELF, "Companion");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_DOMAIN: {
|
|
// if this is the first domain chosen
|
|
if (GetLocalInt(OBJECT_SELF, "Domain1") == 0)
|
|
{
|
|
// fix for air domain being 0
|
|
if (nChoice == 0)
|
|
nChoice = -1;
|
|
SetLocalInt(OBJECT_SELF, "Domain1", nChoice);
|
|
nStage = STAGE_DOMAIN_CHECK1;
|
|
}
|
|
else // second domain
|
|
{
|
|
// fix for air domain being 0
|
|
if (nChoice == 0)
|
|
nChoice = -1;
|
|
SetLocalInt(OBJECT_SELF, "Domain2", nChoice);
|
|
nStage = STAGE_DOMAIN_CHECK2;
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_DOMAIN_CHECK1: {
|
|
if (nChoice == 1)
|
|
{
|
|
nStage = STAGE_DOMAIN;
|
|
MarkStageNotSetUp(STAGE_DOMAIN_CHECK1);
|
|
MarkStageNotSetUp(STAGE_DOMAIN);
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_DOMAIN;
|
|
MarkStageNotSetUp(STAGE_DOMAIN_CHECK1);
|
|
MarkStageNotSetUp(STAGE_DOMAIN);
|
|
DeleteLocalInt(OBJECT_SELF,"Domain1");
|
|
DeleteLocalInt(OBJECT_SELF,"Domain2");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_DOMAIN_CHECK2: {
|
|
if (nChoice == 1)
|
|
{
|
|
nStage++;
|
|
// add domain feats
|
|
AddDomainFeats();
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_DOMAIN;
|
|
MarkStageNotSetUp(STAGE_DOMAIN_CHECK2);
|
|
MarkStageNotSetUp(STAGE_DOMAIN);
|
|
DeleteLocalInt(OBJECT_SELF,"Domain1");
|
|
DeleteLocalInt(OBJECT_SELF,"Domain2");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_APPEARANCE: {
|
|
if (nChoice == -1) // no change
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "Appearance", GetAppearanceType(OBJECT_SELF));
|
|
nStage = STAGE_PORTRAIT;
|
|
}
|
|
else
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "Appearance", nChoice);
|
|
SetCreatureAppearanceType(OBJECT_SELF, nChoice);
|
|
// change the appearance
|
|
DoCutscene(OBJECT_SELF);
|
|
nStage++;
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_APPEARANCE_CHECK: {
|
|
if (nChoice == 1)
|
|
{
|
|
nStage++;
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_APPEARANCE;
|
|
MarkStageNotSetUp(STAGE_APPEARANCE_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_APPEARANCE, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "Appearance");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_PORTRAIT: {
|
|
if (nChoice == -1) // no change
|
|
{
|
|
nStage = STAGE_SOUNDSET;
|
|
}
|
|
else
|
|
{
|
|
// change the portrait
|
|
SetPortraitId(OBJECT_SELF, nChoice);
|
|
// change the clone's portrait
|
|
object oClone = GetLocalObject(OBJECT_SELF, "Clone");
|
|
SetPortraitId(oClone, nChoice);
|
|
nStage++;
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_PORTRAIT_CHECK: {
|
|
if (nChoice == 2)
|
|
{
|
|
object oClone = GetLocalObject(OBJECT_SELF, "Clone");
|
|
ActionExamine(oClone);
|
|
// DelayCommand(1.0, ActionExamine(oClone));
|
|
// DelayCommand(2.0, ActionExamine(oClone));
|
|
}
|
|
else if (nChoice == 1)
|
|
{
|
|
nStage++;
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_PORTRAIT;
|
|
MarkStageNotSetUp(STAGE_PORTRAIT_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_PORTRAIT, OBJECT_SELF);
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_SOUNDSET: {
|
|
if (nChoice == -1) // no change
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "Soundset", nChoice);
|
|
nStage = GetNextCCCStage(nStage, FALSE);
|
|
}
|
|
else
|
|
{
|
|
// store the choice
|
|
SetLocalInt(OBJECT_SELF, "Soundset", nChoice);
|
|
// modify the clone
|
|
DoCutscene(OBJECT_SELF);
|
|
nStage++;
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_SOUNDSET_CHECK: {
|
|
if (nChoice == 2)
|
|
{
|
|
object oClone = GetLocalObject(OBJECT_SELF, "Clone");
|
|
PlayVoiceChat(0 , oClone);
|
|
}
|
|
else if (nChoice == 1)
|
|
{
|
|
// set up colour defaults here to make sure they don't reset for non-player type appearances
|
|
SetLocalInt(OBJECT_SELF, "Skin", -1);
|
|
SetLocalInt(OBJECT_SELF, "Hair", -1);
|
|
SetLocalInt(OBJECT_SELF, "TattooColour1", -1);
|
|
SetLocalInt(OBJECT_SELF, "TattooColour2", -1);
|
|
nStage = GetNextCCCStage(nStage, FALSE);
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_SOUNDSET;
|
|
MarkStageNotSetUp(STAGE_SOUNDSET_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_SOUNDSET, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "Soundset");
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_HEAD: {
|
|
if (nChoice == -1) // no change
|
|
{
|
|
nStage = GetNextCCCStage(nStage, FALSE);
|
|
}
|
|
else
|
|
{
|
|
// change the head
|
|
SetCreatureBodyPart(CREATURE_PART_HEAD, nChoice);
|
|
// modify the clone's head
|
|
object oClone = GetLocalObject(OBJECT_SELF, "Clone");
|
|
SetCreatureBodyPart(CREATURE_PART_HEAD, nChoice, oClone);
|
|
nStage++;
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_HEAD_CHECK: {
|
|
if (nChoice == 1)
|
|
{
|
|
nStage = GetNextCCCStage(nStage, FALSE);
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_HEAD;
|
|
MarkStageNotSetUp(STAGE_HEAD_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_HEAD, OBJECT_SELF);
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_TATTOO: {
|
|
if (nChoice == -1) // no change
|
|
{
|
|
nStage = GetNextCCCStage(nStage, FALSE);
|
|
}
|
|
else
|
|
{
|
|
int nTattooed = GetCreatureBodyPart(nChoice, OBJECT_SELF);
|
|
if(nTattooed == 1)
|
|
nTattooed = 2;
|
|
else if(nTattooed == 2)
|
|
nTattooed = 1;
|
|
// change the tattoo on the clone
|
|
SetCreatureBodyPart(nChoice, nTattooed,
|
|
GetLocalObject(OBJECT_SELF, "Clone"));
|
|
// change the tattoo on the PC
|
|
SetCreatureBodyPart(nChoice, nTattooed);
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_TATTOO_CHECK: {
|
|
if (nChoice == 1)
|
|
{
|
|
nStage = GetNextCCCStage(nStage, FALSE);
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_TATTOO;
|
|
MarkStageNotSetUp(STAGE_TATTOO_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_TATTOO, OBJECT_SELF);
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_WINGS: {
|
|
SetCreatureWingType(nChoice);
|
|
// alter the clone
|
|
object oClone = GetLocalObject(OBJECT_SELF, "Clone");
|
|
SetCreatureWingType(nChoice, oClone);
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_WINGS_CHECK: {
|
|
if (nChoice == 1)
|
|
{
|
|
nStage = GetNextCCCStage(nStage, FALSE);
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_WINGS;
|
|
MarkStageNotSetUp(STAGE_WINGS_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_WINGS, OBJECT_SELF);
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_TAIL: {
|
|
SetCreatureTailType(nChoice);
|
|
// alter the clone
|
|
object oClone = GetLocalObject(OBJECT_SELF, "Clone");
|
|
SetCreatureTailType(nChoice, oClone);
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_TAIL_CHECK: {
|
|
if (nChoice == 1)
|
|
{
|
|
nStage = GetNextCCCStage(nStage, FALSE);
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_TAIL;
|
|
MarkStageNotSetUp(STAGE_TAIL_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_TAIL, OBJECT_SELF);
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_SKIN_COLOUR: {
|
|
if (nChoice == -1) // keep existing
|
|
{
|
|
nStage = STAGE_SKIN_COLOUR_CHECK;
|
|
SetLocalInt(OBJECT_SELF, "Skin", -1);
|
|
}
|
|
else
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "CATEGORY_SELECTED", nChoice);
|
|
nStage++;
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_SKIN_COLOUR_CHOICE: {
|
|
SetLocalInt(OBJECT_SELF, "Skin", nChoice);
|
|
// change the clone
|
|
DoCutscene(OBJECT_SELF);
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_SKIN_COLOUR_CHECK: {
|
|
if (nChoice == 1)
|
|
{
|
|
nStage++;
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_SKIN_COLOUR;
|
|
MarkStageNotSetUp(STAGE_SKIN_COLOUR_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_SKIN_COLOUR_CHOICE, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_SKIN_COLOUR, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "Skin");
|
|
}
|
|
DeleteLocalInt(OBJECT_SELF, "CATEGORY_SELECTED");
|
|
break;
|
|
}
|
|
case STAGE_HAIR_COLOUR: {
|
|
if (nChoice == -1) // keep existing
|
|
{
|
|
nStage = STAGE_HAIR_COLOUR_CHECK;
|
|
SetLocalInt(OBJECT_SELF, "Hair", -1);
|
|
}
|
|
else
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "CATEGORY_SELECTED", nChoice);
|
|
nStage++;
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_HAIR_COLOUR_CHOICE: {
|
|
SetLocalInt(OBJECT_SELF, "Hair", nChoice);
|
|
// change the clone
|
|
DoCutscene(OBJECT_SELF);
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_HAIR_COLOUR_CHECK: {
|
|
if (nChoice == 1)
|
|
{
|
|
nStage++;
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_HAIR_COLOUR;
|
|
MarkStageNotSetUp(STAGE_HAIR_COLOUR_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_HAIR_COLOUR_CHOICE, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_HAIR_COLOUR, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "Hair");
|
|
}
|
|
DeleteLocalInt(OBJECT_SELF, "CATEGORY_SELECTED");
|
|
break;
|
|
}
|
|
case STAGE_TATTOO1_COLOUR: {
|
|
if (nChoice == -1) // keep existing
|
|
{
|
|
nStage = STAGE_TATTOO1_COLOUR_CHECK;
|
|
SetLocalInt(OBJECT_SELF, "TattooColour1", -1);
|
|
}
|
|
else
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "CATEGORY_SELECTED", nChoice);
|
|
nStage++;
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_TATTOO1_COLOUR_CHOICE: {
|
|
SetLocalInt(OBJECT_SELF, "TattooColour1", nChoice);
|
|
// change the clone
|
|
DoCutscene(OBJECT_SELF);
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_TATTOO1_COLOUR_CHECK: {
|
|
if (nChoice == 1)
|
|
{
|
|
nStage++;
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_TATTOO1_COLOUR;
|
|
MarkStageNotSetUp(STAGE_TATTOO1_COLOUR_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_TATTOO1_COLOUR_CHOICE, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_TATTOO1_COLOUR, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "TattooColour1");
|
|
}
|
|
DeleteLocalInt(OBJECT_SELF, "CATEGORY_SELECTED");
|
|
break;
|
|
}
|
|
case STAGE_TATTOO2_COLOUR: {
|
|
if (nChoice == -1) // keep existing
|
|
{
|
|
nStage = STAGE_TATTOO2_COLOUR_CHECK;
|
|
SetLocalInt(OBJECT_SELF, "TattooColour2", -1);
|
|
}
|
|
else
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "CATEGORY_SELECTED", nChoice);
|
|
nStage++;
|
|
}
|
|
break;
|
|
}
|
|
case STAGE_TATTOO2_COLOUR_CHOICE: {
|
|
SetLocalInt(OBJECT_SELF, "TattooColour2", nChoice);
|
|
// change the clone
|
|
DoCutscene(OBJECT_SELF);
|
|
nStage++;
|
|
break;
|
|
}
|
|
case STAGE_TATTOO2_COLOUR_CHECK: {
|
|
if (nChoice == 1)
|
|
{
|
|
nStage = FINAL_STAGE;
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_TATTOO2_COLOUR;
|
|
MarkStageNotSetUp(STAGE_TATTOO2_COLOUR_CHECK, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_TATTOO2_COLOUR_CHOICE, OBJECT_SELF);
|
|
MarkStageNotSetUp(STAGE_TATTOO2_COLOUR, OBJECT_SELF);
|
|
DeleteLocalInt(OBJECT_SELF, "TattooColour2");
|
|
}
|
|
DeleteLocalInt(OBJECT_SELF, "CATEGORY_SELECTED");
|
|
break;
|
|
}
|
|
case FINAL_STAGE: {
|
|
ExecuteScript("prc_ccc_make_pc", OBJECT_SELF);
|
|
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
|
|
break;
|
|
}
|
|
}
|
|
return nStage;
|
|
}
|