Files
HeroesStone_PRC8/_module/nss/hc_inc_ability.nss
Jaysyn904 1eefc84201 Initial Commit
Initial Commit.
2025-09-14 15:40:46 -04:00

319 lines
10 KiB
Plaintext

// hcr3.1
// took out disabled checking.
// 5.5
// Added scroll failure based on low ability scores.
// 5.4
// Ability check to see if caster has a high enough ability to cast a spell.
// also has scroll check failure.
// written by Jamos
#include "hc_text_ability"
#include "prc_inc_spells"
//:: void main (){}
// hcr3.1 took out disabled checking.
int FailureCheck(object oW, int nCasterLevel, int nSpellLevel, int nLvl, int nWisMod){
int nDamage;
effect eDamage;
effect eVis;
int nRoll = d20(1);
SendMessageToPC(oW, "Failure Roll: "+IntToString(nRoll));
if ((nRoll+nLvl) < (nCasterLevel+1)){
nRoll = d20(1);
SendMessageToPC(oW, "Mishap Roll: "+IntToString(nRoll));
if ((nRoll == 1) || ((nRoll+nWisMod) < 5)){
nDamage = d6(nSpellLevel);
eDamage = EffectDamage(nDamage);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oW);
eVis = EffectVisualEffect(VFX_FNF_SMOKE_PUFF);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oW);
SendMessageToPC(oW, MISHAP+IntToString(nDamage));
return 1;
}
else
{
SendMessageToPC(oW, FAILURE);
return 1;
}
}
return 0;
}
int ScrollCast()
{
int nCLERIC = FALSE;
int nBARD = FALSE;
int nDRUID = FALSE;
int nPALADIN = FALSE;
int nRANGER = FALSE;
int nSORCERER = FALSE;
int nWIZARD = FALSE;
int nROGUE = FALSE;
int nRoll;
int nLvl;
int nELvl = 0;
int nEAbl = 0;
int nCasterLevel;
int nSpellLevel;
int nSkill;
string sName = GetName(PRCGetSpellCastItem());
string sTag = GetTag(PRCGetSpellCastItem());
int nSp=PRCGetSpellId();
object oW=OBJECT_SELF;
int nCLERICL = GetLevelByClass(CLASS_TYPE_CLERIC, oW);
if (nCLERICL > 0) nCLERIC = TRUE;
int nBARDL = GetLevelByClass(CLASS_TYPE_BARD, oW);
if (nBARDL > 0) nBARD = TRUE;
int nDRUIDL = GetLevelByClass(CLASS_TYPE_DRUID, oW);
if (nDRUIDL > 0) nDRUID = TRUE;
int nPALADINL = GetLevelByClass(CLASS_TYPE_PALADIN, oW);
if (nPALADINL > 0) nPALADIN = TRUE;
// Paladins have 0 caster level till 4.
if (nPALADINL < 4) nPALADINL = 0;
int nRANGERL = GetLevelByClass(CLASS_TYPE_RANGER, oW);
if (nRANGERL > 0) nRANGER = TRUE;
// rangers have 0 caster level till level 4.
if (nRANGERL < 4) nRANGERL = 0;
int nSORCERERL = GetLevelByClass(CLASS_TYPE_SORCERER, oW);
if (nSORCERERL > 0) nSORCERER = TRUE;
int nWIZARDL = GetLevelByClass(CLASS_TYPE_WIZARD, oW);
if (nWIZARDL > 0) nWIZARD = TRUE;
int nROGUEL = GetLevelByClass(CLASS_TYPE_ROGUE, oW);
if (nROGUEL > 0) nROGUE = TRUE;
int nCHARISMA = GetAbilityScore(oW, ABILITY_CHARISMA);
int nWISDOM = GetAbilityScore(oW, ABILITY_WISDOM);
int nINTELLEGENCE = GetAbilityScore(oW, ABILITY_INTELLIGENCE);
int nWisMod = GetAbilityModifier(ABILITY_WISDOM, oW);
int nIntMod = GetAbilityModifier(ABILITY_INTELLIGENCE, oW);
int nCharMod = GetAbilityModifier(ABILITY_CHARISMA, oW);
nCasterLevel = PRCGetCasterLevel(OBJECT_SELF);
//SendMessageToPC(oW, "Beginning Scroll Caster Level "+IntToString(nCasterLevel));
nSpellLevel = StringToInt(GetSubString(sTag, 0, 1));
if (nSp == SPELL_LEGEND_LORE || nSp == SPELL_NEUTRALIZE_POISON){
if (FindSubString(sName, "(A)") > -1)
nCasterLevel = nCasterLevel+5;
}
if (nSp == SPELL_WAR_CRY){
if (FindSubString(sName, "(A)") > -1)
nCasterLevel = nCasterLevel+3;
}
if (nSp == SPELL_DOMINATE_PERSON || nSp == SPELL_FEAR ||
nSp == SPELL_FIND_TRAPS || nSp == SPELL_HOLD_MONSTER
|| nSp ==SPELL_HOLD_PERSON || nSp == SPELL_REMOVE_BLINDNESS_AND_DEAFNESS
|| nSp == SPELL_REMOVE_CURSE || nSp == SPELL_REMOVE_DISEASE
|| nSp == SPELL_TRUE_SEEING || nSp == SPELL_BESTOW_CURSE){
if (FindSubString(sName, "(A)") > -1)
nCasterLevel = nCasterLevel+2;
}
if (nSp == SPELL_SILENCE || nSp == SPELL_SOUND_BURST){
if (FindSubString(sName, "(A)") > -1)
nCasterLevel = nCasterLevel+1;
}
if (nSp == SPELL_PROTECTION_FROM_ELEMENTS) {
nCasterLevel = nCasterLevel+1;
}
if (nSp == SPELL_POLYMORPH_SELF){
if (FindSubString(sName, "(D)") > -1)
nCasterLevel = nCasterLevel+7;
}
if (nSp == SPELL_FINGER_OF_DEATH || nSp == SPELL_SUNBEAM){
if (FindSubString(sName, "(D)") > -1)
nCasterLevel = nCasterLevel+2;
}
//SendMessageToPC(oW, "Ending Scroll Caster Level "+IntToString(nCasterLevel));
//SendMessageToPC(oW, "Spell Level "+IntToString(nSpellLevel));
string sRef;
//sRef = GetResRef(GetObjectByTag(GetTag(PRCGetSpellCastItem())));
//SendMessageToPC(oW, "Scroll ResRef "+sRef);
nSkill = GetSkillRank(SKILL_USE_MAGIC_DEVICE, OBJECT_SELF);
//SendMessage9ToPC(oW, "USE MAGIC DEVICE "+IntToString(nSkill));
if (nSkill > 0)
nELvl = (d20(1)+nSkill)-20;
// 5.5 Use Magic Device Emulate Ability roll.
if (nSkill > 0)
nEAbl = (d20(1)+nSkill)-15;
// 5.5 set fail to false
int nFail = FALSE;
// 5.5 set spell check level to spell level + 10
int nSpellCheck = nSpellLevel + 10;
// check for arcane scroll
if (FindSubString(sName, "(A)") > -1){
// check for Bard/Wizard spell
if (FindSubString(sTag, "_BW") > -1){
nLvl = nWIZARDL;
if (nLvl < nBARDL) nLvl = nBARDL;
// 5.5 new ability check for scrolls
if ((nBARD && nSpellCheck > nCHARISMA && !nWIZARD) ||
(nWIZARD && nSpellCheck > nINTELLEGENCE && !nBARD)||
(nWIZARD && nBARD && nSpellCheck > nINTELLEGENCE &&
nSpellCheck > nCHARISMA))
{
// use magic device emulation check.
if ((nEAbl >= nSpellCheck) && (nROGUE || nBARD))
{}// do nothing
else {
SendMessageToPC(oW, DRAIN);
return 1;
}
}
}
// check for bard only spell
else if (FindSubString(sTag, "_B") > -1)
{
nLvl = nBARDL;
if (nSpellCheck > nCHARISMA)
// use magic device emulation check.
if ((nEAbl >= nSpellCheck) && (nROGUE || nBARD))
{}// do nothing
else {
SendMessageToPC(oW, DRAIN);
return 1;
}
}
// check for Wizard/Sorceror spell
else if (FindSubString(sTag, "_WS") > -1){
nLvl = nWIZARDL;
if (nLvl < nSORCERERL) nLvl = nSORCERERL;
// 5.5 new ability check for scrolls
if ((nSORCERER && nSpellCheck > nCHARISMA && !(nWIZARD)) ||
(nWIZARD && nSpellCheck > nINTELLEGENCE && !(nSORCERER))||
(nWIZARD && nSORCERER && nSpellCheck > nINTELLEGENCE &&
nSpellCheck > nCHARISMA))
{
// use magic device emulation check.
if ((nEAbl >= nSpellCheck) && (nROGUE || nBARD))
{}// do nothing
else {
SendMessageToPC(oW, DRAIN);
return 1;
}
}
}
// all arcane classes can cast
else {
nLvl = nWIZARDL;
if (nLvl < nSORCERERL) nLvl = nSORCERERL;
if (nLvl < nBARDL) nLvl = nBARDL;
// 5.5 new ability check for scrolls
if ((nSORCERER && nSpellCheck > nCHARISMA && !nWIZARD && !nBARD) ||
(nWIZARD && nSpellCheck > nINTELLEGENCE && !nSORCERER && !nBARD)||
(nBARD && nSpellCheck > nCHARISMA && !nWIZARD && !nSORCERER) ||
(nWIZARD && nSORCERER && !nBARD && nSpellCheck > nINTELLEGENCE &&
nSpellCheck > nCHARISMA) ||
(nWIZARD && nBARD && !nSORCERER && nSpellCheck > nINTELLEGENCE &&
nSpellCheck > nCHARISMA) ||
(nBARD && nSORCERER && !nWIZARD && nSpellCheck > nCHARISMA) ||
(nWIZARD && nSORCERER && nBARD && nSpellCheck > nINTELLEGENCE &&
nSpellCheck > nCHARISMA))
{
// use magic device emulation check.
if ((nEAbl >= nSpellCheck) && (nROGUE || nBARD))
{}// do nothing
else {
SendMessageToPC(oW, DRAIN);
return 1;
}
}
}
}
// check for divine scroll
else if (FindSubString(sName, "(D)") > -1){
// Druid/Ranger only scroll
if (FindSubString(sTag, "_DR") > -1){
nLvl = nDRUIDL;
if (nLvl < (nRANGERL/2)) nLvl = (nRANGERL/2);
}
// Druid only scroll
if (FindSubString(sTag, "_D") > -1)
nLvl = nDRUIDL;
// Ranger only scroll
else if (FindSubString(sTag, "_R") > -1)
nLvl = (nRANGERL/2);
// Paladin only scroll
else if (FindSubString(sTag, "_P") > -1)
nLvl = (nPALADINL/2);
// Cleric/Paladin/Ranger spell
else if (FindSubString(sTag, "_CPR") > -1){
nLvl = nCLERICL;
if (nLvl < (nPALADINL/2)) nLvl = (nPALADINL/2);
if (nLvl < (nRANGERL/2)) nLvl = (nRANGERL/2);
}
// Cleric/Druid/Paladin spell
else if (FindSubString(sTag, "_CDP") > -1){
nLvl = nCLERICL;
if (nLvl < (nPALADINL/2)) nLvl = (nPALADINL/2);
if (nLvl < nDRUIDL) nLvl = (nDRUIDL);
}
// Cleric/Druid/Ranger spell
else if (FindSubString(sTag, "_CDR") > -1){
nLvl = nCLERICL;
if (nLvl < (nRANGERL/2)) nLvl = (nRANGERL/2);
if (nLvl < nDRUIDL) nLvl = (nDRUIDL);
}
// Cleric/Druid spell
else if (FindSubString(sTag, "_CD") > -1){
nLvl = nCLERICL;
if (nLvl < (nDRUIDL)) nLvl = (nDRUIDL);
}
// Cleric/Paladin spell
else if (FindSubString(sTag, "_CP") > -1){
nLvl = nCLERICL;
if (nLvl < (nPALADINL/2)) nLvl = (nPALADINL/2);
}
// Cleric/Ranger spell
else if (FindSubString(sTag, "_CR") > -1){
nLvl = nCLERICL;
if (nLvl < (nRANGERL/2)) nLvl = (nRANGERL/2);
}
// Cleric only scroll
else if (FindSubString(sTag, "_C") > -1)
nLvl = nCLERICL;
// all divine casters can cast
else {
nLvl = nCLERICL;
if (nLvl < (nPALADINL/2)) nLvl = (nPALADINL/2);
if (nLvl < (nRANGERL/2)) nLvl = (nRANGERL/2);
if (nLvl < (nDRUIDL)) nLvl = (nDRUIDL);
}
// 5.5 new ability check for scrolls
if (nSpellCheck > nWISDOM)
{
// use magic device emulation check.
if ((nEAbl >= nSpellCheck) && (nROGUE || nBARD))
{}// do nothing
else {
SendMessageToPC(oW, DRAIN);
return 1;
}
}
}
else
// regular scroll bypass scroll failure
return 0;
if (nLvl < nELvl && (nROGUE || nBARD)) nLvl = nELvl;
//SendMessageToPC(oW, "Your Caster Level "+IntToString(nLvl));
if (nLvl >= nCasterLevel)
return 0;
else
if (FailureCheck(oW, nCasterLevel, nSpellLevel, nLvl, nWisMod)) return 1;
return 0;
}