Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
698 lines
37 KiB
Plaintext
698 lines
37 KiB
Plaintext
//:://////////////////////////////////////////////
|
|
//:: Appearance changing dynamic conversation
|
|
//:: appearconv.nss
|
|
//:://////////////////////////////////////////////
|
|
/** @file
|
|
Conversation to change appearance
|
|
|
|
Allows for add/remove wings/tails, head changes,
|
|
portrait, and overall appearance
|
|
|
|
|
|
@author Primogenitor
|
|
@date Created - 2006.09.26
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "prc_alterations"
|
|
#include "inc_dynconv"
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Constant defintions */
|
|
//////////////////////////////////////////////////
|
|
|
|
const int STAGE_ENTRY = 0;
|
|
const int STAGE_APPEARANCE = 510;
|
|
const int STAGE_HEAD = 520;
|
|
const int STAGE_WINGS = 530;
|
|
const int STAGE_TAIL = 540;
|
|
const int STAGE_BODYPART = 550;
|
|
const int STAGE_BODYPART_CHANGE = 551;
|
|
const int STAGE_PORTRAIT = 560;
|
|
const int STAGE_EQUIPMENT = 590;
|
|
const int STAGE_EQUIPMENT_SIMPLE = 591; //e.g. shield
|
|
const int STAGE_EQUIPMENT_LAYERED = 592; //e.g. helm
|
|
const int STAGE_EQUIPMENT_COMPOSITE = 593; //e.g. sword
|
|
const int STAGE_EQUIPMENT_COMPOSITE_B = 594;
|
|
const int STAGE_EQUIPMENT_ARMOR = 595; //e.g. armor
|
|
|
|
const int CHOICE_RETURN_TO_PREVIOUS = 0xEFFFFFFF;
|
|
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Aid functions */
|
|
//////////////////////////////////////////////////
|
|
|
|
void AddPortraits(int nMin, int nMax, object oPC)
|
|
{
|
|
int i;
|
|
string sName;
|
|
for(i=nMin;i<nMin+100;i++)
|
|
{
|
|
//test for model
|
|
if(Get2DACache("portraits", "Race", i) != "")
|
|
{
|
|
sName = Get2DACache("portraits", "BaseResRef", i);
|
|
AddChoice(sName, i, oPC);
|
|
}
|
|
}
|
|
if(i < nMax)
|
|
DelayCommand(0.00, AddPortraits(i, nMax, oPC));
|
|
}
|
|
|
|
void AddTails(int nMin, int nMax, object oPC)
|
|
{
|
|
int i;
|
|
string sName;
|
|
for(i=nMin;i<nMin+100;i++)
|
|
{
|
|
//test for model
|
|
if(Get2DACache("tailmodel", "MODEL", i) != "")
|
|
{
|
|
sName = Get2DACache("wingmodel", "LABEL", i);
|
|
AddChoice(sName, i, oPC);
|
|
}
|
|
}
|
|
if(i < nMax)
|
|
DelayCommand(0.00, AddTails(i, nMax, oPC));
|
|
}
|
|
|
|
void AddWings(int nMin, int nMax, object oPC)
|
|
{
|
|
int i;
|
|
string sName;
|
|
for(i=nMin;i<nMin+100;i++)
|
|
{
|
|
//test for model
|
|
if(Get2DACache("wingmodel", "MODEL", i) != "")
|
|
{
|
|
sName = Get2DACache("wingmodel", "LABEL", i);
|
|
AddChoice(sName, i, oPC);
|
|
}
|
|
}
|
|
if(i < nMax)
|
|
DelayCommand(0.00, AddWings(i, nMax, oPC));
|
|
}
|
|
|
|
void AddAppearances(int nMin, int nMax, object oPC)
|
|
{
|
|
int i;
|
|
string sName;
|
|
for(i=nMin;i<nMin+100;i++)
|
|
{
|
|
//test for model
|
|
if(Get2DACache("appearance", "RACE", i) != "")
|
|
{
|
|
//test for tlk name
|
|
sName = GetStringByStrRef(StringToInt(Get2DACache("appearance", "STRING_REF", i)));
|
|
//no tlk name, use label
|
|
if(sName == "")
|
|
sName = Get2DACache("appearance", "LABEL", i);
|
|
AddChoice(sName, i, oPC);
|
|
}
|
|
}
|
|
if(i < nMax)
|
|
DelayCommand(0.00, AddAppearances(i, nMax, oPC));
|
|
}
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Main function */
|
|
//////////////////////////////////////////////////
|
|
|
|
void main()
|
|
{
|
|
object oPC = GetPCSpeaker();
|
|
/* Get the value of the local variable set by the conversation script calling
|
|
* this script. Values:
|
|
* DYNCONV_ABORTED Conversation aborted
|
|
* DYNCONV_EXITED Conversation exited via the exit node
|
|
* DYNCONV_SETUP_STAGE System's reply turn
|
|
* 0 Error - something else called the script
|
|
* Other The user made a choice
|
|
*/
|
|
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
|
|
// The stage is used to determine the active conversation node.
|
|
// 0 is the entry node.
|
|
int nStage = GetStage(oPC);
|
|
|
|
// Check which of the conversation scripts called the scripts
|
|
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
|
|
return;
|
|
|
|
if(nValue == DYNCONV_SETUP_STAGE)
|
|
{
|
|
// Check if this stage is marked as already set up
|
|
// This stops list duplication when scrolling
|
|
if(!GetIsStageSetUp(nStage, oPC))
|
|
{
|
|
// variable named nStage determines the current conversation node
|
|
// Function SetHeader to set the text displayed to the PC
|
|
// Function AddChoice to add a response option for the PC. The responses are show in order added
|
|
if(nStage == STAGE_ENTRY)
|
|
{
|
|
// Set the header
|
|
SetHeader("What aspect of your appearance do you wish to alter?");
|
|
// Add responses for the PC
|
|
AddChoice("Model", 1, oPC);
|
|
int bCanHaveWings;
|
|
int bCanHaveTail;
|
|
string sModelType = Get2DACache("appearance", "MODELTYPE", GetAppearanceType(oPC));
|
|
if(sModelType == "P")
|
|
{
|
|
bCanHaveTail=TRUE;
|
|
bCanHaveWings=TRUE;
|
|
}
|
|
else
|
|
{
|
|
if(TestStringAgainstPattern("**W**", sModelType))
|
|
bCanHaveWings=TRUE;
|
|
if(TestStringAgainstPattern("**T**", sModelType))
|
|
bCanHaveTail=TRUE;
|
|
}
|
|
if(sModelType == "P")
|
|
AddChoice("Head", 2, oPC);
|
|
if(bCanHaveWings)
|
|
AddChoice("Wings", 3, oPC);
|
|
if(bCanHaveTail)
|
|
AddChoice("Tail", 4, oPC);
|
|
if(sModelType == "P")
|
|
AddChoice("Other bodypart including tattoos", 5, oPC);
|
|
if(bCanHaveTail)
|
|
AddChoice("Portrait", 6, oPC);
|
|
AddChoice("Equipment", 7, oPC);
|
|
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_APPEARANCE)
|
|
{
|
|
SetHeader("Select an appearance to assume");
|
|
AddChoice("Return to previous", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
AddAppearances(0, GetPRCSwitch(FILE_END_APPEARANCE), oPC);
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_HEAD)
|
|
{
|
|
SetHeader("Select a head");
|
|
AddChoice("Return to previous step", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
AddChoice("Goto first head", 1, oPC);
|
|
AddChoice("Next head", 2, oPC);
|
|
if(GetCreatureBodyPart(CREATURE_PART_HEAD, oPC) > 0)
|
|
AddChoice("Previous head", 3, oPC);
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_WINGS)
|
|
{
|
|
SetHeader("");
|
|
AddChoice("Return to previous step", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
AddWings(0, GetPRCSwitch(FILE_END_WINGS), oPC);
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_TAIL)
|
|
{
|
|
SetHeader("");
|
|
AddChoice("Return to previous step", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
AddTails(0, GetPRCSwitch(FILE_END_TAILS), oPC);
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_BODYPART)
|
|
{
|
|
SetHeader("Which bodypart?");
|
|
AddChoice("Return to previous step", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
AddChoice("Right shin", CREATURE_PART_RIGHT_SHIN, oPC);
|
|
AddChoice("Left shin", CREATURE_PART_LEFT_SHIN, oPC);
|
|
AddChoice("Right thigh", CREATURE_PART_RIGHT_THIGH, oPC);
|
|
AddChoice("Left thigh", CREATURE_PART_LEFT_THIGH, oPC);
|
|
AddChoice("Torso", CREATURE_PART_TORSO, oPC);
|
|
AddChoice("Right forearm", CREATURE_PART_RIGHT_FOREARM, oPC);
|
|
AddChoice("Left forearm", CREATURE_PART_LEFT_FOREARM, oPC);
|
|
AddChoice("Right bicep", CREATURE_PART_RIGHT_BICEP, oPC);
|
|
AddChoice("Left bicep", CREATURE_PART_LEFT_BICEP, oPC);
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_BODYPART_CHANGE)
|
|
{
|
|
SetHeader("Select a change");
|
|
AddChoice("Return to previous step", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
AddChoice("Goto first bodypart", 1, oPC);
|
|
AddChoice("Next bodypart", 2, oPC);
|
|
int nPart = GetLocalInt(oPC, "BodypartToChange");
|
|
if(GetCreatureBodyPart(nPart, oPC) > 0)
|
|
AddChoice("Previous bodypart", 3, oPC);
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_PORTRAIT)
|
|
{
|
|
SetHeader("Select a portrait");
|
|
AddChoice("Return to previous step", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
AddPortraits(0, GetPRCSwitch(FILE_END_PORTRAITS), oPC);
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_EQUIPMENT)
|
|
{
|
|
SetHeader("Select a piece of equipment to modify");
|
|
AddChoice("Return to previous step", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
if(!array_exists(oPC, "PRC_ItemsToUse"))
|
|
{
|
|
array_create(oPC, "PRC_ItemsToUse");
|
|
int nSlot;
|
|
for(nSlot = 0; nSlot < 14; nSlot++)
|
|
{
|
|
object oItem = GetItemInSlot(nSlot, oPC);
|
|
//only modify identified items
|
|
if(GetIsObjectValid(oItem)
|
|
&& GetIdentified(oItem))
|
|
{
|
|
AddChoice(GetName(oItem), array_get_size(oPC, "PRC_ItemsToUse"));
|
|
array_set_object(oPC, "PRC_ItemsToUse", array_get_size(oPC, "PRC_ItemsToUse"), oItem);
|
|
}
|
|
}
|
|
object oItem = GetFirstItemInInventory(oPC);
|
|
while(GetIsObjectValid(oItem))
|
|
{
|
|
//only modify identified items
|
|
if(GetIdentified(oItem))
|
|
{
|
|
AddChoice(GetName(oItem), array_get_size(oPC, "PRC_ItemsToUse"));
|
|
array_set_object(oPC, "PRC_ItemsToUse", array_get_size(oPC, "PRC_ItemsToUse"), oItem);
|
|
}
|
|
oItem = GetNextItemInInventory(oPC);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int i;
|
|
for(i=0;i<array_get_size(oPC, "PRC_ItemsToUse");i++)
|
|
{
|
|
object oItem = array_get_object(oPC, "PRC_ItemsToUse", i);
|
|
AddChoice(GetName(oItem), i);
|
|
}
|
|
}
|
|
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_EQUIPMENT_SIMPLE)
|
|
{
|
|
SetHeader("How do you wish to modify this item?");
|
|
AddChoice("Return to previous step", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
AddChoice("Previous appearance", 1, oPC);
|
|
AddChoice("Next appearance", 2, oPC);
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_EQUIPMENT_LAYERED)
|
|
{
|
|
SetHeader("How do you wish to modify this item?");
|
|
AddChoice("Return to previous step", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
AddChoice("Previous appearance", 1, oPC);
|
|
AddChoice("Next appearance", 2, oPC);
|
|
AddChoice("Previous cloth1 color", 3, oPC);
|
|
AddChoice("Next cloth1 color", 4, oPC);
|
|
AddChoice("Previous cloth2 color", 5, oPC);
|
|
AddChoice("Next cloth2 color", 6, oPC);
|
|
AddChoice("Previous leather1 color",7, oPC);
|
|
AddChoice("Next leather1 color", 8, oPC);
|
|
AddChoice("Previous leather2 color",9, oPC);
|
|
AddChoice("Next leather2 color", 10, oPC);
|
|
AddChoice("Previous metal1 color", 11, oPC);
|
|
AddChoice("Next metal1 color", 12, oPC);
|
|
AddChoice("Previous metal2 color", 13, oPC);
|
|
AddChoice("Next metal2 color", 14, oPC);
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_EQUIPMENT_COMPOSITE)
|
|
{
|
|
SetHeader("How do you wish to modify this item?");
|
|
AddChoice("Return to previous step", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
AddChoice("Previous bottom part appearance", 1, oPC);
|
|
AddChoice("Next bottom part appearance", 2, oPC);
|
|
AddChoice("Previous bottom part color", 3, oPC);
|
|
AddChoice("Next bottom part color", 4, oPC);
|
|
AddChoice("Previous middle part appearance", 5, oPC);
|
|
AddChoice("Next middle part appearance", 6, oPC);
|
|
AddChoice("Previous middle part color", 7, oPC);
|
|
AddChoice("Next middle part color", 8, oPC);
|
|
AddChoice("Previous top part appearance", 9, oPC);
|
|
AddChoice("Next top part appearance", 10, oPC);
|
|
AddChoice("Previous top part color", 11, oPC);
|
|
AddChoice("Next top part color", 12, oPC);
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
else if(nStage == STAGE_EQUIPMENT_ARMOR)
|
|
{
|
|
SetHeader("How do you wish to modify this item?");
|
|
AddChoice("Return to previous step", CHOICE_RETURN_TO_PREVIOUS, oPC);
|
|
//cant change model yet
|
|
AddChoice("Previous cloth1 color", 3, oPC);
|
|
AddChoice("Next cloth1 color", 4, oPC);
|
|
AddChoice("Previous cloth2 color", 5, oPC);
|
|
AddChoice("Next cloth2 color", 6, oPC);
|
|
AddChoice("Previous leather1 color",7, oPC);
|
|
AddChoice("Next leather1 color", 8, oPC);
|
|
AddChoice("Previous leather2 color",9, oPC);
|
|
AddChoice("Next leather2 color", 10, oPC);
|
|
AddChoice("Previous metal1 color", 11, oPC);
|
|
AddChoice("Next metal1 color", 12, oPC);
|
|
AddChoice("Previous metal2 color", 13, oPC);
|
|
AddChoice("Next metal2 color", 14, oPC);
|
|
MarkStageSetUp(nStage, oPC); // This prevents the setup being run for this stage again until MarkStageNotSetUp is called for it
|
|
SetDefaultTokens(); // Set the next, previous, exit and wait tokens to default values
|
|
}
|
|
}
|
|
|
|
// Do token setup
|
|
SetupTokens();
|
|
}
|
|
// End of conversation cleanup
|
|
else if(nValue == DYNCONV_EXITED)
|
|
{
|
|
// Add any locals set through this conversation
|
|
DeleteLocalInt(oPC, "BodypartToChange");
|
|
array_delete(oPC, "PRC_ItemsToUse");
|
|
DeleteLocalObject(oPC, "PRC_ItemToUse");
|
|
}
|
|
// Abort conversation cleanup.
|
|
// NOTE: This section is only run when the conversation is aborted
|
|
// while aborting is allowed. When it isn't, the dynconvo infrastructure
|
|
// handles restoring the conversation in a transparent manner
|
|
else if(nValue == DYNCONV_ABORTED)
|
|
{
|
|
// Add any locals set through this conversation
|
|
DeleteLocalInt(oPC, "BodypartToChange");
|
|
array_delete(oPC, "PRC_ItemsToUse");
|
|
DeleteLocalObject(oPC, "PRC_ItemToUse");
|
|
}
|
|
// Handle PC responses
|
|
else
|
|
{
|
|
// variable named nChoice is the value of the player's choice as stored when building the choice list
|
|
// variable named nStage determines the current conversation node
|
|
int nOldStage = nStage;
|
|
int nChoice = GetChoice(oPC);
|
|
if(nStage == STAGE_ENTRY)
|
|
{
|
|
if(nChoice == 1)
|
|
nStage = STAGE_APPEARANCE;
|
|
else if(nChoice == 2)
|
|
nStage = STAGE_HEAD;
|
|
else if(nChoice == 3)
|
|
nStage = STAGE_WINGS;
|
|
else if(nChoice == 4)
|
|
nStage = STAGE_TAIL;
|
|
else if(nChoice == 5)
|
|
nStage = STAGE_BODYPART;
|
|
else if(nChoice == 6)
|
|
nStage = STAGE_PORTRAIT;
|
|
else if(nChoice == 7)
|
|
nStage = STAGE_EQUIPMENT;
|
|
}
|
|
else if(nStage == STAGE_APPEARANCE)
|
|
{
|
|
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
|
|
nStage = STAGE_ENTRY;
|
|
else
|
|
SetCreatureAppearanceType(oPC, nChoice);
|
|
|
|
}
|
|
else if(nStage == STAGE_HEAD)
|
|
{
|
|
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
|
|
nStage = STAGE_ENTRY;
|
|
else
|
|
{
|
|
//need to regenerate the list so go lower disappears correctly
|
|
MarkStageNotSetUp(nStage, oPC);
|
|
if(nChoice == 1)
|
|
SetCreatureBodyPart(CREATURE_PART_HEAD, 1, oPC);
|
|
else if(nChoice == 2)
|
|
SetCreatureBodyPart(CREATURE_PART_HEAD, GetCreatureBodyPart(CREATURE_PART_HEAD, oPC)+1, oPC);
|
|
else if(nChoice == 3)
|
|
SetCreatureBodyPart(CREATURE_PART_HEAD, GetCreatureBodyPart(CREATURE_PART_HEAD, oPC)-1, oPC);
|
|
}
|
|
|
|
}
|
|
else if(nStage == STAGE_WINGS)
|
|
{
|
|
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
|
|
nStage = STAGE_ENTRY;
|
|
else
|
|
SetCreatureWingType(nChoice, oPC);
|
|
|
|
}
|
|
else if(nStage == STAGE_TAIL)
|
|
{
|
|
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
|
|
nStage = STAGE_ENTRY;
|
|
else
|
|
SetCreatureTailType(nChoice, oPC);
|
|
|
|
}
|
|
else if(nStage == STAGE_BODYPART)
|
|
{
|
|
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
|
|
nStage = STAGE_ENTRY;
|
|
else
|
|
{
|
|
SetLocalInt(oPC, "BodypartToChange", nChoice);
|
|
nStage = STAGE_BODYPART_CHANGE;
|
|
}
|
|
}
|
|
else if(nStage == STAGE_BODYPART_CHANGE)
|
|
{
|
|
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
|
|
nStage = STAGE_BODYPART;
|
|
else
|
|
{
|
|
int nPart = GetLocalInt(oPC, "BodypartToChange");
|
|
if(nChoice == 1)
|
|
SetCreatureBodyPart(nPart, 1, oPC);
|
|
else if(nChoice == 2)
|
|
SetCreatureBodyPart(nPart, GetCreatureBodyPart(nPart, oPC)+1, oPC);
|
|
else if(nChoice == 3)
|
|
SetCreatureBodyPart(nPart, GetCreatureBodyPart(nPart, oPC)-1, oPC);
|
|
|
|
}
|
|
}
|
|
else if(nStage == STAGE_PORTRAIT)
|
|
{
|
|
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
|
|
nStage = STAGE_ENTRY;
|
|
else
|
|
{
|
|
string sPortraitResRef = Get2DACache("portraits", "BaseResRef", nChoice);
|
|
sPortraitResRef = GetStringLeft(sPortraitResRef, GetStringLength(sPortraitResRef)-1); //trim the trailing _
|
|
SetPortraitResRef(oPC, sPortraitResRef);
|
|
SetPortraitId(oPC, nChoice);
|
|
}
|
|
}
|
|
else if(nStage == STAGE_EQUIPMENT)
|
|
{
|
|
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
|
|
nStage = STAGE_ENTRY;
|
|
else
|
|
{
|
|
object oItem = array_get_object(oPC, "PRC_ItemsToUse", nChoice);
|
|
SetLocalObject(oPC, "PRC_ItemToUse", oItem);
|
|
//clean up the array so it regenerates properly
|
|
array_delete(oPC, "PRC_ItemsToUse");
|
|
int nBase = GetBaseItemType(oItem);
|
|
int nAppearType = StringToInt(Get2DACache("baseitems", "ModelType", nBase));
|
|
if(nAppearType == 0)
|
|
nStage = STAGE_EQUIPMENT_SIMPLE;
|
|
else if(nAppearType == 1)
|
|
nStage = STAGE_EQUIPMENT_LAYERED;
|
|
else if(nAppearType == 2)
|
|
nStage = STAGE_EQUIPMENT_COMPOSITE;
|
|
else if(nAppearType == 3)
|
|
nStage = STAGE_EQUIPMENT_ARMOR;
|
|
else
|
|
//something odd here
|
|
nStage = STAGE_ENTRY;
|
|
}
|
|
}
|
|
else if(nStage == STAGE_EQUIPMENT_SIMPLE
|
|
|| nStage == STAGE_EQUIPMENT_LAYERED
|
|
|| nStage == STAGE_EQUIPMENT_COMPOSITE
|
|
|| nStage == STAGE_EQUIPMENT_ARMOR)
|
|
{
|
|
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
|
|
nStage = STAGE_ENTRY;
|
|
else
|
|
{
|
|
object oItem = GetLocalObject(oPC, "PRC_ItemToUse");
|
|
int nSlot = -1;
|
|
int i;
|
|
for(i = 0; i<14;i++)
|
|
{
|
|
if(GetItemInSlot(i, oPC) == oItem)
|
|
nSlot = i;
|
|
}
|
|
//move to limbo
|
|
object oChest = GetObjectByTag("HEARTOFCHAOS");
|
|
object oNewItem = CopyItem(oItem, oChest, TRUE);
|
|
DestroyObject(oNewItem);
|
|
if(nStage == STAGE_EQUIPMENT_SIMPLE)
|
|
{
|
|
if(nChoice == 1) //previous
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_SIMPLE_MODEL, -1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, -1)-1, TRUE);
|
|
else if(nChoice == 2) //next
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_SIMPLE_MODEL, -1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, -1)+1, TRUE);
|
|
}
|
|
else if(nStage == STAGE_EQUIPMENT_LAYERED)
|
|
{
|
|
if(nChoice == 1) //previous appearance
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_SIMPLE_MODEL, -1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, -1)-1, TRUE);
|
|
else if(nChoice == 2) //next appearance
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_SIMPLE_MODEL, -1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, -1)+1, TRUE);
|
|
else if(nChoice == 3) //previous cloth1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1)-1, TRUE);
|
|
else if(nChoice == 4) //next cloth1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1)+1, TRUE);
|
|
else if(nChoice == 5) //previous cloth2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH2)-1, TRUE);
|
|
else if(nChoice == 6) //next cloth2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH2)+1, TRUE);
|
|
else if(nChoice == 7) //previous leather1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1)-1, TRUE);
|
|
else if(nChoice == 8) //next leather1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1)+1, TRUE);
|
|
else if(nChoice == 9) //previous leather2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER2)-1, TRUE);
|
|
else if(nChoice == 10) //next leather2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER2)+1, TRUE);
|
|
else if(nChoice == 11) //previous metal1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1)-1, TRUE);
|
|
else if(nChoice == 12) //next metal1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1)+1, TRUE);
|
|
else if(nChoice == 13) //previous metal2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2)-1, TRUE);
|
|
else if(nChoice == 14) //next metal2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2)+1, TRUE);
|
|
}
|
|
else if(nStage == STAGE_EQUIPMENT_COMPOSITE)
|
|
{
|
|
if(nChoice == 1) //previous part 1 appearance
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_BOTTOM,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_BOTTOM)-1, TRUE);
|
|
else if(nChoice == 2) //next part 1 appearance
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_BOTTOM,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_BOTTOM)+1, TRUE);
|
|
else if(nChoice == 3) //previous part 1 color
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_BOTTOM,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_BOTTOM)-1, TRUE);
|
|
else if(nChoice == 4) //next part 1 color
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_BOTTOM,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_BOTTOM)+1, TRUE);
|
|
else if(nChoice == 5) //previous part 2 appearance
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_MIDDLE,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_MIDDLE)-1, TRUE);
|
|
else if(nChoice == 6) //next part 2 appearance
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_MIDDLE,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_MIDDLE)+1, TRUE);
|
|
else if(nChoice == 7) //previous part 2 color
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_MIDDLE,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_MIDDLE)-1, TRUE);
|
|
else if(nChoice == 8) //next part 2 color
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_MIDDLE,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_MIDDLE)+1, TRUE);
|
|
else if(nChoice == 9) //previous part 3 appearance
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_TOP,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_TOP)-1, TRUE);
|
|
else if(nChoice == 10) //next part 3 appearance
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_TOP,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_WEAPON_MODEL_TOP)+1, TRUE);
|
|
else if(nChoice == 11) //previous part 3 color
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_TOP,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_TOP)-1, TRUE);
|
|
else if(nChoice == 12) //next part 3 color
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_TOP,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_COLOR_TOP)+1, TRUE);
|
|
}
|
|
else if(nStage == STAGE_EQUIPMENT_ARMOR)
|
|
{
|
|
//cant change model yet
|
|
if(nChoice == 3) //previous cloth1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1)-1, TRUE);
|
|
else if(nChoice == 4) //next cloth1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1)+1, TRUE);
|
|
else if(nChoice == 5) //previous cloth2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH2)-1, TRUE);
|
|
else if(nChoice == 6) //next cloth2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH2)+1, TRUE);
|
|
else if(nChoice == 7) //previous leather1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1)-1, TRUE);
|
|
else if(nChoice == 8) //next leather1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1)+1, TRUE);
|
|
else if(nChoice == 9) //previous leather2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER2)-1, TRUE);
|
|
else if(nChoice == 10) //next leather2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER2)+1, TRUE);
|
|
else if(nChoice == 11) //previous metal1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1)-1, TRUE);
|
|
else if(nChoice == 12) //next metal1
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1)+1, TRUE);
|
|
else if(nChoice == 13) //previous metal2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2)-1, TRUE);
|
|
else if(nChoice == 14) //next metal2
|
|
oNewItem = CopyItemAndModify(oNewItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2,
|
|
GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2)+1, TRUE);
|
|
}
|
|
//new appearance valid
|
|
if(GetIsObjectValid(oNewItem))
|
|
{
|
|
DestroyObject(oNewItem);
|
|
DestroyObject(oItem);
|
|
oNewItem = CopyItem(oNewItem, oPC, TRUE);
|
|
if(nSlot != -1)
|
|
AssignCommand(oPC, ActionEquipItem(oNewItem, nSlot));
|
|
//store the new version as the local item
|
|
//so it can be remodified
|
|
SetLocalObject(oPC, "PRC_ItemToUse", oNewItem);
|
|
}
|
|
}
|
|
}
|
|
if(nStage != nOldStage)
|
|
MarkStageNotSetUp(nStage, oPC);
|
|
// Store the stage value. If it has been changed, this clears out the choices
|
|
SetStage(nStage, oPC);
|
|
}
|
|
}
|