from templeplus.pymod import PythonModifier from toee import * import tpdp #Magic Item Compendium, p. 7 print "Adding Hunting Weapon" def HuntingWeaponDealingDamage(attachee, args, evt_obj): target = evt_obj.attack_packet.target favored_enemy = attachee.is_favored_enemy(target) if favored_enemy: BonusString = game.get_mesline("tpmes\\item_creation.mes", 1037) #Get Hunting Mes Line evt_obj.damage_packet.bonus_list.add(4, 0, BonusString) return 0 weaponHunting = PythonModifier("Weapon Hunting", 3) # spare, spare, inv_idx weaponHunting.AddHook(ET_OnDealingDamage, EK_NONE, HuntingWeaponDealingDamage, ())
from templeplus.pymod import PythonModifier from toee import * import tpdp # Fix for Atari Bug 90 # Extend bracers of archery (greater - 6267 and lesser - 6268) to provide the appropriate proficiencies print "Bracers of Archery extender" def BracersOfArcheryProficientWithWeapon(attachee, args, evt_obj): # Makes the character proficient with all bows (except crossbows) weaponType = evt_obj.data1 if (weaponType == wt_longbow or weaponType == wt_shortbow or weaponType == wt_composite_shortbow or weaponType == wt_composite_longbow): evt_obj.return_val = 1 return 0 modExtender = PythonModifier() modExtender.ExtendExisting("Bracers of Archery") modExtender.AddHook(ET_OnD20PythonQuery, "Proficient with Weapon", BracersOfArcheryProficientWithWeapon, ())
### Spell casting def OnGetBaseCasterLevel(attachee, args, evt_obj): if (evt_obj.arg0 != classEnum): return 0 classLvl = attachee.stat_level_get(classEnum) caster_levels = classSpecModule.GetCasterLevels() base_cl = char_class_utils.GetBaseCasterLevel(caster_levels, classLvl) if base_cl <= 0: return 0 evt_obj.bonus_list.add(base_cl, 0, 137) return 0 def OnLevelupSpellsFinalize(attachee, args, evt_obj): if (evt_obj.arg0 != classEnum): return 0 classSpecModule.LevelupSpellsFinalize(attachee) return # spellCasterSpecObj = PythonModifier(GetSpellCasterConditionName(), 8) # spellCasterSpecObj.AddHook(ET_OnGetBaseCasterLevel, EK_NONE, OnGetBaseCasterLevel, ()) classSpecExtender = PythonModifier() classSpecExtender.ExtendExisting("Ranger") classSpecExtender.AddHook(ET_OnGetBaseCasterLevel, EK_NONE, OnGetBaseCasterLevel, ()) classSpecExtender.AddHook(ET_OnLevelupSystemEvent, EK_LVL_Spells_Finalize, OnLevelupSpellsFinalize, ())
from templeplus.pymod import PythonModifier from toee import * import tpdp print "Registering Power Attack Extender" def PowerAttackValue(attachee, args, evt_obj): evt_obj.return_val = args.get_arg(0) return 0 powerAttackExtender = PythonModifier() powerAttackExtender.ExtendExisting("Power Attack") powerAttackExtender.MapToFeat(feat_power_attack) powerAttackExtender.AddHook(ET_OnD20PythonQuery, "Power Attack Value", PowerAttackValue, ())
weap = attachee.item_worn_at(4) if weap == OBJ_HANDLE_NULL or IsRangedWeapon(weap): return 0 bladesingerLvl = attachee.stat_level_get(classEnum) intScore = attachee.stat_level_get(stat_intelligence) intBonus = (intScore - 10) / 2 if intBonus <= 0: return if bladesingerLvl < intBonus: intBonus = bladesingerLvl evt_obj.bonus_list.modify(intBonus, 3, 104) 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, ()) classSpecObj.AddHook(ET_OnGetAC, EK_NONE, BladesongAcBonus, ()) ##### Spell casting def OnAddSpellCasting(attachee, args, evt_obj): if (args.get_arg(0) == 0): args.set_arg(0, char_class_utils.GetHighestArcaneClass(attachee)) return 0
from templeplus.pymod import PythonModifier from toee import * import tpdp print "Registering Armor Twilight" def TwilightSpellFailure(attachee, args, evt_obj): is_valid = False inv_idx = args.get_arg(2) if inv_idx == -1: # inventory tooltip query is_valid = True elif inv_idx == 205: # worn item query in ArmorSpellFailure callback equip_slot = evt_obj.data2 if equip_slot == item_wear_armor: is_valid = True if is_valid: evt_obj.return_val += -10 return 0 armorTwilight = PythonModifier("Armor Twilight", 3) # spare, spare, inv_idx armorTwilight.AddHook(ET_OnD20Query, EK_Q_Get_Arcane_Spell_Failure, TwilightSpellFailure, ())
return 0 def OnCombatEnd(attachee, args, evt_obj): #print "Combat End" spellId = args.get_arg(0) spell_packet = tpdp.SpellPacket(spellId) if spell_packet.spell_enum == 0: return if spell_packet.caster != OBJ_HANDLE_NULL: spell_packet.float_spell_line(spell_packet.caster, 20000, tf_white) args.remove_spell() args.remove_spell_mod() return 0 wallOfFire = PythonModifier("sp-Wall of Fire", 8) wallOfFire.AddHook(ET_OnConditionAdd, EK_NONE, WallOfFireOnAdd, ()) wallOfFire.AddHook(ET_OnObjectEvent, EK_OnEnterAoE, OnWallAoEEntered, ()) wallOfFire.AddHook(ET_OnD20Signal, EK_S_Concentration_Broken, OnConcentrationBroken, ()) wallOfFire.AddHook(ET_OnD20Signal, EK_S_Combat_End, OnCombatEnd, ()) wallOfFire.AddSpellCountdownStandardHook() wallOfFire.AddAoESpellEndStandardHook() #wallOfFire.AddSpellDismissStandardHook() # oops, Wall of Fire doesn't have Dismiss (but it does have COncentration...) ################################################## # sp-Wall of fire hit # does damage at the beginning of round ################################################## def EndSpellMod(attachee, args, evt_obj):
def MomentOfPrescienceKilled(attachee, args, evt_obj): args.remove_spell() args.remove_spell_mod() return 0 def MomentOfPrescienceSpellEnd(attachee, args, evt_obj): print "MomentOfPrescienceSpellEnd" spell_id = args.get_arg(0) if evt_obj.data1 == spell_id: game.particles('sp-Moment of Prescience-END', attachee) return 0 momentOfPrescience = PythonModifier("sp-Moment of Prescience", 6) # momentOfPrescience.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, MomentOfPrescienceRadial, ()) momentOfPrescience.AddHook(ET_OnGetTooltip, EK_NONE, MomentOfPrescienceTooltip, ()) momentOfPrescience.AddHook(ET_OnGetEffectTooltip, EK_NONE, MomentOfPrescienceEffectTooltip, ()) momentOfPrescience.AddHook(ET_OnGetAC, EK_NONE, MomentOfPrescienceAcBonus, ()) momentOfPrescience.AddHook(ET_OnSaveThrowLevel, EK_NONE, MomentOfPrescienceSaveBonus, ()) momentOfPrescience.AddHook(ET_OnToHitBonus2, EK_NONE, MomentOfPrescienceAttackBonus, ()) #momentOfPrescience.AddHook(ET_OnGetSkillLevel, EK_NONE, MomentOfPrescienceSkillCheck, ()) momentOfPrescience.AddHook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, MomentOfPrescienceHasSpellActive, ()) momentOfPrescience.AddHook(ET_OnD20Signal, EK_S_Killed, MomentOfPrescienceKilled, ()) momentOfPrescience.AddHook(ET_OnD20Signal, EK_S_Spell_End,
#Fix for bug 184 Stinking Cloud: Nauseated creatures still make Attacks of opportunity but not normal attacks. from templeplus.pymod import PythonModifier from toee import * import tpdp print "Registering Stinking Cloud AOO Fix" def StinkingCloudEffectAOOPossible(attachee, args, evt_obj): # No making AOOs when Nauseated evt_obj.return_val = 0 return 0 stinkingCloudEffect = PythonModifier() stinkingCloudEffect.ExtendExisting("sp-Stinking Cloud Hit") stinkingCloudEffect.AddHook(ET_OnD20Query, EK_Q_AOOPossible, StinkingCloudEffectAOOPossible, ())
def OnAddSpellCastingArcane(attachee, args, evt_obj): # arg0 holds the arcane class if args.get_arg(0) == 0: highestArcane = char_class_utils.GetHighestArcaneClass(attachee) args.set_arg(0, highestArcane) return 0 def OnAddSpellCastingDivine(attachee, args, evt_obj): # arg0 holds the arcane class if args.get_arg(0) == 0: highestDivine = char_class_utils.GetHighestDivineClass(attachee) args.set_arg(0, highestDivine) return 0 pracSC_Arcane = PythonModifier("Practiced Spellcaster Feat - Arcane", 2) # args are just-in-case placeholders pracSC_Arcane.MapToFeat("Practiced Spellcaster - Arcane") pracSC_Arcane.AddHook(ET_OnGetCasterLevelMod, EK_NONE, PracticedSpellcasterLevelModArcane, ()) pracSC_Arcane.AddHook(ET_OnConditionAdd, EK_NONE, OnAddSpellCastingArcane, ()) pracSC_Divine = PythonModifier("Practiced Spellcaster Feat - Divine", 2) # args are just-in-case placeholders pracSC_Divine.MapToFeat("Practiced Spellcaster - Divine") pracSC_Divine.AddHook(ET_OnGetCasterLevelMod, EK_NONE, PracticedSpellcasterLevelModDivine, ()) pracSC_Divine.AddHook(ET_OnConditionAdd, EK_NONE, OnAddSpellCastingDivine, ())
from templeplus.pymod import PythonModifier from toee import * import tpdp def DetGoodRadial(attachee, args, evt_obj): return 0 def DetGoodActionFrame(attachee, args, evt_obj): return 0 detGoodEnum = 2200 detGood = PythonModifier("Feat Detect Good", 0) detGood.MapToFeat("Detect Good") detGood.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, DetGoodRadial, ()) detGood.AddHook(ET_OnD20PythonActionFrame, detGoodEnum, DetGoodActionFrame, ())
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 def RogueSneakAttackDice(attachee, args, evt_obj): rogLvl = attachee.stat_level_get(classEnum) rogLvlBonus = attachee.d20_query("Rogue Sneak Attack Level Bonus") rogLvl = rogLvl + rogLvlBonus if evt_obj.data1 == classEnum: #class leveling up rogLvl = rogLvl + 1 if rogLvl <= 0: return 0 evt_obj.return_val += 1+ (rogLvl - 1)/2 return 0 classSpecExtender = PythonModifier() classSpecExtender.ExtendExisting("Rogue") classSpecExtender.AddHook(ET_OnD20PythonQuery, "Sneak Attack Dice", RogueSneakAttackDice, ())
#Get the metamagic info metaMagicData = evt_obj.meta_magic #Don't apply if it already has still if not metaMagicData.get_still(): metaMagicData.set_still(true) return 0 def SuddenStillDeductCharge(attachee, args, evt_obj): #Check for a charge and the enable flag charges = args.get_arg(0) if charges < 1 or not args.get_arg(1): return 0 #Decriment the charges charges = charges - 1 args.set_arg(0, charges) return 0 #Setup the feat tpdp.register_metamagic_feat("Sudden Still") suddenStillFeat = PythonModifier("Sudden Still Feat", 4) #Charges, Toggeled On, Spare, Spare suddenStillFeat.MapToFeat("Sudden Still") suddenStillFeat.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, SuddenStillRadial, ()) suddenStillFeat.AddHook(ET_OnConditionAdd, EK_NONE, SuddenStillNewDay, ()) suddenStillFeat.AddHook(ET_OnNewDay, EK_NEWDAY_REST, SuddenStillNewDay, ()) suddenStillFeat.AddHook(ET_OnMetaMagicMod, EK_NONE, SuddenStillMetamagicUpdate, ()) suddenStillFeat.AddHook(ET_OnD20PythonSignal, "Sudden Metamagic Deduct Charge", SuddenStillDeductCharge, ())
def OnGetBaseCasterLevel2(attachee, args, evt_obj): classEnum = args.get_arg(1) if evt_obj.arg0 != classEnum: return 0 cur_caster_lvl = evt_obj.bonus_list.get_total() cur_hd = attachee.hit_dice_num bon_val = min(4, cur_hd - cur_caster_lvl) if bon_val > 0: evt_obj.bonus_list.add(bon_val, 0, "Practiced Spellcaster") return 0 # arg0 - featEnum (autoset by engine) # arg1 - set to chosen classEnum pracSC_Arcane = PythonModifier("Practiced Spellcaster Feat - Arcane", 2) # args are just-in-case placeholders pracSC_Arcane.MapToFeat("Practiced Spellcaster - Arcane") # pracSC_Arcane.AddHook(ET_OnGetCasterLevelMod, EK_NONE, PracticedSpellcasterLevelModArcane, ()) pracSC_Arcane.AddHook(ET_OnConditionAdd, EK_NONE, OnAddSpellCastingArcane, ()) pracSC_Arcane.AddHook(ET_OnSpellCasterGeneral, EK_SPELL_Base_Caster_Level_2, OnGetBaseCasterLevel2, ()) pracSC_Divine = PythonModifier("Practiced Spellcaster Feat - Divine", 2) # args are just-in-case placeholders pracSC_Divine.MapToFeat("Practiced Spellcaster - Divine") # pracSC_Divine.AddHook(ET_OnGetCasterLevelMod, EK_NONE, PracticedSpellcasterLevelModDivine, ()) pracSC_Divine.AddHook(ET_OnConditionAdd, EK_NONE, OnAddSpellCastingDivine, ()) pracSC_Divine.AddHook(ET_OnSpellCasterGeneral, EK_SPELL_Base_Caster_Level_2, OnGetBaseCasterLevel2, ())
from templeplus.pymod import PythonModifier from toee import * import tpdp print "Registering Opportunist extender" def OpportunistReset(attachee, args, evt_obj): args.set_arg(0, 1) return 0 modExtender = PythonModifier() modExtender.ExtendExisting("Opportunist") modExtender.AddHook(ET_OnBeginRound, EK_NONE, OpportunistReset, ()) modExtender.MapToFeat(feat_opportunist)
from templeplus.pymod import PythonModifier from toee import * import tpdp print "Registering Fighting Defensively addendum" def IsFightingDefensively(attachee, args, evt_obj): #Return true value on fighting defensively or total defense if (args.get_arg(0) != 0) or (args.get_arg(1) != 0): evt_obj.return_val = 1 return 0 return 0 modExtender = PythonModifier() modExtender.ExtendExisting("Fighting Defensively") modExtender.AddHook(ET_OnD20Query, EK_Q_FightingDefensively, IsFightingDefensively, ())
return 0 def ImpromptuSneakAttack(attachee, args, evt_obj): attachee.condition_add_with_args("Impromptu Sneak Attack",0,0) arcTrkLvl = attachee.stat_level_get(classEnum) if arcTrkLvl - 3 < 0: return 0 radialAction = tpdp.RadialMenuEntryPythonAction(-1, D20A_PYTHON_ACTION, impromptuSneakEnum, 0, "TAG_INTERFACE_HELP") radialAction.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) 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, ()) classSpecObj.AddHook(ET_OnD20PythonQuery, "Sneak Attack Dice", ArcTrkSneakAttackDice, ()) classSpecObj.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, ImpromptuSneakAttack, ()) ##### Spell casting # 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)) 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 def OnQueryFindTraps(attachee, args, evt_obj): evt_obj.return_val = 1 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, ()) classSpecObj.AddHook(ET_OnD20Query, EK_Q_Critter_Can_Find_Traps, OnQueryFindTraps, ()) ### 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)
#Reckless Rage: Races of Stone, p. 143 from templeplus.pymod import PythonModifier from toee import * import tpdp print "Reckless Rage" def RecklessRageAbilityBonus(attachee, args, evt_obj): evt_obj.return_val = 2 #+2 to con and str (used by the C++ side) return 0 def RecklessRageACPenalty(attachee, args, evt_obj): evt_obj.return_val = 2 #-2 to AC (Value returned must be positive, it will be negated by the C++ side) return 0 recklessRage = PythonModifier("Reckless Rage", 2) # args are just-in-case placeholders recklessRage.MapToFeat("Reckless Rage") recklessRage.AddHook(ET_OnD20PythonQuery, "Additional Rage Stat Bonus", RecklessRageAbilityBonus, ()) recklessRage.AddHook(ET_OnD20PythonQuery, "Additional Rage AC Penalty", RecklessRageACPenalty, ())
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, ()) #### Stormlord Feats #### ## Define Stormlord Weapons; list can be extended if ever necessary ## def stormlordWeapons(): weaponList = [wt_javelin, wt_longspear, wt_shortspear, wt_spear] return weaponList
def OnGetFavoredClass(attachee, args, evt_obj): if evt_obj.data1 == stat_level_ranger: evt_obj.return_val = 1 return 0 def ConditionImmunityOnPreAdd(attachee, args, evt_obj): val = evt_obj.is_modifier("sp-Sleep") if val: evt_obj.return_val = 0 attachee.float_mesfile_line('mes\\combat.mes', 5059, tf_red) # "Sleep Immunity" game.create_history_from_pattern(31, attachee, OBJ_HANDLE_NULL) return 0 raceSpecObj = PythonModifier(GetConditionName(), 0) race_utils.AddAbilityModifierHooks(raceSpecObj, raceSpecModule) race_utils.AddSkillBonuses(raceSpecObj, { skill_listen: 2, skill_search: 2, skill_spot: 2 }) race_utils.AddBaseMoveSpeed(raceSpecObj, 30) raceSpecObj.AddHook(ET_OnSaveThrowLevel, EK_NONE, ElvenSaveBonusEnchantment, ()) raceSpecObj.AddHook(ET_OnD20Query, EK_Q_FavoredClass, OnGetFavoredClass, ()) raceSpecObj.AddHook(ET_OnConditionAddPre, EK_NONE, ConditionImmunityOnPreAdd, ())
weaponPrimary = attachee.item_worn_at(item_wear_weapon_primary) weaponSecondary = attachee.item_worn_at(item_wear_weapon_secondary) #Weapons must not be the same if weaponPrimary == weaponSecondary: return 0 #Both hands must have a weapon if weaponPrimary == OBJ_HANDLE_NULL or weaponSecondary == OBJ_HANDLE_NULL: return 0 #Need a medium sized weapon in the off hand wieldType = attachee.get_wield_type(weaponSecondary) if wieldType != 1: return 0 #Bonus of 2 for the on and off hand will result in the same bonus as a light weapon evt_obj.bonus_list.add_from_feat(2, 0, 114, "Oversized Two-Weapon Fighting") return 0 oversizedTwoWeaponFighting = PythonModifier("Oversized Two-Weapon Fighting", 2) #Spare, Spare oversizedTwoWeaponFighting.MapToFeat("Oversized Two-Weapon Fighting") oversizedTwoWeaponFighting.AddHook(ET_OnToHitBonus2, EK_NONE, OversizedTwoWeaponFightingAttackBonus, ())
#From the SRD print "Registering Armor Energy Resistance" def OnGetDamageResistance(attachee, args, evt_obj): damType = args.get_param(0) value = args.get_arg(0) #Add Resistance only if there is damage of the correct type damage = evt_obj.damage_packet.get_overall_damage_by_type(damType) if damage > 0: evt_obj.damage_packet.add_damage_resistance(value, damType, 124) return 0 armorFireRes = PythonModifier("Armor Fire Resistance", 3) # DR, spare, inv_idx armorFireRes.AddHook(ET_OnTakingDamage2, EK_NONE, OnGetDamageResistance, (D20DT_FIRE,)) armorAcidRes = PythonModifier("Armor Acid Resistance", 3) # DR, spare, inv_idx armorAcidRes.AddHook(ET_OnTakingDamage2, EK_NONE, OnGetDamageResistance, (D20DT_ACID,)) armorColdRes = PythonModifier("Armor Cold Resistance", 3) # DR, spare, inv_idx armorColdRes.AddHook(ET_OnTakingDamage2, EK_NONE, OnGetDamageResistance, (D20DT_COLD,)) armorElectricityRes = PythonModifier("Armor Elec Resistance", 3) # DR, spare, inv_idx armorElectricityRes.AddHook(ET_OnTakingDamage2, EK_NONE, OnGetDamageResistance, (D20DT_ELECTRICITY,)) armorSonicRes = PythonModifier("Armor Sonic Resistance", 3) # DR, spare, inv_idx armorSonicRes.AddHook(ET_OnTakingDamage2, EK_NONE, OnGetDamageResistance, (D20DT_SONIC,))
raceSpecObj = PythonModifier(GetConditionName(), 0) race_utils.AddAbilityModifierHooks(raceSpecObj, raceSpecModule) race_utils.AddSaveThrowBonusHook(raceSpecObj, D20_Save_Will, 2) race_utils.AddSaveBonusVsEffectType(raceSpecObj, D20STD_F_SPELL_LIKE_EFFECT, 2) race_utils.AddSkillBonuses(raceSpecObj, { skill_listen: 1, skill_spot: 1, skill_move_silently: 4 }) race_utils.AddBaseMoveSpeed( raceSpecObj, 20 ) # note: dwarven move speed with heavy armor or when medium/heavy encumbered is already handled in Encumbered Medium, Encumbered Heavy condition callbacks race_utils.AddPoisonImmunity(raceSpecObj) race_utils.AddFavoredClassHook(raceSpecObj, stat_level_fighter) raceSpecObj.AddHook(ET_OnGetSkillLevel, EK_SKILL_APPRAISE, OnGetAppraiseSkill, ()) raceSpecObj.AddHook(ET_OnGetMoveSpeed, EK_NONE, OnGetMoveSpeedSetLowerLimit, ()) raceSpecObj.AddHook(ET_OnSaveThrowLevel, EK_NONE, ElvenSaveBonusEnchantment, ()) raceSpecObj.AddHook(ET_OnConditionAddPre, EK_NONE, ConditionImmunityOnPreAdd, ()) # paralysis immunity raceSpecObj.AddHook(ET_OnToHitBonus2, EK_NONE, OnGetToHitBonusVsOrcsAndGoblins, ()) raceSpecObj.AddHook(ET_OnGetAC, EK_NONE, OnGetArmorClassBonusVsGiants, ()) raceSpecObj.AddHook(ET_OnGetAbilityCheckModifier, EK_NONE, OnAbilityModCheckStabilityBonus, ()) raceSpecObj.AddHook(ET_OnGetCasterLevelMod, EK_NONE, CasterLevelRacialSpell, ())
# Gets the number of turn undead charges def GetTurnUndeadCharges(attachee, args, evt_obj): evt_obj.return_val = args.get_arg(1) return 0 # Called to deduct a turn undead charge def DeductTurnUndeadCharge(attachee, args, evt_obj): #Deduct one turn undead charge NewCharges = args.get_arg(1) - 1 if NewCharges > 0: args.set_arg(1, NewCharges) else: args.set_arg(1, 0) attachee.d20_send_signal( "Deduct Greater Turn Undead Charge") #Zero out greater turning return 0 modExtender = PythonModifier() modExtender.ExtendExisting( "Turn Undead" ) #Note: Arg 0 = turn undead type, Arg 1 = is the number of chrages modExtender.AddHook(ET_OnD20PythonSignal, "Turn Undead Perform", TurnUndeadPerform, ()) modExtender.AddHook(ET_OnD20PythonSignal, "Deduct Turn Undead Charge", DeductTurnUndeadCharge, ()) modExtender.AddHook(ET_OnD20PythonQuery, "Turn Undead Charges", GetTurnUndeadCharges, ())
def BlackguardFallenPaladin(attachee, args, evt_obj): palLvl = attachee.stat_level_get(stat_level_paladin) if palLvl: evt_obj.return_val = 1 return 0 def BlackguardFallenIndicator(attachee, args, evt_obj): palLvl = attachee.stat_level_get(stat_level_paladin) if palLvl: evt_obj.append(175, -1, ": Blackguard") 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, ()) classSpecObj.AddHook(ET_OnD20PythonQuery, "Sneak Attack Dice", BlackguardSneakAttackDice, ()) classSpecObj.AddHook(ET_OnD20PythonQuery, "Turn Undead Level", BlackguardRebukeUndeadLevel, ()) classSpecObj.AddHook( ET_OnD20Query, EK_Q_IsFallenPaladin, BlackguardFallenPaladin, () ) # forces "Fallen Paladin" status no matter what. There's no atoning for this one! classSpecObj.AddHook(ET_OnGetEffectTooltip, EK_NONE, BlackguardFallenIndicator, ())
from templeplus.pymod import PythonModifier from toee import * import tpdp print "Registering Combat Casting extender" def CombatCastingBonus(attachee, args, evt_obj): evt_obj.return_val += 4 return 0 def CombatCastingUsed(attachee, args, evt_obj): print "Removing" args.condition_remove() print "Removing - Done" return 0 modExtender = PythonModifier() modExtender.ExtendExisting("Combat_Casting") modExtender.AddHook(ET_OnD20PythonQuery, "Combat Casting Bonus", CombatCastingBonus, ()) modExtender.AddHook(ET_OnD20PythonSignal, "Combat Casting Used", CombatCastingUsed, ())
return 0 def SuddenMaximizeDeductCharge(attachee, args, evt_obj): #Check for a charge and the enable flag charges = args.get_arg(0) if charges < 1 or not args.get_arg(1): return 0 #Decriment the charges charges = charges - 1 args.set_arg(0, charges) return 0 #Setup the feat tpdp.register_metamagic_feat("Sudden Maximize") suddenMaximizeFeat = PythonModifier("Sudden Maximize Feat", 4) #Charges, Toggeled On, Spare, Spare suddenMaximizeFeat.MapToFeat("Sudden Maximize") suddenMaximizeFeat.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, SuddenMaximizeRadial, ()) suddenMaximizeFeat.AddHook(ET_OnNewDay, EK_NEWDAY_REST, SuddenMaximizeNewDay, ()) suddenMaximizeFeat.AddHook(ET_OnMetaMagicMod, EK_NONE, SuddenMaximizeMetamagicUpdate, ()) suddenMaximizeFeat.AddHook(ET_OnD20PythonSignal, "Sudden Metamagic Deduct Charge", SuddenMaximizeDeductCharge, ())
evt_obj.damage_packet.bonus_list.add_from_feat(bon_val, bon_type_mwm, 114, "Melee Weapon Mastery") return 0 elif featDamType == D20DT_PIERCING and ( weapDamType == D20DT_BLUDGEONING_AND_PIERCING or weapDamType == D20DT_PIERCING_AND_SLASHING): evt_obj.damage_packet.bonus_list.add_from_feat(bon_val, bon_type_mwm, 114, "Melee Weapon Mastery") return 0 return 0 mwmBludg = PythonModifier("Melee Weapon Mastery - Bludgeoning", 3) mwmBludg.MapToFeat("Melee Weapon Mastery - Bludgeoning") mwmBludg.AddHook(ET_OnToHitBonus2, EK_NONE, MWMToHit, (D20DT_BLUDGEONING, )) mwmBludg.AddHook(ET_OnDealingDamage, EK_NONE, MWMToDam, (D20DT_BLUDGEONING, )) mwmSlash = PythonModifier("Melee Weapon Mastery - Slashing", 3) mwmSlash.MapToFeat("Melee Weapon Mastery - Slashing") mwmSlash.AddHook(ET_OnToHitBonus2, EK_NONE, MWMToHit, (D20DT_SLASHING, )) mwmSlash.AddHook(ET_OnDealingDamage, EK_NONE, MWMToDam, (D20DT_SLASHING, )) mwmPierc = PythonModifier("Melee Weapon Mastery - Piercing", 3) mwmPierc.MapToFeat("Melee Weapon Mastery - Piercing") mwmPierc.AddHook(ET_OnToHitBonus2, EK_NONE, MWMToHit, (D20DT_PIERCING, )) mwmPierc.AddHook(ET_OnDealingDamage, EK_NONE, MWMToDam, (D20DT_PIERCING, )) # MWM bonuses do not stack for weapons with multiple damage types. See: # http://rpg.stackexchange.com/questions/57989/can-you-take-melee-weapon-mastery-twice-and-have-it-apply-twice-to-the-same-weap
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, ()) ### 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: