PRC8/nwn/nwnprc/trunk/scripts/codi_s2_ancdaic.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
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.
2024-02-11 14:01:05 -05:00

704 lines
31 KiB
Plaintext

//:://////////////////////////////////////////////
//:: Samurai Ancestral Daisho conversation
//:: codi_s2_ancdaic
//:://////////////////////////////////////////////
/** @file
@author Primogenitor
@date Created - 2006.01.24
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "prc_alterations"
#include "inc_dynconv"
//////////////////////////////////////////////////
/* Constant defintions */
//////////////////////////////////////////////////
const int STAGE_ENTRY = 0;
const int STAGE_IMPROVE = 1;
const int STAGE_IMPROVE_TYPE = 2;
const int STAGE_IMPROVE_SUB_TYPE = 3;
const int STAGE_IMPROVE_PARAM1 = 4;
const int STAGE_IMPROVE_VALUE = 5;
const int STAGE_IMPROVE_ADD = 6;
const int ERROR_CODE_5_FIX =1;
const int CHOICE_RETURN_TO_PREVIOUS = 0xFFFFFFFF;
//////////////////////////////////////////////////
/* Aid functions */
//////////////////////////////////////////////////
//////////////////////////////////////////////////
/* Main function */
//////////////////////////////////////////////////
void main()
{
object oPC = GetPCSpeaker();
/* Get the value of the local variable set by the conversation script calling
* this script. Values:
* DYNCONV_ABORTED Conversation aborted
* DYNCONV_EXITED Conversation exited via the exit node
* DYNCONV_SETUP_STAGE System's reply turn
* 0 Error - something else called the script
* Other The user made a choice
*/
int nValue = GetLocalInt(oPC, DYNCONV_VARIABLE);
// The stage is used to determine the active conversation node.
// 0 is the entry node.
int nStage = GetStage(oPC);
// Check which of the conversation scripts called the scripts
if(nValue == 0) // All of them set the DynConv_Var to non-zero value, so something is wrong -> abort
return;
if(nValue == DYNCONV_SETUP_STAGE)
{
// Check if this stage is marked as already set up
// This stops list duplication when scrolling
if(!GetIsStageSetUp(nStage, oPC))
{
// variable named nStage determines the current conversation node
// Function SetHeader to set the text displayed to the PC
// Function AddChoice to add a response option for the PC. The responses are show in order added
if(nStage == STAGE_ENTRY)
{
SetHeader("You have invoked the power of your ancestral daisho. What would you like to do?");
AddChoice("[Sacrifice one or more items]", 1, oPC);
AddChoice("[Improve an ancestral weapon]", 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_IMPROVE)
{
SetHeader("Which type of weapon would you like to improve?");
AddChoice("[Katana]", 1, oPC);
AddChoice("[Wakizashi (short sword)]", 2, oPC);
AddChoice("Go back.", CHOICE_RETURN_TO_PREVIOUS, 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_IMPROVE_TYPE)
{
SetHeader("Which type of itemproperty do you wish to add?");
AddChoice("Go back.", CHOICE_RETURN_TO_PREVIOUS, oPC);
int nRow = 0;
string sLabel = Get2DACache("itempropdef", "Label", nRow);
while(sLabel != "")
{
int bIsValid = StringToInt(Get2DACache("itemprops", "0_Melee", nRow));
if(bIsValid)
{
int nStrRef = StringToInt(Get2DACache("itemprops", "StringRef", nRow));
if(nStrRef && !GetPRCSwitch(PRC_SAMURAI_BAN_+IntToString(nRow)+"_*_*_*"))
AddChoice(GetStringByStrRef(nStrRef), nRow, oPC);
}
nRow++;
sLabel = Get2DACache("itempropdef", "Label", nRow);
}
}
else if(nStage == STAGE_IMPROVE_SUB_TYPE)
{
int nType = GetLocalInt(oPC, "codi_ancdai_type");
SetHeader("Which subtype of itemproperty do you wish to add?");
AddChoice("Go back.", CHOICE_RETURN_TO_PREVIOUS, oPC);
string sSubTypeResRef = Get2DACache("itempropdef", "SubTypeResRef", nType);
int i;
for(i=0;i<200;i++)
{
int nStrRef = StringToInt(Get2DACache(sSubTypeResRef, "Name", i));
if(nStrRef != 0)
{
if(!GetPRCSwitch(PRC_SAMURAI_BAN_+IntToString(nType)+"_"+IntToString(i)+"_*_*"))
AddChoice(GetStringByStrRef(nStrRef), i, oPC);
}
}
}
else if(nStage == STAGE_IMPROVE_PARAM1)
{
int nType = GetLocalInt(oPC, "codi_ancdai_type");
int nSubType = GetLocalInt(oPC, "codi_ancdai_subtype");
SetHeader("Which variation of itemproperty do you wish to add?");
AddChoice("Go back.", CHOICE_RETURN_TO_PREVIOUS, oPC);
string sParam1ResRef = Get2DACache("itempropdef", "Param1ResRef", nType);
//may depend on subtype
if(sParam1ResRef == "")
{
string sSubTypeResRef = Get2DACache("itempropdef", "SubTypeResRef", nType);
if(sSubTypeResRef != "")
{
sParam1ResRef = Get2DACache(sSubTypeResRef, "Param1ResRef", nSubType);
}
}
//lookup the number to get the real filename
sParam1ResRef = Get2DACache("iprp_paramtable", "TableResRef", StringToInt(sParam1ResRef));
//now loop over rows
int i;
for(i=0;i<200;i++)
{
int nStrRef = StringToInt(Get2DACache(sParam1ResRef, "Name", i));
if(nStrRef != 0)
{
if(!GetPRCSwitch(PRC_SAMURAI_BAN_+IntToString(nType)+"_"+IntToString(nSubType)+"_"+IntToString(i)+"_*")
&& !GetPRCSwitch(PRC_SAMURAI_BAN_+IntToString(nType)+"_*_"+IntToString(i)+"_*"))
AddChoice(GetStringByStrRef(nStrRef), i, oPC);
}
}
}
else if(nStage == STAGE_IMPROVE_VALUE)
{
int nType = GetLocalInt(oPC, "codi_ancdai_type");
int nSubType = GetLocalInt(oPC, "codi_ancdai_subtype");
int nParam1 = GetLocalInt(oPC, "codi_ancdai_param1");
SetHeader("Which value of itemproperty do you wish to add?");
AddChoice("Go back.", CHOICE_RETURN_TO_PREVIOUS, oPC);
string sCostResRef = Get2DACache("itempropdef", "CostTableResRef", nType);
//lookup the number to get the real filename
sCostResRef = Get2DACache("iprp_costtable", "Name", StringToInt(sCostResRef));
int i;
for(i=0;i<200;i++)
{
int nStrRef = StringToInt(Get2DACache(sCostResRef, "Name", i));
if(nStrRef != 0)
{
if(!GetPRCSwitch(PRC_SAMURAI_BAN_+IntToString(nType)+"_"+IntToString(nSubType)+"_"+IntToString(nParam1)+"_"+IntToString(i))
&& !GetPRCSwitch(PRC_SAMURAI_BAN_+IntToString(nType)+"_*_"+IntToString(nParam1)+"_"+IntToString(i))
&& !GetPRCSwitch(PRC_SAMURAI_BAN_+IntToString(nType)+"_*_*_"+IntToString(i)))
AddChoice(GetStringByStrRef(nStrRef), i, oPC);
}
}
}
else if(nStage == STAGE_IMPROVE_ADD)
{
int nType = GetLocalInt(oPC, "codi_ancdai_type");
int nSubType = GetLocalInt(oPC, "codi_ancdai_subtype");
int nParam1 = GetLocalInt(oPC, "codi_ancdai_param1");
int nValue = GetLocalInt(oPC, "codi_ancdai_value");
int nVar2;
int nVar3;
int nVar4;
//assign then in order
string sSubType = Get2DACache("itempropdef", "SubTypeResRef", nType);
string sParam1ResRef = Get2DACache("itempropdef", "Param1ResRef", nType);
string sValueResRef = Get2DACache("itempropdef", "CostTableResRef", nType);
if(sParam1ResRef == "")
{
//if there is a subtype, param1 may be defined there
if(sSubType != "")
sParam1ResRef = Get2DACache(sSubType, "Param1ResRef", nSubType);
}
if(sSubType != "")
{
nVar2 = nSubType;
if(sParam1ResRef != "")
{
nVar3 = nParam1;
if(sValueResRef != "")
nVar4 = nValue;
}
else if(sValueResRef != "")
nVar3 = nValue;
}
else if(sParam1ResRef != "")
{
nVar2 = nParam1;
if(sValueResRef != "")
nVar3 = nValue;
}
else if(sValueResRef != "")
nVar2 = nValue;
//fudges to turn types into vars
if(nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT)
{
// int nTemp = nVar3;
// nVar3 = nVar4;
// nVar4 = nTemp;
}
//get the itemproperty
itemproperty ipToAdd = IPGetItemPropertyByID(nType, nVar2, nVar3, nVar4);
if(!GetIsItemPropertyValid(ipToAdd))
DoDebug("Itemproperty Not Valid");
//set the header
SetHeader("You are attempting to add "+ItemPropertyToString(ipToAdd));
//work out cost
object oItem = GetLocalObject(oPC, "codi_ancdai");
object oCopy = CopyItem(oItem, GetObjectByTag("HEARTOFCHAOS"), TRUE);
if(!GetIsObjectValid(oCopy))
DoDebug("Copy not valid");
SetIdentified(oCopy, TRUE);
SetPlotFlag(oCopy, FALSE);
SetStolenFlag(oCopy, FALSE);
int nOldValue = GetGoldPieceValue(oCopy);
IPSafeAddItemProperty(oCopy, ipToAdd);
int nNewValue = GetGoldPieceValue(oCopy);
int nIPCost = nNewValue-nOldValue;
//sanity check for infinite gold
if(nIPCost < 0)
{
AddChoice("You cannot add this because it would lower the value of your weapon.", CHOICE_RETURN_TO_PREVIOUS, oPC);
}
else
{
int nSacrificed = GetPersistantLocalInt(oPC, "CODI_SAMURAI");
if(nIPCost > nSacrificed)
AddChoice("You cannot add this because it would cost more than you have sacrificed ("+
IntToString(nIPCost)+" vs "+IntToString(nSacrificed)+")", CHOICE_RETURN_TO_PREVIOUS, oPC);
else
{
int nMaxValue;
//get maxvalue based on character level & Epic Ancestral Daisho feats
int nSamuraiLevel = GetHitDice(oPC);
if(nSamuraiLevel >=4 && nSamuraiLevel < 7)
nMaxValue = 2000;
else if(nSamuraiLevel >=7 && nSamuraiLevel < 9)
nMaxValue = 8000;
else if(nSamuraiLevel >=9 && nSamuraiLevel < 11)
nMaxValue = 18000;
else if(nSamuraiLevel >=11 && nSamuraiLevel < 13)
nMaxValue = 32000;
else if(nSamuraiLevel >=13 && nSamuraiLevel < 14)
nMaxValue = 50000;
else if(nSamuraiLevel >=14 && nSamuraiLevel < 15)
nMaxValue = 72000;
else if(nSamuraiLevel >=15 && nSamuraiLevel < 16)
nMaxValue = 98000;
else if(nSamuraiLevel >=16 && nSamuraiLevel < 17)
nMaxValue = 126000;
else if(nSamuraiLevel >=17 && nSamuraiLevel < 18)
nMaxValue = 162000;
else if(nSamuraiLevel >= 18)
{
nMaxValue = 200000;
if(GetHasFeat(FEAT_EPIC_ANCESTRAL_DAISHO_10))
nMaxValue = 8000000;
else if(GetHasFeat(FEAT_EPIC_ANCESTRAL_DAISHO_9))
nMaxValue = 7220000;
else if(GetHasFeat(FEAT_EPIC_ANCESTRAL_DAISHO_8))
nMaxValue = 6480000;
else if(GetHasFeat(FEAT_EPIC_ANCESTRAL_DAISHO_7))
nMaxValue = 5780000;
else if(GetHasFeat(FEAT_EPIC_ANCESTRAL_DAISHO_6))
nMaxValue = 5120000;
else if(GetHasFeat(FEAT_EPIC_ANCESTRAL_DAISHO_5))
nMaxValue = 4500000;
else if(GetHasFeat(FEAT_EPIC_ANCESTRAL_DAISHO_4))
nMaxValue = 3920000;
else if(GetHasFeat(FEAT_EPIC_ANCESTRAL_DAISHO_3))
nMaxValue = 3380000;
else if(GetHasFeat(FEAT_EPIC_ANCESTRAL_DAISHO_2))
nMaxValue = 2880000;
else if(GetHasFeat(FEAT_EPIC_ANCESTRAL_DAISHO_1))
nMaxValue = 2420000;
}
if(GetPRCSwitch(PRC_SAMURAI_VALUE_SCALAR_x100))
nMaxValue = FloatToInt(IntToFloat(nMaxValue)*(IntToFloat(GetPRCSwitch(PRC_SAMURAI_VALUE_SCALAR_x100))/100.0));
//get the items
object oKatana;
object oWakizashi;
int i;
for(i=0;i<14;i++)
{
object oTest = GetItemInSlot(i, oPC);
if(GetTag(oTest) == "codi_katana")
oKatana = oTest;
if(GetTag(oTest) == "codi_wakizashi")
oWakizashi = oTest;
}
object oTest = GetFirstItemInInventory(oPC);
while(GetIsObjectValid(oTest)
&& (!GetIsObjectValid(oKatana)
|| !GetIsObjectValid(oWakizashi)))
{
if(GetTag(oTest) == "codi_katana")
oKatana = oTest;
if(GetTag(oTest) == "codi_wakizashi")
oWakizashi = oTest;
oTest = GetNextItemInInventory(oPC);
}
//get the value
int nCurrentValue = nNewValue;
if(oWakizashi == oItem)
{
nCurrentValue += GetGoldPieceValue(oKatana);
}
else
nCurrentValue += GetGoldPieceValue(oWakizashi);
if(nCurrentValue > nMaxValue)
{
AddChoice("You cannot add this because it would bring the total value above your limit ("+
IntToString(nCurrentValue)+" vs "+IntToString(nMaxValue)+")", CHOICE_RETURN_TO_PREVIOUS, oPC);
}
else
{
AddChoice("This will cost "+IntToString(nIPCost)+" from your sacrificed total of "+IntToString(nSacrificed), TRUE, oPC);
AddChoice("This cost is too great at the moment", CHOICE_RETURN_TO_PREVIOUS, oPC);
}
}
}
}
}
// Do token setup
SetupTokens();
}
// End of conversation cleanup
else if(nValue == DYNCONV_EXITED)
{
// Add any locals set through this conversation
DeleteLocalObject(oPC, "codi_ancdai");
DeleteLocalInt(oPC, "codi_ancdai_type");
DeleteLocalInt(oPC, "codi_ancdai_subtype");
DeleteLocalInt(oPC, "codi_ancdai_param1");
DeleteLocalInt(oPC, "codi_ancdai_value");
}
// 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
DeleteLocalObject(oPC, "codi_ancdai");
DeleteLocalInt(oPC, "codi_ancdai_type");
DeleteLocalInt(oPC, "codi_ancdai_subtype");
DeleteLocalInt(oPC, "codi_ancdai_param1");
DeleteLocalInt(oPC, "codi_ancdai_value");
}
// Handle PC responses
else
{
// variable named nChoice is the value of the player's choice as stored when building the choice list
// variable named nStage determines the current conversation node
int nChoice = GetChoice(oPC);
if(nStage == STAGE_ENTRY)
{
if(nChoice == 1) //sacrifice items
{
object oAltar = CreateObject(OBJECT_TYPE_PLACEABLE, "codi_sam_altar", GetLocation(oPC));
AssignCommand(oPC, ClearAllActions());
AssignCommand(oPC, DoPlaceableObjectAction(oAltar, PLACEABLE_ACTION_USE));
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oAltar);
DestroyObject(oAltar, 360.0); //6 minutes
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
}
else if(nChoice == 2) //improve weapon
{
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_IMPROVE;
MarkStageNotSetUp(nStage, oPC);
}
}
else if(nStage == STAGE_IMPROVE)
{
if(nChoice == 1) //katana
{
object oKatana;
object oTest;
int i;
for(i=0;i<14;i++)
{
oTest = GetItemInSlot(i, OBJECT_SELF);
if(GetTag(oTest) == "codi_katana")
oKatana = oTest;
}
oTest = GetFirstItemInInventory(OBJECT_SELF);
while(GetIsObjectValid(oTest)
&& !GetIsObjectValid(oKatana))
{
if(GetTag(oTest) == "codi_katana")
oKatana = oTest;
oTest = GetNextItemInInventory(OBJECT_SELF);
}
SetLocalObject(oPC, "codi_ancdai", oKatana);
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_IMPROVE_TYPE;
MarkStageNotSetUp(nStage, oPC);
}
else if(nChoice == 2) //wakizashi
{
object oWakizashi;
object oTest;
int i;
for(i=0;i<14;i++)
{
oTest = GetItemInSlot(i, OBJECT_SELF);
if(GetTag(oTest) == "codi_wakizashi")
oWakizashi = oTest;
}
oTest = GetFirstItemInInventory(OBJECT_SELF);
while(GetIsObjectValid(oTest)
&& !GetIsObjectValid(oWakizashi))
{
if(GetTag(oTest) == "codi_wakizashi")
oWakizashi = oTest;
oTest = GetNextItemInInventory(OBJECT_SELF);
}
SetLocalObject(oPC, "codi_ancdai", oWakizashi);
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_IMPROVE_TYPE;
MarkStageNotSetUp(nStage, oPC);
}
else if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
{
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
}
else if(nStage == STAGE_IMPROVE_TYPE)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
{
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_IMPROVE;
MarkStageNotSetUp(nStage, oPC);
}
else
{
int nType = nChoice;
SetLocalInt(oPC, "codi_ancdai_type", nChoice);
//look for subtype
string sSubType = Get2DACache("itempropdef", "SubTypeResRef", nType);
if(sSubType != "")
nStage = STAGE_IMPROVE_SUB_TYPE;
else
{
//no subtype
//check param1
string sParam1ResRef = Get2DACache("itempropdef", "Param1ResRef", nType);
if(sParam1ResRef != "")
{
nStage = STAGE_IMPROVE_PARAM1;
}
else
{
//no param1
//check value
int nValueResRef = StringToInt(Get2DACache("itempropdef", "CostTableResRef", nType));
if(nValueResRef)
{
nStage = STAGE_IMPROVE_VALUE;
}
else
{
//no value
//proceed to add
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_IMPROVE_ADD;
MarkStageNotSetUp(nStage, oPC);
}
}
}
}
}
else if(nStage == STAGE_IMPROVE_SUB_TYPE)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
{
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_IMPROVE_TYPE;
MarkStageNotSetUp(nStage, oPC);
}
else
{
SetLocalInt(oPC, "codi_ancdai_subtype", nChoice);
int nType = GetLocalInt(oPC, "codi_ancdai_type");
int nSubType = nChoice;
//check param1
string sParam1ResRef = Get2DACache("itempropdef", "Param1ResRef", nType);
if(sParam1ResRef != "")
{
nStage = STAGE_IMPROVE_PARAM1;
}
else
{
//if there is a subtype, param1 may be defined there
string sSubType = Get2DACache("itempropdef", "SubTypeResRef", nType);
if(sSubType != "")
{
sParam1ResRef = Get2DACache(sSubType, "Param1ResRef", nSubType);
if(sParam1ResRef != "")
{
nStage = STAGE_IMPROVE_PARAM1;
}
else
{
//certainly no param1 now
//cheat a bit and pretend no subtype to get into the next if statement
sSubType = "";
}
}
//this is not an else statement
if(sSubType == "")
{
//no param1
//check value
int nValueResRef = StringToInt(Get2DACache("itempropdef", "CostTableResRef", nType));
if(nValueResRef)
{
nStage = STAGE_IMPROVE_VALUE;
}
else
{
//no value
//proceed to add
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_IMPROVE_ADD;
MarkStageNotSetUp(nStage, oPC);
}
}
}
}
}
else if(nStage == STAGE_IMPROVE_PARAM1)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
{
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_IMPROVE_TYPE;
MarkStageNotSetUp(nStage, oPC);
}
else
{
SetLocalInt(oPC, "codi_ancdai_param1", nChoice);
int nType = GetLocalInt(oPC, "codi_ancdai_type");
int nSubType = GetLocalInt(oPC, "codi_ancdai_subtype");
//check value
string sValueResRef = Get2DACache("itempropdef", "CostTableResRef", nType);
if(sValueResRef != "")
{
nStage = STAGE_IMPROVE_VALUE;
}
else
{
//no value
//proceed to add
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_IMPROVE_ADD;
MarkStageNotSetUp(nStage, oPC);
}
}
}
else if(nStage == STAGE_IMPROVE_VALUE)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
{
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_IMPROVE_TYPE;
MarkStageNotSetUp(nStage, oPC);
}
else
{
SetLocalInt(oPC, "codi_ancdai_value", nChoice);
int nType = GetLocalInt(oPC, "codi_ancdai_type");
//proceed to add
nStage = STAGE_IMPROVE_ADD;
}
}
else if(nStage == STAGE_IMPROVE_ADD)
{
if(nChoice == CHOICE_RETURN_TO_PREVIOUS)
{
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
else if(nChoice == TRUE)
{
//store old cost
object oItem = GetLocalObject(oPC, "codi_ancdai");
int nOldPlot = GetPlotFlag(oItem);
int nOldValue = GetGoldPieceValue(oItem);
SetPlotFlag(oItem, nOldPlot);
SetStolenFlag(oItem, nOldPlot);
int nSacrificed = GetPersistantLocalInt(oPC, "CODI_SAMURAI");
//add the itemproperty
int nType = GetLocalInt(oPC, "codi_ancdai_type");
int nSubType = GetLocalInt(oPC, "codi_ancdai_subtype");
int nParam1 = GetLocalInt(oPC, "codi_ancdai_param1");
int nValue = GetLocalInt(oPC, "codi_ancdai_value");
int nVar2;
int nVar3;
int nVar4;
//assign then in order
string sSubType = Get2DACache("itempropdef", "SubTypeResRef", nType);
string sParam1ResRef = Get2DACache("itempropdef", "Param1ResRef", nType);
string sValueResRef = Get2DACache("itempropdef", "CostTableResRef", nType);
if(sParam1ResRef == "")
{
//if there is a subtype, param1 may be defined there
if(sSubType != "")
sParam1ResRef = Get2DACache(sSubType, "Param1ResRef", nSubType);
}
if(sSubType != "")
{
nVar2 = nSubType;
if(sParam1ResRef != "")
{
nVar3 = nParam1;
if(sValueResRef != "")
nVar4 = nValue;
}
else if(sValueResRef != "")
nVar3 = nValue;
}
else if(sParam1ResRef != "")
{
nVar2 = nParam1;
if(sValueResRef != "")
nVar3 = nValue;
}
else if(sValueResRef != "")
nVar2 = nValue;
//fudges to turn types into vars
if(nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP
|| nType == ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT)
{
int nTemp = nVar3;
nVar3 = nVar4;
nVar4 = nTemp;
}
//get the itemproperty
itemproperty ipToAdd = IPGetItemPropertyByID(nType, nVar2, nVar3, nVar4);
if(!GetIsItemPropertyValid(ipToAdd))
DoDebug("Itemproperty Not Valid");
IPSafeAddItemProperty(oItem, ipToAdd);
//remove gold cost
//only works if non-plot
int nNewPlot = GetPlotFlag(oItem);
int nNewValue = GetGoldPieceValue(oItem);
SetPlotFlag(oItem, nNewPlot);
SetStolenFlag(oItem, nNewPlot);
int nIPCost = nNewValue-nOldValue;
SetPersistantLocalInt(oPC, "CODI_SAMURAI", nSacrificed-nIPCost);
//go back to start
MarkStageNotSetUp(nStage, oPC);
nStage = STAGE_ENTRY;
MarkStageNotSetUp(nStage, oPC);
}
}
// Store the stage value. If it has been changed, this clears out the choices
SetStage(nStage, oPC);
}
}