generated from Jaysyn/ModuleTemplate
319 lines
10 KiB
Plaintext
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;
|
|
}
|