示例#1
0
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,
                      ())
示例#2
0
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, ())
示例#3
0

### 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, ())
示例#4
0
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, ())
示例#5
0
        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
示例#6
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, ())
示例#7
0
	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):
示例#8
0
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,
示例#9
0
#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, ())
示例#10
0

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, ())
示例#11
0
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, ())
示例#12
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


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, ())
示例#13
0
	
	#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, ())
示例#14
0
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, ())
示例#15
0
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)
示例#16
0
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, ())
示例#17
0
	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
示例#18
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)
示例#19
0
#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, ())
示例#20
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, ())

#### 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

示例#21
0
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,
                    ())
示例#22
0
    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, ())
示例#23
0
#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,))

示例#24
0
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,
                    ())
示例#25
0
# 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, ())
示例#26
0
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,
                     ())
示例#27
0
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, ())
示例#28
0
    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, ())
示例#29
0
        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
示例#30
0
	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: