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.
257 lines
12 KiB
Plaintext
257 lines
12 KiB
Plaintext
//:://////////////////////////////////////////////
|
|
//:: Shadowsmith Shadow Craft Conversation
|
|
//:: shd_smith_craft
|
|
//:://////////////////////////////////////////////
|
|
/** @file
|
|
This allows you to choose any weapon and create it.
|
|
|
|
@author Stratovarius
|
|
@date Created - 05.03.2019
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "inc_dynconv"
|
|
#include "prc_alterations"
|
|
|
|
//////////////////////////////////////////////////
|
|
/* Constant defintions */
|
|
//////////////////////////////////////////////////
|
|
|
|
const int STAGE_WEAPON_CHOICE = 0;
|
|
const int STAGE_CONFIRMATION = 1;
|
|
|
|
//////////////////////////////////////////////////
|
|
/* 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_WEAPON_CHOICE)
|
|
{
|
|
// Set the header
|
|
SetHeader("Select the item you would like to shadow craft.");
|
|
// Add responses for the PC
|
|
|
|
// This reads all of the legal choices from baseitems.2da
|
|
int i;
|
|
for(i = 0; i < 64; i++) //Weapon rows in baseitems.2da
|
|
{
|
|
if (DEBUG) DoDebug("shd_smith_craft Step #1");
|
|
// If the selection is a legal weapon
|
|
if (StringToInt(Get2DACache("baseitems", "WeaponType", i)) > 0)
|
|
{
|
|
if (DEBUG) DoDebug("shd_smith_craft Step #2");
|
|
string sWeaponName = GetStringByStrRef(StringToInt(Get2DACache("baseitems", "Name", i)));
|
|
// Skip blanks and items with moving parts
|
|
if (sWeaponName != "")
|
|
{
|
|
if (DEBUG) DoDebug("shd_smith_craft Step #3");
|
|
if (i != 4 && i != 6 && i != 7 && i != 8 && i != 11 && i != 35 && i != 45 && i != 61 && i != 111)
|
|
{
|
|
AddChoice(sWeaponName, i, oPC);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
AddChoice("Dwarven Waraxe", 108, oPC);
|
|
if (GetLevelByClass(CLASS_TYPE_SHADOWSMITH, oPC) >= 8)
|
|
{
|
|
AddChoice("Padded Armor", 1001, oPC);
|
|
AddChoice("Leather Armor", 1002, oPC);
|
|
AddChoice("Studded Leather Armor", 1003, oPC);
|
|
AddChoice("Chain Shirt Armor", 1004, oPC);
|
|
}
|
|
|
|
MarkStageSetUp(STAGE_WEAPON_CHOICE, 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_CONFIRMATION)//confirmation
|
|
{
|
|
int nChoice = GetLocalInt(oPC, "ShadowCraft_Choice");
|
|
AddChoice(GetStringByStrRef(4752), TRUE); // "Yes"
|
|
AddChoice(GetStringByStrRef(4753), FALSE); // "No"
|
|
|
|
string sName = GetStringByStrRef(StringToInt(Get2DACache("baseitems", "Name", nChoice)));
|
|
if (nChoice > 1000)
|
|
{
|
|
if (nChoice == 1001) sName = "Padded Armor";
|
|
else if (nChoice == 1002) sName = "Leather Armor";
|
|
else if (nChoice == 1003) sName = "Studded Leather Armor";
|
|
else if (nChoice == 1004) sName = "Chain Shirt Armor";
|
|
}
|
|
string sText = "You have selected " + sName + " as your shadow crafted item.\n";
|
|
sText += "Is this correct?";
|
|
|
|
SetHeader(sText);
|
|
MarkStageSetUp(STAGE_CONFIRMATION, oPC);
|
|
}
|
|
}
|
|
|
|
// Do token setup
|
|
SetupTokens();
|
|
}
|
|
// End of conversation cleanup
|
|
else if(nValue == DYNCONV_EXITED)
|
|
{
|
|
// End of conversation cleanup
|
|
DeleteLocalInt(oPC, "ShadowCraft_Choice");
|
|
DeleteLocalInt(oPC, "ShadowCraft_Augment");
|
|
DeleteLocalFloat(oPC, "ShadowCraft_Duration");
|
|
}
|
|
// 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)
|
|
{
|
|
// End of conversation cleanup
|
|
DeleteLocalInt(oPC, "ShadowCraft_Choice");
|
|
DeleteLocalInt(oPC, "ShadowCraft_Augment");
|
|
DeleteLocalFloat(oPC, "ShadowCraft_Duration");
|
|
}
|
|
// 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_WEAPON_CHOICE)
|
|
{
|
|
// Go to this stage next
|
|
nStage = STAGE_CONFIRMATION;
|
|
SetLocalInt(oPC, "ShadowCraft_Choice", nChoice);
|
|
}
|
|
else if(nStage == STAGE_CONFIRMATION)//confirmation
|
|
{
|
|
if(nChoice == TRUE)
|
|
{
|
|
int nEnhance = 0;
|
|
int nClass = GetLevelByClass(CLASS_TYPE_SHADOWSMITH, oPC);
|
|
if (nClass > 5) nEnhance = nClass - 5;
|
|
int nBaseType, nSuccess;
|
|
float fDur = HoursToSeconds(nClass);
|
|
object oItem;
|
|
int nItem = GetLocalInt(oPC, "ShadowCraft_Choice");
|
|
|
|
if (1000 > nItem) // Crafting weapons
|
|
{
|
|
if (nEnhance > 0) nSuccess = GetIsSkillSuccessful(oPC, SKILL_CRAFT_WEAPON, 20+nEnhance);
|
|
// This is what the basic non-magical version of bioware weapons use as a resref
|
|
string sWeaponTemplate = "nw_" + Get2DACache("baseitems", "ItemClass", nItem) + "001";
|
|
string sAmmo = "";
|
|
object oAmmo;
|
|
|
|
oItem = CreateItemOnObject(sWeaponTemplate, oPC);
|
|
nBaseType = GetBaseItemType(oItem);
|
|
|
|
if(nBaseType == BASE_ITEM_LONGBOW && nBaseType == BASE_ITEM_SHORTBOW)
|
|
{
|
|
sAmmo = "nw_wamar001";
|
|
oAmmo = CreateItemOnObject(sAmmo, oPC, d6(3));
|
|
AssignCommand(oPC, ActionEquipItem(oAmmo, INVENTORY_SLOT_ARROWS));
|
|
// Ammoed weapons get their ammo enhanced as well
|
|
if (nEnhance > 0 && nSuccess) AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyEnhancementBonus(nEnhance), oAmmo, fDur);
|
|
}
|
|
else if(nBaseType == BASE_ITEM_HEAVYCROSSBOW && nBaseType == BASE_ITEM_LIGHTCROSSBOW)
|
|
{
|
|
sAmmo = "nw_wambo001";
|
|
oAmmo = CreateItemOnObject(sAmmo, oPC, d6(3));
|
|
AssignCommand(oPC, ActionEquipItem(oAmmo, INVENTORY_SLOT_BOLTS));
|
|
// Ammoed weapons get their ammo enhanced as well
|
|
if (nEnhance > 0 && nSuccess) AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyEnhancementBonus(nEnhance), oAmmo, fDur);
|
|
}
|
|
else if(nBaseType == BASE_ITEM_SLING)
|
|
{
|
|
sAmmo = "nw_wambu001";
|
|
oAmmo = CreateItemOnObject(sAmmo, oPC, d6(3));
|
|
AssignCommand(oPC, ActionEquipItem(oAmmo, INVENTORY_SLOT_BULLETS));
|
|
// Ammoed weapons get their ammo enhanced as well
|
|
if (nEnhance > 0 && nSuccess) AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyEnhancementBonus(nEnhance), oAmmo, fDur);
|
|
}
|
|
|
|
if (IPGetIsMeleeWeapon(oItem)) AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyVisualEffect(ITEM_VISUAL_HOLY), oItem, fDur);
|
|
|
|
// If the power was augmented, add a straight enhancement bonus equivalent to the augmentation value
|
|
if (nEnhance > 0 && nSuccess) AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyEnhancementBonus(nEnhance), oItem, fDur);
|
|
// Equip the weapon
|
|
AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_RIGHTHAND));
|
|
}
|
|
else if (nItem > 1000) // Armor picked
|
|
{
|
|
string sArmor;
|
|
if (nItem == 1001) sArmor = "nw_aarcl009"; // Padded
|
|
else if (nItem == 1002) sArmor = "nw_aarcl001"; // Leather
|
|
else if (nItem == 1003) sArmor = "nw_aarcl002"; // Studded
|
|
else sArmor = "nw_aarcl012"; // Chain
|
|
|
|
oItem = CreateItemOnObject(sArmor, oPC);
|
|
|
|
if (nEnhance > 0) nSuccess = GetIsSkillSuccessful(oPC, SKILL_CRAFT_ARMOR, 20+nEnhance);
|
|
if (nEnhance > 0 && nSuccess) AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyACBonus(nEnhance), oItem, fDur);
|
|
// Improved Shadow item ability, always granted by default.
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertySkillBonus(SKILL_HIDE, 10), oItem, fDur);
|
|
// Equip the weapon
|
|
AssignCommand(oPC, ActionEquipItem(oItem, INVENTORY_SLOT_CHEST));
|
|
}
|
|
|
|
// No dropping and no selling the item
|
|
SetPlotFlag(oItem, TRUE);
|
|
SetDroppableFlag(oItem, FALSE);
|
|
SetItemCursedFlag(oItem, TRUE);
|
|
|
|
// Remove the item when the duration is over.
|
|
DelayCommand(fDur - 1.0, SetPlotFlag(oItem, FALSE));
|
|
DelayCommand(fDur - 1.0, AssignCommand(oItem, SetIsDestroyable(TRUE)));
|
|
DestroyObject(oItem, fDur);
|
|
|
|
// And we're all done
|
|
AllowExit(DYNCONV_EXIT_FORCE_EXIT);
|
|
}
|
|
else
|
|
{
|
|
nStage = STAGE_WEAPON_CHOICE;
|
|
MarkStageNotSetUp(STAGE_WEAPON_CHOICE, oPC);
|
|
MarkStageNotSetUp(STAGE_CONFIRMATION, oPC);
|
|
}
|
|
|
|
DeleteLocalInt(oPC, "ShadowCraft_Choice");
|
|
}
|
|
|
|
// Store the stage value. If it has been changed, this clears out the choices
|
|
SetStage(nStage, oPC);
|
|
}
|
|
} |