PRC8/nwn/nwnprc/trunk/include/psi_inc_soulkn.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

256 lines
9.0 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Soulknife includes
//:: psi_inc_soulkn
//::///////////////////////////////////////////////
/** @file Soulknife includes
Constants and common functions used by
Soulknife scripts.
@author Ornedan
@date Created - 06.04.2005
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////
#include "prc_alterations"
#include "prc_class_const"
#include "inc_utility"
//////////////////////////////////////////////////
/* Constant declarations */
//////////////////////////////////////////////////
const string MBLADE_SHAPE = "PRC_PSI_SK_MindbladeShape";
const string FREEDRAW_USED = "PRC_PSI_SK_FreeDraw_Used";
const string THROW_MBLD_USED = "PRC_PSI_SK_ThrowMindblade_Used";
const string PSYCHIC_STRIKE_MAINH = "PRC_PSI_SK_PsychisStrike_MainHand";
const string PSYCHIC_STRIKE_OFFH = "PRC_PSI_SK_PsychisStrike_OffHand";
const string KTTS = "PRC_PSI_SK_KnifeToTheSoul";
const string BLADEWIND = "PRC_PSI_SK_Bladewind_Active";
const string MBLADE_HAND = "PRC_PSI_SK_MindbladeManifestationHand";
const int KTTS_TYPE_MASK = 3; // 2 LSB
const int KTTS_TYPE_OFF = 0;
const int KTTS_TYPE_INT = 1;
const int KTTS_TYPE_WIS = 2;
const int KTTS_TYPE_CHA = 3;
const int MBLADE_SHAPE_SHORTSWORD = 0;
const int MBLADE_SHAPE_DUAL_SHORTSWORDS = 1;
const int MBLADE_SHAPE_LONGSWORD = 2;
const int MBLADE_SHAPE_BASTARDSWORD = 3;
const int MBLADE_SHAPE_RANGED = 4; // Actual shape is throwing axe
const string MBLADE_FLAGS = "PRC_PSI_SK_MindbladeFlags";
const int MBLADE_FLAG_COUNT = 23;
const int MBLADE_FLAG_LUCKY = 0x1;
const int MBLADE_FLAG_DEFENDING = 0x2;
const int MBLADE_FLAG_KEEN = 0x4;
const int MBLADE_FLAG_VICIOUS = 0x8;
const int MBLADE_FLAG_PSYCHOKINETIC = 0x10;
const int MBLADE_FLAG_MIGHTYCLEAVING = 0x20;
const int MBLADE_FLAG_COLLISION = 0x40;
const int MBLADE_FLAG_MINDCRUSHER = 0x80;
const int MBLADE_FLAG_PSYCHOKINETICBURST = 0x100;
const int MBLADE_FLAG_SUPPRESSION = 0x200;
const int MBLADE_FLAG_WOUNDING = 0x400;
const int MBLADE_FLAG_DISRUPTING = 0x800;
const int MBLADE_FLAG_SOULBREAKER = 0x1000;
const int MBLADE_FLAG_SHIELD_1 = 0x2000;
const int MBLADE_FLAG_SHIELD_2 = 0x4000;
const int MBLADE_FLAG_SHIELD_3 = 0x8000;
const int MBLADE_FLAG_SHIELD_4 = 0x10000;
const int MBLADE_FLAG_SHIELD_5 = 0x20000;
const int MBLADE_FLAG_SHIELD_6 = 0x40000;
const int MBLADE_FLAG_SHIELD_7 = 0x80000;
const int MBLADE_FLAG_SHIELD_8 = 0x100000;
const int MBLADE_FLAG_SHIELD_9 = 0x200000;
const int MBLADE_FLAG_SHIELD_10 = 0x400000;
//////////////////////////////////////////////////
/* Function prototypes */
//////////////////////////////////////////////////
// Sums the enhancement costs of enhancements contained in the given flag set
// ==========================================================================
// nFlags a set of mindblade flags
//
// Returns the sum of the enhancements costs of the mindblade abilities
// set in nFlags.
int GetTotalEnhancementCost(int nFlags);
// Gets the enhancement cost of the given mindblade ability
// ========================================================
// nFlag one of the MBLADE_FLAG_* contants
int GetFlagCost(int nFlag);
// Gets the maximum mindblade enhancement usable by the given creature
// ===================================================================
// oSK a creature to calculate the value of Soulknife class ability
// "Mind blade enhancement" for
int GetMaxEnhancementCost(object oSK);
/**
* Checks the given object's tag to determine whether it is a mindblade
* or not.
*
* @param oWeapon Weapon to test
* @return TRUE if oWeapon is a mindblade, FALSE otherwise
*/
int GetIsMindblade(object oWeapon);
//////////////////////////////////////////////////
/* Function defintions */
//////////////////////////////////////////////////
int GetTotalEnhancementCost(int nFlags)
{
int nCost, i;
for(; i < MBLADE_FLAG_COUNT; i++)
nCost += GetFlagCost(nFlags & (1 << i));
return nCost;
}
int GetFlagCost(int nFlag)
{
switch(nFlag)
{
case 0: return 0;
case MBLADE_FLAG_LUCKY: return 1;
case MBLADE_FLAG_DEFENDING: return 1;
case MBLADE_FLAG_KEEN: return 1;
case MBLADE_FLAG_VICIOUS: return 1;
case MBLADE_FLAG_PSYCHOKINETIC: return 1;
case MBLADE_FLAG_MIGHTYCLEAVING: return 2;
case MBLADE_FLAG_COLLISION: return 2;
case MBLADE_FLAG_MINDCRUSHER: return 2;
case MBLADE_FLAG_PSYCHOKINETICBURST: return 2;
case MBLADE_FLAG_SUPPRESSION: return 2;
case MBLADE_FLAG_WOUNDING: return 2;
case MBLADE_FLAG_DISRUPTING: return 3;
case MBLADE_FLAG_SOULBREAKER: return 4;
case MBLADE_FLAG_SHIELD_1: return 1;
case MBLADE_FLAG_SHIELD_2: return 2;
case MBLADE_FLAG_SHIELD_3: return 3;
case MBLADE_FLAG_SHIELD_4: return 4;
case MBLADE_FLAG_SHIELD_5: return 5;
case MBLADE_FLAG_SHIELD_6: return 6;
case MBLADE_FLAG_SHIELD_7: return 7;
case MBLADE_FLAG_SHIELD_8: return 8;
case MBLADE_FLAG_SHIELD_9: return 9;
case MBLADE_FLAG_SHIELD_10: return 10;
default:
WriteTimestampedLogEntry("Unknown flag passed to GetFlagCost: " + IntToString(nFlag));
}
return 0;
}
int GetMaxEnhancementCost(object oSK)
{
int nEffMBldLevel = GetLevelByClass(CLASS_TYPE_SOULKNIFE, oSK);
if(GetHasFeat(FEAT_SOULBLADE_WARRIOR, oSK)) nEffMBldLevel += 2;
return (nEffMBldLevel - 2) / 4;
}
int GetIsMindblade(object oWeapon)
{
return GetStringLeft(GetTag(oWeapon), 14) == "prc_sk_mblade_";
}
/*
/\/ Template used to generate the startingconditionals for Mindblade Enhancement convo \/\
//::///////////////////////////////////////////////
//:: Soulknife: Conversation - Show ~~~Name~~~
//:: psi_sk_conv_~~~Suffix~~~
//::///////////////////////////////////////////////
/*
Checks whether to show ~~~Name~~~ and whether
it is to be added or removed.
/
//:://////////////////////////////////////////////
//:: Created By: Ornedan
//:: Created On: 06.04.2005
//:://////////////////////////////////////////////
#include "psi_inc_sk_const"
int StartingConditional()
{
int nReturn; // Implicit init to FALSE
// Check if the flag is already present
if(GetLocalInt(GetPCSpeaker(), MBLADE_FLAGS + "_T") & ~~~Flag~~~)
{
SetCustomToken(~~~TokenNum~~~, GetStringByStrRef(7654)); // Remove
nReturn = TRUE;
}
// It isn't, so see if there is enough bonus left to add it
else if(GetTotalEnhancementCost(GetLocalInt(GetPCSpeaker(), MBLADE_FLAGS + "_T")) + GetFlagCost(~~~Flag~~~) <= GetMaxEnhancementCost(GetPCSpeaker()))
{
SetCustomToken(~~~TokenNum~~~, GetStringByStrRef(62476)); // Add
nReturn = TRUE;
}
return nReturn;
}
/\/ Template used to generate the toggles for Mindblade Enhancement convo \/\
//::///////////////////////////////////////////////
//:: Soulknife: Conversation - Toggle ~~~Name~~~
//:: psi_sk_conv_~~~Suffix~~~
//::///////////////////////////////////////////////
/*
Adds or removes ~~~Name~~~ from the mindblade
flags.
/
//:://////////////////////////////////////////////
//:: Created By: Ornedan
//:: Created On: 06.04.2005
//:://////////////////////////////////////////////
#include "psi_inc_sk_const"
void main()
{
SetLocalInt(GetPCSpeaker(), MBLADE_FLAGS + "_T",
GetLocalInt(GetPCSpeaker(), MBLADE_FLAGS + "_T") ^ ~~~Flag~~~
);
}
/\/ 2da files used for both \/\
2DA V2.0
Suffix Name TokenNum Flag
0 lu_s Lucky 102 MBLADE_FLAG_LUCKY
1 de_s Defending 103 MBLADE_FLAG_DEFENDING
2 ke_s Keen 104 MBLADE_FLAG_KEEN
3 vi_s Vicous 105 MBLADE_FLAG_VICIOUS
4 ps_s Psychokinetic 106 MBLADE_FLAG_PSYCHOKINETIC
5 mc_s "Mighty Cleaving" 107 MBLADE_FLAG_MIGHTYCLEAVING
6 co_s Collision 108 MBLADE_FLAG_COLLISION
7 mi_s Mindcrusher 109 MBLADE_FLAG_MINDCRUSHER
8 pb_s "Psychokinetic Burst" 110 MBLADE_FLAG_PSYCHOKINETICBURST
9 su_s Suppression 111 MBLADE_FLAG_SUPPRESSION
10 wo_s Wounding 112 MBLADE_FLAG_WOUNDING
11 di_s Disrupting 113 MBLADE_FLAG_DISRUPTING
12 so_s Soulbreaker 114 MBLADE_FLAG_SOULBREAKER
*/