PRC8/nwn/nwnprc/_removed/ccc_inc_convo.nss
Jaysyn904 87065fd7bb Updated release
Updated release
2024-05-11 22:27:07 -04:00

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;
}