/** * @file * Spellscript for Bow of the Black Archer SLAs * */ //#include "inc_newspellbook" #include "prc_inc_template" #include "prc_inc_combat" #include "spinc_teleport" int IsDrow(object oTarget) { int nRace = GetRacialType(oTarget); if(nRace == RACIAL_TYPE_DROW_MALE || nRace == RACIAL_TYPE_DROW_FEMALE || nRace == RACIAL_TYPE_HALFDROW || nRace == RACIAL_TYPE_DRIDER ) return TRUE; int nAppear = GetAppearanceType(oTarget); if(nAppear == APPEARANCE_TYPE_DROW_CLERIC || nAppear == APPEARANCE_TYPE_DROW_FEMALE_1 || nAppear == APPEARANCE_TYPE_DROW_FEMALE_2 || nAppear == APPEARANCE_TYPE_DROW_FIGHTER || nAppear == APPEARANCE_TYPE_DROW_MATRON || nAppear == APPEARANCE_TYPE_DROW_SLAVE || nAppear == APPEARANCE_TYPE_DROW_WARRIOR_1 || nAppear == APPEARANCE_TYPE_DROW_WARRIOR_2 || nAppear == APPEARANCE_TYPE_DROW_WARRIOR_3 || nAppear == APPEARANCE_TYPE_DROW_WIZARD || nAppear == APPEARANCE_TYPE_DRIDER || nAppear == APPEARANCE_TYPE_DRIDER_CHIEF || nAppear == APPEARANCE_TYPE_DRIDER_FEMALE) return TRUE; return FALSE; } void main() { object oPC = OBJECT_SELF; int nCasterLevel, nDC, nSpell, nUses; int nSLA = GetSpellId(); effect eNone; object oBow = GetItemPossessedBy(oPC, "BowoftheBlackArcher"); // You get nothing if you aren't wielding the bow if(oBow != GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC)) return; switch(nSLA){ case WOL_BBB_EYES_SHADOW: { nCasterLevel = 5; nSpell = SPELL_DARKVISION; nUses = 1; break; } case WOL_BBB_LONGSTRIDER: { nCasterLevel = 5; nSpell = SPELL_LONGSTRIDER; nUses = 3; break; } case WOL_BBB_SOLACE: { nCasterLevel = 5; nSpell = SPELL_LESSER_RESTORATION; nUses = 2; break; } case WOL_BBB_FRIEND_SHADOWS: { nCasterLevel = 11; nUses = 1; // Check uses per day. if (nUses > GetLegacyUses(oPC, nSLA)) { Teleport(oPC, nCasterLevel, SPELL_TELEPORT, FALSE, ""); SetLegacyUses(oPC, nSLA); } break; } case WOL_BBB_DENY_DEMONWEB: { nCasterLevel = 10; nSpell = SPELL_PROTECTION_FROM_EVIL; nUses = 2; break; } case WOL_BBB_DROWSEEKER: { int nCount; location lTarget = GetLocation(oPC); // Hunt for Drow object oTest = MyFirstObjectInShape(SHAPE_SPELLCYLINDER, FeetToMeters(60.0), lTarget, TRUE, OBJECT_TYPE_CREATURE); while(GetIsObjectValid(oTest)) { if(IsDrow(oTest)) nCount++; //next object oTest = MyNextObjectInShape(SHAPE_SPELLCYLINDER, FeetToMeters(60.0), lTarget, TRUE, OBJECT_TYPE_CREATURE); } //You detect the presence of FloatingTextStringOnCreature(GetStringByStrRef(16832001) + " " + IntToString(nCount) + " Drow.", oPC, FALSE); break; } case WOL_BBB_SHOCKING_SHOT: { nUses = 5; if (DEBUG) DoDebug("Shocking Shot 1"); // Check uses per day. if (nUses > GetLegacyUses(oPC, nSLA)) { if (DEBUG) DoDebug("Shocking Shot 2"); PerformAttackRound(PRCGetSpellTargetObject(), oPC, eNone, 0.0, 0, d6(5), DAMAGE_TYPE_ELECTRICAL, FALSE, "Shocking Shot Hit", "Shocking Shot Miss"); SetLegacyUses(oPC, nSLA); } if (DEBUG) DoDebug("Shocking Shot 3"); break; } case WOL_BBB_PIERCE_BLACK_HEART: { nUses = 1; // Check uses per day. if (nUses > GetLegacyUses(oPC, nSLA)) { object oTarget = PRCGetSpellTargetObject(); PerformAttackRound(oTarget, oPC, eNone, 0.0, 0, 0, 0, FALSE, "Pierce the Black Heart Hit", "Pierce the Black Heart Miss"); SetLegacyUses(oPC, nSLA); if (GetLocalInt(oTarget, "PRCCombat_StruckByAttack") && IsDrow(oTarget)) { nDC = 20; if (17 + GetAbilityModifier(ABILITY_CHARISMA, oPC) > nDC) nDC = 17 + GetAbilityModifier(ABILITY_CHARISMA, oPC); //Make a fortitude save to avoid death if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_DEATH)) //, OBJECT_SELF, 3.0)) { DeathlessFrenzyCheck(oTarget); //Apply the delay VFX impact and death effect SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), oTarget); effect eDeath = EffectDeath(); SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget); // no delay } } } break; } } if (DEBUG) DoDebug("wol_bbb_sla: nSLA "+IntToString(nSLA)+", nCasterLevel "+IntToString(nCasterLevel)+", nSpell "+IntToString(nSpell)+", nUses "+IntToString(nUses)); // Check uses per day, Drowseeker is infinite if (GetLegacyUses(oPC, nSLA) >= nUses && nSLA != WOL_BBB_DROWSEEKER) { FloatingTextStringOnCreature("You have used " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSLA))) + " the maximum amount of times today.", oPC, FALSE); return; } if (nSpell > 0) { DoRacialSLA(nSpell, nCasterLevel, nDC); SetLegacyUses(oPC, nSLA); FloatingTextStringOnCreature("You have "+IntToString(nUses - GetLegacyUses(oPC, nSLA))+ " uses of " + GetStringByStrRef(StringToInt(Get2DACache("spells", "Name", nSLA))) + " remaining today.", oPC, FALSE); } }