PRC8/nwn/nwnprc/trunk/epicspellscripts/_plc_rsrch_ep_sp.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

124 lines
5.5 KiB
Plaintext

//:://////////////////////////////////////////////
//:: FileName: "_plc_rsrch_ep_sp"
/* Purpose: This is the OnDisturbed event handler script for a placeable.
When an epic spell's book is placed into the inventory, it will search
and determine validity of the item, and then proceed with the proper
researching functions.
*/
//:://////////////////////////////////////////////
//:: Created By: Boneshank
//:: Last Updated On:
//:://////////////////////////////////////////////
#include "prc_alterations"
#include "inc_epicspells"
// This constant sets who may or may not research spells from the placeable
// this script is attached to. For example, if you only want arcane casters
// to be able to research from a lab, and not druids or clerics, you must
// determine the exclusivity for the placebale with this constant.
//
// You should save the script under a different name once constant is set....
//
// Keywords to use for this constant:
// For CLERICS ONLY ---- "CLERIC"
// For DRUIDS ONLY ---- "DRUID"
// For HEALERS ONLY ---- "HEALER"
// For FAVOURED SOULS ONLY ---- "FAVSOUL"
// For ALL DIVINE ---- "DIVINE"
// For SORCERERS AND WIZARDS ONLY ---- "ARCANE"
// For EVERYONE ---- "ALL"
string WHO_CAN_RESEARCH = "ALL";
void main()
{
if (GetInventoryDisturbType() == INVENTORY_DISTURB_TYPE_ADDED)
{
object oBook = GetInventoryDisturbItem();
object oPC = GetLastDisturbed();
if(DEBUG) DoDebug("Player Name: " + GetName(oPC));
string sBook = GetTag(oBook);
if(GetStringLeft(GetResRef(oBook), 8) == "epic_sp_")
{
if(DEBUG) DoDebug("Book Tag: " + sBook);
//remove the "EPIC_SP_" part
//sBook = GetStringRight(sBook, GetStringLength(sBook)-8);
if(DEBUG) DoDebug("Book Tag after Editing: " + sBook);
int nEpicSpell = GetSpellFromAbrev(sBook);
if(DEBUG) DoDebug("SpellID: " + IntToString(nEpicSpell));
int nDC = GetDCForSpell(nEpicSpell);
int nIP = GetResearchIPForSpell(nEpicSpell);
int nFE = GetResearchFeatForSpell(nEpicSpell);
int nR1 = GetR1ForSpell(nEpicSpell);
int nR2 = GetR2ForSpell(nEpicSpell);
int nR3 = GetR3ForSpell(nEpicSpell);
int nR4 = GetR4ForSpell(nEpicSpell);
int nS1 = GetS1ForSpell(nEpicSpell);
int nS2 = GetS2ForSpell(nEpicSpell);
int nS3 = GetS3ForSpell(nEpicSpell);
int nS4 = GetS4ForSpell(nEpicSpell);
int nS5 = GetS5ForSpell(nEpicSpell);
string sSc = GetSchoolForSpell(nEpicSpell);
// Make sure the player is allowed to research from this placeable.
int nAllowed = FALSE;
// check they have the epic spellcasting feat
if (GetHasFeat(FEAT_EPIC_SPELLCASTING, oPC))
{
if (WHO_CAN_RESEARCH == "ALL") nAllowed = TRUE;
else if (WHO_CAN_RESEARCH == "CLERIC" && (GetIsEpicCleric(oPC) || GetIsEpicUrPriest(oPC))) nAllowed = TRUE;
else if (WHO_CAN_RESEARCH == "DRUID" && (GetIsEpicDruid(oPC) || GetIsEpicBlighter(oPC))) nAllowed = TRUE;
else if (WHO_CAN_RESEARCH == "HEALER" && GetIsEpicHealer(oPC)) nAllowed = TRUE;
else if (WHO_CAN_RESEARCH == "FAVSOUL" && GetIsEpicFavSoul(oPC)) nAllowed = TRUE;
else if (WHO_CAN_RESEARCH == "DIVINE" &&
(GetIsEpicCleric(oPC) || GetIsEpicDruid(oPC) ||
GetIsEpicHealer(oPC) || GetIsEpicFavSoul(oPC) ||
GetIsEpicShaman(oPC) || GetIsEpicArchivist(oPC))) nAllowed = TRUE;
else if (WHO_CAN_RESEARCH == "ARCANE" && (GetIsEpicSorcerer(oPC) ||
GetIsEpicWizard(oPC) || GetIsEpicWarmage(oPC) || GetIsEpicDreadNecromancer(oPC) ||
GetIsEpicWitch(oPC) || GetIsEpicSublimeChord(oPC) || GetIsEpicBeguiler(oPC))) nAllowed = TRUE;
}
if (nAllowed == TRUE)
{
// Make sure the player doesn't already know this spell.
if (!GetHasEpicSpellKnown(nEpicSpell, oPC))
{
// If applicable, adjust the spell's DC.
if (GetPRCSwitch(PRC_EPIC_FOCI_ADJUST_DC) == TRUE)
nDC -= GetDCSchoolFocusAdjustment(oPC, sSc);
// Does the player have enough gold?
if (GetHasEnoughGoldToResearch(oPC, nDC))
{
// Does the player have enough extra experience?
if (GetHasEnoughExperienceToResearch(oPC, nDC))
{
// Does the player have all of the other requirements?
if (GetHasRequiredFeatsForResearch(oPC, nR1, nR2, nR3, nR4, nS1, nS2, nS3, nS4, nS5))
{
DoSpellResearch(oPC, nDC, nEpicSpell, sSc, oBook);
return;
}
else
SendMessageToPC(oPC, GetName(oPC) + " " + MES_NOT_HAVE_REQ_FEATS);
}
else
SendMessageToPC(oPC, GetName(oPC) + " " + MES_NOT_ENOUGH_XP);
}
else
SendMessageToPC(oPC, GetName(oPC) + " " + MES_NOT_ENOUGH_GOLD);
}
else
SendMessageToPC(oPC, GetName(oPC) + " " + MES_KNOW_SPELL);
}
else
SendMessageToPC(oPC, GetName(oPC) + " " + MES_CANNOT_RESEARCH_HERE);
//couldnt research, give the book back.
CopyItem(oBook, oPC, TRUE);
DestroyObject(oBook);
}
else
{
if(DEBUG) DoDebug("Item is not an epic spell's book!");
}
}
}