Files
Anphillia_PRC8/_module/nss/dlg_model.nss
Jaysyn904 28cdb617b3 Initial commit
Adding all of the current content for Anphillia Unlimited.
2024-01-04 07:49:38 -05:00

1799 lines
88 KiB
Plaintext

///////////////////////////////////////////////////////////////////////////////
// dlg_wand
// written by: eyesolated
// written at: April 12, 2018
//
// Notes: the conditional/action script for the wand dialog
///////////
// Includes
//
#include "eas_inc"
#include "dlg_inc"
#include "dlg_model_const"
#include "color_inc"
#include "chr_inc"
#include "esm_inc"
///////////////////////
// Function Declaration
//
////////////////
// Function Code
//
void PreReadArmorAC(string sArmorClass)
{
object oModule = GetModule();
string sArrayName = CS_DEF_ARRAY_ARMOR + sArmorClass;
// If the array already exists, quit
if (eas_Array_Exists(oModule, sArrayName))
return;
// Create Array
eas_Array_Create(oModule, sArrayName, EAS_ARRAY_TYPE_INTEGER);
// Cache Armor Parts
string sReadArmorClass;
int nth = 1;
while (nth <= 255)
{
sReadArmorClass = GetStringLeft(Get2DAString("parts_chest", "ACBONUS", nth), 1);
if (sReadArmorClass == sArmorClass)
eas_IArray_Entry_Add(oModule, sArrayName, nth);
nth++;
}
}
void PreReadArmorParts(int nPart)
{
object oModule = GetModule();
string sArrayName = CS_DEF_ARRAY_ARMOR_PART + IntToString(nPart);
// If the array already exists, quit
if (eas_Array_Exists(oModule, sArrayName))
return;
// Create Array
eas_Array_Create(oModule, sArrayName, EAS_ARRAY_TYPE_INTEGER);
string s2DA = "parts_";
switch (nPart) {
case ITEM_APPR_ARMOR_MODEL_LBICEP:
case ITEM_APPR_ARMOR_MODEL_RBICEP: s2DA+= "bicep"; break;
case ITEM_APPR_ARMOR_MODEL_LFOOT:
case ITEM_APPR_ARMOR_MODEL_RFOOT: s2DA+= "foot"; break;
case ITEM_APPR_ARMOR_MODEL_LFOREARM:
case ITEM_APPR_ARMOR_MODEL_RFOREARM: s2DA+= "forearm"; break;
case ITEM_APPR_ARMOR_MODEL_LHAND:
case ITEM_APPR_ARMOR_MODEL_RHAND: s2DA+= "hand"; break;
case ITEM_APPR_ARMOR_MODEL_LSHIN:
case ITEM_APPR_ARMOR_MODEL_RSHIN: s2DA+= "shin"; break;
case ITEM_APPR_ARMOR_MODEL_LSHOULDER:
case ITEM_APPR_ARMOR_MODEL_RSHOULDER: s2DA+= "shoulder"; break;
case ITEM_APPR_ARMOR_MODEL_LTHIGH:
case ITEM_APPR_ARMOR_MODEL_RTHIGH: s2DA+= "legs"; break;
case ITEM_APPR_ARMOR_MODEL_NECK: s2DA+= "neck"; break;
case ITEM_APPR_ARMOR_MODEL_BELT: s2DA+= "belt"; break;
case ITEM_APPR_ARMOR_MODEL_PELVIS: s2DA+= "pelvis"; break;
case ITEM_APPR_ARMOR_MODEL_ROBE: s2DA+= "robe"; break;
}
string sArmorClass;
string sHasModel = Get2DAString(s2DA, "HASMODEL", 1);
int nCEP = TRUE;
if (sHasModel == "")
nCEP = FALSE;
int nth= 1;
while (nth <= 255)
{
sArmorClass = Get2DAString(s2DA, "ACBONUS", nth);
sHasModel = Get2DAString(s2DA, "HASMODEL", nth);
if (sArmorClass != "" && (!nCEP || sHasModel != ""))
eas_IArray_Entry_Add(oModule, sArrayName, nth);
nth++;
}
}
void CopyItemToModel(object oItem, object oModel, int nInventorySlot)
{
if (!GetIsObjectValid(oItem))
return;
object oCopy = CopyItem(oItem, oModel, TRUE);
object oCurrentItem = GetItemInSlot(nInventorySlot, oModel);
// Store the source item on the copied item to prevent duping when buying/copying back later
SetLocalObject(oCopy, "model_ItemReference", oItem);
AssignCommand(oModel, ActionEquipItem(oCopy, nInventorySlot));
if (GetIsObjectValid(oCurrentItem) &&
GetTag(oCurrentItem) != CS_DEF_INVISIBLEWEAPON)
DelayCommand(CF_MODEL_DELAY_DESTROYWEAPON, DestroyObject(oCurrentItem));
}
string Get2da(int nBaseType)
{
switch (nBaseType)
{
case BASE_ITEM_CLOAK: return "cloakmodel"; break;
case BASE_ITEM_SMALLSHIELD: return "cepshieldmodel"; break;
case BASE_ITEM_LARGESHIELD: return "cepshieldmodel"; break;
case BASE_ITEM_TOWERSHIELD: return "cepshieldmodel"; break;
}
return "";
}
string Get2daColumn(int nBaseType)
{
switch (nBaseType)
{
case BASE_ITEM_CLOAK: return "LABEL"; break;
case BASE_ITEM_SMALLSHIELD: return "BASE_ITEM_SMALLSHIELD"; break;
case BASE_ITEM_LARGESHIELD: return "BASE_ITEM_LARGESHIELD"; break;
case BASE_ITEM_TOWERSHIELD: return "BASE_ITEM_TOWERSHIELD"; break;
}
return "";
}
int Verify2da(string s2da, string sColumn)
{
if (s2da == "" ||
sColumn == "" ||
Get2DAString(s2da, sColumn, 1) == "")
return FALSE;
return TRUE;
}
void SetColorType(object oPC, int nIndex)
{
SetLocalInt(oPC, "model_SelColType", nIndex + 1);
switch (nIndex)
{
case ITEM_APPR_ARMOR_COLOR_METAL1:
case ITEM_APPR_ARMOR_COLOR_METAL2: SetLocalInt(oPC, "model_SelColTypeMetal", TRUE); break;
}
}
int GetColorType(object oPC)
{
return (GetLocalInt(oPC, "model_SelColType") - 1);
}
void DeleteColorType(object oPC)
{
DeleteLocalInt(oPC, "model_SelColType");
DeleteLocalInt(oPC, "model_SelColTypeMetal");
}
int SetOriginalColor(object oItem, int nIndex, int nColor)
{
int nOriginal = GetLocalInt(oItem, CS_DEF_VAR_COLOR_ORIGINAL + IntToString(nIndex)) - 1;
// Set the given appearance as the original appearance if not set yet
if (nOriginal == -1)
{
nOriginal = nColor;
SetLocalInt(oItem, CS_DEF_VAR_COLOR_ORIGINAL + IntToString(nIndex), nOriginal + 1);
}
return nOriginal;
}
void ChangeWeaponColor(object oModel, int nInventorySlot, int nItemIndex, int nValue)
{
object oCurrentItem = GetItemInSlot(nInventorySlot, oModel);
if (!GetIsObjectValid(oCurrentItem))
return;
int nIndex;
switch (nItemIndex)
{
case ITEM_APPR_WEAPON_MODEL_BOTTOM: nIndex = ITEM_APPR_WEAPON_COLOR_BOTTOM; break;
case ITEM_APPR_WEAPON_MODEL_MIDDLE: nIndex = ITEM_APPR_WEAPON_COLOR_MIDDLE; break;
case ITEM_APPR_WEAPON_MODEL_TOP: nIndex = ITEM_APPR_WEAPON_COLOR_TOP; break;
}
int nStartColor = GetItemAppearance(oCurrentItem, ITEM_APPR_TYPE_WEAPON_COLOR, nIndex);
object oItem = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_WEAPON_COLOR, nIndex, nValue, TRUE);
if (GetIsObjectValid(oItem))
{
object oNewItem = CopyItem(oItem, oModel, TRUE);
DestroyObject(oItem);
AssignCommand(oModel, ActionEquipItem(oNewItem, nInventorySlot));
DelayCommand(CF_MODEL_DELAY_DESTROYWEAPON, DestroyObject(oCurrentItem));
// Check Color things
int nOriginalColor;
nOriginalColor = SetOriginalColor(oNewItem, nIndex, nStartColor);
if (nOriginalColor != nValue) // the new Color Value isn't the original color
{
if (nOriginalColor == nStartColor) // and we're at the start color
{
eas_Array_Create(oNewItem, CS_DEF_ARRAY_COLORS, EAS_ARRAY_TYPE_INTEGER);
eas_IArray_Entry_Add(oNewItem, CS_DEF_ARRAY_COLORS, nIndex); // add nIndex to the changed indices
}
SetLocalInt(oNewItem, CS_DEF_VAR_COLOR + IntToString(nIndex), nValue); // set the Appearance for index
}
else // the new Appearance is the original appearance
{
eas_IArray_Entry_DeleteByValue(oNewItem, CS_DEF_ARRAY_COLORS, nIndex); // remove nIndex from the changed indices
DeleteLocalInt(oNewItem, CS_DEF_VAR_COLOR + IntToString(nIndex));
}
}
}
void ChangeArmorColor(object oModel, int nInventorySlot, int nIndex, int nValue, int nColorType = 0)
{
object oCurrentItem = GetItemInSlot(nInventorySlot, oModel);
if (!GetIsObjectValid(oCurrentItem))
return;
SetLocalInt(oModel, "Color_LastSelected", nValue + 1);
int nCounterpart = -1;
if (nIndex < 0)
{
switch (nIndex)
{
case CI_DEF_ARMOR_SAME_BICEPS: nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_LBICEP * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; nCounterpart = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_RBICEP * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; break;
case CI_DEF_ARMOR_SAME_FEET: nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_LFOOT * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; nCounterpart = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_RFOOT * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; break;
case CI_DEF_ARMOR_SAME_FOREARMS: nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_LFOREARM * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; nCounterpart = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_RFOREARM * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; break;
case CI_DEF_ARMOR_SAME_HANDS: nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_LHAND * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; nCounterpart = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_RHAND * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; break;
case CI_DEF_ARMOR_SAME_SHINS: nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_LSHIN * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; nCounterpart = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_RSHIN * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; break;
case CI_DEF_ARMOR_SAME_SHOULDERS: nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_LSHOULDER * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; nCounterpart = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_RSHOULDER * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; break;
case CI_DEF_ARMOR_SAME_THIGHS: nIndex = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_LTHIGH * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; nCounterpart = ITEM_APPR_ARMOR_NUM_COLORS + (ITEM_APPR_ARMOR_MODEL_RTHIGH * ITEM_APPR_ARMOR_NUM_COLORS) + nColorType; break;
}
}
int nStartColor = GetItemAppearance(oCurrentItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex);
object oItem = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_ARMOR_COLOR, nIndex, nValue, TRUE);
if (nCounterpart != -1)
{
DelayCommand(CF_MODEL_DELAY_DESTROYWEAPON, DestroyObject(oItem));
oItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, nCounterpart, nValue, TRUE);
}
if (GetIsObjectValid(oItem))
{
object oNewItem = CopyItem(oItem, oModel, TRUE);
DestroyObject(oItem);
AssignCommand(oModel, ActionEquipItem(oNewItem, nInventorySlot));
DelayCommand(CF_MODEL_DELAY_DESTROYWEAPON, DestroyObject(oCurrentItem));
// Check Color things
int nOriginalColor;
if (nCounterpart != -1)
{
nOriginalColor = SetOriginalColor(oNewItem, nIndex, nStartColor);
SetOriginalColor(oNewItem, nCounterpart, nStartColor);
}
else
nOriginalColor = SetOriginalColor(oNewItem, nIndex, nStartColor);
if (nOriginalColor != nValue) // the new Color Value isn't the original color
{
if (nOriginalColor == nStartColor) // and we're at the start color
{
eas_Array_Create(oNewItem, CS_DEF_ARRAY_COLORS, EAS_ARRAY_TYPE_INTEGER);
eas_IArray_Entry_Add(oNewItem, CS_DEF_ARRAY_COLORS, nIndex); // add nIndex to the changed indices
if (nCounterpart != -1)
eas_IArray_Entry_Add(oNewItem, CS_DEF_ARRAY_COLORS, nCounterpart); // add nIndex to the changed indices
}
SetLocalInt(oNewItem, CS_DEF_VAR_COLOR + IntToString(nIndex), nValue); // set the Appearance for index
if (nCounterpart != -1)
SetLocalInt(oNewItem, CS_DEF_VAR_COLOR + IntToString(nCounterpart), nValue); // set the Appearance for the counterpart
}
else // the new Appearance is the original appearance
{
eas_IArray_Entry_DeleteByValue(oNewItem, CS_DEF_ARRAY_COLORS, nIndex); // remove nIndex from the changed indices
DeleteLocalInt(oNewItem, CS_DEF_VAR_COLOR + IntToString(nIndex));
if (nCounterpart != -1)
{
eas_IArray_Entry_DeleteByValue(oNewItem, CS_DEF_ARRAY_COLORS, nCounterpart); // remove nIndex from the changed indices
DeleteLocalInt(oNewItem, CS_DEF_VAR_COLOR + IntToString(nCounterpart));
}
}
}
}
int SetOriginalAppearance(object oItem, int nIndex, int nAppearance)
{
int nOriginal = GetLocalInt(oItem, CS_DEF_VAR_APPEARANCE_ORIGINAL + IntToString(nIndex)) - 1;
// Set the given appearance as the original appearance if not set yet
if (nOriginal == -1)
{
nOriginal = nAppearance;
SetLocalInt(oItem, CS_DEF_VAR_APPEARANCE_ORIGINAL + IntToString(nIndex), nOriginal + 1);
}
return nOriginal;
}
void ChangeItemAppearance(object oModel, int nInventorySlot, int nIndex = 0, int nChangeDirection = 1)
{
object oModule = GetModule();
object oCurrentItem = GetItemInSlot(nInventorySlot, oModel);
if (!GetIsObjectValid(oCurrentItem))
return;
int nBase = GetBaseItemType(oCurrentItem);
int nAppearance;
int nStartAppearance;
int nMin = StringToInt(Get2DAString("baseitems", "MinRange", nBase));
int nMax = StringToInt(Get2DAString("baseitems", "MaxRange", nBase));
if (nMax == 0)
nMax = 255;
int nChangesMade = 1;
object oItem;
string s2da = Get2da(nBase);
string s2daColumn = Get2daColumn(nBase);
int n2da;
string sTest;
int nPos;
string sAC;
string sArrayName;
int nArraySize;
int nRealIndex = nIndex;
int nCounterpart = -1;
object oCounterpart;
switch (nBase)
{
case BASE_ITEM_ARMOR:
if (nIndex < 0)
{
switch (nIndex)
{
case CI_DEF_ARMOR_SAME_BICEPS: nRealIndex = ITEM_APPR_ARMOR_MODEL_LBICEP; nCounterpart = ITEM_APPR_ARMOR_MODEL_RBICEP; break;
case CI_DEF_ARMOR_SAME_FEET: nRealIndex = ITEM_APPR_ARMOR_MODEL_LFOOT; nCounterpart = ITEM_APPR_ARMOR_MODEL_RFOOT; break;
case CI_DEF_ARMOR_SAME_FOREARMS: nRealIndex = ITEM_APPR_ARMOR_MODEL_LFOREARM; nCounterpart = ITEM_APPR_ARMOR_MODEL_RFOREARM; break;
case CI_DEF_ARMOR_SAME_HANDS: nRealIndex = ITEM_APPR_ARMOR_MODEL_LHAND; nCounterpart = ITEM_APPR_ARMOR_MODEL_RHAND; break;
case CI_DEF_ARMOR_SAME_SHINS: nRealIndex = ITEM_APPR_ARMOR_MODEL_LSHIN; nCounterpart = ITEM_APPR_ARMOR_MODEL_RSHIN; break;
case CI_DEF_ARMOR_SAME_SHOULDERS: nRealIndex = ITEM_APPR_ARMOR_MODEL_LSHOULDER; nCounterpart = ITEM_APPR_ARMOR_MODEL_RSHOULDER; break;
case CI_DEF_ARMOR_SAME_THIGHS: nRealIndex = ITEM_APPR_ARMOR_MODEL_LTHIGH; nCounterpart = ITEM_APPR_ARMOR_MODEL_RTHIGH; break;
}
}
nAppearance = GetItemAppearance(oCurrentItem, ITEM_APPR_TYPE_ARMOR_MODEL, nRealIndex);
nStartAppearance = nAppearance;
switch (nRealIndex)
{
case ITEM_APPR_ARMOR_MODEL_TORSO:
sAC = GetStringLeft(Get2DAString("parts_chest", "ACBONUS", nAppearance), 1);
sArrayName = CS_DEF_ARRAY_ARMOR + sAC;
PreReadArmorAC(sAC);
break;
default:
sArrayName = CS_DEF_ARRAY_ARMOR_PART + IntToString(nRealIndex);
PreReadArmorParts(nRealIndex);
break;
}
// Get the position of the current entry in the Array
nPos = eas_IArray_Entry_IndexOf(oModule, sArrayName, nAppearance);
nArraySize = eas_Array_GetSize(oModule, sArrayName);
if (nChangeDirection == 1)
{
if (nPos == nArraySize - 1)
nAppearance = eas_IArray_Entry_Get(oModule, sArrayName, 0);
else
nAppearance = eas_IArray_Entry_Get(oModule, sArrayName, nPos + 1);
}
else
{
if (nPos == 0)
nAppearance = eas_IArray_Entry_Get(oModule, sArrayName, nArraySize - 1);
else
nAppearance = eas_IArray_Entry_Get(oModule, sArrayName, nPos - 1);
}
if (nIndex < 0)
{
switch (nIndex)
{
case CI_DEF_ARMOR_SAME_BICEPS:
oCounterpart = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LBICEP, nAppearance, TRUE);
oItem = CopyItemAndModify(oCounterpart, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_RBICEP, nAppearance, TRUE);
break;
case CI_DEF_ARMOR_SAME_FEET:
oCounterpart = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LFOOT, nAppearance, TRUE);
oItem = CopyItemAndModify(oCounterpart, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_RFOOT, nAppearance, TRUE);
break;
case CI_DEF_ARMOR_SAME_FOREARMS:
oCounterpart = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LFOREARM, nAppearance, TRUE);
oItem = CopyItemAndModify(oCounterpart, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_RFOREARM, nAppearance, TRUE);
break;
case CI_DEF_ARMOR_SAME_HANDS:
oCounterpart = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LHAND, nAppearance, TRUE);
oItem = CopyItemAndModify(oCounterpart, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_RHAND, nAppearance, TRUE);
break;
case CI_DEF_ARMOR_SAME_SHINS:
oCounterpart = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LSHIN, nAppearance, TRUE);
oItem = CopyItemAndModify(oCounterpart, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_RSHIN, nAppearance, TRUE);
break;
case CI_DEF_ARMOR_SAME_SHOULDERS:
oCounterpart = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LSHOULDER, nAppearance, TRUE);
oItem = CopyItemAndModify(oCounterpart, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_RSHOULDER, nAppearance, TRUE);
break;
case CI_DEF_ARMOR_SAME_THIGHS:
oCounterpart = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LTHIGH, nAppearance, TRUE);
oItem = CopyItemAndModify(oCounterpart, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_RTHIGH, nAppearance, TRUE);
break;
}
DelayCommand(CF_MODEL_DELAY_DESTROYWEAPON, DestroyObject(oCounterpart));
}
else
oItem = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_ARMOR_MODEL, nRealIndex, nAppearance, TRUE);
break;
case BASE_ITEM_HELMET:
// Helmets need no 2da-checks
nAppearance = GetItemAppearance(oCurrentItem, ITEM_APPR_TYPE_ARMOR_MODEL, 0);
nStartAppearance = nAppearance;
do {
if ( nChangeDirection == 1 ) {
if ( ++nAppearance > nMax ) nAppearance = nMin;
} else {
if ( --nAppearance < nMin ) nAppearance = nMax;
}
oItem = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_ARMOR_MODEL, 0, nAppearance, TRUE);
} while ( !GetIsObjectValid(oItem) );
break;
case BASE_ITEM_CLOAK:
// Test 2da availability
n2da = Verify2da(s2da, s2daColumn);
nAppearance = GetItemAppearance(oCurrentItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0);
nStartAppearance = nAppearance;
if (n2da)
{
do {
if ( nChangeDirection == 1 ) {
if ( ++nAppearance > nMax ) nAppearance = nMin;
} else {
if ( --nAppearance < nMin ) nAppearance = nMax;
}
sTest = Get2DAString(s2da, s2daColumn, nAppearance);
} while (sTest == "" & nAppearance != nStartAppearance);
oItem = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppearance, TRUE);
}
else
{
do {
if ( nChangeDirection == 1 ) {
if ( ++nAppearance > nMax ) nAppearance = nMin;
} else {
if ( --nAppearance < nMin ) nAppearance = nMax;
}
oItem = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppearance, TRUE);
} while (!GetIsObjectValid(oItem));
}
break;
case BASE_ITEM_SMALLSHIELD:
case BASE_ITEM_LARGESHIELD:
case BASE_ITEM_TOWERSHIELD:
// Test 2da availability
n2da = Verify2da(s2da, s2daColumn);
nAppearance = GetItemAppearance(oCurrentItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0);
nStartAppearance = nAppearance;
if (n2da)
{
do {
if ( nChangeDirection == 1 ) {
if ( ++nAppearance > nMax ) nAppearance = nMin;
} else {
if ( --nAppearance < nMin ) nAppearance = nMax;
}
sTest = Get2DAString(s2da, s2daColumn, nAppearance);
} while (sTest == "" & nAppearance != nStartAppearance);
oItem = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppearance, TRUE);
}
else
{
do {
if ( nChangeDirection == 1 ) {
if ( ++nAppearance > nMax ) nAppearance = nMin;
} else {
if ( --nAppearance < nMin ) nAppearance = nMax;
}
oItem = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppearance, TRUE);
} while (!GetIsObjectValid(oItem));
}
break;
default: // Weapons
// Weapons need no 2da-checks
nMin /= 10;
nMax /= 10;
nAppearance = GetItemAppearance(oCurrentItem, ITEM_APPR_TYPE_WEAPON_MODEL, nIndex);
nStartAppearance = nAppearance;
do {
if ( nChangeDirection == 1 ) {
if ( ++nAppearance > nMax ) nAppearance = nMin;
} else {
if ( --nAppearance < nMin ) nAppearance = nMax;
}
oItem = CopyItemAndModify(oCurrentItem, ITEM_APPR_TYPE_WEAPON_MODEL, nIndex, nAppearance, TRUE);
} while ( !GetIsObjectValid(oItem) );
break;
break;
}
if (GetIsObjectValid(oItem))
{
object oNewItem = CopyItem(oItem, oModel, TRUE);
DestroyObject(oItem);
AssignCommand(oModel, ActionEquipItem(oNewItem, nInventorySlot));
DelayCommand(CF_MODEL_DELAY_DESTROYWEAPON, DestroyObject(oCurrentItem));
// Check appearance things
int nOriginalAppearance;
if (nIndex < 0)
{
nOriginalAppearance = SetOriginalAppearance(oNewItem, nRealIndex, nStartAppearance);
SetOriginalAppearance(oNewItem, nCounterpart, nStartAppearance);
// Set nIndex to the Real Index now
nIndex = nRealIndex;
}
else
nOriginalAppearance = SetOriginalAppearance(oNewItem, nIndex, nStartAppearance);
if (nOriginalAppearance != nAppearance) // the new Appearance isn't the original appearance
{
if (nOriginalAppearance == nStartAppearance) // and we're at the start appearance
{
eas_Array_Create(oNewItem, CS_DEF_ARRAY_CHANGES, EAS_ARRAY_TYPE_INTEGER);
eas_IArray_Entry_Add(oNewItem, CS_DEF_ARRAY_CHANGES, nIndex); // add nIndex to the changed indices
if (nCounterpart != -1)
eas_IArray_Entry_Add(oNewItem, CS_DEF_ARRAY_CHANGES, nCounterpart); // add nIndex to the changed indices
}
SetLocalInt(oNewItem, CS_DEF_VAR_CHANGE + IntToString(nIndex), nAppearance); // set the Appearance for index
if (nCounterpart != -1)
SetLocalInt(oNewItem, CS_DEF_VAR_CHANGE + IntToString(nCounterpart), nAppearance); // set the Appearance for the counterpart
}
else // the new Appearance is the original appearance
{
eas_IArray_Entry_DeleteByValue(oNewItem, CS_DEF_ARRAY_CHANGES, nIndex); // remove nIndex from the changed indices
DeleteLocalInt(oNewItem, CS_DEF_VAR_CHANGE + IntToString(nIndex));
if (nCounterpart != -1)
{
eas_IArray_Entry_DeleteByValue(oNewItem, CS_DEF_ARRAY_CHANGES, nCounterpart); // remove nIndex from the changed indices
DeleteLocalInt(oNewItem, CS_DEF_VAR_CHANGE + IntToString(nCounterpart));
}
}
}
}
void CheckColor(object oItem, object oTargetItem, int nMainIndex, int nIndex)
{
int nAppearance = GetItemAppearance(oItem, nMainIndex, nIndex);
if (nAppearance != GetItemAppearance(oTargetItem, nMainIndex, nIndex))
{
eas_IArray_Entry_Add(oItem, CS_DEF_ARRAY_COLORS_ANALYZE, nIndex);
SetLocalInt(oItem, CS_DEF_VAR_COLOR_ANALYZE + IntToString(nIndex), nAppearance);
}
}
void Analyze(object oItem, object oTargetItem, int nMainIndex, int nMainIndexColor, int nIndex, int nIndexColor = -1)
{
int nAppearance = GetItemAppearance(oItem, nMainIndex, nIndex);
if (nAppearance != GetItemAppearance(oTargetItem, nMainIndex, nIndex))
{
eas_IArray_Entry_Add(oItem, CS_DEF_ARRAY_CHANGES_ANALYZE, nIndex);
SetLocalInt(oItem, CS_DEF_VAR_CHANGE_ANALYZE + IntToString(nIndex), nAppearance);
}
if (nMainIndexColor == ITEM_APPR_TYPE_ARMOR_COLOR)
{
int nBaseType = GetBaseItemType(oItem);
switch (nBaseType)
{
case BASE_ITEM_ARMOR:
if (nIndex == -1) // Non-Individual Colors of Armor
{
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_CLOTH1);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_CLOTH2);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_LEATHER1);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_LEATHER2);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_METAL1);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_METAL2);
}
else // Individual Colors of Armor
{
/* Impossible at this time because of a bug in GetItemAppearance
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + ITEM_APPR_ARMOR_COLOR_CLOTH1);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + ITEM_APPR_ARMOR_COLOR_CLOTH2);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + ITEM_APPR_ARMOR_COLOR_LEATHER1);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + ITEM_APPR_ARMOR_COLOR_LEATHER2);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + ITEM_APPR_ARMOR_COLOR_METAL1);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + ITEM_APPR_ARMOR_COLOR_METAL2);
*/
}
break;
default:
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_CLOTH1);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_CLOTH2);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_LEATHER1);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_LEATHER2);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_METAL1);
CheckColor(oItem, oTargetItem, nMainIndexColor, ITEM_APPR_ARMOR_COLOR_METAL2);
break;
}
}
else if (nMainIndexColor == ITEM_APPR_TYPE_WEAPON_COLOR)
CheckColor(oItem, oTargetItem, nMainIndexColor, nIndexColor);
}
int GetChangeCount(object oItem, object oTargetItem)
{
if (GetLocalObject(oItem, "model_ItemReference") == oTargetItem)
return eas_Array_GetSize(oItem, CS_DEF_ARRAY_CHANGES);
else if (GetLocalObject(oItem, CS_DEF_ARRAY_ANALYZEREFERENCE) == oTargetItem)
return eas_Array_GetSize(oItem, CS_DEF_ARRAY_CHANGES_ANALYZE);
else
{
// Create the array if it doesn't exist yet
eas_Array_Create(oItem, CS_DEF_ARRAY_CHANGES_ANALYZE, EAS_ARRAY_TYPE_INTEGER);
// Delete the array's entries
eas_Array_Delete(oItem, CS_DEF_ARRAY_CHANGES_ANALYZE, FALSE);
// Analyze changes
int nBaseType = GetBaseItemType(oItem);
int nAppearance;
switch (nBaseType)
{
case BASE_ITEM_ARMOR:
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, -1);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_BELT);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_LBICEP);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_LFOOT);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_LFOREARM);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_LHAND);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_LSHIN);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_LSHOULDER);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_LTHIGH);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_NECK);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_PELVIS);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_RBICEP);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_RFOOT);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_RFOREARM);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_RHAND);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_ROBE);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_RSHIN);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_RSHOULDER);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_RTHIGH);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_MODEL_TORSO);
break;
case BASE_ITEM_CLOAK:
case BASE_ITEM_HELMET:
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_TYPE_ARMOR_COLOR, 0);
break;
case BASE_ITEM_SMALLSHIELD:
case BASE_ITEM_LARGESHIELD:
case BASE_ITEM_TOWERSHIELD:
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_SIMPLE_MODEL, -1, 0);
break;
default:
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_MODEL_BOTTOM, ITEM_APPR_WEAPON_COLOR_BOTTOM);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_MODEL_MIDDLE, ITEM_APPR_WEAPON_COLOR_MIDDLE);
Analyze(oItem, oTargetItem, ITEM_APPR_TYPE_WEAPON_MODEL, ITEM_APPR_TYPE_WEAPON_COLOR, ITEM_APPR_WEAPON_MODEL_TOP, ITEM_APPR_WEAPON_COLOR_TOP);
break;
}
// Set the TargetItem as the Analyze Reference
SetLocalObject(oItem, CS_DEF_ARRAY_ANALYZEREFERENCE, oTargetItem);
// Return the analyzation result
return eas_Array_GetSize(oItem, CS_DEF_ARRAY_CHANGES_ANALYZE);
}
}
int GetColorChangeCount(object oItem, object oTargetItem)
{
if (GetLocalObject(oItem, "model_ItemReference") == oTargetItem)
return eas_Array_GetSize(oItem, CS_DEF_ARRAY_COLORS);
else if (GetLocalObject(oItem, CS_DEF_ARRAY_ANALYZEREFERENCE) == oTargetItem)
return eas_Array_GetSize(oItem, CS_DEF_ARRAY_COLORS_ANALYZE);
else
return 0;
}
int GetChangeCost_Gold(object oItem)
{
return (GetLocalInt(oItem, "model_chgcost_gld"));
}
int CalculateChangeCost_Color(object oItem, object oTargetItem)
{
if (GetLocalInt(GetItemPossessor(oItem), CS_MODEL_COST_NODYE) == 1) // No color cost
return 0;
else
return GetColorChangeCount(oItem, oTargetItem);
}
int CalculateChangeCost_Gold(object oItem, object oTargetItem)
{
if (!GetIsObjectValid(oItem))
return 0;
int nChangeCount = GetChangeCount(oItem, oTargetItem);
int nMultiplier;
int nOverride;
int nBaseType = GetBaseItemType(oItem);
int nAC;
switch (nBaseType)
{
case BASE_ITEM_ARMOR:
nAC = StringToInt(GetStringLeft(Get2DAString("parts_chest", "ACBONUS", GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_TORSO)), 1));
nOverride = GetLocalInt(GetItemPossessor(oItem), CS_MODEL_COST_PER_CHANGE_GOLD_ARMOR_OVERRIDE);
if (nOverride != 0)
{
if (nOverride == -1)
nMultiplier = 0;
else
nMultiplier = nOverride;
}
else
nMultiplier = CI_MODEL_COST_PER_CHANGE_GOLD_ARMOR * (nAC + 1);
break;
case BASE_ITEM_CLOAK:
nOverride = GetLocalInt(GetItemPossessor(oItem), CS_MODEL_COST_PER_CHANGE_GOLD_CLOAK_OVERRIDE);
if (nOverride != 0)
{
if (nOverride == -1)
nMultiplier = 0;
else
nMultiplier = nOverride;
}
else
nMultiplier = CI_MODEL_COST_PER_CHANGE_GOLD_CLOAK;
break;
case BASE_ITEM_HELMET:
nOverride = GetLocalInt(GetItemPossessor(oItem), CS_MODEL_COST_PER_CHANGE_GOLD_HELMET_OVERRIDE);
if (nOverride != 0)
{
if (nOverride == -1)
nMultiplier = 0;
else
nMultiplier = nOverride;
}
else
nMultiplier = CI_MODEL_COST_PER_CHANGE_GOLD_HELMET;
break;
case BASE_ITEM_SMALLSHIELD:
nOverride = GetLocalInt(GetItemPossessor(oItem), CS_MODEL_COST_PER_CHANGE_GOLD_SHIELD_OVERRIDE);
if (nOverride != 0)
{
if (nOverride == -1)
nMultiplier = 0;
else
nMultiplier = nOverride;
}
else
nMultiplier = CI_MODEL_COST_PER_CHANGE_GOLD_SHIELD * 1;
break;
case BASE_ITEM_LARGESHIELD:
nOverride = GetLocalInt(GetItemPossessor(oItem), CS_MODEL_COST_PER_CHANGE_GOLD_SHIELD_OVERRIDE);
if (nOverride != 0)
{
if (nOverride == -1)
nMultiplier = 0;
else
nMultiplier = nOverride;
}
else
nMultiplier = CI_MODEL_COST_PER_CHANGE_GOLD_SHIELD * 2;
break;
case BASE_ITEM_TOWERSHIELD:
nOverride = GetLocalInt(GetItemPossessor(oItem), CS_MODEL_COST_PER_CHANGE_GOLD_SHIELD_OVERRIDE);
if (nOverride != 0)
{
if (nOverride == -1)
nMultiplier = 0;
else
nMultiplier = nOverride;
}
else
nMultiplier = CI_MODEL_COST_PER_CHANGE_GOLD_SHIELD * 3;
break;
default:
nOverride = GetLocalInt(GetItemPossessor(oItem), CS_MODEL_COST_PER_CHANGE_GOLD_WEAPON_OVERRIDE);
if (nOverride != 0)
{
if (nOverride == -1)
nMultiplier = 0;
else
nMultiplier = nOverride;
}
else
nMultiplier = CI_MODEL_COST_PER_CHANGE_GOLD_WEAPON;
break;
}
SetLocalInt(oItem, "model_chgcost_gld", nChangeCount * nMultiplier);
return (nChangeCount * nMultiplier);
}
int hasItemInSlot(object oCreature, int nInventorySlot, int nHasToBeShield = FALSE)
{
object oItem = GetItemInSlot(nInventorySlot, oCreature);
int nBase = GetBaseItemType(oItem);
return (GetIsObjectValid(oItem) &&
GetTag(oItem) != CS_DEF_INVISIBLEWEAPON &&
(!nHasToBeShield ||
nBase == BASE_ITEM_SMALLSHIELD ||
nBase == BASE_ITEM_LARGESHIELD ||
nBase == BASE_ITEM_TOWERSHIELD));
}
int GetIsItemPartIdentical(object oItem, int nItemType, int nIndex_A, int nIndex_B)
{
int nItemAppearance_A = GetItemAppearance(oItem, nItemType, nIndex_A);
int nItemAppearance_B = GetItemAppearance(oItem, nItemType, nIndex_B);
return (nItemAppearance_A == nItemAppearance_B);
}
void SetItemSlot(object oPC, int nItemSlot, int nIsShield = FALSE)
{
SetLocalInt(oPC, "model_SelSlot", nItemSlot + 1);
SetLocalInt(oPC, "model_Sel_isShield", nIsShield);
}
int GetItemSlot(object oPC)
{
return (GetLocalInt(oPC, "model_SelSlot") - 1);
}
void DeleteItemSlot(object oPC)
{
DeleteLocalInt(oPC, "model_SelSlot");
DeleteLocalInt(oPC, "model_Sel_isShield");
}
int GetItemSlotUsesIndex(object oPC)
{
int nItemSlot = GetItemSlot(oPC);
int nIsShield = GetLocalInt(oPC, "model_Sel_isShield");
if (nItemSlot != -1 &&
(nItemSlot == INVENTORY_SLOT_CHEST ||
(nItemSlot == INVENTORY_SLOT_LEFTHAND && !nIsShield) ||
nItemSlot == INVENTORY_SLOT_RIGHTHAND))
return TRUE;
return FALSE;
}
void SetItemIndex(object oPC, int nIndex)
{
SetLocalInt(oPC, "model_SelIndex", nIndex + 1);
}
int GetItemIndex(object oPC)
{
return (GetLocalInt(oPC, "model_SelIndex") - 1);
}
void DeleteItemIndex(object oPC)
{
DeleteLocalInt(oPC, "model_SelIndex");
}
string GetPartName_Armor(int nIndex)
{
switch (nIndex)
{
case ITEM_APPR_ARMOR_MODEL_BELT: return "Belt"; break;
case ITEM_APPR_ARMOR_MODEL_LBICEP: return "Left Biceps"; break;
case ITEM_APPR_ARMOR_MODEL_RBICEP: return "Right Biceps"; break;
case CI_DEF_ARMOR_SAME_BICEPS: return "Both Biceps"; break;
case ITEM_APPR_ARMOR_MODEL_LFOOT: return "Left Foot"; break;
case ITEM_APPR_ARMOR_MODEL_RFOOT: return "Right Foot"; break;
case CI_DEF_ARMOR_SAME_FEET: return "Both Feet"; break;
case ITEM_APPR_ARMOR_MODEL_LFOREARM: return "Left Forearm"; break;
case ITEM_APPR_ARMOR_MODEL_RFOREARM: return "Right Forearm"; break;
case CI_DEF_ARMOR_SAME_FOREARMS: return "Both Forearms"; break;
case ITEM_APPR_ARMOR_MODEL_LHAND: return "Left Hand"; break;
case ITEM_APPR_ARMOR_MODEL_RHAND: return "Right Hand"; break;
case CI_DEF_ARMOR_SAME_HANDS: return "Both Hands"; break;
case ITEM_APPR_ARMOR_MODEL_NECK: return "Neck"; break;
case ITEM_APPR_ARMOR_MODEL_PELVIS: return "Pelvis"; break;
case ITEM_APPR_ARMOR_MODEL_ROBE: return "Robe"; break;
case ITEM_APPR_ARMOR_MODEL_LSHIN: return "Left Shin"; break;
case ITEM_APPR_ARMOR_MODEL_RSHIN: return "Right Shin"; break;
case CI_DEF_ARMOR_SAME_SHINS: return "Both Shins"; break;
case ITEM_APPR_ARMOR_MODEL_LSHOULDER: return "Left Shoulder"; break;
case ITEM_APPR_ARMOR_MODEL_RSHOULDER: return "Right Shoulder"; break;
case CI_DEF_ARMOR_SAME_SHOULDERS: return "Both Shoulders"; break;
case ITEM_APPR_ARMOR_MODEL_LTHIGH: return "Left Thigh"; break;
case ITEM_APPR_ARMOR_MODEL_RTHIGH: return "Right Thigh"; break;
case CI_DEF_ARMOR_SAME_THIGHS: return "Both Thighs"; break;
case ITEM_APPR_ARMOR_MODEL_TORSO: return "Torso"; break;
}
return "";
}
string GetPartName_Weapon(int nIndex)
{
switch (nIndex)
{
case ITEM_APPR_WEAPON_MODEL_BOTTOM: return "Bottom"; break;
case ITEM_APPR_WEAPON_MODEL_MIDDLE: return "Middle"; break;
case ITEM_APPR_WEAPON_MODEL_TOP: return "Top"; break;
}
return "";
}
string GetCostText(int nGoldCost, int nColorChanges)
{
string sDyes = CS_MODEL_DYE_NAME;
if (nGoldCost > 0)
{
if (CS_MODEL_ITEM_COLORING != "" &&
nColorChanges > 0)
return (" (" + color_ConvertString(IntToString(nGoldCost), COLOR_YELLOW) + " gold, " + color_ConvertString(IntToString(nColorChanges), COLOR_CYAN) + " " + sDyes + ")");
else
return (" (" + color_ConvertString(IntToString(nGoldCost), COLOR_YELLOW) + " gold)");
}
else if (CS_MODEL_ITEM_COLORING != "" &&
nColorChanges > 0)
return (" (" + color_ConvertString(IntToString(nColorChanges), COLOR_CYAN) + " " + sDyes + ")");
else
return "";
}
void EquipInvisibleWeapon(object oModel)
{
object oInvisibleWeapon = GetItemPossessedBy(oModel, CS_DEF_INVISIBLEWEAPON);
if (!GetIsObjectValid(oInvisibleWeapon))
{
// Create it
oInvisibleWeapon = CreateItemOnObject("nw_wswdg001", oModel, 1, CS_DEF_INVISIBLEWEAPON);
SetHiddenWhenEquipped(oInvisibleWeapon, TRUE);
}
AssignCommand(oModel, ActionEquipItem(oInvisibleWeapon, INVENTORY_SLOT_RIGHTHAND));
}
void BuyItemAppearance(object oSource, object oTarget, int nSlot, int nDesignOnly)
{
object oSourceItem = GetItemInSlot(nSlot, oSource);
object oTargetItem = GetItemInSlot(nSlot, oTarget);
// If source or target object is invalid, return
// Also return if source item is our invisible weapon
if (!GetIsObjectValid(oSourceItem) ||
GetTag(oSourceItem) == CS_DEF_INVISIBLEWEAPON)
return;
if (!GetIsObjectValid(oTargetItem))
{
SendMessageToPC(oTarget, "You have no item equipped to copy the appearance of [" + color_ConvertString(GetName(oSourceItem), COLOR_GREY) + "] to.");
return;
}
// Gold
int nGoldCost = CalculateChangeCost_Gold(oSourceItem, oTargetItem);
if (nGoldCost > GetGold(oTarget))
{
SendMessageToPC(oTarget, "You can't afford to buy the appearance for [" + color_ConvertString(GetName(oTargetItem), COLOR_GREY) + "].");
return;
}
// Dyes
int nth;
if (CS_MODEL_ITEM_COLORING != "" &&
!nDesignOnly && // No color costs when only buying the designs
GetLocalInt(oSource, CS_MODEL_COST_NODYE) != 1)
{
int nColorChanges = GetColorChangeCount(oSourceItem, oTargetItem);
int nDyeCount = 0;
object oDye = GetFirstItemInInventory(oTarget);
while (GetIsObjectValid(oDye) &&
nDyeCount < nColorChanges)
{
if (GetTag(oDye) == CS_MODEL_ITEM_COLORING)
{
nDyeCount++;
SetLocalObject(oSourceItem, "model_dyeref" + IntToString(nDyeCount), oDye);
}
oDye = GetNextItemInInventory(oTarget);
}
if (nDyeCount < nColorChanges)
{
SendMessageToPC(oTarget, "You do not have enough dye to color [" + GetName(oTargetItem) + "].");
return;
}
else
{
for (nth = 1; nth <= nColorChanges; nth++)
{
DestroyObject(GetLocalObject(oSourceItem, "model_dyeref" + IntToString(nth)));
DeleteLocalInt(oSourceItem, "model_dyeref" + IntToString(nth));
}
}
}
// Take gold
TakeGoldFromCreature(nGoldCost, oTarget, TRUE);
object oCopySource = CopyItem(oTargetItem, oSource, TRUE);
object oCreatedItem = oCopySource;
// Get Base Item Type and Appearance Type
int nBaseType = GetBaseItemType(oSourceItem);
int nAppearanceType;
int nColorType;
switch (nBaseType)
{
case BASE_ITEM_ARMOR:
case BASE_ITEM_HELMET: nAppearanceType = ITEM_APPR_TYPE_ARMOR_MODEL; nColorType = ITEM_APPR_TYPE_ARMOR_COLOR; break;
case BASE_ITEM_CLOAK: nAppearanceType = ITEM_APPR_TYPE_SIMPLE_MODEL; nColorType = ITEM_APPR_TYPE_ARMOR_COLOR; break;
case BASE_ITEM_SMALLSHIELD:
case BASE_ITEM_LARGESHIELD:
case BASE_ITEM_TOWERSHIELD: nAppearanceType = ITEM_APPR_TYPE_SIMPLE_MODEL; break;
default: nAppearanceType = ITEM_APPR_TYPE_WEAPON_MODEL; nColorType = ITEM_APPR_TYPE_WEAPON_COLOR; break;
}
// Is our TargetItem the item that was used to create oSourceItem?
// If so, use the fast way to modify by only touching the changed parts
if (GetLocalObject(oSourceItem, "model_ItemReference") == oTargetItem)
{
int nAppearanceChanges = GetChangeCount(oSourceItem, oTargetItem);
int nColorChanges = GetColorChangeCount(oSourceItem, oTargetItem);
// Do every appearance change
int nIndex;
int nAppearance;
for (nth = 0; nth < nAppearanceChanges; nth++)
{
// Get the nth appearance change
nIndex = eas_IArray_Entry_Get(oSourceItem, CS_DEF_ARRAY_CHANGES, nth);
nAppearance = GetLocalInt(oSourceItem, CS_DEF_VAR_CHANGE + IntToString(nIndex));
oCreatedItem = CopyItemAndModify(oCopySource, nAppearanceType, nIndex, nAppearance, TRUE);
DestroyObject(oCopySource);
oCopySource = oCreatedItem;
}
// Do every color change
if (!nDesignOnly)
{
for (nth = 0; nth < nColorChanges; nth++)
{
// Get the nth appearance change
nIndex = eas_IArray_Entry_Get(oSourceItem, CS_DEF_ARRAY_COLORS, nth);
nAppearance = GetLocalInt(oSourceItem, CS_DEF_VAR_COLOR + IntToString(nIndex));
oCreatedItem = CopyItemAndModify(oCopySource, nColorType, nIndex, nAppearance, TRUE);
DestroyObject(oCopySource);
oCopySource = oCreatedItem;
}
}
// Put the new item into Target Item Possessor'S inventory
object oPC = GetItemPossessor(oTargetItem);
object oNew = CopyItem(oCreatedItem, oPC, TRUE);
DestroyObject(oCreatedItem);
if (nSlot == INVENTORY_SLOT_RIGHTHAND)
{
// Set PC uncommandable to avoid errors
SetCommandable(FALSE, oPC);
DelayCommand(0.2f, SetCommandable(TRUE, oPC));
EquipInvisibleWeapon(oSource);
DelayCommand(CF_MODEL_DELAY_DESTROYWEAPON, DestroyObject(oSourceItem));
DelayCommand(0.1f, DestroyObject(oTargetItem));
}
else
{
DestroyObject(oSourceItem);
DestroyObject(oTargetItem);
}
AssignCommand(oPC, ActionEquipItem(oNew, nSlot));
}
else
{
// If the target slot is chest, make sure the AC of both items is the same
if (nSlot == INVENTORY_SLOT_CHEST)
{
int nSourceAC = StringToInt(GetStringLeft(Get2DAString("parts_chest", "ACBONUS", GetItemAppearance(oSourceItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_TORSO)), 1));
int nTargetAC = StringToInt(GetStringLeft(Get2DAString("parts_chest", "ACBONUS", GetItemAppearance(oTargetItem, ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_TORSO)), 1));
if (nSourceAC != nTargetAC)
return;
}
int nAppearanceChanges = GetChangeCount(oSourceItem, oTargetItem);
int nColorChanges = GetColorChangeCount(oSourceItem, oTargetItem);
// Do every appearance change
int nth;
int nIndex;
int nAppearance;
for (nth = 0; nth < nAppearanceChanges; nth++)
{
// Get the nth appearance change
nIndex = eas_IArray_Entry_Get(oSourceItem, CS_DEF_ARRAY_CHANGES_ANALYZE, nth);
nAppearance = GetLocalInt(oSourceItem, CS_DEF_VAR_CHANGE_ANALYZE + IntToString(nIndex));
oCreatedItem = CopyItemAndModify(oCopySource, nAppearanceType, nIndex, nAppearance, TRUE);
DestroyObject(oCopySource);
oCopySource = oCreatedItem;
}
// Do every color change
if (!nDesignOnly)
{
for (nth = 0; nth < nColorChanges; nth++)
{
// Get the nth appearance change
nIndex = eas_IArray_Entry_Get(oSourceItem, CS_DEF_ARRAY_COLORS_ANALYZE, nth);
nAppearance = GetLocalInt(oSourceItem, CS_DEF_VAR_COLOR_ANALYZE + IntToString(nIndex));
oCreatedItem = CopyItemAndModify(oCopySource, nColorType, nIndex, nAppearance, TRUE);
DestroyObject(oCopySource);
oCopySource = oCreatedItem;
}
}
// Put the new item into Target Item Possessor'S inventory
object oPC = GetItemPossessor(oTargetItem);
object oNew = CopyItem(oCreatedItem, oPC, TRUE);
DestroyObject(oCreatedItem);
if (nSlot == INVENTORY_SLOT_RIGHTHAND)
{
// Set PC uncommandable to avoid errors
SetCommandable(FALSE, oPC);
DelayCommand(0.2f, SetCommandable(TRUE, oPC));
EquipInvisibleWeapon(oSource);
DelayCommand(CF_MODEL_DELAY_DESTROYWEAPON, DestroyObject(oSourceItem));
DelayCommand(0.1f, DestroyObject(oTargetItem));
}
else
{
DestroyObject(oSourceItem);
DestroyObject(oTargetItem);
}
AssignCommand(oPC, ActionEquipItem(oNew, nSlot));
}
}
void main()
{
object oPC = OBJECT_SELF;
object oNPC = GetLocalObject(oPC, CS_DLG_PC_CONVERSATIONNPC);
int nConditional = GetLocalInt(oPC, CS_DLG_PC_CONDITIONAL_ID);
int nAction = GetLocalInt(oPC, CS_DLG_PC_ACTION_ID);
string sNodeText = GetLocalString(oPC, CS_DLG_PC_NODETEXT);
object oAdditional = GetLocalObject(oPC, CS_DLG_PC_ADDITIONALOBJECT);
int nSlot;
int nIndex;
int nColor;
string sColor;
int nGoldCost;
int nColorChanges;
switch (nConditional)
{
case -1: SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE); break;
case CI_CONDITION_MODEL_HAS_HELMET: SetLocalInt(oPC, CS_DLG_PC_RESULT, hasItemInSlot(oNPC, INVENTORY_SLOT_HEAD)); break;
case CI_CONDITION_MODEL_HAS_ARMOR: SetLocalInt(oPC, CS_DLG_PC_RESULT, hasItemInSlot(oNPC, INVENTORY_SLOT_CHEST)); break;
case CI_CONDITION_MODEL_HAS_WEAPON_LEFT: SetLocalInt(oPC, CS_DLG_PC_RESULT, (hasItemInSlot(oNPC, INVENTORY_SLOT_LEFTHAND) && !hasItemInSlot(oNPC, INVENTORY_SLOT_LEFTHAND, TRUE))); break;
case CI_CONDITION_MODEL_HAS_WEAPON_RIGHT: SetLocalInt(oPC, CS_DLG_PC_RESULT, hasItemInSlot(oNPC, INVENTORY_SLOT_RIGHTHAND)); break;
case CI_CONDITION_MODEL_HAS_SHIELD: SetLocalInt(oPC, CS_DLG_PC_RESULT, hasItemInSlot(oNPC, INVENTORY_SLOT_LEFTHAND, TRUE)); break;
case CI_CONDITION_MODEL_HAS_CLOAK: SetLocalInt(oPC, CS_DLG_PC_RESULT, hasItemInSlot(oNPC, INVENTORY_SLOT_CLOAK)); break;
case CI_CONDITION_PC_HAS_CLOAK: SetLocalInt(oPC, CS_DLG_PC_RESULT, hasItemInSlot(oPC, INVENTORY_SLOT_CLOAK)); break;
case CI_CONDITION_PC_HAS_ARMOR: SetLocalInt(oPC, CS_DLG_PC_RESULT, hasItemInSlot(oPC, INVENTORY_SLOT_CHEST)); break;
case CI_CONDITION_PC_HAS_HELMET: SetLocalInt(oPC, CS_DLG_PC_RESULT, hasItemInSlot(oPC, INVENTORY_SLOT_HEAD)); break;
case CI_CONDITION_PC_HAS_SHIELD: SetLocalInt(oPC, CS_DLG_PC_RESULT, hasItemInSlot(oPC, INVENTORY_SLOT_LEFTHAND, TRUE)); break;
case CI_CONDITION_PC_HAS_WEAPON_LEFT: SetLocalInt(oPC, CS_DLG_PC_RESULT, (hasItemInSlot(oPC, INVENTORY_SLOT_LEFTHAND) && !hasItemInSlot(oPC, INVENTORY_SLOT_LEFTHAND, TRUE))); break;
case CI_CONDITION_PC_HAS_WEAPON_RIGHT: SetLocalInt(oPC, CS_DLG_PC_RESULT, hasItemInSlot(oPC, INVENTORY_SLOT_RIGHTHAND)); break;
case CI_CONDITION_ARMOR_SAME_BICEPS: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetIsItemPartIdentical(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC), ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LBICEP, ITEM_APPR_ARMOR_MODEL_RBICEP)); break;
case CI_CONDITION_ARMOR_SAME_FEET: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetIsItemPartIdentical(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC), ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LFOOT, ITEM_APPR_ARMOR_MODEL_RFOOT)); break;
case CI_CONDITION_ARMOR_SAME_FOREARMS: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetIsItemPartIdentical(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC), ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LFOREARM, ITEM_APPR_ARMOR_MODEL_RFOREARM)); break;
case CI_CONDITION_ARMOR_SAME_HANDS: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetIsItemPartIdentical(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC), ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LHAND, ITEM_APPR_ARMOR_MODEL_RHAND)); break;
case CI_CONDITION_ARMOR_SAME_SHINS: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetIsItemPartIdentical(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC), ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LSHIN, ITEM_APPR_ARMOR_MODEL_RSHIN)); break;
case CI_CONDITION_ARMOR_SAME_SHOULDERS: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetIsItemPartIdentical(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC), ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LSHOULDER, ITEM_APPR_ARMOR_MODEL_RSHOULDER)); break;
case CI_CONDITION_ARMOR_SAME_THIGHS: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetIsItemPartIdentical(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC), ITEM_APPR_TYPE_ARMOR_MODEL, ITEM_APPR_ARMOR_MODEL_LTHIGH, ITEM_APPR_ARMOR_MODEL_RTHIGH)); break;
case CI_CONDITION_OVERRIDE_BUY_ALL:
nGoldCost = CalculateChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_CLOAK, oNPC), GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC));
nColorChanges = CalculateChangeCost_Color(GetItemInSlot(INVENTORY_SLOT_CLOAK, oNPC), GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC));
nGoldCost += CalculateChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC), GetItemInSlot(INVENTORY_SLOT_CHEST, oPC));
nColorChanges += CalculateChangeCost_Color(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC), GetItemInSlot(INVENTORY_SLOT_CHEST, oPC));
nGoldCost += CalculateChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_HEAD, oNPC), GetItemInSlot(INVENTORY_SLOT_HEAD, oPC));
nColorChanges += CalculateChangeCost_Color(GetItemInSlot(INVENTORY_SLOT_HEAD, oNPC), GetItemInSlot(INVENTORY_SLOT_HEAD, oPC));
nGoldCost += CalculateChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC), GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC));
nColorChanges += CalculateChangeCost_Color(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC), GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC));
if (hasItemInSlot(oNPC, INVENTORY_SLOT_RIGHTHAND))
{
nGoldCost += CalculateChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC), GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC));
nColorChanges += CalculateChangeCost_Color(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC), GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC));
}
dlg_OverrideNodeText(oPC, "All" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
break;
case CI_CONDITION_OVERRIDE_BUY_CLOAK:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_CLOAK))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_CLOAK, oNPC));
nColorChanges = CalculateChangeCost_Color(GetItemInSlot(INVENTORY_SLOT_CLOAK, oNPC), GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC));
dlg_OverrideNodeText(oPC, "Cloak" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_BUY_ARMOR:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_CHEST))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC));
nColorChanges = CalculateChangeCost_Color(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC), GetItemInSlot(INVENTORY_SLOT_CHEST, oPC));
dlg_OverrideNodeText(oPC, "Armor / Clothing" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_BUY_HELMET:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_HEAD))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_HEAD, oNPC));
nColorChanges = CalculateChangeCost_Color(GetItemInSlot(INVENTORY_SLOT_HEAD, oNPC), GetItemInSlot(INVENTORY_SLOT_HEAD, oPC));
dlg_OverrideNodeText(oPC, "Helmet" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_BUY_SHIELD:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_LEFTHAND, TRUE))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC));
nColorChanges = 0; // Can't change shield colors
dlg_OverrideNodeText(oPC, "Shield (" + color_ConvertString(IntToString(nGoldCost), COLOR_YELLOW) + " gold)");
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_BUY_WEAPON_LEFT:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_LEFTHAND) &&
!hasItemInSlot(oNPC, INVENTORY_SLOT_LEFTHAND, TRUE))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC));
nColorChanges = CalculateChangeCost_Color(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC), GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC));
dlg_OverrideNodeText(oPC, "Weapon (Left)" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_BUY_WEAPON_RIGHT:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_RIGHTHAND))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC));
nColorChanges = CalculateChangeCost_Color(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC), GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC));
dlg_OverrideNodeText(oPC, "Weapon (Right)" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_BUY_DESIGN_ALL:
nGoldCost = CalculateChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_CLOAK, oNPC), GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC));
nGoldCost += CalculateChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC), GetItemInSlot(INVENTORY_SLOT_CHEST, oPC));
nGoldCost += CalculateChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_HEAD, oNPC), GetItemInSlot(INVENTORY_SLOT_HEAD, oPC));
nGoldCost += CalculateChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC), GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC));
if (hasItemInSlot(oNPC, INVENTORY_SLOT_RIGHTHAND))
{
nGoldCost += CalculateChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC), GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC));
}
dlg_OverrideNodeText(oPC, "All" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
break;
case CI_CONDITION_OVERRIDE_BUY_DESIGN_CLOAK:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_CLOAK))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_CLOAK, oNPC));
dlg_OverrideNodeText(oPC, "Cloak" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_BUY_DESIGN_ARMOR:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_CHEST))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC));
dlg_OverrideNodeText(oPC, "Armor / Clothing" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_BUY_DESIGN_HELMET:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_HEAD))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_HEAD, oNPC));
dlg_OverrideNodeText(oPC, "Helmet" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_BUY_DESIGN_SHIELD:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_LEFTHAND, TRUE))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC));
nColorChanges = 0; // Can't change shield colors
dlg_OverrideNodeText(oPC, "Shield (" + color_ConvertString(IntToString(nGoldCost), COLOR_YELLOW) + " gold)");
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_BUY_DESIGN_WEAPON_LEFT:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_LEFTHAND) &&
!hasItemInSlot(oNPC, INVENTORY_SLOT_LEFTHAND, TRUE))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC));
dlg_OverrideNodeText(oPC, "Weapon (Left)" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_BUY_DESIGN_WEAPON_RIGHT:
if (hasItemInSlot(oNPC, INVENTORY_SLOT_RIGHTHAND))
{
nGoldCost = GetChangeCost_Gold(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC));
dlg_OverrideNodeText(oPC, "Weapon (Right)" + GetCostText(nGoldCost, nColorChanges));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_CHANGE_ITEM:
nSlot = GetItemSlot(oPC);
if (nSlot != -1)
{
nIndex = GetItemIndex(oPC);
if (nIndex == -1 ||
nIndex == CI_DEF_ARMOR_ALL)
dlg_OverrideNodeText(oPC, "What do you want to do with [" + color_ConvertString(GetStringByStrRef(StringToInt(Get2DAString("baseitems", "Name", GetBaseItemType(GetItemInSlot(nSlot, oNPC))))), COLOR_ORANGE) + "]?");
else if (GetItemSlot(oPC) == INVENTORY_SLOT_CHEST)
dlg_OverrideNodeText(oPC, "What do you want to do with [" + color_ConvertString(GetPartName_Armor(GetItemIndex(oPC)), COLOR_GREY) + "] of [" + color_ConvertString(GetStringByStrRef(StringToInt(Get2DAString("baseitems", "Name", GetBaseItemType(GetItemInSlot(nSlot, oNPC))))), COLOR_ORANGE) + "]?");
else
dlg_OverrideNodeText(oPC, "What do you want to do with [" + color_ConvertString(GetPartName_Weapon(GetItemIndex(oPC)), COLOR_GREY) + "] of [" + color_ConvertString(GetStringByStrRef(StringToInt(Get2DAString("baseitems", "Name", GetBaseItemType(GetItemInSlot(nSlot, oNPC))))), COLOR_ORANGE) + "]?");
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
}
else
SetLocalInt(oPC, CS_DLG_PC_RESULT, FALSE);
break;
case CI_CONDITION_OVERRIDE_REMOVE_ITEM:
nSlot = GetItemSlot(oPC);
dlg_OverrideNodeText(oPC, "Remove [" + color_ConvertString(GetStringByStrRef(StringToInt(Get2DAString("baseitems", "Name", GetBaseItemType(GetItemInSlot(nSlot, oNPC))))), COLOR_ORANGE) + "] from Model");
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
break;
case CI_CONDITION_SELECTED_NOT_SHIELD: SetLocalInt(oPC, CS_DLG_PC_RESULT, !GetLocalInt(oPC, "model_Sel_isShield")); break;
case CI_CONDITION_SELECTED_NO_INDEX: SetLocalInt(oPC, CS_DLG_PC_RESULT, !GetItemSlotUsesIndex(oPC)); break;
case CI_CONDITION_SELECTED_INDEX: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetItemSlotUsesIndex(oPC)); break;
case CI_CONDITION_SELECTED_ARMOR: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetItemSlot(oPC) == INVENTORY_SLOT_CHEST); break;
case CI_CONDITION_SELECTED_WEAPON_LEFT: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetItemSlot(oPC) == INVENTORY_SLOT_LEFTHAND && !GetLocalInt(oPC, "model_Sel_isShield")); break;
case CI_CONDITION_SELECTED_WEAPON_RIGHT: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetItemSlot(oPC) == INVENTORY_SLOT_RIGHTHAND); break;
case CI_CONDITION_SELECTED_WEAPON: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetItemSlot(oPC) == INVENTORY_SLOT_RIGHTHAND || (GetItemSlot(oPC) == INVENTORY_SLOT_LEFTHAND && !GetLocalInt(oPC, "model_Sel_isShield"))); break;
case CI_CONDITION_SELECTED_NOWEAPON: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetItemSlot(oPC) != INVENTORY_SLOT_RIGHTHAND && (GetItemSlot(oPC) != INVENTORY_SLOT_LEFTHAND || GetLocalInt(oPC, "model_Sel_isShield"))); break;
case CI_CONDITION_SELECTED_ARMOR_PART_ALL: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetItemIndex(oPC) == CI_DEF_ARMOR_ALL); break;
case CI_CONDITION_NOTSELECTED_ARMOR_PART_ALL: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetItemIndex(oPC) != CI_DEF_ARMOR_ALL); break;
case CI_CONDITION_COLOR_WEAPON:
nIndex = GetItemIndex(oPC);
switch (nIndex)
{
case ITEM_APPR_WEAPON_MODEL_BOTTOM: nIndex = ITEM_APPR_WEAPON_COLOR_BOTTOM; break;
case ITEM_APPR_WEAPON_MODEL_MIDDLE: nIndex = ITEM_APPR_WEAPON_COLOR_MIDDLE; break;
case ITEM_APPR_WEAPON_MODEL_TOP: nIndex = ITEM_APPR_WEAPON_COLOR_TOP; break;
}
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_WEAPON_COLOR, nIndex);
if (IntToString(nColor) == GetStringRight(sNodeText, 1))
dlg_OverrideNodeText(oPC, color_ConvertString(sNodeText, COLOR_GREEN));
SetLocalInt(oPC, CS_DLG_PC_RESULT, TRUE);
break;
case CI_CONDITION_SELECTED_NOWEAPON_OVERRIDE_COLOR:
SetLocalInt(oPC, CS_DLG_PC_RESULT, GetItemSlot(oPC) != INVENTORY_SLOT_RIGHTHAND && (GetItemSlot(oPC) != INVENTORY_SLOT_LEFTHAND || GetLocalInt(oPC, "model_Sel_isShield")));
if (GetLocalInt(oNPC, "Color_LastSelected") -1 != -1) // Cheat to get the correct color after the PC selected a color
{
if (GetLocalInt(oPC, "model_SelColTypeMetal") == TRUE) // Metal color
sColor = GetColorName(CI_DEF_COLOR_INDEX_METAL, GetLocalInt(oNPC, "Color_LastSelected") -1);
else
sColor = GetColorName(CI_DEF_COLOR_INDEX_CLOTHLEATHER, GetLocalInt(oNPC, "Color_LastSelected") -1);
DeleteLocalInt(oNPC, "Color_LastSelected");
}
else
{
nIndex = GetItemIndex(oPC);
switch (nIndex)
{
case CI_DEF_ARMOR_ALL:
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, GetColorType(oPC));
break;
default:
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC));
break;
}
if (GetLocalInt(oPC, "model_SelColTypeMetal") == TRUE) // Metal color
sColor = GetColorName(CI_DEF_COLOR_INDEX_METAL, nColor);
else
sColor = GetColorName(CI_DEF_COLOR_INDEX_CLOTHLEATHER, nColor);
}
dlg_OverrideNodeText(oPC, "Choose a color [Current: " + color_ConvertString(sColor, COLOR_GREEN) + "]");
break;
case CI_CONDITION_COLOR_NONMETAL:
nIndex = GetItemIndex(oPC);
switch (nIndex)
{
case CI_DEF_ARMOR_ALL:
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, GetColorType(oPC));
break;
default:
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC));
break;
}
sColor = GetColorName(CI_DEF_COLOR_INDEX_CLOTHLEATHER, nColor);
if (sColor == sNodeText)
dlg_OverrideNodeText(oPC, color_ConvertString(sNodeText, COLOR_GREEN));
SetLocalInt(oPC, CS_DLG_PC_RESULT, !GetLocalInt(oPC, "model_SelColTypeMetal")); break;
case CI_CONDITION_COLOR_METAL:
nIndex = GetItemIndex(oPC);
switch (nIndex)
{
case CI_DEF_ARMOR_ALL:
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, GetColorType(oPC));
break;
default:
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC));
break;
}
sColor = GetColorName(CI_DEF_COLOR_INDEX_METAL, nColor);
if (sColor == sNodeText)
dlg_OverrideNodeText(oPC, color_ConvertString(sNodeText, COLOR_GREEN));
SetLocalInt(oPC, CS_DLG_PC_RESULT, GetLocalInt(oPC, "model_SelColTypeMetal")); break;
case CI_CONDITION_COLOR_TYPE_NOTSELECTED: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetColorType(oPC) == -1); break;
case CI_CONDITION_SELECTED_ARMORPART_SPECIFIC: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetItemIndex(oPC) < CI_DEF_ARMOR_ALL && GetItemSlot(oPC) == INVENTORY_SLOT_CHEST); break;
case CI_CONDITION_NOTSELECTED_ARMORPART_SPECIFIC: SetLocalInt(oPC, CS_DLG_PC_RESULT, GetItemIndex(oPC) == CI_DEF_ARMOR_ALL || GetItemSlot(oPC) != INVENTORY_SLOT_CHEST); break;
}
// Actions
if (nAction >= CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_CLOTHLEATHER &&
nAction <= CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_CLOTHLEATHER + 175)
{
nIndex = GetItemIndex(oPC);
if (nIndex < CI_DEF_ARMOR_ALL)
ChangeArmorColor(oNPC, GetItemSlot(oPC), nIndex, nAction - CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_CLOTHLEATHER, GetColorType(oPC));
else
{
switch (nIndex)
{
case CI_DEF_ARMOR_ALL: ChangeArmorColor(oNPC, GetItemSlot(oPC), GetColorType(oPC), nAction - CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_CLOTHLEATHER); break;
default: ChangeArmorColor(oNPC, GetItemSlot(oPC), ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC), nAction - CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_CLOTHLEATHER); break;
}
}
return;
}
else if (nAction >= CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_METAL &&
nAction <= CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_METAL + 175)
{
nIndex = GetItemIndex(oPC);
if (nIndex < CI_DEF_ARMOR_ALL)
ChangeArmorColor(oNPC, GetItemSlot(oPC), nIndex, nAction - CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_METAL, GetColorType(oPC));
else
{
switch (nIndex)
{
case CI_DEF_ARMOR_ALL: ChangeArmorColor(oNPC, GetItemSlot(oPC), GetColorType(oPC), nAction - CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_METAL); break;
default: ChangeArmorColor(oNPC, GetItemSlot(oPC), ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC), nAction - CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_METAL); break;
}
}
return;
}
object oItem;
switch (nAction)
{
case -1: break;
case CI_ACTION_MODEL_INITIALIZE:
if (!GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC)))
EquipInvisibleWeapon(oNPC);
break;
case CI_ACTION_MODEL_CLONE_APPEARANCE: SetCreatureAppearanceType(oNPC, GetAppearanceType(oPC)); break;
case CI_ACTION_MODEL_CHANGE_HELMET: SetItemSlot(oPC, INVENTORY_SLOT_HEAD); break;
case CI_ACTION_MODEL_CHANGE_ARMOR: SetItemSlot(oPC, INVENTORY_SLOT_CHEST); break;
case CI_ACTION_MODEL_CHANGE_WEAPON_LEFT: SetItemSlot(oPC, INVENTORY_SLOT_LEFTHAND); break;
case CI_ACTION_MODEL_CHANGE_WEAPON_RIGHT: SetItemSlot(oPC, INVENTORY_SLOT_RIGHTHAND); break;
case CI_ACTION_MODEL_CHANGE_SHIELD: SetItemSlot(oPC, INVENTORY_SLOT_LEFTHAND, TRUE); break;
case CI_ACTION_MODEL_CHANGE_CLOAK: SetItemSlot(oPC, INVENTORY_SLOT_CLOAK); break;
case CI_ACTION_APPEARANCE_TYPE_DWARF: SetCreatureAppearanceType(oNPC, APPEARANCE_TYPE_DWARF); break;
case CI_ACTION_APPEARANCE_TYPE_ELF: SetCreatureAppearanceType(oNPC, APPEARANCE_TYPE_ELF); break;
case CI_ACTION_APPEARANCE_TYPE_GNOME: SetCreatureAppearanceType(oNPC, APPEARANCE_TYPE_GNOME); break;
case CI_ACTION_APPEARANCE_TYPE_HALFELF: SetCreatureAppearanceType(oNPC, APPEARANCE_TYPE_HALF_ELF); break;
case CI_ACTION_APPEARANCE_TYPE_HALFLING: SetCreatureAppearanceType(oNPC, APPEARANCE_TYPE_HALFLING); break;
case CI_ACTION_APPEARANCE_TYPE_HALFORC: SetCreatureAppearanceType(oNPC, APPEARANCE_TYPE_HALF_ORC); break;
case CI_ACTION_APPEARANCE_TYPE_HUMAN: SetCreatureAppearanceType(oNPC, APPEARANCE_TYPE_HUMAN); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_BELT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_BELT); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_BICEPS_LEFT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_LBICEP); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_BICEPS_RIGHT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_RBICEP); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_BICEPS_BOTH: SetItemIndex(oPC, CI_DEF_ARMOR_SAME_BICEPS); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_FOOT_LEFT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_LFOOT); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_FOOT_RIGHT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_RFOOT); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_FOOT_BOTH: SetItemIndex(oPC, CI_DEF_ARMOR_SAME_FEET); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_FOREARM_LEFT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_LFOREARM); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_FOREARM_RIGHT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_RFOREARM); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_FOREARM_BOTH: SetItemIndex(oPC, CI_DEF_ARMOR_SAME_FOREARMS); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_HAND_LEFT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_LHAND); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_HAND_RIGHT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_RHAND); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_HAND_BOTH: SetItemIndex(oPC, CI_DEF_ARMOR_SAME_HANDS); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_NECK: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_NECK); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_PELVIS: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_PELVIS); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_ROBE: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_ROBE); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_SHIN_LEFT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_LSHIN); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_SHIN_RIGHT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_RSHIN); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_SHIN_BOTH: SetItemIndex(oPC, CI_DEF_ARMOR_SAME_SHINS); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_SHOULDER_LEFT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_LSHOULDER); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_SHOULDER_RIGHT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_RSHOULDER); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_SHOULDER_BOTH: SetItemIndex(oPC, CI_DEF_ARMOR_SAME_SHOULDERS); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_THIGH_LEFT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_LTHIGH); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_THIGH_RIGHT: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_RTHIGH); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_THIGH_BOTH: SetItemIndex(oPC, CI_DEF_ARMOR_SAME_THIGHS); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_TORSO: SetItemIndex(oPC, ITEM_APPR_ARMOR_MODEL_TORSO); break;
case CI_ACTION_MODEL_CHANGE_ARMOR_ALL: SetItemIndex(oPC, CI_DEF_ARMOR_ALL); break;
case CI_ACTION_MODEL_CHANGE_WEAPON_BOTTOM: SetItemIndex(oPC, ITEM_APPR_WEAPON_MODEL_BOTTOM); break;
case CI_ACTION_MODEL_CHANGE_WEAPON_MIDDLE: SetItemIndex(oPC, ITEM_APPR_WEAPON_MODEL_MIDDLE); break;
case CI_ACTION_MODEL_CHANGE_WEAPON_TOP: SetItemIndex(oPC, ITEM_APPR_WEAPON_MODEL_TOP); break;
case CI_ACTION_MODEL_COPY_ALL:
CopyItemToModel(GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC), oNPC, INVENTORY_SLOT_CLOAK);
CopyItemToModel(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC), oNPC, INVENTORY_SLOT_CHEST);
CopyItemToModel(GetItemInSlot(INVENTORY_SLOT_HEAD, oPC), oNPC, INVENTORY_SLOT_HEAD);
CopyItemToModel(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC), oNPC, INVENTORY_SLOT_LEFTHAND);
CopyItemToModel(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC), oNPC, INVENTORY_SLOT_RIGHTHAND);
break;
case CI_ACTION_MODEL_COPY_CLOAK: CopyItemToModel(GetItemInSlot(INVENTORY_SLOT_CLOAK, oPC), oNPC, INVENTORY_SLOT_CLOAK); break;
case CI_ACTION_MODEL_COPY_ARMOR: CopyItemToModel(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC), oNPC, INVENTORY_SLOT_CHEST); break;
case CI_ACTION_MODEL_COPY_HELMET: CopyItemToModel(GetItemInSlot(INVENTORY_SLOT_HEAD, oPC), oNPC, INVENTORY_SLOT_HEAD); break;
case CI_ACTION_MODEL_COPY_SHIELD: CopyItemToModel(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC), oNPC, INVENTORY_SLOT_LEFTHAND); break;
case CI_ACTION_MODEL_COPY_WEAPON_LEFT: CopyItemToModel(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC), oNPC, INVENTORY_SLOT_LEFTHAND); break;
case CI_ACTION_MODEL_COPY_WEAPON_RIGHT: CopyItemToModel(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC), oNPC, INVENTORY_SLOT_RIGHTHAND); break;
case CI_ACTION_MODEL_SELECT_COLOR_ARMOR_CLOTH1: SetColorType(oPC, ITEM_APPR_ARMOR_COLOR_CLOTH1); break;
case CI_ACTION_MODEL_SELECT_COLOR_ARMOR_CLOTH2: SetColorType(oPC, ITEM_APPR_ARMOR_COLOR_CLOTH2); break;
case CI_ACTION_MODEL_SELECT_COLOR_ARMOR_LEATHER1: SetColorType(oPC, ITEM_APPR_ARMOR_COLOR_LEATHER1); break;
case CI_ACTION_MODEL_SELECT_COLOR_ARMOR_LEATHER2: SetColorType(oPC, ITEM_APPR_ARMOR_COLOR_LEATHER2); break;
case CI_ACTION_MODEL_SELECT_COLOR_ARMOR_METAL1: SetColorType(oPC, ITEM_APPR_ARMOR_COLOR_METAL1); break;
case CI_ACTION_MODEL_SELECT_COLOR_ARMOR_METAL2: SetColorType(oPC, ITEM_APPR_ARMOR_COLOR_METAL2); break;
case CI_ACTION_COLOR_WEAPON_1: ChangeWeaponColor(oNPC, GetItemSlot(oPC), GetItemIndex(oPC), 1); break;
case CI_ACTION_COLOR_WEAPON_2: ChangeWeaponColor(oNPC, GetItemSlot(oPC), GetItemIndex(oPC), 2); break;
case CI_ACTION_COLOR_WEAPON_3: ChangeWeaponColor(oNPC, GetItemSlot(oPC), GetItemIndex(oPC), 3); break;
case CI_ACTION_COLOR_WEAPON_4: ChangeWeaponColor(oNPC, GetItemSlot(oPC), GetItemIndex(oPC), 4); break;
case CI_ACTION_BUY_ALL:
BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_CLOAK, FALSE);
BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_CHEST, FALSE);
BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_HEAD, FALSE);
BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_LEFTHAND, FALSE);
BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_RIGHTHAND, FALSE);
break;
case CI_ACTION_BUY_CLOAK: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_CLOAK, FALSE); break;
case CI_ACTION_BUY_ARMOR: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_CHEST, FALSE); break;
case CI_ACTION_BUY_HELMET: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_HEAD, FALSE); break;
case CI_ACTION_BUY_SHIELD: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_LEFTHAND, FALSE); break;
case CI_ACTION_BUY_WEAPON_LEFT: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_LEFTHAND, FALSE); break;
case CI_ACTION_BUY_WEAPON_RIGHT: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_RIGHTHAND, FALSE); break;
case CI_ACTION_BUY_DESIGN_ALL:
BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_CLOAK, TRUE);
BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_CHEST, TRUE);
BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_HEAD, TRUE);
BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_LEFTHAND, TRUE);
BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_RIGHTHAND, TRUE);
break;
case CI_ACTION_BUY_DESIGN_CLOAK: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_CLOAK, TRUE); break;
case CI_ACTION_BUY_DESIGN_ARMOR: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_CHEST, TRUE); break;
case CI_ACTION_BUY_DESIGN_HELMET: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_HEAD, TRUE); break;
case CI_ACTION_BUY_DESIGN_SHIELD: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_LEFTHAND, TRUE); break;
case CI_ACTION_BUY_DESIGN_WEAPON_LEFT: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_LEFTHAND, TRUE); break;
case CI_ACTION_BUY_DESIGN_WEAPON_RIGHT: BuyItemAppearance(oNPC, oPC, INVENTORY_SLOT_RIGHTHAND, TRUE); break;
case CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_NEXT:
nIndex = GetItemIndex(oPC);
if (nIndex < CI_DEF_ARMOR_ALL)
{
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC));
nColor++;
if (nColor > 175)
nColor = 0;
ChangeArmorColor(oNPC, GetItemSlot(oPC), nIndex, nColor, GetColorType(oPC));
}
else
{
switch (nIndex)
{
case CI_DEF_ARMOR_ALL:
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, GetColorType(oPC));
nColor++;
if (nColor > 175)
nColor = 0;
ChangeArmorColor(oNPC, GetItemSlot(oPC), GetColorType(oPC), nColor); break;
default:
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC));
nColor++;
if (nColor > 175)
nColor = 0;
ChangeArmorColor(oNPC, GetItemSlot(oPC), ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC), nColor); break;
}
}
break;
case CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_PREVIOUS:
nIndex = GetItemIndex(oPC);
if (nIndex < CI_DEF_ARMOR_ALL)
{
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC));
nColor--;
if (nColor < 0)
nColor = 175;
ChangeArmorColor(oNPC, GetItemSlot(oPC), nIndex, nColor, GetColorType(oPC));
}
else
{
switch (nIndex)
{
case CI_DEF_ARMOR_ALL:
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, GetColorType(oPC));
nColor--;
if (nColor < 0)
nColor = 175;
ChangeArmorColor(oNPC, GetItemSlot(oPC), GetColorType(oPC), nColor); break;
default:
nColor = GetItemAppearance(GetItemInSlot(GetItemSlot(oPC), oNPC), ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC));
nColor--;
if (nColor < 0)
nColor = 175;
ChangeArmorColor(oNPC, GetItemSlot(oPC), ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC), nColor); break;
}
}
break;
case CI_ACTION_MODEL_SELECT_COLOR_SPECIFIC_ORIGINAL:
nIndex = GetItemIndex(oPC);
if (nIndex < CI_DEF_ARMOR_ALL)
{
nColor = GetLocalInt(GetItemInSlot(GetItemSlot(oPC), oNPC), CS_DEF_VAR_COLOR_ORIGINAL + IntToString(ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC))) - 1;
if (nColor != -1)
ChangeArmorColor(oNPC, GetItemSlot(oPC), nIndex, nColor, GetColorType(oPC));
}
else
{
switch (nIndex)
{
case CI_DEF_ARMOR_ALL:
nColor = GetLocalInt(GetItemInSlot(GetItemSlot(oPC), oNPC), CS_DEF_VAR_COLOR_ORIGINAL + IntToString(GetColorType(oPC))) - 1;
if (nColor != -1)
ChangeArmorColor(oNPC, GetItemSlot(oPC), GetColorType(oPC), nColor); break;
default:
nColor = GetLocalInt(GetItemInSlot(GetItemSlot(oPC), oNPC), CS_DEF_VAR_COLOR_ORIGINAL + IntToString(ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC))) - 1;
if (nColor != -1)
ChangeArmorColor(oNPC, GetItemSlot(oPC), ITEM_APPR_ARMOR_NUM_COLORS + (nIndex * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC), nColor); break;
}
}
break;
/* Unused
case CI_ACTION_MODEL_REMOVE_ITEM:
if (GetItemSlot(oPC) == INVENTORY_SLOT_RIGHTHAND)
{
oItem = GetItemInSlot(GetItemSlot(oPC), oNPC);
EquipInvisibleWeapon(oNPC);
DelayCommand(CF_MODEL_DELAY_DESTROYWEAPON, DestroyObject(oItem));
}
else
DestroyObject(GetItemInSlot(GetItemSlot(oPC), oNPC));
DeleteItemSlot(oPC);
break;
*/
case CI_ACTION_MODEL_REMOVE_ALL:
DestroyObject(GetItemInSlot(INVENTORY_SLOT_CLOAK, oNPC));
DestroyObject(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC));
DestroyObject(GetItemInSlot(INVENTORY_SLOT_HEAD, oNPC));
DestroyObject(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC));
oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC);
if (GetTag(oItem) != CS_DEF_INVISIBLEWEAPON)
{
EquipInvisibleWeapon(oNPC);
DelayCommand(CF_MODEL_DELAY_DESTROYWEAPON, DestroyObject(oItem));
}
break;
case CI_ACTION_MODEL_REMOVE_CLOAK: DestroyObject(GetItemInSlot(INVENTORY_SLOT_CLOAK, oNPC)); break;
case CI_ACTION_MODEL_REMOVE_ARMOR: DestroyObject(GetItemInSlot(INVENTORY_SLOT_CHEST, oNPC)); break;
case CI_ACTION_MODEL_REMOVE_HELMET: DestroyObject(GetItemInSlot(INVENTORY_SLOT_HEAD, oNPC)); break;
case CI_ACTION_MODEL_REMOVE_SHIELD: DestroyObject(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC)); break;
case CI_ACTION_MODEL_REMOVE_WEAPON_LEFT: DestroyObject(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oNPC)); break;
case CI_ACTION_MODEL_REMOVE_WEAPON_RIGHT:
oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oNPC);
EquipInvisibleWeapon(oNPC);
DelayCommand(CF_MODEL_DELAY_DESTROYWEAPON, DestroyObject(oItem));
break;
case CI_ACTION_MODEL_APPEARANCE_NEXT: ChangeItemAppearance(oNPC, GetItemSlot(oPC), GetItemIndex(oPC), 1); break;
case CI_ACTION_MODEL_APPEARANCE_PREVIOUS: ChangeItemAppearance(oNPC, GetItemSlot(oPC), GetItemIndex(oPC), -1); break;
case CI_ACTION_REMOVE_SELECTION_ITEM: DeleteItemSlot(oPC); DeleteItemIndex(oPC); break;
case CI_ACTION_REMOVE_SELECTION_INDEX: DeleteItemIndex(oPC); break;
case CI_ACTION_REMOVE_COLOR_TYPE: DeleteColorType(oPC); break;
case CI_ACTION_MODEL_REMOVE_INDIVIDUAL_COLOR:
nIndex = GetItemIndex(oPC);
if (nIndex < CI_DEF_ARMOR_ALL)
{
ChangeArmorColor(oNPC, GetItemSlot(oPC), nIndex, 255, GetColorType(oPC));
}
else
ChangeArmorColor(oNPC, GetItemSlot(oPC), ITEM_APPR_ARMOR_NUM_COLORS + (GetItemIndex(oPC) * ITEM_APPR_ARMOR_NUM_COLORS) + GetColorType(oPC), 255);
break;
}
}