forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
704 lines
31 KiB
Plaintext
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);
|
|
}
|
|
}
|