diff --git a/TemplePlus/action_sequence.cpp b/TemplePlus/action_sequence.cpp index 8cde7489f..fd201104c 100644 --- a/TemplePlus/action_sequence.cpp +++ b/TemplePlus/action_sequence.cpp @@ -1727,7 +1727,7 @@ int ActionSequenceSystem::TrimPathToRemainingMoveLength(D20Actn* d20a, float rem uint32_t ActionSequenceSystem::ActionCostNull(D20Actn* d20Actn, TurnBasedStatus* turnBasedStatus, ActionCostPacket* actionCostPacket) { actionCostPacket->hourglassCost = 0; - actionCostPacket->chargeAfterPicker = 0; + actionCostPacket->attackCost = 0; actionCostPacket->moveDistCost = 0; return 0; } @@ -3388,7 +3388,7 @@ BOOL ActionSequenceSystem::SimulsAdvance() int ActionSequenceSystem::ActionCostFullAttack(D20Actn* d20, TurnBasedStatus* tbStat, ActionCostPacket* acp) { - acp->chargeAfterPicker = 0; + acp->attackCost = 0; acp->moveDistCost = 0; acp->hourglassCost = 4; int flags = d20->d20Caf; @@ -3529,13 +3529,13 @@ int ActionSequenceSystem::ActionCostProcess(TurnBasedStatus* tbStat, D20Actn* d2 if (tbStat->surplusMoveDistance >= actCost.moveDistCost) { tbStat->surplusMoveDistance -= actCost.moveDistCost; - if ( actCost.chargeAfterPicker <= 0 - || actCost.chargeAfterPicker + tbStat->attackModeCode <= tbStat->baseAttackNumCode + tbStat->numBonusAttacks) + if ( actCost.attackCost <= 0 + || actCost.attackCost + tbStat->attackModeCode <= tbStat->baseAttackNumCode + tbStat->numBonusAttacks) { - if ((int) tbStat->numBonusAttacks < actCost.chargeAfterPicker) - tbStat->attackModeCode += actCost.chargeAfterPicker; + if (actCost.attackCost > (int) tbStat->numBonusAttacks ) + tbStat->attackModeCode += actCost.attackCost; else - tbStat->numBonusAttacks -= actCost.chargeAfterPicker; + tbStat->numBonusAttacks -= actCost.attackCost; if (tbStat->attackModeCode == tbStat->baseAttackNumCode && !tbStat->numBonusAttacks) tbStat->tbsFlags &= ~TBSF_FullAttack; result = AEC_OK; @@ -3799,12 +3799,13 @@ int ActionSequenceSystem::StdAttackTurnBasedStatusCheck(D20Actn* d20a, TurnBased return AEC_TARGET_INVALID; } + const int STD_ATK_HG_COST= 2; if (hgState != -1) - hgState = turnBasedStatusTransitionMatrix[hgState][2]; + hgState = turnBasedStatusTransitionMatrix[hgState][STD_ATK_HG_COST]; tbStat->hourglassState = hgState; - if (inventory.ItemWornAt(d20a->d20APerformer, 3) || dispatch.DispatchD20ActionCheck(d20a, tbStat, dispTypeGetCritterNaturalAttacksNum) <= 0) - tbStat->attackModeCode = 0; + if (inventory.ItemWornAt(d20a->d20APerformer, EquipSlot::WeaponPrimary) || dispatch.DispatchD20ActionCheck(d20a, tbStat, dispTypeGetCritterNaturalAttacksNum) <= 0) + tbStat->attackModeCode = ATTACK_CODE_PRIMARY; else tbStat->attackModeCode = ATTACK_CODE_NATURAL_ATTACK; tbStat->baseAttackNumCode = tbStat->attackModeCode + 1; @@ -4325,12 +4326,15 @@ const char*actionErrorCodeStrings[] = "AEC_NEED_A_STRAIGHT_LINE", "AEC_NO_ACTIONS", "AEC_NOT_IN_COMBAT", - "AEC_AREA_NOT_SAFE" + "AEC_AREA_NOT_SAFE", + "AEC_ABILITY_ON_COOLDOWN", + "AEC_ALREADY_USED_THIS_TURN", + "AEC_ALREADY_ACTIVE" }; ostream & operator<<(ostream & str, ActionErrorCode aec) { size_t i = (size_t)aec; - if (i <= AEC_AREA_NOT_SAFE) { + if (i <= AEC_ALREADY_ACTIVE) { str << actionErrorCodeStrings[i]; } else { diff --git a/TemplePlus/action_sequence.h b/TemplePlus/action_sequence.h index 63bb3d231..7fe384d09 100644 --- a/TemplePlus/action_sequence.h +++ b/TemplePlus/action_sequence.h @@ -48,7 +48,10 @@ enum ActionErrorCode : uint32_t AEC_NEED_A_STRAIGHT_LINE, AEC_NO_ACTIONS, AEC_NOT_IN_COMBAT, - AEC_AREA_NOT_SAFE + AEC_AREA_NOT_SAFE, + AEC_ABILITY_ON_COOLDOWN, + AEC_ALREADY_USED_THIS_TURN, + AEC_ALREADY_ACTIVE }; // Allows for direct use of ActionErrorCode in format() strings diff --git a/TemplePlus/condition.cpp b/TemplePlus/condition.cpp index dac122fed..1c3227d7d 100644 --- a/TemplePlus/condition.cpp +++ b/TemplePlus/condition.cpp @@ -338,6 +338,9 @@ class ConditionFunctionReplacement : public TempleFix { void apply() override { logger->info("Replacing Condition-related Functions"); + replaceFunction(0x100E19A0, []() { + conds.hashmethods.ConditionHashtableInit(conds.mCondStructHashtable); + }); //dispTypeConditionAddPre static int(__cdecl* orgTempAbilityLoss)(DispatcherCallbackArgs) = replaceFunction(0x100EA1F0, [](DispatcherCallbackArgs args) { Stat statDamaged = (Stat)args.GetCondArg(0); @@ -1794,16 +1797,16 @@ int __cdecl GlobalToHitBonus(DispatcherCallbackArgs args) && !d20Sys.d20Query(args.objHndCaller, DK_QUE_Polymorphed) ) { int attackIdx = dispIo->attackPacket.dispKey - (ATTACK_CODE_NATURAL_ATTACK + 1); - int bonValue = 0; // temporarily used as an index value for obj_f_attack_bonus_idx field + int atkBonIdx = 0; for (int i = 0, j=0; i < 4; i++) { j += objects.getArrayFieldInt32(args.objHndCaller, obj_f_critter_attacks_idx, i); // number of attacks if (attackIdx < j){ - bonValue = i; + atkBonIdx = i; break; } } - bonValue = objects.getArrayFieldInt32(args.objHndCaller, obj_f_attack_bonus_idx, bonValue); + int bonValue = objects.getArrayFieldInt32(args.objHndCaller, obj_f_attack_bonus_idx, atkBonIdx); bonusSys.bonusAddToBonusList(&dispIo->bonlist, bonValue, 1, 118); // base attack } @@ -7410,3 +7413,25 @@ void CondStructNew::AddAoESpellRemover() { AddHook(dispTypeD20Signal, DK_SIG_Spell_End, spCallbacks.AoeSpellRemove); } +uint32_t CondHashSystem::ConditionHashtableInit(ToEEHashtable* hashtable) +{ + const int VANILLA_COND_CAP = 1000; + return HashtableInit(hashtable, VANILLA_COND_CAP /*2023*/); +} + +uint32_t CondHashSystem::CondStructAddToHashtable(CondStruct* condStruct, bool overriding) +{ + + uint32_t key = StringHash(condStruct->condName); + CondStruct* condFound; + uint32_t result = HashtableSearch(condHashTable, key, &condFound); + if (result || overriding) + { + result = HashtableOverwriteItem(condHashTable, key, condStruct); + } + if (result == 3) { // over capacity + logger->error("Condition hashtable over capacity ({})! Trying to add {}", condHashTable->capacity, condStruct->condName); + } + return result; + +} diff --git a/TemplePlus/condition.h b/TemplePlus/condition.h index 8bc8ebab3..750c121ea 100644 --- a/TemplePlus/condition.h +++ b/TemplePlus/condition.h @@ -22,22 +22,9 @@ struct CondHashSystem : ToEEHashtableSystem < CondStruct > temple::Dll::RegisterAddressPtr((void**)&condHashTable); } - uint32_t ConditionHashtableInit(ToEEHashtable * hashtable) - { - return HashtableInit(hashtable, 1000); - } - - uint32_t CondStructAddToHashtable(CondStruct * condStruct, bool overriding = false) - { - uint32_t key = StringHash(condStruct->condName); - CondStruct * condFound; - uint32_t result = HashtableSearch(condHashTable, key, &condFound); - if (result || overriding) - { - result = HashtableOverwriteItem(condHashTable, key, condStruct); - } - return result; - } + uint32_t ConditionHashtableInit(ToEEHashtable* hashtable); + + uint32_t CondStructAddToHashtable(CondStruct* condStruct, bool overriding = false); int GetCondStructHashkey(CondStruct* condStruct) { diff --git a/TemplePlus/config/config.cpp b/TemplePlus/config/config.cpp index 4509602fe..242430120 100644 --- a/TemplePlus/config/config.cpp +++ b/TemplePlus/config/config.cpp @@ -129,6 +129,7 @@ static ConfigSetting configSettings[] = { CONF_BOOL(antialiasing), CONF_BOOL(softShadows), CONF_BOOL(noSound), + //CONF_BOOL(showFps), CONF_BOOL(featPrereqWarnings), CONF_BOOL(spellAlreadyKnownWarnings), CONF_BOOL(NPCsLevelLikePCs), diff --git a/TemplePlus/d20.cpp b/TemplePlus/d20.cpp index 83590eb5c..8510f5f47 100644 --- a/TemplePlus/d20.cpp +++ b/TemplePlus/d20.cpp @@ -2984,7 +2984,7 @@ ActionErrorCode D20ActionCallbacks::ActionCheckTripAttack(D20Actn* d20a, TurnBas ActionErrorCode D20ActionCallbacks::ActionCostCastSpell(D20Actn * d20a, TurnBasedStatus * tbStat, ActionCostPacket * acp){ acp->hourglassCost = 0; - acp->chargeAfterPicker = 0; + acp->attackCost = 0; acp->moveDistCost = 0.0f; auto flags = d20a->d20Caf; if ( (flags & D20CAF_FREE_ACTION) || !combatSys.isCombatActive()){ @@ -3048,7 +3048,7 @@ ActionErrorCode D20ActionCallbacks::ActionCostCastSpell(D20Actn * d20a, TurnBase } ActionErrorCode D20ActionCallbacks::ActionCostFullRound(D20Actn* d20a, TurnBasedStatus* tbStat, ActionCostPacket* acp){ - acp->chargeAfterPicker = 0; + acp->attackCost = 0; acp->moveDistCost = 0; acp->hourglassCost = 4; if ( (d20a->d20Caf & D20CAF_FREE_ACTION) || !combatSys.isCombatActive()) @@ -3876,7 +3876,7 @@ ActionErrorCode D20ActionCallbacks::TurnBasedStatusCheckPython(D20Actn* d20a, Tu } ActionErrorCode D20ActionCallbacks::ActionCostFullAttack(D20Actn * d20a, TurnBasedStatus * tbStat, ActionCostPacket * acp){ - acp->chargeAfterPicker = 0; + acp->attackCost = 0; acp->moveDistCost = 0; acp->hourglassCost = 4; //int flags = d20a->d20Caf; @@ -3893,7 +3893,7 @@ ActionErrorCode D20ActionCallbacks::ActionCostFullAttack(D20Actn * d20a, TurnBas } ActionErrorCode D20ActionCallbacks::ActionCostPartialCharge(D20Actn * d20a, TurnBasedStatus * tbStat, ActionCostPacket * acp){ - acp->chargeAfterPicker = 0; + acp->attackCost = 0; acp->moveDistCost = 0; acp->hourglassCost = 3; if ((d20a->d20Caf & D20CAF_FREE_ACTION) || !combatSys.isCombatActive()) @@ -3907,6 +3907,10 @@ ActionErrorCode D20ActionCallbacks::ActionCostPython(D20Actn* d20a, TurnBasedSta return (ActionErrorCode) d20Sys.GetPyActionCost(d20a, tbStat, acp); } +/* +0x100910F0 +Used in: Standard attack, Standard Ranged attack, Trip Attack, Touch Attack, Throw Weapon, Throw Grenade +*/ ActionErrorCode D20ActionCallbacks::ActionCostStandardAttack(D20Actn* d20a, TurnBasedStatus* tbStat, ActionCostPacket* acp){ if ( d20Sys.d20Query(d20a->d20APerformer, DK_QUE_HoldingCharge) @@ -3917,12 +3921,12 @@ ActionErrorCode D20ActionCallbacks::ActionCostStandardAttack(D20Actn* d20a, Turn } acp->hourglassCost = 0; - acp->chargeAfterPicker = 0; + acp->attackCost = 0; acp->moveDistCost = 0; if (!(d20a->d20Caf & D20CAF_FREE_ACTION) && combatSys.isCombatActive()) { - acp->chargeAfterPicker = 1; + acp->attackCost = 1; auto retainSurplusMoveDist = false; @@ -3945,7 +3949,7 @@ ActionErrorCode D20ActionCallbacks::ActionCostStandardAttack(D20Actn* d20a, Turn ActionErrorCode D20ActionCallbacks::ActionCostMoveAction(D20Actn *d20, TurnBasedStatus *tbStat, ActionCostPacket *acp) { acp->hourglassCost = 0; - acp->chargeAfterPicker = 0; + acp->attackCost = 0; acp->moveDistCost = 0; if (!(d20->d20Caf & D20CAF_FREE_ACTION) && combatSys.isCombatActive()) { @@ -3961,7 +3965,7 @@ ActionErrorCode D20ActionCallbacks::ActionCostMoveAction(D20Actn *d20, TurnBased ActionErrorCode D20ActionCallbacks::ActionCostNull(D20Actn* d20a, TurnBasedStatus* tbStat, ActionCostPacket* acp){ acp->hourglassCost = 0; - acp->chargeAfterPicker = 0; + acp->attackCost = 0; acp->moveDistCost = 0; return AEC_OK; } @@ -3973,7 +3977,7 @@ ActionErrorCode D20ActionCallbacks::ActionCostSwift(D20Actn* d20a, TurnBasedStat } acp->hourglassCost = 0; - acp->chargeAfterPicker = 0; + acp->attackCost = 0; acp->moveDistCost = 0; tbStat->tbsFlags |= TBSF_SwiftActionPerformed; return AEC_OK; @@ -3981,13 +3985,13 @@ ActionErrorCode D20ActionCallbacks::ActionCostSwift(D20Actn* d20a, TurnBasedStat ActionErrorCode D20ActionCallbacks::ActionCostStandardAction(D20Actn*, TurnBasedStatus*, ActionCostPacket*acp){ acp->hourglassCost = 2; - acp->chargeAfterPicker = 0; + acp->attackCost = 0; acp->moveDistCost = 0; return AEC_OK; }; ActionErrorCode D20ActionCallbacks::ActionCostWhirlwindAttack(D20Actn* d20a, TurnBasedStatus* tbStat, ActionCostPacket*acp) { - acp->chargeAfterPicker = 0; + acp->attackCost = 0; acp->moveDistCost = 0; acp->hourglassCost = 4; if ( ( d20a->d20Caf & D20CAF_FREE_ACTION) || !combatSys.isCombatActive()){ diff --git a/TemplePlus/d20_class.cpp b/TemplePlus/d20_class.cpp index 4dc3df5eb..15f9f9cf1 100644 --- a/TemplePlus/d20_class.cpp +++ b/TemplePlus/d20_class.cpp @@ -136,12 +136,12 @@ bool D20ClassSystem::IsCompatibleWithAlignment(Stat classEnum, Alignment al){ return temple::GetRef(0x10188170)(classEnum, al); } -bool D20ClassSystem::IsNaturalCastingClass(Stat classEnum, objHndl handle){ +bool D20ClassSystem::IsNaturalCastingClass(Stat classEnum, objHndl handle) { auto classSpec = classSpecs.find(classEnum); if (classSpec == classSpecs.end()) return false; - - return classSpec->second.spellMemorizationType == SpellReadyingType::Innate; + + return classSpec->second.spellMemorizationType == SpellReadyingType::Innate || classSpec->second.spellMemorizationType == SpellReadyingType::AtWill; } bool D20ClassSystem::IsNaturalCastingClass(uint32_t classEnum){ @@ -157,6 +157,15 @@ bool D20ClassSystem::IsVancianCastingClass(Stat classEnum, objHndl handle ) return classSpec->second.spellMemorizationType == SpellReadyingType::Vancian; } +bool D20ClassSystem::IsAtWillCastingClass(Stat classEnum) +{ + auto classSpec = classSpecs.find(classEnum); + if (classSpec == classSpecs.end()) + return false; + + return classSpec->second.spellMemorizationType == SpellReadyingType::AtWill; +} + bool D20ClassSystem::IsCastingClass(Stat classEnum, bool includeExtenders){ auto classSpec = classSpecs.find(classEnum); if (classSpec == classSpecs.end()) diff --git a/TemplePlus/d20_class.h b/TemplePlus/d20_class.h index 0e21e0b26..a54923270 100644 --- a/TemplePlus/d20_class.h +++ b/TemplePlus/d20_class.h @@ -101,6 +101,7 @@ class D20ClassSystem : temple::AddressTable bool IsNaturalCastingClass(Stat classEnum, objHndl handle = objHndl::null); bool IsNaturalCastingClass(uint32_t classEnum); bool IsVancianCastingClass(Stat classEnum, objHndl handle = objHndl::null); + bool IsAtWillCastingClass(Stat classEnum); bool IsCastingClass(Stat classEnum, bool includeExtenders = false); bool HasSpellList(Stat classEnum); // does this class have its own spell list? (as opposed to extending another's like Mystic Theurge does), e.g. Blackguard, Assassin bool IsLateCastingClass(Stat classEnum); // for classes like Ranger / Paladin that start casting on level 4 diff --git a/TemplePlus/d20_defs.h b/TemplePlus/d20_defs.h index 9378dd67a..828f543f4 100644 --- a/TemplePlus/d20_defs.h +++ b/TemplePlus/d20_defs.h @@ -109,10 +109,10 @@ enum class ActionCostType : int { struct ActionCostPacket { int hourglassCost; - int chargeAfterPicker; // flag I think; is only set at stuff that requires using the picker it seems + int attackCost; // how many attacks does this consume when doing Full Attack? (0 if not relevant; haven't seen a value > 1) float moveDistCost; - ActionCostPacket() { hourglassCost = 0; chargeAfterPicker = 0; moveDistCost = 0.0f; } + ActionCostPacket() { hourglassCost = 0; attackCost = 0; moveDistCost = 0.0f; } }; //const auto TestSizeOfActionCostPacket = sizeof(ActionCostPacket); // should be 12 (0xC) diff --git a/TemplePlus/damage.cpp b/TemplePlus/damage.cpp index 4706e58f5..8db22c89b 100644 --- a/TemplePlus/damage.cpp +++ b/TemplePlus/damage.cpp @@ -21,6 +21,8 @@ #include "pybind11/pybind11.h" #include "python/python_dice.h" +const int DAMAGE_MES_UNKNOWN = 103; + namespace py = pybind11; template <> class py::detail::type_caster { @@ -962,16 +964,78 @@ bool Damage::SavingThrowSpell(objHndl obj, objHndl attacker, int dc, SavingThrow // return addresses.SavingThrowSpell(obj, attacker, dc, type, flags, spellId); } -bool Damage::ReflexSaveAndDamage(objHndl obj, objHndl attacker, int dc, int reduction, int flags, const Dice& dice, DamageType damageType, int attackPower, D20ActionType actionType, int spellId) { - SpellPacketBody spPkt(spellId); - BonusList bonlist; +int GetTargetSpellDcBonus(objHndl attacker, objHndl obj, SpellPacketBody &spPkt) { + if (!spPkt.spellEnum) { + return 0; + } // Gets a DC bonus based on the target of the spell + BonusList bonlist; dispatch.DispatchTargetSpellDCBonus(attacker, obj, &bonlist, &spPkt); - int nDCBonus = bonlist.GetEffectiveBonusSum(); + return nDCBonus; +} + +/* 0x100B9500 */ +// Note: this is also used in traps, where spellId = 0 +bool Damage::ReflexSaveAndDamage(objHndl obj, objHndl attacker, int dc, int reduction, int flags, const Dice& dice, DamageType damageType, int attackPower, D20ActionType actionType, int spellId) { + //return addresses.ReflexSaveAndDamage(obj, attacker, dc, reduction, flags, dice.ToPacked(), damageType, attackPower, actionType, spellId); + + auto isSpellSave = actionType == D20A_CAST_SPELL; // todo: might require generalization for new action types? - return addresses.ReflexSaveAndDamage(obj, attacker, dc, reduction, flags, dice.ToPacked(), damageType, attackPower, actionType, spellId); + DispIoReflexThrow evtObj; + evtObj.reduction = (D20SavingThrowReduction)reduction; + evtObj.attackPower = (D20AttackPower)attackPower; + evtObj.damageMesLine = 105; // {105}{~Saving Throw~[TAG_SAVING_THROW_DESC]} + evtObj.attackType = (int)damageType; + evtObj.flags = (D20SavingThrowFlag)flags; + + if (isSpellSave) { // in vanilla, this always called SavingThrow, which would not apply the descriptor flags (and also the new DC bonus dispatch) + evtObj.throwResult = SavingThrowSpell(obj, attacker, dc, SavingThrowType::Reflex, flags, spellId); + } + else { + evtObj.throwResult = SavingThrow(obj, attacker, dc, SavingThrowType::Reflex, flags); + } + + auto caf = D20CAF_NONE; + if (evtObj.throwResult == 1) { + caf = D20CAF_SAVE_SUCCESSFUL; + if (reduction == D20SavingThrowReduction::D20_Save_Reduction_None) { + evtObj.effectiveReduction = 0; + } + else if (reduction == D20SavingThrowReduction::D20_Save_Reduction_Half) { + evtObj.effectiveReduction = 50; + } + else if (reduction == D20SavingThrowReduction::D20_Save_Reduction_Quarter) { + evtObj.effectiveReduction = 25; + } + else { + evtObj.effectiveReduction = 100; + } + } + + + dispatch.Dispatch49ReflexSaveReduction(obj, &evtObj); + if (evtObj.effectiveReduction == 100) { + if (isSpellSave) { + DealSpellDamage(obj, attacker, dice, (DamageType)evtObj.attackType, evtObj.attackPower, + 100, DAMAGE_MES_UNKNOWN, D20A_CAST_SPELL, spellId, caf); + } + else { + DealDamage(obj, attacker, dice, (DamageType)evtObj.attackType, evtObj.attackPower, + 100, DAMAGE_MES_UNKNOWN, actionType); + } + } + else if (isSpellSave) { + DealSpellDamage(obj, attacker, dice, (DamageType)evtObj.attackType, evtObj.attackPower, + evtObj.effectiveReduction, evtObj.damageMesLine, D20A_CAST_SPELL, spellId, caf); + } + else { + DealDamage(obj, attacker, dice, (DamageType)evtObj.attackType, evtObj.attackPower, + 100, evtObj.damageMesLine, actionType); + } + + return evtObj.throwResult; } void Damage::DamagePacketInit(DamagePacket* dmgPkt) diff --git a/TemplePlus/dispatcher.cpp b/TemplePlus/dispatcher.cpp index 50e21858f..34f3773a9 100644 --- a/TemplePlus/dispatcher.cpp +++ b/TemplePlus/dispatcher.cpp @@ -349,6 +349,20 @@ int DispatcherSystem::Dispatch44FinalSaveThrow(objHndl handle, SavingThrowType s return DispatchSavingThrow(handle, evtObj, dispTypeCountersongSaveThrow, (D20DispatcherKey)((int)saveType + D20DispatcherKey::DK_SAVE_FORTITUDE)); } +int DispatcherSystem::Dispatch49ReflexSaveReduction(objHndl handle, DispIoReflexThrow* evtObj) +{ + auto obj = objSystem->GetObject(handle); + if (!obj) + return 0; + + auto dispatcher = obj->GetDispatcher(); + if (!dispatcherValid(dispatcher)) + return 0; + + dispatcher->Process(dispTypeReflexThrow, D20DispatcherKey::DK_NONE, evtObj); + return evtObj->effectiveReduction; +} + DispIoCondStruct* DispatcherSystem::DispIoCheckIoType1(DispIoCondStruct* dispIo) { @@ -1684,3 +1698,15 @@ DispIoSpellsPerDay::DispIoSpellsPerDay() unk = 3001; unk2 = 0; } + +DispIoReflexThrow::DispIoReflexThrow() +{ + dispIOType = dispIOTypeReflexThrow; + effectiveReduction = 100; + reduction = D20SavingThrowReduction::D20_Save_Reduction_None; // 0 + damageMesLine = 103; // Unknown + attackPower = D20AttackPower::D20DAP_UNSPECIFIED; // 1 + attackType = (int)DamageType::Unspecified; // -1 + throwResult = 0; + flags = D20SavingThrowFlag::D20STF_NONE; +} diff --git a/TemplePlus/dispatcher.h b/TemplePlus/dispatcher.h index e3fd8c5b6..f5ef3b11c 100644 --- a/TemplePlus/dispatcher.h +++ b/TemplePlus/dispatcher.h @@ -23,6 +23,7 @@ struct DispIoDispelCheck; // 11 struct DispIoD20ActionTurnBased; // 12 struct DispIoMoveSpeed; //13 struct DispIOBonusListAndSpellEntry; // 14 +struct DispIoReflexThrow; // 15 struct DispIoObjEvent; // 17 struct DispIoSpellsPerDay; // 18 struct DispIoAbilityLoss; // 19 @@ -72,7 +73,7 @@ struct DispatcherSystem : temple::AddressTable int Dispatch13SavingThrow(objHndl handle, SavingThrowType saveType, DispIoSavingThrow* evtObj); int Dispatch14SavingThrowMod(objHndl handle, SavingThrowType saveType, DispIoSavingThrow* evtObj); int Dispatch44FinalSaveThrow(objHndl handle, SavingThrowType saveType, DispIoSavingThrow* evtObj); - + int Dispatch49ReflexSaveReduction(objHndl handle, DispIoReflexThrow* evtObj); #pragma region event object checkers @@ -457,6 +458,7 @@ struct DispIoReflexThrow : DispIO { // DispIoType = 15 int attackType; int throwResult; D20SavingThrowFlag flags; + DispIoReflexThrow(); }; struct DispIoObjEvent : DispIO // type 17 diff --git a/TemplePlus/hashtable.h b/TemplePlus/hashtable.h index c9bb81608..c78e3e573 100644 --- a/TemplePlus/hashtable.h +++ b/TemplePlus/hashtable.h @@ -8,11 +8,13 @@ struct ToEEHashtable : temple::TempleAlloc { uint32_t numItems; uint32_t capacity; - uint32_t powerOfTwo; - uint32_t * keyArray; + uint32_t powerOfTwo; // 2*capacity, rounded up to power of 2 + uint32_t * keyArray; // capacity: powerOfTwo T** dataArray; - uint32_t * idxArray; + uint32_t * idxArray; // capacity: capacity uint32_t pad; + + uint32_t Init(uint32_t capacity); }; template @@ -22,7 +24,8 @@ struct ToEEHashtableSystem : temple::AddressTable { hashtableOut->capacity = capacity; uint32_t powerOfTwo = 1; - for (hashtableOut->numItems = 0; powerOfTwo < 2 * capacity; powerOfTwo *= 2); + hashtableOut->numItems = 0; + for (; powerOfTwo < 2 * capacity; powerOfTwo *= 2); hashtableOut->powerOfTwo = powerOfTwo; hashtableOut->dataArray = _dataArrayNew(powerOfTwo); @@ -152,3 +155,9 @@ struct ToEEHashtableSystem : temple::AddressTable uint32_t(__cdecl* ELFhash)(char * stringIn); }; + +template +inline uint32_t ToEEHashtable::Init(uint32_t capacity) +{ + return uint32_t(); +} diff --git a/TemplePlus/python/python_dispatcher.cpp b/TemplePlus/python/python_dispatcher.cpp index 30e2c2993..f9113b649 100644 --- a/TemplePlus/python/python_dispatcher.cpp +++ b/TemplePlus/python/python_dispatcher.cpp @@ -1199,7 +1199,10 @@ PYBIND11_EMBEDDED_MODULE(tpdp, m) { py::class_(m, "EventObjSpellsPerDay", "Used for retrieving spells per day mods. Resurrected in Temple+!") .def_readwrite("bonus_list", &DispIoSpellsPerDay::bonList) - .def_readwrite("caster_class", &DispIoSpellsPerDay::classCode) + //.def_readwrite("caster_class", &DispIoSpellsPerDay::classCode) + .def("get_caster_class", [](DispIoSpellsPerDay& self)->int { + return (int)(self.classCode); + }) .def_readwrite("spell_level", &DispIoSpellsPerDay::spellLvl) .def_readwrite("base_caster_level", &DispIoSpellsPerDay::casterEffLvl) ; diff --git a/TemplePlus/python/python_integration_d20_action.cpp b/TemplePlus/python/python_integration_d20_action.cpp index f1cdc4646..71e94ca9a 100644 --- a/TemplePlus/python/python_integration_d20_action.cpp +++ b/TemplePlus/python/python_integration_d20_action.cpp @@ -133,9 +133,9 @@ PYBIND11_EMBEDDED_MODULE(tpactions, m) { return TRUE; }); - m.def("get_cur_seq", []()->ActnSeq &{ - return **actSeqSys.actSeqCur; - }); + m.def("get_cur_seq", []()->ActnSeq *{ + return *actSeqSys.actSeqCur; + }, py::return_value_policy::reference ); m.def("get_current_tb_actor", []()->objHndl { auto actor = tbSys.turnBasedGetCurrentActor(); diff --git a/TemplePlus/python/python_integration_feat.cpp b/TemplePlus/python/python_integration_feat.cpp index 2d100a740..7426d6d5e 100644 --- a/TemplePlus/python/python_integration_feat.cpp +++ b/TemplePlus/python/python_integration_feat.cpp @@ -5,7 +5,7 @@ PythonFeatIntegration pyFeatIntegration; PythonFeatIntegration::PythonFeatIntegration() - : PythonIntegration("scr\\feats\\feat*.py", "(feat[ \-]{0,}([\\w\\-' ]{1,}))\\.py", true) { + : PythonIntegration("scr\\feats\\feat*.py", "(feat[ \-]{0,}([\\w\\-'\\(\\) ]{1,}))\\.py", true) { } bool PythonFeatIntegration::CheckPrereq(int featId, objHndl handle, Stat classCodeBeingLevelledUp, Stat abilityScoreBeingIncreased) diff --git a/TemplePlus/python/python_object.cpp b/TemplePlus/python/python_object.cpp index e99f00088..90eb3ec88 100644 --- a/TemplePlus/python/python_object.cpp +++ b/TemplePlus/python/python_object.cpp @@ -2897,6 +2897,24 @@ static PyObject* PyObjHandle_AnimGoalPushHitByWeapon(PyObject* obj, PyObject* ar return PyInt_FromLong(gameSystems->GetAnim().PushGoalHitByWeapon( attacker, self->handle)); } +static PyObject* PyObjHandle_AnimGoalThrowSpellWithCastAnim(PyObject* obj, PyObject* args) { + + auto self = GetSelf(obj); + if (!self->handle) { + return PyInt_FromLong(0); + } + + if (!PyArg_ParseTuple(args, ":objhndl.anim_goal_throw_spell_w_cast_anim")) { + return 0; + } + auto curSeq = *actSeqSys.actSeqCur; + if (!curSeq || curSeq->performer != self->handle) { + return PyInt_FromLong(0); + } + auto &pkt = curSeq->spellPktBody; + return PyInt_FromLong(gameSystems->GetAnim().PushSpellCast(pkt, objHndl::null)); +} + static PyObject* PyObjHandle_AnimGoalPushUseObject(PyObject* obj, PyObject* args) { auto self = GetSelf(obj); if (!self->handle) { @@ -4550,6 +4568,7 @@ static PyMethodDef PyObjHandleMethods[] = { { "anim_goal_push_attack", PyObjHandle_AnimGoalPushAttack, METH_VARARGS, NULL }, { "anim_goal_push_dodge", PyObjHandle_AnimGoalPushDodge, METH_VARARGS, NULL }, { "anim_goal_push_hit_by_weapon", PyObjHandle_AnimGoalPushHitByWeapon, METH_VARARGS, NULL }, + { "anim_goal_throw_spell_w_cast_anim", PyObjHandle_AnimGoalThrowSpellWithCastAnim, METH_VARARGS, NULL }, { "anim_goal_use_object", PyObjHandle_AnimGoalPushUseObject, METH_VARARGS, NULL }, { "anim_goal_get_new_id", PyObjHandle_AnimGoalGetNewId, METH_VARARGS, NULL }, { "apply_projectile_particles", PyObjHandle_ApplyProjectileParticles, METH_VARARGS, NULL }, diff --git a/TemplePlus/radialmenu.cpp b/TemplePlus/radialmenu.cpp index afea39ba4..e014a83d5 100644 --- a/TemplePlus/radialmenu.cpp +++ b/TemplePlus/radialmenu.cpp @@ -365,6 +365,9 @@ void RadialMenus::BuildStandardRadialMenu(objHndl handle){ RadialMenuEntry spellEntryAction; for (auto i=0u; iGetSpell(obj_f_critter_spells_memorized_idx, i); + if (2299 < spData.spellEnum && spData.spellEnum < 2401) { // SKIP for Invocations; added by Sagenlicht + continue; + } if (spellSys.isDomainSpell(spData.classCode) || d20ClassSys.IsVancianCastingClass(spellSys.GetCastingClass(spData.classCode))){ AddSpell(handle, spData, specNode, spellEntryAction); @@ -374,6 +377,9 @@ void RadialMenus::BuildStandardRadialMenu(objHndl handle){ // Spells Known for (auto i = 0u; iGetSpell(obj_f_critter_spells_known_idx, i); + if (2299 < spData.spellEnum && spData.spellEnum < 2401) { // SKIP for Invocations; added by Sagenlicht + continue; + } if (!spellSys.isDomainSpell(spData.classCode) && d20ClassSys.IsNaturalCastingClass(spellSys.GetCastingClass(spData.classCode))) { AddSpell(handle, spData, specNode, spellEntryAction); diff --git a/TemplePlus/spell.cpp b/TemplePlus/spell.cpp index 7a2672d20..a757f241e 100644 --- a/TemplePlus/spell.cpp +++ b/TemplePlus/spell.cpp @@ -589,6 +589,16 @@ bool SpellPacketBody::IsVancian(){ return false; } +bool SpellPacketBody::IsAtWill() { + if (spellSys.isDomainSpell(spellClass)) + return false; + + if (d20ClassSys.IsAtWillCastingClass(spellSys.GetCastingClass(spellClass))) + return true; + + return false; +} + bool SpellPacketBody::IsDivine(){ if (spellSys.isDomainSpell(spellClass)) return true; @@ -683,11 +693,14 @@ void SpellPacketBody::Debit(){ } - // add to casted list (so it shows up as used in the Spellbook / gets counted up for spells per day) - SpellStoreData sd(spellEnum, spellKnownSlotLevel, spellClass, metaMagicData); - sd.spellStoreState.spellStoreType = SpellStoreType::spellStoreCast; - casterObj->SetSpell(obj_f_critter_spells_cast_idx, casterObj->GetSpellArray(obj_f_critter_spells_cast_idx).GetSize(), sd); + // skip adding spells to casted spells for AtWill casting classes + if (!IsAtWill()) { + // add to casted list (so it shows up as used in the Spellbook / gets counted up for spells per day) + SpellStoreData sd(spellEnum, spellKnownSlotLevel, spellClass, metaMagicData); + sd.spellStoreState.spellStoreType = SpellStoreType::spellStoreCast; + casterObj->SetSpell(obj_f_critter_spells_cast_idx, casterObj->GetSpellArray(obj_f_critter_spells_cast_idx).GetSize(), sd); + } } void SpellPacketBody::MemorizedUseUp(SpellStoreData &spellData){ @@ -1311,6 +1324,8 @@ uint32_t LegacySpellSystem::getWizSchool(objHndl objHnd) } bool LegacySpellSystem::IsForbiddenSchool(objHndl handle, int spSchool){ + if (School_None == spSchool) //Added in T+ for Invocations + return false; auto schoolData = gameSystems->GetObj().GetObject(handle)->GetInt32(obj_f_critter_school_specialization); auto forbSch1 = (schoolData & (0xFF00) ) >> 8; auto forbSch2 = (schoolData & (0xFF0000) ) >> 16; diff --git a/TemplePlus/spell.h b/TemplePlus/spell.h index 8797d0a34..1c53a34f2 100644 --- a/TemplePlus/spell.h +++ b/TemplePlus/spell.h @@ -92,6 +92,7 @@ struct SpellPacketBody{ const char* GetName(); // get the spell name bool IsVancian(); + bool IsAtWill(); bool IsDivine(); bool IsArcane(); bool IsItemSpell(); diff --git a/TemplePlus/spell_structs.h b/TemplePlus/spell_structs.h index 0b94846e0..621ba34f3 100644 --- a/TemplePlus/spell_structs.h +++ b/TemplePlus/spell_structs.h @@ -116,7 +116,9 @@ enum class SpellSourceType : int { enum class SpellReadyingType : int { Vancian = 0, // memorization slots Innate, // bards / sorcerers etc. - Any + Any, + AtWill + }; enum class SpellListType : int { diff --git a/TemplePlus/ui/ui_char_editor.cpp b/TemplePlus/ui/ui_char_editor.cpp index 9040746c3..d989beab3 100644 --- a/TemplePlus/ui/ui_char_editor.cpp +++ b/TemplePlus/ui/ui_char_editor.cpp @@ -3490,6 +3490,8 @@ bool Chargen::SpellIsForbidden(int spEnum, int spellClass){ SpellEntry spEntry(spEnum); auto spSchool = spEntry.spellSchoolEnum; + if (spSchool == School_None) //Added for Invocations + return false; if (spSchool == selPkt.forbiddenSchool1 || spSchool == selPkt.forbiddenSchool2) return true; diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 8e035b5bf..dc60b87c9 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3396,6 +3396,70 @@ spell_new_slot_lvl_8 = 1613 spell_new_slot_lvl_9 = 1614 +#Warlock Blast Shape Invocations +spell_eldritch_blast = 2300 +spell_eldritch_spear = 2301 +spell_hideous_blow = 2302 #not implemented +spell_eldritch_chain = 2303 +spell_eldritch_cone = 2304 +spell_eldritch_line = 2305 +spell_eldritch_doom = 2306 +spell_eldritch_glaive = 2307 #not implemented + +# Warlock Eldritch Essence Invocations +spell_frightful_blast = 2311 +spell_sickening_blast = 2312 +spell_beshadowed_blast = 2313 +spell_brimstone_blast = 2314 +spell_hellrime_blast = 2315 +spell_bewitching_blast = 2316 +spell_noxious_blast = 2317 +spell_repelling_blast = 2318 +spell_vitriolic_blast = 2319 +spell_hindering_blast = 2320 +spell_utterdark_blast = 2321 +spell_binding_blast = 2322 +spell_penetrating_blast = 2323 +spell_deteriorating_blast = 2324 + +#Warlock Invocations +spell_beguiling_influence = 2330 +spell_breath_of_the_night = 2331 +spell_dark_ones_own_luck = 2332 +spell_entropic_warding = 2333 +spell_leaps_and_bounds = 2334 +spell_miasmic_cloud = 2335 +spell_see_the_unseen = 2336 +spell_spiderwalk = 2337 # not implemented +spell_soulreaving_aura = 2338 +spell_all_seeing_eyes = 2239 +spell_warlock_charm = 2340 +spell_curse_of_despair = 2341 +spell_fell_flight = 2342 # not implemented +spell_flee_the_scene = 2343 +spell_the_dead_walk = 2344 # not implemented +spell_voracious_dispelling = 2345 # not implemented +spell_walk_unseen = 2346 +spell_cold_comfort = 2347 +spell_witchwood_step = 2348 # not implemented +spell_dread_seizure = 2349 # not implemented +spell_ignore_the_pyre = 2350 +spell_otherwordly_whispers = 2351 # not implemented +spell_serpents_tongue = 2352 # not implemented +spell_voidsense = 2353 # not implemented +spell_relentless_dispelling = 2354 # not implemented +spell_chilling_tentacles = 2355 # not implemented +spell_devour_magic = 2356 # not implemented +spell_enervating_shadow = 2357 # not implemented +spell_tenacious_plague = 2358 # not implemented +spell_wall_of_perilous_flame = 2359 # not implemented +spell_caustic_mire = 2360 # not implemented +spell_hellspawned_grace = 2361 # not implemented +spell_nightmares_made_real = 2362 # not implemented +spell_painful_slumber_of_ages = 2363 # not implemented +spell_retributive_invisibility = 2364 # not implemented +spell_word_of_changing = 2365 # not implemented + # Python Action Spells spell_epic_of_the_lost_king = 3080 spell_grapple = 3110 @@ -3506,6 +3570,10 @@ aoe_event_target_friendly = 1 aoe_event_target_non_friendly = 2 aoe_event_target_all = 3 +aoe_event_target_all_exclude_self = 4 +aoe_event_target_friendly_exlude_self = 5 +aoe_event_target_living_creatures = 6 +aoe_event_target_living_creatures_exclude_self = 7 #Bonus Types (aka modifiers) bonus_type_untyped = 0 @@ -3539,9 +3607,13 @@ bonus_type_curse_of_impending_blades = 163 bonus_type_wave_of_grief = 164 bonus_type_distract = 165 +bonus_type_foundation_of_stone = 166 bonus_type_marshal_aura_minor = 190 bonus_type_marshal_aura_major = 191 bonus_type_draconic_aura = 192 +bonus_type_invocation = 193 +bonus_type_hellrime_blast = 200 +bonus_type_curse_of_despair = 201 #Bonus Value is passed by spell passed_by_spell = 0 @@ -3732,6 +3804,8 @@ spell_readying_vancian = 0 spell_readying_innate = 1 +spell_readying_any = 2 +spell_readying_at_will = 3 # Textfloater colors tf_white = 0 diff --git a/tpdata/templeplus/lib/templeplus/pymod.py b/tpdata/templeplus/lib/templeplus/pymod.py index 93acd621b..7b11a267a 100644 --- a/tpdata/templeplus/lib/templeplus/pymod.py +++ b/tpdata/templeplus/lib/templeplus/pymod.py @@ -56,3 +56,9 @@ def AddSpellTeleportReconnectStandard(self): def AddSpellDispelCheckStandard(self): self.add_spell_dispel_check_standard() +class BasicPyMod(tpdp.ModifierSpec): + def AddHook(self, eventType, eventKey, callbackFcn, argsTuple): + self.add_hook(eventType, eventKey, callbackFcn, argsTuple) + def ExtendExisting(self, condName): + self.extend_existing(condName) + diff --git a/tpdata/tpmes/bonus.mes b/tpdata/tpmes/bonus.mes index 8e0f06ec8..070ceac67 100644 --- a/tpdata/tpmes/bonus.mes +++ b/tpdata/tpmes/bonus.mes @@ -13,4 +13,19 @@ {347}{~Seeking Weapon~[TAG_WEAPON_SEEKING]} {348}{Bardic Music - Inspire Heroics} {349}{Hiding in Combat} -{350}{Tower Shield} \ No newline at end of file +{350}{Tower Shield} + +{375}{Creature Immune to ~Critical Strike~[TAG_SPELLS_CRITICAL_STRIKE]} +{376}{No Precision Damage for ~Critical Strike~[TAG_SPELLS_CRITICAL_STRIKE]} +{377}{No Precision Damage for ~Tactical Precision~[TAG_SPELLS_TACTICAL_PRECISION]} + +// Fist of the Forest +{400}{~Fist of the Forest Class Features~[TAG_FIST_OF_THE_FOREST] lost due to violating ~Primal Living~[TAG_CLASS_FEATURES_PRIMAL_LIVING]} +{401}{~Fist of the Forest AC Bonus~[TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_AC_BONUS] lost due to encumbrance} +{402}{~Fist of the Forest AC Bonus~[TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_AC_BONUS] lost due to wearing a shield} +{403}{~Fist of the Forest AC Bonus~[TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_AC_BONUS] lost due to armor} +{404}{~Fist of the Forest AC Bonus~[TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_AC_BONUS] lost due to being helpless} +{405}{~Fist of the Forest Fast Movement~[TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_FAST_MOVEMENT] lost due to encumbrance} +{406}{~Fist of the Forest Fast Movement~[TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_FAST_MOVEMENT] lost due to armor} +{407}{~Fist of the Forest Untamed Strike~[TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_UNTAMED_STRIKE]: Attack treated as Magic} +{408}{~Fist of the Forest Untamed Strike~[TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_UNTAMED_STRIKE]: does not stack with ~Ki Strike~[TAG_CLASS_FEATURES_MONK_KI_STRIKE]} diff --git a/tpdata/tpmes/combat.mes b/tpdata/tpmes/combat.mes index 408ef11ec..9a18fcddc 100644 --- a/tpdata/tpmes/combat.mes +++ b/tpdata/tpmes/combat.mes @@ -39,6 +39,9 @@ {5123}{Hide Check} {5124}{Prefer One-Handed Wield} +// New History Window entries +{5500} {Grapple Check} + {6017}{Set Caster Level} {6018}{Craft} {6019}{Set Caster Level (0 for min, 20 for max possible)} diff --git a/tpdatasrc/co8infra/mes/help/class_spell_lists.tab b/tpdatasrc/co8infra/mes/help/class_spell_lists.tab index 5d9dcc454..9a91509bc 100644 --- a/tpdatasrc/co8infra/mes/help/class_spell_lists.tab +++ b/tpdatasrc/co8infra/mes/help/class_spell_lists.tab @@ -1,4 +1,4 @@ -TAG_SPELLS Spells Spells are broken down by class and level as below: Assassin: ~Level 1~[TAG_ASSASSIN_1] ~Level 2~[TAG_ASSASSIN_2] ~Level 3~[TAG_ASSASSIN_3] ~Level 4~[TAG_ASSASSIN_4] Bard: ~Level 0~[TAG_BARD_0] ~Level 1~[TAG_BARD_1] ~Level 2~[TAG_BARD_2] ~Level 3~[TAG_BARD_3] ~Level 4~[TAG_BARD_4] ~Level 5~[TAG_BARD_5] ~Level 6~[TAG_BARD_6] Blackguard: ~Level 1~[TAG_BLACKGUARD_1] ~Level 2~[TAG_BLACKGUARD_2] ~Level 3~[TAG_BLACKGUARD_3] ~Level 4~[TAG_BLACKGUARD_4] Cleric: ~Domain~[TAG_DOMAINS] ~Level 0~[TAG_CLERIC_0] ~Level 1~[TAG_CLERIC_1] ~Level 2~[TAG_CLERIC_2] ~Level 3~[TAG_CLERIC_3] ~Level 4~[TAG_CLERIC_4] ~Level 5~[TAG_CLERIC_5] ~Level 6~[TAG_CLERIC_6] ~Level 7~[TAG_CLERIC_7] ~Level 8~[TAG_CLERIC_8] ~Level 9~[TAG_CLERIC_9] Druid: ~Level 0~[TAG_DRUID_0] ~Level 1~[TAG_DRUID_1] ~Level 2~[TAG_DRUID_2] ~Level 3~[TAG_DRUID_3] ~Level 4~[TAG_DRUID_4] ~Level 5~[TAG_DRUID_5] ~Level 6~[TAG_DRUID_6] ~Level 7~[TAG_DRUID_7] ~Level 8~[TAG_DRUID_8] ~Level 9~[TAG_DRUID_9] Paladin: ~Level 1~[TAG_PALADIN_1] ~Level 2~[TAG_PALADIN_2] ~Level 3~[TAG_PALADIN_3] ~Level 4~[TAG_PALADIN_4] Ranger: ~Level 1~[TAG_RANGER_1] ~Level 2~[TAG_RANGER_2] ~Level 3~[TAG_RANGER_3] ~Level 4~[TAG_RANGER_4] Sorcerer: ~Level 0~[TAG_SORCERER_0] ~Level 1~[TAG_SORCERER_1] ~Level 2~[TAG_SORCERER_2] ~Level 3~[TAG_SORCERER_3] ~Level 4~[TAG_SORCERER_4] ~Level 5~[TAG_SORCERER_5] ~Level 6~[TAG_SORCERER_6] ~Level 7~[TAG_SORCERER_7] ~Level 8~[TAG_SORCERER_8] ~Level 9~[TAG_SORCERER_9] Wizard: ~Level 0~[TAG_WIZARD_0] ~Level 1~[TAG_WIZARD_1] ~Level 2~[TAG_WIZARD_2] ~Level 3~[TAG_WIZARD_3] ~Level 4~[TAG_WIZARD_4] ~Level 5~[TAG_WIZARD_5] ~Level 6~[TAG_WIZARD_6] ~Level 7~[TAG_WIZARD_7] ~Level 8~[TAG_WIZARD_8] ~Level 9~[TAG_WIZARD_9] +TAG_SPELLS Spells Spells are broken down by class and level as below: Assassin: ~Level 1~[TAG_ASSASSIN_1] ~Level 2~[TAG_ASSASSIN_2] ~Level 3~[TAG_ASSASSIN_3] ~Level 4~[TAG_ASSASSIN_4] Bard: ~Level 0~[TAG_BARD_0] ~Level 1~[TAG_BARD_1] ~Level 2~[TAG_BARD_2] ~Level 3~[TAG_BARD_3] ~Level 4~[TAG_BARD_4] ~Level 5~[TAG_BARD_5] ~Level 6~[TAG_BARD_6] Blackguard: ~Level 1~[TAG_BLACKGUARD_1] ~Level 2~[TAG_BLACKGUARD_2] ~Level 3~[TAG_BLACKGUARD_3] ~Level 4~[TAG_BLACKGUARD_4] Cleric: ~Domain~[TAG_DOMAINS] ~Level 0~[TAG_CLERIC_0] ~Level 1~[TAG_CLERIC_1] ~Level 2~[TAG_CLERIC_2] ~Level 3~[TAG_CLERIC_3] ~Level 4~[TAG_CLERIC_4] ~Level 5~[TAG_CLERIC_5] ~Level 6~[TAG_CLERIC_6] ~Level 7~[TAG_CLERIC_7] ~Level 8~[TAG_CLERIC_8] ~Level 9~[TAG_CLERIC_9] Druid: ~Level 0~[TAG_DRUID_0] ~Level 1~[TAG_DRUID_1] ~Level 2~[TAG_DRUID_2] ~Level 3~[TAG_DRUID_3] ~Level 4~[TAG_DRUID_4] ~Level 5~[TAG_DRUID_5] ~Level 6~[TAG_DRUID_6] ~Level 7~[TAG_DRUID_7] ~Level 8~[TAG_DRUID_8] ~Level 9~[TAG_DRUID_9] Paladin: ~Level 1~[TAG_PALADIN_1] ~Level 2~[TAG_PALADIN_2] ~Level 3~[TAG_PALADIN_3] ~Level 4~[TAG_PALADIN_4] Ranger: ~Level 1~[TAG_RANGER_1] ~Level 2~[TAG_RANGER_2] ~Level 3~[TAG_RANGER_3] ~Level 4~[TAG_RANGER_4] Sorcerer: ~Level 0~[TAG_SORCERER_0] ~Level 1~[TAG_SORCERER_1] ~Level 2~[TAG_SORCERER_2] ~Level 3~[TAG_SORCERER_3] ~Level 4~[TAG_SORCERER_4] ~Level 5~[TAG_SORCERER_5] ~Level 6~[TAG_SORCERER_6] ~Level 7~[TAG_SORCERER_7] ~Level 8~[TAG_SORCERER_8] ~Level 9~[TAG_SORCERER_9] Warlock: ~Least Invocations~[TAG_INVOCATION_LEAST] ~Lesser Invocations~[TAG_INVOCATION_LESSER] ~Greater Invocations~[TAG_INVOCATION_GREATER] ~Dark Invocations~[TAG_INVOCATION_DARK] Warmage: ~Level 0~[TAG_WARMAGE_0] ~Level 1~[TAG_WARMAGE_1] ~Level 2~[TAG_WARMAGE_2] ~Level 3~[TAG_WARMAGE_3] ~Level 4~[TAG_WARMAGE_4] ~Level 5~[TAG_WARMAGE_5] ~Level 6~[TAG_WARMAGE_6] ~Level 7~[TAG_WARMAGE_7] ~Level 8~[TAG_WARMAGE_9] ~Level 9~[TAG_WARMAGE_9] Wizard: ~Level 0~[TAG_WIZARD_0] ~Level 1~[TAG_WIZARD_1] ~Level 2~[TAG_WIZARD_2] ~Level 3~[TAG_WIZARD_3] ~Level 4~[TAG_WIZARD_4] ~Level 5~[TAG_WIZARD_5] ~Level 6~[TAG_WIZARD_6] ~Level 7~[TAG_WIZARD_7] ~Level 8~[TAG_WIZARD_8] ~Level 9~[TAG_WIZARD_9] TAG_CLASS_FEATURES_ASSASSIN_SPELLS TAG_ASSASSINS Assassin Spells Beginning at 1st level, an assassin gains the ability to cast a number of arcane spells. To cast a spell, an assassin must have an ~Intelligence~[TAG_INTELLIGENCE] score of at least 10 + the spell's level, so an assassin with an Intelligence of 10 or lower cannot cast these spells. Assassin bonus spells are based on Intelligence, and saving throws against these spells have a DC of 10 + spell level + the assassin's Intelligence bonus (if any). When the assassin gets 0 spells per day of a given spell level (for instance, 1st-level spells for a 1st-level assassin), he gains only the bonus spells he would be entitled to based on his Intelligence score for that spell level. The assassin's spell list appears below. An assassin casts spells just as a ~bard~[TAG_BARDS] does. @tUpon reaching 6th level, at every even-numbered level after that (8th and 10th), an assassin can choose to learn a new spell in place of one he already knows. The new spell's level must be the same as that of the spell being exchanged, and it must be at least two levels lower than the highest-level assassin spell the assassin can cast. For instance, upon reaching 6th level, an assassin could trade in a single 1st-level spell (two spell levels below the highestlevel sorcerer spell he can cast, which is 3rd) for a different 1stlevel spell. At 8th and 10th levels, he could trade in a single 1stlevel or 2nd-level spell (since he now can cast 4th-level assassin spells) for a different spell of the same level. An assassin may swap only a single spell at any given level, and must choose whether or not to swap the spell at the same time that he gains new spells known for that level. Assassin Spell List ~Level 1~[TAG_ASSASSIN_1][CMD_CHILDREN_SORTED] ~Level 2~[TAG_ASSASSIN_2][CMD_CHILDREN_SORTED] ~Level 3~[TAG_ASSASSIN_3][CMD_CHILDREN_SORTED] ~Level 4~[TAG_ASSASSIN_4][CMD_CHILDREN_SORTED] TAG_ASSASSIN_1 TAG_SPELLS Level 1 Assassin Spells [CMD_CHILDREN_SORTED] TAG_ASSASSIN_2 TAG_SPELLS Level 2 Assassin Spells [CMD_CHILDREN_SORTED] @@ -10,11 +10,28 @@ TAG_BLACKGUARD_1 TAG_SPELLS Level 1 Blackguard Spells [CMD_CHILDREN_SORTED] TAG_BLACKGUARD_2 TAG_SPELLS Level 2 Blackguard Spells [CMD_CHILDREN_SORTED] TAG_BLACKGUARD_3 TAG_SPELLS Level 3 Blackguard Spells [CMD_CHILDREN_SORTED] TAG_BLACKGUARD_4 TAG_SPELLS Level 4 Blackguard Spells [CMD_CHILDREN_SORTED] +TAG_INVOCATION_LEAST TAG_SPELLS Warlock Least Invocations [CMD_CHILDREN_SORTED] +TAG_INVOCATION_LESSER TAG_SPELLS Warlock Lesser Invocations [CMD_CHILDREN_SORTED] +TAG_INVOCATION_GREATER TAG_SPELLS Warlock Greater Invocations [CMD_CHILDREN_SORTED] +TAG_INVOCATION_DARK TAG_SPELLS Warlock Dark Invocations [CMD_CHILDREN_SORTED] +TAG_WARMAGE_0 TAG_SPELLS Level 0 Warmage Spells [CMD_CHILDREN_SORTED] +TAG_WARMAGE_1 TAG_SPELLS Level 1 Warmage Spells [CMD_CHILDREN_SORTED] +TAG_WARMAGE_2 TAG_SPELLS Level 2 Warmage Spells [CMD_CHILDREN_SORTED] +TAG_WARMAGE_3 TAG_SPELLS Level 3 Warmage Spells [CMD_CHILDREN_SORTED] +TAG_WARMAGE_4 TAG_SPELLS Level 4 Warmage Spells [CMD_CHILDREN_SORTED] +TAG_WARMAGE_5 TAG_SPELLS Level 5 Warmage Spells [CMD_CHILDREN_SORTED] +TAG_WARMAGE_6 TAG_SPELLS Level 6 Warmage Spells [CMD_CHILDREN_SORTED] +TAG_WARMAGE_7 TAG_SPELLS Level 7 Warmage Spells [CMD_CHILDREN_SORTED] +TAG_WARMAGE_8 TAG_SPELLS Level 8 Warmage Spells [CMD_CHILDREN_SORTED] +TAG_WARMAGE_9 TAG_SPELLS Level 9 Warmage Spells [CMD_CHILDREN_SORTED] +TAG_SPELLS_ACID_SPLASH TAG_SPELLS TAG_SORCERER_0 TAG_WARMAGE_0 TAG_WIZARD_0 Acid Splash ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Creation) Acid Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 0, ~Warmage~[TAG_WARMAGES] 0 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Effect: One missile of acid Duration: Instantaneous Saving Throw: None Spell Resistance: No You fire a small orb of acid at the target. You must succeed on a ranged ~touch attack~[TAG_TOUCH_ATTACK] to hit your target. The orb deals 1d3 points of acid damage. TAG_SPELLS_BULL'S_STRENGTH TAG_SPELLS TAG_BLACKGUARD_2 TAG_CLERIC_2 TAG_DRUID_2 TAG_PALADIN_2 TAG_SORCERER_2 TAG_STRENGTH_D TAG_WIZARD_2 Bull's Strength ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Blackguard~[TAG_BLACKGUARDS] 2, ~Cleric~[TAG_CLERICS] 2, ~Druid~[TAG_DRUIDS] 2, ~Paladin~[TAG_PALADINS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2, ~Domain: Strength~[TAG_STRENGTH_D] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 1 min./level Saving Throw: ~Will~[TAG_WILL] negates (harmless) Spell Resistance: Yes (harmless) The subject becomes stronger. The spell grants a +4 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus to ~Strength~[TAG_STRENGTH], adding the usual benefits to melee ~attack rolls~[TAG_ATTACK_ROLL], melee damage rolls, and other uses of the Strength modifier. +TAG_SPELLS_BURNING_HANDS TAG_SPELLS TAG_FIRE_D TAG_SORCERER_1 TAG_WARMAGE_1 TAG_WIZARD_1 Burning Hands ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Fire) Level: ~Domain: Fire~[TAG_FIRE_D] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 15 ft. Area: Cone-shaped burst Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes A cone of searing flame shoots from your fingertips. Any creature in the area of the flames takes 1d4 points of fire damage per ~caster level~[TAG_CASTER_LEVEL] (maximum 5d4). TAG_SPELLS_CATS_GRACE TAG_SPELLS TAG_ASSASSIN_2 TAG_BARD_2 TAG_DRUID_2 TAG_RANGER_2 TAG_SORCERER_2 TAG_WIZARD_2 Cat's Grace ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Assassin~[TAG_ASSASSINS] 2, ~Bard~[TAG_BARDS] 2, ~Druid~[TAG_DRUIDS] 2, ~Ranger~[TAG_RANGERS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 1 min./level Saving Throw: ~Will~[TAG_WILL] negates (harmless) Spell Resistance: Yes The transmuted creature becomes more graceful, agile, and coordinated. The spell grants a +4 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus to ~Dexterity~[TAG_DEXTERITY], adding the usual benefits to ~AC~[TAG_ARMOR_CLASS], ~Reflex~[TAG_REFLEX] saves, and other uses of the Dexterity modifier. TAG_SPELLS_CAUSE_FEAR TAG_SPELLS TAG_BARD_1 TAG_BLACKGUARD_1 TAG_CLERIC_1 TAG_DEATH_D TAG_SORCERER_1 TAG_WIZARD_1 Cause Fear ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Fear, Mind-Affecting Level: ~Bard~[TAG_BARDS] 1, ~Blackguard~[TAG_BLACKGUARDS] 1, ~Cleric~[TAG_CLERICS] 1, ~Domain: Death~[TAG_DEATH_D] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Target: One living creature with 5 or fewer HD Duration: 1d4 rounds (if saving throw is failed) or 1 round (if saving throw is successful) Saving Throw: ~Will~[TAG_WILL] partial Spell Resistance: Yes The affected creature becomes ~frightened~[TAG_FRIGHTENED]. If the subject succeeds on a Will save, it is ~shaken~[TAG_SHAKEN] for 1 round. Creatures with 6 or more HD are immune to this effect. Cause Fear counters and dispels ~Remove Fear~[TAG_SPELLS_REMOVE_FEAR]. +TAG_SPELLS_CHILL_TOUCH TAG_SPELLS TAG_SORCERER_1 TAG_WARMAGE_1 TAG_WIZARD_1 Chill Touch ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Targets: Creature or creatures touched (up to one/level) Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] partial or ~Will~[TAG_WILL] negates; see text Spell Resistance: Yes A touch from your hand, which glows with blue energy, disrupts the life force of living creatures. Each touch channels negative energy that deals 1d6 points of damage. The touched creature also takes 1 point of ~Strength~[TAG_STRENGTH] damage unless it makes a successful Fortitude saving throw. You can use this melee ~touch attack~[TAG_TOUCH_ATTACK] up to one time per level. An undead creature you touch takes no damage of either sort, but it must make a successful Will ~saving throw~[TAG_SAVING_THROW_DESC] or flee as if ~panicked~[TAG_PANICKED] for 1d4 rounds +1 round per ~caster level~[TAG_CASTER_LEVEL]. TAG_SPELLS_CLAIRAUDIENCE_CLAIRVOYANCE TAG_SPELLS TAG_ASSASSIN_4 TAG_BARD_3 TAG_KNOWLEDGE_D TAG_SORCERER_3 TAG_WIZARD_3 Clairaudience/Clairvoyance ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] (Scrying) Level: ~Assassin~[TAG_ASSASSINS] 4, ~Bard~[TAG_BARDS] 3, ~Domain: Knowledge~[TAG_KNOWLEDGE_D] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Components: V, S Casting Time: 10 minutes Range: Long (400 ft. + 40 ft./level) Effect: Magical sensor Duration: 1 min./level (D) Saving Throw: None Spell Resistance: No Clairaudience/Clairvoyance creates an invisible magical sensor at a specific location that enables you to hear or see (your choice) almost as if you were there. You don't need line of sight or line of effect, but the locale must be known--a place familiar to you or an obvious one. Once you have selected the locale, the sensor doesn't move. Clairaudience/Clairvoyance functions only on the plane of existence you are currently occupying. -TAG_SPELLS_CONTAGION TAG_SPELLS TAG_BLACKGUARD_3 TAG_CLERIC_3 TAG_DESTRUCTION_D TAG_DRUID_3 TAG_SORCERER_4 TAG_WIZARD_4 Contagion ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] (Evil) Level: ~Blackguard~[TAG_BLACKGUARDS] 3, ~Cleric~[TAG_CLERICS] 3, ~Domain: Destruction~[TAG_DESTRUCTION_D] 3, ~Druid~[TAG_DRUIDS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Living creature touched Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates Spell Resistance: Yes The subject contracts a ~disease~[TAG_DISEASED] selected from the table below, which strikes immediately (no incubation period). The DC noted is for the subsequent saves (use Contagion's normal save DC for the initial saving throw). Disease DCs, Damage, and Descriptions Disease DC Damage Blinding Sickness @t16 @t1d4 ~Str~[TAG_STRENGTH] Cackle fever @t16 @t1d6 ~Wis~[TAG_WISDOM] Filth fever @t12 @t1d3 ~Dex~[TAG_DEXTERITY] and 1d3 ~Con~[TAG_CONSTITUTION] Mindfire @t12 @t1d4 ~Int~[TAG_INTELLIGENCE] Red ache @t15 @t1d6 Str Shakes @t13 @t1d8 Dex Slimy doom @t14 @t1d4 Con Blinding Sickness: Spread in tainted water. Cackle Fever: Symptoms include high fever, disorientation, and frequent bouts of hideous laugher. Also known as the "shrieks". Filth Fever: ~Dire Rats~[TAG_MONSTER_DIRE_RAT] and ~Otyughs~[TAG_MONSTER_OTYUGH] spread it. Those injured while in filthy surroundings might also catch it. Mindfire: Feels like your brain is burning. Causes stupor. Red Ache: Skin turns red, bloated, and warm to the touch. The Shakes: Causes involuntary twitches, tremors, and fits. Slimy Doom: Victim turns into infectious goo from the inside out. Can cause permanent ~ability drain~[TAG_ABILITY_DRAINED]. +TAG_SPELLS_CONTAGION TAG_SPELLS TAG_BLACKGUARD_3 TAG_CLERIC_3 TAG_DESTRUCTION_D TAG_DRUID_3 TAG_SORCERER_4 TAG_WARMAGE_4 TAG_WIZARD_4 Contagion ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] (Evil) Level: ~Blackguard~[TAG_BLACKGUARDS] 3, ~Cleric~[TAG_CLERICS] 3, ~Domain: Destruction~[TAG_DESTRUCTION_D] 3, ~Druid~[TAG_DRUIDS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Warmage~[TAG_WARMAGES] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Living creature touched Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates Spell Resistance: Yes The subject contracts a ~disease~[TAG_DISEASED] selected from the table below, which strikes immediately (no incubation period). The DC noted is for the subsequent saves (use Contagion's normal save DC for the initial saving throw). Disease DCs, Damage, and Descriptions Disease DC Damage Blinding Sickness @t16 @t1d4 ~Str~[TAG_STRENGTH] Cackle fever @t16 @t1d6 ~Wis~[TAG_WISDOM] Filth fever @t12 @t1d3 ~Dex~[TAG_DEXTERITY] and 1d3 ~Con~[TAG_CONSTITUTION] Mindfire @t12 @t1d4 ~Int~[TAG_INTELLIGENCE] Red ache @t15 @t1d6 Str Shakes @t13 @t1d8 Dex Slimy doom @t14 @t1d4 Con Blinding Sickness: Spread in tainted water. Cackle Fever: Symptoms include high fever, disorientation, and frequent bouts of hideous laugher. Also known as the "shrieks". Filth Fever: ~Dire Rats~[TAG_MONSTER_DIRE_RAT] and ~Otyughs~[TAG_MONSTER_OTYUGH] spread it. Those injured while in filthy surroundings might also catch it. Mindfire: Feels like your brain is burning. Causes stupor. Red Ache: Skin turns red, bloated, and warm to the touch. The Shakes: Causes involuntary twitches, tremors, and fits. Slimy Doom: Victim turns into infectious goo from the inside out. Can cause permanent ~ability drain~[TAG_ABILITY_DRAINED]. TAG_SPELLS_CURE_CRITICAL_WOUNDS TAG_SPELLS TAG_BARD_4 TAG_BLACKGUARD_4 TAG_CLERIC_4 TAG_DRUID_5 TAG_HEALING_D Cure Critical Wounds ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Healing) Level: ~Bard~[TAG_BARDS] 4, ~Blackguard~[TAG_BLACKGUARDS] 4, ~Cleric~[TAG_CLERICS] 4, ~Druid~[TAG_DRUIDS] 5, ~Domain: Healing~[TAG_HEALING_D] 4 This spell functions like ~Cure Light Wounds~[TAG_SPELLS_CURE_LIGHT_WOUNDS], except that it cures 4d8 points of damage +1 point per ~caster level~[TAG_CASTER_LEVEL] (maximum +20). TAG_SPELLS_CURE_LIGHT_WOUNDS TAG_SPELLS TAG_BARD_1 TAG_BLACKGUARD_1 TAG_CLERIC_1 TAG_DRUID_1 TAG_HEALING_D TAG_PALADIN_1 TAG_RANGER_2 Cure Light Wounds ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Healing) Level: ~Bard~[TAG_BARDS] 1, ~Blackguard~[TAG_BLACKGUARD_1] 1, ~Cleric~[TAG_CLERICS] 1, ~Druid~[TAG_DRUIDS] 1, ~Domain: Healing~[TAG_HEALING_D] 1, ~Paladin~[TAG_PALADINS] 1, ~Ranger~[TAG_RANGERS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: Instantaneous Saving Throw: ~Will~[TAG_WILL] half (harmless); see text Spell Resistance: Yes (harmless); see text When laying your hand upon a living creature, you channel positive energy that cures 1d8 points of damage +1 point per ~caster level~[TAG_CASTER_LEVEL] (maximum +5). Since undead are powered by negative energy, this spell deals damage to them instead of curing their wounds. An undead creature can apply ~spell resistance~[TAG_SPECIAL_ABILITIES_SPELL_RESISTANCE], and can attempt a Will save to take half damage. TAG_SPELLS_CURE_MODERATE_WOUNDS TAG_SPELLS TAG_BARD_2 TAG_BLACKGUARD_2 TAG_CLERIC_2 TAG_DRUID_3 TAG_HEALING_D TAG_PALADIN_3 TAG_RANGER_3 Cure Moderate Wounds ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Healing) Level: ~Bard~[TAG_BARDS] 2, ~Blackguard~[TAG_BLACKGUARDS] 2, ~Cleric~[TAG_CLERICS] 2, ~Druid~[TAG_DRUIDS] 3, ~Domain: Healing~[TAG_HEALING_D] 2, ~Paladin~[TAG_PALADINS] 3, ~Ranger~[TAG_RANGERS] 3 This spell functions like ~Cure Light Wounds~[TAG_SPELLS_CURE_LIGHT_WOUNDS], except that it cures 2d8 points of damage +1 point per ~caster level~[TAG_CASTER_LEVEL] (maximum +10). @@ -22,28 +39,43 @@ TAG_SPELLS_CURE_SERIOUS_WOUNDS TAG_SPELLS TAG_BARD_3 TAG_BLACKGUARD_3 TAG_CLERI TAG_SPELLS_DEATH_KNELL TAG_SPELLS TAG_BLACKGUARD_2 TAG_CLERIC_2 TAG_DEATH_D Death Knell ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] (Death, Evil) Level: ~Blackguard~[TAG_BLACKGUARDS] 2, ~Cleric~[TAG_CLERICS] 2, ~Domain: Death~[TAG_DEATH_D] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Living creature touched Duration: Instantaneous/10 minutes per HD of subject; see text Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes You draw forth the ebbing life force of a creature and use it to fuel your own power. Upon casting this spell you touch a living creature that has -1 or fewer ~hit points~[TAG_HIT_POINTS]. If the subject fails its ~saving throw~[TAG_SAVING_THROW_DESC], it dies, and you gain 1d8 ~temporary hit points~[TAG_TEMPORARY_HIT_POINTS] and a +2 bonus to ~Strength~[TAG_STRENGTH]. Additionally, your effective ~caster level~[TAG_CASTER_LEVEL] goes up by +1, improving spell effects dependent on caster level. (This increase in effective caster level does not grant you access to more spells.) These effects last for 10 minutes per HD of the subject creature. TAG_SPELLS_DEEP_SLUMBER TAG_SPELLS TAG_ASSASSIN_3 TAG_BARD_3 TAG_SORCERER_3 TAG_WIZARD_3 Deep Slumber ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT] (Compulsion) Mind-Affecting Level: ~Assassin~[TAG_ASSASSINS] 3, ~Bard~[TAG_BARDS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Range: Close (25 ft. + 5 ft./2 levels) This spell functions like ~Sleep~[TAG_SPELLS_SLEEP], except that it affects 10 HD of creatures. TAG_SPELLS_DIMENSION_DOOR TAG_SPELLS TAG_ASSASSIN_4 TAG_BARD_4 TAG_SORCERER_4 TAG_WIZARD_4 TAG_TRAVEL_D Dimension Door ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Teleportation) Level: ~Assassin~[TAG_ASSASSINS] 4, ~Bard~[TAG_BARDS] 4, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Domain: Travel~[TAG_TRAVEL_D] 4 Components: V Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Long (400 ft. + 40 ft./level) Target: You and touched objects or other touched willing creatures. Duration: Instantaneous Saving Throw: None and ~Will~[TAG_WILL] negates (object) Spell Resistance: No and Yes (object) You instantly transfer yourself from your current location to any other spot within range. You arrive at the spot you selected, provided you could have arrived there through nonmagical means, i.e., you can use Dimension Door to move into the next room but not into solid rock. After using this spell, you can't take any other actions until your next turn. +TAG_SPELLS_DISRUPT_UNDEAD TAG_SPELLS TAG_SORCERER_0 TAG_WARMAGE_0 TAG_WIZARD_0 Disrupt Undead ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 0, ~Warmage~[TAG_WARMAGES] 0 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Effect: Ray Duration: Instantaneous Saving Throw: None Spell Resistance: Yes You direct a ray of positive energy. You must make a ranged ~touch attack~[TAG_TOUCH_ATTACK] to hit, and if the ray hits an undead creature, it deals 1d6 points of damage to it. TAG_SPELLS_DOOM TAG_SPELLS TAG_BLACKGUARD_1 TAG_CLERIC_1 Doom ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Fear, Mind-Affecting Level: ~Blackguard~[TAG_BLACKGUARDS] 1, ~Cleric~[TAG_CLERICS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Target: One living creature Duration: 1 min./level Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes This spell fills a single subject with a feeling of horrible dread that causes it to become ~shaken~[TAG_SHAKEN]. TAG_SPELLS_EAGLE'S_SPLENDOR TAG_SPELLS TAG_BARD_2 TAG_BLACKGUARD_2 TAG_CLERIC_2 TAG_PALADIN_2 TAG_SORCERER_2 TAG_WIZARD_2 Eagle's Splendor ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Bard~[TAG_BARDS] 2, ~Blackguard~[TAG_BLACKGUARDS] 2, ~Cleric~[TAG_CLERICS] 2, ~Paladin~[TAG_PALADINS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 1 min./level Saving Throw: ~Will~[TAG_WILL] negates (harmless) Spell Resistance: Yes The transmuted creature becomes more poised, articulate, and personally forceful. The spell grants a +4 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus to ~Charisma~[TAG_CHARISMA], adding the usual benefits to Charisma-based ~skill checks~[TAG_USING_SKILLS] and other uses of the Charisma modifier. Sorcerers and bards (and other spellcasters who rely on Charisma) affected by this spell do not gain any additional bonus spells for the increased Charisma, but the save DCs for spells they cast while under this spell's effect do increase. TAG_SPELLS_FALSE_LIFE TAG_SPELLS TAG_ASSASSIN_3 TAG_SORCERER_2 TAG_WIZARD_2 False Life ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Assassin~[TAG_ASSASSINS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 hour/level or until discharged; see text You harness the power of unlife to grant yourself a limited ability to avoid death. While this spell is in effect, you gain ~temporary hit points~[TAG_TEMPORARY_HIT_POINTS] equal to 1d10 + 1 per ~caster level~[TAG_CASTER_LEVEL] (maximum +10). +TAG_SPELLS_FIRE_SHIELD TAG_SPELLS TAG_FIRE_D TAG_SORCERER_4 TAG_SUN_D TAG_WARMAGE_3 TAG_WIZARD_4 Fire Shield ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Fire or Cold) Level: ~Domain: Fire~[TAG_FIRE_D] 5, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Domain: Sun~[TAG_SUN_D] 4, ~Warmage~[TAG_WARMAGES] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 round/level (D) This spell wreathes you in flames and causes damage to each creature that attacks you in melee. The flames also protect you from either cold-based or fire-based attacks (your choice). Any creature striking you with its body or a handheld weapon deals normal damage, but at the same time the attacker takes 1d6 point of damage +1 point per ~caster level~[TAG_CASTER_LEVEL] (maximum +15). This damage is either cold damage (if the shield protects against fire-based attacks) or fire damage (if the shield protects against cold-based attacks). If the attacker has ~spell resistance~[TAG_SPECIAL_ABILITIES_SPELL_RESISTANCE], it applies to this effect. Creatures wielding weapons with exceptional reach, such as ~longspears~[TAG_WEAPONS_LONGSPEAR], are not subject to this damage if they attack you. Warm Shield: The flames are warm to the touch. You only take half damage from cold-based attacks. If such an attack allows a ~Reflex~[TAG_REFLEX] save for half damage, you take no damage on a successful save. Chill Shield: The flames are cool to the touch. You only take half damage from fire-based attacks. If such an attack allows a Reflex save for half damage, you take no damage on a successful save. +TAG_SPELLS_FIREBALL TAG_SPELLS TAG_SORCERER_3 TAG_WARMAGE_3 TAG_WIZARD_3 Fireball ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Fire) Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3, ~Warmage~[TAG_WARMAGES] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Long (400 ft. + 40 ft./level) Area: 20-ft. radius spread Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes A Fireball spell is an explosion of flame that detonates with a low roar and deals 1d6 points of fire damage per ~caster level~[TAG_CASTER_LEVEL] (maximum 10d6) to every creature within that area. Unattended objects also take this damage. The explosion creates almost no pressure. You point your finger and determine the range (distance and height) at which the Fireball is to burst. A glowing pea-sized bead streaks from the pointing digit and, unless it impacts upon a material body or solid barrier prior to attaining the prescribed range, blossoms into the Fireball at that point. TAG_SPELLS_FOX'S_CUNNING TAG_SPELLS TAG_ASSASSIN_2 TAG_BARD_2 TAG_SORCERER_2 TAG_WIZARD_2 Fox's Cunning ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Assassin~[TAG_ASSASSINS] 2, ~Bard~[TAG_BARDS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 1 min./level Saving Throw: ~Will~[TAG_WILL] negates (harmless) Spell Resistance: Yes The transmuted creature becomes smarter. The spell grants a +4 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus to ~Intelligence~[TAG_INTELLIGENCE], adding the usual benefits to Intelligence-based ~skill checks~[TAG_USING_SKILLS] and other uses of the Intelligence modifier. Wizards (and other spellcasters who rely on Intelligence) affected by this spell do not gain any additional bonus spells for the increased Intelligence, but the save DCs for spells they cast while under this spell's effect do increase. This spell doesn't grant extra ~skill points~[TAG_ACQUIRE_SKILLS]. TAG_SPELLS_FREEDOM_OF_MOVEMENT TAG_SPELLS TAG_ASSASSIN_4 TAG_BARD_4 TAG_BLACKGUARD_4 TAG_CLERIC_4 TAG_DRUID_4 TAG_LUCK_D TAG_RANGER_4 Freedom of Movement ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Assassin~[TAG_ASSASSINS] 4, ~Bard~[TAG_BARDS] 4, ~Blackguard~[TAG_BLACKGUARDS] 4, ~Cleric~[TAG_CLERICS] 4, ~Druid~[TAG_DRUIDS] 4, ~Domain: Luck~[TAG_LUCK_D] 4, ~Ranger~[TAG_RANGERS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal or touch Target: You or creature touched Duration: 10 min./level Saving Throw: ~Will~[TAG_WILL] negates (harmless) Spell Resistance: Yes (harmless) This spell enables you or a creature you touch to move and attack normally for the duration of the spell, even while under the influence of magic that usually impedes movement, such as ~Solid Fog~[TAG_SPELLS_SOLID_FOG], ~Slow~[TAG_SPELLS_SLOW], and ~Web~[TAG_SPELLS_WEB]. The subject automatically succeeds on any ~grapple~[TAG_GRAPPLING] checks made to escape a grapple or a pin. TAG_SPELLS_GLIBNESS TAG_SPELLS TAG_ASSASSIN_4 TAG_BARD_3 Glibness ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Assassin~[TAG_ASSASSINS] 4, ~Bard~[TAG_BARDS] 3 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 10 min./level (D) Your speech becomes fluent and more believable. You gain a +30 bonus on ~Bluff~[TAG_BLUFF] checks made to convince another of the truth of your words. (This bonus doesn't apply to other uses of the Bluff skill, such as ~feinting~[TAG_FEINT] in combat, creating a diversion to hide, or communicating a hidden message via innuendo.) +TAG_SPELLS_GUST_OF_WIND TAG_SPELLS TAG_DRUID_2 TAG_SORCERER_2 TAG_WARMAGE_3 TAG_WIZARD_2 Gust of Wind ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Air) Level: ~Druid~[TAG_DRUIDS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2, ~Warmage~[TAG_WARMAGES] 3 Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 60 ft. Effect: Line-shaped burst of severe wind emanating out from you to the extreme of the range Duration: 1 round Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates Spell Resistance: Yes This spell creates a severe blast of air (approximately 50 mph) that originates from you and affects all creatures in its path. A Tiny or smaller creature on the ground is knocked down and rolled 1d4x10 feet, taking 1d4 points of ~nonlethal damage~[TAG_RADIAL_MENU_NONLETHAL_DAMAGE] per 10 feet. Small creatures are knocked ~prone~[TAG_PRONE] by the force of the wind. Medium creatures are unable to move forward against the force of the wind. Large or larger creatures may move normally within a Gust of Wind effect. A Gust of Wind can't move a creature beyond the limit of its range. Any creature, regardless of ~size~[TAG_SIZE_MODIFIER], takes a -4 penalty on ~ranged attacks~[TAG_RANGED_ATTACKS] and ~Listen~[TAG_LISTEN] checks in the area of a Gust of Wind. +TAG_SPELLS_ICE_STORM TAG_SPELLS TAG_DRUID_4 TAG_SORCERER_4 TAG_WARMAGE_3 TAG_WIZARD_4 TAG_WATER_D Ice Storm ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Cold) Level: ~Druid~[TAG_DRUIDS] 4, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Warmage~[TAG_WARMAGES] 3, ~Domain: Water~[TAG_WATER_D] 5 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Long (400 ft. + 40 ft./level) Area: Cylinder (20-ft. radius, 40 ft. high) Duration: 1 full round Saving Throw: None Spell Resistance: Yes Great magical hailstones pound down for 1 full round, dealing 3d6 points of bludgeoning damage and 2d6 points of cold damage to every creature in the area. A -4 penalty applies to each ~Listen~[TAG_LISTEN] check made within the Ice Storm's effect, and all land movement within its area is reduced to half speed. At the end of the duration, the hail disappears, leaving no aftereffects (other than the damage dealt). TAG_SPELLS_INFLICT_CRITICAL_WOUNDS TAG_SPELLS TAG_BLACKGUARD_4 TAG_CLERIC_4 TAG_DESTRUCTION_D Inflict Critical Wounds ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Blackguard~[TAG_BLACKGUARDS] 4, ~Cleric~[TAG_CLERICS] 4, ~Domain: Destruction~[TAG_DESTRUCTION_D] 4 This spell functions like ~Inflict Light Wounds~[TAG_SPELLS_INFLICT_LIGHT_WOUNDS], except that you deal 4d8 points of damage +1 point per ~caster level~[TAG_CASTER_LEVEL] (maximum +20). TAG_SPELLS_INFLICT_LIGHT_WOUNDS TAG_SPELLS TAG_BLACKGUARD_1 TAG_CLERIC_1 TAG_DESTRUCTION_D Inflict Light Wounds ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Blackguard~[TAG_BLACKGUARDS] 1, ~Cleric~[TAG_CLERICS] 1, ~Domain: Destruction~[TAG_DESTRUCTION_D] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: Instantaneous Saving Throw: ~Will~[TAG_WILL] half Spell Resistance: Yes When laying your hand upon a creature, you channel negative energy that deals 1d8 points of damage +1 point per ~caster level~[TAG_CASTER_LEVEL] (maximum +5). Since undead are powered by negative energy, this spell cures such a creature of a like amount of damage, rather than harming it. TAG_SPELLS_INFLICT_MODERATE_WOUNDS TAG_SPELLS TAG_BLACKGUARD_2 TAG_CLERIC_2 Inflict Moderate Wounds ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Blackguard~[TAG_BLACKGUARDS] 2, ~Cleric~[TAG_CLERICS] 2 This spell functions like ~Inflict Light Wounds~[TAG_SPELLS_INFLICT_LIGHT_WOUNDS], except that you deal 2d8 points of damage +1 point per ~caster level~[TAG_CASTER_LEVEL] (maximum +10). TAG_SPELLS_INFLICT_SERIOUS_WOUNDS TAG_SPELLS TAG_BLACKGUARD_3 TAG_CLERIC_3 Inflict Serious Wounds ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Blackguard~[TAG_BLACKGUARDS] 3, ~Cleric~[TAG_CLERICS] 3 This spell functions like ~Inflict Light Wounds~[TAG_SPELLS_INFLICT_LIGHT_WOUNDS], except that you deal 3d8 points of damage +1 point per ~caster level~[TAG_CASTER_LEVEL] (maximum +15). TAG_SPELLS_INVISIBILITY TAG_SPELLS TAG_ASSASSIN_2 TAG_BARD_2 TAG_SORCERER_2 TAG_WIZARD_2 TAG_TRICKERY_D Invisibility ~Illusion~[TAG_MAGIC_SCHOOLS_ILLUSION] (Glamer) Level: ~Assassin~[TAG_ASSASSINS] 2, ~Bard~[TAG_BARDS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2, ~Domain: Trickery~[TAG_TRICKERY_D] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal or touch Target: You or a creature Duration: 1 min./level (D) Saving Throw: ~Will~[TAG_WILL] negates (harmless) Spell Resistance: Yes (harmless) The creature touched becomes ~invisible~[TAG_INVISIBLE], vanishing from sight. If the recipient is a creature carrying gear, that vanishes, too. If you cast the spell on someone else, neither you nor your allies can see the subject, unless you can normally see invisible things or you employ magic to do so. Items dropped or put down by an invisible creature become visible; items picked up disappear if tucked into the clothing or pouches worn by the creature. Any part of an item that the subject carries but that extends more than 10 feet from it becomes visible, such as a trailing rope. Of course, the subject is not magically silenced, and certain other conditions can render the recipient detectable (such as stepping in a puddle). The spell ends if the subject attacks any creature. For purposes of this spell, an attack includes spells targeting a foe or whose areas of effect include a foe. Causing harm indirectly is not an attack. Spells such as ~Bless~[TAG_SPELLS_BLESS] that specifically affect allies but not foes are not attacks for this purpose, even when they include foes in their area of effect. An invisible being can open doors, talk, summon monsters, remotely trigger traps, and so forth. There are certain modifiers which affect Invisibility in combat, such as the following: The invisible Attacker: +2 bonus to ~melee attacks~[TAG_MELEE_ATTACKS] and +2 bonus to ~ranged attacks~[TAG_RANGED_ATTACKS] The Defender: - Loses any ~Dexterity~[TAG_DEXTERITY] bonus to ~AC~[TAG_ARMOR_CLASS] and loses any dodge bonuses. However, if the Defender is ~blind~[TAG_BLINDED] the bonuses are not lost. - Has a 50% miss chance because the Attacker is in total ~concealment~[TAG_CONCEALMENT]. TAG_SPELLS_INVISIBILITY_GREATER TAG_SPELLS TAG_ASSASSIN_4 TAG_BARD_4 TAG_SORCERER_4 TAG_WIZARD_4 Invisibility, Greater ~Illusion~[TAG_MAGIC_SCHOOLS_ILLUSION] (Glamer) Level: ~Assassin~[TAG_ASSASSINS] 4, ~Bard~[TAG_BARDS] 4, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4 Components: V, S Target: You or creature touched Duration: 1 round/level (D) Saving Throw: ~Will~[TAG_WILL] negates (harmless) This spell functions like ~Invisibility~[TAG_SPELLS_INVISIBILITY], except that it doesn't end if the subject attacks. +TAG_SPELLS_LIGHTNING_BOLT TAG_SPELLS TAG_SORCERER_3 TAG_WARMAGE_3 TAG_WIZARD_3 Lightning Bolt ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Electricity) Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3, ~Warmage~[TAG_WARMAGES] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 120 ft. Area: 120-ft. line Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes You release a powerful stroke of electrical energy that deals 1d6 points of electricity damage per ~caster level~[TAG_CASTER_LEVEL] (maximum 10d6) to each creature within its area. The bolt begins at your fingertips. The Lightning Bolt sets fire to combustibles and damages objects in its path. It can melt some metals. Lightning Bolt does not break through walls or barriers. TAG_SPELLS_MAGIC_CIRCLE_AGAINST_GOOD TAG_SPELLS TAG_ASSASSIN_3 TAG_CLERIC_3 TAG_EVIL_D TAG_SORCERER_3 TAG_WIZARD_3 Magic Circle against Good ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] (Evil) Level: ~Assassin~[TAG_ASSASSINS] 3, ~Cleric~[TAG_CLERICS] 3, ~Domain: Evil~[TAG_EVIL_D] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 This spell functions like ~Magic Circle against Evil~[TAG_SPELLS_MAGIC_CIRCLE_AGAINST_EVIL], except that it is similar to ~Protection from Good~[TAG_SPELLS_PROTECTION_FROM_GOOD] instead of ~Protection from Evil~[TAG_SPELLS_PROTECTION_FROM_EVIL], and it can imprison a nonevil called creature. +TAG_SPELLS_MAGIC_MISSILE TAG_SPELLS TAG_SORCERER_1 TAG_WARMAGE_1 TAG_WIZARD_1 Magic Missile ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Force) Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Targets: Up to five creatures, no two of which can be more than 15 ft. apart Duration: Instantaneous Saving Throw: None Spell Resistance: Yes A missile of magical energy darts forth from your fingertip and strikes its target, dealing 1d4+1 points of force damage. The missile strikes unerringly, even if the target is in melee combat or has less than total ~cover~[TAG_COVER] or total ~concealment~[TAG_CONCEALMENT]. Specific parts of a creature can't be singled out. Inanimate objects are not damaged by the spell. For every two ~caster levels~[TAG_CASTER_LEVEL] beyond 1st, you gain an additional missile: @tTwo at 3rd level @tThree at 5th level @tFour at 7th level @tFive at 9th level (the maximum number of missiles) If you shoot multiple missiles, you can have them strike a single creature or several creatures. A single missile can only strike one creature. You must designate targets before you check for ~spell resistance~[TAG_SPECIAL_ABILITIES_SPELL_RESISTANCE] or roll damage. TAG_SPELLS_MAGIC_WEAPON TAG_SPELLS TAG_BLACKGUARD_1 TAG_CLERIC_1 TAG_PALADIN_1 TAG_SORCERER_1 TAG_WIZARD_1 TAG_WAR_D Magic Weapon ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Blackguard~[TAG_BLACKGUARDS] 1, ~Cleric~[TAG_CLERICS] 1, ~Paladin~[TAG_PALADINS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Domain: War~[TAG_WAR_D] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Weapon touched Duration: 1 min./level Saving Throw: ~Will~[TAG_WILL] negates (harmless, object) Spell Resistance: Yes (harmless, object) Magic Weapon gives a weapon a +1 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus on ~attack~[TAG_ATTACK_ROLL] and damage rolls. (An enhancement bonus does not stack with a ~masterwork~[TAG_MASTERWORK] weapon's +1 bonus on attack rolls.) You can't cast this spell on a natural weapon, such as an ~unarmed strike~[TAG_WEAPONS_STRIKE_UNARMED] (instead, see ~Magic Fang~[TAG_SPELLS_MAGIC_FANG]). A ~monk's~[TAG_MONKS] unarmed strike is considered a weapon, and thus it can be enhanced by this spell. +TAG_SPELLS_MELF'S_ACID_ARROW TAG_SPELLS TAG_SORCERER_2 TAG_WARMAGE_2 TAG_WIZARD_2 Melf's Acid Arrow ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Creation) Acid Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2, ~Warmage~[TAG_WARMAGES] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Long (400 ft. + 40 ft./level) Effect: One arrow of acid Duration: 1 round + 1 round per three levels Saving Throw: None Spell Resistance: No A magical arrow of acid springs from your hand and speeds to its target. You must succeed on a ranged ~touch attack~[TAG_TOUCH_ATTACK] to hit your target. The arrow deals 2d4 points of acid damage with no splash damage. For every three ~caster levels~[TAG_CASTER_LEVEL] (to a maximum of 18th), the acid, unless somehow neutralized, lasts for another round, dealing another 2d4 points of damage in that round. TAG_SPELLS_MODIFY_MEMORY TAG_SPELLS TAG_ASSASSIN_4 TAG_BARD_4 Modify Memory ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT] (Compulsion) Mind-Affecting Level: ~Assassin~[TAG_ASSASSINS] 4, ~Bard~[TAG_BARDS] 4 Components: V, S Casting Time: 1 round Range: Close (25 ft. + 5 ft./2 levels) Target: One living creature Duration: Permanent Saving Throw: ~Will~[TAG_WILL] negates; see text Spell Resistance: Yes You reach into the subject's mind and modify as many as 5 minutes of its memories in one of the following ways. Co8 Note: Modify Memory has the following effects on a target. - The target does not become hostile and attack you on sight. - Your ~reputation~[TAG_HMU_LOGBOOK_UI_REPUTATIONS] with the target is increased. - The target does not notice you for 5 minutes. - The target is given -8 on ~Spot~[TAG_SPOT] and ~Listen~[TAG_LISTEN] skill checks for 5 minutes. A successful saving throw does not cause the target to attack you, but does put them on the alert (+4 on Spot and Listen skill checks) for 5 minutes. A modified memory does not necessarily affect the subject's actions, particularly if it contradicts the creature's natural inclinations. An illogical modified memory is dismissed by the creature as a bad dream or a memory muddied by too much wine. TAG_SPELLS_OBSCURING_MIST TAG_SPELLS TAG_AIR_D TAG_ASSASSIN_1 TAG_CLERIC_1 TAG_DRUID_1 TAG_SORCERER_1 TAG_WIZARD_1 TAG_WATER_D Obscuring Mist ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Creation) Level: ~Domain: Air~[TAG_AIR_D] 1, ~Assassin~[TAG_ASSASSINS] 1, ~Cleric~[TAG_CLERICS] 1, ~Druid~[TAG_DRUIDS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Domain: Water~[TAG_WATER_D] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 20 ft. Effect: Cloud spreads in 20-ft.-radius from you, 20 ft. high Duration: 1 min./level Saving Throw: None Spell Resistance: No A misty vapor arises around you. It is stationary once created. The vapor obscures all sight beyond 5 feet. A creature 5 feet away has partial ~concealment~[TAG_CONCEALMENT] (attacks have a 20% miss chance). Creatures farther away have total concealment (50% miss chance, and the attacker cannot use sight to locate the target). -TAG_SPELLS_POISON TAG_SPELLS TAG_ASSASSIN_4 TAG_BLACKGUARD_4 TAG_CLERIC_4 TAG_DRUID_3 Poison ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Assassin~[TAG_ASSASSINS] 4, ~Blackguard~[TAG_BLACKGUARDS] 4, ~Cleric~[TAG_CLERICS] 4, ~Druid~[TAG_DRUIDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Living creature touched Duration: Instantaneous; see text Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates; see text Spell Resistance: Yes Calling upon the venomous powers of natural predators, you infect the subject with a horrible ~poison~[TAG_POISON] by making a successful melee ~touch attack~[TAG_TOUCH_ATTACK]. The poison deals 1d10 points of temporary ~Constitution~[TAG_CONSTITUTION] damage immediately and another 1d10 points of temporary Constitution damage 1 minute later. Each instance of damage can be negated by a Fortitude save (DC 10 + 1/2 your ~caster level~[TAG_CASTER_LEVEL] + your ~Wis~[TAG_WISDOM] modifier). +TAG_SPELLS_PHANTASMAL_KILLER TAG_SPELLS TAG_SORCERER_4 TAG_WARMAGE_4 TAG_WIZARD_4 Phantasmal Killer ~Illusion~[TAG_MAGIC_SCHOOLS_ILLUSION] (Phantasm) Fear, Mind-Affecting Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Warmage~[TAG_WARMAGES] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Target: One living creature Duration: Instantaneous Saving Throw: ~Will~[TAG_WILL] disbelief (if interacted with), then ~Fortitude~[TAG_FORTITUDE] partial; see text Spell Resistance: Yes You create a phantasmal image of the most fearsome creature imaginable to the subject simply by forming the fears of the subject's subconscious mind into something that its conscious mind can visualize: this most horrible beast. The target first gets a Will save to recognize the image as unreal. If that save fails, the phantasm touches the subject, and the subject must succeed on a Fortitude save or die from ~fear~[TAG_FEAR]. Even if the Fortitude save is successful, the subject takes 3d6 points of damage. +TAG_SPELLS_POISON TAG_SPELLS TAG_ASSASSIN_4 TAG_BLACKGUARD_4 TAG_CLERIC_4 TAG_DRUID_3 TAG_WARMAGE_3 Poison ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Assassin~[TAG_ASSASSINS] 4, ~Blackguard~[TAG_BLACKGUARDS] 4, ~Cleric~[TAG_CLERICS] 4, ~Druid~[TAG_DRUIDS] 3, ~Warmage~[TAG_WARMAGES] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Living creature touched Duration: Instantaneous; see text Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates; see text Spell Resistance: Yes Calling upon the venomous powers of natural predators, you infect the subject with a horrible ~poison~[TAG_POISON] by making a successful melee ~touch attack~[TAG_TOUCH_ATTACK]. The poison deals 1d10 points of temporary ~Constitution~[TAG_CONSTITUTION] damage immediately and another 1d10 points of temporary Constitution damage 1 minute later. Each instance of damage can be negated by a Fortitude save (DC 10 + 1/2 your ~caster level~[TAG_CASTER_LEVEL] + your ~Wis~[TAG_WISDOM] modifier). TAG_SPELLS_PROTECTION_FROM_ENERGY TAG_SPELLS TAG_BLACKGUARD_3 TAG_CLERIC_3 TAG_DRUID_3 TAG_LUCK_D TAG_PROTECTION_D TAG_RANGER_2, TAG_SORCERER_3 TAG_WIZARD_3 Protection from Energy ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Blackguard~[TAG_BLACKGUARDS] 3, ~Cleric~[TAG_CLERICS] 3, ~Druid~[TAG_DRUIDS] 3, ~Domain: Luck~[TAG_LUCK_D] 3, ~Domain: Protection~[TAG_PROTECTION_D] 3, ~Ranger~[TAG_RANGERS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 10 min./or until discharged Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates (harmless) Spell Resistance: Yes (harmless) Protection from Energy grants temporary immunity to the type of energy you specify when you cast it (acid, cold, electricity, fire, or sonic). When the spell absorbs 12 points per ~caster level~[TAG_CASTER_LEVEL] of energy damage (to a maximum of 120 points at 10th level), it is discharged. Note: Protection from Energy overlaps (and does not stack with) ~Resist Energy~[TAG_SPELLS_RESIST_ENERGY]. If a character is warded by Protection from Energy and Resist Energy, the protection spell absorbs damage until its power is exhausted. -TAG_SPELLS_SHATTER TAG_SPELLS TAG_BARD_2 TAG_BLACKGUARD_2 TAG_CHAOS_D TAG_CLERIC_2 TAG_DESTRUCTION_D TAG_SORCERER_2 TAG_WIZARD_2 Shatter ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Sonic) Level: ~Bard~[TAG_BARDS] 2, ~Blackguard~[TAG_BLACKGUARDS] 2, ~Domain: Chaos~[TAG_CHAOS_D] 2, ~Cleric~[TAG_CLERICS] 2, ~Domain: Destruction~[TAG_DESTRUCTION_D] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Area or Target: 5-ft.-radius spread; or one solid object or one crystalline creature Duration: Instantaneous Saving Throw: ~Will~[TAG_WILL] negates (object); Will negates (object) or ~Fortitude~[TAG_FORTITUDE] half; see text Spell Resistance: Yes (object) Shatter creates a loud, ringing noise that breaks brittle, nonmagical objects; sunders a single solid, nonmagical object; or damages a crystalline creature. Targeted against a crystalline creature (of any weight), Shatter deals 1d6 points of sonic damage per ~caster level~[TAG_CASTER_LEVEL] (maximum 10d6), with a Fortitude save for half damage. In ToEE, Shatter only results in damage to Earth creatures, such as Earth ~Elementals~[TAG_MONSTER_ELEMENTAL]. +TAG_SPELLS_RAY_OF_FROST TAG_SPELLS TAG_SORCERER_0 TAG_WARMAGE_0 TAG_WIZARD_0 Ray of Frost ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Cold) Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 0, ~Warmage~[TAG_WARMAGES] 0 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Effect: Ray Duration: Instantaneous Saving Throw: None Spell Resistance: Yes A ray of freezing air and ice projects from your pointing finger. You must succeed on a ranged ~touch attack~[TAG_TOUCH_ATTACK] with the ray to deal damage to a target. The ray deals 1d3 points of cold damage. +TAG_SPELLS_SCORCHING_RAY TAG_SPELLS TAG_SORCERER_2 TAG_WARMAGE_2 TAG_WIZARD_2 Scorching Ray ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Fire) Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2, ~Warmage~[TAG_WARMAGES] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Effect: One or more rays Duration: Instantaneous Saving Throw: None Spell Resistance: Yes You blast your enemies with fiery rays. You may fire one ray, plus one additional ray for every four levels beyond 3rd (to a maximum of three rays at 11th level). Each ray requires a ranged ~touch attack~[TAG_TOUCH_ATTACK] to hit and deals 4d6 points of fire damage. The rays may be fired at the same or different targets, but all bolts must be aimed at targets within 30 feet of each other and fired simultaneously. +TAG_SPELLS_SHATTER TAG_SPELLS TAG_BARD_2 TAG_BLACKGUARD_2 TAG_CHAOS_D TAG_CLERIC_2 TAG_DESTRUCTION_D TAG_SORCERER_2 TAG_WARMAGE_2 TAG_WIZARD_2 Shatter ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Sonic) Level: ~Bard~[TAG_BARDS] 2, ~Blackguard~[TAG_BLACKGUARDS] 2, ~Domain: Chaos~[TAG_CHAOS_D] 2, ~Cleric~[TAG_CLERICS] 2, ~Domain: Destruction~[TAG_DESTRUCTION_D] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2, ~Warmage~[TAG_WARMAGES] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Area or Target: 5-ft.-radius spread; or one solid object or one crystalline creature Duration: Instantaneous Saving Throw: ~Will~[TAG_WILL] negates (object); Will negates (object) or ~Fortitude~[TAG_FORTITUDE] half; see text Spell Resistance: Yes (object) Shatter creates a loud, ringing noise that breaks brittle, nonmagical objects; sunders a single solid, nonmagical object; or damages a crystalline creature. Targeted against a crystalline creature (of any weight), Shatter deals 1d6 points of sonic damage per ~caster level~[TAG_CASTER_LEVEL] (maximum 10d6), with a Fortitude save for half damage. In ToEE, Shatter only results in damage to Earth creatures, such as Earth ~Elementals~[TAG_MONSTER_ELEMENTAL]. +TAG_SPELLS_SHOCKING_GRASP TAG_SPELLS TAG_SORCERER_1 TAG_WARMAGE_1 TAG_WIZARD_1 Shocking Grasp ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Electricity) Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature or object touched Duration: Instantaneous Saving Throw: None Spell Resistance: Yes Your successful melee ~touch attack~[TAG_TOUCH_ATTACK] deals 1d6 points of electricity damage per ~caster level~[TAG_CASTER_LEVEL] (maximum 5d6). When delivering the jolt, you gain a +3 bonus on ~attack rolls~[TAG_ATTACK_ROLL] if the opponent is wearing metal armor (or made out of metal, carrying a lot of metal, or the like). +TAG_SPELLS_SHOUT TAG_SPELLS TAG_BARD_4 TAG_SORCERER_4 TAG_WARMAGE_4 TAG_WIZARD_4 Shout ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] (Sonic) Level: ~Bard~[TAG_BARDS] 4, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Warmage~[TAG_WARMAGES] 4 Components: V Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 30 ft. Area: Cone-shaped burst Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] partial or ~Reflex~[TAG_REFLEX] negates (object); see text Spell Resistance: Yes (object) You emit an ear-splitting yell that deafens and damages creatures in its path. Any creature within the area is ~deafened~[TAG_DEAFENED] for 2d6 rounds and takes 5d6 points of sonic damage. A successful save negates the deafness and reduces the damage by half. Any crystalline creature takes 1d6 points of sonic damage per ~caster level~[TAG_CASTER_LEVEL] (maximum 15d6). In ToEE, these crystalline creatures are Earth creatures, such as Earth ~Elementals~[TAG_MONSTER_ELEMENTAL]. An affected creature is allowed a Fortitude save to reduce the damage by half. A Shout spell cannot penetrate a ~Silence~[TAG_SPELLS_SILENCE] spell. TAG_SPELLS_SLEEP TAG_SPELLS TAG_ASSASSIN_1 TAG_BARD_1 TAG_SORCERER_1 TAG_WIZARD_1 Sleep ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT] (Compulsion) Mind-Affecting Level: ~Assassin~[TAG_ASSASSINS] 1, ~Bard~[TAG_BARDS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V, S Casting Time: 1 round Range: Medium (100 ft. + 10 ft./level) Area: One or more living creatures within a 10-ft.-radius burst Duration: 1 min./level Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes A Sleep spell causes a magical slumber to overcome 4 Hit Dice of creatures. Creatures with the fewest HD are affected first. Among creatures with equal HD, those who are closest to the spell's point of origin are affected first. Hit Dice that are not sufficient to affect a creature are wasted. For example, Mialee casts Sleep at 3 kobolds (1/2 HD), 2 gnolls (2 HD), and an ogre (4 HD). All three kobolds and one gnoll are affected: (1/2 + 1/2 + 1/2 + 2 = 3 1/2 HD) The remaining 1/2 HD is not enough to affect the last gnoll or the ogre. Mialee can't choose to have Sleep affect the ogre or the two gnolls. ~Sleeping~[TAG_SLEEPING] creatures are ~helpless~[TAG_HELPLESS]. Slapping or wounding awakens an affected creature, but normal noise does not. Awakening a creature is a ~standard action~[TAG_STANDARD_ACTION]. Sleep does not affect ~unconscious~[TAG_UNCONSCIOUS] creatures, constructs, or undead creatures. +TAG_SPELLS_SLEET_STORM TAG_SPELLS TAG_DRUID_3 TAG_SORCERER_3 TAG_WARMAGE_3 TAG_WIZARD_3 Sleet Storm ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Creation) Cold Level: ~Druid~[TAG_DRUIDS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3, ~Warmage~[TAG_WARMAGES] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Long (400 ft. + 40 ft./level) Area: Cylinder (40-ft.-radius, 20 ft. high) Duration: 1 round/level Saving Throw: None Spell Resistance: No Driving sleet blocks all sight within it and causes the ground in the area to be icy. A creature can walk within or through the area of sleet at half normal speed with a ~Reflex~[TAG_REFLEX] save. Failure means the creature falls. In ToEE, a creature wearing metal armor also takes 2d8 cold damage. +TAG_SPELLS_STINKING_CLOUD TAG_SPELLS TAG_SORCERER_3 TAG_WARMAGE_3 TAG_WIZARD_3 Stinking Cloud ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Creation) Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3, ~Warmage~[TAG_WARMAGES] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Effect: Cloud spreads in 20-ft. radius, 20 ft. high Duration: 1 round/level Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates; see text Spell Resistance: No Stinking Cloud creates a bank of fog like that created by ~Fog Cloud~[TAG_SPELLS_FOG_CLOUD], except that the vapors are nauseating. Living creatures in the cloud become ~nauseated~[TAG_NAUSEATED]. This condition lasts as long as the creature is in the cloud and for 1d4+1 rounds after it leaves. (Roll separately for each nauseated character.) Any creature that succeeds on its save but remains in the cloud must continue to save each round on its turn. TAG_SPELLS_SUMMON_MONSTER_I TAG_SPELLS TAG_BARD_1 TAG_BLACKGUARD_1 TAG_CLERIC_1 TAG_SORCERER_1 TAG_WIZARD_1 Summon Monster I ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Summoning) Level: ~Bard~[TAG_BARDS] 1, ~Blackguard~[TAG_BLACKGUARDS]~Cleric~[TAG_CLERICS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V, S Range: Close (25 ft. + 5 ft./2 levels) Effect: One summoned creature Duration: 1 round/level (D) Saving Throw: None Spell Resistance: No This spell summons an extraplanar creature (typically an outsider, elemental, or magical beast native to another plane). It appears where you designate and acts immediately, on your turn. It attacks your opponents to the best of its ability. If you can communicate with the creature, you can direct it not to attack, to attack particular enemies, or to perform other actions. The spell conjures a creature from the monster list below. You choose which kind of creature to summon (within the game, this decision is limited to the options on the ~radial menu~[TAG_RADIAL_MENU]) and you can change that choice each time you cast the spell. A summoned monster cannot summon or otherwise conjure another creature, nor can it use any teleportation or planar travel abilities. Creatures cannot be summoned into an environment that cannot support them. The monsters you can choose from are: ~Celestial Dog~[TAG_MONSTER_CELESTIAL_DOG] ~Celestial Owl~[TAG_MONSTER_CELESTIAL_OWL] ~Fiendish Dire Rat~[TAG_MONSTER_FIENDISH_DIRE_RAT] ~Fiendish Hawk~[TAG_MONSTER_FIENDISH_HAWK] ~Fiendish~[TAG_FIENDISH] ~Monstrous Spider, Small~[TAG_MONSTER_MONSTROUS_SPIDER_SMALL] ~Fiendish Raven~[TAG_MONSTER_FIENDISH_RAVEN] ~Fiendish Viper, Small~[TAG_MONSTER_FIENDISH_VIPER_SMALL] TAG_SPELLS_SUMMON_MONSTER_II TAG_SPELLS TAG_BARD_2 TAG_BLACKGUARD_2 TAG_CLERIC_2 TAG_SORCERER_2 TAG_WIZARD_2 Summon Monster II ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Summoning) Level: ~Bard~[TAG_BARDS] 2, ~Blackguard~[TAG_BLACKGUARDS] 2, ~Cleric~[TAG_CLERICS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Effect: One or more summoned creatures, no two of which can be more than 30 ft. apart (in ToEE, only one summoned creature) This spell functions like ~Summon Monster I~[TAG_SPELLS_SUMMON_MONSTER_I], except that you are capable of summoning monsters that are more powerful than the previous level. Similar to Summon Monster I, you choose the monster from the ~radial menu~[TAG_RADIAL_MENU] within the game. The monsters you can choose from are: ~Celestial War Dog~[TAG_MONSTER_CELESTIAL_WAR_DOG] ~Fiendish Wolf~[TAG_MONSTER_FIENDISH_WOLF] ~Fiendish~[TAG_FIENDISH] ~Monstrous Spider, Medium~[TAG_MONSTER_MONSTROUS_SPIDER_MEDIUM] ~Fiendish Viper, Medium~[TAG_MONSTER_FIENDISH_VIPER_MEDIUM] TAG_SPELLS_SUMMON_MONSTER_III TAG_SPELLS TAG_BARD_3 TAG_BLACKGUARD_3 TAG_CLERIC_3 TAG_SORCERER_3 TAG_WIZARD_3 Summon Monster III ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Summoning) Level: ~Bard~[TAG_BARDS] 3, ~Blackguard~[TAG_BLACKGUARDS] 3, ~Cleric~[TAG_CLERICS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Effect: One or more summoned creatures, no two of which can be more than 30 ft. apart (in ToEE, only one summoned creature) This spell functions like ~Summon Monster I~[TAG_SPELLS_SUMMON_MONSTER_I], except that the power of the monsters increases accordingly. In the game, you choose the type of monster you wish to summon from the ~radial menu~[TAG_RADIAL_MENU]. The monsters you can choose from are: ~Celestial Black Bear~[TAG_MONSTER_CELESTIAL_BLACK_BEAR] ~Elemental, Small~[TAG_MONSTER_ELEMENTAL_SMALL] (any) ~Fiendish Boar~[TAG_MONSTER_FIENDISH_BOAR] ~Fiendish Constrictor Snake~[TAG_MONSTER_FIENDISH_CONSTRICTOR_SNAKE] ~Fiendish Dire Bat~[TAG_MONSTER_FIENDISH_DIRE_BAT] ~Fiendish Viper, Large~[TAG_MONSTER_FIENDISH_VIPER_LARGE] ~Hell Hound~[TAG_MONSTER_HELL_HOUND] TAG_SPELLS_SUMMON_MONSTER_IV TAG_SPELLS TAG_BARD_4 TAG_BLACKGUARD_4 TAG_CLERIC_4 TAG_SORCERER_4 TAG_WIZARD_4 Summon Monster IV ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] (Summoning) Level: ~Bard~[TAG_BARDS] 4, ~Blackguard~[TAG_BLACKGUARDS] 4, ~Cleric~[TAG_CLERICS] 4, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4 Effect: One or more summoned creatures, no two of which can be more than 30 ft. apart (in ToEE, only one summoned creature) This spell functions like ~Summon Monster I~[TAG_SPELLS_SUMMON_MONSTER_I], except that the monsters are appropriately powerful for their level. The monster that you desire to summon is selected from the ~radial menu~[TAG_RADIAL_MENU] in the game. The monsters you can choose from are: ~Archon, Lantern~[TAG_MONSTER_LANTERN_ARCHON] ~Fiendish Dire Wolf~[TAG_MONSTER_FIENDISH_DIRE_WOLF] ~Fiendish~[TAG_FIENDISH] ~Monstrous Spider, Large~[TAG_MONSTER_MONSTROUS_SPIDER_LARGE] ~Fiendish Viper, Huge~[TAG_MONSTER_FIENDISH_VIPER_HUGE] ~Mephit~[TAG_MONSTER_MEPHIT] (any) ~Yeth Hound~[TAG_MONSTER_YETH_HOUND] -TAG_SPELLS_TRUE_STRIKE TAG_SPELLS TAG_ASSASSIN_1 TAG_SORCERER_1 TAG_WIZARD_1 True Strike ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Assassin~[TAG_ASSASSINS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: See text You gain temporary, intuitive insight into the immediate future during your next attack. Your next single ~attack roll~[TAG_ATTACK_ROLL] (if it is made before the end of the next round) gains a +20 insight bonus. Additionally, you are not affected by the miss chance that applies to attackers trying to strike a ~concealed~[TAG_CONCEALMENT] target. +TAG_SPELLS_TRUE_STRIKE TAG_SPELLS TAG_ASSASSIN_1 TAG_SORCERER_1 TAG_WARMAGE_1 TAG_WIZARD_1 True Strike ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Assassin~[TAG_ASSASSINS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 1 Components: V Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: See text You gain temporary, intuitive insight into the immediate future during your next attack. Your next single ~attack roll~[TAG_ATTACK_ROLL] (if it is made before the end of the next round) gains a +20 insight bonus. Additionally, you are not affected by the miss chance that applies to attackers trying to strike a ~concealed~[TAG_CONCEALMENT] target. diff --git a/tpdatasrc/co8infra/scr/py00416standard_equipment_chest.py b/tpdatasrc/co8infra/scr/py00416standard_equipment_chest.py index 2a25f82ba..122bee52d 100644 --- a/tpdatasrc/co8infra/scr/py00416standard_equipment_chest.py +++ b/tpdatasrc/co8infra/scr/py00416standard_equipment_chest.py @@ -64,6 +64,9 @@ def give_default_starting_equipment(x = 0): else: for aaa in [6211 ,6045 ,6046 ,6124 ,4117 ,4115 ,5007 ,5007 ,8014]: create_item_in_inventory( aaa, pc ) + elif pc.stat_level_get(stat_level_warlock) > 0: + for aaa in [4060, 6043, 6045, 6046, 6233, 8014]: + create_item_in_inventory(aaa, pc) elif pc.stat_level_get(stat_level_warmage) > 0: if pc.stat_level_get(stat_race) in [race_gnome, race_halfling]: for aaa in [6013 ,6045 ,6046 ,6059, 4071 , 4115 ,5007 ,5007, 8014]: # mace (4071) instead of spear diff --git a/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Spell Breath of the Night.tga b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Spell Breath of the Night.tga new file mode 100644 index 000000000..d25ee0c0a Binary files /dev/null and b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Spell Breath of the Night.tga differ diff --git a/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Spell Miasmic Cloud.tga b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Spell Miasmic Cloud.tga new file mode 100644 index 000000000..b4b317877 Binary files /dev/null and b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Spell Miasmic Cloud.tga differ diff --git a/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Beguiling Influence.tga b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Beguiling Influence.tga new file mode 100644 index 000000000..ed082bd16 Binary files /dev/null and b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Beguiling Influence.tga differ diff --git a/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Dark Ones Own Luck.tga b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Dark Ones Own Luck.tga new file mode 100644 index 000000000..2c5e74b74 Binary files /dev/null and b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Dark Ones Own Luck.tga differ diff --git a/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Leaps and Bounds.tga b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Leaps and Bounds.tga new file mode 100644 index 000000000..451fef493 Binary files /dev/null and b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Leaps and Bounds.tga differ diff --git a/tpdatasrc/tpgamefiles/art/meshes/Particle/fiddle_bow.mdf b/tpdatasrc/tpgamefiles/art/meshes/Particle/fiddle_bow.mdf new file mode 100644 index 000000000..2bfcde333 --- /dev/null +++ b/tpdatasrc/tpgamefiles/art/meshes/Particle/fiddle_bow.mdf @@ -0,0 +1,3 @@ +Textured +Texture "art/meshes/particle/fiddle_bow.tga" +Color 255 255 255 255 diff --git a/tpdatasrc/tpgamefiles/art/meshes/Particle/fiddle_bow.tga b/tpdatasrc/tpgamefiles/art/meshes/Particle/fiddle_bow.tga new file mode 100644 index 000000000..9f627385f Binary files /dev/null and b/tpdatasrc/tpgamefiles/art/meshes/Particle/fiddle_bow.tga differ diff --git a/tpdatasrc/tpgamefiles/mes/action_ext.mes b/tpdatasrc/tpgamefiles/mes/action_ext.mes new file mode 100644 index 000000000..195713d33 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/action_ext.mes @@ -0,0 +1,6 @@ +// New error codes added by Sagenlicht + +{1027}{Ability on Cooldown} +{1028}{Already used this turn} +{1029}{Already active!} +{1030}{Silenced!} diff --git a/tpdatasrc/tpgamefiles/mes/auras.mes b/tpdatasrc/tpgamefiles/mes/auras.mes new file mode 100644 index 000000000..2bb2cca1d --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/auras.mes @@ -0,0 +1,86 @@ +// Aura List +// Used by Marshal, Dragon Shaman and Draconic Aura Feats + +// Marshal Auras +// 1-15 Minor Auras +// 16-22 Major Auras + +{1}{Accurate Strike} +{2}{Art of War} +{3}{Demand Fortitude} +{4}{Determined Caster} +{5}{Force of Will} +{6}{Master of Opportunity} +{7}{Master of Tactics} +{8}{Motivate Charisma} +{9}{Motivate Constitution} +{10}{Motivate Dexterity} +{11}{Motivate Intelligence} +{12}{Motivate Strength} +{13}{Motivate Wisdom} +{14}{Over the Top} +{15}{Watchful Eye} +{16}{Hardy Soldiers} +{17}{Motivate Ardor} +{18}{Motivate Attack} +{19}{Motivate Care} +{20}{Motivate Urgency} +{21}{Resilient Troops} +{22}{Steady Hand} + +// Draconic Auras +// PHB II: 23-29 +// Dragon Magic 30+ + +{23}{Energy Shield} +{24}{Power} +{25}{Presence} +{26}{Resistance} +{27}{Senses} +{28}{Toughness} +{29}{Vigor} +{30}{Break Spell Resistance} // Renamed from Power as a different Aura is already named Power +{31}{Energy} +{32}{Insight} +{33}{Resolve} +{34}{Stamina} +{35}{Swiftness} + +// Aura Tags +// Enums are +1000 + +{1001}{TAG_AURA_ACCURATE_STRIKE} +{1002}{TAG_AURA_ART_OF_WAR} +{1003}{TAG_AURA_DEMAND_FORTITUDE} +{1004}{TAG_AURA_DETERMINED_CASTER} +{1005}{TAG_AURA_FORCE_OF_WILL} +{1006}{TAG_AURA_MASTER_OF_OPPORTUNITY} +{1007}{TAG_AURA_MASTER_OF_TACTICS} +{1008}{TAG_AURA_MOTIVATE_CHARISMA} +{1009}{TAG_AURA_MOTIVATE_CONSTITUTION} +{1010}{TAG_AURA_MOTIVATE_DEXTERITY} +{1011}{TAG_AURA_MOTIVATE_INTELLIGENCE} +{1012}{TAG_AURA_MOTIVATE_STRENGTH} +{1013}{TAG_AURA_MOTIVATE_WISDOM} +{1014}{TAG_AURA_OVER_THE_TOP} +{1015}{TAG_AURA_WATCHFUL_EYE} +{1016}{TAG_AURA_HARDY_SOLDIERS} +{1017}{TAG_AURA_MOTIVATE_ARDOR} +{1018}{TAG_AURA_MOTIVATE_ATTACK} +{1019}{TAG_AURA_MOTIVATE_CARE} +{1020}{TAG_AURA_MOTIVATE_URGENCY} +{1021}{TAG_AURA_RESILIENT_TROOPS} +{1022}{TAG_AURA_STEADY_HAND} +{1023}{TAG_AURA_ENERGY_SHIELD} +{1024}{TAG_AURA_POWER} +{1025}{TAG_AURA_PRESENCE} +{1026}{TAG_AURA_RESISTANCE} +{1027}{TAG_AURA_SENSES} +{1028}{TAG_AURA_TOUGHNESS} +{1029}{TAG_AURA_VIGOR} +{1030}{TAG_AURA_BREAK_SPELL_RESISTANCE} // Renamed from Power as a different Aura is already named Power +{1031}{TAG_AURA_ENERGY} +{1032}{TAG_AURA_INSIGHT} +{1033}{TAG_AURA_RESOLVE} +{1034}{TAG_AURA_STAMINA} +{1035}{TAG_AURA_SWIFTNESS} diff --git a/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes index 7056ca7d3..f2840acd2 100644 --- a/tpdatasrc/tpgamefiles/mes/bonus_description.mes +++ b/tpdatasrc/tpgamefiles/mes/bonus_description.mes @@ -31,6 +31,10 @@ {151} {~Alchemical~[TAG_MODIFIER_ALCHEMICAL]} {154} {~Profane~[TAG_MODIFIER_PROFANE]} + +// Most bonus types are either circumstance or untyped bonuses +// They do get a unique bonus type integer to avoid stacking with itself + {155} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_sirines_grace {156} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_sticky_fingers {157} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_undersong @@ -41,3 +45,8 @@ {163} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_curse_of_impending_blades {164} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_wave_of_grief {165} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_distract +{192} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_draconic_aura +{193} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_invocation +{200} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_hellrime_blast +{200} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_hellrime_blast +{200} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_curse_of_despair diff --git a/tpdatasrc/tpgamefiles/mes/damage_ext.mes b/tpdatasrc/tpgamefiles/mes/damage_ext.mes index 8efa92cb5..8c2b9c6a4 100644 --- a/tpdatasrc/tpgamefiles/mes/damage_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/damage_ext.mes @@ -13,6 +13,8 @@ {3006}{~Undead Bane Weapon~[TAG_SPELLS_UNDEAD_BANE_WEAPON]} {3007}{~Lawful Sword~[TAG_SPELLS_LAWFUL_SWORD]} {3008}{~Weapon of Energy~[TAG_SPELLS_WEAPON_OF_ENERGY]} +{3009}{~Tactical Precision~[TAG_SPELLS_TACTICAL_PRECISION]} +{3010}{~Blades of Fire~[TAG_SPELLS_BLADES_OF_FIRE]} // Feat Damage effects {4000}{~Flying Kick~[TAG_FLYING_KICK]} @@ -21,3 +23,4 @@ {4003}{~Fiery Fist~[TAG_FIERY_FIST]} {4004}{~Ki Blast~[TAG_KI_BLAST]} {4005}{~Freezing The Lifeblood~[TAG_FREEZING_THE_LIFEBLOOD]} +{4006}{~Arcane Strike~[TAG_ARCANE_STRIKE]} diff --git a/tpdatasrc/tpgamefiles/mes/description_ext/black_tentacles.mes b/tpdatasrc/tpgamefiles/mes/description_ext/black_tentacles.mes new file mode 100644 index 000000000..d61e59052 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/description_ext/black_tentacles.mes @@ -0,0 +1 @@ +{12999}{Black Tentacle} diff --git a/tpdatasrc/tpgamefiles/mes/help/breath_weapon_feats_help.tab b/tpdatasrc/tpgamefiles/mes/help/breath_weapon_feats_help.tab new file mode 100644 index 000000000..dcbad8e5b --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/help/breath_weapon_feats_help.tab @@ -0,0 +1,2 @@ +TAG_BREATH_FEATS TAG_FEATS_DES Breath Channeling Feats Dragons and creatures of ~Draconic Heritage~[TAG_DRACONIC_HERITAGE] that have breath weapons can choose these feats, which channel the destructive energy of a breath weapon into some other magical or supernatural effect. Using a breath channeling feat requires a creature to activate its breath weapon and counts of a use of that breath weapon. Breath Feats: [CMD_CHILDREN_SORTED] +TAG_EXTRA_EXHALATION TAG_FEATS_DES TAG_BREATH_FEATS Extra Exhalation You can use your breath weapon one more time per day than normal. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], Breath Weapon with limited uses per day Benefit: You can use your breath weapon one additional time per day. The interval you must wait between breaths is 1d4 rounds. Special: You can gain this feat multiple times. Each time you take it, you can breathe one additional time per day. diff --git a/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab b/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab new file mode 100644 index 000000000..0a420c2e6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab @@ -0,0 +1,12 @@ +TAG_DRAGON_DISCIPLE TAG_PRESTIGE_CLASSES Dragon Disciple The blood of dragons runs through the veins of many races. For some, this heritage manifests as a sorcerous bloodline and a predilection for magic. But a few embrace the dreams, recognizing their allure as a promise. These become dragon disciples, who use their magical power as a catalyst to ignite their dragon blood, realizing its fullest potential. Most Dragon Disciples are barbarian, fighters, or rangers who have dabbed as bards or sorcerers. Occasionally, a serious spellcaster explores the path to further a goal of finding out more about his draconic heritage. Hit Die: d12 Requirements: To qualify to become a Dragon Disciple, a character must fulfill all the following criteria. Race: Any non dragon (cannot be already a half-dragon). Skills: Knowledge(Arcana) 8 ranks (not implemented). Languages: Draconic (not implemented). Spellcasting: Ability to cast arcane spells without preparation. Special: The player chooses a dragon variety when taking the first level in this prestige class. Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_TABLES] Class Skills: ~Concentration(Con)~[TAG_CONCENTRATION], Craft(Int), ~Diplomacy(Cha)~[TAG_DIPLOMACY], Escape Artist(Dex), ~Gather Information(Cha)~[TAG_GATHER_INFORMATION], Knowledge(all skills), ~Listen(Wis)~[TAG_LISTEN], Profession(Wis), ~Search(Int)~[TAG_SEARCH], Speak Language(None), ~Spellcraft(Int)~[TAG_SPELLCRAFT], and ~Spot(Wis)~[TAG_SPOT]. Skill Points at Each Level: 2 + Int modifier Class Features: [CMD_CHILDREN] +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_TABLES TAG_DRAGON_DISCIPLE Dragon Disciple Base Attack & Base Save Bonuses Level ~BAB~[TAG_LEVEL_BONUSES] ~Fort.~[TAG_FORTITUDE] ~Reflex~[TAG_REFLEX] ~Will~[TAG_WILL] 1 +0 +2 +0 +2 2 +1 +3 +0 +3 3 +2 +3 +1 +3 4 +3 +4 +1 +4 5 +3 +4 +1 +4 6 +4 +5 +2 +5 7 +5 +5 +2 +5 8 +6 +6 +2 +6 9 +6 +6 +3 +6 10 +7 +7 +3 +7 +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_SPELLS_PER_DAY TAG_DRAGON_DISCIPLE Dragon Disciple Bonus Spells Dragon disciples gain bonus spells as they gain levels in this prestige class, as if from having a high ability score at level 1, 2, 4, 5, 6, 8 and 9. A bonus spell can be added to any level of spells the disciple already has the ability to cast. If a character has more than one spellcasting class, he must decide to which class he adds each bonus spell as it is gained. Once a bonus spell has been applied, it cannot be shifted. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_GRANTED_PROFICIENCIES TAG_DRAGON_DISCIPLE Dragon Disciple Weapon and Armor Proficiency Dragon Disciples gain no weapon or armor proficiencies. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_HERITAGE TAG_DRAGON_DISCIPLE Dragon Disciple Heritage The player chooses a dragon heritage when taking the first level in this prestige class. This determines the kind of ~Breath Weapon~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON] and ~Element Immunity~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_DRAGON_APOTHEOSIS] the Disciple will get as he progresses in levels. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_NATURAL_ARMOR_INCREASE TAG_DRAGON_DISCIPLE Dragon Disciple Natural Armor Increase A dragon disciple gains an increase to the character's existing natural armor (if any). At 1st level +1, at 4th level +2, and at 7th level +3. As his skin thickens, a dragon disciple takes on more and more of his progenitor's physical aspect. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_ABILITY_BOOST TAG_DRAGON_DISCIPLE Dragon Disciple Ability Boost As a dragon disciple gains levels in this prestige class, his ability scores increase. Strength +2 on Level 2 and 4. Constitution +2 on Level 6. Intelligence +2 on Level 8. These increases stack and are gained as if through level advancement. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_CLAWS_AND_BITE TAG_DRAGON_DISCIPLE Dragon Disciple Claws and Bite At 2nd level, a dragon disciple gains claw and bite attacks if he does not already have them. Use the values below or the disciple’s base claw and bite damage values, whichever are greater. A dragon disciple is considered proficient with these attacks. When making a full attack, a dragon disciple uses his full base attack bonus with his bite attack but takes a -5 penalty on claw attacks. The Multiattack feat reduces this penalty to only -2. Size Bite Damage Claw Damage Small 1d4 1d3 Medium 1d6 1d4 Large 1d8 1d6 +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON TAG_DRAGON_DISCIPLE Dragon Disciple Breath Weapon At 3rd level, a dragon disciple gains a minor breath weapon. The type and shape depend on the dragon variety whose heritage he enjoys (see below). Regardless of the ancestor, the breath weapon deals 2d8 points of damage of the appropriate energy type. At 7th level, the damage increases to 4d8, and when a disciple attains dragon apotheosis at 10th level it reaches its full power at 6d8. Regardless of its strength, the breath weapon can be used only once per day. Use all the rules for dragon breath weapons except as specified here. Dragon Heritage Breath Weapon Black Line of acid Blue Line of lightning Green Cone of acid Red Cone of fire White Cone of Cold Brass Line of Fire Bronze Line of Lightning Copper Line of acid Gold Cone of Fire Silver Cone of cold The DC of the breath weapon is 10 + class level + Con modifier. A line-shaped breath weapon is 5 feet high, 5 feet wide, and 60 feet long. A cone-shaped breath weapon is 30 feet long. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BLINDSENSE TAG_DRAGON_DISCIPLE Dragon Disciple Blindsense At 5th level, the dragon disciple gains blindsense with a range of 30 feet. Using nonvisual senses the dragon disciple notices things it cannot see. He usually does not need to make Spot or Listen checks to notice and pinpoint the location of creatures within range of his blindsense ability, provided that he has line of effect to that creature. Any opponent the dragon disciple cannot see still has total concealment against him, and the dragon disciple still has the normal miss chance when attacking foes that have concealment. Visibility still affects the movement of a creature with blindsense. A creature with blindsense is still denied its Dexterity bonus to Armor Class against attacks from creatures it cannot see. At 10th level, the range of this ability increases to 60 feet. Not implemented in ToEE, has no real gameplay effect +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_WINGS TAG_DRAGON_DISCIPLE Dragon Disciple Wings At 9th level, a dragon disciple grows a set of draconic wings. He may now fly at a speed equal to his normal land speed, with average maneuverability. Not implemented in ToEE as there is flight in ToEE! +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_DRAGON_APOTHEOSIS TAG_DRAGON_DISCIPLE Dragon Disciple Dragon Apotheosis At 10th level, a dragon disciple takes on the half-dragon template. His breath weapon reaches full strength (6d8), and he gains +4 to Strength and +2 to Charisma. His natural armor bonus increases to +4, and he acquires low-light vision, 60-foot darkvision, immunity to sleep and paralysis effects, and immunity to the energy type used by his breath weapon. Note: Not implemented: low-light vision, darkvision, half-dragon template. diff --git a/tpdatasrc/tpgamefiles/mes/help/heritage_feats_help.tab b/tpdatasrc/tpgamefiles/mes/help/heritage_feats_help.tab new file mode 100644 index 000000000..4c2405844 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/help/heritage_feats_help.tab @@ -0,0 +1,22 @@ +TAG_HERITAGE_FEATS TAG_FEATS_DES Heritage Feats A heritage feat represents a specific ancestry of that character. A character can select a heritage feat at any level. Choosing a heritage feat after 1st level signifies that the ancestral power of the character is only now manifesting itself. Once a character has chosen a heritage feat, she/he can't select a feat of a different heritage line. There are currently five heritage lines in Temple of Elemental evil: [CMD_CHILDREN_SORTED] +TAG_FEY_FEATS TAG_FEATS_DES TAG_HERITAGE_FEATS Fey Feats Overview You are descended from creatures native to the fey realms. The first feat you have to take if you want to have access to the fey feats is ~Fey Heritage~[TAG_FEY_HERITAGE] Below is an overview of all Fey Feats: [CMD_CHILDREN_SORTED] +TAG_FEY_HERITAGE TAG_DUMMY TAG_FEY_FEATS Fey Heritage You are descended from creatures native to the fey realms. You are naturally resistant to the most common effects produced by your ancestors. Prerequisite: Nonlawful alignment Benefit: You gain a +3 bonus on ~Will~[TAG_WILL] saving throws against ~enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT] effects. Special: This feat is the prerequisite for all other ~Fey Feats~[TAG_FEY_FEATS]. +TAG_FEY_LEGACY TAG_DUMMY TAG_FEY_FEATS Fey Legacy The magical powers of your ancestors manifest in you. Prerequisite: Nonlawful alignment, ~Fey Heritage~[TAG_FEY_HERITAGE], Character Level 9 Benefit: You gain the following spell-like abilities, each usable once per day: ~confusion~[TAG_SPELLS_CONFUSION], ~dimension door~[TAG_SPELLS_DIMENSION_DOOR], and ~summon nature's ally V~[TAG_SPELLS_SUMMON_NATURE'S_ALLY_V]. Your caster level equals your character level. +TAG_FEY_PRESENCE TAG_DUMMY TAG_FEY_FEATS Fey Presence You share your ancestors' knack for playing tricks on the minds of others. Prerequisite: Nonlawful alignment, ~Fey Heritage~[TAG_FEY_HERITAGE], Character Level 6 Benefit: You gain the following spell-like abilities, each usable once per day: ~charm monster~[TAG_SPELLS_CHARM_MONSTER], ~deep slumber~[TAG_SPELLS_DEEP_SLUMBER], and ~disguise self~[TAG_SPELLS_DISGUISE_SELF]. Your caster level equals your character level. Note: Disguise Self is currently not in the game. +TAG_FEY_POWER TAG_DUMMY TAG_FEY_FEATS Fey Power Your fey heritage augments the power of certain types of magic. Prerequisite: Nonlawful alignment, ~Fey Heritage~[TAG_FEY_HERITAGE]6 Benefit: Your caster level and save DCs for ~enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT] spells and warlock invocations increase by 1. +TAG_FEY_SKIN TAG_DUMMY TAG_FEY_FEATS Fey Skin Your fey heritage guards you against all weapons except those crafted from the dreaded cold iron. Prerequisite: Nonlawful alignment, ~Fey Heritage~[TAG_FEY_HERITAGE] Benefit: You gain ~damage reduction~[TAG_SPECIAL_ABILITIES_DAMAGE_REDUCTION] (overcome by cold iron) equal to the number of ~fey feats~[TAG_FEY_FEATS] you have. For example, if you have ~Fey Heritage~[TAG_FEY_HERITAGE], ~Fey Skin~[TAG_FEY_SKIN] and ~Fey Presence~[TAG_FEY_PRESENCE], you would have damage reduction 3/cold iron. This value stacks with any similar damage reduction you might have from your type, subtype, race, or class, but not from other sources, such as spells or magic items. +TAG_DRACONIC_FEATS TAG_FEATS_DES TAG_HERITAGE_FEATS Draconic Feats Overview Sorcerers can take draconic feats to gain abilities akin to those of their draconic ancestors. Draconic feats don't change a creature into something fundamentally different, but they can grant or increase capabilities. Anyone interested in taking draconic feats must take the very first feat in the series: Draconic Heritage. Below is an overview of all availible Draconic Feats: [CMD_CHILDREN_SORTED] +TAG_DRACONIC_HERITAGE TAG_DUMMY TAG_DRACONIC_FEATS Draconic Heritage You have a greater connection with your draconic bloodline than others of your kind. Prerequisite: ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: You gain the dragonblood subtype. Choose one kind of dragon from the list in the table below. This is your draconic heritage, which cannot later be changed. If you have at least one level as a sorcerer you also gain a bonus on saving throws against magic sleep and paralysis effects, as well as on saves against spells and abilities with a descriptor that matches the corresponding energy type. This bonus equals the number of draconic feats you have. In addition, you gain a skill as a sorcerer class skill as listed below. +TAG_DRACONIC_ARCANE_GRACE TAG_DUMMY TAG_DRACONIC_FEATS Draconic Arcane Grace You can convert some of your arcane spell energy into a saving throw bonus. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: You can give up an arcane spell slot to gain a bonus on ~saving throws~[TAG_SAVING_THROW_DESC]. The bonus equals the level of the spell slot used and the bonus disappears after one use. +TAG_DRACONIC_ARMOR TAG_DUMMY TAG_DRACONIC_FEATS Draconic Armor You learn to block damage from successful attacks, lessening the blows with spell energy. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: Whenever you cast an arcane spell, you gain damage reduction X/magic for 1 round (where X is equal to the level of the spell you just cast). For example, after casting fireball, you would gain DR 3/magic for 1 round. +TAG_DRACONIC_BREATH TAG_DUMMY TAG_DRACONIC_FEATS Draconic Breath You can convert your arcane spells into a breath weapon. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: As a standard action, you can charge arcane spell energy into a breath weapon of your draconic heritage energy type. The breath weapon is a 30-foot cone or a 60-foot line, depending on your draconic heritage, that deals 2d6 points of damage per level of the spell that you expended to create the effect. Any creature in the are can make a Reflex save (DC 10 + level of the spell used + your Charisma modifier) ofr half damage. Note: This is limited to Sorcerer spells atm! +TAG_DRACONIC_CLAW TAG_DUMMY TAG_DRACONIC_FEATS Draconic Claw You develop the natural weapons of your draconic ancestors. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: You gain claws. You can make a natural attack with your claw, dealing damage based on your size (Small 1d4, Medium 1d6, Large 1d8). In any round when you cast a spell with a casting time of 1 standard action, you can make a single claw attack as a swift action against an opponent you threaten. +TAG_DRACONIC_FLIGHT TAG_DUMMY TAG_DRACONIC_FEATS Draconic Flight The secret of draconic flight is revealed to you, granting you the ability to fly occasionally. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: You gain claws. You can make a natural attack with your claw, dealing damage based on your size (Small 1d4, Medium 1d6, Large 1d8). After you cast an arcane spell with a casting time of 1 standard action, you gain a fly speed equal to 10 feet per level of the spell you just cast for the remainder of your turn. +TAG_DRACONIC_PERSUASION TAG_DUMMY TAG_DRACONIC_FEATS Draconic Persuasion Your arcane talents lend you a great deal of allure. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: After you cast an arcane spell, you gain a bonus equal to 1-1/2 times the spell's level on your next ~Bluff~[TAG_BLUFF], ~Intimidate~[TAG_INTIMIDATE], or ~Perform~[TAG_PERFORM] check. The check must be made before the end of the next round. +TAG_DRACONIC_POWER TAG_DUMMY TAG_DRACONIC_FEATS Draconic Power You have greater power manipulating the energies of your heritage. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: Your caster level increases by 1, and you add 1 to the save DC of all arcane spells with the energy descriptor of the same energy type as determined by your draconic heritage. +TAG_DRACONIC_PRESENCE TAG_DUMMY TAG_DRACONIC_FEATS Draconic Presence When you use your magic, your mere presence can terrify those around you. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: Whenever you cast an arcane spell, all opponents within 10 feet of you who have fewer Hit Dice than you become shaken for a number of rounds equal to the level of the spell you cast. The effect is negated by a Will save (DC 10 + level of the spell cast + your Cha modifier). A successful save indicates that the opponent is immune to your draconic presence for 24 hours. This ability does not affect creatures with an Intelligence of 3 or lower or creatures that are already shaken, nor does it have any effect on dragons. +TAG_DRACONIC_RESISTANCE TAG_DUMMY TAG_DRACONIC_FEATS Draconic Resistance Your bloodline hardens your body against the energy type of your progenitor. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: You gain resistance to the energy type of your draconic heritage equal to three times the number of ~draconic feats~[TAG_DRACONIC_FEATS] you currently have (including draconic feats you take after gaining this feat). +TAG_DRACONIC_SENSES TAG_DUMMY TAG_DRACONIC_FEATS Draconic Senses Your draconic blood grants you great sensory power. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: Bonus on ~Listen~[TAG_LISTEN], ~Spot~[TAG_SPOT] and ~Search~[TAG_SEARCH] Checks equal to the number of ~draconic feats~[TAG_DRACONIC_FEATS] you have. +TAG_DRACONIC_SKIN TAG_DUMMY TAG_DRACONIC_FEATS Draconic Skin Your skin takes on the sheen, luster, and hardness of your draconic parentage. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: Your natural armor increases by 1. +TAG_DRACONIC_TOUGHNESS TAG_DUMMY TAG_DRACONIC_FEATS Draconic Toughness Your draconic nature reinforces your body as you embrace your heritage. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: When you take this feat, you gain 2 hit points for each draconic feat you have, including this one. Whenever you take a new ~draconic feat~[TAG_DRACONIC_FEATS], you gain 2 more hit points. +TAG_DRACONIC_VIGOR TAG_DUMMY TAG_DRACONIC_FEATS Draconic Vigor You gain some of the vitality of your draconic ancestry when casting spells. Prerequisite: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE], ~Sorcerer~[TAG_SORCERERS] Level 1 Benefit: Whenever you cast an arcane spell, you heal a number of points of damage equal to the spell's level. diff --git a/tpdatasrc/tpgamefiles/mes/help/modifiers.tab b/tpdatasrc/tpgamefiles/mes/help/modifiers.tab index 3cdb41c79..98b897a22 100644 --- a/tpdatasrc/tpgamefiles/mes/help/modifiers.tab +++ b/tpdatasrc/tpgamefiles/mes/help/modifiers.tab @@ -8,4 +8,6 @@ TAG_MODIFIER_MORALE TAG_MODIFIER Morale Modifier A morale bonus represents the TAG_MODIFIER_NATURAL_ARMOR TAG_MODIFIER Natural Armor Bonus A natural armor bonus improves Armor Class resulting from a creature's naturally tough hide. Natural armor bonuses stack with all other bonuses to Armor Class (even with armor bonuses) except other natural armor bonuses. Some magical effects (such as the barkskin spell) grant an enhancement bonus to the creature's existing natural armor bonus, which has the effect of increasing the natural armor's overall bonus to Armor Class. A natural armor bonus doesn't apply against ~touch attacks~[TAG_TOUCH_ATTACK]. TAG_MODIFIER_RESISTANCE TAG_MODIFIER Resistance Bonus A resistance bonus affects ~saving throws~[TAG_SAVING_THROW_DESC], providing extra protection against harm. Multiple resistance bonuses on the same character or object do not stack. Only the highest resistance bonus applies. TAG_MODIFIER_SACRED TAG_MODIFIER Sacred Modifier A sacred bonus (or penalty) stems from the power of good. Multiple sacred bonuses on the same character or object do not stack. Only the highest sacred bonus applies. +TAG_MODIFIER_SIZE TAG_MODIFIER Size Modifier A size bonus or penalty is derived from a creature's size category. Size modifiers of different kinds apply to ~Armor Class~[TAG_ARMOR_CLASS], ~attack rolls~[TAG_ATTACK_ROLL], ~Hide~[TAG_HIDE] checks, ~grapple~[TAG_GRAPPLE] checks, and various other checks. TAG_MODIFIER_PROFANE TAG_MODIFIER Profane Modifier A profane bonus (or penalty) stems from the power of evil. Multiple profane bonuses on the same character or object do not stack. Only the highest profane bonus applies. +TAG_MODIFIER_UNTYPED TAG_MODIFIER Untyped Modifier An untyped bonus (or penalty) stacks with all other modifiers. diff --git a/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab b/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab new file mode 100644 index 000000000..1b9f0427f --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab @@ -0,0 +1,85 @@ +TAG_BATTLE_HOWLER_OF_GRUUMSH TAG_PRESTIGE_CLASSES Battle Howler of Gruumsh Gruumsh One Eye bestowed on his chosen people many great gifts: strength, fortitude, courage, and boundless hunger for conquest. What he didn't grant were good singing ability or sparkling wit. Despite this, the bardic tradition is alive and well in orc culture, albeit in crude form. Battle howlers of Gruumsh give mortal voice to their god's fury. At the forefront of every conflict, a battle howler's hoarse war cries incite his allies to incredible heights of fury and fortifies their courage. The most accomplished battle howlers can even channel Gruumsh's throbbing heartbeat, a sound that terrifies even the bravest opponents. Most battle howlers of Gruumsh are half-orcs. Even so, the path of the hard is a difficult one, and few orcs or half-orcs remain bards for their entire career. Most battle howlers are bard/barbarians, as their abilities complement each other nicely. A rare few also spend time as clerics, their warrior's zeal giving them a true link to the divine. Hit Die: d8 Requirements: Alignment: Any chaotic Skills: Knowledge (religion) 2 ranks (omitted), ~Perform~[TAG_Perform] 8 ranks Feats: ~Cleave~[TAG_CLEAVE], ~Power Attack~[TAG_POWER_ATTACK] Deity: Must worship Gruumsh. Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_BATTLE_HOWLER_OF_GRUUMSH_TABLES] Class Skills: ~Appraise~[TAG_APPRAISE], Balance, Climb, ~Concentration~[TAG_CONCENTRATION], Craft, Handle Animal, ~Intimidate~[TAG_INTIMIDATE], Jump, Knowledge (all skills, taken individually), ~Listen~[TAG_LISTEN], ~Perform~[TAG_PERFORM], Ride, ~Search~[TAG_SEARCH], ~Sense Motive~[TAG_SENSE_MOTIVE], ~Spellcraft~[TAG_SPELLCRAFT], ~Spot~[TAG_SPOT], ~Survival~[TAG_SURVIVAL], and Swim. Skill Points at Each Level: 4 + Int modifier Class Features: [CMD_CHILDREN] +TAG_CLASS_FEATURES_BATTLE_HOWLER_OF_GRUUMSH_WEAPON_ARMOR_PROF TAG_BATTLE_HOWLER_OF_GRUUMSH Weapon and Armor Proficiency A character becoming a battle howler gains proficiency in all simple and martial weapons and also with all armors (heavy, medium, and light) and with shields (except the tower shield). +TAG_CLASS_FEATURES_BATTLE_HOWLER_OF_GRUUMSH_TABLES TAG_BATTLE_HOWLER_OF_GRUUMSH Battle Howler of Gruumsh Base Attack & Base Save Bonuses Level ~Base Attack Bonus~[TAG_LEVEL_BONUSES] ~Fortitude~[TAG_FORTITUDE] ~Save~[TAG_LEVEL_BONUSES] ~Reflex~[TAG_REFLEX] ~Save~[TAG_LEVEL_BONUSES] ~Will~[TAG_WILL] ~Save~[TAG_LEVEL_BONUSES] 1 @t+1 @t+2 @t+0 @t+0 2 @t+2 @t+3 @t+0 @t+0 3 @t+3 @t+3 @t+1 @t+1 4 @t+4 @t+4 @t+1 @t+1 5 @t+5 @t+5 @t+1 @t+1 +TAG_CLASS_FEATURES_BATTLE_HOWLER_OF_GRUUMSH_SPELLCASTING TAG_BATTLE_HOWLER_OF_GRUUMSH Battle Howler of Gruumsh Spellcasting At each Battle Howler level, the character gains new ~bard~[TAG_BARDS] spells per day (and spells known, if applicable) as if she had also gained a level in the bard class. She does not, however, gain any other benefit of the bard class. +TAG_CLASS_FEATURES_BATTLE_HOWLER_OF_GRUUMSH_BARDIC_MUSIC TAG_BATTLE_HOWLER_OF_GRUUMSH Battle Howler of Gruumsh Bardic Music If the character already has the ~bardic music ability~[TAG_CLASS_FEATURES_BARD_BARDIC_MUSIC], her Battle Howler levels stack with the level of any other classes that grant her that ability for the purpose of determining abilities, duration, and so on. +TAG_CLASS_FEATURES_BATTLE_HOWLER_OF_GRUUMSH_RAGE TAG_BATTLE_HOWLER_OF_GRUUMSH Battle Howler of Gruumsh Rage This ability functions exactly as the ~barbarian~[TAG_CLASS_FEATURES_BARBARIAN_RAGE] ability of the same name. If the Battle Howler already has the rage ability from some other class, the times per day that the rage ability can be used stack. A Battle Howler can rage 1/day beginning at 2nd level and 2/day at 5th level. +TAG_CLASS_FEATURES_BATTLE_HOWLER_OF_GRUUMSH_WAR_CRY TAG_BATTLE_HOWLER_OF_GRUUMSH Battle Howler of Gruumsh War Cry When a Battle Howler uses the ~Inspire Courage~[TAG_CLASS_FEATURES_BARD_INSPIRE_COURAGE] ability of ~bardic music~[TAG_CLASS_FEATURES_BARD_BARDIC_MUSIC], it affects all allies within 60 feet and the ~morale~[TAG_MODIFIER_MORALE] bonuses it provides are increased by +1. +TAG_CLASS_FEATURES_BATTLE_HOWLER_OF_GRUUMSH_WAR_CRY TAG_BATTLE_HOWLER_OF_GRUUMSH Battle Howler of Gruumsh Howling Rage At 4th level, a Battle Howler can use the ~Bardic Music~[TAG_CLASS_FEATURES_BARD_BARDIC_MUSIC] abilities ~Inspire Courage~[TAG_CLASS_FEATURES_BARD_INSPIRE_COURAGE], ~Inspire Greatness~[TAG_CLASS_FEATURES_BARD_INSPIRE_GREATNESS], and Inspire Heroics while ~raging~[TAG_CLASS_FEATURES_BARBARIAN_RAGE], provided she has access to them. +TAG_DRAGON_DISCIPLE TAG_PRESTIGE_CLASSES Dragon Disciple The blood of dragons runs through the veins of many races. For some, this heritage manifests as a sorcerous bloodline and a predilection for magic. But a few embrace the dreams, recognizing their allure as a promise. These become dragon disciples, who use their magical power as a catalyst to ignite their dragon blood, realizing its fullest potential. Most Dragon Disciples are barbarian, fighters, or rangers who have dabbed as bards or sorcerers. Occasionally, a serious spellcaster explores the path to further a goal of finding out more about his draconic heritage. Hit Die: d12 Requirements: To qualify to become a Dragon Disciple, a character must fulfill all the following criteria. Race: Any non dragon (cannot be already a half-dragon). Skills: Knowledge(Arcana) 8 ranks (not implemented). Languages: Draconic (not implemented). Spellcasting: Ability to cast arcane spells without preparation. Special: The player chooses a dragon variety when taking the first level in this prestige class. Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_TABLES] Class Skills: ~Concentration(Con)~[TAG_CONCENTRATION], Craft(Int), ~Diplomacy(Cha)~[TAG_DIPLOMACY], Escape Artist(Dex), ~Gather Information(Cha)~[TAG_GATHER_INFORMATION], Knowledge(all skills), ~Listen(Wis)~[TAG_LISTEN], Profession(Wis), ~Search(Int)~[TAG_SEARCH], Speak Language(None), ~Spellcraft(Int)~[TAG_SPELLCRAFT], and ~Spot(Wis)~[TAG_SPOT]. Skill Points at Each Level: 2 + Int modifier Class Features: [CMD_CHILDREN] +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_TABLES TAG_DRAGON_DISCIPLE Dragon Disciple Base Attack & Base Save Bonuses Level ~BAB~[TAG_LEVEL_BONUSES] ~Fort.~[TAG_FORTITUDE] ~Reflex~[TAG_REFLEX] ~Will~[TAG_WILL] 1 +0 +2 +0 +2 2 +1 +3 +0 +3 3 +2 +3 +1 +3 4 +3 +4 +1 +4 5 +3 +4 +1 +4 6 +4 +5 +2 +5 7 +5 +5 +2 +5 8 +6 +6 +2 +6 9 +6 +6 +3 +6 10 +7 +7 +3 +7 +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_SPELLS_PER_DAY TAG_DRAGON_DISCIPLE Dragon Disciple Bonus Spells Dragon disciples gain bonus spells as they gain levels in this prestige class, as if from having a high ability score at level 1, 2, 4, 5, 6, 8 and 9. A bonus spell can be added to any level of spells the disciple already has the ability to cast. If a character has more than one spellcasting class, he must decide to which class he adds each bonus spell as it is gained. Once a bonus spell has been applied, it cannot be shifted. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_GRANTED_PROFICIENCIES TAG_DRAGON_DISCIPLE Dragon Disciple Weapon and Armor Proficiency Dragon Disciples gain no weapon or armor proficiencies. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_HERITAGE TAG_DRAGON_DISCIPLE Dragon Disciple Heritage The player chooses a ~Draconic Heritage~[TAG_DRACONIC_HERITAGE] when taking the first level in this prestige class. This determines the kind of ~Breath Weapon~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON] and ~Element Immunity~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_DRAGON_APOTHEOSIS] the Disciple will get as he progresses in levels. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_NATURAL_ARMOR_INCREASE TAG_DRAGON_DISCIPLE Dragon Disciple Natural Armor Increase A dragon disciple gains an increase to the character's existing natural armor (if any). At 1st level +1, at 4th level +2, and at 7th level +3. As his skin thickens, a dragon disciple takes on more and more of his progenitor's physical aspect. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_ABILITY_BOOST TAG_DRAGON_DISCIPLE Dragon Disciple Ability Boost As a dragon disciple gains levels in this prestige class, his ability scores increase. Strength +2 on Level 2 and 4. Constitution +2 on Level 6. Intelligence +2 on Level 8. These increases stack and are gained as if through level advancement. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_CLAWS_AND_BITE TAG_DRAGON_DISCIPLE Dragon Disciple Claws and Bite At 2nd level, a dragon disciple gains claw and bite attacks if he does not already have them. Use the values below or the disciple’s base claw and bite damage values, whichever are greater. A dragon disciple is considered proficient with these attacks. When making a full attack, a dragon disciple uses his full base attack bonus with his bite attack but takes a -5 penalty on claw attacks. The Multiattack feat reduces this penalty to only -2. Size Bite Damage Claw Damage Small 1d4 1d3 Medium 1d6 1d4 Large 1d8 1d6 +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON TAG_DRAGON_DISCIPLE Dragon Disciple Breath Weapon At 3rd level, a dragon disciple gains a minor breath weapon. The type and shape depend on the dragon variety whose heritage he enjoys (see below). Regardless of the ancestor, the breath weapon deals 2d8 points of damage of the appropriate energy type. At 7th level, the damage increases to 4d8, and when a disciple attains dragon apotheosis at 10th level it reaches its full power at 6d8. Regardless of its strength, the breath weapon can be used only once per day. Use all the rules for dragon breath weapons except as specified here. Dragon Heritage Breath Weapon Black Line of acid Blue Line of lightning Green Cone of acid Red Cone of fire White Cone of Cold Brass Line of Fire Bronze Line of Lightning Copper Line of acid Gold Cone of Fire Silver Cone of cold The DC of the breath weapon is 10 + class level + Con modifier. A line-shaped breath weapon is 5 feet high, 5 feet wide, and 60 feet long. A cone-shaped breath weapon is 30 feet long. +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BLINDSENSE TAG_DRAGON_DISCIPLE Dragon Disciple Blindsense At 5th level, the dragon disciple gains blindsense with a range of 30 feet. Using nonvisual senses the dragon disciple notices things it cannot see. He usually does not need to make Spot or Listen checks to notice and pinpoint the location of creatures within range of his blindsense ability, provided that he has line of effect to that creature. Any opponent the dragon disciple cannot see still has total concealment against him, and the dragon disciple still has the normal miss chance when attacking foes that have concealment. Visibility still affects the movement of a creature with blindsense. A creature with blindsense is still denied its Dexterity bonus to Armor Class against attacks from creatures it cannot see. At 10th level, the range of this ability increases to 60 feet. Not implemented in ToEE, has no real gameplay effect +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_WINGS TAG_DRAGON_DISCIPLE Dragon Disciple Wings At 9th level, a dragon disciple grows a set of draconic wings. He may now fly at a speed equal to his normal land speed, with average maneuverability. Not implemented in ToEE as there is flight in ToEE! +TAG_CLASS_FEATURES_DRAGON_DISCIPLES_DRAGON_APOTHEOSIS TAG_DRAGON_DISCIPLE Dragon Disciple Dragon Apotheosis At 10th level, a dragon disciple takes on the half-dragon template. His breath weapon reaches full strength (6d8), and he gains +4 to Strength and +2 to Charisma. His natural armor bonus increases to +4, and he acquires low-light vision, 60-foot darkvision, immunity to sleep and paralysis effects, and immunity to the energy type used by his breath weapon. Note: Not implemented: low-light vision, darkvision, half-dragon template. +TAG_DRAGONHEART_MAGE TAG_PRESTIGE_CLASSES Dragonheart Mage Some arcane spellcasters are fascinated both by the dragon's hardy physical nature as well as the dragon's spellcasting ability. The dragonheart mage is perfect for the dedicated spellcaster who wishes to embrace the power of dragon blood while still advancing in magical expertise. This prestige class is available only to those who can demonstrate draconic heritage. Most dragonheart mages are sorcerers, who ascribe their magical ability to a dragon ancestor, and this class enhances the ability to cast sorcerous magic. Multiclass sorcerer/bards might also find the Dragonheart Mage interesting, since it helps build on their already impressive Charisma-based abilities. Kobolds are drawn to the class, which offers greater physical strength as well as improved spellcasting. Mere dabblers in arcane magic are less likely to become dragonheart mages. Hit Die: d6 Requirements: To qualify to become a Dragonheart Mage, a character must fulfill all the following criteria. Spellcasting: Ability to spontaneously cast arcane spells. Skills: Knowledge(Arcana) 8 ranks (omitted). Languages: Draconic (omitted). Feats: ~Draconic Heritage~[TAG_DRACONIC_HERITAGE] Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_DRAGONHEART_MAGE_TABLES] Class Skills: ~Bluff~[TAG_BLUFF], ~Concentration~[TAG_CONCENTRATION], ~Gather Information~[TAG_GATHER_INFORMATION], Knowledge (all, taken individually), ~Listen~[TAG_LISTEN], Speak Language, ~Search~[TAG_SEARCH], ~Spellcraft~[TAG_SPELLCRAFT], ~Spot~[TAG_SPOT]. Skill Points at Each Level: 2 + Int modifier Class Features: [CMD_CHILDREN] +TAG_CLASS_FEATURES_DRAGONHEART_MAGE_WEAPON_ARMOR_PROF TAG_DRAGONHEART_MAGE Weapon and Armor Proficiency Dragonheart Mages gain no weapon, armor or shield proficiencies. +TAG_CLASS_FEATURES_DRAGONHEART_MAGE_TABLES TAG_DRAGONHEART_MAGE Dragonheart Mage Base Attack & Base Save Bonuses Level ~BAB~[TAG_LEVEL_BONUSES] ~Fort.~[TAG_FORTITUDE] ~Reflex~[TAG_REFLEX] ~Will~[TAG_WILL] 1 +0 +2 +0 +2 2 +1 +3 +0 +3 3 +2 +3 +1 +3 4 +3 +3 +1 +3 5 +3 +4 +1 +4 6 +4 +5 +2 +5 7 +5 +5 +2 +5 8 +6 +6 +2 +6 9 +6 +6 +3 +6 10 +7 +7 +3 +7 +TAG_CLASS_FEATURES_DRAGONHEART_MAGE_DRACONIC_BREATH TAG_DRAGONHEART_MAGE Dragonheart Mage Draconic Breath At 1st level, you gain the ~Draconic Breath~[TAG_DRACONIC_BREATH] feat. As a Dragonheart Mage, you realize some additional benefits from taking this feat. You can use a standard action to change arcane spell energy into a breath weapon that deals 2d6 points of damage per level of the spell that you expend. As you gain levels in this prestige class, however, the amount of damage you can deal increases. At 6th level, your breath weapon deals 2d8 points of damage per level of the spell you give up. At 10th level, your breath weapon deals 3d6 points of damage per level of the spell you give up. +TAG_CLASS_FEATURES_DRAGONHEART_MAGE_SPELL_CASTING TAG_DRAGONHEART_MAGE Dragonheart Mage Spell Casting At each level except 1st and 6th, you gain new spells per day and an increase in caster level (and spells known, if applicable) as if you had also gained a level in a spellcasting class to which you belonged before adding the prestige class level. You do not, however, gain any other benefit a character of that class would have gained. If you had more than one spellcasting class before becoming a dragonheart mage, the bonus will apply to the highest arcane spell casting class. +TAG_CLASS_FEATURES_DRAGONHEART_MAGE_DRACONIC_FEAT TAG_DRAGONHEART_MAGE Dragonheart Mage Draconic Feat At 2nd, 4th, and 8th level, you gain a bonus ~draconic feat~[TAG_DRACONIC_FEATS]. Choose any draconic feat for which you meet the prerequisite. +TAG_FIST_OF_THE_FOREST TAG_PRESTIGE_CLASSES Fist of the Forest For some among the Guardians of the Green, the pursuit of an animalistic lifestyle is a form of asceticism. A feral disposition seems to come naturally to others. In either case, the result is a powerful defender of nature: the Fist of the Forest. Becoming a Fist of the Forest: Though the two classes seem to have little in common, the paths of the monk and the barbarian often converge in the fist of the forest. Monks and other disciplined characters seek heightened connections with nature through a primal devotion to its defense. Barbarians and other wild characters seem to simply end up on this path if they are fated for it. Combat: Your most powerful attacks are your unarmed strikes, so you should charge into the thick of battle as quickly as possible. Save your feral trance ability until the middle of a fight, so that you don't end up fatigued while your enemies are still attacking. Hit Die: d10 Requirements: Base Attack Bonus +4 Skills: Handle Animal (omitted), ~Survival~[TAG_SURVIVAL] 4 ranks Feats: ~Great Fortitude~[TAG_GREAT_FORT], ~Improved Unarmed Strike~[TAG_IMPROVED_UNARMED], ~Power Attack~[TAG_POWER_ATTACK] Special:Must gain approval as a fist of the forest by the leaders of a band of Guardians of the Green, then adopt the lifestyle of an animal (omitted). Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_TABLES] Class Skills: ~Balance~[TAG_BALANCE], Climb, Handle Animal, ~Intimidate~[TAG_INTIMIDATE], Jump, ~Listen~[TAG_LISTEN], ~Move Silently~[TAG_MOVE_SILENTLY], ~Sense Motive~[TAG_SENSE_MOTIVE], ~Spot~[TAG_SPOT], ~Survival~[TAG_SURVIVAL], Swim. Skill Points at Each Level: 2 + Int modifier Class Features: [CMD_CHILDREN] +TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_WEAPON_ARMOR_PROF TAG_FIST_OF_THE_FOREST Weapon and Armor Proficiency Fist of the Forests gain no weapon, armor or shield proficiencies. +TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_TABLES TAG_FIST_OF_THE_FOREST Fist of the Forest Base Attack & Base Save Bonuses Level ~Base Attack Bonus~[TAG_LEVEL_BONUSES] ~Fortitude~[TAG_FORTITUDE] ~Save~[TAG_LEVEL_BONUSES] ~Reflex~[TAG_REFLEX] ~Save~[TAG_LEVEL_BONUSES] ~Will~[TAG_WILL] ~Save~[TAG_LEVEL_BONUSES] 1 @t+1 @t+2 @t+2 @t+0 2 @t+2 @t+3 @t+3 @t+0 3 @t+3 @t+3 @t+3 @t+1 +TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_AC_BONUS TAG_FIST_OF_THE_FOREST AC Bonus While unarmored, you gain a bonus to your ~Armor Class~[TAG_ARMOR_CLASS] equal to your ~Constitution~[TAG_CONSTITUTION] bonus (if any). See the ~monk class feature~[TAG_CLASS_FEATURES_MONK_AC_BONUS]. +TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_FAST_MOVEMENT TAG_FIST_OF_THE_FOREST Fast Movement Your base land speed is faster than the norm for your race. See the ~barbarian class feature~[TAG_CLASS_FEATURES_FAST_MOVEMENT]. If you already have fast movement from another class, the bonuses to your speed stack. +TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_FERAL_TRANCE TAG_FIST_OF_THE_FOREST Feral Trance Once per day, you can enter a feral battle trance. While you are in this state, the raw power of the beast flows through you. Your hands and feet become clawlike (destroying any shoes or gloves you are wearing), and your teeth lengthen and grow pointed. For the duration of the trance, you gain a +4 bonus to ~Dexterity~[TAG_DEXTERITY] and a +2 bonus on damage rolls with your unarmed strikes.You can also make one bite attack per round at your highest attack bonus whenever you attack as a ~full-round action~[TAG_FULL_ROUND_ACTION]. The damage for this attack is 1d6 + your Str modifier, regardless of your size. A feral trance lasts for a number of rounds equal to 3 + your Con modifier. While in a trance, you cannot perform certain actions, and afterward you are fatigued. These restrictions are the same as those for the ~barbarian's rage class feature~[TAG_CLASS_FEATURES_BARBARIAN_RAGE]. If you have the ability to enter a rage, you can do so while in a feral trance, using your increased Constitution score to determine the duration of both effects.At 3rd level, you can use this ability twice per day. +TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_PRIMAL_LIVING TAG_FIST_OF_THE_FOREST Primal Living To maintain your bestial powers, you must live like a wild animal. You must sleep in natural environments, never inside buildings, unless forced by circumstances . Furthermore, you cannot purchase food - you must obtain it by hunting, gathering, begging, or stealing. Some Fists of the Forest even give up speech, the use of fire and tools, and all possessions, but such extremes are not required. In any month in which you buy food or voluntarily sleep indoors more than three times, all your Fist of the Forest class features cease to function until you have spent thirty consecutive days living like an animal once more, or until a fellow Guardian of the Green casts atonement on you. +TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_UNARMED_DAMAGE TAG_FIST_OF_THE_FOREST Unarmed Damage Your unarmed attacks deal more damage than usual. At 1st level, you deal 1d8 points of damage with each unarmed strike. When you attain 3rd level, this damage increases to 1d10 points. See the ~monk class feature~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE]. If your unarmed attack already deals this amount of damage, increase the base damage to the next step indicated on the monk class table. +TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_UNCANNY_DODGE TAG_FIST_OF_THE_FOREST Uncanny Dodge At 2nd level, you cannot be caught ~flat-footed~[TAG_FLAT_FOOTED], and you react to danger before your senses would normally allow you to do so. See the ~barbarian class feature~[TAG_CLASS_FEATURES_BARBARIAN_UNCANNY_DODGE]. If you already have uncanny dodge from another class, you instead gain ~improved uncanny dodge~[TAG_CLASS_FEATURES_IMPROVED_UNCANNY_DODGE]. Note: At the moment Improved Uncanny Dodge is not granted if the character already has Uncanny Dodge +TAG_CLASS_FEATURES_FIST_OF_THE_FOREST_UNTAMED_STRIKE TAG_FIST_OF_THE_FOREST Untamed Strike On attaining 2nd level, you can channel the untamed power of nature when you attack. Your unarmed strikes are treated as magic weapons; see the ~monk's ki strike class feature~[TAG_CLASS_FEATURES_MONK_KI_STRIKE]. If your unarmed strikes are already magical, they instead are treated lesser ghost touch weapons. They deal full damage against incorporeal creatures 50% of the time and half damage the rest of the time. Note: The Ghost Touch part is not implemented yet. +TAG_MARSHALS TAG_NONCORE_CLASSES Marshals Sometimes it is not enough to be a conquering warrior, a champion of all that's right, an experienced sellsword, or an elite foot soldier. Sometimes the circumstances require a solid commander of soldiers and situations. Sometimes the circumstances demand a marshal. Characteristics: Trained in the basics of fighting, marshals possess a general knowledge of weapons and armor. Their real strength is their ability to lead those who follow them to success they might not otherwise reach in combat. Marshals make passable warriors themselves, when personal danger finds them. Religion: Marshals often worship Heironeous (god of valor) or Kord (god of strength). Some worship St. Cuthbert (god of retribution), Hextor (god of tyranny), or Erythnul (god of slaughter). Other Classes: The marshal relies on the other classes in all ways -- it is his job to support a team, magnifying the strengths of each member for success in battles or forays into dangerous cavern complexes. Role: In most adventuring parties, the marshal serves as the lead tactician, while his comrades support him with spells, ranged attacks, and other effects. However, once a plan is in motion, most marshals enter the melee to assure victory. Alignment: Marshals may be of any alignment. Good-aligned marshals are often crusading leaders who seek out and fight evil. Lawful-aligned marshals accept commissions from people who face invasion by foreign aggressors. Chaotic-aligned marshals lead mercenaries to wherever the pay is best. Evil-aligned marshals tend to lead forces of foreign aggressors set on invasion and plunder. Hit Die: d8 Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_MARSHAL] Class Skills: ~Bluff~[TAG_BLUFF], ~Diplomacy~[TAG_DIPLOMACY], Handle Animal, ~Intimidate~[TAG_INTIMIDATE], Knowledge, ~Listen~[TAG_LISTEN], ~Perform~[TAG_PERFORM], Ride, ~Sense Motive~[TAG_SENSE_MOTIVE], Speak Language, ~Spot~[TAG_SPOT], ~Survival~[TAG_SURVIVAL], and ~Swim~[TAG_SWIM]. Skill Points at Each Level: 4 + Int modifier Class Features: [CMD_CHILDREN] +TAG_CLASS_FEATURES_MARSHAL_WEAPON_ARMOR_PROF TAG_MARSHALS Weapon and Armor Proficiency Marshals are proficient with all simple and martial weapons, with all types of armor (heavy, medium, and light), and with shields (except tower shields). +TAG_CLASS_FEATURES_MARSHAL TAG_DUMMY Marshal Base Attack & Base Save Bonuses Level ~Base Attack Bonus~[TAG_LEVEL_BONUSES] ~Fortitude~[TAG_FORTITUDE] ~Save~[TAG_LEVEL_BONUSES] ~Reflex~[TAG_REFLEX] ~Save~[TAG_LEVEL_BONUSES] ~Will~[TAG_WILL] ~Save~[TAG_LEVEL_BONUSES] 1 @t+0 @t+2 @t+0 @t+2 2 @t+1 @t+3 @t+0 @t+3 3 @t+2 @t+3 @t+1 @t+3 4 @t+3 @t+4 @t+1 @t+4 5 @t+3 @t+4 @t+1 @t+4 6 @t+4 @t+5 @t+2 @t+5 7 @t+5 @t+5 @t+2 @t+5 8 @t+6/+1 @t+6 @t+2 @t+6 9 @t+6/+1 @t+6 @t+3 @t+6 10 @t+7/+2 @t+7 @t+3 @t+7 11 @t+8/+3 @t+7 @t+3 @t+7 12 @t+9/+4 @t+8 @t+4 @t+8 13 @t+9/+4 @t+8 @t+4 @t+8 14 @t+10/+5 @t+9 @t+4 @t+9 15 @t+11/+6/+1 @t+9 @t+5 @t+9 16 @t+12/+7/+2 @t+10 @t+5 @t+10 17 @t+12/+7/+2 @t+10 @t+5 @t+10 18 @t+13/+8/+3 @t+11 @t+6 @t+11 19 @t+14/+9/+4 @t+11 @t+6 @t+11 20 @t+15/+10/+5 @t+12 @t+6 @t+12 +TAG_CLASS_FEATURES_MARSHAL_AURAS TAG_MARSHALS Marshal Auras The marshal exerts an effect on allies in his vicinity. He can learn to produce different effects, or auras, over the course of his career. The marshal may project one minor aura and (starting at 2nd level) one major aura at a time. Projecting an aura is a swift action. The aura remains in effect until the marshal uses a free action to dismiss it or activates another aura of the same kind (major or minor). A marshal can have an aura active continually; thus, an aura can be in effect at the start of a combat encounter even before the marshal takes his first turn. Activating an aura involves haranguing, ordering, directing, encouraging, cajoling, or calming allies. A marshal sizes up the enemy, allies, and the terrain, then gives allies the direction that they can use to do their best. Unless otherwise noted, a marshal's aura affects all allies within 60 feet (including himself) who can hear the marshal. An ally must have an Intelligence score of 3 or higher and be able to understand the marshal's language to gain the bonus. A marshal's aura is dismissed if he is dazed, unconscious, stunned, paralyzed, or otherwise unable to be heard or understood by his allies. A marshal begins play knowing one minor aura of his choice. As his marshal level increases, he gains access to new auras, as indicated on Table 1-5: The Marshal. All bonuses granted by a marshal's auras are circumstance bonuses that do not stack with each other. Minor Auras: A minor aura lets allies add the marshal's Charisma bonus (if any) to certain rolls. ~Minor Aura List~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS][CMD_CHILDREN_SORTED] Major Auras: Beginning at 2nd level, a marshal can project a major aura in addition to his minor aura. A major aura lets allies add +1 to certain rolls. This bonus improves by +1 at 7th, 14th, and 20th level. ~Major Aura List~[TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS][CMD_CHILDREN_SORTED] +TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS TAG_MARSHALS Minor Auras A minor aura lets allies add the marshal's Charisma bonus (if any) to certain rolls. Minor Aura List [CMD_CHILDREN_SORTED] +TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS TAG_MARSHALS Major Auras Beginning at 2nd level, a marshal can project a major aura in addition to his minor aura. A major aura lets allies add +1 to certain rolls. This bonus improves by +1 at 7th, 14th, and 20th level. Major Aura List [CMD_CHILDREN_SORTED] +TAG_CLASS_FEATURES_MARSHAL_SKILL_FOCUS TAG_MARSHALS Skill Focus(Diplomacy) Because a marshal has a way with people, he gains this feat as a bonus feat. If the marshal already has the feat, he can choose a different one. +TAG_CLASS_FEATURES_MARSHAL_ADRENALINE_BOOST TAG_MARSHALS Adrenaline Boost Starting at 4th level, you can exhort your allies to discover a reservoir of energy they didn't think they had. Once per day, as a standard action, you can grant temporary hit points equal to your marshal level to any or all of your allies within 30 feet (but not to yourself). If the ally's current hit point total is no more than half his full normal hit points, the number of temporary hit points granted to that character is doubled (to twice your marshal level). This ability only affects allies with an Intelligence score of 3 or higher who can hear you and understand your language. The temporary hit points last for up to 1 minute per marshal level. At 8th level, you can use this ability twice per day. You can use it three times per day at 12th level, four times per day at 16th level, and five times per day at 20th level. If you use this ability on a creature that is still under the effect of a previous use, the new temporary hit points overlap (do not stack with) the temporary hit points the creature had remaining. +TAG_AURA_ACCURATE_STRIKE TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Accurate Strike ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on rolls made to confirm critical hits. +TAG_AURA_ART_OF_WAR TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Art of War ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on disarm, trip, bull rush, and sunder attempts. +TAG_AURA_DEMAND_FORTITUDE TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Demand Fortitude ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on Fortitude saves. +TAG_AURA_DETERMINED_CASTER TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Determined Caster ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on rolls to overcome spell resistance. +TAG_AURA_FORCE_OF_WILL TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Force of Will ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on Will saves. +TAG_AURA_MASTER_OF_OPPORTUNITY TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Master of Opportunity ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] to Armor Class against attacks of opportunity. +TAG_AURA_MASTER_OF_TACTICS TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Master of Tactics ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on damage rolls when flanking. +TAG_AURA_MOTIVATE_CHARISMA TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Motivate Charisma ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on Charisma checks and Charisma-based skill checks. +TAG_AURA_MOTIVATE_CONSTITUTION TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Motivate Constitution ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on Constitution checks and Constitution-based skill checks. +TAG_AURA_MOTIVATE_DEXTERITY TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Motivate Dexterity ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on Dexterity checks and Dexterity-based skill checks. +TAG_AURA_MOTIVATE_INTELLIGENCE TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Motivate Intelligence ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on Intelligence checks and Intelligence-based skill checks. +TAG_AURA_MOTIVATE_STRENGTH TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Motivate Strength ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on Strength checks and Strength-based skill checks. +TAG_AURA_MOTIVATE_WISDOM TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Motivate Wisdom ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on Wisdom checks and Wisdom-based skill checks. +TAG_AURA_OVER_THE_TOP TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Over the Top ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on damage rolls when charging. +TAG_AURA_WATCHFUL EYE TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS Watchful Eye ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS] on Reflex saves. +TAG_AURA_HARDY_SOLDIERS TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS Hardy Soldiers The marshal's allies gain damage reduction equal to the amount of ~bonus~[TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS] the aura provides. For example, if the marshal is 10th level, everyone affected gains DR 2/-. +TAG_AURA_MOTIVATE_ARDOR TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS Motivate Ardor ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS] on damage rolls. +TAG_AURA_MOTIVATE_ATTACK TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS Motivate Attack ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS] on melee attack rolls. +TAG_AURA_MOTIVATE_CARE TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS Motivate Care ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS] to Armor Class. +TAG_AURA_MOTIVATE_URGENCY TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS Motivate Urgency Allies' base land speed is increased by a number of feet equal to 5 x the amount of ~bonus~[TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS] the aura provides. For example, the allies of a 10th-level marshal (+2 major aura) add 10 feet to their base land speed. +TAG_AURA_RESILIENT_TROOPS TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS Resilient Troops ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS] on all saves. +TAG_AURA_STEADY_HAND TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS Steady Hand ~Aura Bonus~[TAG_CLASS_FEATURES_MARSHAL_MAJOR_AURAS] on ranged attack rolls. +TAG_STORMLORDS TAG_PRESTIGE_CLASSES Stormlords Stormlords often live as brigands, indulging their personal desires for wealth, food, luxury items, and wanton behavior as they crave random, spectacular acts of violence. Most Stormlords are cleric, druids, or cleric/sorcerers, although other class combinations, particulalry those including fighter or even barbarian are not unknown. Hit Die: d8 Requirements: To qualify to become a Stormlord, a character must fulfill all the following criteria. Alignment: Chaotic or Neutral Evil or Chaotic Neutral. Feats: ~Great Fortitude~[TAG_GREAT_FORT], ~Weapon Focus~[TAG_WEAPON_FOCUS](Deity Favored Weapon or javelin). Base Save Bonus: ~Fortitude~[TAG_FORTITUDE] +4 Spells: Able to cast 3rd-level divine spells. Omitted: Feat Endurance(not in the game) Patron: Talos Special: The character must have been hit by a bolt of lightning, whether a natural bolt or one created by magic, and survived. Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_STORMLORD_TABLES] Class Skills: ~Concentration(Con)~[TAG_CONCENTRATION], Disguise(Cha), ~Gather Information(Cha)~[TAG_GATHER_INFORMATION], ~Intimidate(Cha)~[TAG_INTIMIDATE], Knowledge (nature)(Int), Knowledge (religion)(Int), ~Survival(Wis)~[TAG_SURVIVAL], Swim(Str) Skill Points at Each Level: 2 + Int modifier Class Features: [CMD_CHILDREN] +TAG_CLASS_FEATURES_STORMLORD_TABLES TAG_STORMLORDS Stormlord Base Attack & Base Save Bonuses Level ~BAB~[TAG_LEVEL_BONUSES] ~Fort.~[TAG_FORTITUDE] ~Reflex~[TAG_REFLEX] ~Will~[TAG_WILL] 1 +0 +2 +0 +2 2 +1 +3 +0 +3 3 +2 +3 +1 +3 4 +3 +3 +1 +3 5 +3 +4 +1 +4 6 +4 +5 +2 +5 7 +5 +5 +2 +5 8 +6 +6 +2 +6 9 +6 +6 +3 +6 10 +7 +7 +3 +7 +TAG_CLASS_FEATURES_STORMLORD_SPELLS_PER_DAY TAG_STORMLORDS Stormlord Spells per Day At each stormlord level, the character gains new spells per day (and spells known, if applicable) as if he had also gained a level in a divine spellcasting class to which he belonged before adding the prestige class level. He does not, however, gain any other benefit a character of that class would have gained (improved chance of turning or destroying undead, additional favored enemies, and so on). If the character had more than one divine spellcasting class before becoming a stormlord, the player must decide to which class to add each stormlord level for the purpose of determining spells per day and spells known. +TAG_CLASS_FEATURES_STORMLORD_GRANTED_PROFICIENCIES TAG_STORMLORDS Stormlord Weapon and Armor Proficiency Stormlords gain no weapon or armor proficiencies. +TAG_CLASS_FEATURES_STORMLORD_ENHANCED_JAVELINS TAG_STORMLORDS Stormlord Enhanced Javelins Any javelin thrown by a stormlord counts as a +1 magic weapon. This bonus increases at 6th level to +2 and at 10th level to +3. +TAG_CLASS_FEATURES_STORMLORD_RESISTANCE_TO_ELECTRICITY TAG_STORMLORDS Stormlord Resistance to Electricity As a stormlord gains levels in this prestige class, he becomes increasingly ~resistant~[TAG_SPECIAL_ABILITIES_RESISTANCE_TO_ENERGY] to electrical energy, starting at 1st level with resistance to electricity 5. This bonus increases at 4th and 7th level by an additional 5. +TAG_CLASS_FEATURES_STORMLORD_SHOCK_WEAPONS TAG_STORMLORDS Stormlord Shock Weapons Any spear or javelin used by a stormlord of 2nd level or higher is treated as a shock weapon (dealing an extra 1d6 points of electricity damage). The weapon loses this ability when leaving the hand of the stormlord. For a stormlord of 8th level or higher, any spear or javelin he uses is instead treated as a shocking burst weapon. +TAG_CLASS_FEATURES_STORMLORD_THUNDERING_WEAPONS TAG_STORMLORDS Stormlords Thundering Weapons For a stormlord of 5th level or higher, any spear or javelin he uses is treated as a thundering weapon. The weapon loses this ability when leaving the hand of the stormlord. This effect stacks with that of the stormlord's shock weapon ability. +TAG_CLASS_FEATURES_STORMLORD_IMMUNITY_TO_ELECTRICITY_TAG_STORMLORDS Stormlords Immunity to Electricity At 9th level, a stormlord gains immunity to electricity. +TAG_CLASS_FEATURES_STORMLORD_STORM_OF_ELEMENTAL_FURY TAG_STORMLORDS Stormlords Storm of Elemental Fury At 10th level, a stormlord can summon a storm of great magnitude and power. Once per day, a stormlord can use storm of elemental fury as if he were a 17th-level cleric. Deactivated until Spell Compendium is merged to temple+ +TAG_UNSEEN_SEER TAG_PRESTIGE_CLASSES Unseen Seer Mysterious and elusive, the unseen seer trades in secrets. Subterfuge is her business in the same way that death is the assassin's business, and she uses her magic to help her gather other people's secrets while keeping her own. Becoming an Unseen Seer: Because an unseen seer specializes in stealthy information gathering, this prestige class is especially attractive to rogues. Ninjas, scouts, and spellthieves might find it equally beneficial. Regardless, these characters must master the basics of arcane divination magic before entering, whether by multiclassing as a wizard (typically a diviner), sorcerer, or other arcane caster. The beguiler can qualify as an unseen seer without multiclassing, and though bards make good unseen seers, they typically must multiclass to meet the skill requirements. Hit Die: d4 Requirements: Skills: ~Hide~[TAG_HIDE] 8, ~Search~[TAG_SEARCH] 8, ~Sense Motive~[TAG_SENSE_MOTIVE] 4, ~Spellcraft~[TAG_SPELLCRAFT] 4, ~Spot~[TAG_SPOT] 8. Spellcasting: Ability to cast 1st-level arcane spells, including at least two divination spells. Class Skills: ~Bluff~[TAG_BLUFF], ~Concentration~[TAG_CONCENTRATION], Decipher Script, ~Diplomacy~[TAG_DIPLOMACY], Disguise, Forgery, ~Gather Information~[TAG_GATHER_INFORMATION], ~Hide~[TAG_HIDE], Knowledge (all skills, taken individually), ~Listen~[TAG_LISTEN], ~Move Silently~[TAG_MOVE_SILENTLY], Profession, ~Search~[TAG_SEARCH], ~Sense Motive~[TAG_SENSE_MOTIVE], ~Spellcraft~[TAG_SPELLCRAFT], and ~Spot~[TAG_SPOT]. Skill Points at Each Level: 6 + Int modifier Class Features: [CMD_CHILDREN] +TAG_CLASS_FEATURES_UNSEEN_SEER_TABLES TAG_UNSEEN_SEER Base Attack & Base Save Bonuses Level ~Base Attack Bonus~[TAG_LEVEL_BONUSES] ~Fortitude~[TAG_FORTITUDE] ~Save~[TAG_LEVEL_BONUSES] ~Reflex~[TAG_REFLEX] ~Save~[TAG_LEVEL_BONUSES] ~Will~[TAG_WILL] ~Save~[TAG_LEVEL_BONUSES] 1 @t+0 @t+0 @t+0 @t+2 2 @t+1 @t+0 @t+0 @t+3 3 @t+2 @t+1 @t+1 @t+3 4 @t+3 @t+1 @t+1 @t+4 5 @t+3 @t+1 @t+1 @t+4 6 @t+4 @t+2 @t+2 @t+5 7 @t+5 @t+2 @t+2 @t+5 8 @t+6 @t+2 @t+2 @t+6 9 @t+6 @t+3 @t+3 @t+6 10 @t+7 @t+3 @t+3 @t+7 +TAG_CLASS_FEATURES_UNSEEN_SEER_WEAPON_ARMOR_PROF TAG_UNSEEN_SEER Weapon and Armor Proficiency Unseen Seer gain no weapon, armor or shield proficiencies. +TAG_CLASS_FEATURES_UNSEEN_SEER_SPELLCASTING TAG_UNSEEN_SEER Unseen Seer Spellcasting At each level, you gain new spells per day and an increase in caster level (and spells known, if applicable) as if you had also gained a level in an arcane spellcasting class to which you belonged before adding the prestige class level. You do not, however, gain any other benefit a character of that class would have gained. If you had more than one arcane spellcasting class before becoming an unseen seer, you must decide to which class to add each level for the purpose of determining spells per day, caster level, and spells known. +TAG_CLASS_FEATURES_UNSEEN_SEER_DAMAGE_BONUS TAG_UNSEEN_SEER Unseen Seer Damage Bonus At 1st level, the extra damage you deal with your sneak attack, skirmish, or sudden strike ability increases by 1d6. If you have more than one of these abilities, only one ability gains this increase (choose each time you gain this benefit). Your sneak attack, skirmish, or sudden strike damage increases by another 1d6 at 4th level, 7th level, and 10th level. +TAG_CLASS_FEATURES_UNSEEN_SEER_ADVANCED_LEARNING TAG_UNSEEN_SEER Unseen Seer Advanced Learning At 2nd, 5th, and 8th level, you can add a new spell to your spellbook or list of spells known, representing the result of personal study and experimentation. The spell must be a divination spell of a level no higher than that of the highest-level arcane spell you already know. The spell can be from any class's spell list (arcane or divine). Once a new spell is selected, it is forever added to your spell list and can be cast just like any other spell on your list. +TAG_CLASS_FEATURES_UNSEEN_SEER_SILENT_SPELL TAG_UNSEEN_SEER Unseen Seer Silent Spell At 2nd level, you gain Silent Spell as a bonus feat. +TAG_CLASS_FEATURES_UNSEEN_SEER_DIVINATION_SPELL_POWER TAG_UNSEEN_SEER Unseen Seer Divination Spell Power At 3rd level, you gain a +1 bonus to your caster level when casting an arcane divination spell. This bonus improves to +2 at 6th level, and to +3 at 9th level. This benefit comes at a cost: Your caster level for all other arcane spells is reduced by 1 at 3rd level. This reduction becomes 2 at 6th level and becomes 3 at 9th level. For example, a 4th-level rogue/1st-level sorcerer/6th-level unseen seer would have a caster level of 9th for her arcane divination spells, but only 5th for her nondivination arcane spells. +TAG_CLASS_FEATURES_UNSEEN_SEER_GUARDED_MIND TAG_UNSEEN_SEER Unseen Seer Guarded Mind Any successful unseen seer must learn to protect herself from magic that would reveal her identity. At 5th level, you become protected by nondetection (as the spell, but with a permanent duration). For the purpose of divinations attempted against you, your caster level equals your character level. Currently not implemented in ToEE!! diff --git a/tpdatasrc/tpgamefiles/mes/help/new_feats_help.tab b/tpdatasrc/tpgamefiles/mes/help/new_feats_help.tab index 398cdb18d..47c4130e5 100644 --- a/tpdatasrc/tpgamefiles/mes/help/new_feats_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/new_feats_help.tab @@ -1,10 +1,18 @@ -TAG_AXIOMATIC_STRIKE TAG_FEATS_DES Axiomatic Strike You can turn your fist into an instrument of law. Prerequisite: ~Stunning Fist~[TAG_STUNNING_FIST], ~Ki strike~[TAG_CLASS_FEATURES_MONK_KI_STRIKE] (lawful) Benefit: Against a chaotic opponent, you can make an unarmed attack that does an extra 2d6 points of damage. You must declare that you are using this feat before you make your attack roll (thus, a failed attack ruins the attempt). Each attempt counts as one of your uses of the Stunning Fist feat for the day. Creatures immune to stunning can be affected by this extra damage. -TAG_BRUTAL_THROW TAG_FEATS_DES Brutal Throw You have learned how to hurl weapons to deadly effect. Prerequisite: Benefit: You can add your Strength modifier (instead of your Dexterity modifier) to ~attack rolls~[TAG_RANGED_ATTACKS] with thrown weapons. Special: A fighter may select Brutal Throw as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. Normal: A character attacking with a ranged weapon adds his Dexterity modifier to the attack roll. -TAG_FIERY_FIST TAG_FEATS_DES TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS Fiery Fist By channeling your Ki energy, you sheathe your limbs in magical fire. Your unarmed strikes deal extra fire damage. Prerequisite: ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Stunning Fist~[TAG_STUNNING_FIST], ~Dexterity~[TAG_DEXTERITY] 13, ~Wisdom~[TAG_WISDOM] 13, base attack bonus +8 Benefit: As a swift action, you can expend one of your uses of the ~Stunning Fist~[TAG_STUNNING_FIST] feat to surround your fists and feet in flame. For the rest of your turn, you gain an extra 1d6 points of firedamage on your unarmed strikes. When you select this feat, you gain an additional daily use of Stunning Fist. Special: A fighter can select Fiery Fist as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. A monk with the Stunning Fist feat can select Fiery Fist as her bonus feat at 2nd level, even if she does not meet the other prerequisites. -TAG_FIERY_KI_DEFENSE TAG_FEATS_DES TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS Fiery Ki Defense You channel your ki energy into a cloak of fl ame that injures all who attempt to strike you. Prerequisite: ~Fiery Fist~[TAG_FIERY_FIST], ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Stunning Fist~[TAG_STUNNING_FIST], ~Dexterity~[TAG_DEXTERITY] 13, ~Wisdom~[TAG_WISDOM] 13, base attack bonus +8 Benefit: As a swift action, you can expend one of your uses of the ~Stunning Fist~[TAG_STUNNING_FIST] feat to cloak yourself in flame. Any creature that strikes you with a ~melee attack~[TAG_MELEE_ATTACKS] takes 1d6 points of fire damage. This benefit lasts until the start of your next turn. Special: A fighter can select Fiery Ki Defense as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. A monk with the Stunning Fist feat can select Fiery Ki Defense as her bonus feat at 6th level, as long as she also possesses the Fiery Fist feat (other prerequisites can be ignored). -TAG_FISTS_OF_IRON TAG_FEATS_DES Fists of Iron You have learned the secrets of imbuing your unarmed attacks with extra force. Prerequisite: ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Stunning Fist~[TAG_STUNNING_FIST], base attack bonus +2, Benefit: Declare that you are using this feat before you make your attack roll (thus, a missed attack roll ruins the attempt). You deal an extra 1d6 points of damage when you make a successful unarmed attack. Each attempt counts as one of your uses of the ~Stunning Fist~[TAG_STUNNING_FIST] feat for the day. -TAG_FLYING_KICK TAG_FEATS_DES Flying Kick You literally leap into battle, dealing devastating damage. Prerequisite: ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Power Attack~[TAG_POWER_ATTACK], ~Strength~[TAG_STRENGTH] 13, Jump 4 ranks (omitted as jump is not in the game) Benefit: When fighting unarmed and using the ~charge~[TAG_CHARGE] action, you deal an extra 1d12 points of damage with your unarmed attack. -TAG_FREEZING_THE_LIFEBLOOD TAG_FEATS_DES TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS Freezing the Lifeblood You can paralyze a humanoid opponent with an unarmed attack. Prerequisite: ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Stunning Fist~[TAG_STUNNING_FIST], ~Wisdom~[TAG_WISDOM] 17, base attack bonus +10 Benefit: Declare that you are using this feat before you make your attack roll (thus, a missed attack roll ruins the attempt). Against a humanoid opponent, you can make an unarmed attack that deals no damage but has a chance of ~paralyzing~[TAG_PARALYZED] your target. If your attack is successful, your target must attempt a Fortitude saving throw (DC 10 + 1/2 your character level + your Wis modifier). If the target fails this saving throw, it is paralyzed for 1d4+1 rounds. Each attempt to paralyze an opponent counts as one of your uses of the ~Stunning Fist~[TAG_STUNNING_FIST] feat for the day. Creatures immune to stunning cannot be paralyzed in this manner. Special: A fighter can select Fiery Ki Defense as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. -TAG_KI_BLAST TAG_FEATS_DES TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS Ki Blast You focus your ki into a ball of energy that you can hurl at an opponent. Prerequisite: ~Fiery Fist~[TAG_FIERY_FIST], ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Stunning Fist~[TAG_STUNNING_FIST], ~Dexterity~[TAG_DEXTERITY] 13, ~Wisdom~[TAG_WISDOM] 13, base attack bonus +8 Benefit: You can expend two daily uses of your ~Stunning Fist~[TAG_STUNNING_FIST] feat as a move action to create an orb of raw ki energy. You can then throw the seething orb as a standard action with a range of 60 feet. This ranged touch attack deals damage equal to 3d6 points + your Wis modifier. The ki orb is a force effect. If you fail to throw the orb before the end of your turn, it dissipates harmlessly. When you take this feat, you gain an additional daily use of ~Stunning Fist~[TAG_STUNNING_FIST]. Special: A fighter can select Fiery Ki Defense as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. A monk with the Stunning Fist feat can select Ki Blast as her bonus feat at 6th level, as long as she also possesses the Fiery Fist feat (other prerequisites can be ignored). -TAG_POWER_THROW TAG_FEATS_DES Power Throw You have learned how to hurl weapons to deadly effect. Prerequisite: ~Strength~[TAG_STRENGTH] 13, ~Brutal Throw~[TAG_BRUTAL_THROW], ~Power Attack~[TAG_POWER_ATTACK] Benefit: On your turn, before making any attack rolls, you can choose to subtract a number from all ~thrown weapon attack rolls~[TAG_RANGED_ATTACKS] and add the same number to all thrown weapon damage rolls. This number may not exceed your base attack bonus. The penalty on attack rolls and the bonus on damage rolls applies until your next turn. Special: A fighter may select Brutal Throw as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. -TAG_ZEN_ARCHERY TAG_FEATS_DES Zen Archery Your intuition guides your hand when you use a ranged weapon. Prerequisite: ~Wisdom~[TAG_WISDOM] 13, base attack bonus +1 Benefit: You can use your Wisdom modifier instead of your Dexterity modifier when making a ~ranged attack~[TAG_RANGED_ATTACKS] roll. +TAG_ACTIVE_SHIELD_DEFENSE TAG_FEATS_DES Active Shield Defense Your expert use of your shield allows you to strike at vulnerable foes even when you forgo your own attacks in favor of defense. Prerequisite: ~Proficiency with Shields~[TAG_SHIELD_PROF], ~Shield Specialization~[TAG_SHIELD_SPECIALIZATION]. Benefit: When ~fighting defensively~[TAG_RADIAL_MENU_FIGHT_DEFENSIVELY] and using a shield, you do not take the standard fighting defensively penalties on ~attacks of opportunity~[TAG_AOO]. When using the ~total defense~[TAG_RADIAL_MENU_TOTAL_DEFENSE] action and a shield, you still threaten the area around you as normal. You can make ~attacks of opportunity~[TAG_AOO] with a -4 penalty. Normal: You take a -4 penalty on all attacks while fighting defensively. You cannot attack while using the total defense action. Special: A fighter can select Active Shield Defense as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. +TAG_AXIOMATIC_STRIKE TAG_FEATS_DES Axiomatic Strike You can turn your fist into an instrument of law. Prerequisite: ~Stunning Fist~[TAG_STUNNING_FIST], ~Ki strike~[TAG_CLASS_FEATURES_MONK_KI_STRIKE] (lawful) Benefit: Against a chaotic opponent, you can make an unarmed attack that does an extra 2d6 points of damage. You must declare that you are using this feat before you make your attack roll (thus, a failed attack ruins the attempt). Each attempt counts as one of your uses of the Stunning Fist feat for the day. Creatures immune to stunning can be affected by this extra damage. +TAG_BRUTAL_THROW TAG_FEATS_DES Brutal Throw You have learned how to hurl weapons to deadly effect. Prerequisite: Benefit: You can add your Strength modifier (instead of your Dexterity modifier) to ~attack rolls~[TAG_RANGED_ATTACKS] with thrown weapons. Special: A fighter may select Brutal Throw as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. Normal: A character attacking with a ranged weapon adds his Dexterity modifier to the attack roll. +TAG_STEADFAST_DETERMINATION TAG_FEATS_DES Steadfast Determination Your physical durability allows you to shrug off attacks that would cripple a lesser person. Rather than depend on agility or willpower, you use your raw toughness to survive. Prerequisite: Endurace (omitted) Benefit: You can use your ~Constitution~[TAG_CONSTITUTION] modifier in place of your ~Wisdom~[TAG_WISDOM] modifier on ~Will~[TAG_WILL] saves. You do not automatically fail ~Fortitude~[TAG_FORTITUDE] saves on a roll of natural 1. Note: the no autofail on 1 is currently not implemented +TAG_EPIC_OF_THE_LOST_KING TAG_FEATS_DES Epic of the Lost King You can channel the power of your bardic music to reinvigorate your allies. Prerequisite: ~Bardic Music~[TAG_CLASS_FEATURES_BARD_BARDIC_MUSIC] Benefit: As a ~move action~[TAG_MOVEMENT_ACTION], you can expend one daily use of your ~bardic music ability~[TAG_CLASS_FEATURES_BARD_BARDIC_MUSIC] to remove ~fatigue~[TAG_FATIGUED] from up to three allies (including yourself) within 30 feet. If you spend three daily uses of bardic music, you can remove ~exhaustion~[TAG_EXHAUSTED] from your allies instead. +TAG_FIERY_FIST TAG_FEATS_DES TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS Fiery Fist By channeling your Ki energy, you sheathe your limbs in magical fire. Your unarmed strikes deal extra fire damage. Prerequisite: ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Stunning Fist~[TAG_STUNNING_FIST], ~Dexterity~[TAG_DEXTERITY] 13, ~Wisdom~[TAG_WISDOM] 13, base attack bonus +8 Benefit: As a swift action, you can expend one of your uses of the ~Stunning Fist~[TAG_STUNNING_FIST] feat to surround your fists and feet in flame. For the rest of your turn, you gain an extra 1d6 points of firedamage on your unarmed strikes. When you select this feat, you gain an additional daily use of Stunning Fist. Special: A fighter can select Fiery Fist as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. A monk with the Stunning Fist feat can select Fiery Fist as her bonus feat at 2nd level, even if she does not meet the other prerequisites. +TAG_FIERY_KI_DEFENSE TAG_FEATS_DES TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS Fiery Ki Defense You channel your ki energy into a cloak of fl ame that injures all who attempt to strike you. Prerequisite: ~Fiery Fist~[TAG_FIERY_FIST], ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Stunning Fist~[TAG_STUNNING_FIST], ~Dexterity~[TAG_DEXTERITY] 13, ~Wisdom~[TAG_WISDOM] 13, base attack bonus +8 Benefit: As a swift action, you can expend one of your uses of the ~Stunning Fist~[TAG_STUNNING_FIST] feat to cloak yourself in flame. Any creature that strikes you with a ~melee attack~[TAG_MELEE_ATTACKS] takes 1d6 points of fire damage. This benefit lasts until the start of your next turn. Special: A fighter can select Fiery Ki Defense as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. A monk with the Stunning Fist feat can select Fiery Ki Defense as her bonus feat at 6th level, as long as she also possesses the Fiery Fist feat (other prerequisites can be ignored). +TAG_FISTS_OF_IRON TAG_FEATS_DES Fists of Iron You have learned the secrets of imbuing your unarmed attacks with extra force. Prerequisite: ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Stunning Fist~[TAG_STUNNING_FIST], base attack bonus +2, Benefit: Declare that you are using this feat before you make your attack roll (thus, a missed attack roll ruins the attempt). You deal an extra 1d6 points of damage when you make a successful unarmed attack. Each attempt counts as one of your uses of the ~Stunning Fist~[TAG_STUNNING_FIST] feat for the day. +TAG_FLYING_KICK TAG_FEATS_DES Flying Kick You literally leap into battle, dealing devastating damage. Prerequisite: ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Power Attack~[TAG_POWER_ATTACK], ~Strength~[TAG_STRENGTH] 13, Jump 4 ranks (omitted as jump is not in the game) Benefit: When fighting unarmed and using the ~charge~[TAG_CHARGE] action, you deal an extra 1d12 points of damage with your unarmed attack. +TAG_FORCE_OF_PERSONALITY TAG_FEATS_DES Force of Personality You have cultivated an unshakable belief in your self-worth. Your sense of self and purpose are so strong that they bolster your willpower. Prerequisite: ~Charisma~[TAG_CHARISMA] 13 Benefit: You add your ~Charisma~[TAG_CHARISMA] modifier (instead of your ~Wisdom~[TAG_WISDOM] modifier) to ~Will~[TAG_WILL] saves against mind-affecting spells and abilities. +TAG_FREEZING_THE_LIFEBLOOD TAG_FEATS_DES TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS Freezing the Lifeblood You can paralyze a humanoid opponent with an unarmed attack. Prerequisite: ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Stunning Fist~[TAG_STUNNING_FIST], ~Wisdom~[TAG_WISDOM] 17, base attack bonus +10 Benefit: Declare that you are using this feat before you make your attack roll (thus, a missed attack roll ruins the attempt). Against a humanoid opponent, you can make an unarmed attack that deals no damage but has a chance of ~paralyzing~[TAG_PARALYZED] your target. If your attack is successful, your target must attempt a Fortitude saving throw (DC 10 + 1/2 your character level + your Wis modifier). If the target fails this saving throw, it is paralyzed for 1d4+1 rounds. Each attempt to paralyze an opponent counts as one of your uses of the ~Stunning Fist~[TAG_STUNNING_FIST] feat for the day. Creatures immune to stunning cannot be paralyzed in this manner. Special: A fighter can select Fiery Ki Defense as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. +TAG_INSIGHTFUL_REFLEXES TAG_FEATS_DES Insightful Reflexes Your keen intellect allows you an uncanny knack for evading dangerous effects. Prerequisite: Benefit: You add your ~Intelligence~[TAG_INTELLIGENCE] modifier (instead of your ~Dexterity~[TAG_DEXTERITY] modifier) to ~Reflex saves~[TAG_REFLEX]. +TAG_KI_BLAST TAG_FEATS_DES TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS Ki Blast You focus your ki into a ball of energy that you can hurl at an opponent. Prerequisite: ~Fiery Fist~[TAG_FIERY_FIST], ~Improved Unarmed Strike~[TAG_CLASS_FEATURES_MONK_UNARMED_STRIKE], ~Stunning Fist~[TAG_STUNNING_FIST], ~Dexterity~[TAG_DEXTERITY] 13, ~Wisdom~[TAG_WISDOM] 13, base attack bonus +8 Benefit: You can expend two daily uses of your ~Stunning Fist~[TAG_STUNNING_FIST] feat as a move action to create an orb of raw ki energy. You can then throw the seething orb as a standard action with a range of 60 feet. This ranged touch attack deals damage equal to 3d6 points + your Wis modifier. The ki orb is a force effect. If you fail to throw the orb before the end of your turn, it dissipates harmlessly. When you take this feat, you gain an additional daily use of ~Stunning Fist~[TAG_STUNNING_FIST]. Special: A fighter can select Fiery Ki Defense as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. A monk with the Stunning Fist feat can select Ki Blast as her bonus feat at 6th level, as long as she also possesses the Fiery Fist feat (other prerequisites can be ignored). +TAG_POWER_THROW TAG_FEATS_DES Power Throw You have learned how to hurl weapons to deadly effect. Prerequisite: ~Strength~[TAG_STRENGTH] 13, ~Brutal Throw~[TAG_BRUTAL_THROW], ~Power Attack~[TAG_POWER_ATTACK] Benefit: On your turn, before making any attack rolls, you can choose to subtract a number from all ~thrown weapon attack rolls~[TAG_RANGED_ATTACKS] and add the same number to all thrown weapon damage rolls. This number may not exceed your base attack bonus. The penalty on attack rolls and the bonus on damage rolls applies until your next turn. Special: A fighter may select Brutal Throw as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. +TAG_SHIELD_CHARGE TAG_FEATS_DES Shield Charge You deal extra damage if you use your shield as a weapon when charging. Prerequisite: ~Proficiency with Shields~[TAG_SHIELD_PROF], ~Improved Shield Bash~[TAG_IMPROVED_SHIELD_BASH], Base Attack Bonus +3. Benefit: If you hit an opponent with your shield as part of a ~charge action~[TAG_CHARGE], in addition to dealing damage normally, you may make a ~trip attack~[TAG_TRIP] without provoking an ~attack of opportunity~[TAG_AOO]. If you lose, the defender does not get to try to trip you in return. Special: A fighter can select Active Shield Defense as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. +TAG_SHIELD_SPECIALIZATION TAG_FEATS_DES Shield Specialization You are skilled in using a shield, allowing you to gain greater defensive benefits from it. Prerequisite: ~Proficiency with Shields~[TAG_SHIELD_PROF] Benefit: When using a shield, you increase its shield bonus to AC by 1. Special: A fighter can select Active Shield Defense as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. +TAG_SHIELD_WARD TAG_FEATS_DES Shield Ward You use your shield like a wall of steel and wood. When an opponent attempts to draw in close to you, your shield forces him away or ruins his attacks. Prerequisite: ~Proficiency with Shields~[TAG_SHIELD_PROF], ~Shield Specialization~[TAG_SHIELD_SPECIALIZATION]. Benefit: You apply your shield bonus to your ~touch~[TAG_TOUCH_ATTACK] AC, and on checks or rolls to resist ~bull rush~[TAG_BULLRUSH], ~disarm~[TAG_DISARM], ~grapple~[TAG_GRAPPLE], overrun, or ~trip~[TAG_TRIP] attempts against you. Special: A fighter can select Active Shield Defense as one of his ~fighter bonus feats~[TAG_CLASS_FEATURES_FIGHTER_BONUS_FEATS]. +TAG_ZEN_ARCHERY TAG_FEATS_DES Zen Archery Your intuition guides your hand when you use a ranged weapon. Prerequisite: ~Wisdom~[TAG_WISDOM] 13, base attack bonus +1 Benefit: You can use your Wisdom modifier instead of your Dexterity modifier when making a ~ranged attack~[TAG_RANGED_ATTACKS] roll. diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index f18dd088b..2ed6cd5ff 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -1,6 +1,7 @@ TAG_WEAPON_SHIELD_PROFICIENCY TAG_COMBAT Weapon, Armor, and Shield Proficiency A character who uses a weapon with which he or she is not proficient takes a -4 penalty on ~attack rolls~[TAG_ATTACK_ROLL]. A character who wears armor and/or uses a shield with which he or she is not proficient takes the armor's (and/or shield's) armor check penalty on attack rolls and on all Strength-based and Dexterity-based ability and skill checks. The penalty for nonproficiency with armor stacks with the penalty for nonproficiency with shields. Weapon, armor, or shield proficiency may be granted by the character's race, class or by the following feats: ~Armor Proficiency (Light)~[TAG_ARMOR_LIGHT] ~Armor Proficiency (Medium)~[TAG_ARMOR_MEDIUM] ~Armor Proficiency (Heavy)~[TAG_ARMOR_HEAVY] ~Exotic Weapon Proficiency~[TAG_EXOTIC_PROF] ~Martial Weapon Proficiency~[TAG_MARTIAL_PROF] ~Simple Weapon Proficiency~[TAG_SIMPLE_PROF] ~Shield Proficiency~[TAG_SHIELD_PROF] Note: I am unsure about the state of simple weapon prof and shield prof and need to verify the help text as they differ from actual D&D. -TAG_SPELLS_ACID_FOG TAG_SPELLS TAG_SORCERER_6 TAG_WIZARD_6 TAG_WATER_D Acid Fog ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Acid] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 6, ~Domain: Water~[TAG_WATER_D] 7 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Area: 20-ft. radius Duration: 1 round/level Saving Throw: None Spell Resistance: No Acid fog creates a billowing mass of misty vapors similar to that produced by a ~solid fog~[TAG_SPELLS_SOLID_FOG] spell. In addition to slowing creatures down and obscuring sight, this spell's vapors are highly acidic. Each round on your turn, starting when you cast the spell, the fog deals 2d6 points of acid damage to each creature and object within it. -TAG_SPELLS_AID_MASS TAG_SPELLS TAG_CLERIC_3 Aid, Mass ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT](Compulsion)[Mind-Affecting] Level: ~Cleric~[TAG_CLERICS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Target: One creature/level no two more than 30 ft. apart Duration: 1 min./level Saving Throw: None Spell Resistance: No You hold your holy symbol aloft and cast the spell. A silvery radiance dances from your hands, leaping over all the nearby party members and strengthening them. Aid, Mass grants the targets a +1 ~morale~[TAG_MODIFIER_MORALE] bonus on ~attack rolls~[TAG_ATTACK_ROLL] and saves against ~fear~[TAG_FEAR] effects, plus ~temporary hit points~[TAG_TEMPORARY_HIT_POINTS] equal to 1d8 + ~caster level~[TAG_CASTER_LEVEL] (to a maximum of 1d8+15 temporary hit points). +TAG_SPELLS_ACCURACY TAG_SPELLS TAG_WARMAGE_1 Accuracy ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Warmage~[TAG_WARMAGES] 1 Components: V, S, M Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: Touch Duration: 10 minutes/level Saving Throw: None Spell Resistance: No When you cast this spell, you enhance one or more thrown weapons or one projectile weapon to improve its chance of hitting distant targets. For the duration of the spell, the range increment for the affected weapon or weapons is doubled. +TAG_SPELLS_ACID_FOG TAG_SPELLS TAG_SORCERER_ TAG_WIZARD_6 TAG_WATER_D Acid Fog ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Acid] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 6, ~Domain: Water~[TAG_WATER_D] 7 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Area: 20-ft. radius Duration: 1 round/level Saving Throw: None Spell Resistance: No Acid fog creates a billowing mass of misty vapors similar to that produced by a ~solid fog~[TAG_SPELLS_SOLID_FOG] spell. In addition to slowing creatures down and obscuring sight, this spell's vapors are highly acidic. Each round on your turn, starting when you cast the spell, the fog deals 2d6 points of acid damage to each creature and object within it. +TAG_SPELLS_AID,_MASS TAG_SPELLS TAG_CLERIC_3 Aid, Mass ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT](Compulsion)[Mind-Affecting] Level: ~Cleric~[TAG_CLERICS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Target: One creature/level no two more than 30 ft. apart Duration: 1 min./level Saving Throw: None Spell Resistance: No You hold your holy symbol aloft and cast the spell. A silvery radiance dances from your hands, leaping over all the nearby party members and strengthening them. Aid, Mass grants the targets a +1 ~morale~[TAG_MODIFIER_MORALE] bonus on ~attack rolls~[TAG_ATTACK_ROLL] and saves against ~fear~[TAG_FEAR] effects, plus ~temporary hit points~[TAG_TEMPORARY_HIT_POINTS] equal to 1d8 + ~caster level~[TAG_CASTER_LEVEL] (to a maximum of 1d8+15 temporary hit points). TAG_SPELLS_ALIGN_WEAPON_MASS TAG_SPELLS TAG_CLERIC_3 Align Weapon, Mass ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION](see text) Level: ~Cleric~[TAG_CLERICS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Target: One creature/level no two more than 30 ft. apart Duration: 1 min./level Saving Throw: None Spell Resistance: No You hold your holy symbol high and speak old words of power. Your party's weapons take on a pale blue radiance. This spell functions like ~align weapon~[TAG_SPELLS_ALIGN_WEAPON], except that it affects multiple weapons or projectiles at a distance. Note: The projectiles part is not implemented. Warning: as a cleric you can't cast a spell that does have an opposed Alignment Descriptor. I can't change the descriptor on the fly, which means you can actually try to cast the spell but it will fizzle and you loose the spell if you try to cast it with the wrong alignment! TAG_SPELLS_ALLEGRO TAG_SPELLS TAG_BARD_3 Allegro ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] ~Bard~[TAG_BARDS] 3 Components: V, S Casting Time: 1 ~free action~[TAG_FREE_ACTION] Range: 20 ft. Area: 20 ft. radius burst centered on you Duration: 1 min/level With a quick wiggle of your fingers and a few arcane words, you release the feather in your hand to complete the spell. Suddenly, translucent blue motes burst outward from you and collect on yourself and your nearby allies before fading away. Each creature within the spell's area gains a 30-foot ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus to its land ~speed~[TAG_MOVEMENT_RATE], up to a maximum of double the creature's land speed. Affected creatures retain these effects for the duration of the spell, even if they leave the original area. TAG_SPELLS_ANARCHIC_STORM TAG_SPELLS TAG_CLERIC_3 Anarchic Storm ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Chaotic][Water] Level: ~Cleric~[TAG_CLERICS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 20 ft. Area: 20-ft. radius Duration: 1 round/level Saving Throw: None Spell Resistance: No You call upon the powers of chaos, and a heavy rain begins to fall around you, its drops a rainbow of soft radiances. Above you, a multicolored lightning bolt flashes. The downpour created by this spell falls in a fixed area once created. The storm reduces hearing and visibility, resulting in a -4 penalty on ~Listen~[TAG_LISTEN], ~Spot~[TAG_SPOT], and ~Search~[TAG_SEARCH] checks. It also applies a -4 penalty on ~ranged~[TAG_RANGED_ATTACKS] attacks made into, out of, or through the storm. Finally, it automatically extinguishes any unprotected flames and has a 50% chance to extinguish protected flames (such as those of lanterns). The rain damages lawful creatures, dealing 2d6 points of damage per round (lawful outsiders take double damage). In addition, each round, a bolt of lightning strikes a randomly selected lawful outsider within the spell's area, dealing 5d6 points of electricity damage. After the spell's duration expires, the water disappears. @@ -8,7 +9,9 @@ TAG_SPELLS_ANGELSKIN TAG_SPELLS TAG_PALADIN_2 Angelskin ~Abjuration~[TAG_MAGIC_ TAG_SPELLS_APPRAISING_TOUCH TAG_SPELLS TAG_BARD_1 TAG_SORCERER_1 TAG_WIZARD_1 Appraising Touch ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Bard~[TAG_BARDS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 hour/level Encircling your eye with thumb and forefinger as if holding a jeweler's lens, you speak the arcane words that complete the spell. Objects near you suddenly seem clearer, more in focus. You note blemishes and imperfections you had missed before. You gain an intuitive insight into the value of objects you come into contact with. You gain a +10 ~insight~[TAG_MODIFIER_INSIGHT] bonus on ~Appraise~[TAG_APPRAISE] checks to determine the value of items you touch while this spell is in effect. TAG_SPELLS_AWAKEN_SIN TAG_SPELLS TAG_CLERIC_3 TAG_PALADIN_2 Awaken Sin ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT](Compulsion)[Fear][Good][Mind-Affecting] Level: ~Cleric~[TAG_CLERICS] 3, ~Paladin~[TAG_PALADINS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: One evil creature with intelligence 3+ Duration: Instantaneous Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes A command for repentance issues from your mouth, carrying with it the power of the spell. The crushing feeling of guilt that grew within you while you cast the spell lifts as you project the feeling at your target. The subject immediately takes 1d6 points of ~nonlethal~[TAG_RADIAL_MENU_NONLETHAL_DAMAGE] damage per caster level (maximum 10d6) and is ~stunned~[TAG_STUNNED] for 1 round. If this knocks the subject ~unconscious~[TAG_UNCONSCIOUS], it also takes 1d6 points of ~Wisdom~[TAG_WISDOM] damage. Note: please be aware of the target restrictions! TAG_SPELLS_AXIOMATIC_STORM TAG_SPELLS TAG_CLERIC_3 TAG_PALADIN_3 Axiomatic Storm ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Lawful][Water] Level: ~Cleric~[TAG_CLERICS] 3, ~Paladin~[TAG_PALADINS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 20 ft. Area: 20-ft. radius Duration: 1 round/level Saving Throw: None Spell Resistance: No You call upon the forces of law and a heavy rain begins to fall around you, its raindrops harsh and metallic. Above you, a jet of caustic acid lances down from the heavens. A driving rain falls around you. It falls in a fixed area once created. The storm reduces hearing and visibility, resulting in a -4 penalty on ~Listen~[TAG_LISTEN], ~Spot~[TAG_SPOT], and ~Search~[TAG_SEARCH] checks. It also applies a -4 penalty on ~ranged~[TAG_RANGED_ATTACKS] attacks made into, out of, or through the storm. Finally, it automatically extinguishes any unprotected flames and has a 50% chance to extinguish protected flames (such as those of lanterns). The rain damages chaotic creatures, dealing 2d6 points of damage per round (chaotic outsiders take double damage). In addition, each round, a gout of acid strikes a randomly selected chaotic outsider within the spell's area, dealing 5d6 points of acid damage. After the spell's duration expires, the water disappears. +TAG_SPELLS_BLADES_OF_FIRE TAG_SPELLS TAG_RANGER_1 TAG_SORCERER_1 TAG_WARMAGE_2 TAG_WIZARD_1 Blades of Fire ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] Level: ~Ranger~[TAG_RANGERS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 2 Components: V Casting Time: 1 ~Swift Action~[TAG_SWIFT_ACTION] Range: Touch Target: Weapons touched Duration: 1 round With a word your weapons burst into flame. You feel no heat and the flames merely tickle your skin. Your melee weapons each deal an extra 1d8 points of fire damage. This damage stacks with any energy damage your weapons already deal. TAG_SPELLS_BLADEWEAVE TAG_SPELLS TAG_BARD_2 TAG_SORCERER_2 TAG_WIZARD_2 Bladeweave ~Illusion~[TAG_MAGIC_SCHOOLS_ILLUSION] Level: ~Bard~[TAG_BARDS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Range: Personal Target: You Duration: 1 round/level With a shout you unleash the power of the spell, causing every movement you make with your weapon to seem beautiful and full of flourish. Once per round, choose one target that you successfully attacked with a melee weapon. That creature must succeed on a ~Will~[TAG_WILL] save or be ~dazed~[TAG_DAZED] for 1 round. Spell resistance applies to this effect. Note: In Temple of Elemental Evil your first successful attack in a given round will try to daze. +TAG_SPELLS_BLAST_OF_FLAME TAG_SPELLS TAG_SORCERER_4 TAG_WARMAGE_4 TAG_WIZARD_4 Blast of Flame ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Fire] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Warmage~[TAG_WARMAGE_4] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 60 ft. Area: Cone-shaped burst Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: No As you cast the spell, your hand becomes sheathed in barely perceptible yellow flames. With a roar, the flames burst from your hand in the shape of a cone, leaving your hand trailing wisps of smoke. Flames fill the area, dealing 1d6 points of fire damage per caster level (maximum 10d6) to any creature in the area that fails its saving throw. TAG_SPELLS_BLESS_WEAPON_SWIFT TAG_SPELLS TAG_PALADIN_1 Bless Weapon, Swift ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Paladin~[TAG_PALADINS] 1 Components: V, S Casting Time: 1 ~free action~[TAG_FREE_ACTION] Range: Personal Target: Weapon touched Duration: 1 round Saving Throw: None Spell Resistance: No You invoke the holy words quickly, and your weapon flashes a momentary blue-white radiance. This spell functions like ~bless weapon~[TAG_SPELLS_BLESS_WEAPON], except as noted above. Notes: The projectiles part is not implemented. TAG_SPELLS_BLESSED_AIM TAG_SPELLS TAG_BLACKGUARD_1 TAG_CLERIC_1 TAG_PALADIN_1 Blessed Aim ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Blackguard~[TAG_BLACKGUARDS] 1, ~Cleric~[TAG_CLERICS] 1, ~Paladin~[TAG_PALADINS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 50 ft. Effect: 50-ft.-radius spread centered on you Duration: 1 minute/level With the blessing of your deity, you bolster your allies' aim with an exhortation. This spell grants your allies within the spread a +2 ~morale~[TAG_MODIFIER_MORALE] bonus on ~ranged~[TAG_RANGED_ATTACKS] attack rolls. TAG_SPELLS_BLESSING_OF_BAHAMUT TAG_SPELLS TAG_PALADIN_3 Blessing of Bahamut ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION][Good] Level: ~Paladin~[TAG_PALADINS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 round/level Saving Throw: None Spell Resistance: No You hear a distant dragon's roar that no one else detects, and your skin takes on a platinum sheen You gain ~damage reduction~[TAG_SPECIAL_ABILITIES_DAMAGE_REDUCTION] 10/magic for the spell's duration. @@ -23,12 +26,12 @@ TAG_SPELLS_CLOAK_OF_BRAVERY TAG_SPELLS TAG_CLERIC_3 TAG_PALADIN_2 Cloak of Brav TAG_SPELLS_CLOUD_OF_BEWILDERMENT TAG_SPELLS TAG_BARD_2 TAG_SORCERER_2 TAG_WIZARD_2 Cloud of Bewilderment ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] Level: ~Bard~[TAG_BARDS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./ 2 levels) Area: 10-ft. radius Duration: 1 round/level ~Fortitude~[TAG_FORTITUDE] negates; see text Spell Resistance: No As you exhale the last syllables of the incantation, your breath forms an invisible spray of noxious air. This spell creates a small cloud of nauseating vapors. Any living creature in the area becomes ~nauseated~[TAG_NAUSEATED]. This condition lasts as long as the creature is in the cloud and for 1d4+1 rounds after it leaves. Any creature that succeeds on its save but remains in the cloud must continue to save each round on your turn. The cloud obscures sight, including darkvision, providing ~concealment~[TAG_CONCEALMENT] to creatures within the area or against attacks made through the cloud. TAG_SPELLS_CLUTCH_OF_ORCUS TAG_SPELLS TAG_CLERIC_3 Clutch of Orcus ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY][Evil] Level: ~Cleric~[TAG_CLERICS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Target: One humanoid Duration: Concentration, up to 1 round/level Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates Spell Resistance: Yes Reaching out a hand twisted by tension into a grasping claw, you squeeze your foe's heart from afar, anticipating the moment its smoking remains will rest in your palm. Magical force grips the subject's heart (or similar vital organ) and begins crushing it. The victim is ~paralyzed~[TAG_PARALYZED] and takes 1d12 points of damage per round. ~Concentration~[TAG_CONCENTRATION] is required to maintain the spell each round. A consious victim can attempt a new ~Fortitude~[TAG_FORTITUDE] saving throw each round to end the spell. If the victim dies as a result of this spell, its smoking heart appears in your hand. TAG_SPELLS_CONVICTION TAG_SPELLS TAG_CLERIC_1 Conviction ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Cleric~[TAG_CLERICS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 10 minutes/level Saving Throw: None Spell Resistance: No You hold the holy passage in your hand and touch your ally, intoning the spell. A sea-blue nimbus of light blossoms about his head and shoulders, strengthening his resolve. This spell bolsters the mental, physical, and spiritual strength of the creature touched. The spell grants the subject a +2 ~morale~[TAG_MODIFIER_MORALE] bonus on ~saving throws~[TAG_SAVING_THROW_DESC], with an additional +1 to the bonus for every six caster levels you have (maximum +5 morale bonus at 18th level). -TAG_SPELLS_CONVICTION_MASS TAG_SPELLS TAG_CLERIC_3 Conviction, Mass ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Cleric~[TAG_CLERICS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Area: Allies in a 20 ft.-radius burst Duration: 10 minutes/level Saving Throw: None Spell Resistance: No You hold the holy passage aloft and invoke the power of its words. Around you, your friends are bathed in a sea-blue nimbus of light. This spell functions like ~conviction~[TAG_SPELLS_CONVICTION], except that it affects multiple allies at a distance. +TAG_SPELLS_CONVICTION,_MASS TAG_SPELLS TAG_CLERIC_3 Conviction, Mass ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Cleric~[TAG_CLERICS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Area: Allies in a 20 ft.-radius burst Duration: 10 minutes/level Saving Throw: None Spell Resistance: No You hold the holy passage aloft and invoke the power of its words. Around you, your friends are bathed in a sea-blue nimbus of light. This spell functions like ~conviction~[TAG_SPELLS_CONVICTION], except that it affects multiple allies at a distance. TAG_SPELLS_CORONA_OF_COLD TAG_SPELLS TAG_CLERIC_3 TAG_DRUID_3 Corona of Cold ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION][Cold] Level: ~Cleric~[TAG_CLERICS] 3, ~Druid~[TAG_DRUIDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Area: 10 ft.-radius emanation centered on you Duration: 1 round/level(D) Saving Throw: ~Fortitude~[TAG_FORTITUDE] Spell Resistance: Yes As you complete the spell you feel your extremities turn ice cold, numb, and sluggish. The feeling subsides as the cold drains away from your body into the air around you, causing your breath to emerge as white puffs in the now-chill air. You are surrounded by a protective aura of cold that also causes damage to others within its radius. You gain ~resistance~[TAG_SPECIAL_ABILITIES_RESISTANCE_TO_ENERGY] to fire 10. Starting in the round you cast the spell, corona of cold also deals 1d12 points of cold damage each round at the beginning of your turn to all other creatures within the area. A successful save prevents the damage caused by the spell in that round, but does not prevent damage in future rounds. Creatures damaged by the spell shiver uncontrollably, taking a -2 penalty to their ~Strength~[TAG_STRENGTH] and ~Dexterity~[TAG_DEXTERITY] and ~moving~[TAG_MOVEMENT_RATE] at half speed for as long as they remain within the area; these penalties do not stack with consecutive rounds of damage or additional corona of cold spells. TAG_SPELLS_CRITICAL_STRIKE TAG_SPELLS TAG_ASSASSIN_1 TAG_BARD_1 TAG_SORCERER_1 TAG_WIZARD_1 Critical Strike ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Assassin~[TAG_ASSASSINS] 1, ~Bard~[TAG_BARDS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V Casting Time: ~Free action~[TAG_FREE_ACTION] Range: Personal Target: You Duration: 1 round Upon uttering the ancient phrase that completes the spell, you feel the weapon in your hand drawn toward a creature standing nearby. Whenever you make a melee attack agains a ~flanked~[TAG_FLANKED] foe or against a foe denied its ~Dexterity~[TAG_DEXTERITY] bonus, you deal an extra 1d6 points of damage, your weapon's threat range is doubled(as if under the effect of ~keen edge~[TAG_SPELLS_KEEN_EDGE]), and you gain a +4 insight bonus on rolls made to confirm critical threats. The increased threat range granted by this spell doesn't stack with any other effect that increases your weapon's threat range. Creatures immune to extra damage from sneak attacks are immne to the extra damage dealt by your attacks. TAG_SPELLS_CURSE_OF_ILL_FORTUNE TAG_SPELLS TAG_BLACKGUARD_2 TAG_CLERIC_2 Curse of Ill Fortune ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Blackguard~[TAG_BLACKGUARDS] 2, ~Cleric~[TAG_CLERICS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Target: One living creature Duration: 1 minute/level Letting loose a stream of foul incantations, you curse the subject. You place a temporary curse upon the subject, giving it a -3 penalty on ~attack rolls~[TAG_ATTACK_ROLL], ~saving throws~[TAG_SAVING_THROW_DESC], ~ability checks~[TAG_ABILITY_SCORES], and ~skill checks.~[TAG_SKILLS] Curse of ill fortune is negated by any spell that removes a ~bestow curse~[TAG_SPELLS_BESTOW_CURSE] spell. TAG_SPELLS_CURSE_OF_IMPENDING_BLADES TAG_SPELLS TAG_BARD_2 TAG_RANGER_2 TAG_SORCERER_2 TAG_WIZARD_2 Curse of Impending Blades ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Bard~[TAG_BARDS] 2, ~Ranger~[TAG_RANGERS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (10 ft. + 10 ft./level) Target: One Creature Duration: 1 minute/level Saving Throw: None Spell Resistance: Yes You grip the nail-pierced hunk of leather and cast the spell. A small black dagger jets from the tip of the nail and strikes your opponent squarely in the chest. The target of the spell has a hard time avoiding attacks, sometimes even seeming to stumble into harm's way. The subjects takes a -2 penalty to ~AC~[TAG_ARMOR_CLASS]. -TAG_SPELLS_CURSE_OF_IMPENDING_BLADES_MASS TAG_SPELLS TAG_BARD_3 TAG_RANGER_3 TAG_SORCERER_3 TAG_WIZARD_3 Curse of Impending Blades, Mass ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Bard~[TAG_BARDS] 3, ~Ranger~[TAG_RANGERS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (10 ft. + 10 ft./level) Target: Enemies in a 20-ft. radius burst Duration: 1 minute/level Saving Throw: None Spell Resistance: Yes This spell functions like ~Curse of Impending Blades~[TAG_SPELLS_CURSE_OF_IMPENDING_BLADES], except that it affects multiple enemies. +TAG_SPELLS_CURSE_OF_IMP._BLADES,_MASS TAG_SPELLS TAG_BARD_3 TAG_RANGER_3 TAG_SORCERER_3 TAG_WIZARD_3 Curse of Impending Blades, Mass ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] Level: ~Bard~[TAG_BARDS] 3, ~Ranger~[TAG_RANGERS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (10 ft. + 10 ft./level) Target: Enemies in a 20-ft. radius burst Duration: 1 minute/level Saving Throw: None Spell Resistance: Yes This spell functions like ~Curse of Impending Blades~[TAG_SPELLS_CURSE_OF_IMPENDING_BLADES], except that it affects multiple enemies. TAG_SPELLS_DEAFENING_CLANG TAG_SPELLS TAG_PALADIN_1 Deafening Clang ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION][SONIC] Level: ~Paladin~[TAG_PALADINS] 1 Components: V, S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Range: Personal Target: Weapon Touched Duration: 1 round/level At your touch, the weapon rings like a struck tuning fork. The sound diminishes until it's imperceptible, but when you touch the weapon you can feel the vibration. You empower the touched weapon with magic that causes it to emit a loud clang when it is struck against a hard surface, such as a floor, wall, or creature. The weapon deals 1d6 points of sonic damage with each successful hit, and any creature struck by the weapon must succeed on a ~Fortitude~[TAG_FORTITUDE] saving throw or be ~deafened~[TAG_DEAFENED] for 1 minute. TAG_SPELLS_DEIFIC_VENGEANCE TAG_SPELLS TAG_CLERIC_2 Deific Vengeance ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] Level: ~Cleric~[TAG_CLERICS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Target: One creature Duration: Instantaneous Saving Throw: ~Will~[TAG_WILL] Spell Resistance: Yes You call out to your deity, declaring your foe's crimes and asking your deity to punish him. This spell deals 1d6 points of damage per two caster levels (maximum 5d6), or 1d6 points per caster level (maximum 10d6) if the target is undead. TAG_SPELLS_DEMON_DIRGE TAG_SPELLS TAG_CLERIC_3 TAG_SORCERER_3 TAG_WIZARD_3 Demon Dirge ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Cleric~[TAG_CLERICS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close Target: One living creature Duration: 1d6 rounds Saving Throw: None or ~Fortitude~[TAG_FORTITUDE] partial(see text) Spell Resistance: Yes You cry out the ancient words and make the prescribed motions, and your foe lets out a howl of pain as his blood boils in his veins. Demon Dirge deals 2d6 points of damage each round for the duration of the spell to any creature that has both the chaotic and evil subtypes (such as a howler or a demon). No saving throw is allowed against this damage. If the target creature also possesses the demon subtype, the spell has a much more powerful effect. In addition to the damage, a demon is stunned for the duration of the spell unless it succeeds on a Fortitude save. @@ -44,22 +47,28 @@ TAG_SPELLS_DISTRACT_ASSAILANT TAG_SPELLS TAG_ASSASSIN_1 TAG_SORCERER_1 TAG_WIZA TAG_SPELLS_DIVINE_PROTECTION TAG_SPELLS TAG_CLERIC_2 TAG_PALADIN_2 Divine Protection ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT](Compulsion)[Mind-Affecting] Level: ~Cleric~[TAG_CLERICS] 2, ~Paladin~[TAG_PALADINS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Target: Allies in a 20ft.-radius burst Duration: 1 minute/level Saving Throw: None Spell Resistance: No You call upon your holy powers to aid your companions and a golden light appears from above, bathing them with sparkling radiance. Allies gain a +1 ~morale~[TAG_MODIFIER_MORALE] bonus to their ~Armor Class~[TAG_ARMOR_CLASS] and on ~saving throws~[TAG_SAVING_THROW_DESC]. TAG_SPELLS_DOLOROUS_BLOW TAG_SPELLS TAG_BARD_3 TAG_SORCERER_3 TAG_WIZARD_3 Dolorous Blow ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Bard~[TAG_BARDS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 minute/level A longing for battle fills you as you complete this spell. Upon touching the intended weapon, the feeling fades even as a dull red aura encompasses the weapon. For the duration of the spell, the weapon's threat range is doubled, and its critical threats automatically confirm, so every threat is a ~critical hit~[TAG_CRITICAL_HIT]. The latter effect does not apply to any weapon that already has a magical effect related to critical hits. Multiple effects that increase a weapon's threat range (such as this spell and the ~Improved Critical~[TAG_IMPROVED_CRITICAL] feat) don't stack. You can't cast this spell on a natural weapon, such as a claw. TAG_SPELLS_ENERGY_VORTEX TAG_SPELLS TAG_CLERIC_3 TAG_DRUID_3 Energy Vortex ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] Level: ~Cleric~[TAG_CLERICS] 3, ~Druid~[TAG_DRUIDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 20 Targets: All creatures within a 20-ft. radius burst centered on you Duration: 1 round/level Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes Energy wells up inside you and explodes outward in a furious burst. When you cast energy vortex, you choose one of four energy types: acid, cold,electricity, or fire. A blast of that energy type bursts in all directions from you, dealing 1d8 points of damage +1 point per caster level (maximum +20) to nearby creatures other than you. If you are willing to take the damage yourself, you deal twice as much damage. You don’t get a Reflex save, but ~spell resistance~[TAG_SPECIAL_ABILITIES_SPELL_RESISTANCE] applies, as do any resistances and immunities you have to the energy type. The descriptor of this spell is the same as the energy type you choose when you cast it. +TAG_SPELLS_EVARD'S_BLACK_TENTACLES TAG_SPELLS TAG_SORCERER_4 TAG_WIZARD_4 TAG_WARMAGE_4 Evard's Black Tentacles ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation) Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Warmage~[TAG_WARMAGES] 4 Components: V, S, M Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. +10 ft./level) Area: 20-ft.-radius spread Duration: 1 round/level Saving Throw: None Spell Resistance: No This spell conjures a field of rubbery black tentacles, each 10 feet long. These waving members seem to spring forth from the earth, floor, or whatever surface is underfoot—including water. They grasp and entwine around creatures that enter the area, holding them fast and crushing them with great strength. Every creature within the area of the spell must make a ~grapple~[TAG_GRAPPLE] check, opposed by the grapple check of the tentacles. Treat the tentacles attacking a particular target as a Large creature with a base attack bonus equal to your caster level and a Strength score of 19. Thus, its grapple check modifier is equal to your caster level +8. The tentacles are immune to all types of damage. Once the tentacles grapple an opponent, they may make a grapple check each round on your turn to deal 1d6+4 points of bludgeoning damage. The tentacles continue to crush the opponent until the spell ends or the opponent escapes. Any creature that enters the area of the spell is immediately attacked by the tentacles. Even creatures who aren't grappling with the tentacles may move through the area at only half normal speed. TAG_SPELLS_FAITH_HEALING TAG_SPELLS TAG_BLACKGUARD_1 TAG_CLERIC_1 TAG_PALADIN_1 Faith Healing ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Healing) Level: ~Blackguard~[TAG_BLACKGUARDS] 1, ~Cleric~[TAG_CLERICS] 1, ~Paladin~[TAG_PALADINS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: Instantaneous You place your hands on your loyal acolyte and blue-silver radiance discharges from your hands. The horrendous wounds across his chest heal, leaving no scar. When laying your hand upon a living creature, you channel positive energy that cures 8 points of damage +1 point per caster level (up to +5). The spell works only on a creature that worships the same ~deity~[TAG_RELIGION] as you. A target with no deity or a different deity from yours is unaffected by the spell, even if the target would normally be harmed by positive energy. TAG_SPELLS_FELL_THE_GREATEST_FOE TAG_SPELLS TAG_ASSASSIN_2 TAG_CLERIC_3 TAG_PALADIN_2, TAG_RANGER_2 Fell the Greatest Foe ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Assassin~[TAG_ASSASSINS] 2, ~Cleric~[TAG_CLERICS] 3, ~Paladin~[TAG_PALADINS] 2, ~Ranger~[TAG_RANGERS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 1 round/level You touch the creature, and its muscles ripple with yellow energy. The subject gains the ability to deal greater damage against larger creatures. For every ~size category~[TAG_SIZE_MODIFIER] of an opponent bigger than the subject of the spell, the subject deals an extra 1d6 points of damage on any successful ~melee attack~[TAG_MELEE_ATTACKS]. For example, a Medium creature would deal an extra 1d6 points of damage against a Large creature, 2d6 against Huge, 3d6 against Gargantuan, or 4d6 against a Colossal creature. TAG_SPELLS_FIND_THE_GAP TAG_SPELLS TAG_ASSASSIN_3 TAG_PALADIN_3 TAG_RANGER_3 Find the Gap ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Assassin~[TAG_ASSASSINS] 3, ~Paladin~[TAG_PALADINS] 3, ~Ranger~[TAG_RANGERS] 3 Components: V Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 round/level You speak the words of this spell, and a blue mark that only you can see appears on your opponent, highlighting a weak spot in her defense. You gain the ability to perceive weak points in your opponent's armor. Your first melee or ranged attack each round is resolved as a ~touch attack~[TAG_TOUCH_ATTACK], disregarding the subject's ~armor~[TAG_ARMOR], ~shield~[TAG_SHIELDS], and ~natural~[TAG_MODIFIER_NATURAL_ARMOR] armor bonuses (including any ~enhancement~[TAG_ENHANCEMENT_BONUS] bonuses) to ~Armor Class~[TAG_ARMOR_CLASS]. Other AC bonuses, such as ~dodge~[TAG_DODGE] bonuses, ~deflection~[TAG_DEFLECTION_BONUS] bonuses, and ~luck~[TAG_MODIFIER_LUCK] bonuses, still apply. TAG_SPELLS_FIRE_SHURIKEN TAG_SPELLS TAG_ASSASSIN_2 Fire Shuriken ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION][Fire] Level: ~Assassin~[TAG_ASSASSINS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 0 ft. Effect: One magical shuriken/3 levels Duration: Instantaneous With dark intent you complet the quick motions of the spell and find in your hand several shuriken composed of flame. This spell creates ~shuriken~[TAG_WEAPONS_SHURIKEN] formed of magical fire that you can throw as a normal ~ranged attack~[TAG_RANGED_ATTACKS]. You are automatically considered ~proficient~[TAG_WEAPON_SHIELD_PROFICIENCY] with the fire shuriken, which have a range increment of 10 feet, threaten a ~critical hit~[TAG_CRITICAL_HIT] on a roll of 19-20, and deal 3d6 points of fire damage each on a succesful hit (althouch you and your possessions take no damage as the shuriken are thrown). Any additional damage dealt by the fire shuriken (including your Strength bonus and ~sneak attack~[TAG_CLASS_FEATURES_ROGUE_SNEAK_ATTACK] damage) is also fire damage. The suriken disappear when they hit, so they cannot set fire to combustibles or damage objects. You can create one fire shurken per three caster levels, up to a maximum of six at 18th level. +TAG_SPELLS_FIREBURST TAG_SPELLS TAG_SORCERER_2 TAG_WARMAGE_2 TAG_WIZARD_2 Fireburst ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION](Fire) ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2, ~Warmage~[TAG_WARMAGES] 2 Components: V, S, M Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 10 Effect: Burst of fire extending 10 ft. from you Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes With a grand circular gesture the air around you fills with flame. An instant later the fire explodes outward, engulfing everything close to you. Fireburst causes a powerful explosion of flame to burst from you, damaging anyone within 10 feet of you. All creatures and objects within that area, except for you and any creatures or objects that share your space, take 1d8 points of fire damage per caster level (maximum 5d8). TAG_SPELLS_FOCUSING_CHANT TAG_SPELLS TAG_BARD_1 Focusing Chant ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT](Compulsion) Level: ~Bard~[TAG_BARDS] 1 Components: V Casting Time: ~Free action~[TAG_FREE_ACTION] Range: Personal Target: You Duration: 1 Minute You chant softly under your breath and concentrate on the sound of your voice. Distractions fade from your consciousness, allowing you to focus on the task at hand. You gain a +1 ~circumstance~[TAG_MODIFIER_CIRCUMSTANCE] bonus on ~attack rolls~[TAG_ATTACK_ROLL], ~skill~[TAG_USING_SKILLS] checks, and ~ability~[TAG_ABILITIES] checks for the duration of the spell. TAG_SPELLS_FOUNDATION_OF_STONE TAG_SPELLS TAG_CLERIC_1 TAG_DRUID_1 Foundation of Stone ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION][Earth] Level: ~Cleric~[TAG_CLERICS] 1, ~Druid~[TAG_DRUIDS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Target: One creature/level Duration: 1 round/level Saving Throw: None Spell Resistance: No Calling upon the strength of the earth, you lend some of the stability of stone to your allies. As long as they do not move and remain standing on solid ground, the subject creatures gain a +2 bonus to ~Armor Class~[TAG_ARMOR_CLASS] and a +4 bonus on ~Strength~[TAG_STRENGTH] checks made to resist being ~bull rushed~[TAG_BULLRUSH] or ~tripped~[TAG_TRIP]. If this spell is cast in mountainous terrain, the bonus on Strength checks granted by this spell increases to +6. Note: The terrain component is not implemented in Temple of Elemental Evil. TAG_SPELLS_FROST_BREATH TAG_SPELLS TAG_CLERIC_2 TAG_DRUID_2 TAG_SORCERER_2 TAG_WIZARD_2 Frost Breath ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION](Cold) Level: ~Cleric~[TAG_CLERICS] 2, ~Druid~[TAG_DRUIDS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 30 ft. Area: Cone-shaped burst Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes Giving a forceful exhale across your cupped hand, your breath shoots forth tinged with frost and crystals of ice. You breathe a cone of intense cold at your foes. The spell deals 1d4 points of cold damage per two caster levels (maximum 5d4). In addition, all creatures damaged by the frost breath that fail their ~Reflex~[TAG_REFLEX] save are ~dazed~[TAG_DAZED] for 1 round by the sudden shock of cold. TAG_SPELLS_FUGUE TAG_SPELLS TAG_BARD_4 Fugue ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] Level: ~Bard~[TAG_BARDS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. +10 ft./level) Area: 30-ft. radius Duration: 1 round/level ~Will~[TAG_WILL] negates; see text Spell Resistance: Yeso Upon completing the spell, a discordant cacophony of haunting and alien music rises up in the area you designate. Although the strange music reaches your ears, you feel no effect from it. Creatures that fail their save become affected by the haunting fugue in semirandom ways. On each affected creature's turn (as long as it remains in the affected area), you make a Perform check. The check result determines how the victim's mind and body are affected by the spell. You can select any of the effects for Which your Perform check equals or exceeds the required DC. DC Result 15 Victim takes 3d6 points of ~nonlethal~[TAG_RADIAL_MENU_NONLETHAL_DAMAGE] damage 20 Victim takes 3d6 points of sonic damage 25 Victim is knocked ~prone~[TAG_PRONE] 30 Victim is ~nauseated~[TAG_NAUSEATED] for 1 round 35 Victim is ~stunned~[TAG_STUNNED] for 1 round 40 Victim attacks nearest target All creatures that succeed on their saves against the spell are disoriented and take a -2 penalty on ~attack rolls~[TAG_ATTACK_ROLL] and ~skill~[TAG_SKILLS] checks as long as they remain in te affected area. TAG_SPELLS_GRACE TAG_SPELLS TAG_BARD_2 TAG_CLERIC_3 Grace ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION][Good] Level: ~Bard~[TAG_BARDS] 2, ~Cleric~[TAG_CLERICS] 3 Components: V Casting Time: 1 ~free action~[TAG_FREE_ACTION] Range: Personal Target: You Duration: 1 round/level With a single word, you call upon the might and grace of your deity, bathing your body with divine energy. Your body glows with silvery light and you feel quick and light on your feet. You create a silvery glow around your body that provides illumination to a radius of 60 feet. You gain a -20 ~circumstance~[TAG_MODIFIER_CIRCUMSTANCE] penalty on ~Hide~[TAG_HIDE] checks made while under the effect of this spell. For the duration of the spell, you gain a +2 ~sacred~[TAG_MODIFIER_SACRED] bonus to ~Dexterity~[TAG_DEXTERITY], and your base land ~speed~[TAG_MOVEMENT_RATE] increases by 10 feet. Your touch attacks and any melee weapons you wield become infused with this power as well. They are treated as good-aligned weapons for the purpose of overcoming ~damage reduction~[TAG_SPECIAL_ABILITIES_DAMAGE_REDUCTION]. TAG_SPELLS_GHOST_TOUCH_ARMOR TAG_SPELLS TAG_CLERIC_2 TAG_SORCERER_2 TAG_WIZARD_2 Ghost Touch Armor ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Cleric~[TAG_CLERICS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Armor touched Duration: 1 minute/level Saving Throw: None Spell Resistance: No Confronted with incorporeal enemies, you give the armor you touch the power to defend against such foes. The subject’s armor gains the ghost touch special ability (Both its enhancement bonus and its armor bonus count against the attacks of incorporeal creatures and can be worn by incorpereal creatures). Note: Spell is currently non functional :( +TAG_SPELLS_GREATER_FIREBURST TAG_SPELLS TAG_SORCERER_5 TAG_WARMAGE_5 TAG_WIZARD_5 Greater Fireburst ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION](Fire) ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 5, ~Warmage~[TAG_WARMAGES] 5 Components: V, S, M Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 15 Effect: Burst of fire extending 15 ft. from you Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes With a grand circular gesture the air around you fills with flame. An instant later the fire explodes outward, engulfing everything close to you. This spell functions like ~Fireburst~[TAG_SPELLS_FIREBURST], except that it affects creatures within 15 feet of you and deals 1d10 points of fire damage per caster level (maximum 15d10). +TAG_SPELLS_HAIL_OF_STONE TAG_SPELLS TAG_SORCERER_1 TAG_WARMAGE_1 TAG_WIZARD_1 Hail of Stone ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Earth] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 1 Components: V, S, M Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Area: 5-ft. radius Duration: Instantaneous Saving Throw: None Spell Resistance: No You hold the jade chip before you and blow on it as you end the spell. The chip flares with a green flame and vanishes as rocks begin to fall on your pursuers. You create a rain of stones that deals 1d4 points of damage per caster level (maximum 5d4) to creatures and objects within the area. TAG_SPELLS_HAND_OF_DIVINITY TAG_SPELLS TAG_BLACKGUARD_2 TAG_CLERIC_2 TAG_PALADIN_2 Hand of Divinity ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] Level: ~Blackguard~[TAG_BLACKGUARDS] 2, ~Cleric~[TAG_CLERICS] 2, ~Paladin~[TAG_PALADINS] Components: V, S Casting Time: ~Full Round~[TAG_FULL_ROUND_ACTION] Range: Touch Target: Creature touched Duration: 1 minute/level You call upon your beliefs and a great pair of hands appears around your target, cradling it in its power. The effect fades, but your target briefly glows with a healthy orange nimbus. If your deity is non-evil, this spell grants a +2 ~sacred~[TAG_MODIFIER_SACRED] bonus on ~saving throws~[TAG_SAVING_THROW_DESC], and the spell is a good spell. If your deity is evil, this spell grants a +2 ~profane~[TAG_MODIFIER_PROFANE] bonus on saving throws, and the spell is an evil spell. This spell works only on a creature with the same ~deity~[TAG_RELIGION] as you or the same ~alignment~[TAG_ALIGNMENT] as your deity. If cast on a target that does not meet this criteria, the spell has no effect. TAG_SPELLS_HARMONIC_CHORUS TAG_SPELLS TAG_BARD_2 Harmonic Chorus ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT] Level: ~Bard~[TAG_BARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./ 2 levels) Target: One Creature Duration: 1 round/level Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes Sweeping your arm as if presenting a gift to someone, you call out to the intended subject of your spell. A mantle of sweet tones settles about your subject, whose face is now twisted in concentration. Harmonic chorus lets you improve the spellcasting ability of another spellcaster. For the duration of the spell, the subject gains a +2 ~morale~[TAG_MODIFIER_MORALE] bonus to caster level and a +2 morale bonus on all spell DCs it casts. TAG_SPELLS_HAUNTING_TUNE TAG_SPELLS TAG_BARD_3 Haunting Tune ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT](Compulsion)[Fear][Mind-Affecting][Sonic] Level: ~Bard~[TAG_BARDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. +10 ft./level) Target: One creature/level Duration: 10 minutes/level Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes The spell wrapped within your music makes even the most hard-hearted quail. Targets that fail their saves become ~shaken~[TAG_SHAKEN]. TAG_SPELLS_HEART_RIPPER TAG_SPELLS TAG_ASSASSIN_4 Heart Ripper ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY][Death] Level: ~Assassin~[TAG_ASSASSINS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./ 2 levels) Target: One living creature Duration: Instantaneous; see text Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates Spell Resistance: Yes With a sweep of your hand, invisible magic slams into your target. With a bloody pop and squelch, the heart of your target bursts out its back, dropping the creature like a discarded rag doll. Invisible bolts of force instantly slay the target you designate by driving its heart from its body unless it succeeds on a Fortitude save. If the target has HD higher than your caster level, it does not die on a failed saving throw, but instead is stunned for 1d4 rounds. Creatures that don't depend on their hearts for survival, creatures with no anatomy, and creatures immune to extra damage from critical hits are unaffected by the spell. TAG_SPELLS_HERALDS_CALL TAG_SPELLS TAG_BARD_1 Herald's Call ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT](Compulsion)[Mind-Affecting][Sonic] ~Bard~[TAG_BARDS] 1 Components: V, S Casting Time: ~Free action~[TAG_FREE_ACTION] Range: 20 ft. Area: 20 ft. radius burst centered on you Duration: 1 round By placing your hand to your mouth and calling out, you gain the attention of creatures around you. For a moment, all eyes snap to you. Some creatures seem reluctant or unable to pull their eyes away. Any creature with 5 ~Hit Dice~[TAG_HIT_DICE] or less is ~slowed~[TAG_SPELLS_SLOW] for 1 round. Creatures beyond the radius of the burst might hear the shout, but they are not slowed. TAG_SPELLS_HOLY_STORM TAG_SPELLS TAG_CLERIC_3 TAG_PALADIN_3 Holy Storm ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Good][Water] Level: ~Cleric~[TAG_CLERICS] 3, ~Paladin~[TAG_PALADINS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Area: 20-ft. radius Duration: 1 round/level Saving Throw: None Spell Resistance: No You call upon the forces of good, and a heavy rain begins to fall around you, its raindrops soft and warm. A driving rain falls around you. It falls in a fixed area once created. The storm reduces hearing and visibility, resulting in a -4 penalty on ~Listen~[TAG_LISTEN], ~Spot~[TAG_SPOT], and ~Search~[TAG_SEARCH] checks. It also applies a -4 penalty on ~ranged~[TAG_RANGED_ATTACKS] attacks made into, out of, or through the storm. Finally, it automatically extinguishes any unprotected flames and has a 50% chance to extinguish protected flames (such as those of lanterns). The rain damages evil creatures, dealing 2d6 points of damage per round (evil outsiders take double damage) at the beginning of your turn. +TAG_SPELLS_HUNTER'S_EYE TAG_SPELLS TAG_RANGER_2 Hunter's Eye ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Ranger~[TAG_RANGERS] 2 Components: V, S Casting Time: ~Swift Action~[TAG_SWIFT_ACTION] Range: Personal Target: You Duration: 1 round Your vision blurs for a moment. When it clears, you can see through your enemies' skin to spot their arteries, organs, and other vulnerable points. Your slice into a foe with uncanny precision, allowing you to strike a foe's vulnerable points and deal extra damage. This spell grants you the ~sneak attack ability~[TAG_CLASS_FEATURES_ROGUE_SNEAK_ATTACK]. You deal an extra 1d6 points of damage per three caster levels. If you already have the sneak attack ability, this damage stacks with it. +TAG_SPELLS_ICELANCE TAG_SPELLS TAG_DRUID_3 TAG_SORCERER_3 TAG_WIZARD_3 Icelance ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION][Creation] Level: ~Druid~[TAG_DRUIDS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Components: V, S, F Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. +10 ft./level) Target: One creature Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] partial (see text) Spell Resistance: Yes You clutch the quartz in your hand, focusing the energy of the spell into a sharp spear. With a thought, you send it whistling through the air at your foe. You must succeed on a ~normal ranged attack~[TAG_RANGED_ATTACKS] to strike a target with an icelance. You gain a +4 bonus on your attack roll. If you hit, the icelance deals 3d6 points of cold damage and 3d6 of piercing damage to the target. In addition, the target must make a ~Fortitude save~[TAG_FORTITUDE] or be ~stunned~[TAG_STUNNED] for 1d4 rounds. Regardless of the result of the attack, the icelance shatters upon its first use. TAG_SPELLS_IMPROVISATION TAG_SPELLS TAG_BARD_1 Improvisation ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Bard~[TAG_BARDS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 round/level With an elaborate flourish and call for luck, you toss the dice in your hand into the air. Immediately you feel as though fate favors you, filling you with confidence. You gain access to a floating "pool" of luck, which manifests as bonus points you can use as desired to improve your odds of success at various tasks. This bonus pool consists of 2 points per caster level, which you can spend as you like to improve ~attack rolls~[TAG_ATTACK_ROLL], ~skill checks~[TAG_USING_SKILLS], and ~ability checks~[TAG_ABILITIES], although no single check can receive a bonus greater than one-half your caster level. You must declare any bonus point usage before the appropriate roll is made. Used points disappear from the pool, and any points remaining when the spell ends are wasted. These points count as ~luck~[TAG_MODIFIER_LUCK] bonuses for the purpose of stacking. TAG_SPELLS_INSIDIOUS_RHYTHM TAG_SPELLS TAG_BARD_1 Insidious Rhythm ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT](Compulsion)[Mind-Affecting] Level: ~Bard~[TAG_BARDS] 1 Components: V, S Casting Time: ~Free action~[TAG_FREE_ACTION] Range: Medium (100 ft. + 10 ft./level) Target: One Creature Duration: 1 minute/level Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes You recite a foolhardy ditty, tapping your foot in time. With a wink and a grin you mark your target, who shortly thereafter follows suit. The subject takes a -4 penalty on Intelligence-based skill checks and Concentration checks due to an endlessly recycling melody stuck in its mind. Whenever the subject attempts to cast, concentrate on, or direct a spell, it must succeed on a ~Concentration~[TAG_CONCENTRATION] check (DC equal to insidious rhythm's save DC + spell's level) or fail at the attempt. TAG_SPELLS_INSIGHTFUL_FEINT TAG_SPELLS TAG_ASSASSIN_1 TAG_SORCERER_1 TAG_WIZARD_1 Insightful Feint ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Assassin~[TAG_ASSASSINS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V, Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Range: Personal Target: You Duration: 1 round With a chuckle you whisper the words that will make your ruse more effective. You gain a +10 ~insight~[TAG_MODIFIER_INSIGHT] bonus on the next single ~Bluff~[TAG_BLUFF] check that you make to ~feint~[TAG_FEINT] in combat (if it is made before the start of your next turn). You can make the feint as a ~move action~[TAG_MOVEMENT_ACTION], or once as a ~free action~[TAG_FREE_ACTION] if you have the ~Improved Feint~[TAG_IMPROVED_FEINT] feat. @@ -69,26 +78,38 @@ TAG_SPELLS_IRON_SILENCE TAG_SPELLS TAG_ASSASSIN_2 TAG_BARD_2 TAG_CLERIC_2 Iron TAG_SPELLS_IRONGUTS TAG_SPELLS TAG_BARD_1 TAG_CLERIC_1 TAG_SORCERER_1 TAG_WIZARD_1 Ironguts ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Bard~[TAG_BARDS] 1, ~Cleric~[TAG_CLERICS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 10 minutes/level Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes The subject is filled with antitoxin and gains a +5 ~alchemical~[TAG_MODIFIER_ALCHEMICAL] bonus on ~Fortitude~[TAG_FORTITUDE] saves against all kinds of ~poisons~[TAG_POISON], whether injury, contact, ingestion, or inhalation. After the spell ends, the subject is ~nauseated~[TAG_NAUSEATED] for 1 round. TAG_SPELLS_IRONTHUNDER_HORN TAG_SPELLS TAG_BARD_1, TAG_SORCERER_2 TAG_WIZARD_2 Ironthunder Horn ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION](Sonic) Level: ~Bard~[TAG_BARDS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 30 ft. Area: Cone-shaped burst Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] negates Spell Resistance: Yes The last words of your spell boom out with a thundering roar, knocking the foes in your path off their feet. You create a deep resonant vibration that can shake creatures off their feet. Creatures in the area must succeed on a ~Reflex~[TAG_REFLEX] saving throw or fall ~prone~[TAG_PRONE]. TAG_SPELLS_LAWFUL_SWORD TAG_SPELLS TAG_PALADIN_4 Lawful Sword ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION](Lawful) Level: ~Paladin~[TAG_PALADINS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: Weapon touched Duration: 1 round/level Calling to mind thoughts of justice, you run your fingers along the weapon, imbuing it with power. This spell functions like holy sword (PH242), except as follows. The weapon functions as a +5 axiomatic weapon (+5 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus on ~attack rolls~[TAG_ATTACK_ROLL] and damage rolls, lawful-aligned, deals an extra 2d6 points of damage against chaotic opponents). It also emits a magic circle against chaos effect (as the spell). +TAG_SPELLS_LESSER_ORB_OF_ACID TAG_SPELLS TAG_SORCERER_1 TAG_WIZARD_1 TAG_WARMAGE_1 Lesser Orb of Acid ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Acid] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. +5 ft./2 levels) Target: One creature Duration: Instantaneous Saving Throw: None Spell Resistance: No Your quick, precise movements culminate in your open palm facing your target. An orb of dark green acid flies from your hand. An orb of acid about 2 inches across shoots from your palm at its target, dealing 1d8 points of acid damage. You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] to hit your target. For every two caster levels beyond 1st, your orb deals an additional 1d8 points of damage: 2d8 at 3rd level, 3d8 at 5th level, 4d8 at 7th level, and the maximum of 5d8 at 9th level or higher. +TAG_SPELLS_LESSER_ORB_OF_COLD TAG_SPELLS TAG_SORCERER_1 TAG_WIZARD_1 TAG_WARMAGE_1 Lesser Orb of Cold ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Cold] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. +5 ft./2 levels) Target: One creature Duration: Instantaneous Saving Throw: None Spell Resistance: No An orb of cold about 2 inches across shoots from your palm at its target, dealing 1d8 points of cold damage. You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] to hit your target. For every two caster levels beyond 1st, your orb deals an additional 1d8 points of damage: 2d8 at 3rd level, 3d8 at 5th level, 4d8 at 7th level, and the maximum of 5d8 at 9th level or higher. +TAG_SPELLS_LESSER_ORB_OF_ELECTRICITY TAG_SPELLS TAG_SORCERER_1 TAG_WIZARD_1 TAG_WARMAGE_1 Lesser Orb of Electricity ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Electricity] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. +5 ft./2 levels) Target: One creature Duration: Instantaneous Saving Throw: None Spell Resistance: No An orb of electricity about 2 inches across shoots from your palm at its target, dealing 1d8 points of electricity damage. You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] to hit your target. For every two caster levels beyond 1st, your orb deals an additional 1d8 points of damage: 2d8 at 3rd level, 3d8 at 5th level, 4d8 at 7th level, and the maximum of 5d8 at 9th level or higher. +TAG_SPELLS_LESSER_ORB_OF_FIRE TAG_SPELLS TAG_SORCERER_1 TAG_WIZARD_1 TAG_WARMAGE_1 Lesser Orb of Fire ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Fire] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. +5 ft./2 levels) Target: One creature Duration: Instantaneous Saving Throw: None Spell Resistance: No An orb of fire about 2 inches across shoots from your palm at its target, dealing 1d8 points of fire damage. You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] to hit your target. For every two caster levels beyond 1st, your orb deals an additional 1d8 points of damage: 2d8 at 3rd level, 3d8 at 5th level, 4d8 at 7th level, and the maximum of 5d8 at 9th level or higher. +TAG_SPELLS_LESSER_ORB_OF_SOUND TAG_SPELLS TAG_SORCERER_1 TAG_WIZARD_1 TAG_WARMAGE_1 Lesser Orb of Sound ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Sonic] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1, ~Warmage~[TAG_WARMAGES] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. +5 ft./2 levels) Target: One creature Duration: Instantaneous Saving Throw: None Spell Resistance: No An orb of sound about 2 inches across shoots from your palm at its target, dealing 1d8 points of sonic damage. You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] to hit your target. For every two caster levels beyond 1st, your orb deals an additional 1d8 points of damage: 2d8 at 3rd level, 3d8 at 5th level, 4d8 at 7th level, and the maximum of 5d8 at 9th level or higher. TAG_SPELLS_LIGHTFOOT TAG_SPELLS TAG_ASSASSIN_1, TAG_RANGER_1 Lightfoot ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Assassin~[TAG_ASSASSINS] 1, ~Ranger~[TAG_RANGERS] 1 Components: V, S Casting Time: ~Free action~[TAG_FREE_ACTION] Range: Personal Target: You Duration: 1 round You mutter the words of this short spell and dive down the hallway, dancing between the armed guards and out the gate. You provoke no ~attacks of opportunity~[TAG_AOO] when ~moving~[TAG_MOVEMENT_ACTION]. -TAG_SPELLS_LOVES_LAMENT TAG_SPELLS TAG_BARD_3 Love's Lament ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT](Compulsion)[Mind-Affecting] Level: ~Bard~[TAG_BARDS] 3 Components: V Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 60 ft. Area: Cone-shaped burst Duration: Instantaneous (see text) Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes Dirgelike music fills the area, reminding those in range of lost loves and life's disappointments. Creatures within the area of this spell that fail their saves take 1d6 points of ~Wisdom~[TAG_WISDOM] damage and are ~nauseated~[TAG_NAUSEATED] for 1d4 rounds. +TAG_SPELLS_LOVE'S_LAMENT TAG_SPELLS TAG_BARD_3 Love's Lament ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT](Compulsion)[Mind-Affecting] Level: ~Bard~[TAG_BARDS] 3 Components: V Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 60 ft. Area: Cone-shaped burst Duration: Instantaneous (see text) Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes Dirgelike music fills the area, reminding those in range of lost loves and life's disappointments. Creatures within the area of this spell that fail their saves take 1d6 points of ~Wisdom~[TAG_WISDOM] damage and are ~nauseated~[TAG_NAUSEATED] for 1d4 rounds. TAG_SPELLS_MASTERS_GIFT TAG_SPELLS TAG_BARD_1 TAG_SORCERER_1 TAG_WIZARD_1 Master's Gift ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Bard~[TAG_BARDS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V Casting Time: ~Free action~[TAG_FREE_ACTION] Range: Personal Target: You Duration: 1 minute/level Holding aloft an item you wish to use effectively, you address it directly with a command to obey your desire to wield it. You gain ~proficiency~[TAG_WEAPON_SHIELD_PROFICIENCY] with a single weapon or shield you hold in your hands when the spell is cast. The lack of a somatic component means the spell can be cast in the middle of a fight while you keep ready whatever items stand between you and danger. Note: In Temple of Elemental Evil, the spell does not grant proficieny but cancels out the penalty and you cannot have multiple Master's Gift at once. TAG_SPELLS_NAUSEATING_BREATH TAG_SPELLS TAG_CLERIC_3 TAG_SORCERER_3 TAG_WIZARD_3 Nauseating Breath ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION] Level: ~Cleric~[TAG_CLERICS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 30 ft. Area: Cone-shaped burst Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates Spell Resistance: No You windmill your arm to complete the spell and nearly gag before exhaling a great gout of putrid-smelling green gas. You breathe out a cone of nauseating vapors. Any creature in the area must succeed on a ~Fortitude~[TAG_FORTITUDE] save or be ~nauseated~[TAG_NAUSEATED] for 1d6 rounds. TAG_SPELLS_NIGHTSHIELD TAG_SPELLS TAG_CLERIC_1 TAG_SORCERER_1 TAG_WIZARD_1 Nightshiled ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Cleric~[TAG_CLERICS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 minute/level Saving Throw: None Spell Resistance: No With a whisper-quiet whoosh, a field of shadowy energy cloaks your body. This spell provides a +1 ~resistance bonus~[TAG_MODIFIER_RESISTANCE] on ~saving throws~[TAG_SAVING_THROW_DESC]; this resistance bonus increases to +2 at caster level 6th and +3 at caster level 9th. In addition, the spell negates ~magic missile~[TAG_SPELLS_MAGIC_MISSILE] attacks directed at you. TAG_SPELLS_NIMBUS_OF_LIGHT TAG_SPELLS TAG_CLERIC_1 Nimbus of Light ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION](Light) Level: ~Cleric~[TAG_CLERICS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 minutes/level Saving Throw: None Spell Resistance: No A glittering corona of sunlight surrounds your body at a few inches distance - until you release it as a focused blast of divine energy. The nimbus of light around you glows like a lantern, providing bright illumination in a 30-foot radius (and shadowy illumination for an additional 30 feet) from you. As a ~move~[TAG_MOVEMENT_ACTION] action, you can coalesce the energy from a nimbus of light around your outstretched arm, and then as a ~standard~[TAG_STANDARD_ACTION] action fling it toward a foe within 30 feet. You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] with the energy to strike a target. A nimbus of light deals 1d8 points of damage +1 point per round that has elapsed since you cast the spell (maximum 1d8 + caster level). Attacking with a nimbus of light ends the spell, whether your ranged touch attack is successful or not. Note: The lantern light part of the spell is not implemented at the moment. Due to this the movement action to focus the light on your arm is omitted. -TAG_SPELLS_NIXIES_GRACE TAG_SPELLS TAG_BARD_6 Nixie's Grace ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION][Water] Level: ~Bard~[TAG_BARDS] 6 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 10 minutes/level You feel a longing for cool waters, and a forceful confidence manifests within you. Your movements and thoughts become filled with grace. This potent spell infuses you with powerful fey magic, granting you many of the traits and abilities of a nixie (MM 235). Upon casting this spell, you gain a swim speed of 30 feet. You can breathe underwater, and you gain low-light vision and ~damage reduction~[TAG_SPECIAL_ABILITIES_DAMAGE_REDUCTION] 5/cold iron. You also gain a +6 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus to ~Dexterity~[TAG_DEXTERITY], a +2 enhancement bonus to ~Wisdom~[TAG_WISDOM], and a +8 enhancement bonus to ~Charisma~[TAG_CHARISMA]. Note: The underwater part is not applicable in Temple of Elemental Evil. +TAG_SPELLS_NIXIE'S_GRACE TAG_SPELLS TAG_BARD_6 Nixie's Grace ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION][Water] Level: ~Bard~[TAG_BARDS] 6 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 10 minutes/level You feel a longing for cool waters, and a forceful confidence manifests within you. Your movements and thoughts become filled with grace. This potent spell infuses you with powerful fey magic, granting you many of the traits and abilities of a nixie (MM 235). Upon casting this spell, you gain a swim speed of 30 feet. You can breathe underwater, and you gain low-light vision and ~damage reduction~[TAG_SPECIAL_ABILITIES_DAMAGE_REDUCTION] 5/cold iron. You also gain a +6 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus to ~Dexterity~[TAG_DEXTERITY], a +2 enhancement bonus to ~Wisdom~[TAG_WISDOM], and a +8 enhancement bonus to ~Charisma~[TAG_CHARISMA]. Note: The underwater part is not applicable in Temple of Elemental Evil. +TAG_SPELLS_ORB_OF_ACID TAG_SPELLS TAG_SORCERER_4 TAG_WIZARD_4 TAG_WARMAGE_4 Orb of Acid ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Acid] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Warmage~[TAG_WARMAGES] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. +5 ft./2 levels) Target: One creature Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] partial; see text Spell Resistance: No An orb of acid about 3 inches across shoots from your palm at its target, dealing 1d6 points of acid damage per caster level (maximum 15d6). You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] to hit your target. A creature struck by the orb takes damage and becomes ~sickened~[TAG_SICKENED] by the acid's noxious fumes for 1 round. A successful ~Fortitude save~[TAG_FORTITUDE] negates the sickened effect but does not reduce the damage. +TAG_SPELLS_ORB_OF_COLD TAG_SPELLS TAG_SORCERER_4 TAG_WIZARD_4 TAG_WARMAGE_4 Orb of Cold ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Cold] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Warmage~[TAG_WARMAGES] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. +5 ft./2 levels) Target: One creature Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] partial; see text Spell Resistance: No An orb of cold about 3 inches across shoots from your palm at its target, dealing 1d6 points of cold damage per caster level (maximum 15d6). You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] to hit your target. In addition, a creature struck by an orb of cold must make a ~Fortitude save~[TAG_FORTITUDE] or be ~blinded~[TAG_BLINDED] for 1 round. +TAG_SPELLS_ORB_OF_ELECTRICITY TAG_SPELLS TAG_SORCERER_4 TAG_WIZARD_4 TAG_WARMAGE_4 Orb of Electricity ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Electricity] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Warmage~[TAG_WARMAGES] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. +5 ft./2 levels) Target: One creature Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] partial; see text Spell Resistance: No An orb of electricity about 3 inches across shoots from your palm at its target, dealing 1d6 points of electricity damage per caster level (maximum 15d6). You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] to hit your target. In addition, a creature wearing metal armor struck by an orb of electricity must make a ~Fortitude save~[TAG_FORTITUDE] or be ~entangled~[TAG_ENTANGLED] for 1 round. +TAG_SPELLS_ORB_OF_FIRE TAG_SPELLS TAG_SORCERER_4 TAG_WIZARD_4 TAG_WARMAGE_4 Orb of Fire ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Fire] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Warmage~[TAG_WARMAGES] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. +5 ft./2 levels) Target: One creature Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] partial; see text Spell Resistance: No An orb of fire about 3 inches across shoots from your palm at its target, dealing 1d6 points of fire damage per caster level (maximum 15d6). You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] to hit your target. In addition, a creature struck by an orb of fire must make a ~Fortitude save~[TAG_FORTITUDE] or be ~dazed~[TAG_DAZED] for 1 round. +TAG_SPELLS_ORB_OF_SOUND TAG_SPELLS TAG_SORCERER_4 TAG_WIZARD_4 TAG_WARMAGE_4 Orb of Sound ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Sound] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4, ~Warmage~[TAG_WARMAGES] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. +5 ft./2 levels) Target: One creature Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] partial; see text Spell Resistance: No An orb of sound about 3 inches across shoots from your palm at its target, dealing 1d6 points of sonic damage per caster level (maximum 15d6). You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] to hit your target. In addition, a creature struck by an orb of sound must make a ~Fortitude save~[TAG_FORTITUDE] or be ~deafened~[TAG_DEAFENED] for 1 round. TAG_SPELLS_PHANTOM_FOE TAG_SPELLS TAG_ASSASSIN_2 TAG_SORCERER_2 TAG_WIZARD_2 Phantom Foe ~Illusion~[TAG_MAGIC_SCHOOLS_ILLUSION](Phantasm)[Mind-Affecting] Level: ~Assassin~[TAG_ASSASSINS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: One Creature Duration: 1 round/level Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: No By waving around a tiny pewter figurine and picturing in your mind the figurine attacking the target creature, you complete the spell. You feel a phantasmal force leap from the figurine toward your target. If the target creature fails its saving throw, this spell creates in the subject's mind an illusory double of whichever creature currently threatens it that it deems most dangerous. The form of this phantom foe changes as appropriate whenever the target perceives a different threatening creature more dangerous than the last. This illusory double provides two effects. First, the subject believes it is being ~flanked~[TAG_FLANKED] by the phantom foe and the real creature the foe duplicates. Thus, the duplicated creature is always considered to be flanking the subject in melee. A creature that can't be flanked is immune to this aspect of the spell. Second, the subject of the spell is unable to determine that the phantom foe is not a real threat, and whenever the subject attempts to attack the creature duplicated by the phantom foe, that creature benefits from a 50% miss chance against attacks from the subject of the spell. Because this miss chance comes from the subject's inability to tell the phantom foe from the original, it is rolled separately from any miss chance that applies due to displacement or concealment. Creatures other than the subject cannot see the phantom foe, although they can attempt to guess its location by how the target acts. If the subject is not threatened by any creature at the start of its turn, the spell ends. TAG_SPELLS_PHANTOM_THREAT TAG_SPELLS TAG_BARD_1 Phantom Threat ~Illusion~[TAG_MAGIC_SCHOOLS_ILLUSION](Phantasm)[Mind-Affecting] Level: ~Bard~[TAG_BARDS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./ 2 levels) Target: One Creature Duration: 1 round/level Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes Reaching out to your foe's mind, you cause him to feel as though a threat looms close behind no matter which way he turns. You create the sensation in the subject's mind that it is threatened by more foes than it actually faces. Though the subject doesn't actually perceive any additional enemies (and thus doesn't waste any attacks on the phantasm), a creature affected by this spell is considered ~flanked~[TAG_FLANKING], even if not threatened by other creatures. No amount of convincing by others can help the subject of this spell avoid its effect-only a successful ~saving throw~[TAG_SAVING_THROW_DESC] against the spell when initially cast can help the target. A creature that can't be flanked is immune to this spell. TAG_SPELLS_RAY_OF_DIZZINESS TAG_SPELLS TAG_BARD_3 Ray of Dizziness ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT](Compulsion)[Mind-Affecting] Level: ~Bard~[TAG_BARDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. +10 ft./level) Effect: Ray Duration: 1 round/level Saving Throw: None Spell Resistance: Yes You release a drab violet ray from your palm. The ray shoots toward your target in a spiraling corkscrew. You strike out at your enemy with a ray that causes intense feelings of vertigo. You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] with the ray to strike a target. A struck subject experiences strong feelings of vertigo and can take only a ~move action~[TAG_MOVEMENT_ACTION] or a ~standard action~[TAG_STANDARD_ACTION] each round (but not both, and it cannot take a ~full-round~[TAG_FULL_ROUND_ACTION] action). TAG_SPELLS_RAY_OF_LIGHT TAG_SPELLS TAG_BARD_6 TAG_SORCERER_6 TAG_WIZARD_6 Ray of Light ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION][Light] Level: ~Bard~[TAG_BARDS] 6, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 6 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. +5 ft./2 levels) Effect: Ray Duration: Instantaneous Saving Throw: None Spell Resistance: Yes Your palm emits a ray of light. The ray gives off a soft, continuous glow. You direct a short ray at the eyes of a target. You must succeed on a ranged touch attack with the ray to strike a target. With a successful ranged touch attack, the subject is ~blinded~[TAG_BLINDED] for 1d4 rounds. TAG_SPELLS_RESIST_ENERGY_MASS TAG_SPELLS TAG_CLERIC_3 TAG_DRUID_3 TAG_SORCERER_4 TAG_WIZARD_4 Resist Energy, Mass ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Cleric~[TAG_CLERICS] 3, ~Druid~[TAG_DRUIDS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Targets: One creature/level, no two of which are more than 30 ft. apart Duration: 10 minutes/level Saving Throw: None Spell Resistance: No You call upon the protective energies of magical power, surrounding your subjects in temporarily visible fields of energy. Although the fields fade from view, you can still just barely sense their existence. This spell functions like ~resist energy~[TAG_SPELLS_RESIST_ENERGY], except that it affects all targeted creatures. -TAG_SPELLS_RESISTANCE_GREATER TAG_SPELLS TAG_BARD_4 TAG_CLERIC_4 TAG_DRUID_4 TAG_SORCERER_4 TAG_WIZARD_4 Resistance, Greater ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Bard~[TAG_BARDS] 4, ~Cleric~[TAG_CLERICS] 4, ~Druid~[TAG_DRUIDS] 4, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 24 hours Saving Throw: None Spell Resistance: No Just as you touch the spell's subject, a feeling of peace and watchful guardianship fills your being. This spell functions like ~resistance~[TAG_SPELLS_RESISTANCE], except as noted here. You grant the subject a +3 resistance bonus on saves. -TAG_SPELLS_RESISTANCE_SUPERIOR TAG_SPELLS TAG_BARD_6 TAG_CLERIC_6 TAG_DRUID_6 TAG_SORCERER_6 TAG_WIZARD_6 Resistance, Superior ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Bard~[TAG_BARDS] 6, ~Cleric~[TAG_CLERICS] 6, ~Druid~[TAG_DRUIDS] 6, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 6 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 24 hours Saving Throw: None Spell Resistance: No As you finish casting the spell, you feel imbued with the feeling that something greater than yourself is protecting you. When you touch your intended subject and release the spell, the feeling disappears. This spell functions like ~resistance~[TAG_SPELLS_RESISTANCE], except as noted here. You grant the subject a +6 resistance bonus on saves. +TAG_SPELLS_RESISTANCE,_GREATER TAG_SPELLS TAG_BARD_4 TAG_CLERIC_4 TAG_DRUID_4 TAG_SORCERER_4 TAG_WIZARD_4 Resistance, Greater ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Bard~[TAG_BARDS] 4, ~Cleric~[TAG_CLERICS] 4, ~Druid~[TAG_DRUIDS] 4, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 24 hours Saving Throw: None Spell Resistance: No Just as you touch the spell's subject, a feeling of peace and watchful guardianship fills your being. This spell functions like ~resistance~[TAG_SPELLS_RESISTANCE], except as noted here. You grant the subject a +3 resistance bonus on saves. +TAG_SPELLS_RESISTANCE,_SUPERIOR TAG_SPELLS TAG_BARD_6 TAG_CLERIC_6 TAG_DRUID_6 TAG_SORCERER_6 TAG_WIZARD_6 Resistance, Superior ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Bard~[TAG_BARDS] 6, ~Cleric~[TAG_CLERICS] 6, ~Druid~[TAG_DRUIDS] 6, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 6 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 24 hours Saving Throw: None Spell Resistance: No As you finish casting the spell, you feel imbued with the feeling that something greater than yourself is protecting you. When you touch your intended subject and release the spell, the feeling disappears. This spell functions like ~resistance~[TAG_SPELLS_RESISTANCE], except as noted here. You grant the subject a +6 resistance bonus on saves. TAG_SPELLS_RESONATING_BOLT TAG_SPELLS TAG_BARD_4 TAG_SORCERER_3 TAG_WIZARD_3 Resonating Bolt ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION][Sonic] Level: ~Bard~[TAG_BARDS] 4, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 60 ft. 60-ft. line Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes Your quick movements and rapid utterances release the spell's energy, culminating in a final cry that unleashes a tremendous bolt of sonic energy from your open hand. The bolt of sonic energy deals 1d4 points of sonic damage per caster level (maximum 10d4) to each creature within its area. In addition, a resonating bolt deals full damage to objects and can easily shatter or break interposing barriers. If the bolt destroys a barrier, it can continue beyond the barrier if its range permits; otherwise, it stops. +TAG_SPELLS_REVIVIFY TAG_SPELLS TAG_CLERIC_5 Revivify ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION][Healing] Level: ~Cleric~[TAG_CLERICS] 5 Components: V, S, M Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. +10 ft./level) Target: Dead creature touched Duration: Instantaneous Saving Throw: None Spell Resistance: No The diamonds vaporize from your hand as you cast this spell, and the vapors they give off wrap around your fallen companion, dragging her soul back into her mortal form. Revivify miraculously restores life to a recently deceased creature. However, the spell must be cast within 1 round of the victim’s death. Before the soul of the deceased has completely left the body, this spell halts its journey while repairing somewhat the damage to the body. This spell functions like ~Raise Dead~[TAG_SPELLS_RAISE_DEAD], except that the raised creature receives no level loss, no Constitution loss, and no loss of spells. The creature has -1 hit points (but is stable). Material Component: Diamonds worth at least 1,000 gp. +TAG_SPELLS_RHINO'S_RUSH TAG_SPELLS TAG_PALADIN_1 TAG_RANGER_1 Rhino's Rush ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Paladin~[TAG_PALADINS] 1, ~Ranger~[TAG_RANGERS] 1 Components: V, S Casting Time:~Swift action~[TAG_SWIFT_ACTION] Range: Personal Target: You Duration: 1 round A violent fury consumes you. You seek nothing more than to charge at your enemies and bash in their heads. This spell allows you to propel yourself in a single deadly charge. The first ~charge attack~[TAG_CHARGE] you make before the end of the round deals double damage on a successful hit. TAG_SPELLS_RIGHTEOUS_FURY TAG_SPELLS TAG_PALADIN_3 Righteous Fury ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Paladin~[TAG_PALADINS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 minute/level Saving Throw: None Spell Resistance: No You pull a holy aura about you that glows a golden red. Summoning the power of your deity, you charge yourself with positive energy. This gives you 5 ~temporary hit points~[TAG_TEMPORARY_HIT_POINTS] per caster level (maximum 50) and a +4 ~sacred~[TAG_MODIFIER_SACRED] bonus to ~Strength~[TAG_STRENGTH]. These temporary hit points last for up to 1 hour. TAG_SPELLS_SERENE_VISAGE TAG_SPELLS TAG_BARD_1 TAG_SORCERER_1 TAG_WIZARD_1 Serene Visage ~Illusion~[TAG_MAGIC_SCHOOLS_ILLUSION](Glamer) Level: ~Bard~[TAG_BARDS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 minute/level By casting this spell, you imbue yourself with an ephemeral quality that induces others to trust what you say. Simple illusions aid your attempts to be persuasive. You gain an ~insight~[TAG_MODIFIER_INSIGHT] bonus equal to one half your caster level (maximum +10) on ~Bluff~[TAG_BLUFF] checks. TAG_SPELLS_SHIELD_OF_WARDING TAG_SPELLS TAG_CLERIC_3 TAG_PALADIN_2 Shield of Warding ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION][Good] Level: ~Cleric~[TAG_CLERICS] 3, ~Paladin~[TAG_PALADINS] 2 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Shield touched Duration: 1 minute/level Saving Throw: None Spell Resistance: No You press your palm against the shield and speak the words of power. A silver radiance, in the shape of your holy symbol spreads over the shield. The touched shield or buckler grants its wielder a +1 ~sacred~[TAG_MODIFIER_SACRED] bonus to ~Armor Class~[TAG_ARMOR_CLASS] and on ~Reflex~[TAG_REFLEX] saves, +1 per five caster levels (maximum +5 at 20thlevel). The bonus applies only when the shield is worn or carried normally (but not, for instance, if it is slung over the shoulder). TAG_SPELLS_SHOCK_AND_AWE TAG_SPELLS TAG_ASSASSIN_1 TAG_BARD_1 TAG_SORCERER_1 TAG_WIZARD_1 Shock and Awe ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT][Mind-Affecting] Level: ~Assassin~[TAG_ASSASSINS] 1, ~Bard~[TAG_BARDS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V, S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Range: Close (25 ft. + 5 ft./ 2 levels) Target: One creature/level Duration: 1 round Upon completing this spell, you feel a nagging compulsion to divert your attention from your enemies. Shaking off the feeling, you note with satisfaction that your targeted enemies seem even more distracted than you. This spell distracts its targets, preventing them from reacting with the deftness they might otherwise possess. Only effective when cast in the ~surprise~[TAG_SURPRISE] round of combat and against ~flat-footed~[TAG_FLAT_FOOTED] creatures, this spell causes those it affects to take a -10 penalty on their next ~initiative~[TAG_INITIATIVE] check. Targets that cannot be caught flat-footed (such as a rogue with ~uncanny dodge~[TAG_CLASS_FEATURES_UNCANNY_DODGE]) cannot be affected by this spell. -TAG_SPELLS_SIRINES_GRACE TAG_SPELLS TAG_BARD_4 TAG_DRUID_5 Sirine's Grace ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] Level: ~Bard~[TAG_BARDS] 4, ~Druid~[TAG_DRUIDS] 5 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 round/level Upon completion of this spell, you are infused with unearthly grace and confidence. For the duration of this spell, you gain a +4 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus to ~Charisma~[TAG_CHARISMA] and ~Dexterity~[TAG_DEXTERITY], a ~deflection~[TAG_DEFLECTION_BONUS] bonus to ~AC~[TAG_ARMOR_CLASS] equal to your ~Charisma modifier~[TAG_ABILITY_SCORES], and a +8 bonus on ~Perform~[TAG_PERFORM] checks. You also gain a swim speed of 60 feet and the ability to breathe water. You can move and attack normally while underwater, even with slashing or bludgeoning weapons. Note: The underwater parts are not applicable to TOEE and due to this not implemented. +TAG_SPELLS_SIRINE'S_GRACE TAG_SPELLS TAG_BARD_4 TAG_DRUID_5 Sirine's Grace ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] Level: ~Bard~[TAG_BARDS] 4, ~Druid~[TAG_DRUIDS] 5 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 round/level Upon completion of this spell, you are infused with unearthly grace and confidence. For the duration of this spell, you gain a +4 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus to ~Charisma~[TAG_CHARISMA] and ~Dexterity~[TAG_DEXTERITY], a ~deflection~[TAG_DEFLECTION_BONUS] bonus to ~AC~[TAG_ARMOR_CLASS] equal to your ~Charisma modifier~[TAG_ABILITY_SCORES], and a +8 bonus on ~Perform~[TAG_PERFORM] checks. You also gain a swim speed of 60 feet and the ability to breathe water. You can move and attack normally while underwater, even with slashing or bludgeoning weapons. Note: The underwater parts are not applicable to TOEE and due to this not implemented. TAG_SPELLS_SLASHING_DARKNESS TAG_SPELLS TAG_CLERIC_3 Slashing Darkness ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] Level: ~Cleric~[TAG_CLERICS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. + 10 ft./level) Target: One creature Duration: Instantaneous Saving Throw: None Spell Resistance: Yes You complete this spell and a hissing, hurtling ribbon of pure darkness flies from your hand. You must succeed on a ~ranged touch attack~[TAG_TOUCH_ATTACK] with the ray to strike a target. A creature struck by this ray of negative energy takes 1d8 points of damage per two caster levels (maximum 5d8). An undead creature instead heals 1d8 points of damage per two caster levels (maximum 5d8). TAG_SPELLS_SNIPERS_SHOT TAG_SPELLS TAG_ASSASSIN_1, TAG_RANGER_1, TAG_SORCERER_1 TAG_WIZARD_1 Sniper's Shot ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Assassin~[TAG_ASSASSINS] 1, ~Ranger~[TAG_RANGERS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V, S Casting Time: ~Free action~[TAG_FREE_ACTION] Range: Personal Target: You Duration: 1 round While muttering a short chant you focus your awareness, looking only at the areas of your foe that seem most vital to its survival. Your ~ranged attacks~[TAG_RANGED_ATTACKS] made before the start of your next turn can be ~sneak attacks~[TAG_CLASS_FEATURES_ROGUE_SNEAK_ATTACK] regardless of the distance between you and your target. You must still fulfill the other conditions for making a sneak attack against the target. Note: This spell doesn't grant you the ability to make a sneak attack if you don't already have that ability. TAG_SPELLS_SONIC_WEAPON TAG_SPELLS TAG_BARD_1 TAG_SORCERER_1 TAG_WIZARD_1 Sonic Weapon ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Bard~[TAG_BARDS] 1, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 1 Components: V Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Weapon touched Duration: 1 minute/level Holding the weapon to your mouth, you whisper the spell's arcane words, shrouding the weapon in visible sound like a thin sheen of water. While the spell is in effect, the affected weapon deals an extra 1d6 points of sonic damage with each successful attack. The sonic energy does not harm the weapon's wielder. Bows, crossbows, and slings that are affected by this spell bestow the sonic energy upon their ammunition. Note: The ammunition part is not implemented yet. @@ -101,6 +122,8 @@ TAG_SPELLS_SUMMON_UNDEAD_II TAG_SPELLS TAG_BLACKGUARD_2 TAG_CLERIC_2 TAG_SORCER TAG_SPELLS_SUMMON_UNDEAD_III TAG_SPELLS TAG_BLACKGUARD_3 TAG_CLERIC_3 TAG_SORCERER_3 TAG_WIZARD_3 Summon Undead III ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Summoning)[Evil] Level: ~Blackguard~[TAG_BLACKGUARDS] 3, ~Cleric~[TAG_CLERICS] 3, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3 Components: V, S Casting Time: ~Full round action~[TAG_FULL_ROUND_ACTION] Range: Close (25 ft. + 5 ft./ 2 levels) Effect: One or more summoned creatures Duration: 1 round/level Saving Throw: None Spell Resistance: No The undead you summon appear in a burst of smoke and fog. The vapor swiftly dissipates, but you can't shake the impression of screaming faces in the cloud's tendrils. This spell functions like ~summon undead I~[TAG_SPELLS_SUMMON_UNDEAD_I], except that you can summon one undead from the 3rd-level list or two from 2nd-level list or four from the 1st-level list. Possible Summons: 1st Level: Skeleton 2nd Level: Gnoll Skeleton or Zombie 3rd Level: Ghoul or Skeleton Guard TAG_SPELLS_SUMMON_UNDEAD_IV TAG_SPELLS TAG_BLACKGUARD_4 TAG_CLERIC_4 TAG_SORCERER_4 TAG_WIZARD_4 Summon Undead IV ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Summoning)[Evil] Level: ~Blackguard~[TAG_BLACKGUARDS] 4, ~Cleric~[TAG_CLERICS] 4, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 4 Components: V, S Casting Time: ~Full round action~[TAG_FULL_ROUND_ACTION] Range: Close (25 ft. + 5 ft./ 2 levels) Effect: One or more summoned creatures Duration: 1 round/level Saving Throw: None Spell Resistance: No The undead you summon appear in a burst of smoke and fog. The vapor swiftly dissipates, but you can't shake the impression of screaming faces in the cloud's tendrils. This spell functions like ~summon undead I~[TAG_SPELLS_SUMMON_UNDEAD_I], except that you can summon one undead from the 4th-level list or two from 3rd-level list or four of the same kind from a lower level list. Possible Summons: 1st Level: Skeleton 2nd Level: Gnoll Skeleton or Zombie 3rd Level: Ghoul or Skeleton Guard 4th Level: Ghast or Greater Temple Bugbear Zombie TAG_SPELLS_SUMMON_UNDEAD_V TAG_SPELLS TAG_CLERIC_5 TAG_SORCERER_5 TAG_WIZARD_5 Summon Undead V ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Summoning)[Evil] Level: ~Cleric~[TAG_CLERICS] 5, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 5 Components: V, S Casting Time: ~Full round action~[TAG_FULL_ROUND_ACTION] Range: Close (25 ft. + 5 ft./ 2 levels) Effect: One or more summoned creatures Duration: 1 round/level Saving Throw: None Spell Resistance: No The undead you summon appear in a burst of smoke and fog. The vapor swiftly dissipates, but you can't shake the impression of screaming faces in the cloud's tendrils. This spell functions like ~summon undead I~[TAG_SPELLS_SUMMON_UNDEAD_I], except that you can summon one undead from the 5th-level list or two from 4th-level list or four of the same kind from a lower level list. Possible Summons: 1st Level: Skeleton 2nd Level: Gnoll Skeleton or Zombie 3rd Level: Ghoul or Skeleton Guard 4th Level: Ghast or Greater Temple Bugbear Zombie 5th level: Shadow or Wight +TAG_SPELLS_SURE_STRIKE TAG_SPELLS TAG_SORCERER_2 TAG_WIZARD_2 Sure Strike ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 Components: V Casting Time: ~Swift Action~[TAG_SWIFT_ACTION] Range: Personal Target: You Duration: 1 round You gain a fleeting glimpse into the future, enough to guide your impending attack. You cast this spell immediately before you make an ~attack roll~[TAG_ATTACK_ROLL]. You can see into the future for that attack, granting you a +1 ~insight bonus~[TAG_MODIFIER_INSIGHT] per three caster levels on your next attack roll. +TAG_SPELLS_TACTICAL_PRECISION TAG_SPELLS TAG_BARD_2 Dirge of Discord ~Divination~[TAG_MAGIC_SCHOOLS_DIVINATION] Level: ~Bard~[TAG_BARDS] 2 Components: V, S, M Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./ 2 levels) Target: One creature/level, no two of which are more than 30 ft. apart Duration: 1 round/level Saving Throw: None Spell Resistance: No You hold aloft a toy soldier and shake it at your allies, calling them to arms as you do so. The toy soldier dissipates, but you feel a connection to your allies as though you could hear each one whispering her intended actions before she performed them. When you cast this spell, you grant your allies greater insight into one another's actions, allowing them to better coordinate their attacks. If two affected allies ~flank~[TAG_FLANKING] the same creature, each gains a +2 ~insight~[TAG_MODIFIER_INSIGHT] bonus on ~melee~[TAG_MELEE_ATTACKS] attack rolls and deals an extra 1d6 points of damage against the flanked creature. Creatures not subject to extra damage from ~sneak attacks~[TAG_CLASS_FEATURES_ROGUE_SNEAK_ATTACK] are immune to this extra damage. TAG_SPELLS_TOUCH_OF_MADNESS TAG_SPELLS TAG_MADNESS_D Touch of Madness ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT][Mind-Affecting] Level: ~Domain: Madness~[TAG_MADNESS_D] 2 Components: V, S Casting Time: ~1 standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Creature touched Duration: 1 round/level Saving Throw: ~Will~[TAG_WILL] negates Spell Resistance: Yes Your hand glows with roiling purple light as you reach out to deliver lunacy with your touch. You can cause one living creature to become ~dazed~[TAG_DAZED] by making a successful ~touch attack~[TAG_TOUCH_ATTACK]. If the target creature does not make a successful ~Will~[TAG_WILL] save, its mind is clouded and it takes no actions for 1 round per caster level. TAG_SPELLS_UNDEAD_BANE_WEAPON TAG_SPELLS TAG_CLERIC_4 TAG_PALADIN_3 Undead Bane Weapon ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Cleric~[TAG_CLERICS] 4, ~Paladin~[TAG_PALADINS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Weapon touched Duration: 1 hour/level Saving Throw: None Spell Resistance: No Your hand glows with a dull light, and when you touch the weapon, the light shifts to it, so that it sheds a serene gray radiance as bright as a candle. You give a weapon the undead bane special ability in addition to any other properties it has. Against ~undead~[TAG_MONSTERS], your weapon's ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus is 2 higher than normal, and it deals an extra 2d6 points of damage against undead. The spell has no effect if cast upon a weapon that already has the undead bane special ability. The weapon is treated as ~good-aligned~[TAG_DESCRIPTORS] for the purpose of overcoming ~damage reduction~[TAG_SPECIAL_ABILITIES_DAMAGE_REDUCTION]. TAG_SPELLS_UNDERSONG TAG_SPELLS TAG_BARD_1 Undersong ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Bard~[TAG_BARDS] 1 Components: V Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 10 minutes/level When you cast this spell, a familiar and soothing song wells up in your mind. This spell brings to your mind a song that helps you retain your concentration. The song does not distract you from any task at hand, on the contrary, by humming along to the tune, you can focus your mind with ease. As long as this spell is in effect, you can make a ~Perform~[TAG_PERFORM] check in place of a ~Concentration~[TAG_CONCENTRATION] check. Note: In Temple of Elemental Evil this spell gives you the difference between Perfom and Concentration as a bonus to concentration. diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab new file mode 100644 index 000000000..1bda51fc6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -0,0 +1,43 @@ +TAG_WARLOCKS TAG_NONCORE_CLASSES Warlocks Born of a supernatural bloodline, a warlock seeks to master the perilous magic that suffuses his soul. Unlike sorcerers or wizards, who approach arcane magic through the medium of spells, a warlock invokes powerful magic through nothing more than an effort of will. By harnessing his innate magical gift through fearsome determination and force of will, a warlock can perform feats of supernatural stealth, beguile the weak-minded, or scour his foes with blasts of eldritch power. A warlock serves much the same role in an adventuring party as a sorcerer or wizard would. He is much more limited in his abilities compared to the spell selection of spellcasters, and he must rely on his eldritch blast in place of the spell power of an arcane caster. Like a bard, he often fits best in a party that already has another spellcaster or two, since his unique abilities provide him with little magic to use for his companions' benefit. Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_WARLOCK_TABLES] Class Skills: ~Bluff~[TAG_BLUFF], ~Concentration~[TAG_CONCENTRATION], Craft, Disguise, ~Intimidate~[TAG_INTIMIDATE], Jump, Knowledge(arcana), Knowledge(the planes), Knowledge(religion), Profession (Wis), ~Sense Motive~[TAG_SENSE_MOTIVE], ~Spellcraft~[TAG_SPELLCRAFT], ~Use Magic Device~[TAG_UMD] Skill Points at Each Level: 2 + Int modifier Class Features: [CMD_CHILDREN] +TAG_CLASS_FEATURES_WARLOCK_TABLES TAG_DUMMY Warlock Base Attack & Base Save Bonuses Level ~Base Attack Bonus~[TAG_LEVEL_BONUSES] ~Fortitude~[TAG_FORTITUDE] ~Save~[TAG_LEVEL_BONUSES] ~Reflex~[TAG_REFLEX] ~Save~[TAG_LEVEL_BONUSES] ~Will~[TAG_WILL] ~Save~[TAG_LEVEL_BONUSES] 1 @t+0 @t+0 @t+0 @t+2 2 @t+1 @t+0 @t+0 @t+3 3 @t+2 @t+1 @t+1 @t+3 4 @t+3 @t+1 @t+1 @t+4 5 @t+3 @t+1 @t+1 @t+4 6 @t+4 @t+2 @t+2 @t+5 7 @t+5 @t+2 @t+2 @t+5 8 @t+6/+1 @t+2 @t+2 @t+6 9 @t+6/+1 @t+3 @t+3 @t+6 10 @t+7/+2 @t+3 @t+3 @t+7 11 @t+8/+3 @t+3 @t+3 @t+7 12 @t+9/+4 @t+4 @t+4 @t+8 13 @t+9/+4 @t+4 @t+4 @t+8 14 @t+10/+5 @t+4 @t+4 @t+9 15 @t+11/+6/+1 @t+5 @t+5 @t+9 16 @t+12/+7/+2 @t+5 @t+5 @t+10 17 @t+12/+7/+2 @t+5 @t+5 @t+10 18 @t+13/+8/+3 @t+6 @t+6 @t+11 19 @t+14/+9/+4 @t+6 @t+6 @t+11 20 @t+15/+10/+5 @t+6 @t+6 @t+12 +TAG_CLASS_FEATURES_WARLOCK_ELDRITCH_BLAST_TABLE TAG_DUMMY Warlock Eldritch Blast Damage Level Eldritch Blast Damage Dice 1 @t1d6 2 @t1d6 3 @t2d6 4 @t2d6 5 @t3d6 6 @t3d6 7 @t4d6 8 @t4d6 9 @t5d6 10 @t5d6 11 @t6d6 12 @t6d6 13 @t6d6 14 @t7d6 15 @t7d6 16 @t7d6 17 @t8d6 18 @t8d6 19 @t8d6 20 @t9d6 +TAG_CLASS_FEATURES_WARLOCK_WEAPON_ARMOR_PROF TAG_WARLOCKS Weapon and Armor Proficiency Warlocks are proficient with all simple weapons. They are proficient with light armor but not with shields. +TAG_CLASS_FEATURES_WARLOCK_ELDRITCH_BLAST TAG_WARLOCKS Eldritch Blast The first ability a warlock learns is eldritch blast. A warlock attacks his foes with eldritch power, using baleful magical energy to deal damage and sometimes impart other debilitating effects. An Eldritch Blast is a ray with a range of 60 feet. It is a ~ranged touch attack~[TAG_TOUCH_ATTACK] that affects a single target, allowing no saving throw. An Eldritch Blast deals 1d6 points of damage at 1st level and additional damage as the Warlock increases in level. See the ~Warlock Eldritch Blast Damage Table~[TAG_CLASS_FEATURES_WARLOCK_ELDRITCH_BLAST_TABLE] for more information. An Eldritch Blast is the equivalent of a 1st-level spell. If you apply a blast shape or eldritch essence invocation to your Eldritch Blast, your Eldritch Blast uses the level equivalent of the shape or essence. An eldritch blast is subject to spell resistance, although the Spell Penetration feat and other effects that improve caster level checks to overcome spell resistance also apply to eldritch blast. An eldritch blast deals half damage to objects. A warlock can use eldritch blast at will. +TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS TAG_WARLOCKS Invocations A warlock does not prepare or cast spells as other wielders of arcane magic do. Instead, he possesses a repertoire of attacks, defenses, and abilities known as invocations that require him to focus the wild energy that suffuses his soul. A warlock can use any invocation he knows at will, with the following qualifications: A warlock's invocations are spell-like abilities; using an invocation is therefore a standard action that provokes attacks of opportunity. An invocation can be disrupted, just as a spell can be ruined during casting. A warlock is entitled to a Concentration check to successfully use an invocation if he is hit by an attack while invoking, just as a spellcaster would be. A warlock can choose to use an invocation defensively, by making a successful Concentration check, to avoid provoking attacks of opportunity. A warlock's invocations are subject to spell resistance unless an invocation's description specifically states otherwise. A warlock's caster level with his invocations is equal to his warlock level. The save DC for an invocation (if it allows a save) is 10 + equivalent spell level + the warlock's Charisma modifier. Since spell-like abilities are not actually spells, a warlock cannot benefit from the Spell Focus feat. He can, however, benefit from the Ability Focus feat, as well as from feats that emulate metamagic effects for spell-like abilities, such as Quicken Spell-Like Ability and Empower Spell-Like Ability. The four grades of invocations, in order of their relative power, are least, lesser, greater, and dark. A warlock begins with knowledge of one invocation, which must be of the lowest grade (least). As a warlock gains levels, he learns new invocations, as summarized on Table: The Warlock and described below. A list of available invocations can be found on the warlock invocations page. At any level when a warlock learns a new invocation, he can also replace an invocation he already knows with another invocation of the same or a lower grade. At 6th level, a warlock can replace a least invocation he knows with a different least invocation (in addition to learning a new invocation, which could be either least or lesser). At 11th level, a warlock can replace a least or lesser invocation he knows with another invocation of the same or a lower grade (in addition to learning a new invocation, which could be least, lesser, or greater). At 16th level, a warlock can replace a least, lesser, or greater invocation he knows with another invocation of the same or a lower grade (in addition to learning a new invocation, which could be least, lesser, greater, or dark). Finally, unlike other spell-like abilities, invocations are subject to arcane spell failure chance as described under Weapon and Armor Proficiency above. Warlocks can qualify for some prestige classes usually intended for spellcasters; see below. Invocation List: ~Least Invocations~[TAG_INVOCATION_LEAST] ~Lesser Invocations~[TAG_INVOCATION_LESSER] ~Greater Invocations~[TAG_INVOCATION_GREATER] ~Dark Invocations~[TAG_INVOCATION_DARK] +TAG_CLASS_FEATURES_WARLOCK_DETECT_MAGIC TAG_WARLOCKS Detect Magic Beginning at 2nd level, a warlock can use detect magic as the spell at will. His caster level equals his class level. +TAG_CLASS_FEATURES_WARLOCK_DAMAGE_REDUCTION TAG_WARLOCKS Damage Reduction Fortified by the supernatural power flowing in his body, a warlock becomes resistant to physical attacks at 3rd level and above, gaining damage reduction 1/cold iron. At 7th level and every four levels thereafter, a warlock's damage reduction improves by 1 to a max DR5/Cold Iron at level 19. +TAG_CLASS_FEATURES_WARLOCK_FIENDISH_RESILIENCE TAG_WARLOCKS Fiendish Resilience Beginning at 8th level, a warlock knows the trick of fiendish resilience. Once per day, as a free action, he can enter a state that lasts for 2 minutes. While in this state, the warlock gains fast healing 1. At 13th level, a warlock's fiendish resilience improves. When in his fiendish resilience state, he gains fast healing 2 instead. At 18th level, a warlock's fiendish resilience improves to fast healing 5. +TAG_CLASS_FEATURES_WARLOCK_ENERGY_RESISTANCE TAG_WARLOCKS Energy Resistance At 10th level and higher, a warlock has resistance 5 against any two of the following energy types: acid, cold, electricity, fire, and sonic. Once the types are chosen, this energy resistance cannot be changed. At 20th level, a warlock gains resistance 10 against the two selected types of energy. +TAG_SPELLS_ELDRITCH_BLAST TAG_SPELLS TAG_INVOCATION_LEAST Eldritch Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 2 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 60 ft. Target: Single Target Duration: Instantaneous Saving Throw: None Spell Resistance: Yes An Eldritch Blast is a ray with a range of 60 feet. It is a ~ranged touch attack~[TAG_TOUCH_ATTACK] that affects a single target, allowing no saving throw. An Eldritch Blast deals 1d6 points of damage at 1st level and additional damage as the Warlock increases in level. See the ~Warlock Eldritch Blast Damage Table~[TAG_CLASS_FEATURES_WARLOCK_ELDRITCH_BLAST_TABLE] for more information. An Eldritch Blast is the equivalent of a 1st-level spell. If you apply a blast shape or eldritch essence invocation to your Eldritch Blast, your Eldritch Blast uses the level equivalent of the shape or essence. +TAG_SPELLS_ELDRITCH_CHAIN TAG_SPELLS TAG_INVOCATION_LESSER Eldritch Chain ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Blast Shape) Level: ~Warlock~[TAG_WARLOCKS] 4 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 60 ft. Target: 1 + 1/5 caster levels (max 5 at level 20) Duration: Instantaneous Saving Throw: None Spell Resistance: Yes This blast shape invocation allows you to improve your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] by turning it into an arc of energy that "jumps" from the first target to others. An Eldritch Chain can jump to one or more secondary targets within 30 feet of the first target, allowing you to make additional ranged touch attacks and deal damage to the secondary targets if you hit. You can "jump" the chain to one secondary target per five caster levels, so you can strike two additional targets at 10th level, three additional targets at 15th level, and four additional targets at 20th level. Each new target must be within 30 feet of the previous one, and you can't target the same creature more than once with the Eldritch Chain. If you miss any target in the chain, the Eldritch Chain attack ends there. Each target struck after the first takes half the damage dealt to the first target. You must make a separate spell penetration check for each target, if applicable. +TAG_SPELLS_ELDRITCH_CONE TAG_SPELLS TAG_INVOCATION_GREATER Eldritch Cone ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Blast Shape) Level: ~Warlock~[TAG_WARLOCKS] 5 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 250 ft. Target: Single Target Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This Blast Shape Invocation allows you to invoke your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] as a 30-foot cone. The Eldritch Cone deals the normal ~Eldritch Blast damage~[TAG_CLASS_FEATURES_WARLOCK_ELDRITCH_BLAST_TABLE] to all targets within the area. This is not a ray attack, so it requires no ranged ~touch~[TAG_TOUCH_ATTACK] attack. Any creature in the area of the cone can attempt a ~Reflex~[TAG_REFLEX] save for half damage. +TAG_SPELLS_ELDRITCH_DOOM TAG_SPELLS TAG_INVOCATION_DARK Eldritch Doom ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Blast Shape) Level: ~Warlock~[TAG_WARLOCKS] 8 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 30 ft. Area: 30-ft. cone Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This blast shape invocation allows you to invoke your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] as the dreaded Eldritch Doom. This causes bolts of mystical power to lash out and savage nearby targets. An Eldritch Doom deals ~Eldritch Blast damage~[TAG_CLASS_FEATURES_WARLOCK_ELDRITCH_BLAST_TABLE] to any number of targets designated by you and within 20 feet. This is not a ray attack, so it requires no ~ranged touch~[TAG_TOUCH_ATTACK] attack. Each target can attempt a ~Reflex~[TAG_REFLEX] save for half damage. +TAG_SPELLS_ELDRITCH_LINE TAG_SPELLS TAG_INVOCATION_GREATER Eldritch Line ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Blast Shape) Level: ~Warlock~[TAG_WARLOCKS] 5 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 60 ft. Area: 60-ft. line Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This Blast Shape Invocation allows you to invoke your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] as a 60-foot line. The Eldritch Line deals the normal ~Eldritch Blast damage~[TAG_CLASS_FEATURES_WARLOCK_ELDRITCH_BLAST_TABLE] to all targets within the area. This is not a ray attack, so it requires no ranged ~touch~[TAG_TOUCH_ATTACK] attack. Any creature in the line can attempt a ~Reflex~[TAG_REFLEX] save for half damage. +TAG_SPELLS_ELDRITCH_SPEAR TAG_SPELLS TAG_INVOCATION_LEAST Eldritch Spear ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Blast Shape) Level: ~Warlock~[TAG_WARLOCKS] 2 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 250 ft. Target: Single Target Duration: Instantaneous Saving Throw: None Spell Resistance: Yes This blast shape invocation extends your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] attacks to great distances. Eldritch Spear increases the range of an Eldritch Blast attack to 250 feet with no range increment. +TAG_SPELLS_BEWITCHING_BLAST TAG_SPELLS TAG_INVOCATION_GREATER Bewitching Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Eldritch Essence) Level: ~Warlock~[TAG_WARLOCKS] 5 Components: S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Duration: Stance This eldritch essence invocation allows you to change your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] into a Bewitching Blast. Any creature struck by a Bewitching Blast must succeed on a ~Will save~[TAG_WILL] or be ~confused~[TAG_CONFUSED] for 1 round in addition to the normal damage from the blast. This is a mind-affecting effect. +TAG_SPELLS_BESHADOWING_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Beshadowing Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Eldritch Essence) Level: ~Warlock~[TAG_WARLOCKS] 4 Components: S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Duration: Stance This eldritch essence invocation allows you to change your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] into a Beshadowed Blast. Any living creature struck by a Beshadowed Blast must succeed on a ~Fortitude save~[TAG_FORTITUDE] or be ~blinded~[TAG_BLINDED] for 1 round. +TAG_SPELLS_BINDING_BLAST TAG_SPELLS TAG_INVOCATION_DARK Binding Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Eldritch Essence) Level: ~Warlock~[TAG_WARLOCKS] 7 Components: S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Duration: Stance You transform your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] into a Binding Blast. Any creature struck by a Binding Blast must succeed on a ~Will save~[TAG_WILL] or be ~stunned~[TAG_STUNNED] for 1 round. This is a mind-affecting effect. +TAG_SPELLS_BRIMSTONE_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Brimstone Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Eldritch Essence) Level: ~Warlock~[TAG_WARLOCKS] 3 Components: S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Duration: Stance This eldritch essence invocation allows you to change your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] into a Brimstone Blast. A Brimstone Blast deals fire damage. Any creature struck by a Brimstone Blast must succeed on a ~Reflex save~[TAG_REFLEX] or catch on fire, taking 2d6 points of fire damage per round until it takes a full-round action to extinguish the flames or the duration expires. The fire damage persists for 1 round per five class levels you have. For example, a 15th-level warlock deals 2d6 points of fire damage for 3 rounds after the initial Brimstone Blast attack. A creature burning in this way never takes more than 2d6 points of fire damage in a round, even if it has been hit by more than one Brimstone Blast. +TAG_SPELLS_FRIGHTFUL_BLAST TAG_SPELLS TAG_INVOCATION_LEAST Frightful Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Eldritch Essence) Level: ~Warlock~[TAG_WARLOCKS] 2 Components: S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Duration: Stance This eldritch essence invocation allows you to change your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] into a Frightful Blast. Any creature struck by a Frightful Blast must succeed on a ~Will save~[TAG_WILL] or become ~shaken~[TAG_SHAKEN] for 1 minute. A shaken creature struck by a Frightful Blast is not affected by the shaken aspect of the blast but takes damage normally. Creatures with immunity to mind-affecting spells and abilities or fear effects cannot be shaken by a Frightful Blast. +TAG_SPELLS_HELLRIME_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Hellrime Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Eldritch Essence) Level: ~Warlock~[TAG_WARLOCKS] 4 Components: S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Duration: Stance This eldritch essence invocation allows you to change your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] into a Hellrime Blast. A Hellrime Blast deals cold damage. Any creature struck by the attack must make a ~Fortitude save~[TAG_FORTITUDE] or take a -4 penalty to ~Dexterity~[TAG_DEXTERITY] for 10 minutes. The Dexterity penalties from multiple Hellrime Blasts do not stack. +TAG_SPELLS_HINDERING_BLAST TAG_SPELLS TAG_INVOCATION_GREATER Hindering Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Eldritch Essence) Level: ~Warlock~[TAG_WARLOCKS] 5 Components: S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Duration: Stance You transform your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] into a Hindering Blast. Any living creature struck by a Hindering Blast must succeed on a ~Will save~[TAG_WILL] or be ~slowed~[TAG_SPELLS_SLOW] for 1 round in addition to the normal damage from the blast. +TAG_SPELLS_NOXIOUS_BLAST TAG_SPELLS TAG_INVOCATION_GREATER Noxious Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Eldritch Essence) Level: ~Warlock~[TAG_WARLOCKS] 6 Components: S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Duration: Stance This eldritch essence invocation allows you to change your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] into a Noxious Blast. Any creature struck by a Noxious Blast must make a ~Fortitude~[TAG_FORTITUDE] save or be ~nauseated~[TAG_NAUSEATED] for 1 minute. +TAG_SPELLS_PENETRATING_BLAST TAG_SPELLS TAG_INVOCATION_GREATER Penetrating Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Eldritch Essence) Level: ~Warlock~[TAG_WARLOCKS] 6 Components: S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Duration: Stance This eldritch essence invocation allows you to change your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] into a Penetrating Blast. A Penetrating Blast gains a +4 bonus on caster level checks made to penetrate a target's spell resistance. A creature affected by a Penetrating Blast must succeed on a ~Will save~[TAG_WILL] or have its ~spell resistance~[TAG_SPECIAL_ABILITIES_SPELL_RESISTANCE] lowered by 5 for 1 minute. Multiple uses of this essence don't stack; instead, the new duration replaces the old one. +TAG_SPELLS_SICKENING_BLAST TAG_SPELLS TAG_INVOCATION_LEAST Sickening Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Eldritch Essence) Level: ~Warlock~[TAG_WARLOCKS] 2 Components: S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Duration: Stance This eldritch essence invocation allows you to change your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] into a Sickening Blast. Any living creature struck by a Sickening Blast must make a ~Fortitude save~[TAG_FORTITUDE] or become ~sickened~[TAG_SICKENED] for 1 minute. A sickened creature struck by a second Sickening Blast is not affected by the sickening aspect of the blast but still takes damage normally. +TAG_SPELLS_VITRIOLIC_BLAST TAG_SPELLS TAG_INVOCATION_GREATER Vitriolic Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS](Eldritch Essence) Level: ~Warlock~[TAG_WARLOCKS] 6 Components: S Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Duration: Stance This eldritch essence invocation allows you to change your ~Eldritch Blast~[TAG_SPELLS_ELDRITCH_BLAST] into a Vitriolic Blast. A Vitriolic Blast deals acid damage, and it is formed from conjured acid, making it different from other eldritch essences because it ignores spell resistance. Creatures struck by a Vitriolic Blast automatically take an extra 2d6 points of acid damage on following rounds. This acid damage persists for 1 round per five class levels you have. Note: Vitriolic Blast does not ignore Spell Resilience at the moment. ToDO! +TAG_SPELLS_ALL_SEEING_EYES TAG_SPELLS TAG_INVOCATION_LEAST All Seeing Eyes ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 2 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 24 hours Saving Throw: None Spell Resistance: No You gain a supernaturally precise vision of the world around you. You gain a +6 bonus on ~Search~[TAG_SEARCH] and ~Spot~[TAG_SPOT] checks. Not implemented: You gain the benefits of comprehend languages, albeit for written words only. +TAG_SPELLS_BEGUILING_INFLUENCE TAG_SPELLS TAG_INVOCATION_LEAST Beguiling Influence ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 2 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 24 hours Saving Throw: None Spell Resistance: No You can invoke this ability to beguile and bewitch your foes. You gain a +6 bonus on ~Bluff~[TAG_BLUFF], ~Diplomacy~[TAG_DIPLOMACY], and ~Intimidate~[TAG_INTIMIDATE] checks. +TAG_SPELLS_BREATH_OF_THE_NIGHT TAG_SPELLS TAG_INVOCATION_LEAST Breath of the Night ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 1 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 1 Minute Saving Throw: None Spell Resistance: Yes TBD! +TAG_SPELLS_COLD_COMFORT TAG_SPELLS TAG_INVOCATION_LESSER Cold Comfort ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 3 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 24 hours Saving Throw: None Spell Resistance: No Your unnatural aura renders you partly immune to the ravages of the environment. You remain cool in hot weather and warm in cold weather, as the spell ~Endure Elements~[TAG_SPELLS_ENDURE_ELEMENTS]. Additionally, you radiate a small aura of warmth or cold; allies within 30 feet of you also benefit from this effect. +TAG_SPELLS_CURSE_OF_DESPAIR TAG_SPELLS TAG_INVOCATION_LESSER Curse of Despair ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 4 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: Permanent or 1 min (see text) Saving Throw: ~Willpower~[TAG_WILL] Spell Resistance: Yes You can use this invocation to bestow a curse upon a touched opponent (as ~Bestow Curse~[TAG_SPELLS_BESTOW_CURSE]). Even if the save against this ability succeeds, the creature takes a -1 penalty on ~attack rolls~[TAG_ATTACK_ROLL] for 1 minute. +TAG_SPELLS_DARK_ONE'S_OWN_LUCK TAG_SPELLS TAG_INVOCATION_LEAST Dark One's Own Luck ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 2 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 24 hours Saving Throw: None Spell Resistance: No You are favored by the dark powers if you have this invocation. You gain a ~luck bonus~[TAG_MODIFIER_LUCK] equal to your ~Charisma bonus~[TAG_CHARISMA] (if any) on ~Fortitude~[TAG_FORTITUDE] saves, ~Reflex~[TAG_REFLEX] saves, or ~Will~[TAG_WILL] saves (your choice each time you use this ability) You can't apply this ability to two different save types at the same time. This bonus can never exceed your class level. +TAG_SPELLS_ENERVATING_SHADOW TAG_SPELLS TAG_INVOCATION_GREATER Enervating Shadow ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 5 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 5 ft. Area: living creatures adjacent to you Duration: 5 rounds Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates Spell Resistance: Yes The dark powers cloak you and shield you from harm while draining vitality from nearby foes. This invocation grants you ~total concealment~[TAG_CONCEALMENT] in any area that isn't brightly lit (it will not work in daylight or in the radius of a spell with the light descriptor). In addition, any living creature adjacent to you with this ability active must make a ~Fortitude~[TAG_FORTITUDE] save at the beginning of its turn or take a -4 penalty to ~Strength~[TAG_STRENGTH] for 5 rounds. Once a creature is affected by enervating shadow, it cannot be affected again by your enervating shadow for 24 hours. The duration of this ability is 5 rounds, and it can be countered or dispelled by any light spell or effect of equal or higher level. +TAG_SPELLS_ENTROPIC_WARDING TAG_SPELLS TAG_INVOCATION_LEAST Entropic Warding ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 2 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 1 Minute/Level Saving Throw: None Spell Resistance: No When this invocation is activated, chaotic energies swirl about you, deflecting incoming arrows, rays, and other ~ranged attacks~[TAG_RANGED_ATTACKS] (as ~Entropic Shield~[TAG_SPELLS_ENTROPIC_SHIELD]). Not implemented: You leave no trail (as pass without trace) and cannot be tracked by scent. (You can still be detected normally by scent, just not tracked). +TAG_SPELLS_FLEE_THE_SCENE TAG_SPELLS TAG_INVOCATION_LESSER Flee the Scene ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 4 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: No You can use ~Dimension Door~[TAG_SPELLS_DIMENSION_DOOR] as a spell-like ability, although the range is limited to short (25 ft. + 5 ft./2 levels). Not implemented: When you use this ability, you leave behind a major image of yourself in your place that lasts for 1 round. The image reacts appropriately to attacks as if you were concentrating on it. +TAG_SPELLS_IGNORE_THE_PYRE TAG_SPELLS TAG_INVOCATION_LESSER Ignore the Pyre ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 4 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 24 hours Saving Throw: None Spell Resistance: No When you use this invocation, you gain remarkable resilience to any one energy type (acid, cold, electricity, fire, or sonic). You gain ~resistance~[TAG_SPELLS_RESIST_ENERGY] equal to your invocation caster level against the energy type of your choice. If you use this invocation a second time before the duration of the first expires, the new resistance and duration replace the old one. +TAG_SPELLS_LEAPS_AND_BOUNDS TAG_SPELLS TAG_INVOCATION_LEAST Leaps and Bounds ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 2 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 24 hours Saving Throw: None Spell Resistance: No You invoke this ability to gain amazing agility. You gain a +6 bonus on Balance, Jump, and ~Tumble~[TAG_TUMBLE] checks. +TAG_SPELLS_MIASMIC_CLOUD TAG_SPELLS TAG_INVOCATION_LEAST Miasmic Cloud ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 1 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 1 Minute Saving Throw: None Spell Resistance: Yes TBD! +TAG_SPELLS_SEE_THE_UNSEEN TAG_SPELLS TAG_INVOCATION_LEAST See the Unseen ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 2 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 24 hours Saving Throw: None Spell Resistance: No When you use this invocation, you can activate great powers of vision. You can see invisible creatures and objects (as ~See Invisibility~[TAG_SPELLS_SEE_INVISIBILITY]). Not implemented: Darkvision 60ft. +TAG_SPELLS_SOULREAVING_AURA TAG_SPELLS TAG_INVOCATION_LEAST Soulreaving Aura ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 2 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +TAG_SPELLS_WALK_UNSEEN TAG_SPELLS TAG_INVOCATION_LESSER Walk Unseen ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 3 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 24 hours Saving Throw: None Spell Resistance: No You gain the ability to fade from view. You can use ~Invisibility~[TAG_SPELLS_INVISIBILITY] (self only). +TAG_SPELLS_WARLOCK_CHARM TAG_SPELLS TAG_INVOCATION_LESSER Charm ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 4 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: 24 hours/level Saving Throw: ~Willpower~[TAG_WILL] negates Spell Resistance: Yes You can beguile a creature within 60 feet. The creature must succeed on a ~Will~[TAG_WILL] save or instantly come to regard you as its comrade. This is a language-dependent ability. Other than these differences, this ability works as the ~Charm Monster~[TAG_SPELLS_CHARM_MONSTER] spell. You can never have more than one target charmed at a time with this ability. If a second creature is charmed, you lose your hold on the first creature. diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/aura_spells.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/aura_spells.mes new file mode 100644 index 000000000..1f9405169 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/aura_spells.mes @@ -0,0 +1,6 @@ +// Spell Enums for Draconic + Marshal Auras +{3831}{Marshal Minor Aura} +{3832}{Marshal Major Aura} +{3833}{Marshal Adrenaline Boost} +{3840}{Draconic Aura} +{3841}{Double Draconic Aura} diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/dragon_disciple_breath_weapons.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/dragon_disciple_breath_weapons.mes new file mode 100644 index 000000000..da1c584ea --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/dragon_disciple_breath_weapons.mes @@ -0,0 +1,2 @@ +{3231} {Dragon Disciple Cone Breath} +{3232} {Dragon Disciple Line Breath} diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes index 0c205a1c4..d30a0d355 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes @@ -1,3 +1,6 @@ +// Base Spells +{158}{Evard's Black Tentacles} + // Vigor Spell Fixes {794}{Vigor, Lesser} {795}{Vigor} @@ -44,7 +47,7 @@ {1086}{Fire Shuriken} {1087}{Phantom Foe} {1088}{Veil of Shadow} -{1089}{Curse of Imp. Blades Mass} +{1089}{Curse of Imp. Blades, Mass} {1090}{Dissonant Chord} {1091}{Haunting Tune} {1092}{Love's Lament} @@ -71,6 +74,7 @@ {1114}{Clear Mind} {1115}{Deafening Clang} {1116}{Grave Strike} +{1117}{Rhino's Rush} {1118}{Faith Healing} {1119}{Summon Undead I} {1120}{Angelskin} @@ -131,11 +135,36 @@ {1176}{Draconic Might} {1177}{Vigor, Mass Lesser} {1178}{Vigor, Mass Improved} +{1179}{Sure Strike} +{1180}{Hunter's Eye} +{1181}{Tactical Precision} +{1182}{Accuracy} +{1183}{Hail of Stone} +{1184}{Lesser Orb of Acid} +{1185}{Lesser Orb of Cold} +{1186}{Lesser Orb of Electricity} +{1187}{Lesser Orb of Fire} +{1188}{Lesser Orb of Sound} +{1189}{Blades of Fire} +{1190}{Fireburst} +{1191}{Greater Fireburst} +{1192}{Ice Knife} +{1193}{Whirling Blade} +{1194}{Ring of Blades} +{1195}{Blast of Flame} +{1196}{Orb of Acid} +{1197}{Orb of Cold} +{1198}{Orb of Electricity} +{1199}{Orb of Fire} +{1200}{Orb of Sound} +{1201}{Icelance} +{1202}{Revivify} // Spell Descriptions -{5794}Vigor, Lesser {[Conjuration] Fast Healing 1 for 10 +1/level rounds, max 15.} -{5795}Vigor {[Conjuration] Fast Healing 2 for 10 +1/level rounds, max 25.} -{5796}Vigor, Greater {[Conjuration] Fast Healing 4 for 10 +1/level rounds, max 35.} +{5158} Evard's Black Tentacles {[Conjuration][Creation] Create Tentacles that grapple in a 20ft. area.} +{5794} Vigor, Lesser {[Conjuration] Fast Healing 1 for 10 +1/level rounds, max 15.} +{5795} Vigor {[Conjuration] Fast Healing 2 for 10 +1/level rounds, max 25.} +{5796} Vigor, Greater {[Conjuration] Fast Healing 4 for 10 +1/level rounds, max 35.} {6050} Sound Lance {[Evocation] Projectile of intense sonic energy that deals 1d8/level (max 10d8) sonic damage.} {6051} Critical Strike {[Divination] Against flanked or dexterity denied foes gain 1d6 damage, +4 to confirm critical hits and weapon is considered to be keen.} {6052} Camouflage {[Transmutation] For 10 min/level gain a +10 circumstance bonus to Hide.} @@ -201,6 +230,7 @@ {6114} Clear Mind {[Abjuration] You gain a +4 sacred bonus on saving throws made against mind-affecting spells and effects.} {6115} Deafening Clang {[Transmutation][Sonic] The weapon deals 1d6 points of sonic damage with each successful hit, and any creature struck by the weapon must succeed on a Fortitude saving throw or be deafened for 1 minute.} {6116} Grave Strike {[Divination][Good] For 1 round, you can deliver sneak attacks against undead as if they were not immune to extra damage from sneak attacks.} +{6117} Rhino's Rush {[Transmutation] Deal double damage on a charge attack.} {6118} Faith Healing {[Conjuration](Healing) Heal 8 + level (max. 5) on target that worships same deity.} {6119} Summon Undead I {[Conjuration](Summoning)[Evil] You summon an undead creature.} {6120} Angelskin {[Abjuration][Good] Target gains damage reduction 5/evil.} @@ -261,3 +291,27 @@ {6176} Draconic Might {TBD} {6177} Vigor, Mass Lesser {Targets get Fast Healing 1 for 10 +1/level rounds, max 25.} {6178} Vigor, Mass Improved {Targets get Fast Healing 3 for 10 +1/level rounds, max 40.} +{6179} Sure Strike {You gain a +1 insight bonus per three caster levels on your next attack roll.} +{6180} Hunter's Eye {You deal an extra 1d6 points of sneak attack damage per three caster levels.} +{6181} Tactical Precision {If two affected allies flank the same creature, each gains a +2 insight bonus on melee attack rolls and deals an extra 1d6 points of damage against the flanked creature.} +{6182} Accuracy {TBD!} +{6183} Hail of Stone {TBD!} +{6184} Lesser Orb of Acid {Ranged Touch Attack that deals 1d8/two levels (max 5d8) acid damage.} +{6185} Lesser Orb of Cold {Ranged Touch Attack that deals 1d8/two levels (max 5d8) cold damage.} +{6186} Lesser Orb of Electricity {Ranged Touch Attack that deals 1d8/two levels (max 5d8) electricity damage.} +{6187} Lesser Orb of Fire {Ranged Touch Attack that deals 1d8/two levels (max 5d8) fire damage.} +{6188} Lesser Orb of Sound {Ranged Touch Attack that deals 1d8/two levels (max 5d8) sonic damage.} +{6189} Blades of Fire {TBD!} +{6190} Fireburst {TBD!} +{6191} Greater Fireburst {TBD!} +{6192} Ice Knife {TBD!} +{6193} Whirling Blade {TBD!} +{6194} Ring of Blades {TBD!} +{6195} Blast of Flame {TBD!} +{6196} Orb of Acid {Ranged Touch Attack that deals 1d6/level (max 15d6) acid damage and in addition sickens for 1 round on a failed fortitude save.} +{6197} Orb of Cold {Ranged Touch Attack that deals 1d6/level (max 15d6) cold damage and in addition blinds for 1 round on a failed fortitude save.} +{6198} Orb of Electricity {Ranged Touch Attack that deals 1d6/level (max 15d6) electricity damage and in addition may entangle for 1 round on a failed fortitude save.} +{6199} Orb of Fire {Ranged Touch Attack that deals 1d6/level (max 15d6) fire damage and in addition dazes for 1 round on a failed fortitude save.} +{6200} Orb of Sound {Ranged Touch Attack that deals 1d6/level (max 15d6) sonic damage and in addition deafens for 1 round on a failed fortitude save.} +{6201} Icelance {[Conjuration][Creation] Ranged Attack that deals 3d6 Cold and 3d6 Piercing Damage to target. In addition, target is stunned for 1d4 rounds on a failed fortitude save.} +{6202} Revivify {[Conjuration][Healing] Restores life to a recently deceased creature (died within 1 round).} diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes new file mode 100644 index 000000000..7376bcc46 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes @@ -0,0 +1,103 @@ +//Warlock Invocation descriptions + +// Spell Names + +// Eldritch Blast Shape Invocations +{2300}{Eldritch Blast} +{2301}{Eldritch Spear} +{2302}{Hideous Blow} // not implemented +{2303}{Eldritch Chain} +{2304}{Eldritch Cone} +{2305}{Eldritch Line} +{2306}{Eldritch Doom} +{2307}{Eldritch Glaive} // not implemented + +// Eldritch Essence Invocations +{2311}{Frightful Blast} +{2312}{Sickening Blast} +{2313}{Beshadowed Blast} +{2314}{Brimstone Blast} +{2315}{Hellrime Blast} +{2316}{Bewitching Blast} +{2317}{Noxious Blast} +{2318}{Repelling Blast} // not implemented +{2319}{Vitriolic Blast} +{2320}{Hindering Blast} +{2321}{Utterdark Blast} // not implemented +{2322}{Binding Blast} +{2323}{Penetrating Blast} +{2324}{Baneful Blast} // not implemented +{2325}{Hammer Blast} // not implemented +{2326}{Deteriorating Blast} // not implemented + +// Invocations +{2330}{Beguiling Influence} +{2331}{Breath of the Night} +{2332}{Dark One's Own Luck} +{2333}{Entropic Warding} +{2334}{Leaps and Bounds} +{2335}{Miasmic Cloud} +{2336}{See the Unseen} +{2337}{Spiderwalk} // not implemented +{2338}{Soulreaving Aura} +{2339}{All Seeing Eyes} +{2340}{Charm} +{2341}{Curse of Despair} +{2342}{Fell Flight} // not implemented +{2343}{Flee the Scene} +{2344}{The Dead Walk} // not implemented +{2345}{Voracious Dispelling} // not implemented +{2346}{Walk Unseen} +{2347}{Cold Comfort} +{2348}{Witchwood Step} // not implemented +{2349}{Dread Seizure} // not implemented +{2350}{Ignore the Pyre} +{2357}{Enervating Shadow} + +// Spell Descriptions +{7300} Eldritch Blast {[Eldritch Blast] Ranged touch attack that deals 1d6 damage. Damage increases with Warlock levels. Can be modified by Eldritch Essence Invocations.} +{7301} Eldritch Spear {Invocation](Blast Shape) Increases the range of Eldritch Blast.} +{7302} Hideous Blow {[Invocation](Blast Shape) TBD!} // not implemented +{7303} Eldritch Chain {[Invocation](Blast Shape) Changes Eldritch Blast to a chain. Full damage to the primary target, half damage to secondary targets. A missed ranged attack breaks the chain.} +{7304} Eldritch Cone {[Invocation](Blast Shape) Changes Eldritch Blast to a 30-ft. cone. No longer a touch attack and allows a Reflex save for half damage.} +{7305} Eldritch Line {[Invocation](Blast Shape) Changes Eldritch Blast to a 60-ft. line. No longer a touch attack and allows a Reflex save for half damage.} +{7306} Eldritch Doom {[Invocation](Blast Shape) Deal Eldritch Blast damage to any number of targets designated by you within 20ft. Reflex save for half damage.} +{7307} Eldritch Glaive {Invocation](Blast Shape) TBD!} // not implemented +{7311} Frightful Blast {Invocation](Eldritch Essence) In addition to the normal Eldritch Blast damage targets are shaken for 1 minute on a failed Will save. Mind-Affecting.} +{7312} Sickening Blast {Invocation](Eldritch Essence) In addition to the normal Eldritch Blast damage living creatures are sickened for 1 minute on a failed Fortitude save.} +{7313} Beshadowed Blast {Invocation](Eldritch Essence) In addition to the normal Eldritch Blast damage, living creatures are blinded for 1 round on a failed Fortitude save.} +{7314} Brimstone Blast {Invocation](Eldritch Essence) Changes Eldritch Blast damage to fire, targets catch fire on a failed Reflex save for 1 round/5 levels that deals 2d6 fire damage each round.} +{7315} Hellrime Blast {Invocation](Eldritch Essence) Changes Eldritch Blast damage to cold damage, targets get a -4 dexterity penalty for 10 minutes on a failed Fortitude save.} +{7316} Bewitching Blast {Invocation](Eldritch Essence) In addition to the normal Eldritch Blast damage targets are confused on a failed Will save for 1 round. Mind-Affecting.} +{7317} Noxious Blast {Invocation](Eldritch Essence) In addition to the normal Eldritch Blast damage living creatures must make a Fortitude save or be nauseated for 1 minute.} +{7318} Repelling Blast {Invocation](Eldritch Essence) TBD!} // not implemented +{7319} Vitriolic Blast {Invocation](Eldritch Essence) Changes Eldritch Blast damage to acid and deals 2d6 acid damage each round for 1 round/5 levels.} +{7320} Hindering Blast {Invocation](Eldritch Essence) In addition to the normal Eldritch Blast damage living creatures must succeed on a Will save or be slowed for 1 round.} +{7321} Utterdark Blast {Invocation](Eldritch Essence) TBD!} // not implemented +{7322} Binding Blast {Invocation](Eldritch Essence) In addition to the normal Eldritch Blast damage targets must succeed on a Will save or be stunned for 1 round. Mind-Affecting.} +{7323} Penetrating Blast {Invocation](Eldritch Essence) Eldritch Blasts gains a +4 bonus on spell penetration checks. Targets must succeed on a Will save or have its spell resistance lowered by 5 for 1 minute.} +{7324} Baneful Blast {Invocation](Eldritch Essence] TBD!) // not implemented +{7325} Hammer Blast {Invocation](Eldritch Essence] TBD!) // not implemented +{7326} Deteriorating Blast {Invocation](Eldritch Essence) TBD!} // not implemented +{7330} Beguiling Influence {[Invocation] TBD!} +{7331} Breath of the Night {[Invocation] TBD!} +{7332} Dark One's Own Luck {[Invocation] Add your charisma bonus to one save type (Fortitude, Reflex or Will) for 24 hours.} +{7333} Entropic Warding {[Invocation] TBD!} +{7334} Leaps and Bounds {[Invocation] TBD!} +{7335} Miasmic Cloud {[Invocation] TBD!} +{7336} See the Unseen {[Invocation] TBD!} +{7337} Spiderwalk {[Invocation] TBD!} // not implemented +{7338} Soulreaving Aura {[Invocation] Deal 1 damage to all creatures at 0 HP or below. If a creatures dies gain temporary Hit Points.} +{7339} All Seeing Eyes {[Invocation] +6 to Search and Spot skills for 24 hours.} +{7340} Charm {[Invocation] TBD!} // not implemented +{7341} Curse of Despair {[Invocation] TBD!} +{7342} Fell Flight {[Invocation] TBD!} // not implemented +{7343} Flee the Scene {[Invocation] TBD!} +{7344} The Dead Walk {[Invocation] TBD!} // not implemented +{7345} Voracious Dispelling {[Invocation] TBD!} // not implemented +{7346} Walk Unseen {[Invocation] TBD!} +{7347} Cold Comfort {[Invocation] TBD!} +{7348} Witchwood Step {[Invocation] TBD!} // not implemented +{7349} Dread Seizure {[Invocation] TBD!} // not implemented +{7350} Ignore the Pyre {[Invocation] TBD!} +{7357} Enervating Shadow {[Invocation] Gain total concealment if not in daylight. Adjacent living creatures get -4 Strength on a failed Fortitude save.} diff --git a/tpdatasrc/tpgamefiles/mes/spell_long_descriptions_ext/spell_compendium_spell_long_descriptions.mes b/tpdatasrc/tpgamefiles/mes/spell_long_descriptions_ext/spell_compendium_spell_long_descriptions.mes index cbf4a77bd..d9bbb361f 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_long_descriptions_ext/spell_compendium_spell_long_descriptions.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_long_descriptions_ext/spell_compendium_spell_long_descriptions.mes @@ -198,7 +198,7 @@ Duration: 1 round} {6074} Sniper's Shot {No range limit to ranged sneak attacks. School: Divination -Casting: 1 swift action [V] +Casting: 1 swift action [V, S] Range: Personal Target: Self Duration: 1 round} @@ -494,6 +494,13 @@ Range: Personal Target: Weapon touched Duration: 1 round} +{6117} Rhino's Rush {Deal double damage on a charge attack. +School: Transmutation +Casting: 1 swift action [V,S] +Range: Personal +Target: You +Duration: 1 round} + {6118} Faith Healing {Heal 8 + level (max. 5) on target that worships same deity. School: Conjuration(Healing) @@ -742,7 +749,7 @@ Range: Touch Target: Armor touched Duration: 1 min/level, Save: None, SR: No} -{6153} Aid Mass {Like spell Aid, but on multiple targets and temp HP are 1d8 + level (max 15). +{6153} Aid, Mass {Like spell Aid, but on multiple targets and temp HP are 1d8 + level (max 15). School: Enchantment(Compulsion)[Mind-Aff.] Casting: 1 action [V,S] Range: Close (25ft. + 5ft./2 lvls) @@ -918,3 +925,108 @@ Casting: 1 action [V,S] Range: 20 ft. Target: One living creature/2 two levels Duration: 10 + 1 round/level(max 40), Save: None, SR: No} + +{6179} Sure Strike {You gain a +1 insight bonus per three caster levels on your next attack roll. +School: Divination +Casting: 1 swift action [V] +Range: Personal +Target: Self +Duration: 1 round} + +{6180} Hunter's Eye {You deal an extra 1d6 points of sneak attack damage per three caster levels. +School: Divination +Casting: 1 swift action [V] +Range: Personal +Target: Self +Duration: 1 round} + +{6181} Tactical Precision {If two affected allies flank the same creature, each gains a +2 insight bonus on melee attack rolls and deals an extra 1d6 points of damage against the flanked creature. +School: Divination[Mind-Affecting] +Casting: 1 action [V,S] +Range: Close (25ft. + 5ft./2 lvls) +Target: One creature/level +Duration: 1 round/level, Save: None, SR: No} + +{6184} Lesser Orb of Acid {Ranged Touch Attack that deals 1d8/two levels (max 5d8) acid damage. +School: Conjuration(Creation)[Acid] +Casting: 1 action [V,S] +Range: Close (25ft. + 5ft./2 lvls) +Target: One creature +Duration: Instantaneous, Save: None, SR: No} + +{6185} Lesser Orb of Cold {Ranged Touch Attack that deals 1d8/two levels (max 5d8) cold damage. +School: Conjuration(Creation)[Cold] +Casting: 1 action [V,S] +Range: Close (25ft. + 5ft./2 lvls) +Target: One creature +Duration: Instantaneous, Save: None, SR: No} + +{6186} Lesser Orb of Electricity {Ranged Touch Attack that deals 1d8/two levels (max 5d8) electricity damage. +School: Conjuration(Creation)[Electricity] +Casting: 1 action [V,S] +Range: Close (25ft. + 5ft./2 lvls) +Target: One creature +Duration: Instantaneous, Save: None, SR: No} + +{6187} Lesser Orb of Fire {Ranged Touch Attack that deals 1d8/two levels (max 5d8) fire damage. +School: Conjuration(Creation)[Fire] +Casting: 1 action [V,S] +Range: Close (25ft. + 5ft./2 lvls) +Target: One creature +Duration: Instantaneous, Save: None, SR: No} + +{6188} Lesser Orb of Sound {Ranged Touch Attack that deals 1d8/two levels (max 5d8) sonic damage. +School: Conjuration(Creation)[Sonic] +Casting: 1 action [V,S] +Range: Close (25ft. + 5ft./2 lvls) +Target: One creature +Duration: Instantaneous, Save: None, SR: No} + +{6196} Orb of Acid {Ranged Touch Attack that deals 1d6/level (max 15d6) acid damage and in addition sickens for 1 round on a failed fortitude save. +School: Conjuration(Creation)[Acid] +Casting: 1 action [V,S] +Range: Close (25ft. + 5ft./2 lvls) +Target: One creature +Duration: Inst., Save: Fortitude partial, SR: No} + +{6197} Orb of Cold {Ranged Touch Attack that deals 1d6/level (max 15d6) cold damage and in addition blinds for 1 round on a failed fortitude save. +School: Conjuration(Creation)[Cold] +Casting: 1 action [V,S] +Range: Close (25ft. + 5ft./2 lvls) +Target: One creature +Duration: Inst., Save: Fortitude partial, SR: No} + +{6198} Orb of Electricity {Ranged Touch Attack that deals 1d6/level (max 15d6) electricity damage and in addition may entangle for 1 round on a failed fortitude save. +School: Conjuration(Creation)[Electricity] +Casting: 1 action [V,S] +Range: Close (25ft. + 5ft./2 lvls) +Target: One creature +Duration: Inst., Save: Fortitude partial, SR: No} + +{6199} Orb of Fire {Ranged Touch Attack that deals 1d6/level (max 15d6) fire damage and in addition dazes for 1 round on a failed fortitude save. +School: Conjuration(Creation)[Fire] +Casting: 1 action [V,S] +Range: Close (25ft. + 5ft./2 lvls) +Target: One creature +Duration: Inst., Save: Fortitude partial, SR: No} + +{6200} Orb of Sound {Ranged Touch Attack that deals 1d6/level (max 15d6) sonic damage and in addition deafens for 1 round on a failed fortitude save. +School: Conjuration(Creation)[Sonic] +Casting: 1 action [V,S] +Range: Close (25ft. + 5ft./2 lvls) +Target: One creature +Duration: Inst., Save: Fortitude partial, SR: No} + +{6201} Icelance {Ranged Attack that deals 3d6 Cold and 3d6 Piercing Damage to target. In addition, target is stunned for 1d4 rounds on a failed fortitude save. +School: Conjuration(Creation) +Casting: 1 action [V,S] +Range: Medium (100ft. + 10ft./level) +Target: One creature +Duration: Inst., Save: Fortitude partial, SR: Yes} + +{6202} Revivify {Restores life to a recently deceased creature (died within 1 round). +School: Conjuration(Healing) +Casting: 1 action [V,S,M] +Range: Touch +Target: Dead creature touched +Duration: Inst., Save: None, SR: No} diff --git a/tpdatasrc/tpgamefiles/mes/spell_long_descriptions_ext/warlock_spell_long_descriptions.mes b/tpdatasrc/tpgamefiles/mes/spell_long_descriptions_ext/warlock_spell_long_descriptions.mes new file mode 100644 index 000000000..8e6c7a375 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spell_long_descriptions_ext/warlock_spell_long_descriptions.mes @@ -0,0 +1,226 @@ +// Warlock Invocation Long Descriptions + +{7300} Eldritch Blast {Ranged touch attack that deals 1d6 damage. Damage increases with Warlock levels. Can be modified by Eldritch Essence Invocations. +School: [Invocation](Blast Shape) +Casting: 1 action [S] +Range: 60ft. +Target: One creature +Duration: Instantaneous, Save: None, SR: Yes} + +{7301} Eldritch Spear {Increases the range of Eldritch Blast. +School: [Invocation](Blast Shape) +Casting: 1 action [S] +Range: 250ft. +Target: One creature +Duration: Instantaneous, Save: None, SR: Yes} + +{7302} Hideous Blow {TBD! +School: [Invocation](Blast Shape) +Casting: 1 action [S] +Range: Touch +Target: One creature +Duration: Instantaneous, Save: None, SR: Yes} + +{7303} Eldritch Chain {Changes Eldritch Blast to a chain. Full damage to the primary target, half damage to secondary targets. A missed ranged attack breaks the chain. +School: [Invocation](Blast Shape) +Casting: 1 action [S] +Range: 60ft. +Target: One primary + one secondary/5 levels +Duration: Instantaneous, Save: None, SR: Yes} + +{7304} Eldritch Cone {Changes Eldritch Blast to a 30-ft. cone. No longer a touch attack and allows a Reflex save. +School: [Invocation](Blast Shape) +Casting: 1 action [S] +Range: 30ft. +Area: Cone-shaped burst +Duration: Instantaneous, Save: Reflex half, SR: Yes} + +{7305} Eldritch Line {Changes Eldritch Blast to a 60-ft. line. No longer a touch attack and allows a Reflex save. +School: [Invocation](Blast Shape) +Casting: 1 action [S] +Range: 60ft. +Area: 60-foot line +Duration: Instantaneous, Save: Reflex half, SR: Yes} + +{7306} Eldritch Doom {Deal Eldritch Blast damage to any number of targets within 20ft. Reflex save for half damage. +School: [Invocation](Blast Shape) +Casting: 1 action [S] +Range: 20ft. +Targets: Any number of targets +Duration: Instantaneous, Save: Reflex half, SR: Yes} + +{7311} Frightful Blast {In addition to the normal Eldritch Blast damage targets are shaken for 1 min. on a failed Will save. Mind-Affecting. +School: [Invocation](Eldritch Essence) +Casting: Free Action [S] +Range: Personal +Effect: Modifies your Eldritch Blast +Duration: Essence Stance} + +{7312} Sickening Blast {In addition to the normal Eldritch Blast damage, living creatures are sickened for 1 min. on a failed Fortitude save. +School: [Invocation](Eldritch Essence) +Casting: Free Action [S] +Range: Personal +Effect: Modifies your Eldritch Blast +Duration: Essence Stance} + +{7313} Beshadowed Blast {In addition to the normal Eldritch Blast damage, living creatures are blinded for 1 round on a failed Fortitude save. +School: [Invocation](Eldritch Essence) +Casting: Free Action [S] +Range: Personal +Effect: Modifies your Eldritch Blast +Duration: Essence Stance} + +{7314} Brimstone Blast {Changes Eldritch Blast damage to fire and targets catch fire on a failed Reflex save for 1 round/5 levels that deals 2d6 fire damage each round. +School: [Invocation](Eldritch Essence) +Casting: Free Action [S] +Range: Personal +Effect: Modifies your Eldritch Blast +Duration: Essence Stance} + +{7315} Hellrime Blast {Changes Eldritch Blast damage to cold damage, targets get a -4 dexterity penalty for 10 minutes on a failed Fortitude save. +School: [Invocation](Eldritch Essence) +Casting: Free Action [S] +Range: Personal +Effect: Modifies your Eldritch Blast +Duration: Essence Stance} + +{7316} Bewitching Blast {In addition to the normal Eldritch Blast damage targets are confused on a failed Will save for 1 round. Mind-Affecting. +School: [Invocation](Eldritch Essence) +Casting: Free Action [S] +Range: Personal +Effect: Modifies your Eldritch Blast +Duration: Essence Stance} + +{7317} Noxious Blast {In addition to the normal Eldritch Blast damage living creatures must make a Fortitude save or be nauseated for 1 minute. +School: [Invocation](Eldritch Essence) +Casting: Free Action [S] +Range: Personal +Effect: Modifies your Eldritch Blast +Duration: Essence Stance} + +{7319} Vitriolic Blast {Changes Eldritch Blast damage to acid and deals 2d6 acid damage each round for 1 round/5 levels. +School: [Invocation](Eldritch Essence) +Casting: Free Action [S] +Range: Personal +Effect: Modifies your Eldritch Blast +Duration: Essence Stance} + +{7320} Hindering Blast {In addition to the normal Eldritch Blast damage living creatures must succeed on a Will save or be slowed for 1 round. +School: [Invocation](Eldritch Essence) +Casting: Free Action [S] +Range: Personal +Effect: Modifies your Eldritch Blast +Duration: Essence Stance} + +{7322} Binding Blast {In addition to the normal Eldritch Blast damage targets must succeed on a Will save or be stunned for 1 round. Mind-Affecting. +School: [Invocation](Eldritch Essence) +Casting: Free Action [S] +Range: Personal +Effect: Modifies your Eldritch Blast +Duration: Essence Stance} + +{7323} Penetrating Blast {Eldritch Blasts gains a +4 bonus on spell penetration checks. Targets must succeed on a Will save or have its spell resistance lowered by 5 for 1 minute. +School: [Invocation](Eldritch Essence) +Casting: Free Action [S] +Range: Personal +Effect: Modifies your Eldritch Blast +Duration: Essence Stance} + +{7330} Beguiling Influence {You gain a +6 bonus on Bluff, Diplomacy, and Intimidate checks. +School: [Invocation] +Casting: 1 action [S] +Range: Personal +Target: You +Duration: 24h, Save: None, SR: No} + +{7331} Breath of the Night {Creates a fog like the spell fog cloud. Creatures inside the fog have concealment. +School: [Invocation] +Casting: 1 action [S] +Range: You +Area: Fog spreads in 20-foot radius +Duration: 1 min., Save: None, SR: No} + +{7332} Dark One's Own Luck {You gain a luck bonus equal to your Charisma bonus to one save type (Fortitude, Reflex or Will). +School: [Invocation] +Casting: 1 action [S] +Range: Personal +Target: You +Duration: 24h, Save: None, SR: No} + +{7333} Entropic Warding {20% chance to deflect incoming range attacks. + +School: [Invocation] +Casting: 1 action [S] +Range: Personal +Target: You +Duration: 1 min/level, Save: None, SR: No} + +{7334} Leaps and Bounds {You gain a +6 bonus on Balance, Jump, and Tumble checks. +School: [Invocation] +Casting: 1 action [S] +Range: Personal +Target: You +Duration: 24h, Save: None, SR: No} + +{7335} Miasmic Cloud {Creates a fog that provides concealment. Creatures that enter the fog (except you) become fatigued on a failed Fort save. +School: [Invocation] +Casting: 1 action [S] +Range: You +Area: Fog spreads in 10-foot radius +Duration: 1 min., Save: Fortitude, SR: Yes} + +{7336} See the Unseen {You can see invisible creatures and objects (as see invisibility). +School: [Invocation] +Casting: 1 action [S] +Range: Personal +Target: You +Duration: 24h, Save: None, SR: No} + +{7338} Soulreaving Aura {Deal 1 damage to all creatures at 0 HP or below. If a creatures dies gain Temporary Hit Points. +School: [Invocation] +Casting: Swift Action [S] +Range: 10 ft. +Area: 10-ft.-radius emanation, centered on you +Duration: Instantaneous, Save: None, SR: Yes} + +{7339} All Seeing Eyes {You gain a +6 bonus on Search and Spot checks. +School: [Invocation] +Casting: 1 action [S] +Range: Personal +Target: You +Duration: 24h, Save: None, SR: No} + +{7341} Curse of Despair {Curse a touched opponent (as Bestow Curse)on a failed Will save. If target saves it still takes a -1 penalty on attack rolls for 1 minute. +School: [Invocation] +Casting: 1 action [S] +Range: Touch +Target: One creature +Duration: perm. or 1 min, Save: Will partial, SR: Yes} + +{7343} Flee the Scence {You can use Dimension Door as a spell-like ability, although the range is limited to close (25 ft. + 5 ft./2 levels) range. +School: [Invocation] +Casting: 1 action [S] +Range: Close (25ft. + 5ft./2 lvls) +Target: Empty location +Duration: Instantaneous, Save: None, SR: No} + +{7346} Walk Unseen {You can use Invisibility (self only). +School: [Invocation] +Casting: 1 action [S] +Range: Personal +Target: You +Duration: 24h, Save: None, SR: No} + +{7350} Ignore the Pyre {You gain resistance equal to your invocation caster level against the energy type of your choice. +School: [Invocation] +Casting: 1 action [S] +Range: Personal +Target: You +Duration: 24h, Save: None, SR: No} + +{7357} Enervating Shadow {Gain total concealment if not in daylight. Adjacent living creatures get -4 Strength on a failed save. +School: [Invocation] +Casting: Swift Action [S] +Range: 5 ft. +Area: 5-ft.-radius emanation, centered on you +Duration: 5 rounds, Save: Fortitude negates, SR: Yes} diff --git a/tpdatasrc/tpgamefiles/mes/spells/dummy_spells_for_python_actions.mes b/tpdatasrc/tpgamefiles/mes/spells/dummy_spells_for_python_actions.mes new file mode 100644 index 000000000..a3cf784f2 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spells/dummy_spells_for_python_actions.mes @@ -0,0 +1,8 @@ +// Dummy Spells for Python Actions + +{3900}{dummy_spell_cone_small} +{3901}{dummy_spell_cone_medium} +{3902}{dummy_spell_cone_large} +{3903}{dummy_spell_line_small} +{3904}{dummy_spell_line_medium} +{3905}{dummy_spell_line_large} diff --git a/tpdatasrc/tpgamefiles/mes/spells/heritage_feats_and_breath_weapons.mes b/tpdatasrc/tpgamefiles/mes/spells/heritage_feats_and_breath_weapons.mes new file mode 100644 index 000000000..bb34f6643 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spells/heritage_feats_and_breath_weapons.mes @@ -0,0 +1,17 @@ +// Spell Enums for Draconic Breath Weapons +// and Draconic + Marshal Auras + +{3231}{Dragon Disciple Cone Breath} +{3232}{Dragon Disciple Line Breath} +{3831}{Marshal Minor Aura} +{3832}{Marshal Major Aura} +{3833}{Marshal Adrenaline Boost} +{3840}{Draconic Aura} +{3841}{Dragon Shaman Cone Breath Small} +{3842}{Dragon Shaman Cone Breath Medium} +{3843}{Dragon Shaman Cone Breath Large} +{3844}{Dragon Shaman Line Breath Small} +{3845}{Dragon Shaman Line Breath Medium} +{3846}{Dragon Shaman Line Breath Large} +{3850}{Draconic Breath Cone} +{3851}{Draconic Breath Line} \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/mes/spells/new_feat_spells.mes b/tpdatasrc/tpgamefiles/mes/spells/new_feat_spells.mes new file mode 100644 index 000000000..639088f13 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spells/new_feat_spells.mes @@ -0,0 +1,4 @@ +// Spell Enums for Bardic Feats + +{3080}{Epic of the Lost King} + diff --git a/tpdatasrc/tpgamefiles/mes/spells/unarmed_feats_spells.mes b/tpdatasrc/tpgamefiles/mes/spells/unarmed_feats_spells.mes new file mode 100644 index 000000000..4749a7c6f --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spells/unarmed_feats_spells.mes @@ -0,0 +1,3 @@ +// Spell Enum for Ki Blast + +{3120}{Ki Blast} diff --git a/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes b/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes index 39e6de638..cd504b5bb 100644 --- a/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes @@ -11,7 +11,7 @@ {3003}{Lawful} {3004}{Chaotic} -; item target +; weapon target {3010}{2} {3011}{Mainhand} {3012}{Offhand} @@ -38,3 +38,20 @@ {3042} {Cold} {3043} {Electricity} {3044} {Fire} + +; weapon and shield target +{3050}{3} +{3051}{Mainhand} +{3052}{Offhand} +{3053}{Shield} + +; save types +{3060}{3} +{3061}{Fortitude} +{3062}{Reflex} +{3063}{Will} + +; Cold Comfort +{3070}{2} +{3071}{Cold} +{3072}{Fire} diff --git a/tpdatasrc/tpgamefiles/mes/stat_ext.mes b/tpdatasrc/tpgamefiles/mes/stat_ext.mes index 3794500c6..e9748e2bc 100644 --- a/tpdatasrc/tpgamefiles/mes/stat_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/stat_ext.mes @@ -67,6 +67,11 @@ {82}{Fochlucan Lyrist} {88}{Ultimate Magus} {89}{Unseen Seer} +{83}{Marshal} +{84}{Dragon Shaman} +{85}{Dragonheart Mage} +{86}{Battle Howler of Gruumsh} +{87}{Fist of the Forest} {300}{Psi Points} // max {301}{Psi Points} // cur @@ -139,6 +144,11 @@ {1080}{Rkvn} {1081}{Ssnj} {1082}{Foch} +{1083}{Mrshl} +{1084}{DrgSh} +{1085}{DrgHrt} +{1086}{BtHwl} +{1087}{FiFo} {1088}{UlMa} {1089}{Unse} @@ -299,6 +309,10 @@ Requirements Feats: Spell Focus (conjuration). Spells: Able to cast lesser planar ally.} +{13026}Warlock{Born of a supernatural bloodline, a warlock seeks to master the perilous magic that suffuses his soul. + +Requirements +Alignment: Any evil and or Chaotic} {13027}Favored Soul{Favored souls cast divine spells by means of an innate connection rather than through laborious training and prayer, so their divine connection is natural rather than learned.} {13031}Stormlord{Stormlords wield thunder and lightning like a warrior wields his sword. They serve their deity through random, spectacular acts of violence. @@ -327,6 +341,37 @@ Bardic knowledge, Speak Druidic, Evasion. Spells: 1st-level arcane and divine spells. Decipher Script 7, Diplomacy 7, Gather Information 7, Perform 13, Sleight of Hand 7 } +{13076}Marshal{Sometimes it is not enough to be a conquering warrior, a champion of all that's right, an experienced sellsword, or an elite foot soldier. Sometimes the circumstances require a solid commander of soldiers and situations. Sometimes the circumstances demand a marshal.} +{13077}Dragon Shaman{Dragon Shamans TBD!} +{13078}Dragonheart Mage{The Dragonheart Mage is perfect for the dedicated spellcaster who wishes to embrace the power of dragon blood while still advancing in magical expertise. + +Requirements +Spellcasting: Ability to spontaneously cast arcance spells. +Skills: Knowledge (arcana) 8 +Feats: Draconic Heritage +} +{13079}Battle Howler of Gruumsh{Battle Howlers of Gruumsh give mortal voice to their god's fury. + +Requirements +Alignment: Any chaotic +Skills: Knowledge (religion) 2 (omitted), Perform 8 +Feats: Cleave, Power Attack +Deity: Must worship Gruumsh +} +{13080}Fist of the Forest{For some among the Guardians of the Green, the pursuit of an animalistic lifestyle is a form of asceticism. A feral disposition seems to come naturally to others. In either case, the result is a powerful defender of nature: the fist of the forest. + +Requirements +Base Attack Bonus: +4 +Skills: Handle Animal 4 (omitted), Survial 4 +Feats: Great Fortitude, Improved Unarmed Strike, Power Attack. +} + +{13082}Unseen Seer{Subterfuge is her business in the same way that death is the assassin's business, and she uses her magic to help her gather other people's secrets while keeping her own. + +Requirements +Skills: Hide 8, Search 8, Sense Motive 4, Spellcraft 4, Spot 8. +Spellcasting: Ability to cast 1st-level arcane spells, including at least two divination spells. +} {13081}Ultimate Magus{Few individuals have as thorough an understanding and mastery of arcane magic as the ultimate magus. diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py index 1ec2d9b82..b437e4e12 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py @@ -1,22 +1,24 @@ from toee import * import char_class_utils +import char_editor +from heritage_feat_utils import getDraconicHeritageColourString ################################################### def GetConditionName(): - return "Dragon Disciple" + return "Dragon Disciple" def GetSpellCasterConditionName(): - return "Dragon Disciple Spellcasting" + return "Dragon Disciple Spellcasting" def GetCategory(): - return "Core 3.5 Ed Prestige Classes" + return "Core 3.5 Ed Prestige Classes" def GetClassDefinitionFlags(): - return CDF_CoreClass + return CDF_CoreClass def GetClassHelpTopic(): - return "TAG_DRAGON_DISCIPLES" + return "TAG_DRAGON_DISCIPLES" classEnum = stat_level_dragon_disciple @@ -24,75 +26,115 @@ def GetClassHelpTopic(): class_feats = { +1: ("Dragon Disciple Natural Armor", "Dragon Disciple Bonus Spell per Day (1)",), +2: ("Dragon Disciple Claws and Bite", "Dragon Disciple Bonus Spell per Day (2)",), +3: ("Dragon Disciple Breath Weapon",), +4: ("Dragon Disciple Bonus Spell per Day (3)",), +5: ("Dragon Disciple Bonus Spell per Day (4)",), +6: ("Dragon Disciple Bonus Spell per Day (5)",), +8: ("Dragon Disciple Bonus Spell per Day (6)",), +9: ("Dragon Disciple Wings", "Dragon Disciple Bonus Spell per Day (7)",), +10: ("Dragon Disciple Dragon Apotheosis",) } class_skills = (skill_alchemy, skill_concentration, skill_craft, skill_diplomacy, skill_escape_artist, skill_gather_information, skill_knowledge_all, skill_listen, skill_profession, skill_search, skill_spellcraft, skill_spot) def IsEnabled(): - return 1 + return 1 def GetHitDieType(): - return 12 + return 12 def GetSkillPtsPerLevel(): - return 2 - + return 2 + def GetBabProgression(): - return base_attack_bonus_type_martial + return base_attack_bonus_type_martial def IsFortSaveFavored(): - return 1 + return 1 def IsRefSaveFavored(): - return 0 + return 0 def IsWillSaveFavored(): - return 1 + return 1 def GetSpellListType(): - return spell_list_type_none # dragon disciples only advance bonus spells + return spell_list_type_none # dragon disciples only advance bonus spells def IsClassSkill(skillEnum): - return char_class_utils.IsClassSkill(class_skills, skillEnum) + return char_class_utils.IsClassSkill(class_skills, skillEnum) def IsClassFeat(featEnum): - return char_class_utils.IsClassFeat(class_feats, featEnum) + return char_class_utils.IsClassFeat(class_feats, featEnum) def GetClassFeats(): - return class_feats + return class_feats def IsAlignmentCompatible( alignment): - return 1 + return 1 def CanCastInnateArcane(obj): #todo: generalize - if obj.stat_level_get(stat_level_bard) > 0: - return 1 - if obj.stat_level_get(stat_level_sorcerer) > 0: - return 1 - return 0 - -def SpeaksDraconic( obj ): - return 1 # languages not implemented in ToEE + if obj.stat_level_get(stat_level_bard) > 0: + return 1 + if obj.stat_level_get(stat_level_sorcerer) > 0: + return 1 + return 0 + +def SpeaksDraconic(obj): + return 1 # languages not implemented in ToEE def KnowledgeArcanaCheck( obj ): - # if (obj.skill_ranks_get(skill_knowledge_arcana) < 8): #knowledge skill not implemented in ToEE - # return 0 - if obj.stat_level_get(stat_level) < 5: # a replacement for checking knowledge arcana - return 0 - return 1 - -def ObjMeetsPrereqs( obj ): - return 0 # WIP - - if not KnowledgeArcanaCheck(obj): - return 0 - if (not obj.has_feat(feat_cleave) ): - return 0 - if (not obj.has_feat(feat_power_attack) ): - return 0 - if (not CanCastInnateArcane(obj)): - return 0 - # if (not obj.has_feat(feat_improved_sunder) ): # sunder not yet implemented - # return 0 - #if (not obj.d20_query('EVIL_OUTSIDER_CONTACTED')): - # return 0 - return 1 \ No newline at end of file + # if (obj.skill_ranks_get(skill_knowledge_arcana) < 8): #knowledge skill not implemented in ToEE + # return 0 + if obj.stat_level_get(stat_level) < 5: # a replacement for checking knowledge arcana + return 0 + return 1 + +def DragonRaceCheck(obj): + #Can't check if character is half-dragon; it does not exist in ToEE + if obj.is_category_type(mc_type_dragon): + return 0 + return 1 + +def ObjMeetsPrereqs(obj): + if not KnowledgeArcanaCheck(obj): + return 0 + elif not CanCastInnateArcane(obj): + return 0 + elif not SpeaksDraconic(obj): + return 0 + #elif DragonRaceCheck: + # return 0 + return 1 + + +# Levelup +def alreadyHasDraconicHeritage(obj): + hasDraconicHeritageFeat = False + for heritage in range(heritage_draconic_black, heritage_draconic_white + 1): + colourString = getDraconicHeritageColourString(heritage) + if char_editor.has_feat("Draconic Heritage {}".format(colourString)): + hasDraconicHeritageFeat = True + break + return True if hasDraconicHeritageFeat else False + +def IsSelectingFeatsOnLevelup(obj): + newLvl = char_editor.stat_level_get(classEnum) + if newLvl == 1 and not alreadyHasDraconicHeritage(obj): + return 1 + return 0 + +def LevelupGetBonusFeats(obj): + newLvl = char_editor.stat_level_get(classEnum) + bonus_feats = [] + if newLvl == 1: + bonus_feats.append("Draconic Heritage") + bonFeatInfo = [] + for ft in bonus_feats: + featInfo = char_editor.FeatInfo(ft) + featInfo.feat_status_flags |= 4 # always pickable + bonFeatInfo.append(featInfo) + char_editor.set_bonus_feats(bonFeatInfo) + return + diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py new file mode 100644 index 000000000..54465e6e6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py @@ -0,0 +1,259 @@ +from toee import * +import char_class_utils +import char_editor +################################################### + +def GetConditionName(): # used by API + return "Warlock" + +# def GetSpellCasterConditionName(): + # return "Wizard Spellcasting" + +def GetCategory(): + return "Complete Arcane" + +def GetClassDefinitionFlags(): + return CDF_BaseClass + +def GetClassHelpTopic(): + return "TAG_WARLOCKS" + +classEnum = stat_level_warlock + +################################################### + +class_feats = { +1: (feat_armor_proficiency_light, feat_simple_weapon_proficiency, "Warlock Eldritch Blast", "Warlock Spell Failure", "Warlock Invocations",), +2: ("Warlock Detect Magic",), +3: ("Warlock Damage Reduction",), +8: ("Warlock Fiendish Resilience",), +} + +class_skills = (skill_bluff, skill_concentration, skill_craft, skill_disguise, skill_intimidate, skill_jump, skill_knowledge_arcana, skill_knowledge_religion, +skill_profession, skill_sense_motive, skill_spellcraft, skill_use_magic_device) #skill_knowledge_planes is not in the game + + +#Spell Level 1+2 = Least Invocations +#Spell Level 3+4 = Lesser Invocations +#Spell Level 5+6 = Greater Invocations +#Spell Level 7+ = Dark Invocations + +# Moved spells (original spell level): +# spell_bewitching_blast (4) +# spell_hindering_blast (4) +# spell_walk_unseen (2); no save anyways +# spell_cold_comfort (2); no save anyways + +spell_list = { + 1: (spell_eldritch_blast, spell_hideous_blow, spell_breath_of_the_night, spell_miasmic_cloud,), + 2: (spell_all_seeing_eyes, spell_beguiling_influence, spell_dark_ones_own_luck, spell_eldritch_spear, spell_frightful_blast, + spell_entropic_warding, spell_leaps_and_bounds, spell_see_the_unseen, spell_sickening_blast, spell_soulreaving_aura, spell_spiderwalk,), + 3: (spell_brimstone_blast, spell_cold_comfort, spell_fell_flight, spell_walk_unseen, spell_witchwood_step,), + 4: (spell_beshadowed_blast, spell_curse_of_despair, spell_dread_seizure, spell_eldritch_chain, spell_flee_the_scene, spell_hellrime_blast, + spell_ignore_the_pyre, spell_the_dead_walk, spell_voracious_dispelling, spell_warlock_charm,), + 5: (spell_bewitching_blast, spell_eldritch_cone, spell_eldritch_line, spell_enervating_shadow, spell_hindering_blast,), + 6: (spell_noxious_blast, spell_penetrating_blast, spell_repelling_blast, spell_vitriolic_blast,), + 7: (spell_binding_blast,), + 8: (spell_eldritch_doom, spell_utterdark_blast,) + #9: () + } + +bonus_feats =["Warlock Energy Resistance"] + +spells_per_day = { +1: (-1, 1, 1), +2: (-1, 1, 1), +3: (-1, 1, 1), +4: (-1, 1, 1), +5: (-1, 1, 1), +6: (-1, 1, 1, 1, 1), +7: (-1, 1, 1, 1, 1), +8: (-1, 1, 1, 1, 1), +9: (-1, 1, 1, 1, 1), +10: (-1, 1, 1, 1, 1), +11: (-1, 1, 1, 1, 1, 1, 1), +12: (-1, 1, 1, 1, 1, 1, 1), +13: (-1, 1, 1, 1, 1, 1, 1), +14: (-1, 1, 1, 1, 1, 1, 1), +15: (-1, 1, 1, 1, 1, 1, 1), +16: (-1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +17: (-1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +18: (-1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +19: (-1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +20: (-1, 1, 1, 1, 1, 1, 1, 1, 1, 1) +#lvl 0 1 2 3 4 5 6 7 8 9 +} + +def IsEnabled(): + return 1 + +def GetHitDieType(): + return 6 + +def GetSkillPtsPerLevel(): + return 2 + +def GetBabProgression(): + return base_attack_bonus_type_semi_martial + +def IsFortSaveFavored(): + return 0 + +def IsRefSaveFavored(): + return 0 + +def IsWillSaveFavored(): + return 1 + +# Spell casting +def GetSpellListType(): + return spell_list_type_special + +def GetSpellList(): + return spell_list + +def GetSpellSourceType(): + return spell_source_type_arcane + +def GetSpellReadyingType(): + return spell_readying_at_will + +def GetSpellsPerDay(): + return spells_per_day + +def GetCasterLevels(): + return range(1, 21) + +def GetSpellDeterminingStat(): + return stat_charisma + +def IsClassSkill(skillEnum): + return char_class_utils.IsClassSkill(class_skills, skillEnum) + +def IsClassFeat(featEnum): + return char_class_utils.IsClassFeat(class_feats, featEnum) + +def GetClassFeats(): + return class_feats + + +def IsAlignmentCompatible(alignment): + if (alignment & ALIGNMENT_EVIL): + return 1 + elif (alignment & ALIGNMENT_CHAOTIC): + return 1 + return 0 + +def ObjMeetsPrereqs(obj): + return 1 + +def GetDeityClass(): + return stat_level_wizard + +## Levelup callbacks + +def IsSelectingFeatsOnLevelup(obj): + newLevel = obj.stat_level_get(classEnum) + 1 + if newLevel == 10: + return 1 + ###### Workaround for second Energy Resistance Feat ###### + #Warlock would gain 2 energy resistances at level 10 + #But I can only grant one bonus feat + #This should be handled as class feature + #Using this Workaround around until I can use class features + elif newLevel == 11: + return 1 + ##### Workaround end ####ä + return 0 + +def LevelupGetBonusFeats(obj): + bonFeatInfo = [] + for ft in bonus_feats: + bonFeatInfo.append(char_editor.FeatInfo(ft)) + char_editor.set_bonus_feats(bonFeatInfo) + return 0 + +def IsSelectingSpellsOnLevelup(obj): + newLevel = obj.stat_level_get(classEnum) + 1 + newInvocation = [1, 2, 4, 6, 8, 10, 11, 13, 15, 16, 18, 20] + if newLevel in newInvocation: + return 1 + return 0 + +def getMaxSpellLevel(newLevel): + if newLevel < 6: + return 2 #Least Invocations + elif newLevel < 11: + return 4 #Lesser Invocations + elif newLevel < 16: + return 6 #Greater Invocations + return 9 #Dark Invocations + +def addEldritchBlast(): + eldritchBlastEnum = [] + eldritchBlast = char_editor.KnownSpellInfo(spell_eldritch_blast, 3, classEnum) + eldritchBlastEnum.append(eldritchBlast) + char_editor.append_spell_enums(eldritchBlastEnum) + return 0 + +def replaceInvocation(obj, maxReplaceableSpellLvl): + #Limiting this for strict level up atm, this was also done in FvS, I assume this has reasons :) + #At the moment this is limited to replace only Invocations of the same spell level + #But you should be able to replace any lower level invocation with a new one + #Example: At level 11 I should be able to swap a least for a lesser invocation + #This function would also be needed for the ToB Maneuvers. + if char_editor.get_class_code() == classEnum: + knownSpells = char_editor.get_known_class_spells(obj, classEnum) + for label in range(1, maxReplaceableSpellLvl + 1): + knownSpells.append(char_editor.KnownSpellInfo(spell_label_level_0 + label, 0, classEnum)) + for idx in range(0, len(knownSpells)): + spellEnum = knownSpells[idx].spell_enum + if spell_vacant <= spellEnum <= spell_label_level_9: + continue + if spell_new_slot_lvl_0 <= spellEnum <= spell_new_slot_lvl_9: + continue + if char_editor.get_spell_level(spellEnum, classEnum) <= maxReplaceableSpellLvl: + knownSpells[idx].spell_status = 1 + knownSpells.sort() + char_editor.append_spell_enums(knownSpells) + return 0 + +def InitSpellSelection(obj, classLvlNew = -1, classLvlIncrement = 1): + newLevel = char_editor.stat_level_get(classEnum) + maxSpellLvl = getMaxSpellLevel(newLevel) + #Get availible spells + availibleSpells = char_editor.get_learnable_spells(obj, classEnum, maxSpellLvl) + #Add spell level labels + for label in range(1, maxSpellLvl + 1): + availibleSpells.append(char_editor.KnownSpellInfo(spell_label_level_0 + label, 0, classEnum)) + #Fill spell list + availibleSpells.sort() + char_editor.append_available_spells(availibleSpells) + #Add Eldritch Blast as a known spell if first level of Warlock + #I'll add it here and not in finalize to avoid that Eldritch Blast + #Is accidently taken, as it is an automatically known spell. + if newLevel == 1: + addEldritchBlast() + #Add Spell slot + vacantSlotEnum = [] + vacant_slot = char_editor.KnownSpellInfo(spell_vacant, 3, classEnum) # sets it to spell level -1 + vacantSlotEnum.append(vacant_slot) + char_editor.append_spell_enums(vacantSlotEnum) + #Handling Invocation Replacements + #Replace a known Invocation when you learn a new type of Invocation(Lesser, Greater, Dark) + if newLevel in [6, 11, 16]: + maxReplaceableSpellLvl = maxSpellLvl - 2 + replaceInvocation(obj, maxReplaceableSpellLvl) + return 0 + +def LevelupCheckSpells(obj): + spell_enums = char_editor.get_spell_enums() + for spellInfo in spell_enums: + if spellInfo.spell_enum == spell_vacant: + return 0 + return 1 + +def LevelupSpellsFinalize(obj, classLvlNew = -1): + spEnums = char_editor.get_spell_enums() + char_editor.spell_known_add(spEnums) # internally takes care of duplicates and the labels/vacant slots + return 0 diff --git a/tpdatasrc/tpgamefiles/rules/d20_actions/action02302_dragon_disciple_breath_attack.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action02302_dragon_disciple_breath_attack.py new file mode 100644 index 000000000..5c099a95a --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action02302_dragon_disciple_breath_attack.py @@ -0,0 +1,28 @@ +from toee import * +import tpactions +import tpdp + + +def GetActionName(): + return "Dragon Disciple Breath Attack" + + +def GetActionDefinitionFlags(): + return D20ADF_MagicEffectTargeting | D20ADF_QueryForAoO | D20ADF_TriggersCombat + + +def GetTargetingClassification(): + return D20TC_CastSpell + + +def GetActionCostType(): + return D20ACT_Standard_Action + + +def AddToSequence(d20action, action_seq, tb_status): + if d20action.performer.d20_query(Q_Prone): + d20aGetup = d20action + d20aGetup.action_type = tpdp.D20ActionType.StandUp + action_seq.add_action(d20aGetup) + action_seq.add_action(d20action) + return AEC_OK diff --git a/tpdatasrc/tpgamefiles/rules/d20_actions/action02303_dragon_disciple_toogle_fly.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action02303_dragon_disciple_toogle_fly.py new file mode 100644 index 000000000..d4821d8fb --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action02303_dragon_disciple_toogle_fly.py @@ -0,0 +1,18 @@ +from toee import * +import tpactions + +def GetActionName(): + return "Dragon Disciple Toogle Fly" + +def GetActionDefinitionFlags(): + return D20ADF_None + +def GetTargetingClassification(): + return D20TC_Target0 + +def GetActionCostType(): + return D20ACT_NULL + +def AddToSequence(d20action, action_seq, tb_status): + action_seq.add_action(d20action) + return AEC_OK \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/d20_actions/action03301_reset_eldritch_blast.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action03301_reset_eldritch_blast.py new file mode 100644 index 000000000..bbe0bdf2f --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action03301_reset_eldritch_blast.py @@ -0,0 +1,18 @@ +from toee import * +import tpactions + +def GetActionName(): + return "Reset Eldritch Blast" + +def GetActionDefinitionFlags(): + return D20ADF_None + +def GetTargetingClassification(): + return D20TC_Target0 + +def GetActionCostType(): + return D20ACT_NULL + +def AddToSequence(d20action, action_seq, tb_status): + action_seq.add_action(d20action) + return AEC_OK \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/d20_actions/action03302_detect_magic_sla.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action03302_detect_magic_sla.py new file mode 100644 index 000000000..729a7f5fe --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action03302_detect_magic_sla.py @@ -0,0 +1,27 @@ +from toee import * +import tpactions + + +def GetActionName(): + return "Warlock Detect Magic SLA" + + +def GetActionDefinitionFlags(): + return D20ADF_MagicEffectTargeting | D20ADF_Breaks_Concentration | D20ADF_QueryForAoO + + +def GetTargetingClassification(): + return D20TC_CastSpell + + +def GetActionCostType(): + return D20ACT_Standard_Action + + +def AddToSequence(d20action, action_seq, tb_status): + action_seq.add_action(d20action) + return AEC_OK + +#def ModifyPicker( picker_args ): +# picker_args.set_mode_target_flag(tpactions.ModeTarget.PickOrigin) +# return 1 diff --git a/tpdatasrc/tpgamefiles/rules/d20_actions/action03303_fiendish_resilience.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action03303_fiendish_resilience.py new file mode 100644 index 000000000..87bd2882c --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action03303_fiendish_resilience.py @@ -0,0 +1,18 @@ +from toee import * +import tpactions + +def GetActionName(): + return "Warlock Fiendish Resilience" + +def GetActionDefinitionFlags(): + return D20ADF_None + +def GetTargetingClassification(): + return D20TC_Target0 + +def GetActionCostType(): + return D20ACT_NULL + +def AddToSequence(d20action, action_seq, tb_status): + action_seq.add_action(d20action) + return AEC_OK \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/d20_actions/action03310_extinguish_flames .py b/tpdatasrc/tpgamefiles/rules/d20_actions/action03310_extinguish_flames .py new file mode 100644 index 000000000..9342277c8 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action03310_extinguish_flames .py @@ -0,0 +1,18 @@ +from toee import * +import tpactions + +def GetActionName(): + return "Extinguish Flames" + +def GetActionDefinitionFlags(): + return D20ADF_TriggersAoO | D20ADF_Breaks_Concentration + +def GetTargetingClassification(): + return D20TC_Target0 + +def GetActionCostType(): + return D20ACT_Full_Round_Action + +def AddToSequence(d20action, action_seq, tb_status): + action_seq.add_action(d20action) + return AEC_OK \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/draconic heritage black.txt b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage black.txt new file mode 100644 index 000000000..13780ae13 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage black.txt @@ -0,0 +1,6 @@ +name: Draconic Heritage Black +flags: 4194304 +prereqs: +description: You have a greater connection with your draconic bloodline than others of your kind. +prereq descr: Sorcercer Level 1 +parent: Draconic Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/draconic heritage blue.txt b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage blue.txt new file mode 100644 index 000000000..f9896d6fa --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage blue.txt @@ -0,0 +1,6 @@ +name: Draconic Heritage Blue +flags: 4194304 +prereqs: +description: You have a greater connection with your draconic bloodline than others of your kind. +prereq descr: Sorcercer Level 1 +parent: Draconic Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/draconic heritage brass.txt b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage brass.txt new file mode 100644 index 000000000..32d1dd615 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage brass.txt @@ -0,0 +1,6 @@ +name: Draconic Heritage Brass +flags: 4194304 +prereqs: +description: You have a greater connection with your draconic bloodline than others of your kind. +prereq descr: Sorcercer Level 1 +parent: Draconic Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/draconic heritage bronze.txt b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage bronze.txt new file mode 100644 index 000000000..9ecc609a4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage bronze.txt @@ -0,0 +1,6 @@ +name: Draconic Heritage Bronze +flags: 4194304 +prereqs: +description: You have a greater connection with your draconic bloodline than others of your kind. +prereq descr: Sorcercer Level 1 +parent: Draconic Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/draconic heritage copper.txt b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage copper.txt new file mode 100644 index 000000000..9851e3778 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage copper.txt @@ -0,0 +1,6 @@ +name: Draconic Heritage Copper +flags: 4194304 +prereqs: +description: You have a greater connection with your draconic bloodline than others of your kind. +prereq descr: Sorcercer Level 1 +parent: Draconic Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/draconic heritage gold.txt b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage gold.txt new file mode 100644 index 000000000..f11cef093 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage gold.txt @@ -0,0 +1,6 @@ +name: Draconic Heritage Gold +flags: 4194304 +prereqs: +description: You have a greater connection with your draconic bloodline than others of your kind. +prereq descr: Sorcercer Level 1 +parent: Draconic Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/draconic heritage green.txt b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage green.txt new file mode 100644 index 000000000..25d146ad0 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage green.txt @@ -0,0 +1,6 @@ +name: Draconic Heritage Green +flags: 4194304 +prereqs: +description: You have a greater connection with your draconic bloodline than others of your kind. +prereq descr: Sorcercer Level 1 +parent: Draconic Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/draconic heritage red.txt b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage red.txt new file mode 100644 index 000000000..31a0e5b1e --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage red.txt @@ -0,0 +1,6 @@ +name: Draconic Heritage Red +flags: 4194304 +prereqs: +description: You have a greater connection with your draconic bloodline than others of your kind. +prereq descr: Sorcercer Level 1 +parent: Draconic Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/draconic heritage silver.txt b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage silver.txt new file mode 100644 index 000000000..b9a6e8789 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage silver.txt @@ -0,0 +1,6 @@ +name: Draconic Heritage Silver +flags: 4194304 +prereqs: +description: You have a greater connection with your draconic bloodline than others of your kind. +prereq descr: Sorcercer Level 1 +parent: Draconic Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/draconic heritage white.txt b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage white.txt new file mode 100644 index 000000000..7cb3e021d --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage white.txt @@ -0,0 +1,6 @@ +name: Draconic Heritage White +flags: 4194304 +prereqs: +description: You have a greater connection with your draconic bloodline than others of your kind. +prereq descr: Sorcercer Level 1 +parent: Draconic Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/draconic heritage.txt b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage.txt new file mode 100644 index 000000000..3be52eac6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/draconic heritage.txt @@ -0,0 +1,5 @@ +name: Draconic Heritage +flags: 13107200 +prereqs: +description: You have a greater connection with your draconic bloodline than others of your kind. +prereq descr: Sorcercer Level 1; automatically granted to Dragon Disciple and Dragon Shaman diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (1).txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (1).txt new file mode 100644 index 000000000..d9728e8ec --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (1).txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Bonus Spell per Day (1) +flags: 8 +prereqs: +description: Dragon Disciples gain bonus spells as they gain levels in this prestige class, as if from having a high ability score. The bonus spell is granted to the highest Arcane Casting Class and is applied to the highest spell level. +prereq descr: Dragon Disciple level 1. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (2).txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (2).txt new file mode 100644 index 000000000..458cda6d8 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (2).txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Bonus Spell per Day (2) +flags: 8 +prereqs: +description: Dragon Disciples gain bonus spells as they gain levels in this prestige class, as if from having a high ability score. The bonus spell is granted to the highest Arcane Casting Class and is applied to the highest spell level. +prereq descr: Dragon Disciple level 2. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (3).txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (3).txt new file mode 100644 index 000000000..61d10dd18 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (3).txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Bonus Spell per Day (3) +flags: 8 +prereqs: +description: Dragon Disciples gain bonus spells as they gain levels in this prestige class, as if from having a high ability score. The bonus spell is granted to the highest Arcane Casting Class and is applied to the highest spell level. +prereq descr: Dragon Disciple level 4. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (4).txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (4).txt new file mode 100644 index 000000000..3b1b02491 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (4).txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Bonus Spell per Day (4) +flags: 8 +prereqs: +description: Dragon Disciples gain bonus spells as they gain levels in this prestige class, as if from having a high ability score. The bonus spell is granted to the highest Arcane Casting Class and is applied to the highest spell level. +prereq descr: Dragon Disciple level 5. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (5).txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (5).txt new file mode 100644 index 000000000..e605fb0c5 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (5).txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Bonus Spell per Day (5) +flags: 8 +prereqs: +description: Dragon Disciples gain bonus spells as they gain levels in this prestige class, as if from having a high ability score. The bonus spell is granted to the highest Arcane Casting Class and is applied to the highest spell level. +prereq descr: Dragon Disciple level 6. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (6).txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (6).txt new file mode 100644 index 000000000..0bb3d6926 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (6).txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Bonus Spell per Day (6) +flags: 8 +prereqs: +description: Dragon Disciples gain bonus spells as they gain levels in this prestige class, as if from having a high ability score. The bonus spell is granted to the highest Arcane Casting Class and is applied to the highest spell level. +prereq descr: Dragon Disciple level 8. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (7).txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (7).txt new file mode 100644 index 000000000..5e08d3ece --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (7).txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Bonus Spell per Day (7) +flags: 8 +prereqs: +description: Dragon Disciples gain bonus spells as they gain levels in this prestige class, as if from having a high ability score. The bonus spell is granted to the highest Arcane Casting Class and is applied to the highest spell level. +prereq descr: Dragon Disciple level 9. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple breath weapon.txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple breath weapon.txt new file mode 100644 index 000000000..0dc16a094 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple breath weapon.txt @@ -0,0 +1,22 @@ +name: Dragon Disciple Breath Weapon +flags: 8 +prereqs: +description: At 3rd level, a dragon disciple gains a minor breath weapon. The type and shape depend on the dragon variety whose heritage he enjoys (see below). Regardless of the ancestor, the breath weapon deals 2d8 points of damage of the appropriate energy type. + +At 7th level, the damage increases to 4d8, and when a disciple attains dragon apotheosis at 10th level it reaches its full power at 6d8. Regardless of its strength, the breath weapon can be used only once per day. Use all the rules for dragon breath weapons except as specified here. + +The DC of the breath weapon is 10 + class level + Con modifier. + +Black Line of acid +Blue Line of lightning +Green Cone of corrosive gas (acid) +Red Cone of fire +White Cone of cold +Brass Line of fire +Bronze Line of lightning +Copper Line of acid +Gold Cone of fire +Silver Cone of cold + +A line-shaped breath weapon is 5 feet high, 5 feet wide, and 60 feet long. A cone-shaped breath weapon is 30 feet long. +prereq descr: Dragon Disciple level 3. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple claws and bite.txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple claws and bite.txt new file mode 100644 index 000000000..22251ea1e --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple claws and bite.txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Claws and Bite +flags: 8 +prereqs: +description: At 2nd level, a dragon disciple gains claw and bite attacks if he does not already have them. A dragon disciple is considered proficient with these attacks. When making a full attack, a dragon disciple uses his full base attack bonus with his bite attack but takes a -5 penalty on claw attacks. The Multiattack feat reduces this penalty to only -2. +prereq descr: Dragon Disciple level 2. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple dragon apotheosis.txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple dragon apotheosis.txt new file mode 100644 index 000000000..44dc4aa3c --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple dragon apotheosis.txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Dragon Apotheosis +flags: 8 +prereqs: +description: At 10th level, a dragon disciple takes on the half-dragon template. His breath weapon reaches full strength (as noted above), and he gains +4 to Strength and +2 to Charisma. His natural armor bonus increases to +4, and he acquires low-light vision, 60-foot darkvision, immunity to sleep and paralysis effects, and immunity to the energy type used by his breath weapon. +prereq descr: Dragon Disciple level 5. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage.txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage.txt new file mode 100644 index 000000000..9a5fef308 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage.txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Heritage +flags: 8 +prereqs: +description: The player chooses a dragon variety when taking the first level in this prestige class. +prereq descr: Dragon Disciple level 1 \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple natural armor.txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple natural armor.txt index cd680fecb..c5e7d45a3 100644 --- a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple natural armor.txt +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple natural armor.txt @@ -1,5 +1,5 @@ name: Dragon Disciple Natural Armor flags: 8 prereqs: -description: At 1st, 4th, and 7th level, a dragon disciple gains a progressive +1 increase to the character's existing natural armor (if any). As his skin thickens, a dragon disciple takes on more and more of his progenitor’s physical aspect. +description: At 1st, 4th, and 7th level, a dragon disciple gains a progressive +1 increase to the character's existing natural armor (if any). As his skin thickens, a dragon disciple takes on more and more of his progenitor's physical aspect. prereq descr: Dragon Disciple level 1. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple wings.txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple wings.txt new file mode 100644 index 000000000..5009f2cd5 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple wings.txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Wings +flags: 8 +prereqs: +description: TBD! +prereq descr: Dragon Disciple level 9 \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/extra exhalation.txt b/tpdatasrc/tpgamefiles/rules/feats/extra exhalation.txt new file mode 100644 index 000000000..6b6113083 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/extra exhalation.txt @@ -0,0 +1,5 @@ +name: Extra Exhalation +flags: 12582913 +prereqs: +description: You can use your Breath Weapon one more time per day than normal. Special: You can take this feat multiple times. Each time you take it, you can breath one additional time per day. +prereq descr: Limited Breath Weapon use per day diff --git a/tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt b/tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt new file mode 100644 index 000000000..11a915911 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt @@ -0,0 +1,4 @@ +name: Greater Spell Focus (Invocation) +flags: 12582912 +prereqs: +description: Add +1 to the Difficulty Class for all saving throws against Invocation spells. diff --git a/tpdatasrc/tpgamefiles/rules/feats/spell focus invocation.txt b/tpdatasrc/tpgamefiles/rules/feats/spell focus invocation.txt new file mode 100644 index 000000000..ddc8e43db --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/spell focus invocation.txt @@ -0,0 +1,4 @@ +name: Spell Focus (Invocation) +flags: 4194304 +prereqs: 33 1 +description: Add +1 to the Difficulty Class for all saving throws against Invocation spells. diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock damage reduction.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock damage reduction.txt new file mode 100644 index 000000000..6392c8340 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock damage reduction.txt @@ -0,0 +1,5 @@ +name: Warlock Damage Reduction +flags: 8 +prereqs: +description: Fortified by the supernatural power flowing in his body, a warlock becomes resistant to physical attacks at 3rd level and above, gaining damage reduction 1/cold iron. At 7th level and every four levels thereafter, a warlock's damage reduction improves by 1 to a max DR5/Cold Iron at level 19. +prereq descr: Warlock Level 3. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock detect magic.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock detect magic.txt new file mode 100644 index 000000000..b2137e37c --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock detect magic.txt @@ -0,0 +1,5 @@ +name: Warlock Detect Magic +flags: 8 +prereqs: +description: Beginning at 2nd level, a warlock can use detect magic as the spell at will. His caster level equals his class level. +prereq descr: Warlock Level 2. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock eldritch blast.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock eldritch blast.txt new file mode 100644 index 000000000..f03699fb5 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock eldritch blast.txt @@ -0,0 +1,10 @@ +name: Warlock Eldritch Blast +flags: 8 +prereqs: +description: The first ability a warlock learns is eldritch blast. A warlock attacks his foes with eldritch power, using baleful magical energy to deal damage and sometimes impart other debilitating effects. + +An eldritch blast is a ray with a range of 60 feet. It is a ranged touch attack that affects a single target, allowing no saving throw. An eldritch blast deals 1d6 points of damage at 1st level and increases in power as the warlock rises in level. An eldritch blast has a spell level equal to half of the warlock level (min 1, max 9 at 18th level). If you apply a blast shape or eldritch essence invocation to your eldritch blast, your eldritch blast uses the highest applicable spell level. + +An eldritch blast is subject to spell resistance, although the Spell Penetration feat and other effects that improve caster level checks to overcome spell resistance also apply to eldritch blast. An eldritch blast deals half damage to objects. Metamagic feats cannot improve a warlock's eldritch blast (because it is a spell-like ability, not a spell). However, the feat Ability Focus (eldritch blast) increases the DC for all saving throws (if any) associated with a warlock's eldritch blast by 2. + +A warlock can use eldritch blast at will. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance acid.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance acid.txt new file mode 100644 index 000000000..7644011b5 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance acid.txt @@ -0,0 +1,6 @@ +name: Warlock Energy Resistance - Acid +flags: 256 +prereqs: +description: At 10th level and higher, a warlock has resistance 5 against any two of the following energy types: acid, cold, electricity, fire, and sonic. Once the types are chosen, this energy resistance cannot be changed. At 20th level, a warlock gains resistance 10 against the two selected types of energy. +prereq descr: Warlock Level 10 +parent: Warlock Energy Resistance diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance cold.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance cold.txt new file mode 100644 index 000000000..f1444c8ac --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance cold.txt @@ -0,0 +1,6 @@ +name: Warlock Energy Resistance - Cold +flags: 256 +prereqs: +description: At 10th level and higher, a warlock has resistance 5 against any two of the following energy types: acid, cold, electricity, fire, and sonic. Once the types are chosen, this energy resistance cannot be changed. At 20th level, a warlock gains resistance 10 against the two selected types of energy. +prereq descr: Warlock Level 10 +parent: Warlock Energy Resistance diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance electricity.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance electricity.txt new file mode 100644 index 000000000..dda5601fb --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance electricity.txt @@ -0,0 +1,6 @@ +name: Warlock Energy Resistance - Electricity +flags: 256 +prereqs: +description: At 10th level and higher, a warlock has resistance 5 against any two of the following energy types: acid, cold, electricity, fire, and sonic. Once the types are chosen, this energy resistance cannot be changed. At 20th level, a warlock gains resistance 10 against the two selected types of energy. +prereq descr: Warlock Level 10 +parent: Warlock Energy Resistance diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance fire.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance fire.txt new file mode 100644 index 000000000..1eaf6e71f --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance fire.txt @@ -0,0 +1,6 @@ +name: Warlock Energy Resistance - Fire +flags: 256 +prereqs: +description: At 10th level and higher, a warlock has resistance 5 against any two of the following energy types: acid, cold, electricity, fire, and sonic. Once the types are chosen, this energy resistance cannot be changed. At 20th level, a warlock gains resistance 10 against the two selected types of energy. +prereq descr: Warlock Level 10 +parent: Warlock Energy Resistance diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance sonic.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance sonic.txt new file mode 100644 index 000000000..d71c7bc4d --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance sonic.txt @@ -0,0 +1,6 @@ +name: Warlock Energy Resistance - Sonic +flags: 256 +prereqs: +description: At 10th level and higher, a warlock has resistance 5 against any two of the following energy types: acid, cold, electricity, fire, and sonic. Once the types are chosen, this energy resistance cannot be changed. At 20th level, a warlock gains resistance 10 against the two selected types of energy. +prereq descr: Warlock Level 10 +parent: Warlock Energy Resistance diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance.txt new file mode 100644 index 000000000..91e0f1f41 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance.txt @@ -0,0 +1,5 @@ +name: Warlock Energy Resistance +flags: 524288 +prereqs: 33 10 +description: At 10th level and higher, a warlock has resistance 5 against any two of the following energy types: acid, cold, electricity, fire, and sonic. Once the types are chosen, this energy resistance cannot be changed. At 20th level, a warlock gains resistance 10 against the two selected types of energy. +prereq descr: Warlock Level 10 diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock fiendish resilience.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock fiendish resilience.txt new file mode 100644 index 000000000..e9869a596 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock fiendish resilience.txt @@ -0,0 +1,6 @@ +name: Warlock Fiendish Resilience +flags: 8 +prereqs: +description: Beginning at 8th level, a warlock knows the trick of fiendish resilience. Once per day, as a free action, he can enter a state that lasts for 2 minutes. While in this state, the warlock gains fast healing 1. +At 13th level, a warlock's fiendish resilience improves. When in his fiendish resilience state, he gains fast healing 2 instead. At 18th level, a warlock's fiendish resilience improves to fast healing 5. +prereq descr: Warlock Level 8. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock invocations.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock invocations.txt new file mode 100644 index 000000000..35bcea4af --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock invocations.txt @@ -0,0 +1,4 @@ +name: Warlock Invocations +flags: 8 +prereqs: +description: When the Warlock gains new levels, he can choose new Invocations from his Invocations List. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/warlock spell failure.txt b/tpdatasrc/tpgamefiles/rules/feats/warlock spell failure.txt new file mode 100644 index 000000000..f4c7ae834 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/warlock spell failure.txt @@ -0,0 +1,5 @@ +name: Warlock Spell Failure +flags: 8 +prereqs: +description: A warlock can use any of his invocations while wearing light armor without incurring the normal arcane spell failure chance. However, like arcane spellcasters, a warlock wearing medium or heavy armor or using a shield incurs a chance of arcane spell failure (all invocations, including eldritch blast, have a somatic component). A multiclass warlock still incurs the normal arcane spell failure chance for arcane spells received from levels in other classes. +prereq descr: Warlock Level 1. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/indicators/all_seeing_eyes.txt b/tpdatasrc/tpgamefiles/rules/indicators/all_seeing_eyes.txt new file mode 100644 index 000000000..83cf56968 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/all_seeing_eyes.txt @@ -0,0 +1,5 @@ +ID_string: ALL_SEEING_EYES +effect_type: 0 +texture_file: art\interface\player_conditions\buffs\Spell Clairvoyance.tga +help_topic: TAG_SPELLS_ALL_SEEING_EYES +tooltip_base_text: All Seeing Eyes diff --git a/tpdatasrc/tpgamefiles/rules/indicators/beguiling_influence.txt b/tpdatasrc/tpgamefiles/rules/indicators/beguiling_influence.txt new file mode 100644 index 000000000..a98060836 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/beguiling_influence.txt @@ -0,0 +1,5 @@ +ID_string: BEGUILING_INFLUENCE +effect_type: 0 +texture_file: art\interface\player_conditions\buffs\Spell Beguiling Influence.tga +help_topic: TAG_SPELLS_BEGUILING_INFLUENCE +tooltip_base_text: Beguiling Influence diff --git a/tpdatasrc/tpgamefiles/rules/indicators/breath_of_the_night.txt b/tpdatasrc/tpgamefiles/rules/indicators/breath_of_the_night.txt new file mode 100644 index 000000000..736932d8a --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/breath_of_the_night.txt @@ -0,0 +1,5 @@ +ID_string: BREATH_OF_THE_NIGHT +effect_type: 1 +texture_file: art\interface\player_conditions\ailments\Spell Breath of the Night.tga +help_topic: TAG_SPELLS_BREATH_OF_THE_NIGHT +tooltip_base_text: Breath of the Night diff --git a/tpdatasrc/tpgamefiles/rules/indicators/brimstone_blast.txt b/tpdatasrc/tpgamefiles/rules/indicators/brimstone_blast.txt new file mode 100644 index 000000000..3b5757b18 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/brimstone_blast.txt @@ -0,0 +1,5 @@ +ID_string: BRIMSTONE_BLAST +effect_type: 1 +texture_file: art\interface\player_conditions\ailments\Spell Heat Metal.tga +help_topic: TAG_SPELLS_BRIMSTONE_BLAST +tooltip_base_text: Brimstone Blast diff --git a/tpdatasrc/tpgamefiles/rules/indicators/cold_comfort.txt b/tpdatasrc/tpgamefiles/rules/indicators/cold_comfort.txt new file mode 100644 index 000000000..1c2c0ecd3 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/cold_comfort.txt @@ -0,0 +1,5 @@ +ID_string: COLD_COMFORT +effect_type: 0 +texture_file: art\interface\player_conditions\buffs\Spell Endure Elements.tga +help_topic: TAG_SPELLS_COLD_COMFORT +tooltip_base_text: Cold Comfort diff --git a/tpdatasrc/tpgamefiles/rules/indicators/cold_comfort_aura.txt b/tpdatasrc/tpgamefiles/rules/indicators/cold_comfort_aura.txt new file mode 100644 index 000000000..02f06612c --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/cold_comfort_aura.txt @@ -0,0 +1,5 @@ +ID_string: COLD_COMFORT_AURA +effect_type: 0 +texture_file: art\interface\player_conditions\buffs\Spell Endure Elements.tga +help_topic: TAG_SPELLS_COLD_COMFORT +tooltip_base_text: Cold Comfort Aura diff --git a/tpdatasrc/tpgamefiles/rules/indicators/conviction_mass.txt b/tpdatasrc/tpgamefiles/rules/indicators/conviction_mass.txt new file mode 100644 index 000000000..a2aced672 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/conviction_mass.txt @@ -0,0 +1,5 @@ +ID_string: CONVICTION,_MASS +effect_type: 0 +texture_file: art\interface\player_conditions\buffs\spell heroism.tga +help_topic: TAG_SPELLS_CONVICTION,_MASS +tooltip_base_text: Conviction, Mass diff --git a/tpdatasrc/tpgamefiles/rules/indicators/curse_of_despair.txt b/tpdatasrc/tpgamefiles/rules/indicators/curse_of_despair.txt new file mode 100644 index 000000000..d07e21695 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/curse_of_despair.txt @@ -0,0 +1,5 @@ +ID_string: CURSE_OF_DESPAIR +effect_type: 1 +texture_file: art\interface\player_conditions\ailments\Spell Cursed.tga +help_topic: TAG_SPELLS_CURSE_OF_DESPAIR +tooltip_base_text: Curse of Despair diff --git a/tpdatasrc/tpgamefiles/rules/indicators/curse_of_ill_fortune_mass.txt b/tpdatasrc/tpgamefiles/rules/indicators/curse_of_ill_fortune_mass.txt new file mode 100644 index 000000000..37a4f0dcd --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/curse_of_ill_fortune_mass.txt @@ -0,0 +1,5 @@ +ID_string: CURSE_OF_ILL_FORTUNE,_MASS +effect_type: 1 +texture_file: art\interface\player_conditions\ailments\spell curse of impending blades.tga +help_topic: TAG_SPELLS_CURSE_OF_ILL_FORTUNE,_MASS +tooltip_base_text: Curse of Ill Fortune, Mass \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/indicators/curse_of_impending_blades_mass.txt b/tpdatasrc/tpgamefiles/rules/indicators/curse_of_impending_blades_mass.txt new file mode 100644 index 000000000..b73ca20a3 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/curse_of_impending_blades_mass.txt @@ -0,0 +1,5 @@ +ID_string: CURSE_OF_IMP._BLADES,_MASS +effect_type: 1 +texture_file: art\interface\player_conditions\ailments\spell curse of impending blades.tga +help_topic: TAG_SPELLS_CURSE_OF_IMP._BLADES,_MASS +tooltip_base_text: Curse of Impending Blades, Mass \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/indicators/dark_ones_own_luck.txt b/tpdatasrc/tpgamefiles/rules/indicators/dark_ones_own_luck.txt new file mode 100644 index 000000000..31e36a7c2 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/dark_ones_own_luck.txt @@ -0,0 +1,5 @@ +ID_string: DARK_ONE'S_OWN_LUCK +effect_type: 0 +texture_file: art\interface\player_conditions\buffs\Spell Dark Ones Own Luck.tga +help_topic: TAG_SPELLS_DARK_ONE'S_OWN_LUCK +tooltip_base_text: Dark One's Own Luck diff --git a/tpdatasrc/tpgamefiles/rules/indicators/enervating_shadow.txt b/tpdatasrc/tpgamefiles/rules/indicators/enervating_shadow.txt new file mode 100644 index 000000000..405c79744 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/enervating_shadow.txt @@ -0,0 +1,5 @@ +ID_string: ENERVATING_SHADOW +effect_type: 0 +texture_file: art\interface\player_conditions\buffs\Spell Meld Into Stone.tga +help_topic: TAG_SPELLS_ENERVATING_SHADOW +tooltip_base_text: Enervating Shadow diff --git a/tpdatasrc/tpgamefiles/rules/indicators/enervating_shadow_aura.txt b/tpdatasrc/tpgamefiles/rules/indicators/enervating_shadow_aura.txt new file mode 100644 index 000000000..3228c449b --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/enervating_shadow_aura.txt @@ -0,0 +1,5 @@ +ID_string: ENERVATING_SHADOW_AURA +effect_type: 0 +texture_file: art\interface\player_conditions\buffs\Spell Meld Into Stone.tga +help_topic: TAG_SPELLS_ENERVATING_SHADOW +tooltip_base_text: Enervating Shadow Aura diff --git a/tpdatasrc/tpgamefiles/rules/indicators/hellrime_blast.txt b/tpdatasrc/tpgamefiles/rules/indicators/hellrime_blast.txt new file mode 100644 index 000000000..0b681d105 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/hellrime_blast.txt @@ -0,0 +1,5 @@ +ID_string: HELLRIME_BLAST +effect_type: 1 +texture_file: art\interface\player_conditions\ailments\Spell Chill Metal.tga +help_topic: TAG_SPELLS_HELLRIME_BLAST +tooltip_base_text: Hellrime Blast diff --git a/tpdatasrc/tpgamefiles/rules/indicators/ignore_the_pyre.txt b/tpdatasrc/tpgamefiles/rules/indicators/ignore_the_pyre.txt new file mode 100644 index 000000000..5cd61e7b9 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/ignore_the_pyre.txt @@ -0,0 +1,5 @@ +ID_string: IGNORE_THE_PYRE +effect_type: 0 +texture_file: art\interface\player_conditions\buffs\Spell Resist Elements.tga +help_topic: TAG_SPELLS_IGNORE_THE_PYRE +tooltip_base_text: Ignore the Pyre diff --git a/tpdatasrc/tpgamefiles/rules/indicators/leaps_and_bounds.txt b/tpdatasrc/tpgamefiles/rules/indicators/leaps_and_bounds.txt new file mode 100644 index 000000000..bd39331ce --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/leaps_and_bounds.txt @@ -0,0 +1,5 @@ +ID_string: LEAPS_AND_BOUNDS +effect_type: 0 +texture_file: art\interface\player_conditions\buffs\Spell Leaps and Bounds.tga +help_topic: TAG_SPELLS_LEAPS_AND_BOUNDS +tooltip_base_text: Leaps and Bounds diff --git a/tpdatasrc/tpgamefiles/rules/indicators/miasmic_cloud.txt b/tpdatasrc/tpgamefiles/rules/indicators/miasmic_cloud.txt new file mode 100644 index 000000000..8bf60dcc4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/miasmic_cloud.txt @@ -0,0 +1,5 @@ +ID_string: MIASMIC_CLOUD +effect_type: 1 +texture_file: art\interface\player_conditions\ailments\Spell Miasmic Cloud.tga +help_topic: TAG_SPELLS_MIASMIC_CLOUD +tooltip_base_text: Miasmic Cloud diff --git a/tpdatasrc/tpgamefiles/rules/indicators/nixies_grace.txt b/tpdatasrc/tpgamefiles/rules/indicators/nixies_grace.txt index ca7c2320a..219d94ac1 100644 --- a/tpdatasrc/tpgamefiles/rules/indicators/nixies_grace.txt +++ b/tpdatasrc/tpgamefiles/rules/indicators/nixies_grace.txt @@ -1,5 +1,5 @@ ID_string: NIXIE'S_GRACE effect_type: 0 texture_file: art\interface\player_conditions\buffs\spell heroism.tga -help_topic: TAG_SPELLS_NIXIES_GRACE -tooltip_base_text: Nixies Grace \ No newline at end of file +help_topic: TAG_SPELLS_NIXIE'S_GRACE +tooltip_base_text: Nixie's Grace \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/indicators/penetrating_blast.txt b/tpdatasrc/tpgamefiles/rules/indicators/penetrating_blast.txt new file mode 100644 index 000000000..a8fd6aad6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/penetrating_blast.txt @@ -0,0 +1,5 @@ +ID_string: PENETRATING_BLAST +effect_type: 1 +texture_file: art\interface\player_conditions\ailments\Spell Deep Slumber.tga +help_topic: TAG_SPELLS_PENETRATING_BLAST +tooltip_base_text: Penetrating Blast diff --git a/tpdatasrc/tpgamefiles/rules/indicators/resistance_greater.txt b/tpdatasrc/tpgamefiles/rules/indicators/resistance_greater.txt index e76798a41..b3365312b 100644 --- a/tpdatasrc/tpgamefiles/rules/indicators/resistance_greater.txt +++ b/tpdatasrc/tpgamefiles/rules/indicators/resistance_greater.txt @@ -1,5 +1,5 @@ ID_string: RESISTANCE,_GREATER effect_type: 0 texture_file: art\interface\player_conditions\buffs\Spell Resistance.tga -help_topic: TAG_SPELLS_RESISTANCE_GREATER +help_topic: TAG_SPELLS_RESISTANCE,_GREATER tooltip_base_text: Resistance, Greater \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/indicators/resistance_superior.txt b/tpdatasrc/tpgamefiles/rules/indicators/resistance_superior.txt index 286431f55..fed1acba9 100644 --- a/tpdatasrc/tpgamefiles/rules/indicators/resistance_superior.txt +++ b/tpdatasrc/tpgamefiles/rules/indicators/resistance_superior.txt @@ -1,5 +1,5 @@ ID_string: RESISTANCE,_SUPERIOR effect_type: 0 texture_file: art\interface\player_conditions\buffs\Spell Resistance.tga -help_topic: TAG_SPELLS_RESISTANCE_SUPERIOR +help_topic: TAG_SPELLS_RESISTANCE,_SUPERIOR tooltip_base_text: Resistance, Superior \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/indicators/vitriolic_blast.txt b/tpdatasrc/tpgamefiles/rules/indicators/vitriolic_blast.txt new file mode 100644 index 000000000..4dbe0c532 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/vitriolic_blast.txt @@ -0,0 +1,5 @@ +ID_string: VITRIOLIC_BLAST +effect_type: 1 +texture_file: art\interface\player_conditions\ailments\Spell Melfs Acid Arrow.tga +help_topic: TAG_SPELLS_VITRIOLIC_BLAST +tooltip_base_text: Vitriolic Blast diff --git a/tpdatasrc/tpgamefiles/rules/indicators/warlock_fiendish_resilience.txt b/tpdatasrc/tpgamefiles/rules/indicators/warlock_fiendish_resilience.txt new file mode 100644 index 000000000..6cc25c13d --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/indicators/warlock_fiendish_resilience.txt @@ -0,0 +1,5 @@ +ID_string: WARLOCK_FIENDISH_RESILIENCE +effect_type: 0 +texture_file: art\interface\player_conditions\buffs\spell aid.tga +help_topic: TAG_CLASS_FEATURES_WARLOCK_FIENDISH_RESILIENCE +tooltip_base_text: Fast Healing diff --git a/tpdatasrc/tpgamefiles/rules/partsys/breath_weapons_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/breath_weapons_partsys.tab new file mode 100644 index 000000000..c9c2b4a62 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/partsys/breath_weapons_partsys.tab @@ -0,0 +1,24 @@ +sp-Breath Weapon Cone Medium Acid smoke emit 10 20 600 Object YPR Sprite Same as Emitter Polar Cartesian fire-sprite 120 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?30 0 -30?30 30?360 5?40 0 0 0?360 0 0 0,16,0 0 255 144 100 +sp-Breath Weapon Cone Medium Acid Fire Strike 30 75 Object YPR Disc Same as Emitter Polar flare 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 20?60 0 0 0?720 0 0 0,255,0 0 255 144 20 +sp-Breath Weapon Cone Medium Acid Fire Strike 2 30 300 Object YPR Disc Same as Emitter Polar flare 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 0,10 0 0 0?720 0 0 0,255,0 0 255 144 30 +sp-Breath Weapon Cone Medium Cold smoke emit 10 20 600 Object YPR Sprite Same as Emitter Polar Cartesian fire-sprite 120 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?30 0 -30?30 30?330 5?40 0 0 0?360 0 0 0,16,0 255 255 255 100 +sp-Breath Weapon Cone Medium Cold Fire Strike 30 100 Object YPR Sprite Same as Emitter Polar flare-big 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 20?60 0 0 0?720 0 0 0 0 128 255 20 +sp-Breath Weapon Cone Medium Cold fire strike 3 sparklies 30 50 Object YPR Sprite Same as Emitter Polar flare-1 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 255,0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3, 0 0 0,360 0 0 0 255 255 255 100 +sp-Breath Weapon Cone Medium Electricity Fire Strike 30 100 Object YPR Sprite Same as Emitter Polar flare-big 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 20?60 0 0 0?720 0 0 0 0 128 255 20 +sp-Breath Weapon Cone Medium Electricity fire strike 3 sparklies 30 50 Object YPR Sprite Same as Emitter Polar flare-1 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 255,0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3, 0 0 0,360 0 0 255,0 255,64,64,64,64 255,128,128,128,128 255,255 100 +sp-Breath Weapon Cone Medium Electricity water droplets 15 30 30 Object YPR bip01 head Sprite Same as Emitter Polar Cartesian flare-1 5 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 3?15 0 0 0?360 0 0 255,0 255,64,64,64,64 255,128,128,128,128 255,255 5 +sp-Breath Weapon Cone Medium Fire smoke emit 10 20 600 Object YPR Sprite Same as Emitter Polar Cartesian fire-sprite 120 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?30 0 -30?30 30?330 5?40 0 0 0?360 0 0 0,32,0 0 0 0 100 +sp-Breath Weapon Cone Medium Fire Fire Strike 30 75 Object YPR Disc Same as Emitter Polar flare 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 20?60 0 0 0?720 0 0 0,255,255,0 255(6),255(10) 255(6),130(10) 0 20 +sp-Breath Weapon Cone Medium Fire Fire Strike 2 30 300 Object YPR Disc Same as Emitter Polar flare 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 0,10 0 0 0?720 0 0 0,255,255,0 255(6),255(10) 255(6),130(10) 0 30 +sp-Breath Weapon Line Medium Acid smoke emit 10 20 600 Object YPR Sprite Same as Emitter Polar Cartesian fire-sprite 120 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?30 0 -3?3 30?600 5?40 0 0 0?360 0 0 0,16,0 0 255 144 100 +sp-Breath Weapon Line Medium Acid Fire Strike 30 75 Object YPR Disc Same as Emitter Polar flare 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 0 0 0 -3?3 0 0,600 20?60 0 0 0?720 0 0 0,255,0 0 255 144 20 +sp-Breath Weapon Line Medium Acid Fire Strike 2 30 300 Object YPR Disc Same as Emitter Polar flare 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3?3 0 0,600 0,10 0 0 0?720 0 0 0,255,0 0 255 144 30 +sp-Breath Weapon Line Medium Cold smoke emit 10 20 600 Object YPR Sprite Same as Emitter Polar Cartesian fire-sprite 120 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?30 0 -3?3 30?330 5?40 0 0 0?360 0 0 0,16,0 255 255 255 100 +sp-Breath Weapon Line Medium Cold Fire Strike 30 100 Object YPR Sprite Same as Emitter Polar flare-big 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 0 0 0 -3?3 0 0,360 20?60 0 0 0?720 0 0 0 0 128 255 20 +sp-Breath Weapon Line Medium Cold fire strike 3 sparklies 30 50 Object YPR Sprite Same as Emitter Polar flare-1 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 255,0 0 0 0 0 0 0 0 0 0 -3?3 0 0,360 1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3, 0 0 0,360 0 0 0 255 255 255 100 +sp-Breath Weapon Line Medium Electricity Fire Strike 30 100 Object YPR Sprite Same as Emitter Polar flare-big 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 0 0 0 -3?3 0 0,360 20?60 0 0 0?720 0 0 0 0 128 255 20 +sp-Breath Weapon Line Medium Electricity fire strike 3 sparklies 30 50 Object YPR Sprite Same as Emitter Polar flare-1 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 255,0 0 0 0 0 0 0 0 0 0 -3?3 0 0,360 1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3, 0 0 0,360 0 0 255,0 255,64,64,64,64 255,128,128,128,128 255,255 100 +sp-Breath Weapon Line Medium Electricity water droplets 15 30 30 Object YPR bip01 head Sprite Same as Emitter Polar Cartesian flare-1 5 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3?3 0 0,360 3?15 0 0 0?360 0 0 255,0 255,64,64,64,64 255,128,128,128,128 255,255 5 +sp-Breath Weapon Line Medium Fire smoke emit 10 20 400 Object YPR Sprite Same as Emitter Polar Cartesian fire-sprite 120 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?30 0 -3?3 30?330 5?40 0 0 0?360 0 0 0,32,0 0 0 0 100 +sp-Breath Weapon Line Medium Fire Fire Strike 30 50 Object YPR Disc Same as Emitter Polar flare 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 0 0 0 -3?3 0 0,360 20?60 0 0 0?720 0 0 0,255,255,0 255(6),255(10) 255(6),130(10) 0 20 +sp-Breath Weapon Line Medium Fire Fire Strike 2 30 300 Object YPR Disc Same as Emitter Polar flare 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3?3 0 0,360 0,10 0 0 0?720 0 0 0,255,255,0 255(6),255(10) 255(6),130(10) 0 30 diff --git a/tpdatasrc/tpgamefiles/rules/partsys/fist_of_the_forest_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/fist_of_the_forest_partsys.tab new file mode 100644 index 000000000..b272833a1 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/partsys/fist_of_the_forest_partsys.tab @@ -0,0 +1,2 @@ +cl-Feral Trance bones all over 0 perm 450 Bones bip01 R upperarm Sprite World fire-sprite 8 Add 0 bullstrength 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2?-2 2?-2 2?-2 5?15 0 0 0?360 0 0 128 24 0?105 58 150 +cl-Feral Trance boom start 0 0 100 Bones bip01 R upperarm Sprite World fire-sprite 30 Add 0 bullstrength 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2?-2 2?-2 2?-2 5,50,5,50 0 0 0?360 0 0 0,64,0 24 0?105 58 150 diff --git a/tpdatasrc/tpgamefiles/rules/partsys/new_feats_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/new_feats_partsys.tab index c88556e84..fe9ebce23 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/new_feats_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/new_feats_partsys.tab @@ -1,3 +1,5 @@ +ft-Arcane Strike sparkles 1 perm 50 Node Pos bip01 r hand Sprite Polar flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 30,0 0,5 0 0 0 0 0 0,255,0 200?255 0 200?255 10 +ft-Arcane Strike Heart Flashes perm 5 Node Pos bip01 r hand Sprite Polar flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30,10,20,15,30,10,5,20,30,10,20,15,30,10,5,20,30,10,20,15,30,10,5,20,30,10,20,15,30,10,5,20,30,10,20,15,30,10,5,20,30,10,20,15,30,10,5,20, 0 0 0,-720 0 0 0,255,0 200?255 0 200?255 1 ft-Fists of Iron New Emitter perm 30 Node Pos bip01 r hand Disc World Polar strike 15 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0?360 0 0 64,0 47 79 79 2 ft-Fists of Iron New Emitter perm 30 Node Pos bip01 l hand Disc World Polar strike 15 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0?360 0 0 64,0 47 79 79 2 ft-Axiomatic Strike New Emitter perm 30 Node Pos bip01 r hand Disc World Polar strike 15 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0?360 0 0 64,0 255 0 255 2 diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index 209a2f9d7..08037d6f4 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab @@ -1,4 +1,6 @@ sp-Acid Fog smoke emit perm 600 Object YPR Sprite Same as Emitter Polar Cartesian fire-sprite 120 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?30 0 0?360 0?240 5?40 0 0 0?360 0 0 0,16,0 0 255 144 100 +sp-Acid Fog-hit New Emitter 15 10 Object YPR Sprite Polar fire-sprite 30 Add 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 #radius 20?40 0 0 0?360 0 0 0,255,0 0 255 144 5 +sp-Acid Fog-hit hittin 15 5 Object YPR Sprite Polar fire-sprite 90 Blend 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 #radius 20?40 0 0 0?360 0 0 0,60,0 0 255 144 sp-Appraising Touch aura 10 perm 30 Node Pos bip01 head Sprite flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4?10 0 0 0 0 0 0,200,150,100,50,0 200?255 200?255 0?64 sp-Appraising Touch startup 5 200 Node Pos bip01 head Sprite flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4,20 0 0 0 0 0 0,200,150,100,50,0 200?255 200?255 0?64 sp-Axiomatic Storm ice ice baby Model Verts perm 80 Sprite World Polar shard 10 Add 0 shard 0 0 0 0 0 0 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1600 0 -240?240 0 -240?240 5?25 0 0 0 0,255,255,255,255,255,255,255,0 211 211 211 20 @@ -11,7 +13,16 @@ sp-Axiomatic Storm-hit Blast 4 15 3 600 Sprite Polar flare-1 15 Add 0 sp-Axiomatic Storm-hit Blast 5 20 3 600 Sprite Polar flare-1 15 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?180 0,100 5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2, 0 0 0 0 0 128,0 76 255 0 sp-Axiomatic Storm-hit body steam 0 10 100 Bones Sprite Polar fire-sprite 90 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,40 0 0 0 0 5,30 0 0 0?360 0 0 32,0 76 255 0 sp-Axiomatic Storm-hit blast 1 5 800 Bones Sprite Polar flare-1 40 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100,-100 0 0?360 0?180 0,100 5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2, 0 0 0 0 0 128,0 76 255 0 200 +sp-Blast of Flame smoke emit 10 20 600 Object YPR Sprite Same as Emitter Polar Cartesian fire-sprite 120 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?30 0 -30?30 30?720 5?40 0 0 0?360 0 0 0,16,0 0 0 0 100 +sp-Blast of Flame Fire Strike 30 300 Object YPR Disc Same as Emitter Polar flare 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -30?30 0 0,720 0?45 0 0 0?360 0 0 0,255,255,0 255(6),255(10) 255(6),130(10) 0 30 +sp-Bonefiddle New Emitter 30 1 Node Pos bip01 head Sprite Polar fiddle_bow 60 Blend 0 0 0 0 0 0 0 0 120 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -80 0 0 0 0 0 0 0 30 0 0 270 0 0 255 255 128 255 +sp-Bonefiddle whoo knelly 60 300 Sprite Polar flare-1 90 Add 0 0 0 0 0 0 0 0 3,100,100,100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 0,30,0,30,0,30,0 10 0 0 0 0 0 0,32,0 47 79 79 +sp-Bonefiddle-round New Emitter 30 1 Node Pos bip01 spine1 Sprite Polar fiddle_bow 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,100,200 0,100,200 10 30 0 0 215 0 0 255 255 128 255 +sp-Bonefiddle-end New Emitter 30 1 Node Pos bip01 head Sprite Polar fiddle_bow 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 0 0 0 0 0 0 0 30 0 0 270 0 0 255 255 128 255 sp-Cloud of Bewilderment smoke emit perm 600 Object YPR Sprite Same as Emitter Polar Cartesian fire-sprite 120 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?30 0 0?360 0?120 5?40 0 0 0?360 0 0 0,16,0 0 255 144 100 +sp-Cloud of Bewilderment-hit start 15 60 Node Pos bip01 Spine2 Sprite flare-1 60 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 0?255 255 0?255 10 +sp-Cloud of Bewilderment-hit redness perm 60 Node Pos bip01 Spine2 Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -10?10 -10?10 -10?10 4,0 0 0 0?360 0 0 0,255,0 0 0 0 10 +sp-Cloud of Bewilderment-hit sickness perm 30 Node Pos bip01 Spine2 Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 0?16 64 0?16 10 sp-Cloud of Bewilderment old startup 5 1200 Disc Polar flare-big 60 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 8?120 3?20 0 0 0?360 0 0 0,128,0 128 234 58 100 sp-Cloud of Bewilderment old grumble2 perm 150 Sprite Polar flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?10 0?360 0?120 2,15 0 0 0 0 0 0,255,200,150,100,50,0 0?16 0 0 30 sp-Cloud of Bewilderment old Earth grumbling perm 150 Sprite Polar fire-sprite 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5,-10 0 0?360 0?120 1?4 0 0 0?360 0 0 0,255,0 128 234 58 30 @@ -21,6 +32,8 @@ sp-Corona of Cold Fire Strike perm 10 Object YPR Disc Same as Emitter Pola sp-Corona of Cold New Emitter perm 10 Object YPR Disc Same as Emitter Polar flare-1 120 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 0,140 0,30 0 0 0?720 0 0 64,0 255,0,0 255,128,128 255,255,255 sp-Corona of Cold New Emitter 0 1 Object YPR Disc Same as Emitter Polar flare-1 5 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100,0 0 0 0,1000 0 0 255 255 255 255 sp-Corona of Cold New Emitter 0 1 Object YPR Disc Same as Emitter Polar flare-1 5 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100,0 0 0 0,-1000 0 0 255 255 255 255 +sp-Corona of Cold-Hit New Emitter 15 45 Object Pos Sprite Polar flare-1 120 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?360 #radius 5,0 0 0 0?360 0 0 255,0 32 64 128 +sp-Corona of Cold-Hit New Emitter 15 30 Object Pos Sprite World Polar Cartesian flare-1 8 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10?-10 10?-10 10?-10 0?360 0?360 #radius 8,0 0 0 0?360 0 0 255 255,0 255,0 255 sp-Daze2 perma daze 120 30 Bones Sprite Polar flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?100 #radius 1?10 0 0 0?360 0 0 0,255,0 255,128 255,128 255,255 sp-Daze2 Daze hit 15 300 Bones Sprite Polar flare-1 15 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?100 #radius 1?30 0 0 0?360 0 0 0,255,0 255,128 255,128 255,255 sp-Deific Vengeance imploding star 0 10 5 Disc flare-1 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100,0 0 0 0?360 0 0 255 255,255 255,255 255,0 4 @@ -46,25 +59,66 @@ sp-Energy Vortex Electricity Blast blurry 0 30 100 Sprite Polar flare-bi sp-Energy Vortex Electricity ring booms 0 20 10 Disc Polar flare-3 5 Add 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,280 0 0 0 0 0 255,0 255,0,0 255,128,128 255,255,255 sp-Energy Vortex Electricity Blast 4 15 3 600 Sprite Polar flare-1 15 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?180 0,240 5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2, 0 0 0 0 0 255,0 255,0,0 255,128,128 255,255,255 sp-Energy Vortex Electricity Blast 5 20 3 600 Sprite Polar flare-1 15 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?180 0,240 5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2, 0 0 0 0 0 255,0 255,0,0 255,128,128 255,255,255 +sp-Evard's Black Tentacles tentacle 0 perm 5 Sprite Polar tentacle 90 Blend 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5?220 -20?160 5?200 30 0 0 180 0 0 0,255,0 153,0 50,0 204,0 1 +sp-Evard's Black Tentacles boundaries 0 perm 5 Disc Polar flare-3 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50?320 0 0 0?360 0 0 0,32,0 153,0 50,0 204,0 3 +sp-Evard's Black Tentacles sparklebounds 0 perm 300 Disc Polar flare-1 60 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 240 2?15 0 0 0?360 0 0 0,250,0 153,0 50,0 204,0 3 +sp-Evard's Black Tentacles-Hit tentacle 0 perm 1 Bones bip01 foot Sprite Polar tentacle 90 Blend 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 0 0 180 0 0 0,255,0 153,0 50,0 204,0 1 sp-Focusing Chant note3 0 perm 3 Node Pos bip01 head Sprite World Polar Polar note4 30 Add 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?360 0?30 2?10 0 0 160?200 0 0 0,255,200,150,100,50,0 214 127 255 1 sp-Focusing Chant note1 0 perm 3 Node Pos bip01 head Sprite World Polar Polar note1 60 Add 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?360 0?30 2?10 0 0 160?200 0 0 0,255,200,150,100,50,0 214 127 255 1 sp-Focusing Chant note 2 0 perm 3 Node Pos bip01 head Sprite World Polar Polar note2 60 Add 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?360 0?30 2?10 0 0 160?200 0 0 0,255,200,150,100,50,0 214 127 255 1 sp-Frost Breath smoke emit 10 20 600 Object YPR Sprite Same as Emitter Polar Cartesian fire-sprite 120 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?30 0 -30?30 30?330 5?40 0 0 0?360 0 0 0,16,0 255 255 255 100 sp-Frost Breath Fire Strike 30 100 Object YPR Sprite Same as Emitter Polar flare-big 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 20?60 0 0 0?720 0 0 0 0 128 255 20 sp-Frost Breath fire strike 3 sparklies 30 50 Object YPR Sprite Same as Emitter Polar flare-1 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 255,0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3,1,30,20,25,6,26,15,2,28,3, 0 0 0,360 0 0 0 255 255 255 100 -sp-Fugue startup 5 1200 Disc Polar flare-big 60 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 8?360 3?20 0 0 0?360 0 0 0,128,0 87?156 0?28 127?255 100 -sp-Fugue grumble2 perm 150 Sprite Polar flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?10 0?360 0?360 2,15 0 0 0 0 0 0,255,200,150,100,50,0 87?156 0?28 127?255 30 -sp-Fugue Earth grumbling perm 150 Sprite Polar fire-sprite 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5,-10 0 0?360 0?360 1?4 0 0 0?360 0 0 0,255,0 87?156 0?28 127?255 30 -sp-Fugue startup perm 150 Sprite Polar fire-sprite 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5,-10 0 0?360 0?360 1?2 0 0 0?360 0 0 0,255,0 87 0 127 30 +sp-Fireburst Fire Ground Spread 3 800 Sprite Polar flare-big 30 Add 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?20 0,120 30,20 0 0 0 0 0 255,0 255,255,255,255 255,128,128,128 255,80,80,80 +sp-Fireburst New Emitter 0 10 20 World Disc World Polar Cartesian flare-3 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 0 10,130 0 0 0?360 0 0 255,0 255,255 128 64 20 +sp-Fugue floating notes perm 60 Disc Polar Note2 90 Blend 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0,30 30?340 10,0 0 0 0 0 0 0,255,200,150,100,50,0 87?156 0?28 127?255 100 +sp-Fugue outer circle perm 60 Disc Polar Note2 90 Blend 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0,15 360 10,0 0 0 0 0 0 0,255,200,150,100,50,0 87?156 0?28 127?255 150 +sp-Fugue-hit note2 0 perm 7 Node Pos bip01 head Sprite World Polar Polar note2 130 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2?-2 2?-2 2?-2 0,720 0 10?30 2?7 0 0 160?200 0 0 0,255,200,150,100,50,0 255?50 140?69 0 2 +sp-Greater Fireburst Fire Ground Spread 3 800 Sprite Polar flare-big 30 Add 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?20 0,180 30,20 0 0 0 0 0 255,0 255,255,255,255 255,128,128,128 255,80,80,80 +sp-Greater Fireburst New Emitter 0 10 20 World Disc World Polar Cartesian flare-3 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 0 10,200 0 0 0?360 0 0 255,0 255,255 128 64 20 +sp-Hail of Stone pebble 1 30 1 Sprite Polar flare-2 30 Add 0 0 0 0 0 0 0 -40 250 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 -300,-302 -10 0,240 11 0 0 0,360 0 0 255 128 64 64 +sp-Hail of Stone pebble 1 30 1 Sprite Polar bigcircle 30 Blend 0 0 0 0 0 0 0 -40 250 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 -300,-302 -10 0,240 4 0 0 0,360 0 0 255 16 8 8 +sp-Hail of Stone pebble 2 30 1 Sprite Polar flare-2 30 Add 0 0 0 0 0 0 0 0 250 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 -300,-302 -10 0,240 11 0 0 0,360 0 0 255 128 64 64 +sp-Hail of Stone pebble 2 30 1 Sprite Polar bigcircle 30 Blend 0 0 0 0 0 0 0 0 250 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 -300,-302 -10 0,240 4 0 0 0,360 0 0 255 16 8 8 +sp-Hail of Stone pebble 3 30 1 Sprite Polar flare-2 30 Add 0 0 0 0 0 0 0 -80 200 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 -300,-302 -10 0,240 11 0 0 0,360 0 0 255 128 64 64 +sp-Hail of Stone pebble 3 30 1 Sprite Polar bigcircle 30 Blend 0 0 0 0 0 0 0 -80 200 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 -300,-302 -10 0,240 4 0 0 0,360 0 0 255 16 8 8 +sp-Hail of Stone pebble 4 30 1 Sprite Polar flare-2 30 Add 0 0 0 0 0 0 0 -120 235 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 -300,-302 -10 0,240 11 0 0 0,360 0 0 255 128 64 64 +sp-Hail of Stone pebble 4 30 1 Sprite Polar bigcircle 30 Blend 0 0 0 0 0 0 0 -120 235 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 -300,-302 -10 0,240 4 0 0 0,360 0 0 255 16 8 8 +sp-Hail of Stone pebble 5 30 1 Sprite Polar flare-2 30 Add 0 0 0 0 0 0 0 -85 230 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 -300,-302 -10 0,240 11 0 0 0,360 0 0 255 128 64 64 +sp-Hail of Stone pebble 5 30 1 Sprite Polar bigcircle 30 Blend 0 0 0 0 0 0 0 -85 230 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 -300,-302 -10 0,240 4 0 0 0,360 0 0 255 16 8 8 sp-Holy Storm ice ice baby Model Verts perm 80 Sprite World Polar shard 10 Blend 0 shard 0 0 0 0 0 0 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1600 0 -240?240 0 -240?240 5?25 0 0 0 0,255,255,255,255,255,255,255,0 128 128 128 20 sp-Holy Storm ground busts discs 20 Point perm 120 World Polar Disc World Polar Cartesian fire-sprite 10 Blend 0 Shard-Breaking 0 0 0 0 0 2 0 0 0 0 0 20?-20 0 0 -250?250 0 -250?250 0,40 0 0 0?360 0 0 64,0 255 255 255 20 sp-Holy Storm circle bounding 20 Point perm 120 World Polar Disc World Polar Cartesian fire-sprite 10 Blend 0 Shard-Breaking 0 0 0 0 0 2 0 0 0 0 0 20?-20 0 0 0?360 0 250 0,40 0 0 0?360 0 0 64,0 255 255 255 20 +sp-Hunter's Eye eyes perm 1 Node Pos bip01 head Sprite Same as Emitter hunters_eye 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 0 0 180 0 0 0,192,0 138,0 3,0 3,0 1 +sp-Hunter's Eye left eye sparkle 25 15 10 Node Pos bip01 head Sprite Same as Emitter flare-1 15 Add 0 0 0 0 0 0 0 18 -18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0?360 0 0 0,255,192,128,96,64,32,0 253,0 138,0 140,140 5 +sp-Hunter's Eye right eye sparkle 25 15 10 Node Pos bip01 head Sprite Same as Emitter flare-1 15 Add 0 0 0 0 0 0 0 -18 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0?360 0 0 0,255,192,128,96,64,32,0 253,0 138,0 140,140 5 sp-Ironthunder Horn shockwave 40 150 Object YPR Sprite Same as Emitter Polar ring 20 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 -15?15 -15?15 -15?15 -30?30 0 0,360 0?75 0 0 0?360 0 0 128,0 15 15 15 1 sp-Ironthunder Horn wave1 10 30 150 Object YPR Sprite Same as Emitter Polar ring 20 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 -15?15 -15?15 -15?15 -30?30 0 0,360 0?75 0 0 0?360 0 0 128,0 15 15 15 1 sp-Ironthunder Horn wave2 20 20 150 Object YPR Sprite Same as Emitter Polar ring 20 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 -15?15 -15?15 -15?15 -30?30 0 0,360 0?75 0 0 0?360 0 0 128,0 15 15 15 1 sp-Ironthunder Horn wave3 30 10 150 Object YPR Sprite Same as Emitter Polar ring 20 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 -15?15 -15?15 -15?15 -30?30 0 0,360 0?75 0 0 0?360 0 0 128,0 15 15 15 1 +sp-Lesser Orb of Acid Splashes 2 500 Bones bip01 Spine1 Cartesian Sprite Polar flare-big 15 Add 0 AcidArrow 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30?-30 0,-200 30?-30 0?360 0?360 0,60 5,1 0 0 0?360 0 0 255,0 128 255 64 +sp-Lesser Orb of Acid-proj acid-goo-dribbles perm 1000 Object YPR Sprite flare-big 30 Blend 0 AcidArrow 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?-30 0 0 0 0 2,6 0 0 0 0 0 255,0 255,30,0,0,0 255,200,0,0,0 255,30,0,0,0 +sp-Lesser Orb of Cold Splashes 2 500 Bones bip01 Spine1 Cartesian Sprite Polar flare-1 15 Add 0 AcidArrow 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30?-30 0,-200 30?-30 0?360 -15?30 0,60 3,8,15,8,3 0 0 0?360 0 0 0,255,0 240 248 255 +sp-Lesser Orb of Cold-proj acid-goo-dribbles perm 1000 Object YPR Sprite flare-big 30 Blend 0 AcidArrow 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?-30 0 0 0 0 2,6 0 0 0 0 0 255,0 176,240,255,255,0 224,248,255,255,0 230,255,255,255,0 +sp-Lesser Orb of Electricity graspy 1 30 10 Disc enervation1 5 Add 0 0 0 0 0 0 0 0 #radius 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5?40 0 0 0?360 0 0 64,0 64 128 255 +sp-Lesser Orb of Electricity graspy 2 30 10 Disc enervation2 5 Add 0 0 0 0 0 0 0 0 #radius 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5?40 0 0 0?360 0 0 64,0 64 128 255 +sp-Lesser Orb of Electricity graspy 3 30 10 Disc enervation3 5 Add 0 0 0 0 0 0 0 0 #radius 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5?40 0 0 0?360 0 0 64,0 64 128 255 +sp-Lesser Orb of Electricity Blast blurry 0 3 1000 Bones Sprite Polar flare-big 10 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?90 0,40 10?30 0 0 0 0 0 64,0 255,0,0 255,128,128 255,255,255 200 +sp-Lesser Orb of Electricity blast 1 2 1600 Bones Sprite Polar flare-1 20 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?180 0,50 5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2, 0 0 0 0 0 255,0 255,0,0 255,128,128 255,255,255 400 +sp-Lesser Orb of Electricity blast 2 7 2 1600 Bones Sprite Polar flare-1 20 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?180 0,50 5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2, 0 0 0 0 0 255,0 255,0,0 255,128,128 255,255,255 400 +sp-Lesser Orb of Electricity blast 3 14 2 1600 Bones Sprite Polar flare-1 20 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?180 0,50 5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2,5,2,6,1,3,2, 0 0 0 0 0 255,0 255,0,0 255,128,128 255,255,255 400 +sp-Lesser Orb of Electricity-proj acid-goo-dribbles perm 1000 Object YPR Sprite flare-big 30 Blend 0 AcidArrow 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?-30 0 0 0 0 2,6 0 0 0 0 0 255,0 176,240,255,255,0 196,248,255,255,0 222,255,255,255,0 +sp-Lesser Orb of Fire Simple Explosion 1 5 300 Bones Sprite Polar fire-sprite 15 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,50 0 0?360 0?360 0,30 5?20 0 0 0?360 0 0 0,255,200,150,100,50,0 255 128 64 70 +sp-Lesser Orb of Fire Simple Explosion 2 0 300 Bones Sprite Polar flare-1 15 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,50 0 0?360 0?360 0,30 10,0 0 0 0?360 0 0 0,255,200,150,100,50,0 255 128 64 70 +sp-Lesser Orb of Fire-proj Burning Sphere 1 perm 300 Object Pos Sprite Polar flare-1 15 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,50 0 0?360 0?360 0,30 4,0 0 0 0?360 0 0 0,255,200,150,100,50,0 255 128 64 70 +sp-Lesser Orb of Fire-proj Burning Sphere 2 perm 1200 Object Pos Sprite Polar fire-sprite 15 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,50 0 0?360 0?360 0,30 1?4 0 0 0?360 0 0 0,100,90,80,70,60,50,40,30,20,10,0 255 128 64 300 sp-Nauseating Breath smoke emit 10 20 600 Object YPR Sprite Same as Emitter Polar Cartesian fire-sprite 120 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?30 0 -30?30 30?360 5?40 0 0 0?360 0 0 0,16,0 0 255 144 100 sp-Nauseating Breath Fire Strike 30 100 Object YPR Sprite Same as Emitter Polar flare-big 30 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 64,0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 20?60 0 0 0?720 0 0 0 0 255 144 20 +sp-Orb of Acid-proj acid-goo-dribbles perm 1000 Object YPR Sprite flare-big 30 Blend 0 AcidArrow 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?-30 0 0 0 0 5,10 0 0 0 0 0 255,0 255,30,0,0,0 255,200,0,0,0 255,30,0,0,0 +sp-Orb of Cold-proj acid-goo-dribbles perm 1000 Object YPR Sprite flare-big 30 Blend 0 AcidArrow 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?-30 0 0 0 0 5,10 0 0 0 0 0 255,0 176,240,255,255,0 224,248,255,255,0 230,255,255,255,0 +sp-Orb of Electricity-proj acid-goo-dribbles perm 1000 Object YPR Sprite flare-big 30 Blend 0 AcidArrow 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?-30 0 0 0 0 5,10 0 0 0 0 0 255,0 176,240,255,255,0 196,248,255,255,0 222,255,255,255,0 +sp-Orb of Fire-proj Burning Sphere 1 perm 300 Object Pos Sprite Polar flare-1 15 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,50 0 0?360 0?360 0,30 10,0 0 0 0?360 0 0 0,255,200,150,100,50,0 255 128 64 70 +sp-Orb of Fire-proj Burning Sphere 2 perm 1200 Object Pos Sprite Polar fire-sprite 15 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,50 0 0?360 0?360 0,30 5?10 0 0 0?360 0 0 0,100,90,80,70,60,50,40,30,20,10,0 255 128 64 300 sp-Shock and Awe shockwave 40 150 Object YPR Sprite Same as Emitter Polar flare-1 20 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -15?15 -15?15 -15?15 0 0 0 0,650 0 0 0?360 0 0 128,0 15 15 15 1 sp-Veil of Shadow veil perm 150 Object Pos Disc Polar fire-sprite 60 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0?30 1?4 0 0 0?360 0 0 128,0 0 0 0 30 sp-Veil of Shadow veil2 perm 100 Object Pos Sprite Polar fire-sprite 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?20 0?360 0?30 2,15 0 0 0 0 0 0,150,100,50,0 87?156 0?28 127?255 30 @@ -79,6 +133,8 @@ sp-Storm of Elemental Fury Wind wind 2 10 perm 60 Object Pos bip01 head Spri sp-Storm of Elemental Fury Wind winaround 0 perm 120 Object Pos bip01 head Sprite Polar fire-sprite 15 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,100 0 360?0 0 80,0 0,40 0 0 0,360 0 0 0,64,0 64 64 64 15 sp-Storm of Elemental Fury Earth ice ice baby Model Verts perm 80 Sprite World Polar flare-small 10 Add 0 0 0 0 0 0 0 0 600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1600 0 -240?240 0 -240?240 15?65 0 0 0 0,255,255,255,255,255,255,255,0 139 117 0 50 sp-Storm of Elemental Fury Earth ground busts discs 5 Point perm 120 World Polar Disc World Polar Cartesian Ring-3 10 Add 0 Shard-Breaking 0 0 0 0 0 2 0 0 0 0 0 20?-20 0 0 -250?250 0 -250?250 0,40 0 0 0?360 0 0 64,0 139 117 0 20 +sp-Sure Strike bullseye 60 1 Node Pos bip01 head Sprite Same as Emitter bullseye 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 0 0 180 0 0 0,192,0 138,0 3,0 3,0 1 +sp-Tactical Precision Crossed Swords 60 1 Node Pos bip01 head Sprite Same as Emitter crossed_swords 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 0 0 180 0 0 192?0 0 0 0 1 sp-Touch Of Madness vampire dribblins 90 10 Node Pos bip01 r hand Sprite Polar Polar flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 30,0 0,20 0 0 0 0 0 0,255,192,128,96,64,0 32 0 64 5 sp-Touch Of Madness dribbles bright 90 20 Node Pos bip01 r hand Sprite Polar Polar flare-1 60 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 30,0 0,5 0 0 0 0 0 0,255,192,128,96,64,0 128 0 255 5 sp-Undersong note2 0 perm 7 Node Pos bip01 head Sprite World Polar Polar note2 130 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2?-2 2?-2 2?-2 0,720 0 10?30 2?7 0 0 160?200 0 0 0,255,200,150,100,50,0 255 155 112 2 diff --git a/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab new file mode 100644 index 000000000..9a22c9340 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab @@ -0,0 +1,86 @@ +sp-Eldritch Blast-hit Fire 0 Point 8 100 Object Pos Cartesian Polar Sprite World Polar Polar flare-1 30 Add 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 0,100 5?20 0 0 0,360 128,0 100?255 0?32 0?130 10 +sp-Eldritch Blast-hit fire2 0 Point 8 100 Object Pos Cartesian Polar Sprite World Polar Cartesian flare-1 30 Add 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 0,80 10,0 0 0 0?360 255,0 255(1),200(5) 255(1),32(5) 255(1),130(5) 20 +sp-Eldritch Blast-hit flashes 0 Point 8 10 Object Pos Cartesian Polar Sprite Same as Emitter Polar Cartesian flare-3 5 Add 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 80,0 0 0 0?360 255,0 150 64 130 30 +sp-Eldritch Blast-hit big flash 0 Point 0 1 Object Pos Cartesian Polar Sprite Same as Emitter Polar Cartesian flare-big 2 Add 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 0 0 0?360 255,0 255 255 255 1 +sp-Eldritch Blast-proj fire2 0 Point perm 300 Object Pos Cartesian Polar Sprite World Polar Cartesian flare-1 30 Add 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0?360 255,0 255(1),200(5) 255(1),32(5) 255(1),130(5) 200 +sp-Eldritch Blast-proj Fire 0 Point perm 150 Object Pos Cartesian Polar Sprite World Cartesian Polar flare-1 30 Add 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0?360 0 20 0 0 0 14 0 0 0,360 128,0 100?255 0?32 0?130 50 +sp-Eldritch Blast-proj flashes 0 Point perm 10 Object Pos Cartesian Polar Sprite Same as Emitter Polar Cartesian flare-1 30 Add 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0?360 255,0 150 64 130 30 +sp-Eldritch Cone fire2 0 Point 30 300 Object YPR Sprite Same as Emitter Polar flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 12 0 0 0?360 255,0 255(1),200(5) 255(1),32(5) 255(1),130(5) 200 +sp-Eldritch Cone Fire 0 Point 30 150 Object YPR Sprite Same as Emitter Polar flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -30?30 0 0,360 16 0 0 0,360 128,0 100?255 0?32 0?130 50 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 180 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 165 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 150 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 135 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 120 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 105 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 90 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 60 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 45 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -15 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -30 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -45 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -60 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -75 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -90 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -105 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -120 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -135 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -150 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Doom dart 10 5 60 Node Pos bip01 r hand Disc Same as Emitter Polar flare-big 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -165 0 0,360 10,0 0 0 0 0 0 255,0 255 128 255 10 +sp-Eldritch Line fire2 0 Point 30 300 Object YPR Sprite Same as Emitter Polar flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -3?3 0 0,360 12 0 0 0?720 255,0 255(1),200(5) 255(1),32(5) 255(1),130(5) 200 +sp-Eldritch Spear-proj fire2 0 Point perm 300 Object Pos Cartesian Polar Sprite World Polar Cartesian shard 30 Add 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0?360 255,0 255(1),200(5) 255(1),32(5) 255(1),130(5) 200 +sp-Eldritch Spear-proj Fire 0 Point perm 150 Object Pos Cartesian Polar Sprite World Cartesian Polar shard 30 Add 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0?360 0 20 0 0 0 14 0 0 0,360 128,0 100?255 0?32 0?130 50 +sp-Eldritch Spear-proj flashes 0 Point perm 10 Object Pos Cartesian Polar Sprite Same as Emitter Polar Cartesian shard 30 Add 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0?360 255,0 150 64 130 30 +sp-Beshadowed Blast-held sickness perm 5 Node Pos bip01 r hand Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 0 0 0 5 +sp-Beshadowed Blast-held redness perm 15 Node Pos bip01 r hand Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -5?5 -5?5 -5?5 2,0 0 0 0?360 0 0 0,255,0 0 0 0 10 +sp-Bewitching Blast-held sickness perm 5 Node Pos bip01 r hand Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 199 21 133 5 +sp-Bewitching Blast-held redness perm 15 Node Pos bip01 r hand Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -5?5 -5?5 -5?5 2,0 0 0 0?360 0 0 0,255,0 199 21 133 10 +sp-Binding Blast-held sickness perm 5 Node Pos bip01 r hand Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 0?72 209 204 5 +sp-Binding Blast-held redness perm 15 Node Pos bip01 r hand Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -5?5 -5?5 -5?5 2,0 0 0 0?360 0 0 0,255,0 0?72 209 204 10 +sp-Brimstone Blast-held sickness perm 5 Node Pos bip01 r hand Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 255 69 0 5 +sp-Brimstone Blast-held redness perm 15 Node Pos bip01 r hand Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -5?5 -5?5 -5?5 2,0 0 0 0?360 0 0 0,255,0 255 69 0 10 +sp-Frightful Blast-held sickness perm 5 Node Pos bip01 r hand Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 72 61 139 5 +sp-Frightful Blast-held redness perm 15 Node Pos bip01 r hand Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -5?5 -5?5 -5?5 2,0 0 0 0?360 0 0 0,255,0 72 61 139 10 +sp-Hellrime Blast-held sickness perm 5 Node Pos bip01 r hand Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 240 255 255 5 +sp-Hellrime Blast-held redness perm 15 Node Pos bip01 r hand Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -5?5 -5?5 -5?5 2,0 0 0 0?360 0 0 0,255,0 240 255 255 10 +sp-Hindering Blast-held sickness perm 5 Node Pos bip01 r hand Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 238 232 170 5 +sp-Hindering Blast-held redness perm 15 Node Pos bip01 r hand Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -5?5 -5?5 -5?5 2,0 0 0 0?360 0 0 0,255,0 238 232 170 10 +sp-Noxious Blast-held sickness perm 5 Node Pos bip01 r hand Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 0?16 64 0?16 5 +sp-Noxious Blast-held redness perm 15 Node Pos bip01 r hand Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -5?5 -5?5 -5?5 2,0 0 0 0?360 0 0 0,255,0 0 0 0 10 +sp-Penetrating Blast-held sickness perm 5 Node Pos bip01 r hand Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 255 255 0 5 +sp-Penetrating Blast-held redness perm 15 Node Pos bip01 r hand Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -5?5 -5?5 -5?5 2,0 0 0 0?360 0 0 0,255,0 255 255 0 10 +sp-Sickening Blast-held sickness perm 5 Node Pos bip01 r hand Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 0?16 64 0?16 5 +sp-Sickening Blast-held redness perm 15 Node Pos bip01 r hand Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -5?5 -5?5 -5?5 2,0 0 0 0?360 0 0 0,255,0 0 0 0 10 +sp-Vitriolic Blast-held sickness perm 5 Node Pos bip01 r hand Sprite flare-big 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-10 0 -10?10 -10?10 -10?10 20,0 0 0 0?360 0 0 0,255,0 0 250 154 5 +sp-Vitriolic Blast-held redness perm 15 Node Pos bip01 r hand Sprite flare-2 60 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-20 0 -5?5 -5?5 -5?5 2,0 0 0 0?360 0 0 0,255,0 0 250 154 10 +sp-All Seeing Eyes pupil 30 4 Node Pos bip01 head Sprite Cartesian eye-Pupil 60 Add 0 0 0 0 0 0 0 10 3 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 0 10,50 0 0 180 0 0 0,128,0 0,238 0,130 0,238 2 +sp-All Seeing Eyes eyes 15 30 4 Node Pos bip01 head Sprite Cartesian eye-noPupil 60 Add 0 0 0 0 0 0 0 10 3 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 0 10,50 0 0 180 0 0 0,128,0 0,238 0,130 0,238 2 +sp-Beguiling Influence emotion particles 60 30 Node Pos bip01 head Sprite Polar Polar flare-1 60 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?1 0 0 0?360 0 0?20 0,5,0 0 0 0?360 0 0 255 200?255 96?128 200?255 +sp-Beguiling Influence emo particles 2 60 30 Node Pos bip01 head Sprite Polar Polar flare-1 90 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?1 0 0 0?360 0 0?20 0,15,0 0 0 0?360 0 0 64 200?255 32?96 200?255 +sp-Breath of the Night perm 20 Sprite Polar fire-sprite 200 Blend 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 0,240 30?60 0 0 0?360 0 0 0,40,0 255 255 255 5 +sp-Breath of the Night-hit hittin perm 5 Sprite Polar fire-sprite 90 Blend 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 #radius 20?40 0 0 0?360 0 0 0,60,0 255 255 255 5 +sp-Breath of the Night-hit New Emitter 15 10 Sprite Polar fire-sprite 30 Add 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 #radius 20?40 0 0 0?360 0 0 0,255,0 255 255 255 5 +sp-Cold Comfort New Emitter 30 1 Object YPR Disc Same as Emitter Polar ring 60 Add 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,10 0 0,10 0,360 0 0 0?720 0 0 64,0 255,0,0 255,128,128 255,255,255 1 +sp-Cold Comfort-Hit touch it 30 30 Sprite Polar Polar flare-1 30 Add 0 0 0 0 0 0 0 0 0,100,0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -50 0?360 0 #radius 0,10 0 0 0?360 0 0 0,255 240?255 255 250 5 +sp-Cold Comfort-Hit droppins 30 30 Sprite Polar Cartesian flare-1 30 Add 0 0 0 0 0 0 0 0 0,100,0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-40 0 0?360 0?360 #radius 1,5,1 0 0 0?360 0 0 0,255,0 240 255 250 5 +sp-Dark One's Own Luck sparklemotion 120 5 Node Pos bip01 head Sprite flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 #radius 0 0 0?360 0 0 128,0 148 0 211 1 +sp-Dark One's Own Luck New Emitter 15 30 Node Pos bip01 head Sprite flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 #radius 0 0 0?360 0 0 64,0 255 255 255 1 +sp-Enervating Shadow veil2 35 perm 100 Object Pos Sprite Polar fire-sprite 60 Blend 0 0 0 0 0 0 0 0 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,-100 0?360 0,25 0?20 2,15 0 0 0 0 0 0,150,100,50,0 87?156 0?28 127?255 15 +sp-Enervating Shadow startup 5 1200 Object Pos Disc Polar flare-big 60 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,50 0 0?360 0,120 0?30 3?20 0 0 0?360 0 0 0,128,0 87 0 127 100 +sp-Enervating Shadow-hit ground boomin 5 45 10 Object YPR bip01 l foot Cartesian Disc World Cartesian Cartesian flare-3 20 Blend 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?60 #radius 0 0 0 0 0 64,0 87?156 0?28 127?255 +sp-Enervating Shadow-loss hero1 perm 30 Bones Sprite flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4?10 0 0 0 0 0 0,200,150,100,50,0 87?156 0?28 127?255 +sp-Enervating Shadow-loss herostart 5 200 Bones Sprite flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4,30 0 0 0 0 0 0,200,150,100,50,0 87?156 0?28 127?255 +sp-Leaps and Bounds Heart Flashes 0 1 Sprite Polar flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,200 0 0 0 30,10,20,15,30,10,5,20,30,10,20,15,30,10,5,20,30,10,20,15,30,10,5,20,30,10,20,15,30,10,5,20,30,10,20,15,30,10,5,20,30,10,20,15,30,10,5,20, 0 0 0,-720 0 0 255,0 0,0 255,255 255,0 +sp-Leaps and Bounds sparkles 1 30 200 Sprite Polar flare-1 30 Add 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,200 0 0?360 0 0?60 5,0 0 0 0 0 0 0,128,0 0,0 255,255 255,0 -36 -122 43 29 +sp-Leaps and Bounds Blessings from 15 60 Sprite Polar sliver 20 Add 0 0 0 0 0 0 0 0 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 0 0?360 0 10,0 0,100 0 0 0 0 0 0,64,0 0,0 255,255 255,0 +sp-Miasmic Cloud perm 5 Sprite Polar fire-sprite 200 Blend 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 0,120 30?60 0 0 0?360 0 0 0,40,0 148 0 211 5 +sp-Miasmic Cloud-hit hittin perm 5 Sprite Polar fire-sprite 90 Blend 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 #radius 20?40 0 0 0?360 0 0 0,60,0 148 0 211 5 +sp-Miasmic Cloud-hit New Emitter 15 10 Sprite Polar fire-sprite 30 Add 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 #radius 20?40 0 0 0?360 0 0 0,255,0 148 0 211 5 +sp-Soulreaving Aura circle 2 0 30 500 Disc Polar bigcircle 60 Add 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 0,120 0,30 0 0 0 0 0 0,8,16,0 255,64,64,64 255,0,0,0 255,255,255,255 +sp-Soulreaving Aura sparklies 0 5 1000 Disc Polar bigcircle 60 Add 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0?360 0 0,120 1 0 0 0 0 0 0,255,0 64,64,64,64 0,0,0,0 255,255,255,255 +sp-Soulreaving Aura-HP sparkles 1 240 20 Sprite Polar Cartesian flare 60 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10?-10 0 0?360 0?60 #radius 0,10 0 0 0,720 0 0 0,255,0 64 0 255 -76 -108 69 25 +sp-Soulreaving Aura-HP bam 10 200 Sprite Polar Cartesian flare 30 Add 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10?-10 0 0?360 0?60 #radius 10,0 0 0 0,720 0 0 0,255,0 64 0 255 -76 -108 69 25 diff --git a/tpdatasrc/tpgamefiles/rules/protos/black_tentacles.tab b/tpdatasrc/tpgamefiles/rules/protos/black_tentacles.tab new file mode 100644 index 000000000..df906e957 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/protos/black_tentacles.tab @@ -0,0 +1 @@ +12999 obj_t_generic Black Tentacle OF_SEE_THROUGH OF_SHOOT_THROUGH OF_NO_BLOCK OF_INVULNERABLE OF_DONTLIGHT OF_CLICK_THROUGH OF_DONTDRAW 12999 12999 size_large 16000 1 19 8031 Wizard 0 diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/draconic_feats_and_breath_weapons.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/draconic_feats_and_breath_weapons.mes new file mode 100644 index 000000000..204b3fe7d --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/draconic_feats_and_breath_weapons.mes @@ -0,0 +1,41 @@ +// Class Breath Enums and Auras + +{3231}{Spell Like Dragon Cone Breath} +{3232}{Spell Like Dragon Line Breath} +{3242}{Dragon Lineage Black} +{3243}{Dragon Lineage Blue} +{3244}{Dragon Lineage Brass} +{3245}{Dragon Lineage Bronze} +{3246}{Dragon Lineage Copper} +{3247}{Dragon Lineage Gold} +{3248}{Dragon Lineage Green} +{3249}{Dragon Lineage Red} +{3250}{Dragon Lineage Silver} +{3251}{Dragon Lineage White} +{3831}{Marshal Minor Aura} +{3832}{Marshal Major Aura} +{3833}{Marshal Adrenaline Boost} +{3840}{Draconic Aura} + +{8231}{Spell Like Dragon Cone Breath} +{8232}{Spell Like Dragon Line Breath} +{8242}{Dragon Lineage Black} +{8243}{Dragon Lineage Blue} +{8244}{Dragon Lineage Brass} +{8245}{Dragon Lineage Bronze} +{8246}{Dragon Lineage Copper} +{8247}{Dragon Lineage Gold} +{8248}{Dragon Lineage Green} +{8249}{Dragon Lineage Red} +{8250}{Dragon Lineage Silver} +{8251}{Dragon Lineage White} +{8831}{Marshal Minor Aura} +{8832}{Marshal Major Aura} +{8833}{Marshal Adrenaline Boost} +{8840}{Draconic Aura} + +{23831}{TAG_MINOR_AURA} +{23832}{TAG_MAJOR_AURA} +{23833}{TAG_CLASS_FEATURES_MARSHAL_ADRENALINE_BOOST} +{23840}{TAG_DRACONIC_AURAS} + diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/dragon_disciple_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/dragon_disciple_spell_enum.mes new file mode 100644 index 000000000..91a27524d --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/dragon_disciple_spell_enum.mes @@ -0,0 +1,7 @@ +// Dragon Disciple Breath Weapons + +{3231}{Dragon Disciple Cone Breath} +{3232}{Dragon Disciple Line Breath} + +{23231}{DRAGON_DISCIPLE_CONE_BREATH} +{23232}{DRAGON_DISCIPLE_LINE_BREATH} diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes index f9006e141..93ff11316 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes @@ -1,3 +1,6 @@ +// Core Spells +{158}{Evard's Black Tentacles} + // Vigor Spell Fixes {794}{Vigor, Lesser} {795}{Vigor} @@ -43,10 +46,10 @@ {1086}{Fire Shuriken} {1087}{Phantom Foe} {1088}{Veil of Shadow} -{1089}{Curse of Impending Blades Mass} +{1089}{Curse of Imp. Blades, Mass} {1090}{Dissonant Chord} {1091}{Haunting Tune} -{1092}{Loves Lament} +{1092}{Love's Lament} {1093}{Ray of Dizziness} {1094}{Wounding Whispers} {1095}{Dirge of Discord} @@ -70,6 +73,7 @@ {1114}{Clear Mind} {1115}{Deafening Clang} {1116}{Grave Strike} +{1117}{Rhino's Rush} {1118}{Faith Healing} {1119}{Summon Undead I} {1120}{Angelskin} @@ -105,7 +109,7 @@ {1150}{Deific Vengeance} {1151}{Frost Breath} {1152}{Ghost Touch Armor} -{1153}{Aid Mass} +{1153}{Aid, Mass} {1154}{Align Weapon Mass} {1155}{Bless Weapon Swift} {1156}{Anarchic Storm} @@ -130,7 +134,32 @@ {1176}{Draconic Might} {1177}{Vigor, Mass Lesser} {1178}{Vigor, Mass Improved} +{1179}{Sure Strike} +{1180}{Hunter's Eye} +{1181}{Tactical Precision} +{1182}{Accuracy} +{1183}{Hail of Stone} +{1184}{Lesser Orb of Acid} +{1185}{Lesser Orb of Cold} +{1186}{Lesser Orb of Electricity} +{1187}{Lesser Orb of Fire} +{1188}{Lesser Orb of Sound} +{1189}{Blades of Fire} +{1190}{Fireburst} +{1191}{Greater Fireburst} +{1192}{Ice Knife} +{1193}{Whirling Blade} +{1194}{Ring of Blades} +{1195}{Blast of Flame} +{1196}{Orb of Acid} +{1197}{Orb of Cold} +{1198}{Orb of Electricity} +{1199}{Orb of Fire} +{1200}{Orb of Sound} +{1201}{Icelance} +{1202}{Revivify} +{5158}{Evard's Black Tentacles} {5794}{Vigor, Lesser} {5795}{Vigor} {5796}{Vigor, Greater} @@ -172,10 +201,10 @@ {6086}{Fire Shuriken} {6087}{Phantom Foe} {6088}{Veil of Shadow} -{6089}{Curse of Impending Blades Mass} +{6089}{Curse of Imp. Blades, Mass} {6090}{Dissonant Chord} {6091}{Haunting Tune} -{6092}{Loves Lament} +{6092}{Love's Lament} {6093}{Ray of Dizziness} {6094}{Wounding Whispers} {6095}{Dirge of Discord} @@ -183,22 +212,23 @@ {6097}{Find the Gap} {6098}{Wraithstrike} {6099}{Resonating Bolt} -{6100}{Resistance Greater} +{6100}{Resistance, Greater} {6101}{Fugue} -{6102}{Sirines Grace} +{6102}{Sirine's Grace} {6103}{Dolorous Blow} {6105}{Cacophonic Burst} {6106}{Wail of Doom} {6107}{Heart Ripper} {6108}{Dirge} -{6109}{Nixies Grace} +{6109}{Nixie's Grace} {6110}{Ray of Light} -{6111}{Resistance Superior} +{6111}{Resistance, Superior} {6112}{Strategic Charge} {6113}{Blessed Aim} {6114}{Clear Mind} {6115}{Deafening Clang} {6116}{Grave Strike} +{6117}{Rhino's Rush} {6118}{Faith Healing} {6119}{Summon Undead I} {6120}{Angelskin} @@ -234,12 +264,12 @@ {6150}{Deific Vengeance} {6151}{Frost Breath} {6152}{Ghost Touch Armor} -{6153}{Aid Mass} +{6153}{Aid, Mass} {6154}{Align Weapon Mass} {6155}{Bless Weapon Swift} {6156}{Anarchic Storm} {6157}{Clutch of Orcus} -{6158}{Conviction Mass} +{6158}{Conviction, Mass} {6159}{Corona of Cold} {6161}{Demon Dirge} {6162}{Devil Blight} @@ -259,7 +289,32 @@ {6176}{Draconic Might} {6177}{Vigor, Mass Lesser} {6178}{Vigor, Mass Improved} +{6179}{Sure Strike} +{6180}{Hunter's Eye} +{6181}{Tactical Precision} +{6182}{Accuracy} +{6183}{Hail of Stone} +{6184}{Lesser Orb of Acid} +{6185}{Lesser Orb of Cold} +{6186}{Lesser Orb of Electricity} +{6187}{Lesser Orb of Fire} +{6188}{Lesser Orb of Sound} +{6189}{Blades of Fire} +{6190}{Fireburst} +{6191}{Greater Fireburst} +{6192}{Ice Knife} +{6193}{Whirling Blade} +{6194}{Ring of Blades} +{6195}{Blast of Flame} +{6196}{Orb of Acid} +{6197}{Orb of Cold} +{6198}{Orb of Electricity} +{6199}{Orb of Fire} +{6200}{Orb of Sound} +{6201}{Icelance} +{6202}{Revivify} +{20158}{TAG_SPELLS_EVARD'S_BLACK_TENTACLES} {20794}{TAG_SPELLS_VIGOR,_LESSER} {20795}{TAG_SPELLS_VIGOR} {20796}{TAG_SPELLS_VIGOR,_GREATER} @@ -301,10 +356,10 @@ {21086}{TAG_SPELLS_FIRE_SHURIKEN} {21087}{TAG_SPELLS_PHANTOM_FOE} {21088}{TAG_SPELLS_VEIL_OF_SHADOW} -{21089}{TAG_SPELLS_CURSE_OF_IMPENDING_BLADES_MASS} +{21089}{TAG_SPELLS_CURSE_OF_IMP._BLADES,_MASS} {21090}{TAG_SPELLS_DISSONANT_CHORD} {21091}{TAG_SPELLS_HAUNTING_TUNE} -{21092}{TAG_SPELLS_LOVES_LAMENT} +{21092}{TAG_SPELLS_LOVE'S_LAMENT} {21093}{TAG_SPELLS_RAY_OF_DIZZINESS} {21094}{TAG_SPELLS_WOUNDING_WHISPERS} {21095}{TAG_SPELLS_DIRGE_OF_DISCORD} @@ -312,22 +367,23 @@ {21097}{TAG_SPELLS_FIND_THE_GAP} {21098}{TAG_SPELLS_WRAITHSTRIKE} {21099}{TAG_SPELLS_RESONATING_BOLT} -{21100}{TAG_SPELLS_RESISTANCE} +{21100}{TAG_SPELLS_RESISTANCE,_GREATER} {21101}{TAG_SPELLS_FUGUE} -{21102}{TAG_SPELLS_SIRINES_GRACE} +{21102}{TAG_SPELLS_SIRINE'S_GRACE} {21103}{TAG_SPELLS_DOLOROUS_BLOW} {21105}{TAG_SPELLS_CACOPHONIC_BURST} {21106}{TAG_SPELLS_WAIL_OF_DOOM} {21107}{TAG_SPELLS_HEART_RIPPER} {21108}{TAG_SPELLS_DIRGE} -{21109}{TAG_SPELLS_NIXIES_GRACE} +{21109}{TAG_SPELLS_NIXIE'S_GRACE} {21110}{TAG_SPELLS_RAY_OF_LIGHT} -{21111}{TAG_SPELLS_RESISTANCE_SUPERIOR} +{21111}{TAG_SPELLS_RESISTANCE,_SUPERIOR} {21112}{TAG_SPELLS_STRATEGIC_CHARGE} {21113}{TAG_SPELLS_BLESSED_AIM} {21114}{TAG_SPELLS_CLEAR_MIND} {21115}{TAG_SPELLS_DEAFENING_CLANG} {21116}{TAG_SPELLS_GRAVE_STRIKE} +{21117}{TAG_SPELLS_RHINO'S_RUSH} {21118}{TAG_SPELLS_FAITH_HEALING} {21119}{TAG_SPELLS_SUMMON_UNDEAD_I} {21120}{TAG_SPELLS_ANGELSKIN} @@ -363,12 +419,12 @@ {21150}{TAG_SPELLS_DEIFIC_VENGEANCE} {21151}{TAG_SPELLS_FROST_BREATH} {21152}{TAG_SPELLS_GHOST_TOUCH_ARMOR} -{21153}{TAG_SPELLS_AID_MASS} +{21153}{TAG_SPELLS_AID,_MASS} {21154}{TAG_SPELLS_ALIGN_WEAPON_MASS} {21155}{TAG_SPELLS_BLESS_WEAPON_SWIFT} {21156}{TAG_SPELLS_ANARCHIC_STORM} {21157}{TAG_SPELLS_CLUTCH_OF_ORCUS} -{21158}{TAG_SPELLS_CONVICTION_MASS} +{21158}{TAG_SPELLS_CONVICTION,_MASS} {21159}{TAG_SPELLS_CORONA_OF_COLD} {21161}{TAG_SPELLS_DEMON_DIRGE} {21162}{TAG_SPELLS_DEVIL_BLIGHT} @@ -388,3 +444,27 @@ {21176}{TAG_SPELLS_DRACONIC_MIGHT} {21177}{TAG_SPELLS_VIGOR,_MASS_LESSER} {21178}{TAG_SPELLS_VIGOR,_MASS_IMPROVED} +{21179}{TAG_SPELLS_SURE_STRIKE} +{21180}{TAG_SPELLS_HUNTER'S_EYE} +{21181}{TAG_SPELLS_TACTICAL_PRECISION} +{21182}{TAG_SPELLS_ACCURACY} +{21183}{TAG_SPELLS_HAIL_OF_STONE} +{21184}{TAG_SPELLS_LESSER_ORB_OF_ACID} +{21185}{TAG_SPELLS_LESSER_ORB_OF_COLD} +{21186}{TAG_SPELLS_LESSER_ORB_OF_ELECTRICITY} +{21187}{TAG_SPELLS_LESSER_ORB_OF_FIRE} +{21188}{TAG_SPELLS_LESSER_ORB_OF_SOUND} +{21189}{TAG_SPELLS_BLADES_OF_FIRE} +{21190}{TAG_SPELLS_FIREBURST} +{21191}{TAG_SPELLS_GREATER_FIREBURST} +{21192}{TAG_SPELLS_ICE_KNIFE} +{21193}{TAG_SPELLS_WHIRLING_BLADE} +{21194}{TAG_SPELLS_RING_OF_BLADES} +{21195}{TAG_SPELLS_BLAST_OF_FLAME} +{21196}{TAG_SPELLS_ORB_OF_ACID} +{21197}{TAG_SPELLS_ORB_OF_COLD} +{21198}{TAG_SPELLS_ORB_OF_ELECTRICITY} +{21199}{TAG_SPELLS_ORB_OF_FIRE} +{21200}{TAG_SPELLS_ORB_OF_SOUND} +{21201}{TAG_SPELLS_ICELANCE} +{21202}{TAG_SPELLS_REVIVIFY} diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes new file mode 100644 index 000000000..265055655 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -0,0 +1,147 @@ +// Warlock Invocation enums + +// Eldritch Blast Shape Invocations +{2300}{Eldritch Blast} +{2301}{Eldritch Spear} +{2302}{Hideous Blow} // not implemented +{2303}{Eldritch Chain} +{2304}{Eldritch Cone} +{2305}{Eldritch Line} +{2306}{Eldritch Doom} +{2307}{Eldritch Glaive} // not implemented + +// Eldritch Essence Invocations +{2311}{Frightful Blast} +{2312}{Sickening Blast} +{2313}{Beshadowed Blast} +{2314}{Brimstone Blast} +{2315}{Hellrime Blast} +{2316}{Bewitching Blast} +{2317}{Noxious Blast} +{2318}{Repelling Blast} // not implemented +{2319}{Vitriolic Blast} +{2320}{Hindering Blast} +{2321}{Utterdark Blast} // not implemented +{2322}{Binding Blast} +{2323}{Penetrating Blast} +{2324}{Baneful Blast} // not implemented +{2325}{Hammer Blast} // not implemented +{2326}{Deteriorating Blast} // not implemented + +// Warlock Invocations +{2330}{Beguiling Influence} +{2331}{Breath of the Night} +{2332}{Dark One's Own Luck} +{2333}{Entropic Warding} +{2334}{Leaps and Bounds} +{2335}{Miasmic Cloud} +{2336}{See the Unseen} +{2337}{Spiderwalk} // not implemented +{2338}{Soulreaving Aura} +{2339}{All Seeing Eyes} +{2340}{Charm} +{2341}{Curse of Despair} +{2342}{Fell Flight} // not implemented +{2343}{Flee the Scene} +{2344}{The Dead Walk} // not implemented +{2345}{Voracious Dispelling} // not implemented +{2346}{Walk Unseen} +{2347}{Cold Comfort} +{2348}{Witchwood Step} // not implemented +{2349}{Dread Seizure} // not implemented +{2350}{Ignore the Pyre} +{2357}{Enervating Shadow} + +{7300}{Eldritch Blast} +{7301}{Eldritch Spear} +{7302}{Hideous Blow} // not implemented +{7303}{Eldritch Chain} +{7304}{Eldritch Cone} +{7305}{Eldritch Line} +{7306}{Eldritch Doom} +{7307}{Eldritch Glaive} // not implemented +{7311}{Frightful Blast} +{7312}{Sickening Blast} +{7313}{Beshadowed Blast} +{7314}{Brimstone Blast} +{7315}{Hellrime Blast} +{7316}{Bewitching Blast} +{7317}{Noxious Blast} +{7318}{Repelling Blast} // not implemented +{7319}{Vitriolic Blast} +{7320}{Hindering Blast} +{7321}{Utterdark Blast} // not implemented +{7322}{Binding Blast} +{7323}{Penetrating Blast} +{7324}{Baneful Blast} // not implemented +{7325}{Hammer Blast} // not implemented +{7326}{Deteriorating Blast} // not implemented +{7330}{Beguiling Influence} +{7331}{Breath of the Night} +{7332}{Dark One's Own Luck} +{7333}{Entropic Warding} +{7334}{Leaps and Bounds} +{7335}{Miasmic Cloud} +{7336}{See the Unseen} +{7337}{Spiderwalk} // not implemented +{7338}{Soulreaving Aura} +{7339}{All Seeing Eyes} +{7340}{Charm} +{7341}{Curse of Despair} +{7342}{Fell Flight} // not implemented +{7343}{Flee the Scene} +{7344}{The Dead Walk} // not implemented +{7345}{Voracious Dispelling} // not implemented +{7346}{Walk Unseen} +{7347}{Cold Comfort} +{7348}{Witchwood Step} // not implemented +{7349}{Dread Seizure} // not implemented +{7350}{Ignore the Pyre} +{7357}{Enervating Shadow} + +{22300}{TAG_SPELLS_ELDRITCH_BLAST} +{22301}{TAG_SPELLS_ELDRITCH_SPEAR} +{22302}{TAG_SPELLS_HIDEOUS_BLOW} // not implemented +{22303}{TAG_SPELLS_ELDRITCH_CHAIN} +{22304}{TAG_SPELLS_ELDRITCH_CONE} +{22305}{TAG_SPELLS_ELDRITCH_LINE} +{22306}{TAG_SPELLS_ELDRITCH_DOOM} +{22307}{TAG_SPELLS_ELDRITCH_GLAIVE} // not implemented +{22311}{TAG_SPELLS_FRIGHTFUL_BLAST} +{22312}{TAG_SPELLS_SICKENING_BLAST} +{22313}{TAG_SPELLS_BESHADOWED_BLAST} +{22314}{TAG_SPELLS_BRIMSTONE_BLAST} +{22315}{TAG_SPELLS_HELLRIME_BLAST} +{22316}{TAG_SPELLS_BEWITCHING_BLAST} +{22317}{TAG_SPELLS_NOXIOUS_BLAST} +{22318}{TAG_SPELLS_REPELLING_BLAST} // not implemented +{22319}{TAG_SPELLS_VITRIOLIC_BLAST} // not implemented +{22320}{TAG_SPELLS_HINDERING_BLAST} +{22321}{TAG_SPELLS_UTTERDARK_BLAST} // not implemented +{22322}{TAG_SPELLS_BINDING_BLAST} // not implemented +{22323}{TAG_SPELLS_PENETRATING_BLAST} // not implemented +{22324}{TAG_SPELLS_BANEFUL_BLAST} // not implemented +{22325}{TAG_SPELLS_HAMMER_BLAST} // not implemented +{22326}{TAG_SPELLS_DETERIORATING_BLAST} // not implemented +{22330}{TAG_SPELLS_BEGUILING_INFLUENCE} +{22331}{TAG_SPELLS_BREATH_OF_THE_NIGHT} +{22332}{TAG_SPELLS_DARK_ONE'S_OWN_LUCK} +{22333}{TAG_SPELLS_ENTROPIC_WARDING} +{22334}{TAG_SPELLS_LEAPS_AND_BOUNDS} +{22335}{TAG_SPELLS_MIASMIC_CLOUD} +{22336}{TAG_SPELLS_SEE_THE_UNSEEN} +{22337}{TAG_SPELLS_SPIDERWALK} // not implemented +{22338}{TAG_SPELLS_SOULREAVING_AURA} +{22339}{TAG_SPELLS_ALL_SEEING_EYES} +{22340}{TAG_SPELLS_WARLOCK_CHARM} +{22341}{TAG_SPELLS_CURSE_OF_DESPAIR} +{22342}{TAG_SPELLS_FELL_FLIGHT} // not implemented +{22343}{TAG_SPELLS_FLEE_THE_SCENE} +{22344}{TAG_SPELLS_THE_DEAD_WALK} // not implemented +{22345}{TAG_SPELLS_VORACIOUS_DISPELLING} // not implemented +{22346}{TAG_SPELLS_WALK_UNSEEN} +{22347}{TAG_SPELLS_COLD_COMFORT} +{22348}{TAG_SPELLS_WITCHWOOD_STEP} // not implemented +{22349}{TAG_SPELLS_DREAD_SEIZURE} // not implemented +{22350}{TAG_SPELLS_IGNORE_THE_PYRE} +{22357}{TAG_SPELLS_ENERVATING_SHADOW} diff --git a/tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt new file mode 100644 index 000000000..e63dd38e8 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt @@ -0,0 +1,17 @@ +School: None +Component: S +Casting Time: 1 action +Range: Specified 60 +Saving Throw: None +Spell Resistance: Yes +Projectile: Yes +flags_Target: Range +inc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Self +mode_Target: Single +min_Target: 1 +max_Target: 1 +radius_Target: 0 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt b/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt new file mode 100644 index 000000000..302d34f6e --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt @@ -0,0 +1,17 @@ +School: None +Component: S +Casting Time: 1 action +Range: Specified 250 +Saving Throw: None +Spell Resistance: Yes +Projectile: Yes +flags_Target: Range +inc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Self +mode_Target: Single +min_Target: 1 +max_Target: 1 +radius_Target: 0 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt b/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt new file mode 100644 index 000000000..34266b2df --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt @@ -0,0 +1,19 @@ +School: None +Component: S +Casting Time: 1 action +Range: Specified 60 +Saving Throw: None +Spell Resistance: Yes +Projectile: Yes +flags_Target: Range +inc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Self +mode_Target: Multi +mode_Target: Primary 30 Feet +mode_Target: End Early Multi +min_Target: 1 +max_Target: -521 +radius_Target: 0 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2304 - Eldritch Cone.txt b/tpdatasrc/tpgamefiles/rules/spells/2304 - Eldritch Cone.txt new file mode 100644 index 000000000..7f6d912dd --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2304 - Eldritch Cone.txt @@ -0,0 +1,18 @@ +School: None +Component: S +Casting Time: 1 action +Range: Specified 30 +Saving Throw: Willpower +Spell Resistance: Yes +Projectile: No +flags_Target: Range +flags_Target: Degrees +flags_Target: Fixed-radius +inc_flags_Target: Other +exc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Cone +radius_Target: 60 +degrees_Target: 90 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2305 - Eldritch Line.txt b/tpdatasrc/tpgamefiles/rules/spells/2305 - Eldritch Line.txt new file mode 100644 index 000000000..ec9f3e1a7 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2305 - Eldritch Line.txt @@ -0,0 +1,16 @@ +School: None +Component: S +Casting Time: 1 action +Range: Specified 60 +Saving Throw: Reflex +Spell Resistance: Yes +Projectile: No +flags_Target: Range +flags_Target: Radius +inc_flags_Target: Other +exc_flags_Target: Non-critter +exc_flags_Target: Self +exc_flags_Target: Dead +mode_Target: Ray +radius_Target: 5 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt b/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt new file mode 100644 index 000000000..826df3ae7 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt @@ -0,0 +1,19 @@ +School: None +Component: S +Casting Time: 1 action +Range: Specified 20 +Saving Throw: Reflex +Spell Resistance: Yes +Projectile: No +flags_Target: Range +inc_flags_Target: Other +exc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Multi +mode_Target: Once-Multi +mode_Target: End Early Multi +min_Target: 1 +max_Target: 0 +radius_Target: 0 +ai_type: ai_action_offensive diff --git a/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt new file mode 100644 index 000000000..09e89cde4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: Free Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt new file mode 100644 index 000000000..09e89cde4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: Free Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt new file mode 100644 index 000000000..09e89cde4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: Free Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt new file mode 100644 index 000000000..09e89cde4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: Free Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt new file mode 100644 index 000000000..09e89cde4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: Free Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2316 - Bewitching Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2316 - Bewitching Blast.txt new file mode 100644 index 000000000..09e89cde4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2316 - Bewitching Blast.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: Free Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2317 - Noxious Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2317 - Noxious Blast.txt new file mode 100644 index 000000000..09e89cde4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2317 - Noxious Blast.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: Free Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2319 - Vitriolic Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2319 - Vitriolic Blast.txt new file mode 100644 index 000000000..09e89cde4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2319 - Vitriolic Blast.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: Free Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2320 - Hindering Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2320 - Hindering Blast.txt new file mode 100644 index 000000000..09e89cde4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2320 - Hindering Blast.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: Free Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2322 - Binding Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2322 - Binding Blast.txt new file mode 100644 index 000000000..09e89cde4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2322 - Binding Blast.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: Free Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2323 - Penetrating Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2323 - Penetrating Blast.txt new file mode 100644 index 000000000..09e89cde4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2323 - Penetrating Blast.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: Free Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt b/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt new file mode 100644 index 000000000..f17837d89 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Other +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt b/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt new file mode 100644 index 000000000..f593f1c14 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt @@ -0,0 +1,15 @@ +School: Conjuration +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Other +inc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 20 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt b/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt new file mode 100644 index 000000000..e6cd472d6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt @@ -0,0 +1,16 @@ +School: None +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Other +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive +choices: 3061 3062 3063 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2333 - Entropic Warding.txt b/tpdatasrc/tpgamefiles/rules/spells/2333 - Entropic Warding.txt new file mode 100644 index 000000000..db1d07c84 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2333 - Entropic Warding.txt @@ -0,0 +1,15 @@ +School: Abjuration +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Other +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive diff --git a/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt b/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt new file mode 100644 index 000000000..f17837d89 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Other +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt b/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt new file mode 100644 index 000000000..f2e0cfbb7 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Other +inc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +radius_Target: 10 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt b/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt new file mode 100644 index 000000000..2371565c4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt @@ -0,0 +1,15 @@ +School: Divination +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Other +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt b/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt new file mode 100644 index 000000000..641636d8e --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt @@ -0,0 +1,16 @@ +School: Necromancy +Component: S +Casting Time: Swift Action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Other +exc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +mode_Target: Area +radius_Target: 10 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt b/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt new file mode 100644 index 000000000..f17837d89 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt @@ -0,0 +1,15 @@ +School: None +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Other +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2340 - Warlock Charm.txt b/tpdatasrc/tpgamefiles/rules/spells/2340 - Warlock Charm.txt new file mode 100644 index 000000000..878c6bce4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2340 - Warlock Charm.txt @@ -0,0 +1,18 @@ +School: Enchantment +Descriptor: Mind-Affecting +Component: S +Casting Time: 1 action +Range: Close +Saving Throw: Willpower +Spell Resistance: Yes +Projectile: No +flags_Target: Range +inc_flags_Target: Other +exc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Single +min_Target: 1 +max_Target: 1 +radius_Target: 0 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2341 - Curse of Despair.txt b/tpdatasrc/tpgamefiles/rules/spells/2341 - Curse of Despair.txt new file mode 100644 index 000000000..d871102ac --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2341 - Curse of Despair.txt @@ -0,0 +1,18 @@ +School: Necromancy +Component: S +Casting Time: 1 action +Range: Touch +Saving Throw: Willpower +Spell Resistance: Yes +Projectile: No +flags_Target: Range +inc_flags_Target: Other +exc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Single +min_Target: 1 +max_Target: 1 +radius_Target: 0 +ai_type: ai_action_offensive +choices: 151 152 153 154 155 156 157 158 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2343 - Flee the Scene.txt b/tpdatasrc/tpgamefiles/rules/spells/2343 - Flee the Scene.txt new file mode 100644 index 000000000..f7633d0c7 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2343 - Flee the Scene.txt @@ -0,0 +1,17 @@ +School: Conjuration +Descriptor: Teleportation +Component: S +Casting Time: Full Round +Range: Medium +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +exc_flags_Target: Dead +exc_flags_Target: Self +exc_flags_Target: Other +exc_flags_Target: Non-critter +mode_Target: Location +mode_Target: Loc Is Clear +radius_Target: 0 +ai_type: ai_action_flee \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2346 - Walk Unseen.txt b/tpdatasrc/tpgamefiles/rules/spells/2346 - Walk Unseen.txt new file mode 100644 index 000000000..37a9479a6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2346 - Walk Unseen.txt @@ -0,0 +1,15 @@ +School: Illusion +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Other +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/2347 - Cold Comfort.txt b/tpdatasrc/tpgamefiles/rules/spells/2347 - Cold Comfort.txt new file mode 100644 index 000000000..c9d7a6696 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2347 - Cold Comfort.txt @@ -0,0 +1,16 @@ +School: Abjuration +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Other +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_defensive +choices: 3071 3072 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2350 - Ignore the Pyre.txt b/tpdatasrc/tpgamefiles/rules/spells/2350 - Ignore the Pyre.txt new file mode 100644 index 000000000..4129e89ed --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2350 - Ignore the Pyre.txt @@ -0,0 +1,16 @@ +School: Abjuration +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: None +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +exc_flags_Target: Other +mode_Target: Personal +radius_Target: 0 +ai_type: ai_action_offensive +choices: 121 122 123 124 125 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2357 - Enervating Shadow.txt b/tpdatasrc/tpgamefiles/rules/spells/2357 - Enervating Shadow.txt new file mode 100644 index 000000000..cdc5d9be3 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2357 - Enervating Shadow.txt @@ -0,0 +1,16 @@ +School: None +Component: S +Casting Time: 1 action +Range: Personal +Saving Throw: Fortitude +Spell Resistance: Yes +Projectile: No +flags_Target: Range +inc_flags_Target: Other +exc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Personal +mode_Target: Area +radius_Target: 20 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/3231 - Dragon Disciple Cone Breath.txt b/tpdatasrc/tpgamefiles/rules/spells/3231 - Dragon Disciple Cone Breath.txt new file mode 100644 index 000000000..07c9d910a --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/3231 - Dragon Disciple Cone Breath.txt @@ -0,0 +1,17 @@ +School: None +Casting Time: 1 action +Range: Specified 30 +Saving Throw: Reflex +Spell Resistance: No +Projectile: No +flags_Target: Range +flags_Target: Degrees +flags_Target: Fixed-radius +inc_flags_Target: Other +exc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Cone +radius_Target: 60 +degrees_Target: 90 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/spells/3232 - Dragon Disciple Line Breath.txt b/tpdatasrc/tpgamefiles/rules/spells/3232 - Dragon Disciple Line Breath.txt new file mode 100644 index 000000000..1073d15d1 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/3232 - Dragon Disciple Line Breath.txt @@ -0,0 +1,15 @@ +School: None +Casting Time: 1 action +Range: Specified 60 +Saving Throw: Reflex +Spell Resistance: No +Projectile: No +flags_Target: Range +flags_Target: Radius +inc_flags_Target: Other +exc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Ray +radius_Target: 5 +ai_type: ai_action_offensive \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/Spell2300 - Eldritch Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2300 - Eldritch Blast.py new file mode 100644 index 000000000..6b48462a6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2300 - Eldritch Blast.py @@ -0,0 +1,50 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Eldritch Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + print "spell.spell_level=", spell.spell_level + print "spell.dc=", spell.dc + +def OnSpellEffect(spell): + print "Eldritch Blast OnSpellEffect" + +def OnBeginRound(spell): + print "Eldritch Blast OnBeginRound" + +def OnBeginProjectile(spell, projectile, index_of_target): + print "Eldritch Blast OnBeginProjectile" + projectile.obj_set_int(obj_f_projectile_part_sys_id, game.particles("sp-Eldritch Blast-proj", projectile)) + +def OnEndProjectile(spell, projectile, index_of_target): + print "Eldritch Blast OnEndProjectile" + + spell.duration = 0 + spellTarget = spell.target_list[index_of_target] + spellDamageDice = dice_new("1d6") + spellDamageDice.number = min(int(min((spell.caster_level + 1) / 2, 6)) + int(max((spell.caster_level - 11) / 3, 0)), 9) #capped at 9d6 at cl 20 + damageType = spell.caster.d20_query("PQ_Eldritch_Blast_Damage_Type") + if not damageType: + damageType = D20DT_MAGIC + spellDamageReduction = 100 #100 indicates full damage + + game.particles_end(projectile.obj_get_int(obj_f_projectile_part_sys_id)) + + attackResult = spell.caster.perform_touch_attack(spellTarget.obj) + + if attackResult & D20CAF_HIT: + game.particles("sp-Eldritch Blast-hit", spellTarget.obj) + spellTarget.obj.spell_damage_weaponlike(spell.caster, damageType, spellDamageDice, D20DAP_UNSPECIFIED, spellDamageReduction, D20A_CAST_SPELL, spell.id, attackResult, index_of_target) + if not spellTarget.obj.d20_query("PQ_Eldritch_Blast_Has_Secondary_Effect"): + spell.target_list.remove_target(spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30007) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + + +def OnEndSpellCast(spell): + print "Eldritch Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2301 - Eldritch Spear.py b/tpdatasrc/tpgamefiles/scr/Spell2301 - Eldritch Spear.py new file mode 100644 index 000000000..b28f29802 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2301 - Eldritch Spear.py @@ -0,0 +1,50 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Eldritch Spear OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + print "spell.spell_level=", spell.spell_level + print "spell.dc=", spell.dc + +def OnSpellEffect(spell): + print "Eldritch Spear OnSpellEffect" + +def OnBeginRound(spell): + print "Eldritch Spear OnBeginRound" + +def OnBeginProjectile(spell, projectile, index_of_target): + print "Eldritch Spear OnBeginProjectile" + projectile.obj_set_int(obj_f_projectile_part_sys_id, game.particles("sp-Eldritch Spear-proj", projectile)) + +def OnEndProjectile(spell, projectile, index_of_target): + print "Eldritch Spear OnEndProjectile" + + spell.duration = 0 + spellTarget = spell.target_list[index_of_target] + spellDamageDice = dice_new("1d6") + spellDamageDice.number = min(int(min((spell.caster_level + 1) / 2, 6)) + int(max((spell.caster_level - 11) / 3, 0)), 9) #capped at 9d6 at cl 20 + damageType = spell.caster.d20_query("PQ_Eldritch_Blast_Damage_Type") + if not damageType: + damageType = D20DT_MAGIC + spellDamageReduction = 100 #100 indicates full damage + + game.particles_end(projectile.obj_get_int(obj_f_projectile_part_sys_id)) + + attackResult = spell.caster.perform_touch_attack(spellTarget.obj) + + if attackResult & D20CAF_HIT: + game.particles("sp-Eldritch Blast-hit", spellTarget.obj) + spellTarget.obj.spell_damage_weaponlike(spell.caster, damageType, spellDamageDice, D20DAP_UNSPECIFIED, spellDamageReduction, D20A_CAST_SPELL, spell.id, attackResult, index_of_target) + if not spellTarget.obj.d20_query("PQ_Eldritch_Blast_Has_Secondary_Effect"): + spell.target_list.remove_target(spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30007) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + + +def OnEndSpellCast(spell): + print "Eldritch Spear OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2303 - Eldritch Chain.py b/tpdatasrc/tpgamefiles/scr/Spell2303 - Eldritch Chain.py new file mode 100644 index 000000000..684098542 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2303 - Eldritch Chain.py @@ -0,0 +1,55 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Eldritch Chain OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + print "spell.spell_level=", spell.spell_level + print "spell.dc=", spell.dc + +def OnSpellEffect(spell): + print "Eldritch Chain OnSpellEffect" + + targetsToRemove = [] + spell.duration = 0 + spellDamageDice = dice_new("1d6") + spellDamageDice.number = min(int(min((spell.caster_level + 1) / 2, 6)) + int(max((spell.caster_level - 11) / 3, 0)), 9) #capped at 9d6 at cl 20 + damageType = spell.caster.d20_query("PQ_Eldritch_Blast_Damage_Type") + if not damageType: + damageType = D20DT_MAGIC + spellDamageReduction = 100 #100 indicates full damage + + #game.particles("sp-Ray of Enfeeblement", spell.target_loc) + game.pfx_chain_lightning( spell.caster, spell.num_of_targets, spell.target_list) + + missedEarlierTarget = False + secondaryTarget = False + for spellTarget in spell.target_list: + if missedEarlierTarget: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30007) + game.particles("Fizzle", spellTarget.obj) + targetsToRemove.append(spellTarget.obj) + continue + attackResult = spell.caster.perform_touch_attack(spellTarget.obj) + if attackResult & D20CAF_HIT: + if secondaryTarget: + spellDamageDice.number /= 2 + spellTarget.obj.spell_damage_weaponlike(spell.caster, damageType, spellDamageDice, D20DAP_UNSPECIFIED, spellDamageReduction, D20A_CAST_SPELL, spell.id, attackResult, 0) + secondaryTarget = True + if not spellTarget.obj.d20_query("PQ_Eldritch_Blast_Has_Secondary_Effect"): + targetsToRemove.append(spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30007) + game.particles("Fizzle", spellTarget.obj) + missedEarlierTarget = True + targetsToRemove.append(spellTarget.obj) + if targetsToRemove: + spell.target_list.remove_list(targetsToRemove) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Eldritch Chain OnBeginRound" + +def OnEndSpellCast(spell): + print "Eldritch Chain OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2304 - Eldritch Cone.py b/tpdatasrc/tpgamefiles/scr/Spell2304 - Eldritch Cone.py new file mode 100644 index 000000000..82f80f91f --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2304 - Eldritch Cone.py @@ -0,0 +1,41 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Eldritch Cone OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + print "spell.spell_level=", spell.spell_level + print "spell.dc=", spell.dc + +def OnSpellEffect(spell): + print "Eldritch Cone OnSpellEffect" + + targetsToRemove = [] + spell.duration = 0 + saveType = D20_Save_Reduction_Half + spellDamageDice = dice_new("1d6") + spellDamageDice.number = min(int(min((spell.caster_level + 1) / 2, 6)) + int(max((spell.caster_level - 11) / 3, 0)), 9) #capped at 9d6 at cl 20 + damageType = spell.caster.d20_query("PQ_Eldritch_Blast_Damage_Type") + if not damageType: + damageType = D20DT_MAGIC + saveDescriptor = D20STD_F_NONE + + game.particles("sp-Eldritch Cone", spell.caster) + + for spellTarget in spell.target_list: + if spellTarget.obj.reflex_save_and_damage(spell.caster, spell.dc, saveType, saveDescriptor, spellDamageDice, damageType, D20DAP_UNSPECIFIED, D20A_CAST_SPELL, spell.id): + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30001) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30002) + if not spellTarget.obj.d20_query("PQ_Eldritch_Blast_Has_Secondary_Effect"): + targetsToRemove.append(spellTarget.obj) + if targetsToRemove: + spell.target_list.remove_list(targetsToRemove) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Eldritch Cone OnBeginRound" + +def OnEndSpellCast(spell): + print "Eldritch Cone OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2305 - Eldritch Line.py b/tpdatasrc/tpgamefiles/scr/Spell2305 - Eldritch Line.py new file mode 100644 index 000000000..ea1f17790 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2305 - Eldritch Line.py @@ -0,0 +1,41 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Eldritch Line OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + print "spell.spell_level=", spell.spell_level + print "spell.dc=", spell.dc + +def OnSpellEffect(spell): + print "Eldritch Line OnSpellEffect" + + targetsToRemove = [] + spell.duration = 0 + saveType = D20_Save_Reduction_Half + spellDamageDice = dice_new("1d6") + spellDamageDice.number = min(int(min((spell.caster_level + 1) / 2, 6)) + int(max((spell.caster_level - 11) / 3, 0)), 9) #capped at 9d6 at cl 20 + damageType = spell.caster.d20_query("PQ_Eldritch_Blast_Damage_Type") + if not damageType: + damageType = D20DT_MAGIC + saveDescriptor = D20STD_F_NONE + + game.particles("sp-Eldritch Line", spell.caster) + + for spellTarget in spell.target_list: + if spellTarget.obj.reflex_save_and_damage(spell.caster, spell.dc, saveType, saveDescriptor, spellDamageDice, damageType, D20DAP_UNSPECIFIED, D20A_CAST_SPELL, spell.id): + spellTarget.obj.float_mesfile_line('mes\\spell.mes', 30001) + else: + spellTarget.obj.float_mesfile_line('mes\\spell.mes', 30002) + if not spellTarget.obj.d20_query("PQ_Eldritch_Blast_Has_Secondary_Effect"): + targetsToRemove.append(spellTarget.obj) + if targetsToRemove: + spell.target_list.remove_list(targetsToRemove) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Eldritch Line OnBeginRound" + +def OnEndSpellCast(spell): + print "Eldritch Line OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2306 - Eldritch Doom.py b/tpdatasrc/tpgamefiles/scr/Spell2306 - Eldritch Doom.py new file mode 100644 index 000000000..0e094cca4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2306 - Eldritch Doom.py @@ -0,0 +1,41 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Eldritch Doom OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + print "spell.spell_level=", spell.spell_level + print "spell.dc=", spell.dc + +def OnSpellEffect(spell): + print "Eldritch Doom OnSpellEffect" + + targetsToRemove = [] + spell.duration = 0 + saveType = D20_Save_Reduction_Half + spellDamageDice = dice_new("1d6") + spellDamageDice.number = min(int(min((spell.caster_level + 1) / 2, 6)) + int(max((spell.caster_level - 11) / 3, 0)), 9) #capped at 9d6 at cl 20 + damageType = spell.caster.d20_query("PQ_Eldritch_Blast_Damage_Type") + if not damageType: + damageType = D20DT_MAGIC + saveDescriptor = D20STD_F_NONE + + game.particles("sp-Eldritch Doom", spell.caster) + + for spellTarget in spell.target_list: + if spellTarget.obj.reflex_save_and_damage(spell.caster, spell.dc, saveType, saveDescriptor, spellDamageDice, damageType, D20DAP_UNSPECIFIED, D20A_CAST_SPELL, spell.id): + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30001) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30002) + if not spellTarget.obj.d20_query("PQ_Eldritch_Blast_Has_Secondary_Effect"): + targetsToRemove.append(spellTarget.obj) + if targetsToRemove: + spell.target_list.remove_list(targetsToRemove) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Eldritch Doom OnBeginRound" + +def OnEndSpellCast(spell): + print "Eldritch Doom OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2311 - Frightful Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2311 - Frightful Blast.py new file mode 100644 index 000000000..bd40b8d86 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2311 - Frightful Blast.py @@ -0,0 +1,25 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Frightful Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Frightful Blast OnSpellEffect" + + spell.duration = 0 * spell.caster_level + spellTarget = spell.target_list[0] + spellEnum = spell_frightful_blast + + spellTarget.obj.condition_add_with_args("Frightful Blast", spellEnum, 0) + + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Frightful Blast OnBeginRound" + +def OnEndSpellCast(spell): + print "Frightful Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2312 - Sickening Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2312 - Sickening Blast.py new file mode 100644 index 000000000..2479bb1e5 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2312 - Sickening Blast.py @@ -0,0 +1,25 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Sickening Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Sickening Blast OnSpellEffect" + + spell.duration = 0 * spell.caster_level + spellTarget = spell.target_list[0] + spellEnum = spell_sickening_blast + + spellTarget.obj.condition_add_with_args("Sickening Blast", spellEnum, 0) + + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Sickening Blast OnBeginRound" + +def OnEndSpellCast(spell): + print "Sickening Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2313 - Beshadowed Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2313 - Beshadowed Blast.py new file mode 100644 index 000000000..64db0c70d --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2313 - Beshadowed Blast.py @@ -0,0 +1,25 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Beshadowed Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Beshadowed Blast OnSpellEffect" + + spell.duration = 0 * spell.caster_level + spellTarget = spell.target_list[0] + spellEnum = spell_beshadowed_blast + + spellTarget.obj.condition_add_with_args("Beshadowed Blast", spellEnum, 0) + + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Beshadowed Blast OnBeginRound" + +def OnEndSpellCast(spell): + print "Beshadowed Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2314 - Brimstone Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2314 - Brimstone Blast.py new file mode 100644 index 000000000..f34ab0223 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2314 - Brimstone Blast.py @@ -0,0 +1,25 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Brimstone Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Brimstone Blast OnSpellEffect" + + spell.duration = 0 * spell.caster_level + spellTarget = spell.target_list[0] + spellEnum = spell_brimstone_blast + + spellTarget.obj.condition_add_with_args("Brimstone Blast", spellEnum, 0) + + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Brimstone Blast OnBeginRound" + +def OnEndSpellCast(spell): + print "Brimstone Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2315 - Hellrime Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2315 - Hellrime Blast.py new file mode 100644 index 000000000..d8838d681 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2315 - Hellrime Blast.py @@ -0,0 +1,25 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Hellrime Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Hellrime Blast OnSpellEffect" + + spell.duration = 0 * spell.caster_level + spellTarget = spell.target_list[0] + spellEnum = spell_hellrime_blast + + spellTarget.obj.condition_add_with_args("Hellrime Blast", spellEnum, 0) + + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Hellrime Blast OnBeginRound" + +def OnEndSpellCast(spell): + print "Hellrime Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2316 - Bewitching Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2316 - Bewitching Blast.py new file mode 100644 index 000000000..5d4d58c83 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2316 - Bewitching Blast.py @@ -0,0 +1,25 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Bewitching Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Bewitching Blast OnSpellEffect" + + spell.duration = 0 * spell.caster_level + spellTarget = spell.target_list[0] + spellEnum = spell_bewitching_blast + + spellTarget.obj.condition_add_with_args("Bewitching Blast", spellEnum, 0) + + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Bewitching Blast OnBeginRound" + +def OnEndSpellCast(spell): + print "Bewitching Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2317 - Noxious Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2317 - Noxious Blast.py new file mode 100644 index 000000000..b60ad0d67 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2317 - Noxious Blast.py @@ -0,0 +1,25 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Noxious Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Noxious Blast OnSpellEffect" + + spell.duration = 0 * spell.caster_level + spellTarget = spell.target_list[0] + spellEnum = spell_noxious_blast + + spellTarget.obj.condition_add_with_args("Noxious Blast", spellEnum, 0) + + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Noxious Blast OnBeginRound" + +def OnEndSpellCast(spell): + print "Noxious Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2319 - Vitriolic Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2319 - Vitriolic Blast.py new file mode 100644 index 000000000..1f6fc8f28 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2319 - Vitriolic Blast.py @@ -0,0 +1,25 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Vitriolic Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Vitriolic Blast OnSpellEffect" + + spell.duration = 0 * spell.caster_level + spellTarget = spell.target_list[0] + spellEnum = spell_vitriolic_blast + + spellTarget.obj.condition_add_with_args("Vitriolic Blast", spellEnum, 0) + + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Vitriolic Blast OnBeginRound" + +def OnEndSpellCast(spell): + print "Vitriolic Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2320 - Hindering Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2320 - Hindering Blast.py new file mode 100644 index 000000000..528aca786 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2320 - Hindering Blast.py @@ -0,0 +1,25 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Hindering Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Hindering Blast OnSpellEffect" + + spell.duration = 0 * spell.caster_level + spellTarget = spell.target_list[0] + spellEnum = spell_hindering_blast + + spellTarget.obj.condition_add_with_args("Hindering Blast", spellEnum, 0) + + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Hindering Blast OnBeginRound" + +def OnEndSpellCast(spell): + print "Hindering Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2322 - Binding Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2322 - Binding Blast.py new file mode 100644 index 000000000..94fbbcf6f --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2322 - Binding Blast.py @@ -0,0 +1,25 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Binding Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Binding Blast OnSpellEffect" + + spell.duration = 0 * spell.caster_level + spellTarget = spell.target_list[0] + spellEnum = spell_binding_blast + + spellTarget.obj.condition_add_with_args("Binding Blast", spellEnum, 0) + + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Binding Blast OnBeginRound" + +def OnEndSpellCast(spell): + print "Binding Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2323 - Penetrating Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2323 - Penetrating Blast.py new file mode 100644 index 000000000..5577f788c --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2323 - Penetrating Blast.py @@ -0,0 +1,25 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Penetrating Blast OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Penetrating Blast OnSpellEffect" + + spell.duration = 0 * spell.caster_level + spellTarget = spell.target_list[0] + spellEnum = spell_penetrating_blast + + spellTarget.obj.condition_add_with_args("Penetrating Blast", spellEnum, 0) + + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Penetrating Blast OnBeginRound" + +def OnEndSpellCast(spell): + print "Penetrating Blast OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2330 - Beguiling Influence.py b/tpdatasrc/tpgamefiles/scr/Spell2330 - Beguiling Influence.py new file mode 100644 index 000000000..fcd4dcdea --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2330 - Beguiling Influence.py @@ -0,0 +1,27 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Beguiling Influence OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Beguiling Influence OnSpellEffect" + + spell.duration = 14400 #1 day + spellTarget = spell.target_list[0] + + if spellTarget.obj.condition_add_with_args("sp-Beguiling Influence", spell.id, spell.duration, 0): + spellTarget.partsys_id = game.particles("sp-Beguiling Influence", spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30000) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Beguiling Influence OnBeginRound" + +def OnEndSpellCast(spell): + print "Beguiling Influence OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2331 - Breath of the Night.py b/tpdatasrc/tpgamefiles/scr/Spell2331 - Breath of the Night.py new file mode 100644 index 000000000..42cb6271c --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2331 - Breath of the Night.py @@ -0,0 +1,36 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Breath of the Night OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Breath of the Night OnSpellEffect" + + targetsToRemove = [] + spell.duration = 10 #1 min + + cloudObject = game.obj_create(OBJECT_SPELL_GENERIC, spell.target_loc) + + casterInitiative = spell.caster.get_initiative() + cloudObject.d20_status_init() + cloudObject.set_initiative(casterInitiative) + + cloudRadius = 20.0 + cloudEventId = cloudObject.object_event_append(OLC_CRITTERS, cloudRadius) + + for spellTarget in spell.target_list: + targetsToRemove.append(spellTarget.obj) + spell.target_list.remove_list(targetsToRemove) + + cloudObject.condition_add_with_args("sp-Breath of the Night", spell.id, spell.duration, 0, cloudEventId, spell.dc, 0) + + spell.target_list.remove_list(targetsToRemove) + +def OnBeginRound(spell): + print "Breath of the Night OnBeginRound" + +def OnEndSpellCast(spell): + print "Breath of the Night OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2332 - Dark Ones own Luck.py b/tpdatasrc/tpgamefiles/scr/Spell2332 - Dark Ones own Luck.py new file mode 100644 index 000000000..6848fd44a --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2332 - Dark Ones own Luck.py @@ -0,0 +1,36 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Dark One's Own Luck OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Dark One's Own Luck OnSpellEffect" + + spell.duration = 14400 #1 day + spellTarget = spell.target_list[0] + bonusValue = min((spell.caster.stat_level_get(stat_charisma) - 10) / 2, spell.caster_level) + saveType = spell.spell_get_menu_arg(RADIAL_MENU_PARAM_MIN_SETTING) + + if saveType == 1 or saveType not in range(1, 4): #not in range is fallback + saveTypeLabel = "Fortitude" + elif saveType == 2: + saveTypeLabel = "Reflex" + elif saveType == 3: + saveTypeLabel = "Will" + + if spellTarget.obj.condition_add_with_args("sp-Dark One's Own Luck {}".format(saveTypeLabel), spell.id, spell.duration, bonusValue, 0): + spellTarget.partsys_id = game.particles("Dark One's Own Luck", spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30000) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Dark One's Own Luck OnBeginRound" + +def OnEndSpellCast(spell): + print "Dark One's Own Luck OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2333 - Entropic Warding.py b/tpdatasrc/tpgamefiles/scr/Spell2333 - Entropic Warding.py new file mode 100644 index 000000000..8fddcfb2d --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2333 - Entropic Warding.py @@ -0,0 +1,27 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Entropic Warding OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Entropic Warding OnSpellEffect" + + spell.duration = 10 * spell.caster_level #1 min/cl + spellTarget = spell.target_list[0] + + if spellTarget.obj.condition_add_with_args("sp-Entropic Shield", spell.id, spell.duration, 0): + spellTarget.partsys_id = game.particles("sp-Entropic Shield", spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30000) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Entropic Warding OnBeginRound" + +def OnEndSpellCast(spell): + print "Entropic Warding OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2334 - Leaps and Bounds.py b/tpdatasrc/tpgamefiles/scr/Spell2334 - Leaps and Bounds.py new file mode 100644 index 000000000..bacdd764f --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2334 - Leaps and Bounds.py @@ -0,0 +1,27 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Leaps and Bounds OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Leaps and Bounds OnSpellEffect" + + spell.duration = 14400 #1 day + spellTarget = spell.target_list[0] + + if spellTarget.obj.condition_add_with_args("sp-Leaps and Bounds", spell.id, spell.duration, 0): + spellTarget.partsys_id = game.particles("sp-Leaps and Bounds", spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30000) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Leaps and Bounds OnBeginRound" + +def OnEndSpellCast(spell): + print "Leaps and Bounds OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2335 - Miasmic Cloud.py b/tpdatasrc/tpgamefiles/scr/Spell2335 - Miasmic Cloud.py new file mode 100644 index 000000000..78e37c5c5 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2335 - Miasmic Cloud.py @@ -0,0 +1,36 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Miasmic Cloud OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Miasmic Cloud OnSpellEffect" + + targetsToRemove = [] + spell.duration = 10 #1 min + + cloudObject = game.obj_create(OBJECT_SPELL_GENERIC, spell.target_loc) + + casterInitiative = spell.caster.get_initiative() + cloudObject.d20_status_init() + cloudObject.set_initiative(casterInitiative) + + cloudRadius = 10.0 + cloudEventId = cloudObject.object_event_append(OLC_CRITTERS, cloudRadius) + + for spellTarget in spell.target_list: + targetsToRemove.append(spellTarget.obj) + spell.target_list.remove_list(targetsToRemove) + + cloudObject.condition_add_with_args("sp-Miasmic Cloud", spell.id, spell.duration, 0, cloudEventId, spell.dc, 0) + + spell.target_list.remove_list(targetsToRemove) + +def OnBeginRound(spell): + print "Miasmic Cloud OnBeginRound" + +def OnEndSpellCast(spell): + print "Miasmic Cloud OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2336 - See the Unseen.py b/tpdatasrc/tpgamefiles/scr/Spell2336 - See the Unseen.py new file mode 100644 index 000000000..7a7b18f9b --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2336 - See the Unseen.py @@ -0,0 +1,27 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "See the Unseen OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "See the Unseen OnSpellEffect" + + spell.duration = 14400 #1 day + spellTarget = spell.target_list[0] + + if spellTarget.obj.condition_add_with_args("sp-See Invisibility", spell.id, spell.duration, 0): + spellTarget.partsys_id = game.particles("sp-See Invisibility", spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30000) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "See the Unseen OnBeginRound" + +def OnEndSpellCast(spell): + print "See the Unseen OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2338 - Soulreaving Aura.py b/tpdatasrc/tpgamefiles/scr/Spell2338 - Soulreaving Aura.py new file mode 100644 index 000000000..96175101c --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2338 - Soulreaving Aura.py @@ -0,0 +1,40 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Soulreaving Aura OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Soulreaving Aura OnSpellEffect" + + targetsToRemove = [] + spell.duration = 0 + spellDamageDice = dice_new("1d1") + damageType = D20DT_MAGIC + tempHpAmount = 0 + + game.particles("sp-Soulreaving Aura", spell.caster) + + for spellTarget in spell.target_list: + if spellTarget.obj.stat_level_get(stat_hp_current) <= 0: + spellTarget.obj.spell_damage(spell.caster, damageType, spellDamageDice, D20DAP_UNSPECIFIED, D20A_CAST_SPELL, spell.id) + targetsToRemove.append(spellTarget.obj) + if spellTarget.obj.d20_query(Q_Dead): + drainTempHp = min(spellTarget.obj.hit_dice_num, 10) + tempHpAmount += drainTempHp + + if tempHpAmount: + spell.caster.condition_add_with_args("sp-Soulreaving Aura", spell.id, spell.duration, tempHpAmount, 0) + + if targetsToRemove: + spell.target_list.remove_list(targetsToRemove) + if not spell.target_list: + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Soulreaving Aura OnBeginRound" + +def OnEndSpellCast(spell): + print "Soulreaving Aura OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2339 - All Seeing Eyes.py b/tpdatasrc/tpgamefiles/scr/Spell2339 - All Seeing Eyes.py new file mode 100644 index 000000000..b2ee100ec --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2339 - All Seeing Eyes.py @@ -0,0 +1,27 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "All Seeing Eyes OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "All Seeing Eyes OnSpellEffect" + + spell.duration = 14400 #1 day + spellTarget = spell.target_list[0] + + if spellTarget.obj.condition_add_with_args("sp-All Seeing Eyes", spell.id, spell.duration, 0): + spellTarget.partsys_id = game.particles("sp-All Seeing Eyes", spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30000) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "All Seeing Eyes OnBeginRound" + +def OnEndSpellCast(spell): + print "All Seeing Eyes OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2340 - Warlock Charm.py b/tpdatasrc/tpgamefiles/scr/Spell2340 - Warlock Charm.py new file mode 100644 index 000000000..93b083ff5 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2340 - Warlock Charm.py @@ -0,0 +1,38 @@ +from toee import * + +def OnBeginSpellCast( spell ): + print "Warlock Charm OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect( spell ): + print "Warlock Charm OnSpellEffect" + + spell.duration = 14400 * spell.caster_level + spellTarget = spell.target_list[0] + saveType = D20_Save_Will + saveDescriptor = D20STD_F_NONE + + if spellTarget.obj.is_friendly(spell.caster): + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + else: #Saving Throw to avoid effect + if spellTarget.obj.saving_throw_spell(spell.dc, saveType, saveDescriptor, spell.caster, spell.id): #success + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30001) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30002) + spell.caster.ai_follower_add(spellTarget.obj) + spellTarget.obj.condition_add_with_args("sp-Charm Monster", spell.id, spell.duration, spellTarget.obj.hit_dice_num) + spellTarget.partsys_id = game.particles("sp-Charm Monster", spellTarget.obj) + #Add target to initiative, just in case + spellTarget.obj.add_to_initiative() + game.update_combat_ui() + spell.spell_end(spell.id) + +def OnBeginRound( spell ): + print "Warlock Charm OnBeginRound" + +def OnEndSpellCast( spell ): + print "Warlock Charm OnEndSpellCast" \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/Spell2341 - Curse of Despair.py b/tpdatasrc/tpgamefiles/scr/Spell2341 - Curse of Despair.py new file mode 100644 index 000000000..98b350d8a --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2341 - Curse of Despair.py @@ -0,0 +1,50 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Curse of Despair OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Curse of Despair OnSpellEffect" + + spell.duration = 14400 #1 day + spellTarget = spell.target_list[0] + curseType = spell.spell_get_menu_arg(RADIAL_MENU_PARAM_MIN_SETTING) + if curseType not in range(1, 9): #Fallback + curseType = 8 + curseType -= 1 #Curse type is passed in range 1-8 but condition uses range 0-7 + if curseType in range(0, 6): + conditionType = "Ability" + elif curseType == 6: + conditionType = "Rolls" + else: + conditionType = "Actions" + + if spellTarget.obj.saving_throw_spell(spell.dc, D20_Save_Will, D20STD_F_NONE, spell.caster, spell.id): #success + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30001) + #Even on a successful save a minor debuff will be applied for 1 min + spell.duration = 10 #1 min + if spellTarget.obj.condition_add_with_args("sp-Curse of Despair", spell.id, spell.duration, 0): + spellTarget.partsys_id = game.particles("sp-Bestow Curse", spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30000) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30002) + if spellTarget.obj.condition_add_with_args("sp-Bestow Curse {}".format(conditionType), spell.id, spell.duration, curseType): + spellTarget.partsys_id = game.particles("sp-Bestow Curse", spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30000) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Curse of Despair OnBeginRound" + +def OnEndSpellCast(spell): + print "Curse of Despair OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2343 - Flee the Scene.py b/tpdatasrc/tpgamefiles/scr/Spell2343 - Flee the Scene.py new file mode 100644 index 000000000..40f6b48aa --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2343 - Flee the Scene.py @@ -0,0 +1,36 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Flee the Scene OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + game.particles("sp-transmutation-conjure", spell.caster) + +def OnSpellEffect(spell): + print "Flee the Scene OnSpellEffect" + + spell.duration = 0 + spellTarget = spell.caster + + if spellTarget.d20_query_has_spell_condition(sp_Dimensional_Anchor): #Taken from DD, needs a revisit! + spellTarget.float_mesfile_line("mes\\spell.mes", 30011) + game.particles("Fizzle", spellTarget) + spell.spell_end(spell.id) + else: + spellTarget.fade_to(0, 10, 40) + game.particles("sp-Dimension Door", spellTarget) + time = 750 + realtime = 1 + game.timeevent_add(fade_back_in, (spellTarget, spell.target_loc, spell), time, realtime) + +def OnBeginRound(spell): + print "Flee the Scene OnBeginRound" + +def OnEndSpellCast(spell): + print "Flee the Scene OnEndSpellCast" + +def fade_back_in(spellTarget, loc, spell): + spellTarget.move(loc, 0.0, 0.0) + game.particles("sp-Dimension Door", spellTarget) + spellTarget.fade_to(255, 10, 5) + spell.spell_end(spell.id) diff --git a/tpdatasrc/tpgamefiles/scr/Spell2346 - Walk Unseen.py b/tpdatasrc/tpgamefiles/scr/Spell2346 - Walk Unseen.py new file mode 100644 index 000000000..26b476d7e --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2346 - Walk Unseen.py @@ -0,0 +1,27 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Walk Unseen OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Walk Unseen OnSpellEffect" + + spell.duration = 14400 #1 day + spellTarget = spell.target_list[0] + + if spellTarget.obj.condition_add_with_args("sp-Invisibility", spell.id, spell.duration, 0): + spellTarget.partsys_id = game.particles("sp-Invisibility", spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30000) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Walk Unseen OnBeginRound" + +def OnEndSpellCast(spell): + print "Walk Unseen OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2347 - Cold Comfort.py b/tpdatasrc/tpgamefiles/scr/Spell2347 - Cold Comfort.py new file mode 100644 index 000000000..5e2b2c96d --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2347 - Cold Comfort.py @@ -0,0 +1,33 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Cold Comfort OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Cold Comfort OnSpellEffect" + + targetsToRemove = [] + spell.duration = 14400 + radialChoice = spell.spell_get_menu_arg(RADIAL_MENU_PARAM_MIN_SETTING) #1 = Cold, 2 = Fire + damageType = D20DT_COLD if radialChoice == 1 else D20DT_FIRE + + auraRadius = 30.0 + (spell.caster.radius / 12.0) + auraEventId = spell.caster.object_event_append(OLC_CRITTERS, auraRadius) + + for spellTarget in spell.target_list: + targetsToRemove.append(spellTarget.obj) + spell.target_list.remove_list(targetsToRemove) + + spell.caster.condition_add_with_args("sp-Cold Comfort", spell.id, spell.duration, damageType, auraEventId, spell.dc, 0) + +def OnBeginRound(spell): + print "Cold Comfort OnBeginRound" + +def OnAreaOfEffectHit(spell): + print "Cold Comfort OnAreaOfEffectHit" + +def OnEndSpellCast(spell): + print "Cold Comfort OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2350 - Ignore the Pyre.py b/tpdatasrc/tpgamefiles/scr/Spell2350 - Ignore the Pyre.py new file mode 100644 index 000000000..5d82152f3 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2350 - Ignore the Pyre.py @@ -0,0 +1,47 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Ignore the Pyre OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Ignore the Pyre OnSpellEffect" + + spell.duration = 14400 #1 day + spellTarget = spell.target_list[0] + bonusValue = spell.caster_level + radialChoice = spell.spell_get_menu_arg(RADIAL_MENU_PARAM_MIN_SETTING) #1 = Acid; 2 = Cold, 3 = Electricity, 4 = Fire, 5 = Sonic + if not radialChoice in range(1,6): #Fallback + radialChoice = game.random_range(1,5) + + if radialChoice == 1: + elementType = D20DT_ACID + spellParticles = "sp-Resist Elements-acid" + elif radialChoice == 2: + elementType = D20DT_COLD + spellParticles = "sp-Resist Elements-cold" + elif radialChoice == 3: + elementType = D20DT_ELECTRICITY + spellParticles = "sp-Resist Elements-water" + elif radialChoice == 4: + elementType = D20DT_FIRE + spellParticles = "sp-Resist Elements-fire" + elif radialChoice == 5: + elementType = D20DT_SONIC + spellParticles = "sp-Resist Elements-sonic" + + if spellTarget.obj.condition_add_with_args("sp-Ignore the Pyre", spell.id, spell.duration, bonusValue, elementType, 0): + spellTarget.partsys_id = game.particles(spellParticles, spellTarget.obj) + else: + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30000) + game.particles("Fizzle", spellTarget.obj) + spell.target_list.remove_target(spellTarget.obj) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Ignore the Pyre OnBeginRound" + +def OnEndSpellCast(spell): + print "Ignore the Pyre OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell2357 - Enervating Shadow.py b/tpdatasrc/tpgamefiles/scr/Spell2357 - Enervating Shadow.py new file mode 100644 index 000000000..9472aea88 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2357 - Enervating Shadow.py @@ -0,0 +1,31 @@ +from toee import * + +def OnBeginSpellCast(spell): + print "Enervating Shadow OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Enervating Shadow OnSpellEffect" + + targetsToRemove = [] + spell.duration = 5 + + auraRadius = 5.0 + (spell.caster.radius / 12.0) + auraEventId = spell.caster.object_event_append(OLC_CRITTERS, auraRadius) + + for spellTarget in spell.target_list: + targetsToRemove.append(spellTarget.obj) + spell.target_list.remove_list(targetsToRemove) + + spell.caster.condition_add_with_args("sp-Enervating Shadow", spell.id, spell.duration, 0, auraEventId, spell.dc, 0) + +def OnBeginRound(spell): + print "Enervating Shadow OnBeginRound" + +def OnAreaOfEffectHit(spell): + print "Enervating Shadow OnAreaOfEffectHit" + +def OnEndSpellCast(spell): + print "Enervating Shadow OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py b/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py new file mode 100644 index 000000000..f0d8cf6c6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py @@ -0,0 +1,61 @@ +from toee import * +from heritage_feat_utils import getDraconicHeritageElement + +def OnBeginSpellCast(spell): + print "Dragon Disciple Cone Breath OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Dragon Disciple Cone Breath OnSpellEffect" + + targetsToRemove = [] + spell.duration = 0 + spell.dc = 10 + spell.caster_level + ((spell.caster.stat_level_get(stat_constitution)- 10 ) / 2) + + spellDamageDice = dice_new('1d8') + if spell.caster_level < 7: + spellDamageDice.number = 2 + elif spell.caster_level < 10: + spellDamageDice.number = 4 + else: + spellDamageDice.number = 6 + saveType = D20_Save_Reduction_Half + + heritage = spell.caster.d20_query("PQ_Selected_Draconic_Heritage") + damageType = getDraconicHeritageElement(heritage) + if damageType == D20DT_ACID: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ACID + elementString = "Acid" + elif damageType == D20DT_COLD: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_COLD + elementString = "Cold" + elif damageType == D20DT_ELECTRICITY: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ELECTRICITY + elementString = "Electricity" + elif damageType == D20DT_FIRE: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_FIRE + elementString = "Fire" + else: #Fallback + saveDescriptor = D20STD_F_NONE + elementString = "Fire" + particleEffect = "sp-Breath Weapon Cone Medium {}".format(elementString) + + game.particles(particleEffect, spell.caster) + + for spellTarget in spell.target_list: + #Save for half damage: + if spellTarget.obj.reflex_save_and_damage(spell.caster, spell.dc, saveType, saveDescriptor, spellDamageDice, damageType, D20DAP_UNSPECIFIED, D20A_CAST_SPELL, spell.id): #success + spellTarget.obj.float_mesfile_line('mes\\spell.mes', 30001) + else: + spellTarget.obj.float_mesfile_line('mes\\spell.mes', 30002) + targetsToRemove.append(spellTarget.obj) + + spell.target_list.remove_list(targetsToRemove) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Dragon Disciple Cone Breath OnBeginRound" + +def OnEndSpellCast(spell): + print "Dragon Disciple Cone Breath OnEndSpellCast" \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py b/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py new file mode 100644 index 000000000..dd23cccdf --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py @@ -0,0 +1,61 @@ +from toee import * +from heritage_feat_utils import getDraconicHeritageElement + +def OnBeginSpellCast(spell): + print "Dragon Disciple Line Breath OnBeginSpellCast" + print "spell.target_list=", spell.target_list + print "spell.caster=", spell.caster, " caster.level= ", spell.caster_level + +def OnSpellEffect(spell): + print "Dragon Disciple Line Breath OnSpellEffect" + + targetsToRemove = [] + spell.duration = 0 + spell.dc = 10 + spell.caster_level + ((spell.caster.stat_level_get(stat_constitution) - 10) / 2) + + spellDamageDice = dice_new('1d8') + if spell.caster_level < 7: + spellDamageDice.number = 2 + elif spell.caster_level < 10: + spellDamageDice.number = 4 + else: + spellDamageDice.number = 6 + saveType = D20_Save_Reduction_Half + + heritage = spell.caster.d20_query("PQ_Selected_Draconic_Heritage") + damageType = getDraconicHeritageElement(heritage) + if damageType == D20DT_ACID: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ACID + elementString = "Acid" + elif damageType == D20DT_COLD: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_COLD + elementString = "Cold" + elif damageType == D20DT_ELECTRICITY: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ELECTRICITY + elementString = "Electricity" + elif damageType == D20DT_FIRE: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_FIRE + elementString = "Fire" + else: #Fallback + saveDescriptor = D20STD_F_NONE + elementString = "Fire" + particleEffect = "sp-Breath Weapon Line Medium {}".format(elementString) + + game.particles(particleEffect, spell.caster) + + for spellTarget in spell.target_list: + #Save for half damage: + if spellTarget.obj.reflex_save_and_damage(spell.caster, spell.dc, saveType, saveDescriptor, spellDamageDice, damageType, D20DAP_UNSPECIFIED, D20A_CAST_SPELL, spell.id): #success + spellTarget.obj.float_mesfile_line('mes\\spell.mes', 30001) + else: + spellTarget.obj.float_mesfile_line('mes\\spell.mes', 30002) + targetsToRemove.append(spellTarget.obj) + + spell.target_list.remove_list(targetsToRemove) + spell.spell_end(spell.id) + +def OnBeginRound(spell): + print "Dragon Disciple Line Breath OnBeginRound" + +def OnEndSpellCast(spell): + print "Dragon Disciple Line Breath OnEndSpellCast" \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/feat_utils.py b/tpdatasrc/tpgamefiles/scr/feat_utils.py new file mode 100644 index 000000000..d884db514 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/feat_utils.py @@ -0,0 +1,42 @@ +from toee import * +import tpdp +from spell_utils import getBonusHelpTag + +#This file contains common functions for feats + +#query return 1 +def queryReturnOne(attachee, args, evt_obj): + evt_obj.return_val = 1 + return 0 + +#get ability modifier +def getAbilityModifier(attachee, ability): + return (attachee.stat_level_get(ability) - 10) / 2 + +def getFeatName(args): + return args.get_cond_name() + +def getFeatTag(featName): + return "TAG_{}".format(featName.upper().replace(" ", "_")) + +def getFeatHelpTag(featName): + featTag = getFeatTag(featName) + return "~{}~[{}]".format(featName, featTag) + +def applyFeatBonus(attachee, args, evt_obj): + bonusValue = args.get_param(0) + if not bonusValue: + bonusValue = args.get_arg(2) + bonusType = args.get_param(1) + featName = getFeatName(args) + featHelpTag = getFeatHelpTag(featName) + evt_obj.bonus_list.add(bonusValue, bonusType, "{} : {}".format(bonusHelpTag, featHelpTag)) + return 0 + +class FeatPythonModifier(tpdp.ModifierSpec): + #FeatPythonModifier have at least 2 arguments: + #featEnum, empty + def __init__(self, name, args = 2, feat_cond_arg2 = 0, preventDuplicate = True, feat_list_max = -1): + self.add_to_feat_dict(name, feat_list_max, feat_cond_arg2) + def AddHook(self, eventType, eventKey, callbackFcn, argsTuple): + self.add_hook(eventType, eventKey, callbackFcn, argsTuple) diff --git a/tpdatasrc/tpgamefiles/scr/feats/feat - Draconic Heritage.py b/tpdatasrc/tpgamefiles/scr/feats/feat - Draconic Heritage.py new file mode 100644 index 000000000..b7526c659 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/feats/feat - Draconic Heritage.py @@ -0,0 +1,11 @@ +from toee import * +import char_editor +from heritage_feat_utils import hasDifferentHeritageFeat + +def CheckPrereq(attachee, classLevelled, abilityScoreRaised): + if char_editor.stat_level_get(stat_level_sorcerer) < 1: + return 0 + #Check if character already has any heritage feats + if hasDifferentHeritageFeat(char_editor, "Draconic Heritage"): + return 0 + return 1 diff --git a/tpdatasrc/tpgamefiles/scr/feats/feat - Extra Exhalation.py b/tpdatasrc/tpgamefiles/scr/feats/feat - Extra Exhalation.py new file mode 100644 index 000000000..2e9721d4e --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/feats/feat - Extra Exhalation.py @@ -0,0 +1,10 @@ +from templeplus.pymod import PythonModifier +from toee import * +import char_editor + +def CheckPrereq(attachee, classLevelled, abilityScoreRaised): + #Check if character has a limited usage Breath Weapon + #At the moment only Dragon Diciple has one: + if not char_editor.has_feat("Dragon Disciple Breath Weapon"): + return 0 + return 1 diff --git a/tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus (Invocation).py b/tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus (Invocation).py new file mode 100644 index 000000000..3afef2ee6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus (Invocation).py @@ -0,0 +1,9 @@ +from toee import * +import char_editor + +def CheckPrereq(attachee, classLevelled, abilityScoreRaised): + print "CheckPrereq Hook for GSF Invocation" + if not char_editor.has_feat("Spell Focus (Invocation)"): + print "Does not have feat requirements" + return 0 + return 1 diff --git a/tpdatasrc/tpgamefiles/scr/heritage_feat_utils.py b/tpdatasrc/tpgamefiles/scr/heritage_feat_utils.py new file mode 100644 index 000000000..9b82de5ae --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/heritage_feat_utils.py @@ -0,0 +1,174 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp + +# This file handles heritage feats + +def heritageTypeList(): + typeList = [ + "Celestial Sorcerer Heritage", + "Draconic Heritage Black", + "Draconic Heritage Blue", + "Draconic Heritage Brass", + "Draconic Heritage Bronze", + "Draconic Heritage Copper", + "Draconic Heritage Gold", + "Draconic Heritage Green", + "Draconic Heritage Red", + "Draconic Heritage Silver", + "Draconic Heritage White", + "Fey Heritage", + "Fiendish Heritage", + "Infernal Sorcerer Heritage" + ] + return typeList + +# PHB II +def getCelestialSorcererHeritageFeatList(): + featList = [ + "Celestial Sorcerer Aura", + "Celestial Sorcerer Heritage", + "Celestial Sorcerer Lance", + "Celestial Sorcerer Lore", + "Celestial Sorcerer Wings" + ] + return featList + +# Draconic Feat List +# Note: Draconic Aura and Double Aura are not part of the draconic feats! +# Missing: Complete Arcane: Claw, Flight, Legacy(maybe a skip), Power, Presence +# Missing Dragon Magic: [Colour] Dragon Lineage (started), Draconic Knowledge (skip as there are no knowledge skills?), Draconic Senses +# Missing Dragon Magic Multiclass options: Dragonfire Assault (Power Attack), Dragonfire Channeling (Turn/Rebuke), +# Dragonfire Inspiration (Bardic Music), Dragonfire Strike (Sneak/Skirmish/Sudden Strike) +# Missing Races of the Dragon: Persuasion +def getDraconicHeritageFeatList(): + featList = [ + "Draconic Arcane Grace", + "Draconic Armor", + "Draconic Breath", + "Draconic Claw ", + "Draconic Flight" + "Draconic Heritage Black", + "Draconic Heritage Blue", + "Draconic Heritage Brass", + "Draconic Heritage Bronze", + "Draconic Heritage Copper", + "Draconic Heritage Gold", + "Draconic Heritage Green", + "Draconic Heritage Red", + "Draconic Heritage Silver", + "Draconic Heritage White", + "Draconic Knowledge", + "Draconic Legacy", + "Draconic Persuasion", + "Draconic Power", + "Draconic Presence", + "Draconic Resistance", + "Draconic Senses", + "Draconic Skin", + "Draconic Toughness", + "Draconic Vigor", + "Dragon Lineage Black", + "Dragon Lineage Blue", + "Dragon Lineage Brass", + "Dragon Lineage Bronze", + "Dragon Lineage Copper", + "Dragon Lineage Gold", + "Dragon Lineage Green", + "Dragon Lineage Red", + "Dragon Lineage Silver", + "Dragon Lineage White", + "Dragonfire Assault", + "Dragonfire Channeling", + "Dragonfire Inspiration", + "Dragonfire Strike" + ] + return featList + +# Complete Mage +def getFeyHeritageFeatList(): + featList = [ + "Fey Heritage", + "Fey Legacy", + "Fey Power", + "Fey Presence", + "Fey Skin" + ] + return featList + +# Complete Mage +def getFiendishHeritageFeatList(): + featList = [ + "Fiendish Heritage", + "Fiendish Legacy", + "Fiendish Power", + "Fiendish Presence", + "Fiendish Resistance" + ] + return featList + +# PHB II +def getInfernalSorcererHeritageFeatList(): + featList = [ + "Infernal Sorcerer Eyes", + "Infernal Sorcerer Heritage", + "Infernal Sorcerer Howl", + "Infernal Sorcerer Resistance", + ] + return featList + +def hasDifferentHeritageFeat(attachee, featToAquire): + for heritageFeat in heritageTypeList(): + if not featToAquire == heritageFeat: + if attachee.has_feat(heritageFeat): + return True + return False + +# Counts the number of heritage feats a character has +# Used by several feats +def countHeritageFeats(attachee, heritageType): + if heritageType == heritage_celestial_sorcerer: + featList = getCelestialSorcererHeritageFeatList() + elif heritageType in range(heritage_draconic_black, heritage_draconic_white + 1): + featList = getDraconicHeritageFeatList() + elif heritageType == heritage_fey: + featList = getFeyHeritageFeatList() + elif heritageType == heritage_fiendish: + featList = getFiendishHeritageFeatList() + elif heritageType == heritage_infernal_sorcerer: + featList = getInfernalSorcererHeritageFeatList() + numberOfFeats = 0 + for feat in featList: + if attachee.has_feat(feat): + numberOfFeats += 1 + return numberOfFeats + +# Draconic heritage mappings +# [colourString, elementType, breathWeaponShape] + +def getDictDraconicHeritage(): + dictDraconicHeritage = { + heritage_draconic_black: ["Black", D20DT_ACID, dragon_breath_shape_line], + heritage_draconic_blue: ["Blue", D20DT_ELECTRICITY, dragon_breath_shape_line], + heritage_draconic_brass: ["Brass", D20DT_FIRE, dragon_breath_shape_line], + heritage_draconic_bronze: ["Bronze", D20DT_ELECTRICITY, dragon_breath_shape_line], + heritage_draconic_copper: ["Copper", D20DT_ACID, dragon_breath_shape_line], + heritage_draconic_gold: ["Gold", D20DT_FIRE, dragon_breath_shape_cone], + heritage_draconic_green: ["Green", D20DT_ACID, dragon_breath_shape_cone], + heritage_draconic_red: ["Red", D20DT_FIRE, dragon_breath_shape_cone], + heritage_draconic_silver: ["Silver", D20DT_COLD, dragon_breath_shape_cone], + heritage_draconic_white: ["White", D20DT_COLD, dragon_breath_shape_cone] + } + return dictDraconicHeritage + +def getDraconicHeritageColourString(heritage): + dictDraconicHeritage = getDictDraconicHeritage() + return dictDraconicHeritage[heritage][0] + +def getDraconicHeritageElement(heritage): + dictDraconicHeritage = getDictDraconicHeritage() + return dictDraconicHeritage[heritage][1] + +def getDraconicHeritageBreathShape(heritage): + dictDraconicHeritage = getDictDraconicHeritage() + return dictDraconicHeritage[heritage][2] diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index b494cb307..f0272cdb6 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -232,6 +232,14 @@ def checkCategoryType(critter, *args): return True return False +# Target is a living creature +def isLivingCreature(critter): + if critter.is_category_type(mc_type_construct): + return False + elif critter.is_category_type(mc_type_undead): + return False + return True + ##### workaround getSpellClassCode ##### def getSpellClassCode(classEnum): dummySpellData = tpdp.D20SpellData() @@ -255,6 +263,50 @@ def performAttack(attacker, target, spellId, isRanged = True): game.create_history_from_id(attackAction.roll_id_0) return attackAction.flags +# Add/Change weapon alignment +def modifyWeaponAlignment(attackPower, new_d20dap): + if attackPower & D20DAP_HOLY: + attackPower -= D20DAP_HOLY + if attackPower & D20DAP_UNHOLY: + attackPower -= D20DAP_UNHOLY + if attackPower & D20DAP_CHAOS: + attackPower -= D20DAP_CHAOS + if attackPower & D20DAP_LAW: + attackPower -= D20DAP_LAW + attackPower & new_d20dap + return 0 + +# Check if weapon is a melee weapon +def isMeleeWeapon(weapon): + weaponType = weapon.obj_get_int(obj_f_weapon_type) + return game.is_melee_weapon(weaponType) + +# Get list of spell targets +def getSpellTargets(spellPacket): + targetCount = spellPacket.target_count + targetList = [] + for idx in range(0, targetCount): + target = spellPacket.get_target(idx) + targetList.append(target) + return targetList + +# Map damageType to Descriptor constant +# Resist Elements and Endure Elements queries use the +# Descriptor const for their query in data1 +def getElementEnum(damageType): + mappingDict = { + D20DT_ACID: ACID, + D20DT_COLD: COLD, + D20DT_ELECTRICITY: ELECTRICITY, + D20DT_FIRE: FIRE, + D20DT_SONIC: SONIC + } + return mappingDict.get(damageType) + +def isDaylight(): + if game.is_outdoor() and game.is_daytime(): + return True + return False ### Item Condition functions @@ -540,6 +592,17 @@ def applyDamageReduction(attachee, args, evt_obj): evt_obj.damage_packet.add_physical_damage_res(drAmount, drBreakType, damageMesId) return 0 +def applyDamageResistance(attachee, args, evt_obj): + resistanceAmount = args.get_param(0) + if not resistanceAmount: + resistanceAmount = args.get_arg(2) + resistanceType = args.get_param(1) + if not resistanceType: + resistanceType = args.get_arg(3) + damageMesId = 124 # ID124 = ~Damage Resistance~[TAG_SPECIAL_ABILITIES_RESISTANCE_TO_ENERGY] + evt_obj.damage_packet.add_damage_resistance(bonusValue, resistanceType, damageMesId) + return 0 + def applySaveBonus(attachee, args, evt_obj): saveDescriptor = args.get_param(2) if saveDescriptor: @@ -563,60 +626,130 @@ def applyTempHp(attachee, args, evt_obj): attachee.condition_add_with_args("Temporary_Hit_Points", spellId, duration, tempHpAmount) return 0 -class SpellPythonModifier(PythonModifier): - #SpellPythonModifier have at least 3 arguments: - #spellId, duration, empty - #if a simple bonusValue is passed by the spell it is set to arg 3: - #spellId, duration, bonusValue, empty - def __init__(self, name, args = 3, preventDuplicate = False): - PythonModifier.__init__(self, name, args, preventDuplicate) - self.AddHook(ET_OnGetTooltip, EK_NONE, spellTooltip, ()) - self.AddHook(ET_OnGetEffectTooltip, EK_NONE, spellEffectTooltip, ()) - self.AddHook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) - self.AddHook(ET_OnD20Signal, EK_S_Killed, spellKilled, ()) - self.AddSpellDispelCheckStandard() - self.AddSpellCountdownStandardHook() - self.AddSpellTeleportPrepareStandard() - self.AddSpellTeleportReconnectStandard() - def AddSpellConcentration(self): - self.AddHook(ET_OnConditionAdd, EK_NONE, addConcentration, ()) - self.AddHook(ET_OnD20Signal, EK_S_Concentration_Broken, checkRemoveSpell, ()) - def AddSpellDismiss(self): - self.AddHook(ET_OnConditionAdd, EK_NONE, addDismiss, ()) - self.AddHook(ET_OnD20Signal, EK_S_Dismiss_Spells, checkRemoveSpell, ()) +def getNeededSpellLevel(args): + #Valid param values: + #0: Any light spell level is suffice to dispel + #-1: Light spell level needs to be at least spell level of darkness + #1-9: Light spell level needs to be at least given spell level + neededLevel = args.get_param(0) + if neededLevel: + if neededLevel == -1: + spellId = args.get_arg(0) + spellPacket = tpdp.SpellPacket(spellId) + return spellPacket.spell_known_slot_level + elif neededLevel in range(1, 10): + return neededLevel + else: + return 0 #Fallback if somehow a wrong spell level is given + return 0 + +def dispelledByLight(attachee, args, evt_obj): + if evt_obj.is_modifier("sp-Dispel Darkness"): + neededLevel = getNeededSpellLevel(args) + dispelSpellId = evt_obj.arg1 + dispelName = spellName(dispelSpellId) + dispelSpellPacket = tpdp.SpellPacket(dispelSpellId) + dispelLevel = dispelSpellPacket.spell_known_slot_level + if dispelLevel >= neededLevel: + effectSpellId = args.get_arg(0) + effectName = spellName(effectSpellId) + attachee.float_text_line("{} dispelled by {}".format(effectName, dispelName)) + args.remove_spell_mod() + args.remove_spell() + return 0 + +def checkDaylight(attachee, args, evt_obj): + if isDaylight(): + spellId = args.get_arg(0) + name = spellName(spellId) + attachee.float_text_line("{} dispelled by daylight".format(name)) + args.remove_spell_mod() + args.remove_spell() + return 0 + +class SpellFunctions(tpdp.ModifierSpec): + def AddHook(self, eventType, eventKey, callbackFcn, argsTuple): + self.add_hook(eventType, eventKey, callbackFcn, argsTuple) def AddSpellNoDuplicate(self): - self.AddHook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) + self.add_hook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) def AddSkillBonus(self, bonusValue, bonusType, *args): if not args: eventKey = EK_NONE - self.AddHook(ET_OnGetSkillLevel, eventKey, applyBonus, (bonusValue, bonusType,)) + self.add_hook(ET_OnGetSkillLevel, eventKey, applyBonus, (bonusValue, bonusType,)) else: for skill in args: eventKey = skill + 20 - self.AddHook(ET_OnGetSkillLevel, eventKey, applyBonus, (bonusValue, bonusType,)) + self.add_hook(ET_OnGetSkillLevel, eventKey, applyBonus, (bonusValue, bonusType,)) def AddAbilityBonus(self, bonusValue, bonusType, *args): for abilityScore in args: eventKey = abilityScore + 1 - self.AddHook(ET_OnAbilityScoreLevel, eventKey, applyBonus,(bonusValue, bonusType,)) + self.add_hook(ET_OnAbilityScoreLevel, eventKey, applyBonus,(bonusValue, bonusType,)) def AddDamageReduction(self, drAmount, drBreakType): - self.AddHook(ET_OnTakingDamage2, EK_NONE, applyDamageReduction,(drAmount, drBreakType,)) + self.add_hook(ET_OnTakingDamage2, EK_NONE, applyDamageReduction,(drAmount, drBreakType,)) + def AddDamageResistance(self, resistanceAmount, resistanceType): + self.add_hook(ET_OnTakingDamage2, EK_NONE, applyDamageResistance, (resistanceAmount, resistanceType,)) def AddSaveBonus(self, bonusValue, bonusType, saveDescriptor = D20STD_F_NONE, eventKey = EK_NONE): - self.AddHook(ET_OnSaveThrowLevel, eventKey, applySaveBonus, (bonusValue, bonusType, saveDescriptor,)) + self.add_hook(ET_OnSaveThrowLevel, eventKey, applySaveBonus, (bonusValue, bonusType, saveDescriptor,)) def AddToHitBonus(self, bonusValue, bonusType, flagRequirement = 0): - self.AddHook(ET_OnToHitBonus2, EK_NONE, applyAttackPacketBonus,(bonusValue, bonusType, flagRequirement,)) + self.add_hook(ET_OnToHitBonus2, EK_NONE, applyAttackPacketBonus,(bonusValue, bonusType, flagRequirement,)) def AddAcBonus(self, bonusValue, bonusType): - self.AddHook(ET_OnGetAC, EK_NONE, applyBonus, (bonusValue, bonusType,)) + self.add_hook(ET_OnGetAC, EK_NONE, applyBonus, (bonusValue, bonusType,)) def AddAbilityCheckBonus(self, bonusValue, bonusType): #might get expanded - self.AddHook(ET_OnGetAbilityCheckModifier, EK_NONE, applyBonus, (bonusValue, bonusType,)) + self.add_hook(ET_OnGetAbilityCheckModifier, EK_NONE, applyBonus, (bonusValue, bonusType,)) def AddMovementBonus(self, bonusValue, bonusType): - self.AddHook(ET_OnGetMoveSpeedBase, EK_NONE, applyBonus, (bonusValue, bonusType,)) + self.add_hook(ET_OnGetMoveSpeedBase, EK_NONE, applyBonus, (bonusValue, bonusType,)) def AddTempHp(self, tempHpAmount): - self.AddHook(ET_OnConditionAdd, EK_NONE, applyTempHp, (tempHpAmount,)) - self.AddHook(ET_OnD20Signal, EK_S_Temporary_Hit_Points_Removed, removeTempHp, ()) + self.add_hook(ET_OnConditionAdd, EK_NONE, applyTempHp, (tempHpAmount,)) + self.add_hook(ET_OnD20Signal, EK_S_Temporary_Hit_Points_Removed, removeTempHp, ()) + def AddDispelledByLight(self, neededLevel): + self.add_hook(ET_OnConditionAddPre, EK_NONE, dispelledByLight, (neededLevel,)) + self.add_hook(ET_OnBeginRound, EK_NONE, checkDaylight, ()) + +class SpellDismissConcentrationFunctions(tpdp.ModifierSpec): + def AddSpellConcentration(self): + self.add_hook(ET_OnConditionAdd, EK_NONE, addConcentration, ()) + self.add_hook(ET_OnD20Signal, EK_S_Concentration_Broken, checkRemoveSpell, ()) + def AddSpellDismiss(self): + self.add_hook(ET_OnConditionAdd, EK_NONE, addDismiss, ()) + self.add_hook(ET_OnD20Signal, EK_S_Dismiss_Spells, checkRemoveSpell, ()) + +class SpellBasicProperties(tpdp.ModifierSpec): + def __init__(self, name, args, preventDuplicate): + self.add_spell_countdown_standard() + self.add_spell_teleport_prepare_standard() + self.add_spell_teleport_reconnect_standard() + self.add_hook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) + self.add_hook(ET_OnD20Signal, EK_S_Killed, spellKilled, ()) + +class SpellPythonModifier(SpellFunctions): + #SpellPythonModifier have at least 3 arguments: + #spellId, duration, empty + #if a simple bonusValue is passed by the spell it is set to arg 3: + #spellId, duration, bonusValue, empty + # + #This is the standard spell condition class + # + def __init__(self, name, args = 3, preventDuplicate = False): + super(SpellFunctions, self).__init__(name, args, preventDuplicate) + self.add_hook(ET_OnGetTooltip, EK_NONE, spellTooltip, ()) + self.add_hook(ET_OnGetEffectTooltip, EK_NONE, spellEffectTooltip, ()) + self.add_spell_dispel_check_standard() + self.add_spell_countdown_standard() + self.add_spell_teleport_prepare_standard() + self.add_spell_teleport_reconnect_standard() + self.add_hook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) + self.add_hook(ET_OnD20Signal, EK_S_Killed, spellKilled, ()) + def AddSpellConcentration(self): + self.add_hook(ET_OnConditionAdd, EK_NONE, addConcentration, ()) + self.add_hook(ET_OnD20Signal, EK_S_Concentration_Broken, checkRemoveSpell, ()) + def AddSpellDismiss(self): + self.add_hook(ET_OnConditionAdd, EK_NONE, addDismiss, ()) + self.add_hook(ET_OnD20Signal, EK_S_Dismiss_Spells, checkRemoveSpell, ()) ### Aoe Modifier Classes ### def addAoeObjToSpellRegistry(attachee, args, evt_obj): - spellPacket = tpdp.SpellPacket(args.get_arg(0)) + spellId = args.get_arg(0) + spellPacket = tpdp.SpellPacket(spellId) conditionName = args.get_cond_name() particlesId = game.particles(conditionName, attachee) spellPacket.add_spell_object(attachee, particlesId) @@ -633,11 +766,18 @@ def verifyAoeEventTarget(args, spellTarget, spellPacket): return False elif affectedTargets == aoe_event_target_non_friendly and spellTarget.is_friendly(spellCaster): return False - #elif spellTarget == attachee: - # return 0 + elif affectedTargets == aoe_event_target_non_friendly and spellTarget == spellPacket.caster: + return False + elif affectedTargets == aoe_event_target_all_exclude_self and spellTarget == spellPacket.caster: + return False + elif affectedTargets == aoe_event_target_friendly_exlude_self and spellTarget == spellPacket.caster: + return False + elif affectedTargets == aoe_event_target_living_creatures and not isLivingCreature(spellTarget): + return False + elif affectedTargets == aoe_event_target_living_creatures_exclude_self and spellTarget == spellPacket.caster: + return False elif spellPacket.check_spell_resistance(spellTarget): return False - return True def verifyEventId(spellEventId, aoeEventId): @@ -646,12 +786,12 @@ def verifyEventId(spellEventId, aoeEventId): return True def aoeOnEnter(attachee, args, evt_obj): - print "aoeOnEnter Hook" spellTarget = evt_obj.target spellId = args.get_arg(0) duration = args.get_arg(1) - spellDc = args.get_arg(2) + bonusValue = args.get_arg(2) spellEventId = args.get_arg(3) + spellDc = args.get_arg(4) spellPacket = tpdp.SpellPacket(spellId) aoeEventId = evt_obj.evt_id @@ -664,7 +804,7 @@ def aoeOnEnter(attachee, args, evt_obj): particlesId = game.particles("{}-hit".format(conditionName), spellTarget) if spellPacket.add_target(spellTarget, particlesId): conditionEffectName = spellName(spellId) - spellTarget.condition_add_with_args(conditionEffectName, spellId, duration + 1, spellDc, spellEventId) + spellTarget.condition_add_with_args(conditionEffectName, spellId, duration + 1, bonusValue, spellEventId, spellDc, 0) spellPacket.update_registry() return 0 @@ -709,51 +849,183 @@ def aoeSpellEndSignal(attachee, args, evt_obj): args.remove_spell_mod() return 0 -class AoeObjHandleModifier(PythonModifier): - #AoeObjHandleModifier have at least 5 arguments: - #spellId, duration, spellDc, spellEventId, empty +class AoeEventBasicProperties(tpdp.ModifierSpec): + def __init__(self, name, args, preventDuplicate): + self.add_spell_teleport_prepare_standard() + self.add_spell_teleport_reconnect_standard() + self.add_aoe_spell_ender() + self.add_hook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) + #spell end signal missing + +class AoeEventSpellProperties(AoeEventBasicProperties): + def __init__(self, name, args, preventDuplicate): + super(AoeEventBasicProperties, self).__init__(name, args, preventDuplicate) + self.add_spell_dispel_check_standard() + self.add_spell_countdown_standard() + self.add_hook(ET_OnD20Signal, EK_S_Combat_End, aoeCombatEndSignal, ()) + +class AoeObjHandleModifier(SpellDismissConcentrationFunctions): + #AoeObjHandleModifier have at least 6 arguments: + #spellId, duration, bonusValue, spellEventId, spellDc, empty + # #Use this class only, if you have a special onEnterAoE Event #Standard Cases use class below (AoeSpellHandleModifier) - def __init__(self, name, args = 5, preventDuplicate = False): - PythonModifier.__init__(self, name, args, preventDuplicate) - self.AddHook(ET_OnConditionAdd, EK_NONE, addAoeObjToSpellRegistry, ()) - self.AddHook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) - self.AddHook(ET_OnD20Signal, EK_S_Combat_End, aoeCombatEndSignal, ()) - self.AddSpellDispelCheckStandard() - self.AddSpellTeleportPrepareStandard() - self.AddSpellTeleportReconnectStandard() - self.AddSpellCountdownStandardHook() - self.AddAoESpellEndStandardHook() + # + def __init__(self, name, args = 6, preventDuplicate = False): + super(SpellDismissConcentrationFunctions, self).__init__(name, args, preventDuplicate) + self.add_hook(ET_OnD20Signal, EK_S_Combat_End, aoeCombatEndSignal, ()) + self.add_hook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) + self.add_hook(ET_OnConditionAdd, EK_NONE, addAoeObjToSpellRegistry, ()) + self.add_spell_teleport_prepare_standard() + self.add_spell_teleport_reconnect_standard() + self.add_aoe_spell_ender() + self.add_spell_dispel_check_standard() + self.add_spell_countdown_standard() + def AddHook(self, eventType, eventKey, callbackFcn, argsTuple): + self.add_hook(eventType, eventKey, callbackFcn, argsTuple) + def AddSpellNoDuplicate(self): + self.add_hook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) + +class AoeSpellHandleModifier(SpellDismissConcentrationFunctions): + #AoeSpellHandlerModifier have at least 6 arguments: + #spellId, duration, bonusValue, spellEventId, spellDc, empty + # + #Standard Class for AoE Handle Spells + # + def __init__(self, name, affectedTargets = aoe_event_target_all, args = 6, preventDuplicate = False): + super(SpellDismissConcentrationFunctions, self).__init__(name, args, preventDuplicate) + self.add_hook(ET_OnConditionAdd, EK_NONE, addAoeObjToSpellRegistry, ()) + self.add_hook(ET_OnObjectEvent, EK_OnEnterAoE, aoeOnEnter, (affectedTargets,)) + self.add_hook(ET_OnD20Signal, EK_S_Combat_End, aoeCombatEndSignal, ()) + self.add_hook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) + self.add_spell_teleport_prepare_standard() + self.add_spell_teleport_reconnect_standard() + self.add_aoe_spell_ender() + self.add_spell_dispel_check_standard() + self.add_spell_countdown_standard() + def AddHook(self, eventType, eventKey, callbackFcn, argsTuple): + self.add_hook(eventType, eventKey, callbackFcn, argsTuple) + def AddSpellNoDuplicate(self): + self.add_hook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) + +def aoeTooltip(attachee, args, evt_obj): + conditionName = args.get_cond_name() + conditionDuration = spellTime(args.get_arg(1)) + evt_obj.append("{} ({})".format(conditionName, conditionDuration)) + return 0 + +def aoeEffectTooltip(attachee, args, evt_obj): + conditionName = args.get_cond_name().upper().replace(" ", "_") + conditionDuration = spellTime(args.get_arg(1)) + conditionKey = tpdp.hash(conditionName) + evt_obj.append(conditionKey, -2, " ({})".format(conditionDuration)) + return 0 + +def applyFogConcealment(attachee, args, evt_obj): + attacker = evt_obj.attack_packet.attacker + bonusValue = 50 if attacker.distance_to(attachee) > 5.0 else 20 + bonusType = bonus_type_concealment + bonusTag = game.get_mesline("mes\\bonus_description.mes", bonusType) + spellId = args.get_arg(0) + spellHelpTag = getSpellHelpTag(spellId) + evt_obj.bonus_list.add(bonusValue, bonusType, "{} : {}".format(bonusTag, spellHelpTag)) + return 0 + +class AoeSpellEffectModifier(SpellFunctions): + #AoeSpellEffectModifier have at least 6 arguments: + #spellId, duration, bonusValue, spellEventId, spellDc, empty + def __init__(self, name, args = 6, preventDuplicate = True): + super(SpellFunctions, self).__init__(name, args, preventDuplicate) + self.add_hook(ET_OnObjectEvent, EK_OnLeaveAoE, aoeOnLeave, ()) + self.add_hook(ET_OnGetTooltip, EK_NONE, aoeTooltip, ()) + self.add_hook(ET_OnGetEffectTooltip, EK_NONE, aoeEffectTooltip, ()) + self.add_hook(ET_OnD20Query, EK_Q_Critter_Has_Condition, querySpellCondition, ()) + self.add_hook(ET_OnD20Signal, EK_S_Spell_End, aoeSpellEndSignal, ()) + self.add_hook(ET_OnD20Signal, EK_S_Combat_End, aoeCombatEndSignal, ()) + self.add_hook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) + self.add_hook(ET_OnD20Signal, EK_S_Killed, spellKilled, ()) + self.add_spell_countdown_standard() + self.add_spell_teleport_prepare_standard() + self.add_spell_teleport_reconnect_standard() + def AddFogConcealment(self): + self.add_hook(ET_OnGetDefenderConcealmentMissChance, EK_NONE, applyFogConcealment, ()) def AddSpellConcentration(self): - self.AddHook(ET_OnConditionAdd, EK_NONE, addConcentration, ()) - self.AddHook(ET_OnD20Signal, EK_S_Concentration_Broken, aoeHandleEndSignal, ()) + self.add_hook(ET_OnD20Signal, EK_S_Concentration_Broken, checkRemoveSpell, ()) def AddSpellDismiss(self): - self.AddHook(ET_OnConditionAdd, EK_NONE, addDismiss, ()) - self.AddHook(ET_OnD20Signal, EK_S_Dismiss_Spells, aoeHandleEndSignal, ()) + self.add_hook(ET_OnD20Signal, EK_S_Dismiss_Spells, checkRemoveSpell, ()) + + +##### Begin Aura Classes ###### +### Aura Class Spells are spells that are centered ### +### On the caster and travel with the caster ### + +def setAuraObjToSpellRegistry(attachee, args, evt_obj): + spellId = args.get_arg(0) + spellPacket = tpdp.SpellPacket(spellId) + conditionName = args.get_cond_name() + particlesId = game.particles(conditionName, attachee) + idx = 0 + spellPacket.set_spell_object(idx, attachee, particlesId) + spellPacket.update_registry() + return 0 + +def auraTooltip(attachee, args, evt_obj): + spellId = args.get_arg(0) + conditionName = spellName(spellId) + conditionDuration = spellTime(args.get_arg(1)) + evt_obj.append("{} Aura ({})".format(conditionName, conditionDuration)) + return 0 + +def auraEffectTooltip(attachee, args, evt_obj): + spellId = args.get_arg(0) + conditionName = "{}_AURA".format(spellKeyName(spellId)) + conditionDuration = spellTime(args.get_arg(1)) + conditionKey = tpdp.hash(conditionName) + evt_obj.append(conditionKey, -2, " ({})".format(conditionDuration)) + return 0 + +class AuraSpellHandleModifier(SpellDismissConcentrationFunctions): + #AuraSpellHandleModifier have at least 6 arguments: + #spellId, duration, bonusValue, spellEventId, spellDc, empty + # + #Class for AoE spells that are "aura" spells (spells centered on caster and move with the caster) + # + def __init__(self, name, affectedTargets = aoe_event_target_friendly, args = 6, preventDuplicate = False): + super(SpellDismissConcentrationFunctions, self).__init__(name, args, preventDuplicate) + self.add_hook(ET_OnConditionAdd, EK_NONE, setAuraObjToSpellRegistry, ()) + self.add_hook(ET_OnGetTooltip, EK_NONE, auraTooltip, ()) + self.add_hook(ET_OnGetEffectTooltip, EK_NONE, auraEffectTooltip, ()) + self.add_hook(ET_OnObjectEvent, EK_OnEnterAoE, aoeOnEnter, (affectedTargets,)) + self.add_hook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) + self.add_spell_teleport_prepare_standard() + self.add_spell_teleport_reconnect_standard() + self.add_aoe_spell_ender() + self.add_spell_dispel_check_standard() + self.add_spell_countdown_standard() + def AddHook(self, eventType, eventKey, callbackFcn, argsTuple): + self.add_hook(eventType, eventKey, callbackFcn, argsTuple) def AddSpellNoDuplicate(self): - self.AddHook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) - -class AoeSpellHandleModifier(AoeObjHandleModifier): - #AoeSpellHandlerModifier have at least 5 arguments: - #spellId, duration, spellDc, spellEventId, empty - def __init__(self, name, affectedTargets = aoe_event_target_all, args = 5, preventDuplicate = False): - super(AoeSpellHandleModifier, self).__init__(name, args, preventDuplicate) - self.AddHook(ET_OnObjectEvent, EK_OnEnterAoE, aoeOnEnter, (affectedTargets,)) - -class AoESpellEffectModifier(PythonModifier): - #AoESpellEffectPythonModifier have at least 5 arguments: - #spellId, duration, spellDc, spellEventId, empty - def __init__(self, name, args = 5, preventDuplicate = True): - PythonModifier.__init__(self, name, args, preventDuplicate) - self.AddHook(ET_OnObjectEvent, EK_OnLeaveAoE, aoeOnLeave, ()) - self.AddHook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) - self.AddHook(ET_OnD20Query, EK_Q_Critter_Has_Condition, querySpellCondition, ()) - self.AddHook(ET_OnGetTooltip, EK_NONE, spellTooltip, ()) - self.AddHook(ET_OnGetEffectTooltip, EK_NONE, spellEffectTooltip, ()) - self.AddHook(ET_OnD20Signal, EK_S_Spell_End, aoeSpellEndSignal, ()) - self.AddHook(ET_OnD20Signal, EK_S_Combat_End, aoeCombatEndSignal, ()) - self.AddHook(ET_OnD20Signal, EK_S_Killed, spellKilled, ()) - self.AddSpellCountdownStandardHook() - self.AddSpellDispellCheckHook() - self.AddSpellTeleportPrepareStandard() - self.AddSpellTeleportReconnectStandard() + self.add_hook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) + def AddDispelledByLight(self, neededLevel): + self.add_hook(ET_OnConditionAddPre, EK_NONE, dispelledByLight, (neededLevel,)) + self.add_hook(ET_OnBeginRound, EK_NONE, checkDaylight, ()) + +class AuraSpellEffectModifier(SpellFunctions): + #AuraSpellEffectModifier have at least 6 arguments: + #spellId, duration, bonusValue, spellEventId, spellDc, empty + def __init__(self, name, args = 6, preventDuplicate = True): + super(SpellFunctions, self).__init__(name, args, preventDuplicate) + self.add_hook(ET_OnObjectEvent, EK_OnLeaveAoE, aoeOnLeave, ()) + self.add_hook(ET_OnGetTooltip, EK_NONE, aoeTooltip, ()) + self.add_hook(ET_OnGetEffectTooltip, EK_NONE, aoeEffectTooltip, ()) + self.add_hook(ET_OnD20Query, EK_Q_Critter_Has_Condition, querySpellCondition, ()) + self.add_hook(ET_OnD20Signal, EK_S_Spell_End, aoeSpellEndSignal, ()) + self.add_hook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) + self.add_hook(ET_OnD20Signal, EK_S_Killed, spellKilled, ()) + self.add_spell_countdown_standard() + self.add_spell_teleport_prepare_standard() + self.add_spell_teleport_reconnect_standard() + def AddSpellConcentration(self): + self.add_hook(ET_OnD20Signal, EK_S_Concentration_Broken, checkRemoveSpell, ()) + def AddSpellDismiss(self): + self.add_hook(ET_OnD20Signal, EK_S_Dismiss_Spells, checkRemoveSpell, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/breath_weapon.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/breath_weapon.py new file mode 100644 index 000000000..4818e4c55 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/breath_weapon.py @@ -0,0 +1,83 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp + +################################################### + +print "Registering Breath Weapon" + +################################################### + +def breathWeaponOnConditionAdd(attachee, args, evt_obj): + breathWeaponId = args.get_param(0) + baseCharges = args.get_param(1) + cooldown = 0 + args.set_arg(0, breathWeaponId) + args.set_arg(1, baseCharges) + args.set_arg(2, cooldown) + args.set_arg(3, baseCharges) + args.set_arg(4, 0) + return 0 + +# Handle Breath Weapon Charges +def getMaxCharges (attachee, args): + baseCharges = args.get_arg(3) + extraCharges = attachee.d20_query("PQ_Extra_Breath_Charges") + return baseCharges + extraCharges + +def resetBreathWeaponUses(attachee, args, evt_obj): + if not args.get_arg(1) == -1: + maxCharges = getMaxCharges(attachee, args) + args.set_arg(1, maxCharges) + return 0 + +# Handle Breath Weapon Cooldown +def getBreathWeaponCoolDown(): + cooldownDice = dice_new('1d4') + return cooldownDice.roll() + +def reduceBreathWeaponCooldown(attachee, args, evt_obj): + if args.get_arg(2) > -1: + cooldown = args.get_arg(2) + cooldown -= evt_obj.data1 + if cooldown < 0 and game.combat_is_active(): + attachee.float_text_line("Breath Weapon ready") + args.set_arg(2, cooldown) + return 0 + +# Trigger Breath Weapon Used +def signalBreathWeaponUsed(attachee, args, evt_obj): + signalId = evt_obj.data1 + breathWeaponId = args.get_arg(0) + if signalId == breathWeaponId: + charges = args.get_arg(1) + if not charges == 1: + cooldown = getBreathWeaponCoolDown() + args.set_arg(2, cooldown) + if not charges == -1: + charges -= 1 + args.set_arg(1, charges) + return 0 + +def queryLimitedBreathWeapon(attachee, args, evt_obj): + if args.get_arg(1) != -1: + evt_obj.return_val = 1 + return 0 + +class BreathWeaponModifier(PythonModifier): + # Breath Weapon modifiers have 5 arguments: + # 0: breathWeaponId, 1: charges, 2: Cooldown, 3: baseCharges, 4: empty + # Charges set to -1 indicates limitless breath weapon uses + # A Breath Weapon usage always triggers a 1d4 long cooldown + # before the Breath Weapon becomes availible again + def __init__(self, name): + PythonModifier.__init__(self, name, 5, True) + self.AddHook(ET_OnD20PythonSignal, "PS_Breath_Weapon_Used", signalBreathWeaponUsed, ()) + self.AddHook(ET_OnBeginRound, EK_NONE, reduceBreathWeaponCooldown, ()) + self.AddHook(ET_OnNewDay, EK_NEWDAY_REST, resetBreathWeaponUses, ()) + self.AddHook(ET_OnD20PythonQuery, "PQ_Has_Limited_Breath_Weapon", queryLimitedBreathWeapon, ()) + + # This hook needs to be added for every BreathWeaponModifier + def breathWeaponSetArgs(self, breathWeaponId, baseCharges): + self.AddHook(ET_OnConditionAdd, EK_NONE, breathWeaponOnConditionAdd, (breathWeaponId, baseCharges,)) + diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/draconic_heritage.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/draconic_heritage.py new file mode 100644 index 000000000..81dfe9bf2 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/draconic_heritage.py @@ -0,0 +1,78 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp +import char_class_utils +import heritage_feat_utils + +# Draconic Heritage: Complete Arcane, p. 77 + +print "Registering Draconic Heritage" + +def getDraconicHeritageClassSkill(heritage): + skillDict = { + heritage_draconic_black: skill_hide, + heritage_draconic_blue: skill_listen, + heritage_draconic_green: skill_move_silently, + heritage_draconic_red: skill_intimidate, + heritage_draconic_white: skill_balance, + heritage_draconic_brass: skill_gather_information, + heritage_draconic_bronze: skill_wilderness_lore, + heritage_draconic_copper: skill_hide, + heritage_draconic_gold: skill_heal, + heritage_draconic_silver: skill_disguise + } + return skillDict[heritage] + +def getSaveDescriptor(heritageElement): + if heritageElement == D20DT_ACID: + return D20STD_F_SPELL_DESCRIPTOR_ACID + elif heritageElement == D20DT_COLD: + return D20STD_F_SPELL_DESCRIPTOR_COLD + elif heritageElement == D20DT_ELECTRICITY: + return D20STD_F_SPELL_DESCRIPTOR_ELECTRICITY + elif heritageElement == D20DT_FIRE: + return D20STD_F_SPELL_DESCRIPTOR_FIRE + return 0 + +def addClassSkill(attachee, args, evt_obj): + heritage = args.get_arg(1) + skillEnum = getDraconicHeritageClassSkill(heritage) + if evt_obj.data1 == skillEnum: + evt_obj.return_val = 1 + return 0 + +def addSavingThrowBonus(attachee, args, evt_obj): + if attachee.stat_level_get(stat_level_sorcerer) > 0: + heritage = args.get_arg(1) + heritageElement = heritage_feat_utils.getDraconicHeritageElement(heritage) + saveDescriptor = getSaveDescriptor(heritageElement) + flags = evt_obj.flags + #This is not working properly, because as soon as the spell uses reflex_save_and_damage + #the Save Descriptor gets dropped :( + #I did not use reflex_save_and_damage for my damage spells in the spell compendium + #but instead the normal saving_throw_spell and then dealt damage afterwards with + #spell_damage_with_reduction/spell_damage which leads to the situation + #that the below save bonus works with the spell compendium spells + #but not with the core spells. + print "flags: {}".format(flags) + if (flags & (1 << (saveDescriptor-1))): + bonusValue = heritage_feat_utils.countHeritageFeats(attachee, heritage) + bonusType = 0 # ID 0 = Untyped (stacking) + evt_obj.bonus_list.add(bonusValue ,bonusType ,"~Draconic Heritage~[TAG_DRACONIC_HERITAGE]") + #elif #Sleep and Paralyze missing + #there are no slepp or paralyze flags/descriptors atm, which means, you can do immunities to both types + #but no save bonus effects + return 0 + +def querySelectedHeritage(attachee, args, evt_obj): + heritage = args.get_arg(1) + evt_obj.return_val = heritage + return 0 + +draconicHeritageFeat = PythonModifier("Draconic Heritage Feat", 3) #featEnum, heritage, empty +for heritage in range(heritage_draconic_black, heritage_draconic_white + 1): + colourString = heritage_feat_utils.getDraconicHeritageColourString(heritage) + draconicHeritageFeat.MapToFeat("Draconic Heritage {}".format(colourString), feat_cond_arg2 = heritage) +draconicHeritageFeat.AddHook(ET_OnD20PythonQuery, "PQ_Selected_Draconic_Heritage", querySelectedHeritage, ()) +draconicHeritageFeat.AddHook(ET_OnSaveThrowLevel, EK_NONE, addSavingThrowBonus, ()) +draconicHeritageFeat.AddHook(ET_OnD20PythonQuery, "Is Class Skill", addClassSkill, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index f80321d07..be2f74665 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -1,7 +1,10 @@ from templeplus.pymod import PythonModifier from toee import * import tpdp +import tpactions import char_class_utils +import heritage_feat_utils +import breath_weapon ################################################### @@ -13,8 +16,12 @@ def GetSpellCasterConditionName(): print "Registering " + GetConditionName() -classEnum = stat_level_eldritch_knight +classEnum = stat_level_dragon_disciple classSpecModule = __import__('class023_dragon_disciple') + +breathWeaponEnum = 2302 +toggleFlyingId = 2303 + ################################################### @@ -47,100 +54,231 @@ def OnGetSaveThrowWill(attachee, args, evt_obj): classSpecObj.AddHook(ET_OnSaveThrowLevel, EK_SAVE_REFLEX, OnGetSaveThrowReflex, ()) classSpecObj.AddHook(ET_OnSaveThrowLevel, EK_SAVE_WILL, OnGetSaveThrowWill, ()) +##### Dragon Disciple Class Features ##### -def OnGetAbilityScore(attachee, args, evt_obj): - #statType = args.get_param(0) - lvl = attachee.stat_level_get(classEnum) - statMod = args.get_param(1) - - newValue = statMod + evt_obj.bonus_list.get_sum() - if (newValue < 3): # ensure minimum stat of 3 - statMod = 3-newValue - evt_obj.bonus_list.add(statMod, 0, 139) +### Draconic Heritage is handle by the Draconic Heritage Feat now + +### Bonus Spells per Day +def setBonusSpellPerDaySlot(attachee, args, evt_obj): + bonusSpellClass = attachee.highest_arcane_class + spellLevel = attachee.arcane_spell_level_can_cast() + args.set_arg(1, bonusSpellClass) + args.set_arg(2, spellLevel) return 0 -classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_STRENGTH, OnGetAbilityScore, ()) +def applyExtraSpell(attachee, args, evt_obj): + bonusSpellClass = args.get_arg(1) + spellLevel = args.get_arg(2) + if evt_obj.get_caster_class() == bonusSpellClass and evt_obj.spell_level == spellLevel: + bonusValue = 1 + bonusType = 0 #ID 0 untyped (stacking) + evt_obj.bonus_list.add(bonusValue, bonusType, "Bonus Spell Slot") + return 0 -#region Spell casting +bonusSpellSlot = PythonModifier("Dragon Disciple Bonus Spell Slot", 4, False) #featEnum, bonusSpellClass, spellLevel, empty +for bonusSpellCount in range(1, 8): + bonusSpellSlot.MapToFeat("Dragon Disciple Bonus Spell per Day ({})".format(bonusSpellCount)) +bonusSpellSlot.AddHook(ET_OnGetSpellsPerDayMod, EK_NONE, applyExtraSpell, ()) +bonusSpellSlot.AddHook(ET_OnConditionAdd, EK_NONE, setBonusSpellPerDaySlot, ()) -# configure the spell casting condition to hold the highest Arcane classs -def OnAddSpellCasting(attachee, args, evt_obj): - #arg0 holds the arcane class - if (args.get_arg(0) == 0): - args.set_arg(0, char_class_utils.GetHighestArcaneClass(attachee)) - +### AC Bonus +def naturalArmorACBonus(attachee, args, evt_obj): + classLevel = attachee.stat_level_get(classEnum) + if classLevel == 1: + bonusValue = 1 + elif classLevel < 7: + bonusValue = 2 + elif classLevel < 10: + bonusValue = 3 + else: + bonusValue = 4 + bonusType = 0 #ID 0 = Stacking; Wrong Type as Touch Attacks should nullify this bonus + evt_obj.bonus_list.add(bonusValue, bonusType, "~Dragon Disciple Natural Armor~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_NATURAL_ARMOR_INCREASE]") return 0 -# Extend caster level for base casting class -def OnGetBaseCasterLevel(attachee, args, evt_obj): - class_extended_1 = args.get_arg(0) - class_code = evt_obj.arg0 - if (class_code != class_extended_1): - if (evt_obj.arg1 == 0): # arg1 != 0 means you're looking for this particular class's contribution - return 0 - classLvl = attachee.stat_level_get(classEnum) - if classLvl > 1: - evt_obj.bonus_list.add(classLvl - 1, 0, 137) +naturalArmorInc = PythonModifier("Dragon Disciple Natural Armor", 0) +naturalArmorInc.MapToFeat("Dragon Disciple Natural Armor") +naturalArmorInc.AddHook(ET_OnGetAC, EK_NONE, naturalArmorACBonus, ()) + +def onGetAbilityScoreStr(attachee, args, evt_obj): + level = attachee.stat_level_get(classEnum) + if level < 2: + return 0 + elif level < 4: + bonusValue = 2 + elif level < 10: + bonusValue = 4 + else: + bonusValue = 8 + bonusType = 0 #ID 0 = Untyped(stacking) + evt_obj.bonus_list.add(bonusValue, bonusType, "~Dragon Disciple Ability Boost~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_ABILITY_BOOST]") return 0 -def OnSpellListExtensionGet(attachee, args, evt_obj): - class_extended_1 = args.get_arg(0) - class_code = evt_obj.arg0 - if (class_code != class_extended_1): - if (evt_obj.arg1 == 0): # arg1 != 0 means you're looking for this particular class's contribution - return 0 - classLvl = attachee.stat_level_get(classEnum) - if classLvl > 1: - evt_obj.bonus_list.add(classLvl - 1, 0, 137) +def onGetAbilityScoreCon(attachee, args, evt_obj): + level = attachee.stat_level_get(classEnum) + if level >= 6: + bonusValue = 2 + bonusType = 0 #ID = 0 Untyped(stacking) + evt_obj.bonus_list.add(bonusValue, bonusType, "~Dragon Disciple Ability Boost~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_ABILITY_BOOST]") return 0 -def OnInitLevelupSpellSelection(attachee, args, evt_obj): - if (evt_obj.arg0 != classEnum): - return 0 - classLvl = attachee.stat_level_get(classEnum) - if (classLvl == 0): - return 0 - class_extended_1 = args.get_arg(0) - classSpecModule.InitSpellSelection(attachee, class_extended_1) +def onGetAbilityScoreInt(attachee, args, evt_obj): + level = attachee.stat_level_get(classEnum) + if level >= 8: + bonusValue = 2 + bonusType = 0 #ID = 0 Untyped(stacking) + evt_obj.bonus_list.add(bonusValue, bonusType, "~Dragon Disciple Ability Boost~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_ABILITY_BOOST]") return 0 -def OnLevelupSpellsCheckComplete(attachee, args, evt_obj): - if (evt_obj.arg0 != classEnum): - return 0 - class_extended_1 = args.get_arg(0) - if (not classSpecModule.LevelupCheckSpells(attachee, class_extended_1) ): - evt_obj.bonus_list.add(-1, 0, 137) # denotes incomplete spell selection - return 1 - -def OnLevelupSpellsFinalize(attachee, args, evt_obj): - if (evt_obj.arg0 != classEnum): - return 0 - classLvl = attachee.stat_level_get(classEnum) - if (classLvl == 0): - return 0 - class_extended_1 = args.get_arg(0) - classSpecModule.LevelupSpellsFinalize(attachee, class_extended_1) - return - -spellCasterSpecObj = PythonModifier(GetSpellCasterConditionName(), 8) -spellCasterSpecObj.AddHook(ET_OnConditionAdd, EK_NONE, OnAddSpellCasting, ()) -spellCasterSpecObj.AddHook(ET_OnGetBaseCasterLevel, EK_NONE, OnGetBaseCasterLevel, ()) -spellCasterSpecObj.AddHook(ET_OnSpellListExtensionGet, EK_NONE, OnSpellListExtensionGet, ()) -spellCasterSpecObj.AddHook(ET_OnLevelupSystemEvent, EK_LVL_Spells_Activate, OnInitLevelupSpellSelection, ()) -spellCasterSpecObj.AddHook(ET_OnLevelupSystemEvent, EK_LVL_Spells_Check_Complete, OnLevelupSpellsCheckComplete, ()) -spellCasterSpecObj.AddHook(ET_OnLevelupSystemEvent, EK_LVL_Spells_Finalize, OnLevelupSpellsFinalize, ()) - -#endregion - -def NaturalArmorACBonus(attachee, args, evt_obj): - type = args.get_arg(0) - if type != 3: - return 0 - bonus = args.get_arg(1) - evt_obj.bonus_list.add(bonus , 0, 137) +def onGetAbilityScoreCha(attachee, args, evt_obj): + level = attachee.stat_level_get(classEnum) + if level >= 10: + bonusValue = 2 + bonusType = 0 #ID = 0 Untyped(stacking) + evt_obj.bonus_list.add(bonusValue, bonusType, "~Dragon Disciple Ability Boost~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_ABILITY_BOOST]") return 0 -naturalArmorInc = PythonModifier("Dragon Disciple Natural Armor", 3) -naturalArmorInc.MapToFeat("Dragon Disciple Natural Armor") -naturalArmorInc.AddHook(ET_OnGetAC, EK_NONE, NaturalArmorACBonus, ()) +classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_STRENGTH, onGetAbilityScoreStr, ()) +classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_CONSTITUTION, onGetAbilityScoreCon, ()) +classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_INTELLIGENCE, onGetAbilityScoreInt, ()) +classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_CHARISMA, onGetAbilityScoreCha, ()) + +### Claws and Bite +# ToDo! + +### Breath Weapon + +def getBreathWeaponTag(): + return "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON" + +def breathWeaponRadial(attachee, args, evt_obj): + print "breathWeaponRadial Hook" + breathWeaponCooldown = args.get_arg(2) + if breathWeaponCooldown > -1: + breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon Cooldown ({} round(s))".format(breathWeaponCooldown), D20A_PYTHON_ACTION, breathWeaponEnum, 0, "TAG_EXTRA_EXALATION") + else: + chargesLeft = args.get_arg(1) + maxCharges = breath_weapon.getMaxCharges(attachee, args) + heritage = attachee.d20_query("PQ_Selected_Draconic_Heritage") + breathWeaponShape = heritage_feat_utils.getDraconicHeritageBreathShape(heritage) + spellEnum = spell_dragon_diciple_cone_breath if breathWeaponShape == dragon_breath_shape_cone else spell_dragon_diciple_line_breath + breathWeaponTag = getBreathWeaponTag() + breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon ({}/{})".format(chargesLeft, maxCharges), D20A_PYTHON_ACTION, breathWeaponEnum, spellEnum, breathWeaponTag) + spellData = tpdp.D20SpellData(spellEnum) + spellData.set_spell_class(classEnum) + spellData.set_spell_level(9) #Setting this to 9 here so, it passes globes of invulnerability, as they should not protect against Breath Weapons + breathWeaponId.set_spell_data(spellData) + breathWeaponId.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) + return 0 + +def checkBreathWeapon(attachee, args, evt_obj): + if args.get_arg(1) < 1: + evt_obj.return_val = AEC_OUT_OF_CHARGES + elif args.get_arg(2) > -1: + evt_obj.return_val = AEC_ABILITY_ON_COOLDOWN + return 0 + +def performBreathWeapon(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellPacket = currentSequence.spell_packet + newSpellId = tpactions.get_new_spell_id() + spellPacket.caster_level += attachee.stat_level_get(classEnum) + tpactions.register_spell_cast(spellPacket, newSpellId) + currentSequence.spell_packet.spell_id = newSpellId + + if attachee.anim_goal_throw_spell_w_cast_anim(): # note: the animation goal has internal calls to trigger_spell_effect and the action frame + new_anim_id = attachee.anim_goal_get_new_id() + evt_obj.d20a.flags |= D20CAF_NEED_ANIM_COMPLETED + evt_obj.d20a.anim_id = new_anim_id + return 0 + +def frameBreathWeapon(attachee, args, evt_obj): + breathWeaponTag = getBreathWeaponTag() + genderString = "his" if attachee.stat_level_get(stat_gender) == 1 else "her" + game.create_history_freeform("{} uses {} ~Breath Weapon~[{}]\n\n".format(attachee.description, genderString, breathWeaponTag)) + #Send Breath Weapon Used Signal + breathWeaponId = args.get_arg(0) + attachee.d20_send_signal("PS_Breath_Weapon_Used", breathWeaponId) + return 0 + +dragonDiscipleBreathWeapon = breath_weapon.BreathWeaponModifier("Dragon Disciple Breath Weapon") +dragonDiscipleBreathWeapon.MapToFeat("Dragon Disciple Breath Weapon") +dragonDiscipleBreathWeapon.breathWeaponSetArgs(classEnum, 1) #1 = baseCharges of the Breath Weapon +dragonDiscipleBreathWeapon.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, breathWeaponRadial, ()) +dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionCheck, breathWeaponEnum, checkBreathWeapon, ()) +dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionPerform, breathWeaponEnum, performBreathWeapon, ()) +dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionFrame, breathWeaponEnum, frameBreathWeapon, ()) + + + +### Blindsense +#dropped + +###Wings +def addWings(attachee, args, evt_obj): + meshId = 14201 #Darley Wings + evt_obj.append(meshId) + return 0 + +def wingsRadial(attachee, args, evt_obj): + actionString = "Stop Flying" if attachee.d20_query("PQ_Is_Flying") else "Start Flying" + radialWingsId = tpdp.RadialMenuEntryPythonAction("{}".format(actionString), D20A_PYTHON_ACTION, toggleFlyingId, 0, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_WINGS") + radialWingsId.add_as_child(attachee, tpdp.RadialMenuStandardNode.Class) + return 0 + +def resetWings(attachee, args, evt_obj): + attachee.d20_signal("PS_Flying_End") + return 0 + +def checkWingsIndoors(attachee, args, evt_obj): + if not game.is_outdoor(): + evt_obj.return_val = AEC_ACTION_INVALID + return 0 + +def toggleWings(attachee, args, evt_obj): + isFlying = attachee.d20_query("PQ_Is_Flying") + if isFlying: + attachee.d20_send_signal("PS_Flying_End") + else: + attachee.condition_add_with_args("Flying Condition", 0, 0, 0) + return 0 + +dragonDiscipleWings = PythonModifier("Dragon Disciple Dragon Wings", 3) #empty, empty, empty +dragonDiscipleWings.MapToFeat("Dragon Disciple Wings") +dragonDiscipleWings.AddHook(ET_OnAddMesh, EK_NONE, addWings, ()) +dragonDiscipleWings.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, wingsRadial, ()) +dragonDiscipleWings.AddHook(ET_OnD20PythonActionCheck, toggleFlyingId, checkWingsIndoors, ()) +dragonDiscipleWings.AddHook(ET_OnD20PythonActionPerform, toggleFlyingId, toggleWings, ()) +dragonDiscipleWings.AddHook(ET_OnNewDay, EK_NEWDAY_REST, resetWings, ()) +dragonDiscipleWings.AddHook(ET_OnD20Signal, EK_S_Teleport_Reconnect, resetWings, ()) + + +#### Dragon Apotheosis +#Not implemented: +#Half-dragon template +#Low-light vision +#60-foot darkvision +def sleepParalyzeImmunity(attachee, args, evt_obj): + if evt_obj.is_modifier("sp-Sleep"): + evt_obj.return_val = 0 + combatMesLine = 5059 #ID 5059: "Sleep Immunity" + historyMesLine = 31 #ID 31: {[ACTOR] is immune to ~sleep~[TAG_SPELLS_SLEEP].} + attachee.float_mesfile_line('mes\\combat.mes', combatMesLine, tf_red) + game.create_history_from_pattern(historyMesLine, attachee, OBJ_HANDLE_NULL) + elif evt_obj.is_modifier("Paralyzed"): + evt_obj.return_val = 0 + attachee.float_text_line("Paralyze Immunity", tf_red) + game.create_history_freeform("{} is immune to ~paralyze~[TAG_PARALYZED] effects\n\n".format(attachee.description)) + return 0 + +def elementImmunity(attachee, args, evt_obj): + heritage = attachee.d20_query("PQ_Selected_Draconic_Heritage") + elementType = heritage_feat_utils.getDraconicHeritageElement(heritage) + damageMesLine = 132 #ID 132 in damage.mes is Immunity + evt_obj.damage_packet.add_mod_factor(0.0, elementType, damageMesLine) + return 0 +dragonDiscipleApotheosis = PythonModifier("Dragon Disciple Dragon Apotheosis", 3) #empty, empty, empty +dragonDiscipleApotheosis.MapToFeat("Dragon Disciple Dragon Apotheosis") +dragonDiscipleApotheosis.AddHook(ET_OnConditionAddPre, EK_NONE, sleepParalyzeImmunity, ()) +dragonDiscipleApotheosis.AddHook(ET_OnTakingDamage2, EK_NONE, elementImmunity, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/fatigue_exhaustion.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/fatigue_exhaustion.py index c157681a7..fb53de416 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/fatigue_exhaustion.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/fatigue_exhaustion.py @@ -108,8 +108,9 @@ def FatigueRemove(attachee, args, evt_obj): return 0 def FatigueAddHeal(attachee, args, evt_obj): - val = evt_obj.is_modifier("sp-Heal") - if val: + if (evt_obj.is_modifier("sp-Heal") + or evt_obj.is_modifier("sp-Remove Exhaustion") + or evt_obj.is_modifier("sp-Remove Fatigue") and args.get_arg(2) == 0): attachee.float_text_line("Fatigue Removed") args.condition_remove() return 0 @@ -196,7 +197,15 @@ def FatigueOnRemove(attachee, args, evt_obj): def FatigueOnRemove2(attachee, args, evt_obj): game.particles("Barbarian Fatigue-END", attachee) return 0 - + +def updateFatigueDuration(attachee, args, evt_obj): + #Added, so its possible to change the duration of fatigue from perm to a duration + #Needed for cloud effects (perm as long as you are in the cloud effect, + #Expires x rounds after leaving the cloud effect) + newDuration = evt_obj.data1 + args.set_arg(1, newDuration) + return 0 + Fatigue = PythonModifier("FatigueExhaust", 6) #Barbarian Fatigue Duration, Fatigue Duration, Exhaustion Duration, Upgradable, Particle System, Spare Fatigue.AddHook(ET_OnConditionAdd, EK_NONE, FatigueOnAdd, ()) Fatigue.AddHook(ET_OnGetTooltip, EK_NONE, FatigueTooltip, ()) @@ -217,4 +226,4 @@ def FatigueOnRemove2(attachee, args, evt_obj): Fatigue.AddHook(ET_OnD20PythonSignal, "Add Barbarian Fatigue", AddBarbarianFatigueSignal, ()) Fatigue.AddHook(ET_OnD20PythonSignal, "Add Fatigue", AddFatigueSignal, ()) Fatigue.AddHook(ET_OnD20PythonSignal, "Add Exhaustion", AddExhaustionSignal, ()) - +Fatigue.AddHook(ET_OnD20PythonSignal, "PS_Update_Fatigue_Duration", updateFatigueDuration, ()) #added by Sagenlicht diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/flying_condition.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/flying_condition.py new file mode 100644 index 000000000..3d9e9e10b --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/flying_condition.py @@ -0,0 +1,41 @@ +from templeplus.pymod import PythonModifier +from __main__ import game +from toee import * +import tpdp + +def floatImmunity(attachee, immunityEffect, immunityTag): + attachee.float_text_line("Immune due to flying", tf_red) + game.create_history_freeform("{} is immune to ~{}~[{}] effects\n\n".format(attachee.description, immunityEffect, immunityTag)) + +def preventConditions(attachee, args, evt_obj): + if evt_obj.is_modifier("sp-Grease Hit"): + evt_obj.return_val = 0 + floatImmunity(attachee, "Grease", "TAG_SPELLS_GREASE") + elif evt_obj.is_modifier("sp-Entangle On"): + evt_obj.return_val = 0 + floatImmunity(attachee, "Entangle", "TAG_SPELLS_ENTANGLE") + return 0 + +def preventAoO(attachee, args, evt_obj): + attachee.float_text_line("Flying!") + evt_obj.return_val = 0 + return 0 + +def queryIsFlying(attachee, args, evt_obj): + evt_obj.return_val = 1 + return 0 + +def tooltipFlying(attachee, args, evt_obj): + evt_obj.append("Flying!") + return 0 + +def signalStopFlying(attachee, args, evt_obj): + args.condition_remove() + return 0 + +flyingCondition = PythonModifier("Flying Condition", 3) #empty, empty, empty +flyingCondition.AddHook(ET_OnConditionAddPre, EK_NONE, preventConditions, ()) +flyingCondition.AddHook(ET_OnD20Query, EK_Q_AOOIncurs, preventAoO,()) +flyingCondition.AddHook(ET_OnGetTooltip, EK_NONE, tooltipFlying, ()) +flyingCondition.AddHook(ET_OnD20PythonQuery, "PQ_Is_Flying", queryIsFlying, ()) +flyingCondition.AddHook(ET_OnD20PythonSignal, "PS_Flying_End", signalStopFlying, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py new file mode 100644 index 000000000..bdb74eade --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py @@ -0,0 +1,19 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp +from warlock import isInvocation + +print "Registering Greater Spell Focus (Invocation)" + +def dcBonus(attachee, args, evt_obj): + spellEntry = evt_obj.spell_entry + if isInvocation(spellEntry.spell_enum): + bonusValue = 1 + bonusType = bonus_type_untyped # Stacking! + bonusLabel = "~Greater Spell Foucs (Invocation)~[TAG_SPELL_FOCUS]" + evt_obj.bonus_list.add(bonusValue, bonusType, bonusLabel) + return 0 + +gsfInvocationFeat = PythonModifier("Greater Spell Focus (Invocation)", 2) #featEnum, empty +gsfInvocationFeat.MapToFeat("Greater Spell Focus (Invocation)") +gsfInvocationFeat.AddHook(ET_OnGetSpellDcMod, EK_NONE, dcBonus, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/nauseated.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/nauseated.py new file mode 100644 index 000000000..bd436c107 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/nauseated.py @@ -0,0 +1,111 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp +from spell_utils import isLivingCreature + +print "Registering Nauseated" + +def nauseatedConditionAddPreActions(attachee, args, evt_obj): + if (evt_obj.is_modifier("sp-Heal") + or evt_obj.is_modifier("sp-Remove Nauseated")): + args.condition_remove() + return 0 + +def nauseatedConditionAddActions(attachee, args, evt_obj): + #Only living creatures are affected by nausea + if isLivingCreature(attachee): + attachee.float_text_line("Nauseated", tf_red) + game.create_history_freeform("{} is ~nauseated~[TAG_NAUSEATED]\n\n".format(attachee.description)) + particlesId = game.particles("sp-Disease-Filth Fever", attachee) #sp-Poison + args.set_arg(2, particlesId) + if attachee.d20_query(Q_Critter_Is_Concentrating) == 1: #Nauseated breaks concentration + attachee.d20_send_signal(S_Remove_Concentration) + else: + spellMesId = 32000 #ID 32000 = Target is immune! + attachee.float_mesfile_line("mes\\spell.mes", spellMesId) + args.condition_remove() + return 0 + +def nauseatedTickdown(attachee, args, evt_obj): + persistentFlag = args.get_arg(1) + if not persistentFlag: + duration = args.get_arg(0) + duration -= evt_obj.data1 + args.set_arg(0, duration) + if args.get_arg(0) < 0: + args.condition_remove() + return 0 + +#Nauseated condition limits to a single Move Action only +def setTurnBasedStatusInit(attachee, args, evt_obj): + if evt_obj.tb_status.hourglass_state > 1: + evt_obj.tb_status.hourglass_state = 1 + return 0 + +#Can't AoO under Nauseated condition +def queryAnswerFalse(attachee, args, evt_obj): + evt_obj.return_val = 0 + return 0 + +def queryAnswerTrue(attachee, args, evt_obj): + evt_obj.return_val = 1 + return 0 + +def queryHasCondition(attachee, args, evt_obj): + queryConditionRef = evt_obj.data1 + conditionName = args.get_cond_name() + nauseatedCondRef = tpdp.get_condition_ref(conditionName) + if queryConditionRef == nauseatedCondRef: + evt_obj.return_val = 1 + return 0 + +def signalUpdateDuration(attachee, args, evt_obj): + duration = evt_obj.data1 + persistentFlag = evt_obj.data2 + args.set_arg(0, duration) + args.set_arg(1, persistentFlag) + return 0 + +def nauseatedRemoveCondition(attachee, args, evt_obj): + if isLivingCreature(attachee) and attachee.stat_level_get(stat_hp_current) > -10: + attachee.float_text_line("No longer nauseated") + game.create_history_freeform("{} is no longer ~nauseated~[TAG_NAUSEATED]\n\n".format(attachee.description)) + particlesId = args.get_arg(2) + if particlesId: + game.particles_end(particlesId) + return 0 + +def getDurationLabel(duration): + if duration == 1: + return "1 round" + return "{} rounds".format(duration) + +def nauseatedTooltip(attachee, args, evt_obj): + duration = args.get_arg(0) + persistentFlag = args.get_arg(1) + conditionName = args.get_cond_name() + durationLabel = "persistent" if persistentFlag else getDurationLabel(duration) + evt_obj.append("{} ({})".format(conditionName, durationLabel)) + return 0 + +def nauseatedEffectTooltip(attachee, args, evt_obj): + duration = args.get_arg(0) + persistentFlag = args.get_arg(1) + conditionName = args.get_cond_name() + conditionKey = conditionName.upper().replace(" ", "_") + durationLabel = "persistent" if persistentFlag else getDurationLabel(duration) + evt_obj.append(tpdp.hash(conditionKey), -2, " ({})".format(durationLabel)) + return 0 + +nauseatedCondition = PythonModifier("Nauseated", 4) #duration, persistentFlag, particlesId, empty +nauseatedCondition.AddHook(ET_OnConditionAddPre, EK_NONE, nauseatedConditionAddPreActions, ()) +nauseatedCondition.AddHook(ET_OnConditionAdd, EK_NONE, nauseatedConditionAddActions, ()) +nauseatedCondition.AddHook(ET_OnTurnBasedStatusInit, EK_NONE, setTurnBasedStatusInit, ()) +nauseatedCondition.AddHook(ET_OnBeginRound, EK_NONE, nauseatedTickdown, ()) +nauseatedCondition.AddHook(ET_OnD20Query, EK_Q_CannotCast, queryAnswerTrue, ()) +nauseatedCondition.AddHook(ET_OnD20Query, EK_Q_AOOPossible, queryAnswerFalse, ()) +nauseatedCondition.AddHook(ET_OnD20Query, EK_Q_Critter_Has_Condition, queryHasCondition, ()) +nauseatedCondition.AddHook(ET_OnD20PythonSignal, "PS_Nauseated_Update_Duration", signalUpdateDuration, ()) +nauseatedCondition.AddHook(ET_OnConditionRemove, EK_NONE, nauseatedRemoveCondition, ()) +nauseatedCondition.AddHook(ET_OnGetTooltip, EK_NONE, nauseatedTooltip, ()) +nauseatedCondition.AddHook(ET_OnGetEffectTooltip, EK_NONE, nauseatedEffectTooltip, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/remove_special_conditions.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/remove_special_conditions.py new file mode 100644 index 000000000..9b03f3dc5 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/remove_special_conditions.py @@ -0,0 +1,33 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp +from utilities import * + +#This file contains all helper conditions to remove special conditions +#like fatigue or nauseated that are not already handled by a vanilla spell + +### WIP ### + +def removeSelf(attachee, args, evt_obj): + #particlesString = args.get_cond_name() + #game.particles(particlesString, attachee) + args.remove_spell_mod() + args.remove_spell() + return 0 + +class RemoveConditionModifier(PythonModifier): + # RemoveConditionModifier have 3 arguments: + # 0: spell_id, 1: duration, 2: empty + def __init__(self, name): + PythonModifier.__init__(self, name, 3, False) + self.AddHook(ET_OnConditionAdd, EK_NONE, removeSelf, ()) + self.AddSpellDispelCheckStandard() + self.AddSpellTeleportPrepareStandard() + self.AddSpellTeleportReconnectStandard() + self.AddSpellCountdownStandardHook() + +removeExhaustion = RemoveConditionModifier("sp-Remove Exhaustion") +removeFatigue = RemoveConditionModifier("sp-Remove Fatigue") +removeNauseated = RemoveConditionModifier("sp-Remove Nauseated") +removeShaken = RemoveConditionModifier("sp-Remove Shaken") +removeSickened = RemoveConditionModifier("sp-Remove Sickened") diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/shaken.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/shaken.py new file mode 100644 index 000000000..e57390830 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/shaken.py @@ -0,0 +1,92 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp +from spell_utils import checkCategoryType + +print "Registering Shaken" + +def getConditionTag(conditionName): + return "TAG_{}".format(conditionName.upper().replace(" ", "_")) + +def checkConditionalRemoval(attachee, args, evt_obj): + if (evt_obj.is_modifier("sp-Remove Fear") + or evt_obj.is_modifier("sp-Fear") + or evt_obj.is_modifier("sp-Remove Shaken")): + #or evt_obj.is_modifier("sp-Remove Panicked")): + args.condition_remove() + return 0 + +def checkImmunity(attachee, args, evt_obj): + #check if immune to Shaken + if checkCategoryType(attachee, mc_type_construct, mc_type_ooze, mc_type_plant, mc_type_undead, mc_type_vermin): + spellMesId = 32000 #ID 32000 = Target is immune! + attachee.float_mesfile_line("mes\\spell.mes", spellMesId) + args.condition_remove() + else: + conditionName = args.get_cond_name() + conditionHelpTag = getConditionTag(conditionName) + attachee.float_text_line("{}!".format(conditionName), tf_red) + particlesId = game.particles("sp-Fear-Hit", attachee) + args.set_arg(1, particlesId) + game.create_history_freeform("{} is ~{}~[{}]\n\n".format(attachee.description, conditionName, conditionHelpTag)) + return 0 + +def durationTickdown(attachee, args, evt_obj): + duration = args.get_arg(0) + duration -= evt_obj.data1 + args.set_arg(0, duration) + if args.get_arg(0) < 0: + args.condition_remove() + return 0 + +def shakenPenalty(attachee, args, evt_obj): + conditionName = args.get_cond_name() + conditionHelpTag = getConditionTag(conditionName) + bonus = -2 #Shaken is a -2 penalty to attack rolls, saving throws and skill and ability checks. + bonusType = bonus_type_untyped # Stacking! + evt_obj.bonus_list.add(bonus, bonusType, "~{}~[{}]".format(conditionName, conditionHelpTag)) + return 0 + +def queryIsShaken(attachee, args, evt_obj): + evt_obj.return_val = 1 + return 0 + +def getDurationLabel(duration): + if duration == 1: + return "1 round" + return "{} rounds".format(duration) + +def shakenTooltip(attachee, args, evt_obj): + conditionName = args.get_cond_name() + duration = args.get_arg(0) + durationLabel = getDurationLabel(duration) + evt_obj.append("{} ({})".format(conditionName, durationLabel)) + return 0 + + +def shakenEffectTooltip(attachee, args, evt_obj): + conditionName = args.get_cond_name() + conditionKey = conditionName.upper().replace(" ", "_") + duration = args.get_arg(0) + durationLabel = getDurationLabel(duration) + evt_obj.append(tpdp.hash(conditionKey), -2, " ({})".format(durationLabel)) + return 0 + +def removeParticles(attachee, args, evt_obj): + particlesId = args.get_arg(1) + if particlesId: + game.particles_end(particlesId) + return 0 + +shakenCondition = PythonModifier("Shaken", 3) #duration, particlesId, empty +shakenCondition.AddHook(ET_OnConditionAddPre, EK_NONE, checkConditionalRemoval, ()) +shakenCondition.AddHook(ET_OnConditionAdd, EK_NONE, checkImmunity, ()) +shakenCondition.AddHook(ET_OnBeginRound, EK_NONE, durationTickdown, ()) +shakenCondition.AddHook(ET_OnToHitBonus2, EK_NONE, shakenPenalty,()) +shakenCondition.AddHook(ET_OnGetSkillLevel, EK_NONE, shakenPenalty,()) +shakenCondition.AddHook(ET_OnGetAbilityCheckModifier, EK_NONE, shakenPenalty,()) +shakenCondition.AddHook(ET_OnSaveThrowLevel, EK_NONE, shakenPenalty,()) +shakenCondition.AddHook(ET_OnD20PythonQuery, "PQ_Is_Shaken", queryIsShaken, ()) +shakenCondition.AddHook(ET_OnGetTooltip, EK_NONE, shakenTooltip, ()) +shakenCondition.AddHook(ET_OnGetEffectTooltip, EK_NONE, shakenEffectTooltip, ()) +shakenCondition.AddHook(ET_OnConditionRemove, EK_NONE, removeParticles, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sickened.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sickened.py new file mode 100644 index 000000000..f2da8d210 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sickened.py @@ -0,0 +1,85 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp +from spell_utils import isLivingCreature + +print "Registering Sickened" + +def checkConditionalRemoval(attachee, args, evt_obj): + if (evt_obj.is_modifier("sp-Heal") + or evt_obj.is_modifier("sp-Remove Sickened") + or evt_obj.is_modifier("Sickened")): + args.condition_remove() + return 0 + +def checkImmunity(attachee, args, evt_obj): + if isLivingCreature(attachee): + spellMesId = 20026 #ID 20026 = Sickened! + attachee.float_mesfile_line("mes\\spell.mes", spellMesId, tf_red) + game.create_history_freeform("{} is ~sickened~[TAG_SICKENED]\n\n".format(attachee.description)) + particlesId = game.particles("sp-Disease-Filth Fever", attachee) + args.set_arg(1, particlesId) + else: + spellMesId = 32000 #ID 32000 = Target is immune! + attachee.float_mesfile_line("mes\\spell.mes", spellMesId) + args.condition_remove() + return 0 + +def durationTickdown(attachee, args, evt_obj): + duration = args.get_arg(0) + duration -= evt_obj.data1 + args.set_arg(0, duration) + if args.get_arg(0) < 0: + args.condition_remove() + return 0 + +def sickenedPenalty(attachee, args, evt_obj): + conditionName = args.get_cond_name() + conditionTag = "TAG_{}".format(conditionName.upper().replace(" ", "_")) + bonus = -2 #Sickened is a -2 penalty to attack rolls, saving throws, skill checks, and ability checks. + bonusType = bonus_type_untyped # Stacking! + evt_obj.bonus_list.add(bonus, bonusType, "~{}~[{}]".format(conditionName, conditionTag)) + return 0 + +def queryIsSickened(attachee, args, evt_obj): + evt_obj.return_val = 1 + return 0 + +def getDurationLabel(duration): + if duration == 1: + return "1 round" + return "{} rounds".format(duration) + +def sickenedTooltip(attachee, args, evt_obj): + conditionName = args.get_cond_name() + duration = args.get_arg(0) + durationLabel = getDurationLabel(duration) + evt_obj.append("{} ({})".format(conditionName, durationLabel)) + return 0 + +def sickenedEffectTooltip(attachee, args, evt_obj): + conditionName = args.get_cond_name() + conditionKey = conditionName.upper().replace(" ", "_") + duration = args.get_arg(0) + durationLabel = getDurationLabel(duration) + evt_obj.append(tpdp.hash(conditionKey), -2, " ({})".format(durationLabel)) + return 0 + +def removeParticles(attachee, args, evt_obj): + particlesId = args.get_arg(1) + if particlesId: + game.particles_end(particlesId) + return 0 + +SickenedCondition = PythonModifier("Sickened", 3, False) #duration, particlesId, empty +SickenedCondition.AddHook(ET_OnConditionAddPre, EK_NONE, checkConditionalRemoval, ()) +SickenedCondition.AddHook(ET_OnConditionAdd, EK_NONE, checkImmunity, ()) +SickenedCondition.AddHook(ET_OnBeginRound, EK_NONE, durationTickdown, ()) +SickenedCondition.AddHook(ET_OnToHitBonus2, EK_NONE, sickenedPenalty,()) +SickenedCondition.AddHook(ET_OnGetSkillLevel, EK_NONE, sickenedPenalty,()) +SickenedCondition.AddHook(ET_OnGetAbilityCheckModifier, EK_NONE, sickenedPenalty,()) +SickenedCondition.AddHook(ET_OnSaveThrowLevel, EK_NONE, sickenedPenalty,()) +SickenedCondition.AddHook(ET_OnD20PythonQuery, "PQ_Is_Sickened", queryIsSickened, ()) +SickenedCondition.AddHook(ET_OnGetTooltip, EK_NONE, sickenedTooltip, ()) +SickenedCondition.AddHook(ET_OnGetEffectTooltip, EK_NONE, sickenedEffectTooltip, ()) +SickenedCondition.AddHook(ET_OnConditionRemove, EK_NONE, removeParticles, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_all_seeing_eyes.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_all_seeing_eyes.py new file mode 100644 index 000000000..05320c267 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_all_seeing_eyes.py @@ -0,0 +1,8 @@ +from toee import * +import tpdp +from spell_utils import SpellPythonModifier + +print "Registering sp-All Seeing Eyes" + +beguilingInfluenceSpell = SpellPythonModifier("sp-All Seeing Eyes") # spellId, duration, empty +beguilingInfluenceSpell.AddSkillBonus(6, bonus_type_invocation, skill_search, skill_spot) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beguiling_influence.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beguiling_influence.py new file mode 100644 index 000000000..7d2653f1a --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beguiling_influence.py @@ -0,0 +1,8 @@ +from toee import * +import tpdp +from spell_utils import SpellPythonModifier + +print "Registering sp-Beguiling Influence" + +beguilingInfluenceSpell = SpellPythonModifier("sp-Beguiling Influence") # spellId, duration, empty +beguilingInfluenceSpell.AddSkillBonus(6, bonus_type_invocation, skill_bluff, skill_diplomacy, skill_intimidate) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beshadowed_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beshadowed_blast.py new file mode 100644 index 000000000..e94284d70 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beshadowed_blast.py @@ -0,0 +1,28 @@ +from toee import * +import tpdp +import tpactions +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction + +print "Registering sp-Beshadowed Blast" + +def secondaryEffect(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellId = currentSequence.spell_action.spell_id + spellPacket = tpdp.SpellPacket(spellId) + if verifyEldritchBlastAction(spellPacket.spell_enum): + spellDc = spellPacket.dc + saveType = D20_Save_Fortitude + saveDescriptor = D20STD_F_NONE + spellTarget = evt_obj.attack_packet.target + if spellTarget.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): #success + spellTarget.float_mesfile_line("mes\\spell.mes", 30001) + game.particles("Fizzle", spellTarget) + else: + spellTarget.float_mesfile_line("mes\\spell.mes", 30002) + duration = 1 + spellTarget.condition_add_with_args("sp-Blindness", spellId, duration, 0) + return 0 + +beshadowedBlast = EldritchBlastEssenceModifier("Beshadowed Blast") #spellEnum, particlesId, empty +beshadowedBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) +beshadowedBlast.AddQuerySecondaryTrue() \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_bewitching_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_bewitching_blast.py new file mode 100644 index 000000000..67c5d1e13 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_bewitching_blast.py @@ -0,0 +1,29 @@ +from toee import * +import tpdp +import tpactions +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction + +print "Registering sp-Bewitching Blast" + +def secondaryEffect(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellId = currentSequence.spell_action.spell_id + spellPacket = tpdp.SpellPacket(spellId) + if verifyEldritchBlastAction(spellPacket.spell_enum): + spellDc = spellPacket.dc + saveType = D20_Save_Will + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_MIND_AFFECTING + spellTarget = evt_obj.attack_packet.target + if spellTarget.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): #success + spellTarget.float_mesfile_line("mes\\spell.mes", 30001) + game.particles("Fizzle", spellTarget) + else: + spellTarget.float_mesfile_line("mes\\spell.mes", 30002) + duration = 1 + spellTarget.condition_add_with_args("sp-Confusion", spellId, duration, 0) + #sp-Confusion-Hit + return 0 + +bewitchingBlast = EldritchBlastEssenceModifier("Bewitching Blast") #spellEnum, particlesId, empty +bewitchingBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) +bewitchingBlast.AddQuerySecondaryTrue() diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_binding_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_binding_blast.py new file mode 100644 index 000000000..c1530c580 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_binding_blast.py @@ -0,0 +1,30 @@ +from toee import * +import tpdp +import tpactions +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction + +print "Registering sp-Binding Blast" + +def secondaryEffect(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellId = currentSequence.spell_action.spell_id + spellPacket = tpdp.SpellPacket(spellId) + if verifyEldritchBlastAction(spellPacket.spell_enum): + spellDc = spellPacket.dc + saveType = D20_Save_Will + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_MIND_AFFECTING + spellTarget = evt_obj.attack_packet.target + if spellTarget.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): #success + spellTarget.float_mesfile_line("mes\\spell.mes", 30001) + game.particles("Fizzle", spellTarget) + else: + spellTarget.float_mesfile_line("mes\\spell.mes", 30002) + duration = 1 + initiative = attachee.get_initiative() + spellTarget.condition_add_with_args("Stunned", duration, initiative) + #sp-Confusion-Hit + return 0 + +bindingBlast = EldritchBlastEssenceModifier("Binding Blast") #spellEnum, particlesId, empty +bindingBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) +bindingBlast.AddQuerySecondaryTrue() diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_breath_of_the_night.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_breath_of_the_night.py new file mode 100644 index 000000000..5aadbbd06 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_breath_of_the_night.py @@ -0,0 +1,10 @@ +from toee import * +import tpdp +from spell_utils import AoeSpellHandleModifier, AoeSpellEffectModifier + +print "Registering sp-Breath of the Night" + +breathOfTheNightSpell = AoeSpellHandleModifier("sp-Breath of the Night") #spellId, duration, bonusValue, spellEventId, spellDc, empty + +breathOfTheNightEffect = AoeSpellEffectModifier("Breath of the Night") #spellId, duration, bonusValue, spellEventId, spellDc, empty +breathOfTheNightEffect.AddFogConcealment() diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_brimstone_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_brimstone_blast.py new file mode 100644 index 000000000..c2aa03aa3 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_brimstone_blast.py @@ -0,0 +1,64 @@ +from toee import * +import tpdp +import tpactions +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction, EldritchBlastSecondaryEffect + +print "Registering sp-Brimstone Blast" + +########## Python Action ID's ########## +brimstoneBlastEnum = 3310 +######################################## + +def secondaryEffect(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellId = currentSequence.spell_action.spell_id + spellPacket = tpdp.SpellPacket(spellId) + if verifyEldritchBlastAction(spellPacket.spell_enum): + spellDc = spellPacket.dc + saveType = D20_Save_Reflex + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_FIRE + spellTarget = evt_obj.attack_packet.target + if spellTarget.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): #success + spellTarget.float_mesfile_line("mes\\spell.mes", 30001) + game.particles("Fizzle", spellTarget) + else: + spellTarget.float_mesfile_line("mes\\spell.mes", 30002) + duration = int(spellPacket.caster_level / 5) + stanceEnum = args.get_arg(0) + spellTarget.condition_add_with_args("Brimstone Burn", spellId, duration, stanceEnum, 0) + return 0 + +brimstoneBlast = EldritchBlastEssenceModifier("Brimstone Blast") #spellEnum, particlesId, empty +brimstoneBlast.ModifyDamageType(D20DT_FIRE) +brimstoneBlast.AddQuerySecondaryTrue() + +### Secondary Burn Effect ### + +def burnDamage(attachee, args, evt_obj): + spellId = args.get_arg(0) + spellPacket = tpdp.SpellPacket(spellId) + spellDamageDice = dice_new("1d6") + spellDamageDice.number = 2 + attachee.float_text_line("Burning") + game.create_history_freeform("{} takes ~Brimstone Blast~[TAG_SPELLS_BRIMSTONE_BLAST] burn damage".format(attachee.description)) + attachee.spell_damage(spellPacket.caster, D20DT_FIRE, spellDamageDice, D20DAP_UNSPECIFIED, D20A_CAST_SPELL, spellId) + return 0 + +def radialExtinguishFlames(attachee, args, evt_obj): + radialName = "Extinguish Flames" + radialHelpTag = "TAG_SPELLS_BRIMSTONE_BLAST" + radialId = tpdp.RadialMenuEntryPythonAction(radialName, D20A_PYTHON_ACTION, brimstoneBlastEnum, 0, radialHelpTag) + radialId.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Options) + return 0 + +def performExtinguishFlames(attachee, args, evt_obj): + attachee.float_text_line("Flames Extinguished", tf_white) + args.remove_spell_mod() + args.remove_spell() + return 0 + +brimstoneEffect = EldritchBlastSecondaryEffect("Brimstone Blast Effect") #spellId, duration, secondaryEffectEnum, empty +brimstoneEffect.AddHook(ET_OnBeginRound, EK_NONE, burnDamage, ()) +brimstoneEffect.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, radialExtinguishFlames, ()) +brimstoneEffect.AddHook(ET_OnD20PythonActionPerform, brimstoneBlastEnum, performExtinguishFlames, ()) +brimstoneEffect.AddSpellNoDuplicate() diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_cold_comfort.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_cold_comfort.py new file mode 100644 index 000000000..22f531ecf --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_cold_comfort.py @@ -0,0 +1,44 @@ +from toee import * +import tpdp +from spell_utils import AuraSpellHandleModifier, AuraSpellEffectModifier, getElementEnum + +print "Registering sp-Cold Comfort" + +coldComfortSpell = AuraSpellHandleModifier("sp-Cold Comfort") #spellId, duration, damageType, spellEventId, spellDc, empty +coldComfortSpell.AddSpellDismiss() +coldComfortSpell.AddSpellNoDuplicate() + +### Start Cold Comfort Effect ### + +def queryHasEndure(attachee, args, evt_obj): + evt_obj.return_val = 1 + #sp-Endure Elements uses descriptors constants + #I do use damage type constants directly, so I need to remap + damageType = args.get_arg(2) + evt_obj.data1 = getElementEnum(damageType) + return 0 + +def addEnergyResistance(attachee, args, evt_obj): + resistanceAmount = 5 + damageType = args.get_arg(2) + damageMesId = 124 # ID124 = ~Damage Resistance~[TAG_SPECIAL_ABILITIES_RESISTANCE_TO_ENERGY] + evt_obj.damage_packet.add_damage_resistance(bonusValue, damageType, damageMesId) + return 0 + +def queryFireballOk(attachee, args, evt_obj): + damageType = args.get_arg(2) + if damageType == D20DT_FIRE: + evt_obj.return_val = 1 + return 0 + +def addParticles(attachee, args, evt_obj): + damageType = args.get_arg(2) + particlesLabel = "sp-Endure Elements-cold" if damageType == D20DT_COLD else "sp-Endure Elements-fire" + return 0 + +coldComfortEffect = AuraSpellEffectModifier("Cold Comfort") #spellId, duration, damageType, spellEventId, spellDc, empty +coldComfortEffect.AddHook(ET_OnTakingDamage2, EK_NONE, addEnergyResistance, ()) +coldComfortEffect.AddHook(ET_OnD20Query, EK_Q_Critter_Has_Resist_Elements, queryHasEndure, ()) +coldComfortEffect.AddHook(ET_OnD20Query, EK_Q_AI_Fireball_OK, queryFireballOk, ()) +#coldComfortEffect.AddHook(ET_OnConditionAdd, EK_NONE, addParticles, ()) +coldComfortEffect.AddSpellDismiss() diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_curse_of_despair.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_curse_of_despair.py new file mode 100644 index 000000000..896c23dbe --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_curse_of_despair.py @@ -0,0 +1,8 @@ +from toee import * +import tpdp +from spell_utils import SpellPythonModifier + +print "Registering sp-Curse of Despair" + +curseOfDespairSpell = SpellPythonModifier("sp-Curse of Despair") # spellId, duration, empty +curseOfDespairSpell.AddToHitBonus(-1, bonus_type_curse_of_despair) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_dark_ones_own_luck.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_dark_ones_own_luck.py new file mode 100644 index 000000000..b37cb62ee --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_dark_ones_own_luck.py @@ -0,0 +1,25 @@ +from toee import * +import tpdp +from spell_utils import SpellPythonModifier + +print "Registering sp-Dark One's Own Luck" + +def replaceDarkOnes(attachee, args, evt_obj): + if (evt_obj.is_modifier("sp-Dark One's Own Luck Fortitude") + or evt_obj.is_modifier("sp-Dark One's Own Luck Reflex") + or evt_obj.is_modifier("sp-Dark One's Own Luck Will")): + args.remove_spell_mod() + args.remove_spell() + return 0 + +darkOnesFortitude = SpellPythonModifier("sp-Dark One's Own Luck Fortitude", 4) # spellId, duration, bonusValue, empty +darkOnesFortitude.AddSaveBonus(passed_by_spell, bonus_type_luck, D20STD_F_NONE, EK_SAVE_FORTITUDE) +darkOnesFortitude.AddHook(ET_OnConditionAddPre, EK_NONE, replaceDarkOnes, ()) + +darkOnesReflex = SpellPythonModifier("sp-Dark One's Own Luck Reflex", 4) # spellId, duration, bonusValue, empty +darkOnesReflex.AddSaveBonus(passed_by_spell, bonus_type_luck, D20STD_F_NONE, EK_SAVE_REFLEX) +darkOnesReflex.AddHook(ET_OnConditionAddPre, EK_NONE, replaceDarkOnes, ()) + +darkOnesWill = SpellPythonModifier("sp-Dark One's Own Luck Will", 4) # spellId, duration, bonusValue, empty +darkOnesWill.AddSaveBonus(passed_by_spell, bonus_type_luck, D20STD_F_NONE, EK_SAVE_WILL) +darkOnesWill.AddHook(ET_OnConditionAddPre, EK_NONE, replaceDarkOnes, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_enervating_shadow.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_enervating_shadow.py new file mode 100644 index 000000000..f59887bab --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_enervating_shadow.py @@ -0,0 +1,82 @@ +from toee import * +import tpdp +from spell_utils import AuraSpellHandleModifier, AuraSpellEffectModifier, spellTime, applyBonus +from pymod_utils import PythonModifier + +print "Registering sp-Enervating Shadow" + +enervatingShadowSpell = AuraSpellHandleModifier("sp-Enervating Shadow", aoe_event_target_living_creatures_exclude_self) #spellId, duration, empty, spellEventId, spellDc, empty +enervatingShadowSpell.AddHook(ET_OnGetDefenderConcealmentMissChance, EK_NONE, applyBonus, (50, bonus_type_concealment,)) +enervatingShadowSpell.AddSpellDismiss() +enervatingShadowSpell.AddSpellNoDuplicate() +enervatingShadowSpell.AddDispelledByLight(-1,) + +### Start Enervating Shadow Effect ### + +def saveAgainstEffect(attachee, args, evt_obj): + failedSave = args.get_arg(2) + if not failedSave: + spellId = args.get_arg(0) + spellPacket = tpdp.SpellPacket(spellId) + spellDc = spellPacket.dc + spellCaster = spellPacket.caster + saveType = D20_Save_Fortitude + saveDescriptor = D20STD_F_NONE + spellTarget = attachee + if not spellTarget.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): + particlesId = game.particles("sp-Enervating Shadow-loss", attachee) + duration = 4 + args.set_arg(1, duration) + args.set_arg(2, 1) + args.set_arg(5, particlesId) + return 0 + +def applyStrengthPenalty(attachee, args, evt_obj): + failedSave = args.get_arg(2) + if failedSave: + applyBonus(attachee, args, evt_obj) + return 0 + +def applyImmunity(attachee, args, evt_obj): + failedSave = args.get_arg(2) + particlesId = args.get_arg(5) + if failedSave: + duration = 14400 # 1 day + attachee.condition_add_with_args("Enervating Shadow Immunity", duration, 0) + if particlesId: + game.particles_end(particlesId) + return 0 + +enervatingShadowEffect = AuraSpellEffectModifier("Enervating Shadow", 7) #spellId, duration, failedSaveFlag, spellEventId, spellDc, particlesId, empty +enervatingShadowEffect.AddHook(ET_OnBeginRound, EK_NONE, saveAgainstEffect, ()) +enervatingShadowEffect.AddHook(ET_OnAbilityScoreLevel, EK_STAT_STRENGTH, applyStrengthPenalty, (-4, bonus_type_untyped,)) +enervatingShadowEffect.AddHook(ET_OnConditionRemove, EK_NONE, applyImmunity, ()) +enervatingShadowEffect.AddSpellDismiss() +enervatingShadowEffect.AddDispelledByLight(-1,) + +### Enervating Shadow Immunity ### + +def tooltip(attachee,args, evt_obj): + duration = args.get_arg(0) + durationLabel = spellTime(duration) + conditionName = args.get_cond_name() + evt_obj.append("{} ({})".format(conditionName, durationLabel)) + return 0 + +def envShadowImmunity(attachee, args, evt_obj): + if evt_obj.is_modifier("Enervating Shadow"): + evt_obj.return_val = 0 + return 0 + +def tickdown(attachee, args, evt_obj): + duration = args.get_arg(0) + duration -= evt_obj.data1 + args.set_arg(0, duration) + if duration < 0: + args.condition_remove() + return 0 + +enervatingShadowImmunity = PythonModifier("Enervating Shadow Immunity", 2) #duration, empty +enervatingShadowImmunity.AddHook(ET_OnConditionAddPre, EK_NONE, envShadowImmunity, ()) +enervatingShadowImmunity.AddHook(ET_OnBeginRound, EK_NONE, tickdown, ()) +enervatingShadowImmunity.AddHook(ET_OnGetTooltip, EK_NONE, tooltip, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py new file mode 100644 index 000000000..d7ee8e238 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py @@ -0,0 +1,27 @@ +from toee import * +import tpdp +import tpactions +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction + +print "Registering sp-Frightful Blast" + +def secondaryEffect(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellId = currentSequence.spell_action.spell_id + spellPacket = tpdp.SpellPacket(spellId) + if verifyEldritchBlastAction(spellPacket.spell_enum): + spellDc = spellPacket.dc + saveType = D20_Save_Will + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_MIND_AFFECTING + spellTarget = evt_obj.attack_packet.target + if spellTarget.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): #success + spellTarget.float_mesfile_line("mes\\spell.mes", 30001) + game.particles("Fizzle", spellTarget) + else: + spellTarget.float_mesfile_line("mes\\spell.mes", 30002) + duration = 10 #1 min + spellTarget.condition_add_with_args("Shaken", duration, 0, 0) + return 0 + +frightfulBlast = EldritchBlastEssenceModifier("Frightful Blast") #spellEnum, particlesId, empty +frightfulBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hellrime_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hellrime_blast.py new file mode 100644 index 000000000..bacd26ddb --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hellrime_blast.py @@ -0,0 +1,34 @@ +from toee import * +import tpdp +import tpactions +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction, EldritchBlastSecondaryEffect +from spell_utils import applyBonus + +print "Registering sp-Hellrime Blast" + +def secondaryEffect(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellId = currentSequence.spell_action.spell_id + spellPacket = tpdp.SpellPacket(spellId) + if verifyEldritchBlastAction(spellPacket.spell_enum): + spellDc = spellPacket.dc + saveType = D20_Save_Reflex + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_COLD + spellTarget = evt_obj.attack_packet.target + if spellTarget.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): #success + spellTarget.float_mesfile_line("mes\\spell.mes", 30001) + game.particles("Fizzle", spellTarget) + else: + spellTarget.float_mesfile_line("mes\\spell.mes", 30002) + duration = 100 #10 mins + spellTarget.condition_add_with_args("Hellrime Blast Effect", spellId, duration, 0) + return 0 + +hellrimeBlast = EldritchBlastEssenceModifier("Hellrime Blast") #spellEnum, particlesId, empty +hellrimeBlast.ModifyDamageType(D20DT_COLD) +hellrimeBlast.AddQuerySecondaryTrue() + +### Secondary Burn Effect ### + +hellrimeEffect = EldritchBlastSecondaryEffect("Hellrime Blast Effect") #spellId, duration, secondaryEffectEnum, empty +hellrimeEffect.AddHook(ET_OnAbilityScoreLevel, EK_STAT_DEXTERITY, applyBonus, (-4, bonus_type_hellrime_blast,)) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hindering_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hindering_blast.py new file mode 100644 index 000000000..bd75d556e --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hindering_blast.py @@ -0,0 +1,29 @@ +from toee import * +import tpdp +import tpactions +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction + +print "Registering sp-Hindering Blast" + +def secondaryEffect(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellId = currentSequence.spell_action.spell_id + spellPacket = tpdp.SpellPacket(spellId) + if verifyEldritchBlastAction(spellPacket.spell_enum): + spellDc = spellPacket.dc + saveType = D20_Save_Reflex + saveDescriptor = D20STD_F_NONE + spellTarget = evt_obj.attack_packet.target + if spellTarget.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): #success + spellTarget.float_mesfile_line("mes\\spell.mes", 30001) + game.particles("Fizzle", spellTarget) + else: + spellTarget.float_mesfile_line("mes\\spell.mes", 30002) + duration = 1 + spellTarget.condition_add_with_args("sp-Slow", spellId, duration, 1) #spell slow sets last arg to 1, need to verify why + game.particles("sp-Slow", spellTarget) + return 0 + +hinderingBlast = EldritchBlastEssenceModifier("Hindering Blast") #spellEnum, particlesId, empty +hinderingBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) +hinderingBlast.AddQuerySecondaryTrue() diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_ignore_the_pyre.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_ignore_the_pyre.py new file mode 100644 index 000000000..f3f8a25ca --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_ignore_the_pyre.py @@ -0,0 +1,27 @@ +from toee import * +import tpdp +from spell_utils import SpellPythonModifier, getElementEnum + +print "Registering sp-Ignore the Pyre" + +def queryHasResist(attachee, args, evt_obj): + evt_obj.return_val = 1 + #sp-Resist Elements uses descriptors constants + #I do use damage type constants directly, so I need to remap + damageType = args.get_arg(3) + evt_obj.data1 = getElementEnum(damageType) + return 0 + +def queryFireballOk(attachee, args, evt_obj): + resistType = args.get_arg(3) + if resistType == D20DT_FIRE: + resistAmount = args.get_arg(2) + if resistAmount >= 10: + evt_obj.return_val = 1 + return 0 + +ignoreThePyreSpell = SpellPythonModifier("sp-Ignore the Pyre", 5) # spellId, duration, bonusValue, damageType, empty +ignoreThePyreSpell.AddDamageResistance(passed_by_spell, passed_by_spell) # bonusValue, damageType +ignoreThePyreSpell.AddHook(ET_OnD20Query, EK_Q_Critter_Has_Resist_Elements, queryHasResist, ()) +ignoreThePyreSpell.AddHook(ET_OnD20Query, EK_Q_AI_Fireball_OK, queryFireballOk, ()) +ignoreThePyreSpell.AddSpellNoDuplicate() diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_leaps_and_bounds.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_leaps_and_bounds.py new file mode 100644 index 000000000..9b2c64ea1 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_leaps_and_bounds.py @@ -0,0 +1,8 @@ +from toee import * +import tpdp +from spell_utils import SpellPythonModifier + +print "Registering sp-Leaps and Bounds" + +beguilingInfluenceSpell = SpellPythonModifier("sp-Leaps and Bounds") # spellId, duration, empty +beguilingInfluenceSpell.AddSkillBonus(6, bonus_type_invocation, skill_balance, skill_jump, skill_tumble) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_miasmic_cloud.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_miasmic_cloud.py new file mode 100644 index 000000000..2e755d22f --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_miasmic_cloud.py @@ -0,0 +1,30 @@ +from toee import * +import tpdp +from spell_utils import AoeSpellHandleModifier, AoeSpellEffectModifier + +print "Registering sp-Miasmic Cloud" + +breathOfTheNightSpell = AoeSpellHandleModifier("sp-Miasmic Cloud") #spellId, duration, bonusValue, spellEventId, spellDc, empty + +def applyFatigue(attachee, args, evt_obj): + spellId = args.get_arg(0) + spellPacket = tpdp.SpellPacket(spellId) + if not attachee == spellPacket.caster: + spellDc = spellPacket.dc + saveType = D20_Save_Fortitude + saveDescriptor = D20STD_F_NONE + if not attachee.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): + duration = -1 + attachee.condition_add_with_args("FatigueExhaust", 0, duration, 0, 1, 0, 0) + return 0 + +def updateFatigueDuration(attachee, args, evt_obj): + if attachee.d20_query("Fatigued"): + duration = 1 + attachee.d20_send_signal("PS_Update_Fatigue_Duration", duration) + return 0 + +breathOfTheNightEffect = AoeSpellEffectModifier("Miasmic Cloud") #spellId, duration, bonusValue, spellEventId, spellDc, empty +breathOfTheNightEffect.AddHook(ET_OnConditionAdd, EK_NONE, applyFatigue, ()) +breathOfTheNightEffect.AddHook(ET_OnConditionRemove, EK_NONE, updateFatigueDuration, ()) +breathOfTheNightEffect.AddFogConcealment() \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_noxious_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_noxious_blast.py new file mode 100644 index 000000000..a02785831 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_noxious_blast.py @@ -0,0 +1,28 @@ +from toee import * +import tpdp +import tpactions +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction + +print "Registering sp-Noxious Blast" + +def secondaryEffect(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellId = currentSequence.spell_action.spell_id + spellPacket = tpdp.SpellPacket(spellId) + if verifyEldritchBlastAction(spellPacket.spell_enum): + spellDc = spellPacket.dc + saveType = D20_Save_Fortitude + saveDescriptor = D20STD_F_NONE + spellTarget = evt_obj.attack_packet.target + if spellTarget.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): #success + spellTarget.float_mesfile_line("mes\\spell.mes", 30001) + game.particles("Fizzle", spellTarget) + else: + spellTarget.float_mesfile_line("mes\\spell.mes", 30002) + duration = 10 #1 min + persistentFlag = 0 + spellTarget.condition_add_with_args("Nauseated", duration, persistentFlag, 0) + return 0 + +noxiousBlast = EldritchBlastEssenceModifier("Noxious Blast") #spellEnum, particlesId, empty +noxiousBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_penetrating_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_penetrating_blast.py new file mode 100644 index 000000000..552a94b17 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_penetrating_blast.py @@ -0,0 +1,48 @@ +from toee import * +import tpdp +import tpactions +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction, EldritchBlastSecondaryEffect + +print "Registering sp-Penetrating Blast" + +def secondaryEffect(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellId = currentSequence.spell_action.spell_id + spellPacket = tpdp.SpellPacket(spellId) + if verifyEldritchBlastAction(spellPacket.spell_enum): + spellDc = spellPacket.dc + saveType = D20_Save_Will + saveDescriptor = D20STD_F_NONE + spellTarget = evt_obj.attack_packet.target + if spellTarget.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): #success + spellTarget.float_mesfile_line("mes\\spell.mes", 30001) + game.particles("Fizzle", spellTarget) + else: + spellTarget.float_mesfile_line("mes\\spell.mes", 30002) + duration = 10 #1 minute + stanceEnum = args.get_arg(0) + spellTarget.condition_add_with_args("Penetrating Blast Effect", spellId, duration, stanceEnum, 0) + return 0 + +def spellPenBonus(attachee, args, evt_obj): + bonusValue = 4 + bonusType = bonus_type_untyped #Stacking! + bonusLabel = "~Penetrating Blast~[TAG_SPELLS_PENETRATING_BLAST]" + evt_obj.bonus_list.add(bonusValue, bonusType, bonusLabel) + return 0 + +penetratingBlast = EldritchBlastEssenceModifier("Penetrating Blast") #spellEnum, particlesId, empty +penetratingBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) +penetratingBlast.AddHook(ET_OnSpellResistanceCheckBonus, EK_NONE, spellPenBonus, ()) +penetratingBlast.AddQuerySecondaryTrue() + +def srPenalty(attachee, args, evt_obj): + bonusValue = -5 + bonusType = bonus_type_untyped #Stacking! + bonusLabel = "~Penetrating Blast~[TAG_SPELLS_PENETRATING_BLAST]" + evt_obj.bonus_list.add(bonusValue, bonusType, bonusLabel) + return 0 + +penetratingEffect = EldritchBlastSecondaryEffect("Penetrating Blast Effect") #spellId, duration, secondaryEffectEnum, empty +penetratingEffect.AddHook(ET_OnGetSpellResistanceMod, EK_NONE, srPenalty, ()) +penetratingEffect.AddSpellNoDuplicate() \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_sickening_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_sickening_blast.py new file mode 100644 index 000000000..49ba4f227 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_sickening_blast.py @@ -0,0 +1,29 @@ +from toee import * +import tpdp +import tpactions +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction +from spell_utils import isLivingCreature + +print "Registering sp-Sickening Blast" + +def secondaryEffect(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellId = currentSequence.spell_action.spell_id + spellPacket = tpdp.SpellPacket(spellId) + if verifyEldritchBlastAction(spellPacket.spell_enum): + spellTarget = evt_obj.attack_packet.target + if isLivingCreature(spellTarget): + spellDc = spellPacket.dc + saveType = D20_Save_Fortitude + saveDescriptor = D20STD_F_NONE + if spellTarget.saving_throw_spell(spellDc, saveType, saveDescriptor, spellPacket.caster, spellId): #success + spellTarget.float_mesfile_line("mes\\spell.mes", 30001) + game.particles("Fizzle", spellTarget) + else: + spellTarget.float_mesfile_line("mes\\spell.mes", 30002) + duration = 10 #1 min + spellTarget.condition_add_with_args("Sickened", duration, 0, 0) + return 0 + +sickeningBlast = EldritchBlastEssenceModifier("Sickening Blast") #spellEnum, particlesId, empty +sickeningBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_soulreaving_aura.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_soulreaving_aura.py new file mode 100644 index 000000000..00030ced5 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_soulreaving_aura.py @@ -0,0 +1,15 @@ +from toee import * +import tpdp +from spell_utils import SpellPythonModifier + +print "Registering sp-Soulreaving Aura" + +def addToSpellRegistry(attachee, args, evt_obj): + particlesId = game.particles("sp-Soulreaving Aura-HP", attachee) + spellPacket.add_target(attachee, particlesId) + spellPacket.update_registry() + return 0 + +soulreavingAuraSpell = SpellPythonModifier("sp-Soulreaving Aura", 4) # spellId, duration, tempHpAmount, empty +soulreavingAuraSpell.AddHook(ET_OnConditionAdd, EK_NONE, addToSpellRegistry, ()) +soulreavingAuraSpell.AddTempHp(passed_by_spell) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_vitriolic_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_vitriolic_blast.py new file mode 100644 index 000000000..fc267508a --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_vitriolic_blast.py @@ -0,0 +1,37 @@ +from toee import * +import tpdp +import tpactions +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction, EldritchBlastSecondaryEffect + +print "Registering sp-Vitriolic Blast" + +def secondaryEffect(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellId = currentSequence.spell_action.spell_id + spellPacket = tpdp.SpellPacket(spellId) + if verifyEldritchBlastAction(spellPacket.spell_enum): + spellTarget = evt_obj.attack_packet.target + duration = int(spellPacket.caster_level / 5) + stanceEnum = args.get_arg(0) + spellTarget.condition_add_with_args("Vitriolic DoT", spellId, duration, stanceEnum, 0) + return 0 + +vitriolicBlast = EldritchBlastEssenceModifier("Vitriolic Blast") #spellEnum, particlesId, empty +vitriolicBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) +vitriolicBlast.ModifyDamageType(D20DT_ACID) +vitriolicBlast.AddQuerySecondaryTrue() + +### Secondary DoT Effect ### + +def damageOverTime(attachee, args, evt_obj): + spellId = args.get_arg(0) + spellPacket = tpdp.SpellPacket(spellId) + spellDamageDice = dice_new("1d6") + spellDamageDice.number = 2 + game.create_history_freeform("{} takes ~Vitriolic Blast~[TAG_SPELLS_VITRIOLIC_BLAST] acid damage\n\n".format(attachee.description)) + attachee.spell_damage(spellPacket.caster, D20DT_ACID, spellDamageDice, D20DAP_UNSPECIFIED, D20A_CAST_SPELL, spellId) + return 0 + +vitriolicEffect = EldritchBlastSecondaryEffect("Vitriolic DoT") #spellId, duration, secondaryEffectEnum, empty +vitriolicEffect.AddHook(ET_OnBeginRound, EK_NONE, damageOverTime, ()) +vitriolicEffect.AddSpellNoDuplicate() diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/spell_focus_invocation.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/spell_focus_invocation.py new file mode 100644 index 000000000..59ad435b2 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/spell_focus_invocation.py @@ -0,0 +1,19 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp +from warlock import isInvocation + +print "Registering Spell Focus (Invocation)" + +def dcBonus(attachee, args, evt_obj): + spellEntry = evt_obj.spell_entry + if isInvocation(spellEntry.spell_enum): + bonusValue = 1 + bonusType = bonus_type_untyped # Stacking! + bonusLabel = "~Spell Foucs (Invocation)~[TAG_SPELL_FOCUS]" + evt_obj.bonus_list.add(bonusValue, bonusType, bonusLabel) + return 0 + +sfInvocationFeat = PythonModifier("Spell Focus (Invocation)", 2) #featEnum, empty +sfInvocationFeat.MapToFeat("Spell Focus (Invocation)") +sfInvocationFeat.AddHook(ET_OnGetSpellDcMod, EK_NONE, dcBonus, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py new file mode 100644 index 000000000..77f6b74bc --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -0,0 +1,498 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp +import char_class_utils +import tpactions +from spell_utils import getSpellClassCode, queryActiveSpell, spellKilled, replaceCondition, spellTime + +################################################### + +def GetConditionName(): + return "Warlock" + +print "Registering " + GetConditionName() + +classEnum = stat_level_warlock +classSpecModule = __import__('class033_warlock') + +################################################### + +########## Python Action ID's ########## +resetEldritchBlastEnum = 3301 +detectMagicEnum = 3302 +fiendishResilienceEnum = 3303 +######################################## + +#### standard callbacks - BAB and Save values +def OnGetToHitBonusBase(attachee, args, evt_obj): + classLvl = attachee.stat_level_get(classEnum) + babvalue = game.get_bab_for_class(classEnum, classLvl) + evt_obj.bonus_list.add(babvalue, 0, 137) # untyped, description: "Class" + return 0 + +def OnGetSaveThrowFort(attachee, args, evt_obj): + value = char_class_utils.SavingThrowLevel(classEnum, attachee, D20_Save_Fortitude) + evt_obj.bonus_list.add(value, 0, 137) + return 0 + +def OnGetSaveThrowReflex(attachee, args, evt_obj): + value = char_class_utils.SavingThrowLevel(classEnum, attachee, D20_Save_Reflex) + evt_obj.bonus_list.add(value, 0, 137) + return 0 + +def OnGetSaveThrowWill(attachee, args, evt_obj): + value = char_class_utils.SavingThrowLevel(classEnum, attachee, D20_Save_Will) + evt_obj.bonus_list.add(value, 0, 137) + return 0 + + +classSpecObj = PythonModifier(GetConditionName(), 0) +classSpecObj.AddHook(ET_OnToHitBonusBase, EK_NONE, OnGetToHitBonusBase, ()) +classSpecObj.AddHook(ET_OnSaveThrowLevel, EK_SAVE_FORTITUDE, OnGetSaveThrowFort, ()) +classSpecObj.AddHook(ET_OnSaveThrowLevel, EK_SAVE_REFLEX, OnGetSaveThrowReflex, ()) +classSpecObj.AddHook(ET_OnSaveThrowLevel, EK_SAVE_WILL, OnGetSaveThrowWill, ()) + +def getSpellName(spellEnum): + return game.get_spell_mesline(spellEnum) + +#### Warlock Eldritch Essence Stance Class and Handling #### + +def queryStance(attachee, args, evt_obj): + stanceEnum = args.get_arg(0) + evt_obj.return_val = stanceEnum + return 0 + +def updateEssenceStance(attachee, args, evt_obj): + for spellEnum in range(spell_frightful_blast, spell_penetrating_blast + 1): + modifierName = getSpellName(spellEnum) + if evt_obj.is_modifier(modifierName): + args.condition_remove() + break + if evt_obj.is_modifier("Eldritch Essence"): + args.condition_remove() + return 0 + +def addParticles(attachee, args, evt_obj): + spellEnum = args.get_arg(0) + if spellEnum != spell_eldritch_blast: + stanceName = getSpellName(spellEnum) + particlesLabel = "sp-{}-held".format(stanceName) + particlesId = game.particles(particlesLabel, attachee) + args.set_arg(1, particlesId) + attachee.float_text_line("{} activated".format(stanceName), tf_light_blue) + else: + attachee.float_text_line("Eldritch Essence resetted", tf_light_blue) + return 0 + +def removeParticles(attachee, args, evt_obj): + particlesId = args.get_arg(1) + if particlesId: + game.particles_end(particlesId) + return 0 + +def addToolTip(attachee, args, evt_obj): + spellEnum = args.get_arg(0) + if spellEnum != spell_eldritch_blast: + stanceName = getSpellName(spellEnum) + evt_obj.append("{} active".format(stanceName)) + return 0 + +def queryDamageType(attachee, args, evt_obj): + damageType = args.get_param(0) + evt_obj.return_val = damageType + return 0 + +def queryReturnTrue(attachee, args, evt_obj): + evt_obj.return_val = 1 + return 0 + +class PythonModifierAddHook(tpdp.ModifierSpec): + def AddHook(self, eventType, eventKey, callbackFcn, argsTuple): + self.add_hook(eventType, eventKey, callbackFcn, argsTuple) + +class EldritchBlastEssenceModifier(PythonModifierAddHook): + #This class is used for all Eldritch Blast Essence Modifiers + #It has at least two args: spellEnum, particlesId, empty + def __init__(self, name, args = 3, preventDuplicate = False): + super(PythonModifierAddHook, self).__init__(name, args, preventDuplicate) + self.add_hook(ET_OnConditionAddPre, EK_NONE, updateEssenceStance, ()) + self.add_hook(ET_OnConditionAdd, EK_NONE, addParticles, ()) + self.add_hook(ET_OnConditionRemove, EK_NONE, removeParticles, ()) + self.add_hook(ET_OnD20PythonQuery, "PQ_Eldritch_Esssence_Stance", queryStance, ()) + self.add_hook(ET_OnGetTooltip, EK_NONE, addToolTip, ()) + def ModifyDamageType(self, damageType): + self.add_hook(ET_OnD20PythonQuery, "PQ_Eldritch_Blast_Damage_Type", queryDamageType, (damageType,)) + def AddQuerySecondaryTrue(self): + self.add_hook(ET_OnD20PythonQuery, "PQ_Eldritch_Blast_Has_Secondary_Effect", queryReturnTrue, ()) + +eldritchEssenceCond = EldritchBlastEssenceModifier("Eldritch Essence") #spellEnum, empty + +#### Warlock Eldritch Blast Secondary Effect Class #### + +def ebSecTooltip(attachee, args, evt_obj): + duration = args.get_arg(1) + durationLabel = spellTime(duration) + spellEnum = args.get_arg(2) + secondaryEffectName = getSpellName(spellEnum) + evt_obj.append("{} ({})".format(secondaryEffectName, durationLabel)) + return 0 + +def ebSecEffectTooltip(attachee, args, evt_obj): + duration = args.get_arg(1) + durationLabel = spellTime(duration) + spellEnum = args.get_arg(2) + secondaryEffectName = getSpellName(spellEnum) + effectKey = secondaryEffectName.upper().replace(" ", "_") + evt_obj.append(tpdp.hash(effectKey), -2, " ({})".format(durationLabel)) + return 0 + +class EldritchBlastSecondaryEffect(PythonModifierAddHook): + #This class is used for all Eldritch Blast Secondary Effects + #It has at least 4 args: spellId, duration, secondaryEffectEnum, empty + def __init__(self, name, args = 4, preventDuplicate = False): + super(PythonModifierAddHook, self).__init__(name, args, preventDuplicate) + self.add_hook(ET_OnGetTooltip, EK_NONE, ebSecTooltip, ()) + self.add_hook(ET_OnGetEffectTooltip, EK_NONE, ebSecEffectTooltip, ()) + self.add_spell_dispel_check_standard() + self.add_spell_countdown_standard() + self.add_spell_teleport_prepare_standard() + self.add_spell_teleport_reconnect_standard() + self.add_hook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) + self.add_hook(ET_OnD20Signal, EK_S_Killed, spellKilled, ()) + def AddSpellNoDuplicate(self): + self.add_hook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) + +#### Warlock Callbacks for other functions ##### + +def verifyEldritchBlastAction(spellEnum): + return True if spellEnum in range(spell_eldritch_blast, spell_eldritch_glaive + 1) else False + +#Used by Fey Power, SF + GSF Invocation and Invocation Radial +def isInvocation(spellEnum): + #Change range end if new invocations are added + return True if spellEnum in range(spell_eldritch_blast, spell_word_of_changing + 1) else False + +#### Invocation Radial Menu #### + +def getInvocationLabel(invocationType): + mappingDict = { + 1: "Least", + 3: "Lesser", + 5: "Greater", + 7: "Dark" + } + return mappingDict.get(invocationType) + +def radialInvocations(attachee, args, evt_obj): + knownSpells = attachee.spells_known + radialSpellNodeId = [] + #Radial Tops + #label = "Invocations" + label = game.get_mesline("mes/stat.mes", classEnum + 1000) #classEnum + 1000 returns class abbreviation + radialTop = tpdp.RadialMenuEntryParent(label) + radialTopId = radialTop.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Spells) + radialTopBlast = tpdp.RadialMenuEntryParent("Eldritch Blast") + radialTopBlastId = radialTopBlast.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) + #Create Spell Level Nodes + for invocationType in range(1, 8, 2): + label = getInvocationLabel(invocationType) + radialSpellNode = tpdp.RadialMenuEntryParent(label) + radialSpellNodeId.append(radialSpellNode.add_as_child(attachee, radialTopId)) + #Add Radial Childs + for spell in knownSpells: + spellEnum = spell.spell_enum + spellLevel = spell.spell_level + if not isInvocation(spellEnum): + continue + radialSpellId = tpdp.RadialMenuEntryAction(spell) + if spellEnum in range(spell_eldritch_blast, spell_eldritch_glaive + 1): + radialSpellId.add_as_child(attachee, radialTopBlastId) + else: + if spellLevel < 3: + radialSpellId.add_as_child(attachee, radialSpellNodeId[0]) + elif spellLevel < 5: + radialSpellId.add_as_child(attachee, radialSpellNodeId[1]) + elif spellLevel < 7: + radialSpellId.add_as_child(attachee, radialSpellNodeId[2]) + else: + radialSpellId.add_as_child(attachee, radialSpellNodeId[3]) + return 0 + +classSpecObj.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, radialInvocations, ()) + +#### Warlock Class Feats #### + +## Eldritch Blast + +def getActiveEldritchEssence(attachee): + essenceEnum = attachee.d20_query("PQ_Eldritch_Esssence_Stance") + return essenceEnum if essenceEnum else spell_eldritch_blast + +def getEldritchBlastSpellLevel(spellClass): + spellEnum = getActiveEldritchEssence(attachee) + spellEntry = tpdp.SpellEntry(spellEnum) + #blastSpellLevel = min(attachee.stat_level_get(stat_level_warlock) / 2, 9) this was erratad, the spell level of an unmodified Eldritch Blast is always 1 + return spellEntry.level_for_spell_class(spellClass) + +def radialResestEldritchBlast(attachee, args, evt_obj): + essenceEnum = getActiveEldritchEssence(attachee) + if essenceEnum != spell_eldritch_blast: + radialName = "Reset Eldritch Blast" + radialHelpTag = "TAG_CLASS_FEATURES_WARLOCK_ELDRITCH_BLAST" + radialId = tpdp.RadialMenuEntryPythonAction(radialName, D20A_PYTHON_ACTION, resetEldritchBlastEnum, 0, radialHelpTag) + radialId.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) + return 0 + +def performResetEldritchBlast(attachee, args, evt_obj): + attachee.condition_add_with_args("Eldritch Essence", spell_eldritch_blast, 0) + return 0 + +#Spell Level of Eldritch Blast is dynamically: +#Basic Eldritch Blast = 1, but if any shape or essence modifications are +#Applied to the Blast, the highest spell level of those will set the spell level +#And therefor apply to spell DC and spell Penetration +#This is my idea on how to apply this as there is no hook ET_OnGetSpellLevelMod +def applyEldritchBlastSpellLevel(attachee, args, evt_obj): + spellEntry = evt_obj.spell_entry + spellEnum = spellEntry.spell_enum + if spellEnum in range(spell_eldritch_blast, spell_eldritch_glaive + 1): + spellClass = getSpellClassCode(classEnum) + shapeSpellLevel = spellEntry.level_for_spell_class(spellClass) + activeEssenceEnum = getActiveEldritchEssence(attachee) + spellEntry = tpdp.SpellEntry(activeEssenceEnum) + spellLevel = spellEntry.level_for_spell_class(spellClass) + spellLevel -= shapeSpellLevel + if spellLevel > 0: + evt_obj.bonus_list.add(spellLevel, bonus_type_untyped, "Warlock Eldritch Blast spell level modification") + return 0 + +classSpecObj.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, radialResestEldritchBlast, ()) +classSpecObj.AddHook(ET_OnD20PythonActionPerform, resetEldritchBlastEnum, performResetEldritchBlast, ()) +classSpecObj.AddHook(ET_OnGetSpellDcMod, EK_NONE, applyEldritchBlastSpellLevel, ()) +classSpecObj.AddHook(ET_OnGetSpellResistanceMod, EK_NONE, applyEldritchBlastSpellLevel, ()) + +## Detect Magic SLA ## +def radialDetectMagic(attachee, args, evt_obj): + spellEnum = spell_detect_magic + casterLevel = attachee.stat_level_get(classEnum) + radialName = "Detect Magic (at Will)" + radialHelpTag = "TAG_CLASS_FEATURES_WARLOCK_DETECT_MAGIC" + + detectMagicId = tpdp.RadialMenuEntryPythonAction(radialName, D20A_PYTHON_ACTION, detectMagicEnum, spellEnum, radialHelpTag) + spellData = tpdp.D20SpellData(spellEnum) + spellData.set_spell_class(classEnum) + spellData.set_spell_level(0) + detectMagicId.set_spell_data(spellData) + detectMagicId.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) + return 0 + +def performDetectMagic(attachee, args, evt_obj): + currentSequence = tpactions.get_cur_seq() + spellPacket = currentSequence.spell_packet + newSpellId = tpactions.get_new_spell_id() + tpactions.register_spell_cast(spellPacket, newSpellId) + currentSequence.spell_packet.spell_id = newSpellId + + if attachee.anim_goal_throw_spell_w_cast_anim(): # note: the animation goal has internal calls to trigger_spell_effect and the action frame + new_anim_id = attachee.anim_goal_get_new_id() + evt_obj.d20a.flags |= D20CAF_NEED_ANIM_COMPLETED + evt_obj.d20a.anim_id = new_anim_id + return 0 + +warlockDetectMagic = PythonModifier("Warlock Detect Magic", 2) #featEnum, empty +warlockDetectMagic.MapToFeat("Warlock Detect Magic", feat_cond_arg2 = 0) +warlockDetectMagic.AddHook(ET_OnBuildRadialMenuEntry , EK_NONE, radialDetectMagic, ()) +warlockDetectMagic.AddHook(ET_OnD20PythonActionPerform, detectMagicEnum, performDetectMagic, ()) + +## Damage Reduction Cold Iron ## +def addColdIronDr(attachee, args, evt_obj): + classLevel = attachee.stat_level_get(classEnum) + drValue = min((classLevel + 1) / 4, 5) #bonus capped at level 19 + evt_obj.damage_packet.add_physical_damage_res(drValue, D20DAP_COLD, 126) #ID 126 in damage.mes is DR; D20DAP_COLD = Cold Iron!! + return 0 + +warlockDamageReduction = PythonModifier("Warlock Damage Reduction", 2) #featEnum, empty +warlockDamageReduction.MapToFeat("Warlock Damage Reduction", feat_cond_arg2 = 0) +warlockDamageReduction.AddHook(ET_OnTakingDamage2, EK_NONE, addColdIronDr, ()) + +## Deceive Item ## +# TBD! + +## Fiendish Resilience ## +def radialFiendishResilience(attachee, args, evt_obj): + chargesLeft = args.get_arg(1) + radialName = "Fiendish Resilience ({}/1)".format(chargesLeft) + radialHelpTag = "TAG_CLASS_FEATURES_WARLOCK_FIENDISH_RESILIENCE" + fiendishResilienceId = tpdp.RadialMenuEntryPythonAction(radialName, D20A_PYTHON_ACTION, fiendishResilienceEnum, 114, radialHelpTag) + fiendishResilienceId.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) + return 0 + +def checkFiendishResilienceCharges(attachee, args, evt_obj): + chargesLeft = args.get_arg(1) + if chargesLeft < 1: + evt_obj.return_val = AEC_OUT_OF_CHARGES + return 0 + +def getFastHealingAmount(classLevel): + if classLevel < 13: + return 1 + elif classLevel < 18: + return 2 + return 5 + +def activateFiendishResilience(attachee, args, evt_obj): + chargesLeft = args.get_arg(1) + duration = 20 #2 min + attachee.float_text_line("Fiendish Resilience activated") + classLevel = attachee.stat_level_get(classEnum) + healingAmount = getFastHealingAmount(classLevel) + attachee.condition_add_with_args("Warlock Fiendish Resilience Effect", duration, healingAmount, 0) + chargesLeft -= 1 + args.set_arg(1, chargesLeft) + return 0 + +def resetFiendishResilienceCharges(attachee, args, evt_obj): + args.set_arg(1, 1) + return 0 + +warlockFiendishResilience = PythonModifier("Warlock Fiendish Resilience", 3) #featEnum, chargesLeft, empty +warlockFiendishResilience.MapToFeat("Warlock Fiendish Resilience", feat_cond_arg2 = 1) +warlockFiendishResilience.AddHook(ET_OnBuildRadialMenuEntry , EK_NONE, radialFiendishResilience, ()) +warlockFiendishResilience.AddHook(ET_OnD20PythonActionCheck, fiendishResilienceEnum, checkFiendishResilienceCharges, ()) +warlockFiendishResilience.AddHook(ET_OnD20PythonActionPerform, fiendishResilienceEnum, activateFiendishResilience, ()) +warlockFiendishResilience.AddHook(ET_OnNewDay, EK_NEWDAY_REST, resetFiendishResilienceCharges, ()) + +def fiendishResilienceHealTick(attachee, args, evt_obj): + healAmount = args.get_arg(1) + duration = args.get_arg(0) + + ### workaround for heal ### + #heal requires a dice + healDice = dice_new("1d1") + healDice.bonus = healAmount -1 + ### workaround end ### + game.particles ("sp-Cure Minor Wounds", attachee) + attachee.heal(attachee, healDice, D20A_HEAL, 0) + attachee.healsubdual(attachee, healDice, D20A_HEAL, 0) + + # Ticking down duration + duration -= evt_obj.data1 + if duration < 0: + args.condition_remove() + args.set_arg(0, duration) + return 0 + +def fiendishResilienceOnConditionRemove(attachee, args, evt_obj): + attachee.float_text_line("Fiendish Resilience end") + return 0 + +def fiendishResilienceTooltip(attachee, args, evt_obj): + duration = args.get_arg(0) + durationLabel = spellTime(duration) + fastHealingAmount = args.get_arg(1) + evt_obj.append("Fast Healing {} ({})".format(fastHealingAmount, durationLabel)) + return 0 + +def fiendishResilienceEffectTooltip(attachee, args, evt_obj): + duration = args.get_arg(0) + durationLabel = spellTime(duration) + fastHealingAmount = args.get_arg(1) + evt_obj.append(tpdp.hash("WARLOCK_FIENDISH_RESILIENCE"), -2, "{} ({})".format(fastHealingAmount, durationLabel)) + return 0 + +warlockFiendishResilienceEffect = PythonModifier("Warlock Fiendish Resilience Effect", 3) #duration, healAmount, empty +warlockFiendishResilienceEffect.AddHook(ET_OnConditionAdd, EK_NONE, fiendishResilienceHealTick, ()) +warlockFiendishResilienceEffect.AddHook(ET_OnBeginRound, EK_NONE, fiendishResilienceHealTick, ()) +warlockFiendishResilienceEffect.AddHook(ET_OnConditionRemove, EK_NONE, fiendishResilienceOnConditionRemove, ()) +warlockFiendishResilienceEffect.AddHook(ET_OnGetTooltip, EK_NONE, fiendishResilienceTooltip, ()) +warlockFiendishResilienceEffect.AddHook(ET_OnGetEffectTooltip, EK_NONE, fiendishResilienceEffectTooltip, ()) + +## Energy Resistance ## +def addEnergyResistance(attachee, args, evt_obj): + classLevel = attachee.stat_level_get(classEnum) + resistanceAmount = 5 if classLevel in range(10, 20) else 10 + energyType = args.get_param(0) + evt_obj.damage_packet.add_damage_resistance(resistanceAmount, energyType, 124) + return 0 + +warlockEnergyResistanceAcid = PythonModifier("Warlock Acid Resistance Feat", 2) #featEnum, empty +warlockEnergyResistanceAcid .MapToFeat("Warlock Energy Resistance - Acid", feat_cond_arg2 = 0) +warlockEnergyResistanceAcid .AddHook(ET_OnTakingDamage, EK_NONE, addEnergyResistance, (D20DT_ACID,)) + +warlockEnergyResistanceCold = PythonModifier("Warlock Cold Resistance Feat", 2) #featEnum, empty +warlockEnergyResistanceCold.MapToFeat("Warlock Energy Resistance - Cold", feat_cond_arg2 = 0) +warlockEnergyResistanceCold.AddHook(ET_OnTakingDamage, EK_NONE, addEnergyResistance, (D20DT_COLD,)) + +warlockEnergyResistanceElectricity = PythonModifier("Warlock Electricity Resistance Feat", 2) #featEnum, empty +warlockEnergyResistanceElectricity.MapToFeat("Warlock Energy Resistance - Electricity", feat_cond_arg2 = 0) +warlockEnergyResistanceElectricity.AddHook(ET_OnTakingDamage, EK_NONE, addEnergyResistance, (D20DT_ELECTRICITY,)) + +warlockEnergyResistanceFire = PythonModifier("Warlock Fire Resistance Feat", 2) #featEnum, empty +warlockEnergyResistanceFire.MapToFeat("Warlock Energy Resistance - Fire", feat_cond_arg2 = 0) +warlockEnergyResistanceFire.AddHook(ET_OnTakingDamage, EK_NONE, addEnergyResistance, (D20DT_FIRE,)) + +warlockEnergyResistanceSonic = PythonModifier("Warlock Sonic Resistance Feat", 2) #featEnum, empty +warlockEnergyResistanceSonic.MapToFeat("Warlock Energy Resistance - Sonic", feat_cond_arg2 = 0) +warlockEnergyResistanceSonic.AddHook(ET_OnTakingDamage, EK_NONE, addEnergyResistance, (D20DT_SONIC,)) + +## Imbue Item ## +# TBD! + +#No spell failure in Light Armor for Warlock spells +def WarlockSpellFailure(attachee, args, evt_obj): + #Only effects spells cast as a warlock + if evt_obj.data1 != classEnum: + return 0 + + equip_slot = evt_obj.data2 + item = attachee.item_worn_at(equip_slot) + + if item == OBJ_HANDLE_NULL: + return 0 + + if equip_slot == item_wear_armor: + armor_flags = item.obj_get_int(obj_f_armor_flags) + if attachee.d20_query("Improved Armored Casting"): + if (armor_flags & ARMOR_TYPE_NONE) or (armor_flags == ARMOR_TYPE_LIGHT) or (armor_flags == ARMOR_TYPE_MEDIUM): + return 0 + else: + if (armor_flags & ARMOR_TYPE_NONE) or (armor_flags == ARMOR_TYPE_LIGHT): + return 0 + evt_obj.return_val += item.obj_get_int(obj_f_armor_arcane_spell_failure) + return 0 + +warlockSpellFailure = PythonModifier("Warlock Spell Failure", 2) #featEnum, empty +warlockSpellFailure.MapToFeat("Warlock Spell Failure", feat_cond_arg2 = 0) +warlockSpellFailure.AddHook(ET_OnD20Query, EK_Q_Get_Arcane_Spell_Failure, WarlockSpellFailure, ()) + +### Spell casting +def OnGetBaseCasterLevel(attachee, args, evt_obj): + if evt_obj.arg0 != classEnum: + return 0 + classLvl = attachee.stat_level_get(classEnum) + evt_obj.bonus_list.add(classLvl, 0, 137) + return 0 + +def OnLevelupSpellsFinalize(attachee, args, evt_obj): + if evt_obj.arg0 != classEnum: + return 0 + classSpecModule.LevelupSpellsFinalize(attachee) + return 0 + +def OnInitLevelupSpellSelection(attachee, args, evt_obj): + if evt_obj.arg0 != classEnum: + return 0 + classSpecModule.InitSpellSelection(attachee) + return 0 + +def OnLevelupSpellsCheckComplete(attachee, args, evt_obj): + if evt_obj.arg0 != classEnum: + return 0 + if not classSpecModule.LevelupCheckSpells(attachee): + evt_obj.bonus_list.add(-1, 0, 137) # denotes incomplete spell selection + return 1 + +classSpecObj.AddHook(ET_OnGetBaseCasterLevel, EK_NONE, OnGetBaseCasterLevel, ()) +classSpecObj.AddHook(ET_OnLevelupSystemEvent, EK_LVL_Spells_Finalize, OnLevelupSpellsFinalize, ()) +classSpecObj.AddHook(ET_OnLevelupSystemEvent, EK_LVL_Spells_Activate, OnInitLevelupSpellSelection, ()) +classSpecObj.AddHook(ET_OnLevelupSystemEvent, EK_LVL_Spells_Check_Complete, OnLevelupSpellsCheckComplete, ()) diff --git a/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes b/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes index e1d82e931..b9b341212 100644 --- a/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes +++ b/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes @@ -758,7 +758,7 @@ {28327}{} // spell hit {28328}{} // spell struck -// [1117] *[] +// [1117] *[Rhino's Rush] {28340}{} // spell begin {28341}{} // spell end {28342}{} // spell effect @@ -1439,3 +1439,256 @@ {29566}{} // spell projectile in-flight {29567}{} // spell hit {29568}{} // spell struck + +// [1179] *[Sure Strike] +{29580}{} // spell begin +{29581}{} // spell end +{29582}{} // spell effect +{29583}{} // spell new round +{29584}{} // spell projectile begin +{29585}{} // spell projectile end +{29586}{} // spell projectile in-flight +{29587}{} // spell hit +{29588}{} // spell struck + +// [1180] *[Hunter's Eye] +{29600}{} // spell begin +{29601}{} // spell end +{29602}{} // spell effect +{29603}{} // spell new round +{29604}{} // spell projectile begin +{29605}{} // spell projectile end +{29606}{} // spell projectile in-flight +{29607}{} // spell hit +{29608}{} // spell struck + +// [1181] *[Tactical Precision] +{29620}{} // spell begin +{29621}{} // spell end +{29622}{} // spell effect +{29623}{} // spell new round +{29624}{} // spell projectile begin +{29625}{} // spell projectile end +{29626}{} // spell projectile in-flight +{29627}{} // spell hit +{29628}{} // spell struck + +// [1182] *[Accuracy] +{29640}{} // spell begin +{29641}{} // spell end +{29642}{} // spell effect +{29643}{} // spell new round +{29644}{} // spell projectile begin +{29645}{} // spell projectile end +{29646}{} // spell projectile in-flight +{29647}{} // spell hit +{29648}{} // spell struck + +// [1183] *[Hail of Stone] +{29660}{} // spell begin +{29661}{} // spell end +{29662}{} // spell effect +{29663}{} // spell new round +{29664}{} // spell projectile begin +{29665}{} // spell projectile end +{29666}{} // spell projectile in-flight +{29667}{} // spell hit +{29668}{} // spell struck + +// [1184] *[Lesser Orb of Acid] +{29680}{} // spell begin +{29681}{} // spell end +{29682}{} // spell effect +{29683}{} // spell new round +{29684}{} // spell projectile begin +{29685}{} // spell projectile end +{29686}{} // spell projectile in-flight +{29687}{} // spell hit +{29688}{} // spell struck + +// [1185] *[Lesser Orb of Cold] +{29700}{} // spell begin +{29701}{} // spell end +{29702}{} // spell effect +{29703}{} // spell new round +{29704}{} // spell projectile begin +{29705}{} // spell projectile end +{29706}{} // spell projectile in-flight +{29707}{} // spell hit +{29708}{} // spell struck + +// [1186] *[Lesser Orb of Electricity] +{29720}{} // spell begin +{29721}{} // spell end +{29722}{} // spell effect +{29723}{} // spell new round +{29724}{} // spell projectile begin +{29725}{} // spell projectile end +{29726}{} // spell projectile in-flight +{29727}{} // spell hit +{29728}{} // spell struck + +// [1187] *[Lesser Orb of Fire] +{29740}{} // spell begin +{29741}{} // spell end +{29742}{} // spell effect +{29743}{} // spell new round +{29744}{} // spell projectile begin +{29745}{} // spell projectile end +{29746}{} // spell projectile in-flight +{29747}{} // spell hit +{29748}{} // spell struck + +// [1188] *[Lesser Orb of Sound] +{29760}{} // spell begin +{29761}{} // spell end +{29762}{} // spell effect +{29763}{} // spell new round +{29764}{} // spell projectile begin +{29765}{} // spell projectile end +{29766}{} // spell projectile in-flight +{29767}{} // spell hit +{29768}{} // spell struck + +// [1189] *[Blades of Fire] +{29780}{} // spell begin +{29781}{} // spell end +{29782}{} // spell effect +{29783}{} // spell new round +{29784}{} // spell projectile begin +{29785}{} // spell projectile end +{29786}{} // spell projectile in-flight +{29787}{} // spell hit +{29788}{} // spell struck + +// [1190] *[Fireburst] +{29800}{} // spell begin +{29801}{} // spell end +{29802}{} // spell effect +{29803}{} // spell new round +{29804}{} // spell projectile begin +{29805}{} // spell projectile end +{29806}{} // spell projectile in-flight +{29807}{} // spell hit +{29808}{} // spell struck + +// [1191] *[Greater Fireburst] +{29820}{} // spell begin +{29821}{} // spell end +{29822}{} // spell effect +{29823}{} // spell new round +{29824}{} // spell projectile begin +{29825}{} // spell projectile end +{29826}{} // spell projectile in-flight +{29827}{} // spell hit +{29828}{} // spell struck + +// [1192] *[Ice Knife] +{29840}{} // spell begin +{29841}{} // spell end +{29842}{} // spell effect +{29843}{} // spell new round +{29844}{} // spell projectile begin +{29845}{} // spell projectile end +{29846}{} // spell projectile in-flight +{29847}{} // spell hit +{29848}{} // spell struck + +// [1193] *[Whirling Blade] +{29860}{} // spell begin +{29861}{} // spell end +{29862}{} // spell effect +{29863}{} // spell new round +{29864}{} // spell projectile begin +{29865}{} // spell projectile end +{29866}{} // spell projectile in-flight +{29867}{} // spell hit +{29868}{} // spell struck + +// [1194] *[Ring of Blades] +{29880}{} // spell begin +{29881}{} // spell end +{29882}{} // spell effect +{29883}{} // spell new round +{29884}{} // spell projectile begin +{29885}{} // spell projectile end +{29886}{} // spell projectile in-flight +{29887}{} // spell hit +{29888}{} // spell struck + +// [1195] *[Blast of Flame] +{29900}{} // spell begin +{29901}{} // spell end +{29902}{} // spell effect +{29903}{} // spell new round +{29904}{} // spell projectile begin +{29905}{} // spell projectile end +{29906}{} // spell projectile in-flight +{29907}{} // spell hit +{29908}{} // spell struck + +// [1196] *[Orb of Acid] +{29920}{} // spell begin +{29921}{} // spell end +{29922}{} // spell effect +{29923}{} // spell new round +{29924}{} // spell projectile begin +{29925}{} // spell projectile end +{29926}{} // spell projectile in-flight +{29927}{} // spell hit +{29928}{} // spell struck + +// [1197] *[Orb of Cold] +{29940}{} // spell begin +{29941}{} // spell end +{29942}{} // spell effect +{29943}{} // spell new round +{29944}{} // spell projectile begin +{29945}{} // spell projectile end +{29946}{} // spell projectile in-flight +{29947}{} // spell hit +{29948}{} // spell struck + +// [1198] *[Orb of Electricity] +{29960}{} // spell begin +{29961}{} // spell end +{29962}{} // spell effect +{29963}{} // spell new round +{29964}{} // spell projectile begin +{29965}{} // spell projectile end +{29966}{} // spell projectile in-flight +{29967}{} // spell hit +{29968}{} // spell struck + +// [1199] *[Orb of Fire] +{29980}{} // spell begin +{29981}{} // spell end +{29982}{} // spell effect +{29983}{} // spell new round +{29984}{} // spell projectile begin +{29985}{} // spell projectile end +{29986}{} // spell projectile in-flight +{29987}{} // spell hit +{29988}{} // spell struck + +// [1200] *[Orb of Sound] +{30000}{} // spell begin +{30001}{} // spell end +{30002}{} // spell effect +{30003}{} // spell new round +{30004}{} // spell projectile begin +{30005}{} // spell projectile end +{30006}{} // spell projectile in-flight +{30007}{} // spell hit +{30008}{} // spell struck + +// [1201] *[Icelance] +{30020}{} // spell begin +{30021}{} // spell end +{30022}{} // spell effect +{30023}{} // spell new round +{30024}{spells\sp_snare_end.WAV} // spell projectile begin +{30025}{spells\sp_snare_hit.WAV} // spell projectile end +{30026}{} // spell projectile in-flight +{30027}{} // spell hit +{30028}{} // spell struck diff --git a/tpdatasrc/tpgamefiles/sound/user_sounds/warlock_sounds.mes b/tpdatasrc/tpgamefiles/sound/user_sounds/warlock_sounds.mes new file mode 100644 index 000000000..65fd5af91 --- /dev/null +++ b/tpdatasrc/tpgamefiles/sound/user_sounds/warlock_sounds.mes @@ -0,0 +1,74 @@ +// This file controls sounds for Warlock Invocations +// +// it uses sound IDs beginning with 27000 +// +// * Banks of 20 sounds per spells are used from 6000 to 19999 +// the bank consists of the following fields: +// +// 00 - spell begin (before cast anim) +// 01 - spell end (end of spell) +// 02 - spell effect (after cast anim) +// 03 - spell new round (spells with duration) +// 04 - spell projectile begin (only projectile spells) +// 05 - spell projectile end (only projectile spells) +// 06 - spell projectile in-flight (only projectile spells) ***not implemented yet +// 07 - spell hit (sound to play when a spell "hits") +// 08 - spell struck (sound to play if shield spell struck) +// 09 - reserved, N/A +// 10 - reserved, N/A +// 11 - reserved, N/A +// 12 - reserved, N/A +// 13 - reserved, N/A +// 14 - reserved, N/A +// 15 - reserved, N/A +// 16 - reserved, N/A +// 17 - reserved, N/A +// 18 - reserved, N/A +// 19 - reserved, N/A + +// to figure out your BASE_NUMBER, use this formula: +// BASE_NUMBER = 6000 + (20 * spell_number) + +// [2300] *[Eldritch Blast] +{52000}{} // spell begin +{52001}{} // spell end +{52002}{} // spell effect +{52003}{} // spell new round +{52004}{spells\sp_enervation_proj.WAV} // spell projectile begin +{52005}{} // spell projectile end +{52006}{} // spell projectile in-flight +{52007}{spells\sp_enervation_hit.WAV} // spell hit; does not get triggered and projectile end gets always triggered... +{52008}{} // spell struck + +// [2301] *[Eldritch Spear] +{52020}{} // spell begin +{52021}{} // spell end +{52022}{} // spell effect +{52023}{} // spell new round +{52024}{spells\sp_enervation_proj.WAV} // spell projectile begin +{52025}{} // spell projectile end +{52026}{} // spell projectile in-flight +{52027}{spells\sp_enervation_hit.WAV} // spell hit +{52028}{} // spell struck + +// [2302] *[Hideous Blow] +{52040}{} // spell begin +{52041}{} // spell end +{52042}{} // spell effect +{52043}{} // spell new round +{52044}{} // spell projectile begin +{52045}{} // spell projectile end +{52046}{} // spell projectile in-flight +{52047}{} // spell hit +{52048}{} // spell struck + +// [2303] *[Eldritch Chain] +{52040}{} // spell begin +{52041}{} // spell end +{52042}{} // spell effect +{52043}{} // spell new round +{52044}{} // spell projectile begin +{52045}{} // spell projectile end +{52046}{} // spell projectile in-flight +{52047}{} // spell hit +{52048}{} // spell struck