From 54ec3043878d468bee88a20115611c164f3d587b Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 16 Sep 2021 11:11:34 +0200 Subject: [PATCH 001/146] Dragon Disciple WIP --- .../mes/help/dragon_discipile_help.tab | 6 + .../char_class/class023_dragon_disciple.py | 112 ++++++++++-------- .../feats/dragon disciple blindsense.txt | 7 ++ .../feats/dragon disciple breath weapon.txt | 22 ++++ .../feats/dragon disciple claws and bite.txt | 5 + .../dragon disciple dragon apotheosis.txt | 5 + .../feats/dragon disciple heritage black .txt | 6 + .../feats/dragon disciple heritage blue.txt | 6 + .../rules/feats/dragon disciple heritage.txt | 5 + .../scr/tpModifiers/dragon_disciple.py | 60 ++++++---- 10 files changed, 166 insertions(+), 68 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/mes/help/dragon_discipile_help.tab create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple blindsense.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple breath weapon.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple claws and bite.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple dragon apotheosis.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage black .txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage blue.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage.txt diff --git a/tpdatasrc/tpgamefiles/mes/help/dragon_discipile_help.tab b/tpdatasrc/tpgamefiles/mes/help/dragon_discipile_help.tab new file mode 100644 index 000000000..0fefbc135 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/help/dragon_discipile_help.tab @@ -0,0 +1,6 @@ +TAG_DRAGON_DISCIPILE TAG_PRESTIGE_CLASSES Dragon Discipile Dragon Discipile Short Desdcription - TBD!. Most Dragon Discipiles 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 Discipile, 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_DISCIPILES_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_DISCIPILES_TABLES TAG_DRAGON_DISCIPILE Dragon Discipile Base Attack & Base Save Bonuses - TBD! 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_DRAGON_DISCIPILES_SPELLS_PER_DAY TAG_DRAGON_DISCIPILE Dragon Discipile Bonus Spells - TBD! 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_DRAGON_DISCIPILES_GRANTED_PROFICIENCIES TAG_DRAGON_DISCIPILE Dragon Discipile Weapon and Armor Proficiency Dragon Discipiles gain no weapon or armor proficiencies. +TAG_CLASS_FEATURES_DRAGON_DISCIPILES_HERITAGE TAG_DRAGON_DISCIPILE Dragon Discipile Heritage The player chooses a dragon variety when taking the first level in this prestige class. TBD! +TAG_CLASS_FEATURES_DRAGON_DISCIPILES_NATURAL_ARMOR_INCREASE TAG_DRAGON_DISCIPILE Dragon Discipile 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. diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py index 1ec2d9b82..99ae0657c 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py @@ -1,22 +1,23 @@ from toee import * import char_class_utils +import char_editor ################################################### 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 +25,90 @@ def GetClassHelpTopic(): class_feats = { +1: ("Dragon Disciple Natural Armor",), +2: ("Dragon Disciple Claws and Bite",), +3: ("Dragon Disciple Breath Weapon",), +5: ("Dragon Disciple Blindsense",), +10: ("Dragon Disciple Dragon Apotheosis",) } +bonus_feats = ["Dragon Disciple Heritage"] + 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 ObjMeetsPrereqs(obj): + if not KnowledgeArcanaCheck(obj): + return 0 + elif not CanCastInnateArcane(obj): + return 0 + elif not SpeaksDraconic(obj): + return 0 + return 1 + + +# Levelup +def IsSelectingFeatsOnLevelup(obj): + newLvl = obj.stat_level_get( classEnum ) + 1 + if newLvl == 1: + return 1 + return 0 + +def LevelupGetBonusFeats(obj): +#Lazy copy + paste from fighter; could be cleaned up as it is only one feat + bonFeatInfo = [] + for ft in bonus_feats: + bonFeatInfo.append(char_editor.FeatInfo(ft)) + char_editor.set_bonus_feats(bonFeatInfo) + return diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple blindsense.txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple blindsense.txt new file mode 100644 index 000000000..4064a60db --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple blindsense.txt @@ -0,0 +1,7 @@ +name: Dragon Disciple Blindsense +flags: 8 +prereqs: +description: 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. +prereq descr: Dragon Disciple level 5. \ 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 black .txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage black .txt new file mode 100644 index 000000000..76736a4a8 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage black .txt @@ -0,0 +1,6 @@ +name: Dragon Disciple Heritage - Black +flags: 8 +prereqs: 23 1 +description: The player chooses a dragon variety when taking the first level in this prestige class. +prereq descr: Dragon Disciple level 1 +parent: Dragon Disciple Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage blue.txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage blue.txt new file mode 100644 index 000000000..8a3c60164 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage blue.txt @@ -0,0 +1,6 @@ +name: Dragon Disciple Heritage - Blue +flags: 8 +prereqs: 23 1 +description: The player chooses a dragon variety when taking the first level in this prestige class. +prereq descr: Dragon Disciple level 1 +parent: Dragon Disciple Heritage \ 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..6a8439c93 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage.txt @@ -0,0 +1,5 @@ +name: Dragon Disciple Heritage +flags: 524288 +prereqs: 23 1 +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/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index f80321d07..93188a171 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -13,7 +13,7 @@ def GetSpellCasterConditionName(): print "Registering " + GetConditionName() -classEnum = stat_level_eldritch_knight +classEnum = stat_level_dragon_disciple classSpecModule = __import__('class023_dragon_disciple') ################################################### @@ -48,19 +48,6 @@ def OnGetSaveThrowWill(attachee, args, evt_obj): classSpecObj.AddHook(ET_OnSaveThrowLevel, EK_SAVE_WILL, OnGetSaveThrowWill, ()) -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) - return 0 - -classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_STRENGTH, OnGetAbilityScore, ()) - #region Spell casting # configure the spell casting condition to hold the highest Arcane classs @@ -132,15 +119,48 @@ def OnLevelupSpellsFinalize(attachee, args, evt_obj): #endregion +##### Dragon Disciple Class Features ##### + +### AC Bonus 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) + 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_DISCIPILES_NATURAL_ARMOR_INCREASE]") return 0 -naturalArmorInc = PythonModifier("Dragon Disciple Natural Armor", 3) +naturalArmorInc = PythonModifier("Dragon Disciple Natural Armor", 0) naturalArmorInc.MapToFeat("Dragon Disciple Natural Armor") naturalArmorInc.AddHook(ET_OnGetAC, EK_NONE, NaturalArmorACBonus, ()) +### Strength Bonus +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) + return 0 + +classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_STRENGTH, OnGetAbilityScore, ()) + +### Breath Weapon + + +### Blindsense + + +#### Dragon Apotheosis +# 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. From 03126730533a0e19c4a1168bfda7968b7549e204 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 17 Sep 2021 11:28:13 +0200 Subject: [PATCH 002/146] Updated Dragon Disciple --- tpdata/templeplus/lib/templeplus/constants.py | 2 + .../mes/help/dragon_discipile_help.tab | 6 - .../mes/help/dragon_disciple_help.tab | 11 ++ .../dragon_disciple_breath_weapons.mes | 1 + .../char_class/class023_dragon_disciple.py | 34 +++--- ...on02301_dragon_disciple_select_heritage.py | 18 +++ ...tion02302_dragon_disciple_breath_attack.py | 29 +++++ .../feats/dragon disciple heritage black .txt | 6 - .../feats/dragon disciple heritage blue.txt | 6 - .../rules/feats/dragon disciple heritage.txt | 4 +- .../rules/partsys/dragon_disciple_partsys.tab | 12 ++ .../3231 - Dragon Disciple Cone Breath.txt | 17 +++ ...Spell3231 - Dragon Disciple Cone Breath.py | 61 ++++++++++ .../scr/tpModifiers/dragon_disciple.py | 105 +++++++++++++++++- 14 files changed, 278 insertions(+), 34 deletions(-) delete mode 100644 tpdatasrc/tpgamefiles/mes/help/dragon_discipile_help.tab create mode 100644 tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab create mode 100644 tpdatasrc/tpgamefiles/mes/spell_ext/dragon_disciple_breath_weapons.mes create mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action02301_dragon_disciple_select_heritage.py create mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action02302_dragon_disciple_breath_attack.py delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage black .txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage blue.txt create mode 100644 tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab create mode 100644 tpdatasrc/tpgamefiles/rules/spells/3231 - Dragon Disciple Cone Breath.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 439daafb8..448dc6118 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3357,6 +3357,8 @@ spell_new_slot_lvl_8 = 1613 spell_new_slot_lvl_9 = 1614 +spell_dragon_disciple_cone_breath = 3231 +spell_dragon_disciple_line_breath = 3232 stat_strength = 0 stat_dexterity = 1 diff --git a/tpdatasrc/tpgamefiles/mes/help/dragon_discipile_help.tab b/tpdatasrc/tpgamefiles/mes/help/dragon_discipile_help.tab deleted file mode 100644 index 0fefbc135..000000000 --- a/tpdatasrc/tpgamefiles/mes/help/dragon_discipile_help.tab +++ /dev/null @@ -1,6 +0,0 @@ -TAG_DRAGON_DISCIPILE TAG_PRESTIGE_CLASSES Dragon Discipile Dragon Discipile Short Desdcription - TBD!. Most Dragon Discipiles 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 Discipile, 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_DISCIPILES_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_DISCIPILES_TABLES TAG_DRAGON_DISCIPILE Dragon Discipile Base Attack & Base Save Bonuses - TBD! 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_DRAGON_DISCIPILES_SPELLS_PER_DAY TAG_DRAGON_DISCIPILE Dragon Discipile Bonus Spells - TBD! 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_DRAGON_DISCIPILES_GRANTED_PROFICIENCIES TAG_DRAGON_DISCIPILE Dragon Discipile Weapon and Armor Proficiency Dragon Discipiles gain no weapon or armor proficiencies. -TAG_CLASS_FEATURES_DRAGON_DISCIPILES_HERITAGE TAG_DRAGON_DISCIPILE Dragon Discipile Heritage The player chooses a dragon variety when taking the first level in this prestige class. TBD! -TAG_CLASS_FEATURES_DRAGON_DISCIPILES_NATURAL_ARMOR_INCREASE TAG_DRAGON_DISCIPILE Dragon Discipile 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. 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..993f5f8bb --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab @@ -0,0 +1,11 @@ +TAG_DRAGON_DISCIPLE TAG_PRESTIGE_CLASSES Dragon Disciple Dragon Disciple Short Description - TBD!. 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 - TBD! 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_DRAGON_DISCIPLES_SPELLS_PER_DAY TAG_DRAGON_DISCIPLE Dragon Disciple Bonus Spells - TBD! 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_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 variety when taking the first level in this prestige class. TBD! +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_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. +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 (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. 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..994e549be --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/dragon_disciple_breath_weapons.mes @@ -0,0 +1 @@ +{3231} {Dragon Disciple Cone Breath} diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py index 99ae0657c..8491252cd 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py @@ -25,14 +25,14 @@ def GetClassHelpTopic(): class_feats = { -1: ("Dragon Disciple Natural Armor",), +1: ("Dragon Disciple Heritage", "Dragon Disciple Natural Armor",), 2: ("Dragon Disciple Claws and Bite",), 3: ("Dragon Disciple Breath Weapon",), 5: ("Dragon Disciple Blindsense",), 10: ("Dragon Disciple Dragon Apotheosis",) } -bonus_feats = ["Dragon Disciple Heritage"] +#bonus_feats = ["Dragon Disciple Heritage"] 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) @@ -88,6 +88,12 @@ def KnowledgeArcanaCheck( obj ): 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 1 + return 0 + def ObjMeetsPrereqs(obj): if not KnowledgeArcanaCheck(obj): return 0 @@ -95,20 +101,22 @@ def ObjMeetsPrereqs(obj): return 0 elif not SpeaksDraconic(obj): return 0 + #elif DragonRaceCheck: + # return 0 return 1 # Levelup -def IsSelectingFeatsOnLevelup(obj): - newLvl = obj.stat_level_get( classEnum ) + 1 - if newLvl == 1: - return 1 - return 0 +#def IsSelectingFeatsOnLevelup(obj): +# newLvl = obj.stat_level_get( classEnum ) + 1 +# if newLvl == 1: +# return 1 +# return 0 -def LevelupGetBonusFeats(obj): +#def LevelupGetBonusFeats(obj): #Lazy copy + paste from fighter; could be cleaned up as it is only one feat - bonFeatInfo = [] - for ft in bonus_feats: - bonFeatInfo.append(char_editor.FeatInfo(ft)) - char_editor.set_bonus_feats(bonFeatInfo) - return +# bonFeatInfo = [] +# for ft in bonus_feats: +# bonFeatInfo.append(char_editor.FeatInfo(ft)) +# char_editor.set_bonus_feats(bonFeatInfo) +# return diff --git a/tpdatasrc/tpgamefiles/rules/d20_actions/action02301_dragon_disciple_select_heritage.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action02301_dragon_disciple_select_heritage.py new file mode 100644 index 000000000..08ad3c207 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action02301_dragon_disciple_select_heritage.py @@ -0,0 +1,18 @@ +from toee import * +import tpactions + +def GetActionName(): + return "Dragon Disciple Select Heritage" + +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/action02302_dragon_disciple_breath_attack.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action02302_dragon_disciple_breath_attack.py new file mode 100644 index 000000000..2e1f69de1 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action02302_dragon_disciple_breath_attack.py @@ -0,0 +1,29 @@ +from toee import * +import tpactions +import tpdp + + +def GetActionName(): + return "Dragon Disciple Breath Attack" + + +def GetActionDefinitionFlags(): + return D20ADF_MagicEffectTargeting | D20ADF_QueryForAoO + + +def GetTargetingClassification(): + return D20TC_CastSpell + + +def GetActionCostType(): + return D20ACT_Standard_Action + + +def AddToSequence(d20action, action_seq, tb_status): + print "Dragon Disciple Breath Weapon Add to Sequence" + 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/feats/dragon disciple heritage black .txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage black .txt deleted file mode 100644 index 76736a4a8..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage black .txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Dragon Disciple Heritage - Black -flags: 8 -prereqs: 23 1 -description: The player chooses a dragon variety when taking the first level in this prestige class. -prereq descr: Dragon Disciple level 1 -parent: Dragon Disciple Heritage \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage blue.txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage blue.txt deleted file mode 100644 index 8a3c60164..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage blue.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Dragon Disciple Heritage - Blue -flags: 8 -prereqs: 23 1 -description: The player chooses a dragon variety when taking the first level in this prestige class. -prereq descr: Dragon Disciple level 1 -parent: Dragon Disciple Heritage \ 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 index 6a8439c93..9a5fef308 100644 --- a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage.txt +++ b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple heritage.txt @@ -1,5 +1,5 @@ name: Dragon Disciple Heritage -flags: 524288 -prereqs: 23 1 +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/partsys/dragon_disciple_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab new file mode 100644 index 000000000..6df3d8f8c --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab @@ -0,0 +1,12 @@ +sp-Dragon Disciple Cone Breath 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?330 5?40 0 0 0?360 0 0 0,16,0 255 255 255 100 +sp-Dragon Disciple Cone Breath Acid 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-Dragon Disciple Cone Breath Acid 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath Cold 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-Dragon Disciple Cone Breath Cold 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-Dragon Disciple Cone Breath Electricity 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-Dragon Disciple Cone Breath Electricity 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-Dragon Disciple Cone Breath Electricity 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-Dragon Disciple Cone Breath 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,16,0 255 255 255 100 +sp-Dragon Disciple Cone Breath Fire 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-Dragon Disciple Cone Breath Fire 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 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/scr/Spell3231 - Dragon Disciple Cone Breath.py b/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py new file mode 100644 index 000000000..fa62e4562 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py @@ -0,0 +1,61 @@ +from toee import * + +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) + print "Dragon Disciple Breath Weapon DC: {}".format(spell.dc) + + spellDamageDice = dice_new('1d8') + if spell.caster_level < 7: + spellDamageDice.number = 2 + elif spell.caster_level < 10: + spellDamageDice = 4 + else: + spellDamageDice = 6 + saveType = D20_Save_Reduction_Half + damageType = spell.caster.d20_query("PQ_Dragon_Disciple_Element_Type") + print "Dragon Disciple Breath Weapon Element: {}".format(damageType) + #If different Breath Weapon Types get added (e.g. Sonic) add them here + if damageType == D20DT_ACID: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ACID + particleEffect = "sp-Dragon Disciple Cone Breath Acid" + elif damageType == D20DT_COLD: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_COLD + particleEffect = "sp-Dragon Disciple Cone Breath Cold" + elif damageType == D20DT_ELECTRICITY: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ELECTRICITY + particleEffect = "sp-Dragon Disciple Cone Breath Electricity" + elif damageType == D20DT_FIRE: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_FIRE + particleEffect = "sp-Dragon Disciple Cone Breath Fire" + else: #Fallback + saveDescriptor = D20STD_F_NONE + particleEffect = "sp-Dragon Disciple Cone Breath Fire" + print "Dragon Disciple Breath Weapon Descriptor: {}".format(saveDescriptor) + + 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/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 93188a171..b547624a9 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -1,6 +1,7 @@ from templeplus.pymod import PythonModifier from toee import * import tpdp +import tpactions import char_class_utils ################################################### @@ -15,6 +16,25 @@ def GetSpellCasterConditionName(): classEnum = stat_level_dragon_disciple classSpecModule = __import__('class023_dragon_disciple') + +selectHeritageId = 2301 +breathWeaponEnum = 2302 + +#Dict to handle Dragon Disciple Heritage +#Can easily be expanded by adding a new type of heritage to the dict +#[Colour, ElementType, Breath Weapon Shape (1 = Cone, 2 = Line)] +dictDragonHeritage = { +1: ["Black", D20DT_ACID, 2], +2: ["Blue", D20DT_ELECTRICITY, 2], +3: ["Green", D20DT_ACID, 1], +4: ["Red", D20DT_FIRE, 1], +5: ["White", D20DT_COLD, 1], +6: ["Brass", D20DT_FIRE, 2], +7: ["Bronze", D20DT_ELECTRICITY, 2], +8: ["Copper", D20DT_ACID, 2], +9: ["Gold", D20DT_FIRE, 1], +10: ["Silver", D20DT_COLD, 1] +} ################################################### @@ -121,6 +141,50 @@ def OnLevelupSpellsFinalize(attachee, args, evt_obj): ##### Dragon Disciple Class Features ##### +###Handle Heritage +def selectHeritageRadial(attachee, args, evt_obj): + if not args.get_arg(0): + radialSelectHeritageParent = tpdp.RadialMenuEntryParent("Select Dragon Disciple Heritage") + radialSelectHeritageParentId = radialSelectHeritageParent.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) + for key in dictDragonHeritage.keys(): + dragonColour = dictDragonHeritage[key][0] + radialHeritageColourId = tpdp.RadialMenuEntryPythonAction("{} Dragon Heritage".format(dragonColour), D20A_PYTHON_ACTION, selectHeritageId, key, "TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS") + radialHeritageColourId.add_as_child(attachee, radialSelectHeritageParentId) + return 0 + +def setHeritage(attachee, args, evt_obj): + chosenHeritage = evt_obj.d20a.data1 + args.set_arg(0, chosenHeritage) + return 0 + +def querySelectedHeritage(attachee, args, evt_obj): + evt_obj.return_val = args.get_arg(0) + return 0 + +def queryHeritageElementType(attachee, args, evt_obj): + heritage = args.get_arg(0) + evt_obj.return_val = dictDragonHeritage[heritage][1] + return 0 + +def queryHeritageBreathWeaponType(attachee, args, evt_obj): + heritage = args.get_arg(0) + evt_obj.return_val = dictDragonHeritage[heritage][2] + return 0 + +def initialHeritageValue(attachee, args, evt_obj): + args.set_arg(0, 0) + return 0 + +dragonHeritage = PythonModifier("Dragon Disciple Heritage", 3) #arg0 = heritage +dragonHeritage.MapToFeat("Dragon Disciple Heritage") +dragonHeritage.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, selectHeritageRadial, ()) +dragonHeritage.AddHook(ET_OnD20PythonActionPerform, selectHeritageId, setHeritage, ()) +dragonHeritage.AddHook(ET_OnD20PythonQuery, "PQ_Dragon_Disciple_Selected_Heritage", queryHeritageElementType, ()) +dragonHeritage.AddHook(ET_OnD20PythonQuery, "PQ_Dragon_Disciple_Element_Type", queryHeritageElementType, ()) +dragonHeritage.AddHook(ET_OnD20PythonQuery, "PQ_Dragon_Disciple_Breath_Weapon_Type", queryHeritageBreathWeaponType, ()) +dragonHeritage.AddHook(ET_OnConditionAdd, EK_NONE, initialHeritageValue, ()) + + ### AC Bonus def NaturalArmorACBonus(attachee, args, evt_obj): classLevel = attachee.stat_level_get(classEnum) @@ -133,7 +197,7 @@ def NaturalArmorACBonus(attachee, args, evt_obj): 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_DISCIPILES_NATURAL_ARMOR_INCREASE]") + evt_obj.bonus_list.add(bonusValue, bonusType, "~Dragon Disciple Natural Armor~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_NATURAL_ARMOR_INCREASE]") return 0 naturalArmorInc = PythonModifier("Dragon Disciple Natural Armor", 0) @@ -155,6 +219,45 @@ def OnGetAbilityScore(attachee, args, evt_obj): classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_STRENGTH, OnGetAbilityScore, ()) ### Breath Weapon +def breathWeaponRadial(attachee, args, evt_obj): + if args.get_arg(0): + return 0 + #I display the heritage colour in the Breath Weapon Radial + #So the player gets a visual feedback, which colour he did choose + heritage = attachee.d20_query("PQ_Dragon_Disciple_Selected_Heritage") + dragonColour = dictDragonHeritage[heritage][0] + breathWeaponShape = attachee.d20_query("PQ_Dragon_Disciple_Breath_Weapon_Type") + spellId = spell_dragon_disciple_cone_breath if breathWeaponShape == 1 else spell_dragon_disciple_line_breath + + breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon ({})".format(dragonColour), D20A_PYTHON_ACTION, breathWeaponEnum, 0, "TAG_INTERFACE_HELP") + spellData = tpdp.D20SpellData(spellId) + casterLevel = attachee.stat_level_get(classEnum) + spellData.set_spell_class(classEnum) + spellData.set_spell_level(casterLevel) + breathWeaponId.set_spell_data(spellData) + breathWeaponId.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) + 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) + tpactions.trigger_spell_effect(evt_obj.d20a.spell_id) + return 0 + + +def resetBreathWeapon(attachee, args, evt_obj): + args.set_arg(0, 0) + return 0 + +dragonDiscipleBreathWeapon = PythonModifier("Dragon Disciple Breath Weapon", 3) #arg0 = used this day +dragonDiscipleBreathWeapon.MapToFeat("Dragon Disciple Breath Weapon") +dragonDiscipleBreathWeapon.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, breathWeaponRadial, ()) +#dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionPerform, breathWeaponEnum, performBreathWeapon, ()) +dragonDiscipleBreathWeapon.AddHook(ET_OnConditionAdd, EK_NONE, resetBreathWeapon, ()) +dragonDiscipleBreathWeapon.AddHook(ET_OnNewDay, EK_NEWDAY_REST, resetBreathWeapon, ()) ### Blindsense From b9d12def5ba8a6f46679e923b01ac3ff48385d0f Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 17 Sep 2021 12:08:29 +0200 Subject: [PATCH 003/146] Update dragon_disciple.py --- tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index b547624a9..8e8ce6139 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -23,6 +23,8 @@ def GetSpellCasterConditionName(): #Dict to handle Dragon Disciple Heritage #Can easily be expanded by adding a new type of heritage to the dict #[Colour, ElementType, Breath Weapon Shape (1 = Cone, 2 = Line)] +#If a new element type would be added e.g. sonic or negative, +#this also would be needed to add in both spells and in the partsys dictDragonHeritage = { 1: ["Black", D20DT_ACID, 2], 2: ["Blue", D20DT_ELECTRICITY, 2], @@ -154,6 +156,7 @@ def selectHeritageRadial(attachee, args, evt_obj): def setHeritage(attachee, args, evt_obj): chosenHeritage = evt_obj.d20a.data1 + print "Selected Heritage: {}".format(chosenHeritage) args.set_arg(0, chosenHeritage) return 0 @@ -227,10 +230,10 @@ def breathWeaponRadial(attachee, args, evt_obj): heritage = attachee.d20_query("PQ_Dragon_Disciple_Selected_Heritage") dragonColour = dictDragonHeritage[heritage][0] breathWeaponShape = attachee.d20_query("PQ_Dragon_Disciple_Breath_Weapon_Type") - spellId = spell_dragon_disciple_cone_breath if breathWeaponShape == 1 else spell_dragon_disciple_line_breath + spellEnum = spell_dragon_disciple_cone_breath if breathWeaponShape == 1 else spell_dragon_disciple_line_breath breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon ({})".format(dragonColour), D20A_PYTHON_ACTION, breathWeaponEnum, 0, "TAG_INTERFACE_HELP") - spellData = tpdp.D20SpellData(spellId) + spellData = tpdp.D20SpellData(spellEnum) casterLevel = attachee.stat_level_get(classEnum) spellData.set_spell_class(classEnum) spellData.set_spell_level(casterLevel) @@ -255,7 +258,7 @@ def resetBreathWeapon(attachee, args, evt_obj): dragonDiscipleBreathWeapon = PythonModifier("Dragon Disciple Breath Weapon", 3) #arg0 = used this day dragonDiscipleBreathWeapon.MapToFeat("Dragon Disciple Breath Weapon") dragonDiscipleBreathWeapon.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, breathWeaponRadial, ()) -#dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionPerform, breathWeaponEnum, performBreathWeapon, ()) +dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionPerform, breathWeaponEnum, performBreathWeapon, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnConditionAdd, EK_NONE, resetBreathWeapon, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnNewDay, EK_NEWDAY_REST, resetBreathWeapon, ()) From 783606e1e10dba5a9570316bcb212028b49074af Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 20 Sep 2021 12:14:34 +0200 Subject: [PATCH 004/146] Added Ability Boost --- .../mes/help/dragon_disciple_help.tab | 1 + .../scr/tpModifiers/dragon_disciple.py | 99 ++++++++++++++++--- 2 files changed, 86 insertions(+), 14 deletions(-) diff --git a/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab b/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab index 993f5f8bb..1f99cc3b1 100644 --- a/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab @@ -4,6 +4,7 @@ TAG_CLASS_FEATURES_DRAGON_DISCIPLES_SPELLS_PER_DAY TAG_DRAGON_DISCIPLE Dragon 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 variety when taking the first level in this prestige class. TBD! 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. diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 8e8ce6139..835702c08 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -207,19 +207,65 @@ def NaturalArmorACBonus(attachee, args, evt_obj): naturalArmorInc.MapToFeat("Dragon Disciple Natural Armor") naturalArmorInc.AddHook(ET_OnGetAC, EK_NONE, NaturalArmorACBonus, ()) -### Strength Bonus -def OnGetAbilityScore(attachee, args, evt_obj): +### Ability Bonus +#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) +# 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) +# return 0 + +#classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_STRENGTH, OnGetAbilityScore, ()) + + +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 -classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_STRENGTH, OnGetAbilityScore, ()) +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 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 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 + +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 ### Breath Weapon def breathWeaponRadial(attachee, args, evt_obj): @@ -264,9 +310,34 @@ def resetBreathWeapon(attachee, args, evt_obj): ### Blindsense - +#TBD #### Dragon Apotheosis -# 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. +#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)) + return 0 + +def elementImmunity(attachee, args, evt_obj): + elementType = attachee.d20_query("PQ_Dragon_Disciple_Element_Type") + 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) +dragonDiscipleApotheosis.MapToFeat("Dragon Disciple Dragon Apotheosis") +dragonDiscipleApotheosis.AddHook(ET_OnConditionAddPre, EK_NONE, sleepParalyzeImmunity, ()) +dragonDiscipleApotheosis.AddHook(ET_OnTakingDamage2, EK_NONE, elementImmunity, ()) From 0cb6e919622766fa3c65124ab2dd23ab5c35d674 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 20 Sep 2021 22:47:59 +0200 Subject: [PATCH 005/146] Fixed Heritage bug --- .../scr/tpModifiers/dragon_disciple.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 835702c08..9b4b5aed8 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -150,7 +150,7 @@ def selectHeritageRadial(attachee, args, evt_obj): radialSelectHeritageParentId = radialSelectHeritageParent.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) for key in dictDragonHeritage.keys(): dragonColour = dictDragonHeritage[key][0] - radialHeritageColourId = tpdp.RadialMenuEntryPythonAction("{} Dragon Heritage".format(dragonColour), D20A_PYTHON_ACTION, selectHeritageId, key, "TAG_CLASS_FEATURES_MARSHAL_MINOR_AURAS") + radialHeritageColourId = tpdp.RadialMenuEntryPythonAction("{} Dragon Heritage".format(dragonColour), D20A_PYTHON_ACTION, selectHeritageId, key, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_HERITAGE") radialHeritageColourId.add_as_child(attachee, radialSelectHeritageParentId) return 0 @@ -161,12 +161,14 @@ def setHeritage(attachee, args, evt_obj): return 0 def querySelectedHeritage(attachee, args, evt_obj): - evt_obj.return_val = args.get_arg(0) + heritage = args.get_arg(0) + evt_obj.return_val = heritage return 0 def queryHeritageElementType(attachee, args, evt_obj): heritage = args.get_arg(0) - evt_obj.return_val = dictDragonHeritage[heritage][1] + elementType = dictDragonHeritage[heritage][1] + evt_obj.return_val = elementType return 0 def queryHeritageBreathWeaponType(attachee, args, evt_obj): @@ -182,14 +184,14 @@ def initialHeritageValue(attachee, args, evt_obj): dragonHeritage.MapToFeat("Dragon Disciple Heritage") dragonHeritage.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, selectHeritageRadial, ()) dragonHeritage.AddHook(ET_OnD20PythonActionPerform, selectHeritageId, setHeritage, ()) -dragonHeritage.AddHook(ET_OnD20PythonQuery, "PQ_Dragon_Disciple_Selected_Heritage", queryHeritageElementType, ()) +dragonHeritage.AddHook(ET_OnD20PythonQuery, "PQ_Dragon_Disciple_Selected_Heritage", querySelectedHeritage, ()) dragonHeritage.AddHook(ET_OnD20PythonQuery, "PQ_Dragon_Disciple_Element_Type", queryHeritageElementType, ()) dragonHeritage.AddHook(ET_OnD20PythonQuery, "PQ_Dragon_Disciple_Breath_Weapon_Type", queryHeritageBreathWeaponType, ()) dragonHeritage.AddHook(ET_OnConditionAdd, EK_NONE, initialHeritageValue, ()) ### AC Bonus -def NaturalArmorACBonus(attachee, args, evt_obj): +def naturalArmorACBonus(attachee, args, evt_obj): classLevel = attachee.stat_level_get(classEnum) if classLevel == 1: bonusValue = 1 @@ -205,7 +207,7 @@ def NaturalArmorACBonus(attachee, args, evt_obj): naturalArmorInc = PythonModifier("Dragon Disciple Natural Armor", 0) naturalArmorInc.MapToFeat("Dragon Disciple Natural Armor") -naturalArmorInc.AddHook(ET_OnGetAC, EK_NONE, NaturalArmorACBonus, ()) +naturalArmorInc.AddHook(ET_OnGetAC, EK_NONE, naturalArmorACBonus, ()) ### Ability Bonus #def OnGetAbilityScore(attachee, args, evt_obj): @@ -278,7 +280,7 @@ def breathWeaponRadial(attachee, args, evt_obj): breathWeaponShape = attachee.d20_query("PQ_Dragon_Disciple_Breath_Weapon_Type") spellEnum = spell_dragon_disciple_cone_breath if breathWeaponShape == 1 else spell_dragon_disciple_line_breath - breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon ({})".format(dragonColour), D20A_PYTHON_ACTION, breathWeaponEnum, 0, "TAG_INTERFACE_HELP") + breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon ({})".format(dragonColour), D20A_PYTHON_ACTION, breathWeaponEnum, 0, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON") spellData = tpdp.D20SpellData(spellEnum) casterLevel = attachee.stat_level_get(classEnum) spellData.set_spell_class(classEnum) @@ -328,7 +330,7 @@ def sleepParalyzeImmunity(attachee, args, evt_obj): 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)) + game.create_history_freeform("{} is immune to ~paralyze~[TAG_PARALYZED] effects\n\n".format(attachee.description)) return 0 def elementImmunity(attachee, args, evt_obj): From 809df430df67de21a9a004b76092329e3e7b58b2 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 21 Sep 2021 00:04:23 +0200 Subject: [PATCH 006/146] Fixed Cone Breath Weapon --- tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab | 2 +- .../rules/spell_enums/dragon_disciple_spell_enum.mes | 7 +++++++ .../scr/Spell3231 - Dragon Disciple Cone Breath.py | 7 +++++-- tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py | 6 +++--- 4 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/spell_enums/dragon_disciple_spell_enum.mes diff --git a/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab b/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab index 1f99cc3b1..4e379f813 100644 --- a/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab @@ -6,7 +6,7 @@ TAG_CLASS_FEATURES_DRAGON_DISCIPLES_HERITAGE TAG_DRAGON_DISCIPLE Dragon Discip 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_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. 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 (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. 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..e9f50e02a --- /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} + +{8231}{Dragon Disciple Cone Breath} + +{23231}{DRAGON_DISCIPLE_CONE_BREATH} diff --git a/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py b/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py index fa62e4562..a3a6707a1 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py +++ b/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py @@ -11,15 +11,18 @@ def OnSpellEffect(spell): targetsToRemove = [] spell.duration = 0 spell.dc = 10 + spell.caster_level + ((spell.caster.stat_level_get(stat_constitution)-10)/2) + print "Debug Dragon Disciple Cone Breath" print "Dragon Disciple Breath Weapon DC: {}".format(spell.dc) + print "Dragon Disciple Caster Level: {}".format(spell.caster_level) spellDamageDice = dice_new('1d8') if spell.caster_level < 7: spellDamageDice.number = 2 elif spell.caster_level < 10: - spellDamageDice = 4 + spellDamageDice.number = 4 else: - spellDamageDice = 6 + spellDamageDice.number = 6 + print "spellDamageDice: {}".format(spellDamageDice) saveType = D20_Save_Reduction_Half damageType = spell.caster.d20_query("PQ_Dragon_Disciple_Element_Type") print "Dragon Disciple Breath Weapon Element: {}".format(damageType) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 9b4b5aed8..e1192b60f 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -280,7 +280,7 @@ def breathWeaponRadial(attachee, args, evt_obj): breathWeaponShape = attachee.d20_query("PQ_Dragon_Disciple_Breath_Weapon_Type") spellEnum = spell_dragon_disciple_cone_breath if breathWeaponShape == 1 else spell_dragon_disciple_line_breath - breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon ({})".format(dragonColour), D20A_PYTHON_ACTION, breathWeaponEnum, 0, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON") + breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon ({})".format(dragonColour), D20A_PYTHON_ACTION, breathWeaponEnum, spellEnum, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON") spellData = tpdp.D20SpellData(spellEnum) casterLevel = attachee.stat_level_get(classEnum) spellData.set_spell_class(classEnum) @@ -295,10 +295,10 @@ def performBreathWeapon(attachee, args, evt_obj): newSpellId = tpactions.get_new_spell_id() spellPacket.caster_level = attachee.stat_level_get(classEnum) tpactions.register_spell_cast(spellPacket, newSpellId) - tpactions.trigger_spell_effect(evt_obj.d20a.spell_id) + #tpactions.trigger_spell_effect(evt_obj.d20a.spell_id) + tpactions.trigger_spell_effect(newSpellId) return 0 - def resetBreathWeapon(attachee, args, evt_obj): args.set_arg(0, 0) return 0 From 1ad5cfab9a9ab531fca6ca83c534969751cb02fc Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 21 Sep 2021 13:11:55 +0200 Subject: [PATCH 007/146] Further progress for the DD --- .../char_class/class023_dragon_disciple.py | 51 +++++++++++----- ...tion02302_dragon_disciple_breath_attack.py | 1 - .../rules/partsys/dragon_disciple_partsys.tab | 23 ++++---- .../3232 - Dragon Disciple Line Breath.txt | 15 +++++ ...Spell3232 - Dragon Disciple Line Breath.py | 59 +++++++++++++++++++ .../scr/tpModifiers/dragon_disciple.py | 26 +++++--- 6 files changed, 141 insertions(+), 34 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/spells/3232 - Dragon Disciple Line Breath.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py index 8491252cd..ef88b61b1 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py @@ -32,8 +32,6 @@ def GetClassHelpTopic(): 10: ("Dragon Disciple Dragon Apotheosis",) } -#bonus_feats = ["Dragon Disciple Heritage"] - 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(): @@ -107,16 +105,39 @@ def ObjMeetsPrereqs(obj): # Levelup -#def IsSelectingFeatsOnLevelup(obj): -# newLvl = obj.stat_level_get( classEnum ) + 1 -# if newLvl == 1: -# return 1 -# return 0 - -#def LevelupGetBonusFeats(obj): -#Lazy copy + paste from fighter; could be cleaned up as it is only one feat -# bonFeatInfo = [] -# for ft in bonus_feats: -# bonFeatInfo.append(char_editor.FeatInfo(ft)) -# char_editor.set_bonus_feats(bonFeatInfo) -# return + +def IsSelectingFeatsOnLevelup(obj): + return 0 + +def LevelupGetBonusFeats(obj): + return + +def IsSelectingSpellsOnLevelup( obj , class_extended_1 = 0): + if class_extended_1 <= 0: + class_extended_1 = char_class_utils.GetHighestArcaneClass(obj) + if char_editor.is_selecting_spells(obj, class_extended_1): + return 1 + return 0 + + +def LevelupCheckSpells(obj, class_extended_1 = 0): + if class_extended_1 <= 0: + class_extended_1 = char_class_utils.GetHighestArcaneClass(obj) + if not char_editor.spells_check_complete(obj, class_extended_1): + return 0 + return 1 + +def InitSpellSelection(obj , class_extended_1 = 0): + newLvl = obj.stat_level_get( classEnum ) + 1 + levelsWithoutNewSpells = [3, 7, 10] + if not newLvl in levelsWithoutNewSpells: + if class_extended_1 <= 0: + class_extended_1 = char_class_utils.GetHighestArcaneClass(obj) + char_editor.init_spell_selection(obj, class_extended_1) + return 0 + +def LevelupSpellsFinalize(obj , class_extended_1 = 0): + if class_extended_1 <= 0: + class_extended_1 = char_class_utils.GetHighestArcaneClass(obj) + char_editor.spells_finalize(obj, class_extended_1) + return 0 \ No newline at end of file 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 index 2e1f69de1..f210d80d9 100644 --- a/tpdatasrc/tpgamefiles/rules/d20_actions/action02302_dragon_disciple_breath_attack.py +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action02302_dragon_disciple_breath_attack.py @@ -20,7 +20,6 @@ def GetActionCostType(): def AddToSequence(d20action, action_seq, tb_status): - print "Dragon Disciple Breath Weapon Add to Sequence" if d20action.performer.d20_query(Q_Prone): d20aGetup = d20action d20aGetup.action_type = tpdp.D20ActionType.StandUp diff --git a/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab index 6df3d8f8c..582c0e166 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab @@ -1,12 +1,15 @@ -sp-Dragon Disciple Cone Breath 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?330 5?40 0 0 0?360 0 0 0,16,0 255 255 255 100 -sp-Dragon Disciple Cone Breath Acid 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-Dragon Disciple Cone Breath Acid 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath Cold 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-Dragon Disciple Cone Breath Cold 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-Dragon Disciple Cone Breath Electricity 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-Dragon Disciple Cone Breath Electricity 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-Dragon Disciple Cone Breath Electricity 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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,16,0 255 255 255 100 -sp-Dragon Disciple Cone Breath Fire 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-Dragon Disciple Cone Breath Fire 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Line Breath 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 0,5 30?600 5?40 0 0 0?360 0 0 0,16,0 0 255 144 100 +sp-Dragon Disciple Line Breath 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 0,5 0 0,600 20?60 0 0 0?720 0 0 0,255,0 0 255 144 20 +sp-Dragon Disciple Line Breath 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 0,5 0 0,600 0,10 0 0 0?720 0 0 0,255,0 0 255 144 30 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/Spell3232 - Dragon Disciple Line Breath.py b/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py new file mode 100644 index 000000000..291788edb --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py @@ -0,0 +1,59 @@ +from toee import * + +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 + damageType = spell.caster.d20_query("PQ_Dragon_Disciple_Element_Type") + #If different Breath Weapon Types get added (e.g. Sonic) add them here + if damageType == D20DT_ACID: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ACID + particleEffect = "sp-Dragon Disciple Line Breath Acid" + elif damageType == D20DT_COLD: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_COLD + particleEffect = "sp-Dragon Disciple Line Breath Cold" + elif damageType == D20DT_ELECTRICITY: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ELECTRICITY + particleEffect = "sp-Dragon Disciple Line Breath Electricity" + elif damageType == D20DT_FIRE: + saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_FIRE + particleEffect = "sp-Dragon Disciple Line Breath Fire" + else: #Fallback + saveDescriptor = D20STD_F_NONE + particleEffect = "sp-Dragon Disciple Line Breath Fire" + + spell.caster.turn_towards(spell.target_list[0].obj) + 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/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index e1192b60f..18a0fbe22 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -180,7 +180,7 @@ def initialHeritageValue(attachee, args, evt_obj): args.set_arg(0, 0) return 0 -dragonHeritage = PythonModifier("Dragon Disciple Heritage", 3) #arg0 = heritage +dragonHeritage = PythonModifier("Dragon Disciple Heritage", 3) #heritage, empty, empty dragonHeritage.MapToFeat("Dragon Disciple Heritage") dragonHeritage.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, selectHeritageRadial, ()) dragonHeritage.AddHook(ET_OnD20PythonActionPerform, selectHeritageId, setHeritage, ()) @@ -271,8 +271,8 @@ def onGetAbilityScoreCha(attachee, args, evt_obj): ### Breath Weapon def breathWeaponRadial(attachee, args, evt_obj): - if args.get_arg(0): - return 0 + chargesLeft = args.get_arg(0) + maxCharges = args.get_arg(1) #I display the heritage colour in the Breath Weapon Radial #So the player gets a visual feedback, which colour he did choose heritage = attachee.d20_query("PQ_Dragon_Disciple_Selected_Heritage") @@ -280,7 +280,7 @@ def breathWeaponRadial(attachee, args, evt_obj): breathWeaponShape = attachee.d20_query("PQ_Dragon_Disciple_Breath_Weapon_Type") spellEnum = spell_dragon_disciple_cone_breath if breathWeaponShape == 1 else spell_dragon_disciple_line_breath - breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon ({})".format(dragonColour), D20A_PYTHON_ACTION, breathWeaponEnum, spellEnum, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON") + breathWeaponId = tpdp.RadialMenuEntryPythonAction("{} Breath Weapon {}/{}".format(dragonColour, chargesLeft, maxCharges), D20A_PYTHON_ACTION, breathWeaponEnum, spellEnum, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON") spellData = tpdp.D20SpellData(spellEnum) casterLevel = attachee.stat_level_get(classEnum) spellData.set_spell_class(classEnum) @@ -289,23 +289,33 @@ def breathWeaponRadial(attachee, args, evt_obj): breathWeaponId.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) return 0 +def chargesCheckBreathWeapon(attachee, args, evt_obj): + if args.get_arg(0) < 1: + evt_obj.return_val = AEC_OUT_OF_CHARGES + return 0 + def performBreathWeapon(attachee, args, evt_obj): + chargesLeft = args.get_arg(0) 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) - #tpactions.trigger_spell_effect(evt_obj.d20a.spell_id) tpactions.trigger_spell_effect(newSpellId) + chargesLeft -= 1 + args.set_arg(0, chargesLeft) return 0 def resetBreathWeapon(attachee, args, evt_obj): - args.set_arg(0, 0) + maxCharges = 1 + args.set_arg(0, maxCharges) + args.set_arg(1, maxCharges) return 0 -dragonDiscipleBreathWeapon = PythonModifier("Dragon Disciple Breath Weapon", 3) #arg0 = used this day +dragonDiscipleBreathWeapon = PythonModifier("Dragon Disciple Breath Weapon", 3) #chargesLeft, maxCharges, empty dragonDiscipleBreathWeapon.MapToFeat("Dragon Disciple Breath Weapon") dragonDiscipleBreathWeapon.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, breathWeaponRadial, ()) +dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionCheck, breathWeaponEnum, chargesCheckBreathWeapon, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionPerform, breathWeaponEnum, performBreathWeapon, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnConditionAdd, EK_NONE, resetBreathWeapon, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnNewDay, EK_NEWDAY_REST, resetBreathWeapon, ()) @@ -339,7 +349,7 @@ def elementImmunity(attachee, args, evt_obj): evt_obj.damage_packet.add_mod_factor(0.0, elementType, damageMesLine) return 0 -dragonDiscipleApotheosis = PythonModifier("Dragon Disciple Dragon Apotheosis", 3) +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, ()) From 6e4d1e02056c472a1dc23486018bc5663b1fa964 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 22 Sep 2021 12:16:48 +0200 Subject: [PATCH 008/146] Finished help file for DD --- .../mes/help/dragon_disciple_help.tab | 10 +- .../char_class/class023_dragon_disciple.py | 30 +--- .../rules/feats/dragon disciple wings.txt | 5 + .../rules/partsys/dragon_disciple_partsys.tab | 15 +- ...Spell3232 - Dragon Disciple Line Breath.py | 1 - .../scr/tpModifiers/dragon_disciple.py | 159 ++++++++++-------- 6 files changed, 109 insertions(+), 111 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple wings.txt diff --git a/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab b/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab index 4e379f813..465a4ffdc 100644 --- a/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab @@ -1,12 +1,12 @@ -TAG_DRAGON_DISCIPLE TAG_PRESTIGE_CLASSES Dragon Disciple Dragon Disciple Short Description - TBD!. 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 - TBD! 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_DRAGON_DISCIPLES_SPELLS_PER_DAY TAG_DRAGON_DISCIPLE Dragon Disciple Bonus Spells - TBD! 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_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 variety when taking the first level in this prestige class. TBD! +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. 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 (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. +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. diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py index ef88b61b1..6456d13bc 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py @@ -29,6 +29,7 @@ def GetClassHelpTopic(): 2: ("Dragon Disciple Claws and Bite",), 3: ("Dragon Disciple Breath Weapon",), 5: ("Dragon Disciple Blindsense",), +9: ("Dragon Disciple Wings",), 10: ("Dragon Disciple Dragon Apotheosis",) } @@ -112,32 +113,3 @@ def IsSelectingFeatsOnLevelup(obj): def LevelupGetBonusFeats(obj): return -def IsSelectingSpellsOnLevelup( obj , class_extended_1 = 0): - if class_extended_1 <= 0: - class_extended_1 = char_class_utils.GetHighestArcaneClass(obj) - if char_editor.is_selecting_spells(obj, class_extended_1): - return 1 - return 0 - - -def LevelupCheckSpells(obj, class_extended_1 = 0): - if class_extended_1 <= 0: - class_extended_1 = char_class_utils.GetHighestArcaneClass(obj) - if not char_editor.spells_check_complete(obj, class_extended_1): - return 0 - return 1 - -def InitSpellSelection(obj , class_extended_1 = 0): - newLvl = obj.stat_level_get( classEnum ) + 1 - levelsWithoutNewSpells = [3, 7, 10] - if not newLvl in levelsWithoutNewSpells: - if class_extended_1 <= 0: - class_extended_1 = char_class_utils.GetHighestArcaneClass(obj) - char_editor.init_spell_selection(obj, class_extended_1) - return 0 - -def LevelupSpellsFinalize(obj , class_extended_1 = 0): - if class_extended_1 <= 0: - class_extended_1 = char_class_utils.GetHighestArcaneClass(obj) - char_editor.spells_finalize(obj, class_extended_1) - return 0 \ 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/partsys/dragon_disciple_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab index 582c0e166..8279f26f3 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab @@ -10,6 +10,15 @@ sp-Dragon Disciple Cone Breath Electricity water droplets 15 30 30 Object YPR sp-Dragon Disciple Cone Breath 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,16,0 255 255 255 100 sp-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Line Breath 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 0,5 30?600 5?40 0 0 0?360 0 0 0,16,0 0 255 144 100 -sp-Dragon Disciple Line Breath 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 0,5 0 0,600 20?60 0 0 0?720 0 0 0,255,0 0 255 144 20 -sp-Dragon Disciple Line Breath 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 0,5 0 0,600 0,10 0 0 0?720 0 0 0,255,0 0 255 144 30 +sp-Dragon Disciple Line Breath 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 0?5 30?600 5?40 0 0 0?360 0 0 0,16,0 0 255 144 100 +sp-Dragon Disciple Line Breath 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 0?5 0 0,600 20?60 0 0 0?720 0 0 0,255,0 0 255 144 20 +sp-Dragon Disciple Line Breath 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 0?5 0 0,600 0,10 0 0 0?720 0 0 0,255,0 0 255 144 30 +sp-Dragon Disciple Line Breath 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 0?5 30?330 5?40 0 0 0?360 0 0 0,16,0 255 255 255 100 +sp-Dragon Disciple Line Breath 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 0?5 0 0,360 20?60 0 0 0?720 0 0 0 0 128 255 20 +sp-Dragon Disciple Line Breath 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 0?5 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-Dragon Disciple Line Breath 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 0?5 0 0,360 20?60 0 0 0?720 0 0 0 0 128 255 20 +sp-Dragon Disciple Line Breath 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 0?5 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-Dragon Disciple Line Breath 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 0?5 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-Dragon Disciple Line Breath 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 0?5 30?330 5?40 0 0 0?360 0 0 0,16,0 255 255 255 100 +sp-Dragon Disciple Line Breath 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 0?5 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-Dragon Disciple Line Breath 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 0?5 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/scr/Spell3232 - Dragon Disciple Line Breath.py b/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py index 291788edb..ed892ab77 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py +++ b/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py @@ -38,7 +38,6 @@ def OnSpellEffect(spell): saveDescriptor = D20STD_F_NONE particleEffect = "sp-Dragon Disciple Line Breath Fire" - spell.caster.turn_towards(spell.target_list[0].obj) game.particles(particleEffect, spell.caster) for spellTarget in spell.target_list: diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 18a0fbe22..424ab8470 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -69,78 +69,6 @@ def OnGetSaveThrowWill(attachee, args, evt_obj): classSpecObj.AddHook(ET_OnSaveThrowLevel, EK_SAVE_REFLEX, OnGetSaveThrowReflex, ()) classSpecObj.AddHook(ET_OnSaveThrowLevel, EK_SAVE_WILL, OnGetSaveThrowWill, ()) - -#region 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 - -# 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) - 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) - 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) - 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 - ##### Dragon Disciple Class Features ##### ###Handle Heritage @@ -158,6 +86,9 @@ def setHeritage(attachee, args, evt_obj): chosenHeritage = evt_obj.d20a.data1 print "Selected Heritage: {}".format(chosenHeritage) args.set_arg(0, chosenHeritage) + #Visual Feedback for selected Heritage + heritageColour = dictDragonHeritage[chosenHeritage][0] + attachee.float_text_line("{} Heritage chosen".format(heritageColour)) return 0 def querySelectedHeritage(attachee, args, evt_obj): @@ -324,12 +255,22 @@ def resetBreathWeapon(attachee, args, evt_obj): ### Blindsense #TBD +###Wings +def addWings(attachee, args, evt_obj): + #meshId = + #evt_obj.append(meshId) + return 0 + +dragonDiscipleWings = PythonModifier("Dragon Disciple Dragon Wings", 3) #empty, empty, empty +dragonDiscipleWings.MapToFeat("Dragon Disciple Dragon Wings") +dragonDiscipleWings.AddHook(ET_OnAddMesh, EK_NONE, addWings, ()) + + #### 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 @@ -353,3 +294,75 @@ def elementImmunity(attachee, args, evt_obj): dragonDiscipleApotheosis.MapToFeat("Dragon Disciple Dragon Apotheosis") dragonDiscipleApotheosis.AddHook(ET_OnConditionAddPre, EK_NONE, sleepParalyzeImmunity, ()) dragonDiscipleApotheosis.AddHook(ET_OnTakingDamage2, EK_NONE, elementImmunity, ()) + + +#region 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 + +# 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) + 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) + 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) + 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 \ No newline at end of file From 7fcad2c2abf27d9218b897e0f3aea817769e1d36 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 23 Sep 2021 10:00:11 +0200 Subject: [PATCH 009/146] DD: Dropped Blindsense, fixed fire smoke --- .../mes/help/dragon_disciple_help.tab | 4 +-- .../dragon_disciple_breath_weapons.mes | 1 + .../char_class/class023_dragon_disciple.py | 1 - ...tion02302_dragon_disciple_breath_attack.py | 2 +- .../feats/dragon disciple blindsense.txt | 7 ----- .../rules/partsys/dragon_disciple_partsys.tab | 26 +++++++++---------- .../dragon_disciple_spell_enum.mes | 3 +++ .../scr/tpModifiers/dragon_disciple.py | 20 +++++++++++--- 8 files changed, 36 insertions(+), 28 deletions(-) delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple blindsense.txt diff --git a/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab b/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab index 465a4ffdc..0a420c2e6 100644 --- a/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab @@ -7,6 +7,6 @@ TAG_CLASS_FEATURES_DRAGON_DISCIPLES_NATURAL_ARMOR_INCREASE TAG_DRAGON_DISCIPLE 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. +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. +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/spell_ext/dragon_disciple_breath_weapons.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/dragon_disciple_breath_weapons.mes index 994e549be..da1c584ea 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/dragon_disciple_breath_weapons.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/dragon_disciple_breath_weapons.mes @@ -1 +1,2 @@ {3231} {Dragon Disciple Cone Breath} +{3232} {Dragon Disciple Line Breath} diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py index 6456d13bc..927d1e561 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py @@ -28,7 +28,6 @@ def GetClassHelpTopic(): 1: ("Dragon Disciple Heritage", "Dragon Disciple Natural Armor",), 2: ("Dragon Disciple Claws and Bite",), 3: ("Dragon Disciple Breath Weapon",), -5: ("Dragon Disciple Blindsense",), 9: ("Dragon Disciple Wings",), 10: ("Dragon Disciple Dragon Apotheosis",) } 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 index f210d80d9..5c099a95a 100644 --- a/tpdatasrc/tpgamefiles/rules/d20_actions/action02302_dragon_disciple_breath_attack.py +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action02302_dragon_disciple_breath_attack.py @@ -8,7 +8,7 @@ def GetActionName(): def GetActionDefinitionFlags(): - return D20ADF_MagicEffectTargeting | D20ADF_QueryForAoO + return D20ADF_MagicEffectTargeting | D20ADF_QueryForAoO | D20ADF_TriggersCombat def GetTargetingClassification(): diff --git a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple blindsense.txt b/tpdatasrc/tpgamefiles/rules/feats/dragon disciple blindsense.txt deleted file mode 100644 index 4064a60db..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/dragon disciple blindsense.txt +++ /dev/null @@ -1,7 +0,0 @@ -name: Dragon Disciple Blindsense -flags: 8 -prereqs: -description: 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. -prereq descr: Dragon Disciple level 5. \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab index 8279f26f3..32788c940 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab @@ -7,18 +7,18 @@ sp-Dragon Disciple Cone Breath Cold fire strike 3 sparklies 30 50 Object YPR sp-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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,16,0 255 255 255 100 +sp-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Line Breath 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 0?5 30?600 5?40 0 0 0?360 0 0 0,16,0 0 255 144 100 -sp-Dragon Disciple Line Breath 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 0?5 0 0,600 20?60 0 0 0?720 0 0 0,255,0 0 255 144 20 -sp-Dragon Disciple Line Breath 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 0?5 0 0,600 0,10 0 0 0?720 0 0 0,255,0 0 255 144 30 -sp-Dragon Disciple Line Breath 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 0?5 30?330 5?40 0 0 0?360 0 0 0,16,0 255 255 255 100 -sp-Dragon Disciple Line Breath 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 0?5 0 0,360 20?60 0 0 0?720 0 0 0 0 128 255 20 -sp-Dragon Disciple Line Breath 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 0?5 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-Dragon Disciple Line Breath 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 0?5 0 0,360 20?60 0 0 0?720 0 0 0 0 128 255 20 -sp-Dragon Disciple Line Breath 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 0?5 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-Dragon Disciple Line Breath 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 0?5 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-Dragon Disciple Line Breath 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 0?5 30?330 5?40 0 0 0?360 0 0 0,16,0 255 255 255 100 -sp-Dragon Disciple Line Breath 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 0?5 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-Dragon Disciple Line Breath 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 0?5 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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/spell_enums/dragon_disciple_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/dragon_disciple_spell_enum.mes index e9f50e02a..0780f3878 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/dragon_disciple_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/dragon_disciple_spell_enum.mes @@ -1,7 +1,10 @@ // Dragon Disciple Breath Weapons {3231}{Dragon Disciple Cone Breath} +{3232}{Dragon Disciple Line Breath} {8231}{Dragon Disciple Cone Breath} +{8232}{Dragon Disciple Line Breath} {23231}{DRAGON_DISCIPLE_CONE_BREATH} +{23232}{DRAGON_DISCIPLE_LINE_BREATH} diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 424ab8470..1a16f0c99 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -220,19 +220,30 @@ def breathWeaponRadial(attachee, args, evt_obj): breathWeaponId.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) return 0 -def chargesCheckBreathWeapon(attachee, args, evt_obj): +def checkBreathWeapon(attachee, args, evt_obj): if args.get_arg(0) < 1: evt_obj.return_val = AEC_OUT_OF_CHARGES return 0 def performBreathWeapon(attachee, args, evt_obj): - chargesLeft = args.get_arg(0) + target = evt_obj.d20a.target + #attachee.turn_towards(target) + if attachee.anim_goal_push_attack(target, 0, 0 ,0): + 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): 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) tpactions.trigger_spell_effect(newSpellId) + + #Reduce Breath Weapon Daily uses by 1 + chargesLeft = args.get_arg(0) chargesLeft -= 1 args.set_arg(0, chargesLeft) return 0 @@ -246,14 +257,15 @@ def resetBreathWeapon(attachee, args, evt_obj): dragonDiscipleBreathWeapon = PythonModifier("Dragon Disciple Breath Weapon", 3) #chargesLeft, maxCharges, empty dragonDiscipleBreathWeapon.MapToFeat("Dragon Disciple Breath Weapon") dragonDiscipleBreathWeapon.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, breathWeaponRadial, ()) -dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionCheck, breathWeaponEnum, chargesCheckBreathWeapon, ()) +dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionCheck, breathWeaponEnum, checkBreathWeapon, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionPerform, breathWeaponEnum, performBreathWeapon, ()) +dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionPerform, breathWeaponEnum, frameBreathWeapon, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnConditionAdd, EK_NONE, resetBreathWeapon, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnNewDay, EK_NEWDAY_REST, resetBreathWeapon, ()) ### Blindsense -#TBD +#dropped ###Wings def addWings(attachee, args, evt_obj): From d02b5fb86d8fd51a9a8b751aa0511a54cec39be6 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 30 Sep 2021 12:54:55 +0200 Subject: [PATCH 010/146] Added Flying Toggle (Nonfunctional yet) --- .../action02303_dragon_disciple_toogle_fly.py | 18 +++++++ .../scr/tpModifiers/dragon_disciple.py | 51 +++++++++++++++++-- 2 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action02303_dragon_disciple_toogle_fly.py 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/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 1a16f0c99..18338df30 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -19,6 +19,7 @@ def GetSpellCasterConditionName(): selectHeritageId = 2301 breathWeaponEnum = 2302 +toggleFlyingId = 2303 #Dict to handle Dragon Disciple Heritage #Can easily be expanded by adding a new type of heritage to the dict @@ -223,7 +224,7 @@ def breathWeaponRadial(attachee, args, evt_obj): def checkBreathWeapon(attachee, args, evt_obj): if args.get_arg(0) < 1: evt_obj.return_val = AEC_OUT_OF_CHARGES - return 0 + return 0 def performBreathWeapon(attachee, args, evt_obj): target = evt_obj.d20a.target @@ -259,7 +260,7 @@ def resetBreathWeapon(attachee, args, evt_obj): dragonDiscipleBreathWeapon.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, breathWeaponRadial, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionCheck, breathWeaponEnum, checkBreathWeapon, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionPerform, breathWeaponEnum, performBreathWeapon, ()) -dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionPerform, breathWeaponEnum, frameBreathWeapon, ()) +dragonDiscipleBreathWeapon.AddHook(ET_OnD20PythonActionFrame, breathWeaponEnum, frameBreathWeapon, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnConditionAdd, EK_NONE, resetBreathWeapon, ()) dragonDiscipleBreathWeapon.AddHook(ET_OnNewDay, EK_NEWDAY_REST, resetBreathWeapon, ()) @@ -273,9 +274,51 @@ def addWings(attachee, args, evt_obj): #evt_obj.append(meshId) return 0 -dragonDiscipleWings = PythonModifier("Dragon Disciple Dragon Wings", 3) #empty, empty, empty -dragonDiscipleWings.MapToFeat("Dragon Disciple Dragon Wings") +def wingsRadial(attachee, args, evt_obj): + print "Debug Dragon Disciple wingsRadial Hook" + actionString = "Land" if args.get_arg(0) else "Fly" + 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): + args.set_arg(0, 0) + 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 = args.get_arg(0) + if isFlying: + args.set_arg(0, 0) + attachee.float_text_line("No longer Flying") + else: + args.set_arg(0, 1) + attachee.float_text_line("Flying") + return 0 + +def queryIsFlying(attachee, args, evt_obj): + evt_obj.return_val = 1 if args.get_arg(0) else 0 + return 0 + +def tooltipFyling(attachee, args, evt_obj): + evt_obj.append("Flying!") + return 0 + +dragonDiscipleWings = PythonModifier("Dragon Disciple Dragon Wings", 3) #isFlying, 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_OnGetTooltip, EK_NONE, tooltipFyling, ()) +dragonDiscipleWings.AddHook(ET_OnConditionAdd, EK_NONE, resetWings, ()) +dragonDiscipleWings.AddHook(ET_OnNewDay, EK_NEWDAY_REST, resetWings, ()) +dragonDiscipleWings.AddHook(ET_OnD20Signal, EK_S_Teleport_Reconnect, resetWings, ()) +dragonDiscipleWings.AddHook(ET_OnD20PythonQuery, "PQ_IS_FLYING", queryIsFlying, ()) #### Dragon Apotheosis From e641ab5dc87cc68db49cbc3965e2b3d11504fc07 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 1 Oct 2021 12:16:00 +0200 Subject: [PATCH 011/146] Moved Flying to seperate condtion --- .../scr/tpModifiers/dragon_disciple.py | 26 +++--------- .../scr/tpModifiers/flying_condition.py | 41 +++++++++++++++++++ 2 files changed, 47 insertions(+), 20 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/flying_condition.py diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 18338df30..abcef92f6 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -275,14 +275,13 @@ def addWings(attachee, args, evt_obj): return 0 def wingsRadial(attachee, args, evt_obj): - print "Debug Dragon Disciple wingsRadial Hook" - actionString = "Land" if args.get_arg(0) else "Fly" + 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): - args.set_arg(0, 0) + attachee.d20_signal("PS_Flying_End") return 0 def checkWingsIndoors(attachee, args, evt_obj): @@ -291,34 +290,21 @@ def checkWingsIndoors(attachee, args, evt_obj): return 0 def toggleWings(attachee, args, evt_obj): - isFlying = args.get_arg(0) + isFlying = attachee.d20_query("PQ_Is_Flying") if isFlying: - args.set_arg(0, 0) - attachee.float_text_line("No longer Flying") + attachee.d20_send_signal("PS_Flying_End") else: - args.set_arg(0, 1) - attachee.float_text_line("Flying") - return 0 - -def queryIsFlying(attachee, args, evt_obj): - evt_obj.return_val = 1 if args.get_arg(0) else 0 - return 0 - -def tooltipFyling(attachee, args, evt_obj): - evt_obj.append("Flying!") + attachee.condition_add_with_args("Flying Condition", 0, 0, 0) return 0 -dragonDiscipleWings = PythonModifier("Dragon Disciple Dragon Wings", 3) #isFlying, empty, empty +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_OnGetTooltip, EK_NONE, tooltipFyling, ()) -dragonDiscipleWings.AddHook(ET_OnConditionAdd, EK_NONE, resetWings, ()) dragonDiscipleWings.AddHook(ET_OnNewDay, EK_NEWDAY_REST, resetWings, ()) dragonDiscipleWings.AddHook(ET_OnD20Signal, EK_S_Teleport_Reconnect, resetWings, ()) -dragonDiscipleWings.AddHook(ET_OnD20PythonQuery, "PQ_IS_FLYING", queryIsFlying, ()) #### Dragon Apotheosis diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/flying_condition.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/flying_condition.py new file mode 100644 index 000000000..c5972cb0c --- /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 singalStopFlying(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", singalStopFlying, ()) From 2ebb5a7b7f579720abb7dd35bfe3e8c169c5338b Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 14 Oct 2021 10:08:30 +0200 Subject: [PATCH 012/146] added Darley Wings Mesh as Wings for the DD --- tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py | 4 ++-- tpdatasrc/tpgamefiles/scr/tpModifiers/flying_condition.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index abcef92f6..5f6d25e33 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -270,8 +270,8 @@ def resetBreathWeapon(attachee, args, evt_obj): ###Wings def addWings(attachee, args, evt_obj): - #meshId = - #evt_obj.append(meshId) + meshId = 14201 #Darley Wings + evt_obj.append(meshId) return 0 def wingsRadial(attachee, args, evt_obj): diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/flying_condition.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/flying_condition.py index c5972cb0c..3d9e9e10b 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/flying_condition.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/flying_condition.py @@ -29,7 +29,7 @@ def tooltipFlying(attachee, args, evt_obj): evt_obj.append("Flying!") return 0 -def singalStopFlying(attachee, args, evt_obj): +def signalStopFlying(attachee, args, evt_obj): args.condition_remove() return 0 @@ -38,4 +38,4 @@ def singalStopFlying(attachee, args, evt_obj): 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", singalStopFlying, ()) +flyingCondition.AddHook(ET_OnD20PythonSignal, "PS_Flying_End", signalStopFlying, ()) From 7ec38eeadcf95a7c2e62dcf0127878924fbff3a0 Mon Sep 17 00:00:00 2001 From: DudeMcDude Date: Mon, 22 Nov 2021 08:37:59 +0200 Subject: [PATCH 013/146] String fixes: DD requirements fit inside scroll box; feat descrition replaced weird inverted comma --- tpdatasrc/tpgamefiles/mes/stat_ext.mes | 3 +-- .../tpgamefiles/rules/feats/dragon disciple natural armor.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tpdatasrc/tpgamefiles/mes/stat_ext.mes b/tpdatasrc/tpgamefiles/mes/stat_ext.mes index 71e43bbf3..2fbd9e916 100644 --- a/tpdatasrc/tpgamefiles/mes/stat_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/stat_ext.mes @@ -233,8 +233,7 @@ Feats: Cleave, Power Attack {13016}Dragon Disciple{A descendant of dragonkind who uses their innate magical power as a catalyst to ignite their dragon blood. -Requirements: -Level: 5 +Requirements: Level: 5 Spellcasting: Ability to cast arcane spells without preparation.} 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 From b085be23d0a0f29ab2ec2e3f4a471ee53a1fbe4c Mon Sep 17 00:00:00 2001 From: DudeMcDude Date: Mon, 22 Nov 2021 08:39:18 +0200 Subject: [PATCH 014/146] Added PyObjHndl method anim_goal_throw_spell_w_cast_anim to properly handle casting animations from non-spell cast actions get_cur_seq() will now return a reference rather than a copy --- .../python/python_integration_d20_action.cpp | 6 +++--- TemplePlus/python/python_object.cpp | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) 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_object.cpp b/TemplePlus/python/python_object.cpp index c824242d9..9ae4ce07e 100644 --- a/TemplePlus/python/python_object.cpp +++ b/TemplePlus/python/python_object.cpp @@ -2797,6 +2797,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) { @@ -4342,6 +4360,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 }, From 9696b90a999e18c02e8a4ddd23b066b21ab2602c Mon Sep 17 00:00:00 2001 From: DudeMcDude Date: Mon, 22 Nov 2021 08:45:31 +0200 Subject: [PATCH 015/146] DD fixes Breath weapon --- .../scr/tpModifiers/dragon_disciple.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 5f6d25e33..320ecd29e 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -227,22 +227,20 @@ def checkBreathWeapon(attachee, args, evt_obj): return 0 def performBreathWeapon(attachee, args, evt_obj): - target = evt_obj.d20a.target - #attachee.turn_towards(target) - if attachee.anim_goal_push_attack(target, 0, 0 ,0): - 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): 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) - tpactions.trigger_spell_effect(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): #Reduce Breath Weapon Daily uses by 1 chargesLeft = args.get_arg(0) chargesLeft -= 1 From 1aabeb197f253b690a67e5c490eb5adb6c0a40c6 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 23 Nov 2021 12:26:04 +0100 Subject: [PATCH 016/146] Update to DD Draconic Heritage Handling --- .../mes/help/breath_weapon_feats_help.tab | 2 + .../char_class/class023_dragon_disciple.py | 29 ++- ...on02301_dragon_disciple_select_heritage.py | 18 -- .../rules/feats/draconic heritage black.txt | 6 + .../rules/feats/draconic heritage blue.txt | 6 + .../rules/feats/draconic heritage brass.txt | 6 + .../rules/feats/draconic heritage bronze.txt | 6 + .../rules/feats/draconic heritage copper.txt | 6 + .../rules/feats/draconic heritage gold.txt | 6 + .../rules/feats/draconic heritage green.txt | 6 + .../rules/feats/draconic heritage red.txt | 6 + .../rules/feats/draconic heritage silver.txt | 6 + .../rules/feats/draconic heritage white.txt | 6 + .../rules/feats/draconic heritage.txt | 5 + .../rules/feats/extra exhalation.txt | 5 + .../scr/feats/feat - Draconic Heritage.py | 11 ++ .../scr/feats/feat - Extra Exhalation.py | 10 + .../tpgamefiles/scr/heritage_feat_utils.py | 174 ++++++++++++++++++ .../scr/tpModifiers/breath_weapon.py | 80 ++++++++ .../scr/tpModifiers/dragon_disciple.py | 158 +++++----------- 20 files changed, 419 insertions(+), 133 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/mes/help/breath_weapon_feats_help.tab delete mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action02301_dragon_disciple_select_heritage.py create mode 100644 tpdatasrc/tpgamefiles/rules/feats/draconic heritage black.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/draconic heritage blue.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/draconic heritage brass.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/draconic heritage bronze.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/draconic heritage copper.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/draconic heritage gold.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/draconic heritage green.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/draconic heritage red.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/draconic heritage silver.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/draconic heritage white.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/draconic heritage.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/extra exhalation.txt create mode 100644 tpdatasrc/tpgamefiles/scr/feats/feat - Draconic Heritage.py create mode 100644 tpdatasrc/tpgamefiles/scr/feats/feat - Extra Exhalation.py create mode 100644 tpdatasrc/tpgamefiles/scr/heritage_feat_utils.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/breath_weapon.py 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/rules/char_class/class023_dragon_disciple.py b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py index 927d1e561..250625203 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py @@ -1,6 +1,7 @@ from toee import * import char_class_utils import char_editor +from heritage_feat_utils import getDraconicHeritageColourString ################################################### @@ -25,7 +26,7 @@ def GetClassHelpTopic(): class_feats = { -1: ("Dragon Disciple Heritage", "Dragon Disciple Natural Armor",), +1: ("Dragon Disciple Natural Armor",), 2: ("Dragon Disciple Claws and Bite",), 3: ("Dragon Disciple Breath Weapon",), 9: ("Dragon Disciple Wings",), @@ -105,10 +106,34 @@ def ObjMeetsPrereqs(obj): # 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): - return 0 + newLvl = char_editor.stat_level_get(classEnum) + if not newLvl == 1: + return 0 + if alreadyHasDraconicHeritage(obj): + return 0 + return 1 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/d20_actions/action02301_dragon_disciple_select_heritage.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action02301_dragon_disciple_select_heritage.py deleted file mode 100644 index 08ad3c207..000000000 --- a/tpdatasrc/tpgamefiles/rules/d20_actions/action02301_dragon_disciple_select_heritage.py +++ /dev/null @@ -1,18 +0,0 @@ -from toee import * -import tpactions - -def GetActionName(): - return "Dragon Disciple Select Heritage" - -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/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/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/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/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/tpModifiers/breath_weapon.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/breath_weapon.py new file mode 100644 index 000000000..648377c3a --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/breath_weapon.py @@ -0,0 +1,80 @@ +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) + breathWeaponCharges = args.get_param(1) + cooldown = 0 + args.set_arg(0, breathWeaponId) + args.set_arg(1, breathWeaponCharges) + args.set_arg(2, cooldown) + args.set_arg(3, 0) + args.set_arg(4, 0) + return 0 + +# Handle Breath Weapon Charges +def addExtraExhalationCharges(attachee): + extraBreathExhalation = attachee.has_feat("Extra Exhalation") + return extraBreathExhalation + +def getMaxCharges(attachee): + maxCharges = 1 + addExtraExhalationCharges(attachee) + return maxCharges + +def resetBreathWeaponUses(attachee, args, evt_obj): + if not args.get_arg(1) == -1: + maxCharges = getMaxCharges(attachee) + 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: + breathWeaponCharges = args.get_arg(1) + if not breathWeaponCharges == 1: + cooldown = getBreathWeaponCoolDown() + args.set_arg(2, cooldown) + if not breathWeaponCharges == -1: + breathWeaponCharges -= 1 + args.set_arg(1, breathWeaponCharges) + return 0 + +class BreathWeaponModifier(PythonModifier): + # Breath Weapon modifiers have 5 arguments: + # 0: breathWeaponId, 1: charges, 2: Cooldown, 3: empty, 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, ()) + + # This hook needs to be added for every BreathWeaponModifier + def breathWeaponSetArgs(self, breathWeaponId, breathWeaponCharges): + self.AddHook(ET_OnConditionAdd, EK_NONE, breathWeaponOnConditionAdd, (breathWeaponId, breathWeaponCharges,)) + diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 320ecd29e..a83b6f6d4 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -3,6 +3,8 @@ import tpdp import tpactions import char_class_utils +import heritage_feat_utils +import breath_weapon ################################################### @@ -17,27 +19,9 @@ def GetSpellCasterConditionName(): classEnum = stat_level_dragon_disciple classSpecModule = __import__('class023_dragon_disciple') -selectHeritageId = 2301 breathWeaponEnum = 2302 toggleFlyingId = 2303 -#Dict to handle Dragon Disciple Heritage -#Can easily be expanded by adding a new type of heritage to the dict -#[Colour, ElementType, Breath Weapon Shape (1 = Cone, 2 = Line)] -#If a new element type would be added e.g. sonic or negative, -#this also would be needed to add in both spells and in the partsys -dictDragonHeritage = { -1: ["Black", D20DT_ACID, 2], -2: ["Blue", D20DT_ELECTRICITY, 2], -3: ["Green", D20DT_ACID, 1], -4: ["Red", D20DT_FIRE, 1], -5: ["White", D20DT_COLD, 1], -6: ["Brass", D20DT_FIRE, 2], -7: ["Bronze", D20DT_ELECTRICITY, 2], -8: ["Copper", D20DT_ACID, 2], -9: ["Gold", D20DT_FIRE, 1], -10: ["Silver", D20DT_COLD, 1] -} ################################################### @@ -72,55 +56,7 @@ def OnGetSaveThrowWill(attachee, args, evt_obj): ##### Dragon Disciple Class Features ##### -###Handle Heritage -def selectHeritageRadial(attachee, args, evt_obj): - if not args.get_arg(0): - radialSelectHeritageParent = tpdp.RadialMenuEntryParent("Select Dragon Disciple Heritage") - radialSelectHeritageParentId = radialSelectHeritageParent.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Class) - for key in dictDragonHeritage.keys(): - dragonColour = dictDragonHeritage[key][0] - radialHeritageColourId = tpdp.RadialMenuEntryPythonAction("{} Dragon Heritage".format(dragonColour), D20A_PYTHON_ACTION, selectHeritageId, key, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_HERITAGE") - radialHeritageColourId.add_as_child(attachee, radialSelectHeritageParentId) - return 0 - -def setHeritage(attachee, args, evt_obj): - chosenHeritage = evt_obj.d20a.data1 - print "Selected Heritage: {}".format(chosenHeritage) - args.set_arg(0, chosenHeritage) - #Visual Feedback for selected Heritage - heritageColour = dictDragonHeritage[chosenHeritage][0] - attachee.float_text_line("{} Heritage chosen".format(heritageColour)) - return 0 - -def querySelectedHeritage(attachee, args, evt_obj): - heritage = args.get_arg(0) - evt_obj.return_val = heritage - return 0 - -def queryHeritageElementType(attachee, args, evt_obj): - heritage = args.get_arg(0) - elementType = dictDragonHeritage[heritage][1] - evt_obj.return_val = elementType - return 0 - -def queryHeritageBreathWeaponType(attachee, args, evt_obj): - heritage = args.get_arg(0) - evt_obj.return_val = dictDragonHeritage[heritage][2] - return 0 - -def initialHeritageValue(attachee, args, evt_obj): - args.set_arg(0, 0) - return 0 - -dragonHeritage = PythonModifier("Dragon Disciple Heritage", 3) #heritage, empty, empty -dragonHeritage.MapToFeat("Dragon Disciple Heritage") -dragonHeritage.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, selectHeritageRadial, ()) -dragonHeritage.AddHook(ET_OnD20PythonActionPerform, selectHeritageId, setHeritage, ()) -dragonHeritage.AddHook(ET_OnD20PythonQuery, "PQ_Dragon_Disciple_Selected_Heritage", querySelectedHeritage, ()) -dragonHeritage.AddHook(ET_OnD20PythonQuery, "PQ_Dragon_Disciple_Element_Type", queryHeritageElementType, ()) -dragonHeritage.AddHook(ET_OnD20PythonQuery, "PQ_Dragon_Disciple_Breath_Weapon_Type", queryHeritageBreathWeaponType, ()) -dragonHeritage.AddHook(ET_OnConditionAdd, EK_NONE, initialHeritageValue, ()) - +### Draconic Heritage is handle by the Draconic Heritage Feat now ### AC Bonus def naturalArmorACBonus(attachee, args, evt_obj): @@ -141,21 +77,6 @@ def naturalArmorACBonus(attachee, args, evt_obj): naturalArmorInc.MapToFeat("Dragon Disciple Natural Armor") naturalArmorInc.AddHook(ET_OnGetAC, EK_NONE, naturalArmorACBonus, ()) -### Ability Bonus -#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) -# return 0 - -#classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_STRENGTH, OnGetAbilityScore, ()) - - def onGetAbilityScoreStr(attachee, args, evt_obj): level = attachee.stat_level_get(classEnum) if level < 2: @@ -200,30 +121,35 @@ def onGetAbilityScoreCha(attachee, args, evt_obj): classSpecObj.AddHook(ET_OnAbilityScoreLevel, EK_STAT_CHARISMA, onGetAbilityScoreCha, ()) ### Claws and Bite +# ToDo! ### Breath Weapon def breathWeaponRadial(attachee, args, evt_obj): - chargesLeft = args.get_arg(0) - maxCharges = args.get_arg(1) - #I display the heritage colour in the Breath Weapon Radial - #So the player gets a visual feedback, which colour he did choose - heritage = attachee.d20_query("PQ_Dragon_Disciple_Selected_Heritage") - dragonColour = dictDragonHeritage[heritage][0] - breathWeaponShape = attachee.d20_query("PQ_Dragon_Disciple_Breath_Weapon_Type") - spellEnum = spell_dragon_disciple_cone_breath if breathWeaponShape == 1 else spell_dragon_disciple_line_breath - - breathWeaponId = tpdp.RadialMenuEntryPythonAction("{} Breath Weapon {}/{}".format(dragonColour, chargesLeft, maxCharges), D20A_PYTHON_ACTION, breathWeaponEnum, spellEnum, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON") - spellData = tpdp.D20SpellData(spellEnum) - casterLevel = attachee.stat_level_get(classEnum) - spellData.set_spell_class(classEnum) - spellData.set_spell_level(casterLevel) - breathWeaponId.set_spell_data(spellData) + 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) + print "chargesLeft: {}, maxCharges: {}".format(chargesLeft, maxCharges) + heritage = attachee.d20_query("PQ_Selected_Draconic_Heritage") + print "heritage: {}".format(heritage) + breathWeaponShape = heritage_feat_utils.getDraconicHeritageBreathShape(heritage) + print "breathWeaponShape: {}".format(breathWeaponShape) + spellEnum = 3231 if breathWeaponShape == dragon_breath_shape_cone else 3232 + breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon ({}/{})".format(chargesLeft, maxCharges), D20A_PYTHON_ACTION, breathWeaponEnum, spellEnum, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON") + 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(0) < 1: + 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_INVALID_ACTION return 0 def performBreathWeapon(attachee, args, evt_obj): @@ -240,27 +166,32 @@ def performBreathWeapon(attachee, args, evt_obj): evt_obj.d20a.anim_id = new_anim_id return 0 -def frameBreathWeapon(attachee, args, evt_obj): - #Reduce Breath Weapon Daily uses by 1 - chargesLeft = args.get_arg(0) - chargesLeft -= 1 - args.set_arg(0, chargesLeft) +def frameBreathWeapon(attachee, args, evt_obj): + genderString = "his" if attachee.stat_level_get(stat_gender) == 1 else "her" + game.create_history_freeform("{} uses {} ~Breath Weapon~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON]\n\n".format(attachee.description, genderString)) +# currentSequence = tpactions.get_cur_seq() +# spellPacket = currentSequence.spell_packet +# newSpellId = tpactions.get_new_spell_id() +# print "spellPacket.caster_level: {}".format(spellPacket.caster_level) +# spellPacket.caster_level = attachee.stat_level_get(classEnum) + # Setting the dc here does not affect the spell when triggered down below :( +# spellPacket.dc = 10 + attachee.stat_level_get(classEnum) + ((attachee.stat_level_get(stat_constitution)-10)/2) +# print "Debug Spell DC Breath Weapon: {}".format(spellPacket.dc) +# tpactions.register_spell_cast(spellPacket, newSpellId) +# tpactions.trigger_spell_effect(newSpellId) + #Send Breath Weapon Used Signal + breathWeaponId = args.get_arg(0) + attachee.d20_send_signal("PS_Breath_Weapon_Used", breathWeaponId) return 0 -def resetBreathWeapon(attachee, args, evt_obj): - maxCharges = 1 - args.set_arg(0, maxCharges) - args.set_arg(1, maxCharges) - return 0 - -dragonDiscipleBreathWeapon = PythonModifier("Dragon Disciple Breath Weapon", 3) #chargesLeft, maxCharges, empty +dragonDiscipleBreathWeapon = breath_weapon.BreathWeaponModifier("Dragon Disciple Breath Weapon") dragonDiscipleBreathWeapon.MapToFeat("Dragon Disciple Breath Weapon") +dragonDiscipleBreathWeapon.breathWeaponSetArgs(classEnum, 1) 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, ()) -dragonDiscipleBreathWeapon.AddHook(ET_OnConditionAdd, EK_NONE, resetBreathWeapon, ()) -dragonDiscipleBreathWeapon.AddHook(ET_OnNewDay, EK_NEWDAY_REST, resetBreathWeapon, ()) + ### Blindsense @@ -324,7 +255,8 @@ def sleepParalyzeImmunity(attachee, args, evt_obj): return 0 def elementImmunity(attachee, args, evt_obj): - elementType = attachee.d20_query("PQ_Dragon_Disciple_Element_Type") + 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 From 2d2d8cb52422788d5aceab86c83727816e61a24a Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 24 Nov 2021 12:01:46 +0100 Subject: [PATCH 017/146] First Draft of Bonus Spells Feature --- .../char_class/class023_dragon_disciple.py | 9 +- .../rules/feats/bonus spell bard 0.txt | 6 ++ .../rules/feats/bonus spell bard 1.txt | 6 ++ .../rules/feats/bonus spell bard 2.txt | 6 ++ .../rules/feats/bonus spell bard 3.txt | 6 ++ .../rules/feats/bonus spell sorcerer 0.txt | 6 ++ .../rules/feats/bonus spell sorcerer 1.txt | 6 ++ .../rules/feats/bonus spell sorcerer 2.txt | 6 ++ .../rules/feats/bonus spell sorcerer 3.txt | 6 ++ .../rules/feats/bonus spell wizard 0.txt | 6 ++ .../rules/feats/bonus spell wizard 1.txt | 6 ++ .../rules/feats/bonus spell wizard 2.txt | 6 ++ .../rules/feats/bonus spell wizard 3.txt | 6 ++ .../tpgamefiles/rules/feats/bonus spell.txt | 5 ++ .../rules/partsys/breath_weapons_partsys.tab | 24 +++++ .../rules/partsys/dragon_disciple_partsys.tab | 24 ----- .../dragon_disciple_spell_enum.mes | 3 - ...Spell3231 - Dragon Disciple Cone Breath.py | 25 +++--- ...Spell3232 - Dragon Disciple Line Breath.py | 19 ++-- .../scr/tpModifiers/bonus_spell.py | 68 ++++++++++++++ .../scr/tpModifiers/dragon_disciple.py | 89 +------------------ 21 files changed, 199 insertions(+), 139 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 0.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 1.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 2.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 3.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 0.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 1.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 2.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 3.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 0.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 1.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 2.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 3.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell.txt create mode 100644 tpdatasrc/tpgamefiles/rules/partsys/breath_weapons_partsys.tab delete mode 100644 tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/bonus_spell.py diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py index 250625203..c6fd820bd 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py @@ -117,9 +117,10 @@ def alreadyHasDraconicHeritage(obj): def IsSelectingFeatsOnLevelup(obj): newLvl = char_editor.stat_level_get(classEnum) - if not newLvl == 1: - return 0 - if alreadyHasDraconicHeritage(obj): + if newLvl == 1: + if alreadyHasDraconicHeritage(obj): + return 0 + elif newLvl not in [2, 4, 5, 6, 8, 9]: return 0 return 1 @@ -128,6 +129,8 @@ def LevelupGetBonusFeats(obj): bonus_feats = [] if newLvl == 1: bonus_feats.append("Draconic Heritage") + elif newLvl in [2, 4, 5, 6, 8, 9]: + bonus_feats.append("Bonus Spell") bonFeatInfo = [] for ft in bonus_feats: diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 0.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 0.txt new file mode 100644 index 000000000..2e7050e79 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 0.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Bard 0) +flags: 9 +prereqs: 8 1 +description: Grants a Bard bonus Spell per Day for Spell Level 0 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 1.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 1.txt new file mode 100644 index 000000000..b4fc06deb --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 1.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Bard 1) +flags: 9 +prereqs: 8 2 +description: Grants a Bard bonus Spell per Day for Spell Level 1 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 2.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 2.txt new file mode 100644 index 000000000..78ba1274d --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 2.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Bard 2) +flags: 9 +prereqs: 8 4 +description: Grants a Bard bonus Spell per Day for Spell Level 2 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 3.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 3.txt new file mode 100644 index 000000000..ec4a1b56c --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 3.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Bard 3) +flags: 9 +prereqs: 8 7 +description: Grants a Bard bonus Spell per Day for Spell Level 3 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 0.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 0.txt new file mode 100644 index 000000000..57907f5a6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 0.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Sorcerer 0) +flags: 9 +prereqs: 16 1 +description: Grants a Sorcerer bonus Spell per Day for Spell Level 0 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 1.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 1.txt new file mode 100644 index 000000000..5ecf732a4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 1.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Sorcerer 1) +flags: 9 +prereqs: 16 1 +description: Grants a Sorcerer bonus Spell per Day for Spell Level 1 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 2.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 2.txt new file mode 100644 index 000000000..259e0d56a --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 2.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Sorcerer 2) +flags: 9 +prereqs: 16 4 +description: Grants a Sorcerer bonus Spell per Day for Spell Level 2 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 3.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 3.txt new file mode 100644 index 000000000..eb76da192 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 3.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Sorcerer 3) +flags: 9 +prereqs: 16 6 +description: Grants a Sorcerer bonus Spell per Day for Spell Level 3 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 0.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 0.txt new file mode 100644 index 000000000..c34c41fbd --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 0.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Wizard 0) +flags: 9 +prereqs: 17 1 +description: Grants a Wizard bonus Spell per Day for Spell Level 0 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 1.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 1.txt new file mode 100644 index 000000000..576110882 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 1.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Wizard 1) +flags: 9 +prereqs: 17 1 +description: Grants a Wizard bonus Spell per Day for Spell Level 1 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 2.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 2.txt new file mode 100644 index 000000000..0449bd9b0 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 2.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Wizard 2) +flags: 9 +prereqs: 17 3 +description: Grants a Wizard bonus Spell per Day for Spell Level 2 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 3.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 3.txt new file mode 100644 index 000000000..33c35c130 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 3.txt @@ -0,0 +1,6 @@ +name: Bonus Spell (Wizard 3) +flags: 9 +prereqs: 17 5 +description: Grants a Wizard bonus Spell per Day for Spell Level 3 +prereq descr: +parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell.txt new file mode 100644 index 000000000..bfca83c2c --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/feats/bonus spell.txt @@ -0,0 +1,5 @@ +name: Bonus Spell +flags: 9 +prereqs: +description: Grants a Bonus Spell per Day +prereq descr: 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/dragon_disciple_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab deleted file mode 100644 index 32788c940..000000000 --- a/tpdatasrc/tpgamefiles/rules/partsys/dragon_disciple_partsys.tab +++ /dev/null @@ -1,24 +0,0 @@ -sp-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Cone Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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-Dragon Disciple Line Breath 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/spell_enums/dragon_disciple_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/dragon_disciple_spell_enum.mes index 0780f3878..91a27524d 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/dragon_disciple_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/dragon_disciple_spell_enum.mes @@ -3,8 +3,5 @@ {3231}{Dragon Disciple Cone Breath} {3232}{Dragon Disciple Line Breath} -{8231}{Dragon Disciple Cone Breath} -{8232}{Dragon Disciple Line Breath} - {23231}{DRAGON_DISCIPLE_CONE_BREATH} {23232}{DRAGON_DISCIPLE_LINE_BREATH} diff --git a/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py b/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py index a3a6707a1..f0d8cf6c6 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py +++ b/tpdatasrc/tpgamefiles/scr/Spell3231 - Dragon Disciple Cone Breath.py @@ -1,4 +1,5 @@ from toee import * +from heritage_feat_utils import getDraconicHeritageElement def OnBeginSpellCast(spell): print "Dragon Disciple Cone Breath OnBeginSpellCast" @@ -10,10 +11,7 @@ def OnSpellEffect(spell): targetsToRemove = [] spell.duration = 0 - spell.dc = 10 + spell.caster_level + ((spell.caster.stat_level_get(stat_constitution)-10)/2) - print "Debug Dragon Disciple Cone Breath" - print "Dragon Disciple Breath Weapon DC: {}".format(spell.dc) - print "Dragon Disciple Caster Level: {}".format(spell.caster_level) + spell.dc = 10 + spell.caster_level + ((spell.caster.stat_level_get(stat_constitution)- 10 ) / 2) spellDamageDice = dice_new('1d8') if spell.caster_level < 7: @@ -22,27 +20,26 @@ def OnSpellEffect(spell): spellDamageDice.number = 4 else: spellDamageDice.number = 6 - print "spellDamageDice: {}".format(spellDamageDice) saveType = D20_Save_Reduction_Half - damageType = spell.caster.d20_query("PQ_Dragon_Disciple_Element_Type") - print "Dragon Disciple Breath Weapon Element: {}".format(damageType) - #If different Breath Weapon Types get added (e.g. Sonic) add them here + + heritage = spell.caster.d20_query("PQ_Selected_Draconic_Heritage") + damageType = getDraconicHeritageElement(heritage) if damageType == D20DT_ACID: saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ACID - particleEffect = "sp-Dragon Disciple Cone Breath Acid" + elementString = "Acid" elif damageType == D20DT_COLD: saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_COLD - particleEffect = "sp-Dragon Disciple Cone Breath Cold" + elementString = "Cold" elif damageType == D20DT_ELECTRICITY: saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ELECTRICITY - particleEffect = "sp-Dragon Disciple Cone Breath Electricity" + elementString = "Electricity" elif damageType == D20DT_FIRE: saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_FIRE - particleEffect = "sp-Dragon Disciple Cone Breath Fire" + elementString = "Fire" else: #Fallback saveDescriptor = D20STD_F_NONE - particleEffect = "sp-Dragon Disciple Cone Breath Fire" - print "Dragon Disciple Breath Weapon Descriptor: {}".format(saveDescriptor) + elementString = "Fire" + particleEffect = "sp-Breath Weapon Cone Medium {}".format(elementString) game.particles(particleEffect, spell.caster) diff --git a/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py b/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py index ed892ab77..dd23cccdf 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py +++ b/tpdatasrc/tpgamefiles/scr/Spell3232 - Dragon Disciple Line Breath.py @@ -1,4 +1,5 @@ from toee import * +from heritage_feat_utils import getDraconicHeritageElement def OnBeginSpellCast(spell): print "Dragon Disciple Line Breath OnBeginSpellCast" @@ -10,7 +11,7 @@ def OnSpellEffect(spell): targetsToRemove = [] spell.duration = 0 - spell.dc = 10 + spell.caster_level + ((spell.caster.stat_level_get(stat_constitution)-10)/2) + spell.dc = 10 + spell.caster_level + ((spell.caster.stat_level_get(stat_constitution) - 10) / 2) spellDamageDice = dice_new('1d8') if spell.caster_level < 7: @@ -20,23 +21,25 @@ def OnSpellEffect(spell): else: spellDamageDice.number = 6 saveType = D20_Save_Reduction_Half - damageType = spell.caster.d20_query("PQ_Dragon_Disciple_Element_Type") - #If different Breath Weapon Types get added (e.g. Sonic) add them here + + heritage = spell.caster.d20_query("PQ_Selected_Draconic_Heritage") + damageType = getDraconicHeritageElement(heritage) if damageType == D20DT_ACID: saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ACID - particleEffect = "sp-Dragon Disciple Line Breath Acid" + elementString = "Acid" elif damageType == D20DT_COLD: saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_COLD - particleEffect = "sp-Dragon Disciple Line Breath Cold" + elementString = "Cold" elif damageType == D20DT_ELECTRICITY: saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_ELECTRICITY - particleEffect = "sp-Dragon Disciple Line Breath Electricity" + elementString = "Electricity" elif damageType == D20DT_FIRE: saveDescriptor = D20STD_F_SPELL_DESCRIPTOR_FIRE - particleEffect = "sp-Dragon Disciple Line Breath Fire" + elementString = "Fire" else: #Fallback saveDescriptor = D20STD_F_NONE - particleEffect = "sp-Dragon Disciple Line Breath Fire" + elementString = "Fire" + particleEffect = "sp-Breath Weapon Line Medium {}".format(elementString) game.particles(particleEffect, spell.caster) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/bonus_spell.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/bonus_spell.py new file mode 100644 index 000000000..0f10095a1 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/bonus_spell.py @@ -0,0 +1,68 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp + +print "Registering Bonus Spell Slot Feats" + +def setSpellLevelArg(attachee, args, evt_obj): + spellLevel = args.get_param(0) + args.set_arg(2, spellLevel) + return 0 + +def applyExtraSpell(attachee, args, evt_obj): + classEnum = args.get_arg(1) + spellLevel = args.get_arg(2) + #I am unsure why evt_obj.caster_class is not working, can't get a print of it either + #print "evt_obj.caster_class: {}".format(evt_obj.caster_class) + #Disabeld for now due to this + #if not evt_obj.caster_class == classEnum: + # return 0 + if 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 + +class BonusSpellModifier(PythonModifier): + # BonusSpellModifier have 4 arguments: + # 0: featEnum, 1: classEnum, 2: spellLevel, 3: empty + def __init__(self, name): + PythonModifier.__init__(self, name, 4, False) + self.AddHook(ET_OnGetSpellsPerDayMod, EK_NONE, applyExtraSpell, ()) + + #There is no feat_cond_arg3 so I can't use a for loop + #And have to set the arg manually + def bonusSpellLevelSetArg(self, slotLevel): + self.AddHook(ET_OnConditionAdd, EK_NONE, setSpellLevelArg, (slotLevel,)) + +bonusSpellSorc0 = BonusSpellModifier("Bonus Spell Sorc 0") +bonusSpellSorc0.MapToFeat("Bonus Spell (Sorcerer 0)", feat_cond_arg2 = stat_level_sorcerer) +bonusSpellSorc0.bonusSpellLevelSetArg(0) + +bonusSpellSorc1 = BonusSpellModifier("Bonus Spell Sorc 1") +bonusSpellSorc1.MapToFeat("Bonus Spell (Sorcerer 1)", feat_cond_arg2 = stat_level_sorcerer) +bonusSpellSorc1.bonusSpellLevelSetArg(1) + +bonusSpellSorc2 = BonusSpellModifier("Bonus Spell Sorc 2") +bonusSpellSorc2.MapToFeat("Bonus Spell (Sorcerer 2)", feat_cond_arg2 = stat_level_sorcerer) +bonusSpellSorc2.bonusSpellLevelSetArg(2) + +bonusSpellSorc3 = BonusSpellModifier("Bonus Spell Sorc 3") +bonusSpellSorc3.MapToFeat("Bonus Spell (Sorcerer 3)", feat_cond_arg2 = stat_level_sorcerer) +bonusSpellSorc3.bonusSpellLevelSetArg(3) + +bonusSpellWiz0 = BonusSpellModifier("Bonus Spell Wiz 0") +bonusSpellWiz0.MapToFeat("Bonus Spell (Wizard 0)", feat_cond_arg2 = stat_level_wizard) +bonusSpellWiz0.bonusSpellLevelSetArg(0) + +bonusSpellWiz0 = BonusSpellModifier("Bonus Spell Wiz 1") +bonusSpellWiz0.MapToFeat("Bonus Spell (Wizard 1)", feat_cond_arg2 = stat_level_wizard) +bonusSpellWiz0.bonusSpellLevelSetArg(1) + +bonusSpellWiz0 = BonusSpellModifier("Bonus Spell Wiz 2") +bonusSpellWiz0.MapToFeat("Bonus Spell (Wizard 0)", feat_cond_arg2 = stat_level_wizard) +bonusSpellWiz0.bonusSpellLevelSetArg(2) + +bonusSpellWiz0 = BonusSpellModifier("Bonus Spell Wiz 2") +bonusSpellWiz0.MapToFeat("Bonus Spell (Wizard 2)", feat_cond_arg2 = stat_level_wizard) +bonusSpellWiz0.bonusSpellLevelSetArg(2) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index a83b6f6d4..a1b6470a4 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -131,12 +131,9 @@ def breathWeaponRadial(attachee, args, evt_obj): else: chargesLeft = args.get_arg(1) maxCharges = breath_weapon.getMaxCharges(attachee) - print "chargesLeft: {}, maxCharges: {}".format(chargesLeft, maxCharges) heritage = attachee.d20_query("PQ_Selected_Draconic_Heritage") - print "heritage: {}".format(heritage) breathWeaponShape = heritage_feat_utils.getDraconicHeritageBreathShape(heritage) - print "breathWeaponShape: {}".format(breathWeaponShape) - spellEnum = 3231 if breathWeaponShape == dragon_breath_shape_cone else 3232 + spellEnum = spell_dragon_diciple_cone_breath if breathWeaponShape == dragon_breath_shape_cone else spell_dragon_diciple_line_breath breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon ({}/{})".format(chargesLeft, maxCharges), D20A_PYTHON_ACTION, breathWeaponEnum, spellEnum, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON") spellData = tpdp.D20SpellData(spellEnum) spellData.set_spell_class(classEnum) @@ -156,7 +153,7 @@ 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) + spellPacket.caster_level += attachee.stat_level_get(classEnum) tpactions.register_spell_cast(spellPacket, newSpellId) currentSequence.spell_packet.spell_id = newSpellId @@ -169,16 +166,6 @@ def performBreathWeapon(attachee, args, evt_obj): def frameBreathWeapon(attachee, args, evt_obj): genderString = "his" if attachee.stat_level_get(stat_gender) == 1 else "her" game.create_history_freeform("{} uses {} ~Breath Weapon~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON]\n\n".format(attachee.description, genderString)) -# currentSequence = tpactions.get_cur_seq() -# spellPacket = currentSequence.spell_packet -# newSpellId = tpactions.get_new_spell_id() -# print "spellPacket.caster_level: {}".format(spellPacket.caster_level) -# spellPacket.caster_level = attachee.stat_level_get(classEnum) - # Setting the dc here does not affect the spell when triggered down below :( -# spellPacket.dc = 10 + attachee.stat_level_get(classEnum) + ((attachee.stat_level_get(stat_constitution)-10)/2) -# print "Debug Spell DC Breath Weapon: {}".format(spellPacket.dc) -# tpactions.register_spell_cast(spellPacket, newSpellId) -# tpactions.trigger_spell_effect(newSpellId) #Send Breath Weapon Used Signal breathWeaponId = args.get_arg(0) attachee.d20_send_signal("PS_Breath_Weapon_Used", breathWeaponId) @@ -265,75 +252,3 @@ def elementImmunity(attachee, args, evt_obj): dragonDiscipleApotheosis.MapToFeat("Dragon Disciple Dragon Apotheosis") dragonDiscipleApotheosis.AddHook(ET_OnConditionAddPre, EK_NONE, sleepParalyzeImmunity, ()) dragonDiscipleApotheosis.AddHook(ET_OnTakingDamage2, EK_NONE, elementImmunity, ()) - - -#region 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 - -# 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) - 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) - 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) - 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 \ No newline at end of file From a43fa6aaa0158d33e32db77398996ce9bfb1d331 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 25 Nov 2021 09:04:09 +0100 Subject: [PATCH 018/146] Forgot to merge the draconic_heritage feat to the DD --- .../scr/tpModifiers/draconic_heritage.py | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/draconic_heritage.py 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, ()) From 8f9182eed9d21d3688ae924b93ed38b90fad7118 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 6 Dec 2021 23:34:09 +0100 Subject: [PATCH 019/146] Added new error codes --- TemplePlus/action_sequence.cpp | 7 +- TemplePlus/action_sequence.h | 5 +- tpdata/templeplus/lib/templeplus/constants.py | 108 +++++++++++++++++- tpdatasrc/tpgamefiles/mes/action_ext.mes | 5 + .../scr/tpModifiers/dragon_disciple.py | 2 +- 5 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/mes/action_ext.mes diff --git a/TemplePlus/action_sequence.cpp b/TemplePlus/action_sequence.cpp index 34cf595e9..81fd99a6a 100644 --- a/TemplePlus/action_sequence.cpp +++ b/TemplePlus/action_sequence.cpp @@ -4308,12 +4308,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 795bf8f97..5fbdc3894 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/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 3a475cafa..2ba057910 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3358,8 +3358,105 @@ spell_new_slot_lvl_8 = 1613 spell_new_slot_lvl_9 = 1614 -spell_dragon_disciple_cone_breath = 3231 -spell_dragon_disciple_line_breath = 3232 +# Python Action Spells +spell_epic_of_the_lost_king = 3080 +spell_ki_blast = 3120 + +#Dragon Disciple Breath Weapons +spell_dragon_diciple_cone_breath = 3231 +spell_dragon_diciple_line_breath = 3232 + +# Dragon Lineage Spell Like Abilities +spell_dragon_lineage_black = 3242 +spell_dragon_lineage_blue = 3243 +spell_dragon_lineage_brass = 3244 +spell_dragon_lineage_bronze = 3245 +spell_dragon_lineage_copper = 3246 +spell_dragon_lineage_gold = 3247 +spell_dragon_lineage_green = 3248 +spell_dragon_lineage_red = 3249 +spell_dragon_lineage_silver = 3250 +spell_dragon_lineage_white = 3251 + +# Marshal Spells +spell_marshal_minor_aura = 3831 +spell_marshal_major_aura = 3832 +spell_marshal_adrenaline_boost = 3833 + +# Dragon Shaman Spells +spell_draconic_aura = 3840 +spell_double_draconic_aura = 3841 + +# Dummy Spells for Python Actions +spell_dummy_spell_cone_small = 3900 +spell_dummy_spell_cone_medium = 3901 +spell_dummy_spell_cone_large = 3902 +spell_dummy_spell_line_small = 3903 +spell_dummy_spell_line_medium = 3904 +spell_dummy_spell_line_large = 3905 + +# Dragon Breath Shapes +dragon_breath_shape_cone = 1 +dragon_breath_shape_line = 2 + +# Heritage Types +heritage_draconic_black = 1 +heritage_draconic_blue = 2 +heritage_draconic_brass = 3 +heritage_draconic_bronze = 4 +heritage_draconic_copper = 5 +heritage_draconic_gold = 6 +heritage_draconic_green = 7 +heritage_draconic_red = 8 +heritage_draconic_silver = 9 +heritage_draconic_white = 10 +heritage_celestial_sorcerer = 11 +heritage_fey = 12 +heritage_fiendish = 13 +heritage_infernal_sorcerer = 14 + +# Aura Types +aura_type_minor = 1 +aura_type_major = 2 +aura_type_draconic = 3 +aura_type_double_draconic = 4 + +#Aura Enums +aura_accurate_strike = 1 +aura_art_of_war = 2 +aura_Demand_fortitude = 3 +aura_Determined_caster = 4 +aura_force_of_will = 5 +aura_master_of_opportunity = 6 +aura_master_of_tactics = 7 +aura_motivate_charisma = 8 +aura_motivate_constitution = 9 +aura_motivate_dexterity = 10 +aura_motivate_intelligence = 11 +aura_motivate_strength = 12 +aura_motivate_wisdom = 13 +aura_over_the_top = 14 +aura_watchful_eye = 15 +aura_hardy_soldiers = 16 +aura_motivate_ardor = 17 +aura_motivate_attack = 18 +aura_motivate_care = 19 +aura_motivate_urgency = 20 +aura_resilient_troops = 21 +aura_steady_hand = 22 +aura_energy_shield = 23 +aura_power = 24 +aura_presence = 25 +aura_resistance = 26 +aura_senses = 27 +aura_toughness = 28 +aura_vigor = 29 +aura_break_spell_resistance = 30 +aura_energy = 31 +aura_insight = 32 +aura_resolve = 33 +aura_stamina = 34 +aura_swiftness =35 stat_strength = 0 stat_dexterity = 1 @@ -3440,6 +3537,10 @@ stat_level_shadow_sun_ninja = 81 stat_level_fochlucan_lyrist = 82 stat_level_marshal = 83 +stat_level_dragon_shaman = 84 +stat_level_dragonheart_mage = 85 +stat_level_battle_howler_of_gruumsh = 86 +stat_level_fist_of_the_forest = 87 @@ -4090,6 +4191,9 @@ AEC_NO_ACTIONS = 24 AEC_NOT_IN_COMBAT = 25 AEC_AREA_NOT_SAFE = 26 +AEC_ABILITY_ON_COOLDOWN = 27 +AEC_ALREADY_USED_THIS_TURN = 28 +AEC_ALREADY_ACTIVE = 29 BM_INSPIRE_COURAGE = 1 diff --git a/tpdatasrc/tpgamefiles/mes/action_ext.mes b/tpdatasrc/tpgamefiles/mes/action_ext.mes new file mode 100644 index 000000000..6dc08f6fb --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/action_ext.mes @@ -0,0 +1,5 @@ +// New error codes added by Sagenlicht + +{1027}{Ability on Cooldown} +{1028}{Already used this turn} +{1029}{Already active!} diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index a1b6470a4..918b041e8 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -146,7 +146,7 @@ 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_INVALID_ACTION + evt_obj.return_val = AEC_ABILITY_ON_COOLDOWN return 0 def performBreathWeapon(attachee, args, evt_obj): From 1586499858c6e8919833c2329f83dcd845eb501d Mon Sep 17 00:00:00 2001 From: DudeMcDude Date: Wed, 22 Dec 2021 11:53:23 +0200 Subject: [PATCH 020/146] Condition hashtable init replacement; added log message for when it overflows --- TemplePlus/condition.cpp | 25 +++++++++++++++++++++++++ TemplePlus/condition.h | 19 +++---------------- TemplePlus/config/config.cpp | 1 + TemplePlus/hashtable.h | 17 +++++++++++++---- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/TemplePlus/condition.cpp b/TemplePlus/condition.cpp index b92eba5af..24a4595b7 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); @@ -7449,3 +7452,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 34ab7afdd..9b3a7811c 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 9c735b7c1..c6f383529 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/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(); +} From b43a73d866eae93fb0cce5d7b7f6655543d75cbe Mon Sep 17 00:00:00 2001 From: DudeMcDude Date: Wed, 22 Dec 2021 14:45:56 +0200 Subject: [PATCH 021/146] reflex throw will now use SpellSaveThrow when used for spell actions, so it'll correctly apply the spell descriptors --- TemplePlus/damage.cpp | 74 ++++++++++++++++++++++++++++++++++++--- TemplePlus/dispatcher.cpp | 26 ++++++++++++++ TemplePlus/dispatcher.h | 4 ++- 3 files changed, 98 insertions(+), 6 deletions(-) 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 cbe35e39b..0d9669a18 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 From e21d76653e592c42840cfc53852092db3820e3b2 Mon Sep 17 00:00:00 2001 From: DudeMcDude Date: Wed, 22 Dec 2021 15:19:41 +0200 Subject: [PATCH 022/146] Added get_caster_class method to python EventObjSpellsPerDay --- TemplePlus/python/python_dispatcher.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/TemplePlus/python/python_dispatcher.cpp b/TemplePlus/python/python_dispatcher.cpp index 688d4900a..52d2cc33e 100644 --- a/TemplePlus/python/python_dispatcher.cpp +++ b/TemplePlus/python/python_dispatcher.cpp @@ -1175,7 +1175,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) ; From 05c1d8eadaf014be56e9713924668767dd2c298e Mon Sep 17 00:00:00 2001 From: DudeMcDude Date: Thu, 23 Dec 2021 19:04:14 +0200 Subject: [PATCH 023/146] Renamed chargeAfterPicker for more accurate meaning --- TemplePlus/action_sequence.cpp | 14 +++++++------- TemplePlus/d20.cpp | 26 +++++++++++++++----------- TemplePlus/d20_defs.h | 4 ++-- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/TemplePlus/action_sequence.cpp b/TemplePlus/action_sequence.cpp index 81fd99a6a..96a880e4a 100644 --- a/TemplePlus/action_sequence.cpp +++ b/TemplePlus/action_sequence.cpp @@ -1716,7 +1716,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; } @@ -3371,7 +3371,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; @@ -3512,13 +3512,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; diff --git a/TemplePlus/d20.cpp b/TemplePlus/d20.cpp index 45f1523dd..181ccb64a 100644 --- a/TemplePlus/d20.cpp +++ b/TemplePlus/d20.cpp @@ -2882,7 +2882,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()){ @@ -2946,7 +2946,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()) @@ -3772,7 +3772,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; @@ -3789,7 +3789,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()) @@ -3803,6 +3803,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) @@ -3813,12 +3817,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; @@ -3841,7 +3845,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()) { @@ -3857,7 +3861,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; } @@ -3869,7 +3873,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; @@ -3877,13 +3881,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_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) From 5fe70c7d75ed8f81168bfce7b45b79b5524d00de Mon Sep 17 00:00:00 2001 From: DudeMcDude Date: Sat, 25 Dec 2021 00:03:09 +0200 Subject: [PATCH 024/146] Minor magic number cleanup from natural attacks review --- TemplePlus/action_sequence.cpp | 7 ++++--- TemplePlus/condition.cpp | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/TemplePlus/action_sequence.cpp b/TemplePlus/action_sequence.cpp index 96a880e4a..8bf039931 100644 --- a/TemplePlus/action_sequence.cpp +++ b/TemplePlus/action_sequence.cpp @@ -3782,12 +3782,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; diff --git a/TemplePlus/condition.cpp b/TemplePlus/condition.cpp index 24a4595b7..48bc1bf6a 100644 --- a/TemplePlus/condition.cpp +++ b/TemplePlus/condition.cpp @@ -1865,16 +1865,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 } From 370c30b5ca8f098f831bec39d1572b18e7f21e16 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 18 Jan 2022 10:38:58 +0100 Subject: [PATCH 025/146] Changed Bonus Spells per Day * Changed Bonus Spells per Day to be in line with general PrC handling in ToEE (highest arcane class is automatically selected) *Minor Breath Weapon Fix --- .../char_class/class023_dragon_disciple.py | 26 ++++--- .../rules/feats/bonus spell bard 0.txt | 6 -- .../rules/feats/bonus spell bard 1.txt | 6 -- .../rules/feats/bonus spell bard 2.txt | 6 -- .../rules/feats/bonus spell bard 3.txt | 6 -- .../rules/feats/bonus spell sorcerer 0.txt | 6 -- .../rules/feats/bonus spell sorcerer 1.txt | 6 -- .../rules/feats/bonus spell sorcerer 2.txt | 6 -- .../rules/feats/bonus spell sorcerer 3.txt | 6 -- .../rules/feats/bonus spell wizard 0.txt | 6 -- .../rules/feats/bonus spell wizard 1.txt | 6 -- .../rules/feats/bonus spell wizard 2.txt | 6 -- .../rules/feats/bonus spell wizard 3.txt | 6 -- .../tpgamefiles/rules/feats/bonus spell.txt | 5 -- ...ragon disciple bonus spell per day (1).txt | 5 ++ ...ragon disciple bonus spell per day (2).txt | 5 ++ ...ragon disciple bonus spell per day (3).txt | 5 ++ ...ragon disciple bonus spell per day (4).txt | 5 ++ ...ragon disciple bonus spell per day (5).txt | 5 ++ ...ragon disciple bonus spell per day (6).txt | 5 ++ ...ragon disciple bonus spell per day (7).txt | 5 ++ .../scr/tpModifiers/bonus_spell.py | 68 ------------------- .../scr/tpModifiers/breath_weapon.py | 41 +++++------ .../scr/tpModifiers/dragon_disciple.py | 40 +++++++++-- 24 files changed, 105 insertions(+), 182 deletions(-) delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 0.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 1.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 2.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 3.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 0.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 1.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 2.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 3.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 0.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 1.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 2.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 3.txt delete mode 100644 tpdatasrc/tpgamefiles/rules/feats/bonus spell.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (1).txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (2).txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (3).txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (4).txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (5).txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (6).txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/dragon disciple bonus spell per day (7).txt delete mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/bonus_spell.py diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py index c6fd820bd..b437e4e12 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py @@ -26,10 +26,14 @@ def GetClassHelpTopic(): class_feats = { -1: ("Dragon Disciple Natural Armor",), -2: ("Dragon Disciple Claws and Bite",), +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",), -9: ("Dragon Disciple Wings",), +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",) } @@ -90,8 +94,8 @@ def KnowledgeArcanaCheck( obj ): 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 1 - return 0 + return 0 + return 1 def ObjMeetsPrereqs(obj): if not KnowledgeArcanaCheck(obj): @@ -117,21 +121,15 @@ def alreadyHasDraconicHeritage(obj): def IsSelectingFeatsOnLevelup(obj): newLvl = char_editor.stat_level_get(classEnum) - if newLvl == 1: - if alreadyHasDraconicHeritage(obj): - return 0 - elif newLvl not in [2, 4, 5, 6, 8, 9]: - return 0 - return 1 + 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") - elif newLvl in [2, 4, 5, 6, 8, 9]: - bonus_feats.append("Bonus Spell") - bonFeatInfo = [] for ft in bonus_feats: featInfo = char_editor.FeatInfo(ft) diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 0.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 0.txt deleted file mode 100644 index 2e7050e79..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 0.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Bard 0) -flags: 9 -prereqs: 8 1 -description: Grants a Bard bonus Spell per Day for Spell Level 0 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 1.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 1.txt deleted file mode 100644 index b4fc06deb..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 1.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Bard 1) -flags: 9 -prereqs: 8 2 -description: Grants a Bard bonus Spell per Day for Spell Level 1 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 2.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 2.txt deleted file mode 100644 index 78ba1274d..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 2.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Bard 2) -flags: 9 -prereqs: 8 4 -description: Grants a Bard bonus Spell per Day for Spell Level 2 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 3.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 3.txt deleted file mode 100644 index ec4a1b56c..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 3.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Bard 3) -flags: 9 -prereqs: 8 7 -description: Grants a Bard bonus Spell per Day for Spell Level 3 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 0.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 0.txt deleted file mode 100644 index 57907f5a6..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 0.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Sorcerer 0) -flags: 9 -prereqs: 16 1 -description: Grants a Sorcerer bonus Spell per Day for Spell Level 0 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 1.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 1.txt deleted file mode 100644 index 5ecf732a4..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 1.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Sorcerer 1) -flags: 9 -prereqs: 16 1 -description: Grants a Sorcerer bonus Spell per Day for Spell Level 1 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 2.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 2.txt deleted file mode 100644 index 259e0d56a..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 2.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Sorcerer 2) -flags: 9 -prereqs: 16 4 -description: Grants a Sorcerer bonus Spell per Day for Spell Level 2 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 3.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 3.txt deleted file mode 100644 index eb76da192..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 3.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Sorcerer 3) -flags: 9 -prereqs: 16 6 -description: Grants a Sorcerer bonus Spell per Day for Spell Level 3 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 0.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 0.txt deleted file mode 100644 index c34c41fbd..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 0.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Wizard 0) -flags: 9 -prereqs: 17 1 -description: Grants a Wizard bonus Spell per Day for Spell Level 0 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 1.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 1.txt deleted file mode 100644 index 576110882..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 1.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Wizard 1) -flags: 9 -prereqs: 17 1 -description: Grants a Wizard bonus Spell per Day for Spell Level 1 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 2.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 2.txt deleted file mode 100644 index 0449bd9b0..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 2.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Wizard 2) -flags: 9 -prereqs: 17 3 -description: Grants a Wizard bonus Spell per Day for Spell Level 2 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 3.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 3.txt deleted file mode 100644 index 33c35c130..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 3.txt +++ /dev/null @@ -1,6 +0,0 @@ -name: Bonus Spell (Wizard 3) -flags: 9 -prereqs: 17 5 -description: Grants a Wizard bonus Spell per Day for Spell Level 3 -prereq descr: -parent: Bonus Spell \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/feats/bonus spell.txt b/tpdatasrc/tpgamefiles/rules/feats/bonus spell.txt deleted file mode 100644 index bfca83c2c..000000000 --- a/tpdatasrc/tpgamefiles/rules/feats/bonus spell.txt +++ /dev/null @@ -1,5 +0,0 @@ -name: Bonus Spell -flags: 9 -prereqs: -description: Grants a Bonus Spell per Day -prereq descr: 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/scr/tpModifiers/bonus_spell.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/bonus_spell.py deleted file mode 100644 index 0f10095a1..000000000 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/bonus_spell.py +++ /dev/null @@ -1,68 +0,0 @@ -from templeplus.pymod import PythonModifier -from toee import * -import tpdp - -print "Registering Bonus Spell Slot Feats" - -def setSpellLevelArg(attachee, args, evt_obj): - spellLevel = args.get_param(0) - args.set_arg(2, spellLevel) - return 0 - -def applyExtraSpell(attachee, args, evt_obj): - classEnum = args.get_arg(1) - spellLevel = args.get_arg(2) - #I am unsure why evt_obj.caster_class is not working, can't get a print of it either - #print "evt_obj.caster_class: {}".format(evt_obj.caster_class) - #Disabeld for now due to this - #if not evt_obj.caster_class == classEnum: - # return 0 - if 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 - -class BonusSpellModifier(PythonModifier): - # BonusSpellModifier have 4 arguments: - # 0: featEnum, 1: classEnum, 2: spellLevel, 3: empty - def __init__(self, name): - PythonModifier.__init__(self, name, 4, False) - self.AddHook(ET_OnGetSpellsPerDayMod, EK_NONE, applyExtraSpell, ()) - - #There is no feat_cond_arg3 so I can't use a for loop - #And have to set the arg manually - def bonusSpellLevelSetArg(self, slotLevel): - self.AddHook(ET_OnConditionAdd, EK_NONE, setSpellLevelArg, (slotLevel,)) - -bonusSpellSorc0 = BonusSpellModifier("Bonus Spell Sorc 0") -bonusSpellSorc0.MapToFeat("Bonus Spell (Sorcerer 0)", feat_cond_arg2 = stat_level_sorcerer) -bonusSpellSorc0.bonusSpellLevelSetArg(0) - -bonusSpellSorc1 = BonusSpellModifier("Bonus Spell Sorc 1") -bonusSpellSorc1.MapToFeat("Bonus Spell (Sorcerer 1)", feat_cond_arg2 = stat_level_sorcerer) -bonusSpellSorc1.bonusSpellLevelSetArg(1) - -bonusSpellSorc2 = BonusSpellModifier("Bonus Spell Sorc 2") -bonusSpellSorc2.MapToFeat("Bonus Spell (Sorcerer 2)", feat_cond_arg2 = stat_level_sorcerer) -bonusSpellSorc2.bonusSpellLevelSetArg(2) - -bonusSpellSorc3 = BonusSpellModifier("Bonus Spell Sorc 3") -bonusSpellSorc3.MapToFeat("Bonus Spell (Sorcerer 3)", feat_cond_arg2 = stat_level_sorcerer) -bonusSpellSorc3.bonusSpellLevelSetArg(3) - -bonusSpellWiz0 = BonusSpellModifier("Bonus Spell Wiz 0") -bonusSpellWiz0.MapToFeat("Bonus Spell (Wizard 0)", feat_cond_arg2 = stat_level_wizard) -bonusSpellWiz0.bonusSpellLevelSetArg(0) - -bonusSpellWiz0 = BonusSpellModifier("Bonus Spell Wiz 1") -bonusSpellWiz0.MapToFeat("Bonus Spell (Wizard 1)", feat_cond_arg2 = stat_level_wizard) -bonusSpellWiz0.bonusSpellLevelSetArg(1) - -bonusSpellWiz0 = BonusSpellModifier("Bonus Spell Wiz 2") -bonusSpellWiz0.MapToFeat("Bonus Spell (Wizard 0)", feat_cond_arg2 = stat_level_wizard) -bonusSpellWiz0.bonusSpellLevelSetArg(2) - -bonusSpellWiz0 = BonusSpellModifier("Bonus Spell Wiz 2") -bonusSpellWiz0.MapToFeat("Bonus Spell (Wizard 2)", feat_cond_arg2 = stat_level_wizard) -bonusSpellWiz0.bonusSpellLevelSetArg(2) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/breath_weapon.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/breath_weapon.py index 648377c3a..4818e4c55 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/breath_weapon.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/breath_weapon.py @@ -10,27 +10,24 @@ def breathWeaponOnConditionAdd(attachee, args, evt_obj): breathWeaponId = args.get_param(0) - breathWeaponCharges = args.get_param(1) + baseCharges = args.get_param(1) cooldown = 0 args.set_arg(0, breathWeaponId) - args.set_arg(1, breathWeaponCharges) + args.set_arg(1, baseCharges) args.set_arg(2, cooldown) - args.set_arg(3, 0) + args.set_arg(3, baseCharges) args.set_arg(4, 0) return 0 # Handle Breath Weapon Charges -def addExtraExhalationCharges(attachee): - extraBreathExhalation = attachee.has_feat("Extra Exhalation") - return extraBreathExhalation - -def getMaxCharges(attachee): - maxCharges = 1 + addExtraExhalationCharges(attachee) - return maxCharges +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) + maxCharges = getMaxCharges(attachee, args) args.set_arg(1, maxCharges) return 0 @@ -53,18 +50,23 @@ def signalBreathWeaponUsed(attachee, args, evt_obj): signalId = evt_obj.data1 breathWeaponId = args.get_arg(0) if signalId == breathWeaponId: - breathWeaponCharges = args.get_arg(1) - if not breathWeaponCharges == 1: + charges = args.get_arg(1) + if not charges == 1: cooldown = getBreathWeaponCoolDown() args.set_arg(2, cooldown) - if not breathWeaponCharges == -1: - breathWeaponCharges -= 1 - args.set_arg(1, breathWeaponCharges) + 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: empty, 4: empty + # 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 @@ -73,8 +75,9 @@ def __init__(self, name): 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, breathWeaponCharges): - self.AddHook(ET_OnConditionAdd, EK_NONE, breathWeaponOnConditionAdd, (breathWeaponId, breathWeaponCharges,)) + def breathWeaponSetArgs(self, breathWeaponId, baseCharges): + self.AddHook(ET_OnConditionAdd, EK_NONE, breathWeaponOnConditionAdd, (breathWeaponId, baseCharges,)) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 918b041e8..02030f6ce 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -2,6 +2,7 @@ from toee import * import tpdp import tpactions +import char_editor import char_class_utils import heritage_feat_utils import breath_weapon @@ -58,6 +59,30 @@ def OnGetSaveThrowWill(attachee, args, evt_obj): ### Draconic Heritage is handle by the Draconic Heritage Feat now +### Bonus Spells per Day +def setBonusSpellPerDaySlot(attachee, args, evt_obj): + highestArcaneClass = attachee.highest_arcane_class + highestArcaneCasterLevel = attachee.highest_arcane_caster_level + spellLevelToApplyBonus = char_editor.get_max_spell_level(attachee, highestArcaneClass, highestArcaneCasterLevel) + args.set_arg(1, highestArcaneClass) + args.set_arg(2, spellLevelToApplyBonus) + return 0 + +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 + +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, ()) + ### AC Bonus def naturalArmorACBonus(attachee, args, evt_obj): classLevel = attachee.stat_level_get(classEnum) @@ -124,17 +149,23 @@ def onGetAbilityScoreCha(attachee, args, evt_obj): # 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) + 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 - breathWeaponId = tpdp.RadialMenuEntryPythonAction("Breath Weapon ({}/{})".format(chargesLeft, maxCharges), D20A_PYTHON_ACTION, breathWeaponEnum, spellEnum, "TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON") + 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 @@ -164,8 +195,9 @@ def performBreathWeapon(attachee, args, evt_obj): 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~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON]\n\n".format(attachee.description, genderString)) + 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) @@ -173,7 +205,7 @@ def frameBreathWeapon(attachee, args, evt_obj): dragonDiscipleBreathWeapon = breath_weapon.BreathWeaponModifier("Dragon Disciple Breath Weapon") dragonDiscipleBreathWeapon.MapToFeat("Dragon Disciple Breath Weapon") -dragonDiscipleBreathWeapon.breathWeaponSetArgs(classEnum, 1) +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, ()) From 422d1c4a45ef221d4a9df73612c71b91a6d20120 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 18 Jan 2022 12:02:28 +0100 Subject: [PATCH 026/146] Update dragon_disciple.py --- .../tpgamefiles/scr/tpModifiers/dragon_disciple.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py index 02030f6ce..be2f74665 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/dragon_disciple.py @@ -2,7 +2,6 @@ from toee import * import tpdp import tpactions -import char_editor import char_class_utils import heritage_feat_utils import breath_weapon @@ -61,11 +60,10 @@ def OnGetSaveThrowWill(attachee, args, evt_obj): ### Bonus Spells per Day def setBonusSpellPerDaySlot(attachee, args, evt_obj): - highestArcaneClass = attachee.highest_arcane_class - highestArcaneCasterLevel = attachee.highest_arcane_caster_level - spellLevelToApplyBonus = char_editor.get_max_spell_level(attachee, highestArcaneClass, highestArcaneCasterLevel) - args.set_arg(1, highestArcaneClass) - args.set_arg(2, spellLevelToApplyBonus) + bonusSpellClass = attachee.highest_arcane_class + spellLevel = attachee.arcane_spell_level_can_cast() + args.set_arg(1, bonusSpellClass) + args.set_arg(2, spellLevel) return 0 def applyExtraSpell(attachee, args, evt_obj): From 16fd20ec5320e939a7e389b56945d2ac18d32c87 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 24 Jan 2022 10:10:52 +0100 Subject: [PATCH 027/146] admin files setup --- tpdatasrc/tpgamefiles/mes/action_ext.mes | 5 ++ tpdatasrc/tpgamefiles/mes/auras.mes | 86 +++++++++++++++++++ tpdatasrc/tpgamefiles/mes/damage_ext.mes | 13 ++- .../mes/help/breath_weapon_feats_help.tab | 2 + .../mes/help/heritage_feats_help.tab | 22 +++++ .../tpgamefiles/mes/help/new_classes_help.tab | 76 ++++++++++++++++ .../tpgamefiles/mes/help/new_feats_help.tab | 18 ++++ .../mes/help/spell_compendium_help.tab | 9 +- .../tpgamefiles/mes/spell_ext/aura_spells.mes | 6 ++ .../dragon_disciple_breath_weapons.mes | 2 + .../mes/spell_ext/spell_compendium_spell.mes | 22 +++++ .../mes/spell_ext/unarmed_feats_spells.mes | 3 + ...ell_compendium_spell_long_descriptions.mes | 77 +++++++++++++++++ .../dummy_spells_for_python_actions.mes | 8 ++ .../heritage_feats_and_breath_weapons.mes | 17 ++++ .../mes/spells/new_feat_spells.mes | 4 + .../mes/spells/unarmed_feats_spells.mes | 3 + tpdatasrc/tpgamefiles/mes/stat_ext.mes | 43 ++++++++++ .../rules/partsys/breath_weapons_partsys.tab | 24 ++++++ .../partsys/fist_of_the_forest_partsys.tab | 2 + .../rules/partsys/new_feats_partsys.tab | 24 ++++++ .../partsys/spell_compendium_partsys.tab | 9 ++ .../draconic_feats_and_breath_weapons.mes | 41 +++++++++ .../dragon_disciple_spell_enum.mes | 7 ++ .../spell_compendium_spell_enum.mes | 32 +++++++ .../user_sounds/spell_compendium_sounds.mes | 55 ++++++++++++ 26 files changed, 607 insertions(+), 3 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/mes/action_ext.mes create mode 100644 tpdatasrc/tpgamefiles/mes/auras.mes create mode 100644 tpdatasrc/tpgamefiles/mes/help/breath_weapon_feats_help.tab create mode 100644 tpdatasrc/tpgamefiles/mes/help/heritage_feats_help.tab create mode 100644 tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab create mode 100644 tpdatasrc/tpgamefiles/mes/help/new_feats_help.tab create mode 100644 tpdatasrc/tpgamefiles/mes/spell_ext/aura_spells.mes create mode 100644 tpdatasrc/tpgamefiles/mes/spell_ext/dragon_disciple_breath_weapons.mes create mode 100644 tpdatasrc/tpgamefiles/mes/spell_ext/unarmed_feats_spells.mes create mode 100644 tpdatasrc/tpgamefiles/mes/spells/dummy_spells_for_python_actions.mes create mode 100644 tpdatasrc/tpgamefiles/mes/spells/heritage_feats_and_breath_weapons.mes create mode 100644 tpdatasrc/tpgamefiles/mes/spells/new_feat_spells.mes create mode 100644 tpdatasrc/tpgamefiles/mes/spells/unarmed_feats_spells.mes create mode 100644 tpdatasrc/tpgamefiles/rules/partsys/breath_weapons_partsys.tab create mode 100644 tpdatasrc/tpgamefiles/rules/partsys/fist_of_the_forest_partsys.tab create mode 100644 tpdatasrc/tpgamefiles/rules/partsys/new_feats_partsys.tab create mode 100644 tpdatasrc/tpgamefiles/rules/spell_enums/draconic_feats_and_breath_weapons.mes create mode 100644 tpdatasrc/tpgamefiles/rules/spell_enums/dragon_disciple_spell_enum.mes diff --git a/tpdatasrc/tpgamefiles/mes/action_ext.mes b/tpdatasrc/tpgamefiles/mes/action_ext.mes new file mode 100644 index 000000000..6dc08f6fb --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/action_ext.mes @@ -0,0 +1,5 @@ +// New error codes added by Sagenlicht + +{1027}{Ability on Cooldown} +{1028}{Already used this turn} +{1029}{Already active!} 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/damage_ext.mes b/tpdatasrc/tpgamefiles/mes/damage_ext.mes index 4fb7d12de..628aad7fe 100644 --- a/tpdatasrc/tpgamefiles/mes/damage_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/damage_ext.mes @@ -3,7 +3,7 @@ {135}{Attacker is Ethereal} {136}{Vulnerable} -// Spell Compendium (by Sagenlicht) +// Spell Compendium {3000}{~Critical Strike~[TAG_SPELLS_CRITICAL_STRIKE]} {3001}{~Sonic Weapon~[TAG_SPELLS_SONIC_WEAPON]} {3002}{~War Cry~[TAG_SPELLS_WAR_CRY]} @@ -12,4 +12,13 @@ {3005}{~Rhino's Charge~[TAG_SPELLS_RHINOS_CHARGE]} {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]} \ No newline at end of file +{3008}{~Weapon of Energy~[TAG_SPELLS_WEAPON_OF_ENERGY]} + +// Feat Damage effects +{4000}{~Flying Kick~[TAG_FLYING_KICK]} +{4001}{~Fists of Iron~[TAG_FISTS_OF_IRON]} +{4002}{~Axiomatic Strike~[TAG_AXIOMATIC_STRIKE]} +{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/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/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/new_classes_help.tab b/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab new file mode 100644 index 000000000..95a900557 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab @@ -0,0 +1,76 @@ +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), ~Survial~[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+ diff --git a/tpdatasrc/tpgamefiles/mes/help/new_feats_help.tab b/tpdatasrc/tpgamefiles/mes/help/new_feats_help.tab new file mode 100644 index 000000000..47c4130e5 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/help/new_feats_help.tab @@ -0,0 +1,18 @@ +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 e7d7f078c..a619760e6 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -60,6 +60,7 @@ TAG_SPELLS_HAUNTING_TUNE TAG_SPELLS TAG_BARD_3 Haunting Tune ~Enchantment~[TAG_ 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_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. @@ -91,7 +92,7 @@ TAG_SPELLS_SHOCK_AND_AWE TAG_SPELLS TAG_ASSASSIN_1 TAG_BARD_1 TAG_SORCERER_1 TA 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_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: Personal Target: Wapon 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. +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. TAG_SPELLS_SOUND_LANCE TAG_SPELLS TAG_SORCERER_3 TAG_WIZARD_3 TAG_CLERIC_4 Sound Lance ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION](Sonic) Level: ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 3, ~Cleric~[TAG_CLERICS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Medium (100 ft. +10 ft./level) Target: One creature or object Duration: Instantaneous Saving Throw: ~Fortitude~[TAG_FORTITUDE] half Spell Resistance: Yes You unleash a shrill, piercing cry at your target, which takes the barely visible form of a translucent lance hurtling through the air. This spell causes a projectile of intense sonic energy to leap from you to a target within range. The sound deals 1d8 points of sonic damage per caster level (maximum 10d8). A sound lance cannot penetrate the area of a ~silence~[TAG_SPELLS_SILENCE] spell. TAG_SPELLS_SPIKES TAG_SPELLS TAG_CLERIC_3 TAG_DRUID_3 Spikes ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Cleric~[TAG_CLERICS] 3, ~Druid~[TAG_DRUIDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: Weapon touched Duration: 1 round/level Saving Throw: None Spell Resistance: No With the sound of twisting wood, the weapon you touch grows sharp spikes like rose thorns. This spell functions like ~Brambles~[TAG_SPELLS_BRAMBLES], except that the affected weapon gains a +2 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus on its ~attack rolls~[TAG_ATTACK_ROLL], and its threat range is doubled. This effect does not stack with other effects that increase a weapon's threat range, such as the Improved Critical feat. Note: the spell only works on weapons equipped in the mainhand. TAG_SPELLS_STRATEGIC_CHARGE TAG_SPELLS TAG_BLACKGUARD_1 TAG_PALADIN_1 Strategic Charge ~Abjuration~[TAG_MAGIC_SCHOOLS_ABJURATION] Level: ~Blackguard~[TAG_BLACKGUARDS] 1, ~Paladin~[TAG_PALADINS] 1 Components: V Casting Time: 1 ~Free action~[TAG_FREE_ACTION] Range: Personal Target: You Duration: 1 round/level A red nimbus surrounds you as you move smoothly across the crowded battlefield. You gain the benefit of the ~Mobility~[TAG_MOBILITY] feat, even if you not meet the prerequisites. You do not have to be charging to gain this benefit. @@ -101,11 +102,17 @@ 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_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. TAG_SPELLS_UNHOLY_STORM TAG_SPELLS TAG_BLACKGUARD_3 TAG_CLERIC_3 Unholy Storm ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Creation)[Evil][Water] Level: ~Blackguard~[TAG_BLACKGUARDS] 3, ~Cleric~[TAG_CLERICS] 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 evil, and a heavy rain begins to fall in the area you indicate, its raindrops foul and steaming. 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 good creatures, dealing 2d6 points of damage per round (good outsiders take double damage). TAG_SPELLS_VEIL_OF_SHADOW TAG_SPELLS TAG_ASSASSIN_2 TAG_BLACKGUARD_2 TAG_CLERIC_2 TAG_SORCERER_2 TAG_WIZARD_2 Veil of Shadow ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION][Darkness] Level: ~Assassin~[TAG_ASSASSINS] 2, ~Blackguard~[TAG_BLACKGUARDS] 2, ~Cleric~[TAG_CLERICS] 2, ~Sorcerer~[TAG_SORCERERS]/~Wizard~[TAG_WIZARDS] 2 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 speak the words of this spell, and tendrils of purple darkness rise from the ground, surrounding you and concealing you from your foes. Swirling wisps of darkness obscure your form, granting you ~concealment~[TAG_CONCEALMENT]. The 20% miss chance is in effect even if the attacker has darkvision. This spell effect is dispelled in daylight or in the area of a light spell of 3rd level or higher. ~See invisibility~[TAG_SPELLS_SEE_INVISIBILITY] does not counter a veil of shadow's concealment effect, but a ~true seeing~[TAG_SPELLS_TRUE_SEEING] spell does. +TAG_SPELLS_VIGOR TAG_SPELLS TAG_CLERIC_3 TAG_DRUID_3 Vigor ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Healing) Level: ~Cleric~[TAG_CLERICS] 3, ~Druid~[TAG_DRUIDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Targets: One living creature Duration: 10 rounds +1 round/level (max 25 rounds) Saving Throw: None Spell Resistance: No This spell functions like ~Vigor, Lesser~[TAG_SPELLS_VIGOR,_LESSER] except as noted here and that it grants ~fast healing~[TAG_SPECIAL_ABILITIES_FAST_HEALING] 2. The effects of multiple vigor spells do not stack; only the highest-level effect applies. +TAG_SPELLS_VIGOR,_GREATER TAG_SPELLS TAG_CLERIC_5 TAG_DRUID_5 Vigor, Greater ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Healing) Level: ~Cleric~[TAG_CLERICS] 5, ~Druid~[TAG_DRUIDS] 5 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Targets: One living creature Duration: 10 rounds +1 round/level (max 35 rounds) Saving Throw: None Spell Resistance: No This spell functions like ~Vigor, Lesser~[TAG_SPELLS_VIGOR,_LESSER] except as noted here and that it grants ~fast healing~[TAG_SPECIAL_ABILITIES_FAST_HEALING] 4. The effects of multiple vigor spells do not stack; only the highest-level effect applies. +TAG_SPELLS_VIGOR,_MASS_LESSER TAG_SPELLS TAG_CLERIC_3 TAG_DRUID_3 Vigor, Mass Lesser ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Healing) Level: ~Cleric~[TAG_CLERICS] 3, ~Druid~[TAG_DRUIDS] 3 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 20 ft. Targets: One living creature/two levels, no two of which can be more than 30 ft. apart Duration: 10 rounds +1 round/level (max 25 rounds) Saving Throw: None Spell Resistance: No This spell functions like ~Vigor, Lesser~[TAG_SPELLS_VIGOR,_LESSER] except as noted here and that it grants ~fast healing~[TAG_SPECIAL_ABILITIES_FAST_HEALING] 1 to a group of creatures. The effects of multiple vigor spells do not stack; only the highest-level effect applies. +TAG_SPELLS_VIGOR,_MASS_IMPROVED TAG_SPELLS TAG_CLERIC_6 TAG_DRUID_6 Vigor, Mass Improved ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Healing) Level: ~Cleric~[TAG_CLERICS] 6, ~Druid~[TAG_DRUIDS] 6 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 20 ft. Targets: One living creature/two levels, no two of which can be more than 30 ft. apart Duration: 10 rounds +1 round/level (max 40 rounds) Saving Throw: None Spell Resistance: No This spell functions like ~Vigor, Lesser~[TAG_SPELLS_VIGOR,_LESSER] except as noted here and that it grants ~fast healing~[TAG_SPECIAL_ABILITIES_FAST_HEALING] 3 to a group of creatures. The effects of multiple vigor spells do not stack; only the highest-level effect applies. +TAG_SPELLS_VIGOR,_LESSER TAG_SPELLS TAG_CLERIC_1 TAG_DRUID_1 Vigor, Lesser ~Conjuration~[TAG_MAGIC_SCHOOLS_CONJURATION](Healing) Level: ~Cleric~[TAG_CLERICS] 1, ~Druid~[TAG_DRUIDS] 1 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Targets: One living creature Duration: 10 rounds +1 round/level (max 15 rounds) Saving Throw: None Spell Resistance: No The sounds of battle ring in your ears as you lay hands on your fallen comrade. You can spare neither time nor magic to do more right now, but the blood flow slows to a trickle and her breathing becomes less labored, even as you are called to the aid of another. The subject gains ~fast healing~[TAG_SPECIAL_ABILITIES_FAST_HEALING] 1, enabling it to heal 1 hit point per round until the spell ends and automatically becoming stabilized if it begins dying from hit point loss during that time. Lesser vigor does not restore hit pointslost from starvation, thirst, or suffocation, nor does it allow a creature to regrow or attach lost body parts. The effects of multiple vigor spells do not stack; only the highest-level effect applies. TAG_SPELLS_VISAGE_OF_THE_DEITY_LESSER TAG_SPELLS TAG_BLACKGUARD_4 TAG_CLERIC_3 TAG_PALADIN_4 Visage of the Deity, lesser ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] Level: ~Blackguard~[TAG_BLACKGUARDS] 4, ~Cleric~[TAG_CLERICS] 3, ~Paladin~[TAG_PALADINS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Personal Target: You Duration: 1 round/level As you end your prayer, you can feel the hand of your deity upon you. Your appearance reflects her divine power, and her touch grants you resistance from some of the damage of this world. You gain a +4 ~enhancement~[TAG_ENHANCEMENT_BONUS] bonus to ~Charisma~[TAG_CHARISMA]. You also gain ~resistance~[TAG_SPECIAL_ABILITIES_RESISTANCE_TO_ENERGY] to acid 10, cold 10, and electricity 10 if you are good, or resistance to cold 10 and fire 10 if you are evil. TAG_SPELLS_WAIL_OF_DOOM TAG_SPELLS TAG_BARD_5 Wail of Doom ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY][Fear]Mind-Affecting][Sonic] Level: ~Bard~[TAG_BARDS] 5 Components: V Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: 30 ft. Area: Cone-shaped burst Duration: Instantaneous + 1 round/level; see text Saving Throw: ~Will~[TAG_WILL] partial Spell Resistance: Yes Anyone caught in the area of this spell suffers excruciating pain and becomes demoralized. Each creature takes 1d4 points of damage per caster level (maximum 15d4) and becomes ~panicked~[TAG_PANICKED] for 1 round per caster level. A successful ~Will~[TAG_WILL] save halves the damage, reduces the panicked effect to ~shaken~[TAG_SHAKEN], and reduces the duration of the shaken effect to 1 round. TAG_SPELLS_WAR_CRY TAG_SPELLS TAG_BARD_2 War Cry ~Enchantment~[TAG_MAGIC_SCHOOLS_ENCHANTMENT] Level: ~Bard~[TAG_BARDS] 2 Components: V, S Casting Time: ~Free action~[TAG_FREE_ACTION] Range: Personal Target: You Duration: 1 round You jab your weapon into the air as if in triumph, letting out a cry of victory before you have even made your attack. Foes around you seem surprised by your display even as the feeling grows within you that you cannot fail. You gain a +4 ~morale~[TAG_MODIFIER_MORALE] bonus on ~attack rolls~[TAG_ATTACK_ROLL] and damage rolls made as part of a ~charge~[TAG_CHARGE]. If you deal damage with a charge attack, your foe must succeed on a ~Will~[TAG_WILL] save or become panicked for 1 round (spell resistance applies to this effect). 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 30afc18a1..04d7b9f9a 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes @@ -1,3 +1,8 @@ +// Vigor Spell Fixes +{794}{Vigor, Lesser} +{795}{Vigor} +{796}{Vigor, Greater} + //Additional spells added by Sagenlicht // Spell Names @@ -121,8 +126,18 @@ {1171}{Storm of Elemental Fury} {1172}{Acid Fog} {1173}{Touch of Madness} +{1174}{Energized Shield, Lesser} +{1175}{Energized Shield} +{1176}{Draconic Might} +{1177}{Vigor, Mass Lesser} +{1178}{Vigor, Mass Improved} +{1179}{Sure Strike} +{1180}{Hunter's Eye} // 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.} {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.} @@ -243,3 +258,10 @@ {6171} Storm of Elemental Fury {[Conjuration](Summoning) TBD} {6172} Acid Fog {[Conjuration](Creation)[Acid] While inside Acid Fog, targets are concealed, can only move 5 feet, are immune to ranged attacks and take 2d6 acid damage every turn.} {6173} Touch of Madness {[Enchantment][Mind-Affecting] Target must make a Will Saving Throw after a successful touch attack or be dazed for 1 round/level.} +{6174} Energized Shield, Lesser {TBD} +{6175} Energized Shield {TBD} +{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.} diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/unarmed_feats_spells.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/unarmed_feats_spells.mes new file mode 100644 index 000000000..4749a7c6f --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/unarmed_feats_spells.mes @@ -0,0 +1,3 @@ +// Spell Enum for Ki Blast + +{3120}{Ki Blast} 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 4149f0961..c7fb7fcf3 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 @@ -1,3 +1,29 @@ +// Vigor Fixes + +{5794} Vigor, Lesser {Target gets Fast Healing 1. + +School: Conjuration[Healing] +Casting: 1 action [V,S] +Range: Touch +Target: One living creature +Duration: 10 + 1 round/level, Save: None, SR: No} + +{5795} Vigor {Target gets Fast Healing 2. + +School: Conjuration[Healing] +Casting: 1 action [V,S] +Range: Touch +Target: One living creature +Duration: 10 + 1 round/level, Save: None, SR: No} + +{5796} Vigor, Greater {Target gets Fast Healing 4. + +School: Conjuration[Healing] +Casting: 1 action [V,S] +Range: Touch +Target: One living creature +Duration: 10 + 1 round/level, Save: None, SR: No} + // Additional spells added by Sagenlicht {6050} Sound Lance {Projectile of intense sonic energy that deals 1d8/level (max 10d8) sonic damage. @@ -855,3 +881,54 @@ Casting: 1 action [V,S] Range: Touch Target: One living creature Duration: 1 round/level, Save: Will negates, SR: Yes} + +{6174} Energized Shield Lesser {TDB! +School: Enchantment[Mind-Affecting] +Casting: 1 action [V,S] +Range: Touch +Target: One living creature +Duration: 1 round/level, Save: Will negates, SR: Yes} + +{6175} Energized Shield {TBD! +School: Enchantment[Mind-Affecting] +Casting: 1 action [V,S] +Range: Touch +Target: One living creature +Duration: 1 round/level, Save: Will negates, SR: Yes} + +{6176} Draconic Might {TBD! +School: Enchantment[Mind-Affecting] +Casting: 1 action [V,S] +Range: Touch +Target: One living creature +Duration: 1 round/level, Save: Will negates, SR: Yes} + +{6177} Vigor, Mass Lesser {Targets get Fast Healing 1. + +School: Conjuration[Healing] +Casting: 1 action [V,S] +Range: 20 ft. +Target: One living creature/2 two levels +Duration: 10 + 1 round/level(max 25), Save: None, SR: No} + +{6178} Vigor, Mass Improved {Targets get Fast Healing 3. + +School: Conjuration[Healing] +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} 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/stat_ext.mes b/tpdatasrc/tpgamefiles/mes/stat_ext.mes index 71e43bbf3..7f3c93b07 100644 --- a/tpdatasrc/tpgamefiles/mes/stat_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/stat_ext.mes @@ -65,6 +65,12 @@ // {82}{Fochlucan Lyrist} +{83}{Marshal} +{84}{Dragon Shaman} +{85}{Dragonheart Mage} +{86}{Battle Howler of Gruumsh} +{87}{Fist of the Forest} +{89}{Unseen Seer} {300}{Psi Points} // max {301}{Psi Points} // cur @@ -137,6 +143,12 @@ {1080}{Rkvn} {1081}{Ssnj} {1082}{Foch} +{1083}{Mrshl} +{1084}{DrgSh} +{1085}{DrgHrt} +{1086}{BtHwl} +{1087}{FiFo} +{1089}{UnSeer} @@ -323,6 +335,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. +} // Cannot Pick Class Short Help Goes in the range of 20007+ {20007} Arcane Archer{Arcane Archer requirements: 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 new file mode 100644 index 000000000..fe9ebce23 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/partsys/new_feats_partsys.tab @@ -0,0 +1,24 @@ +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 +ft-Axiomatic Strike 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 255 0 255 2 +ft-Fiery Fist burn perm 10 Node Pos bip01 r hand Sprite 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 0,30 0 -5?5 -5?5 -5?5 2?10 0 0 0?360 0 0 0,255,0 255 80 128 10 +ft-Fiery Fist burn perm 10 Node Pos bip01 l hand Sprite 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 0,30 0 -5?5 -5?5 -5?5 2?10 0 0 0?360 0 0 0,255,0 255 80 128 10 +ft-Fiery Ki Defense burn perm 10 Node Pos bip01 spine1 Sprite 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 0,30 0 -5?5 -5?5 -5?5 2?10 0 0 0?360 0 0 0,255,0 255 80 128 10 +ft-Fiery Ki Defense burn perm 10 Node Pos bip01 L calf Sprite 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 0,30 0 -5?5 -5?5 -5?5 2?10 0 0 0?360 0 0 0,255,0 255 80 128 10 +ft-Fiery Ki Defense burn perm 10 Node Pos bip01 R calf Sprite 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 0,30 0 -5?5 -5?5 -5?5 2?10 0 0 0?360 0 0 0,255,0 255 80 128 10 +ft-Freezing The Lifeblood 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 69 241 44 2 +ft-Freezing The Lifeblood 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 69 241 44 2 +ft-Freezing The Lifeblood-Hit sickColour perm 20 Node Pos bip01 Spine2 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 -10?10 -10?10 -10?10 8 0 0 0?360 0 0 0,255,128,64,0 51 0?202 0?16 9 +ft-Freezing The Lifeblood-Hit start 15 15 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 80,0 0 0 0?360 0 0 0,255,0 51 0?202 0?16 5 +ft-Freezing The Lifeblood-Hit L thigh perm 5 Node Pos bip01 L calf 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 -5?5 -5?5 -5?5 8 0 0 0?360 0 0 0,255,128,64,0 51 0?202 0?16 2 +ft-Freezing The Lifeblood-Hit R thigh perm 5 Node Pos bip01 R calf 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 -5?5 -5?5 -5?5 8 0 0 0?360 0 0 0,255,128,64,0 51 0?202 0?16 2 +ft-Ki Blast-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 64,0 200(1),255(2) 128(1),255(2) 0(1),255(2) +ft-Ki Blast-Hit ray time 15 45 Object Pos Sprite Polar flare-2 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?360 0?360 #radius 20,0 0 0 0?360 0 0 64,0 200(1),255(2) 128(1),255(2) 0(1),255(2) +ft-Ki Blast-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 64,0 200(1),255(2) 128(1),255(2) 0(1),255(2) +ft-Ki Blast-Hit bang start 15 15 World Sprite Polar flare-big 15 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 50?20 0 0 0?360 0 0 64,0 200(1),255(2) 128(1),255(2) 0(1),255(2) +ft-Ki Blast-proj Fire 0 Point perm 300 Object Pos Cartesian Polar Sprite World Polar Cartesian fire-sprite 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 40,0 0 0 0?360 64,0 200(1),255(2) 128(1),255(2) 0(1),255(2) 200 +ft-Stunning Fist 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-Stunning Fist 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 diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index e83823f68..cb8725238 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab @@ -12,6 +12,9 @@ sp-Axiomatic Storm-hit Blast 5 20 3 600 Sprite Polar flare-1 15 Add 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-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 @@ -59,6 +62,9 @@ sp-Fugue startup perm 150 Sprite Polar fire-sprite 60 Blend 0 0 0 0 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 hunters_eye 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 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 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 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 @@ -83,6 +89,9 @@ sp-Touch Of Madness vampire dribblins 90 10 Node Pos bip01 r hand Sprite P 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 sp-Undersong note1 0 0 1 Node Pos bip01 head Sprite World Polar Polar note1 140 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 40 2?10 0 0 160?200 0 0 0,255,200,150,100,50,0 255 155 112 1 +sp-Vigor other one 0 1 Sprite 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,300 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 181 234 201 -44 -235 41 30 +sp-Vigor Heart Flashes 0 1 Sprite 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,300 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 181 234 201 +sp-Vigor sparkles 1 30 60 Sprite 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,400 0 0?360 0 0?30 5,0 0 0 0 0 0 255,0 181 234 201 sp-Wave of Grief third circle 30 50 Object YPR Disc Same as Emitter Polar Ring-third 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 60 0 0 0 0 0 0 153 50 204 100 sp-Wave of Grief third circle 15 30 50 Object YPR Disc Same as Emitter Polar Ring-third 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 60 0 0 0 0 0 0 138 43 226 100 sp-Wave of Grief-hit ground boomin 5 30 10 Object YPR bip01 l foot Cartesian Disc World Cartesian Cartesian flare-3 20 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?60 #radius 0 0 0 0 0 64,32,0 153,138 50,43 204,226 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 9ff19742e..45dc37740 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,8 @@ +// Vigor Spell Fixes +{794}{Vigor, Lesser} +{795}{Vigor} +{796}{Vigor, Greater} + // Additional spells added by Sagenlicht {1050}{Sound Lance} @@ -120,7 +125,17 @@ {1171}{Storm of Elemental Fury} {1172}{Acid Fog} {1173}{Touch of Madness} +{1174}{Energized Shield, Lesser} +{1175}{Energized Shield} +{1176}{Draconic Might} +{1177}{Vigor, Mass Lesser} +{1178}{Vigor, Mass Improved} +{1179}{Sure Strike} +{1180}{Hunter's Eye} +{5794}{Vigor, Lesser} +{5795}{Vigor} +{5796}{Vigor, Greater} {6050}{Sound Lance} {6051}{Critical Strike} {6052}{Camouflage} @@ -241,7 +256,17 @@ {6171}{Storm of Elemental Fury} {6172}{Acid Fog} {6173}{Touch of Madness} +{6174}{Energized Shield, Lesser} +{6175}{Energized Shield} +{6176}{Draconic Might} +{6177}{Vigor, Mass Lesser} +{6178}{Vigor, Mass Improved} +{6179}{Sure Strike} +{6180}{Hunter's Eye} +{20794}{TAG_SPELLS_VIGOR,_LESSER} +{20795}{TAG_SPELLS_VIGOR} +{20796}{TAG_SPELLS_VIGOR,_GREATER} {21050}{TAG_SPELLS_SOUND_LANCE} {21051}{TAG_SPELLS_CRITICAL_STRIKE} {21052}{TAG_SPELLS_CAMOUFLAGE} @@ -362,3 +387,10 @@ {21171}{TAG_SPELLS_STORM_OF_ELEMENTAL_FURY} {21172}{TAG_SPELLS_ACID_FOG} {21173}{TAG_SPELLS_TOUCH_OF_MADNESS} +{21174}{TAG_SPELLS_ENERGIZED_SHIELD,_LESSER} +{21175}{TAG_SPELLS_ENERGIZED_SHIELD} +{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} diff --git a/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes b/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes index d43b91bca..e1d82e931 100644 --- a/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes +++ b/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes @@ -1384,3 +1384,58 @@ {29466}{} // spell projectile in-flight {29467}{} // spell hit {29468}{} // spell struck + +// [1174] *[Energized Shield Lesser] +{29480}{} // spell begin +{29481}{} // spell end +{29482}{} // spell effect +{29483}{} // spell new round +{29484}{} // spell projectile begin +{29485}{} // spell projectile end +{29486}{} // spell projectile in-flight +{29487}{} // spell hit +{29488}{} // spell struck + +// [1175] *[Energized Shield] +{29500}{} // spell begin +{29501}{} // spell end +{29502}{} // spell effect +{29503}{} // spell new round +{29504}{} // spell projectile begin +{29505}{} // spell projectile end +{29506}{} // spell projectile in-flight +{29507}{} // spell hit +{29508}{} // spell struck + +// [1176] *[Draconic Might] +{29520}{} // spell begin +{29521}{} // spell end +{29522}{} // spell effect +{29523}{} // spell new round +{29524}{} // spell projectile begin +{29525}{} // spell projectile end +{29526}{} // spell projectile in-flight +{29527}{} // spell hit +{29528}{} // spell struck + +// [1177] *[Vigor Mass Lesser] +{29540}{} // spell begin +{29541}{} // spell end +{29542}{spells\sp_cure_light.WAV} // spell effect +{29543}{} // spell new round +{29544}{} // spell projectile begin +{29545}{} // spell projectile end +{29546}{} // spell projectile in-flight +{29547}{} // spell hit +{29548}{} // spell struck + +// [1178] *[Vigor Mass Improved] +{29560}{} // spell begin +{29561}{} // spell end +{29562}{spells\sp_cure_moderate.WAV} // spell effect +{29563}{} // spell new round +{29564}{} // spell projectile begin +{29565}{} // spell projectile end +{29566}{} // spell projectile in-flight +{29567}{} // spell hit +{29568}{} // spell struck From 9b76b85de8fef2dbff34d7a9aa9660ecb49f1801 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 24 Jan 2022 10:13:24 +0100 Subject: [PATCH 028/146] Update constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index a25f58c6c..e5cd0db79 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3200,6 +3200,9 @@ spell_polar_ray = 586 spell_undeath_to_death = 587 spell_mass_hold_person = 588 +spell_vigor_lesser = 794 +spell_vigor = 795 +spell_vigor_greater = 796 spell_vacant = 802 spell_label_level_0 = 803 spell_label_level_1 = 804 @@ -3337,6 +3340,17 @@ spell_spikes = 1168 spell_tremor = 1169 spell_weapon_of_energy = 1170 +spell_storm_of_elemental_fury = 1171 +spell_acid_fog = 1172 +spell_touch_of_madness = 1173 +spell_energized_shield_lesser = 1174 +spell_energized_shield = 1175 +spell_draconic_might = 1176 +spell_vigor_mass_lesser = 1177 +spell_vigor_mass_improved = 1178 +spell_sure_strike = 1179 +spell_hunters_eye = 1180 + spell_inevitable_defeat = 1302 spell_kelgores_fire_bolt = 1303 spell_rouse = 1305 @@ -3358,6 +3372,109 @@ spell_new_slot_lvl_8 = 1613 spell_new_slot_lvl_9 = 1614 +# Python Action Spells +spell_epic_of_the_lost_king = 3080 +spell_ki_blast = 3120 + +#Dragon Disciple Breath Weapons +spell_dragon_diciple_cone_breath = 3231 +spell_dragon_diciple_line_breath = 3232 + +# Dragon Lineage Spell Like Abilities +spell_dragon_lineage_black = 3242 +spell_dragon_lineage_blue = 3243 +spell_dragon_lineage_brass = 3244 +spell_dragon_lineage_bronze = 3245 +spell_dragon_lineage_copper = 3246 +spell_dragon_lineage_gold = 3247 +spell_dragon_lineage_green = 3248 +spell_dragon_lineage_red = 3249 +spell_dragon_lineage_silver = 3250 +spell_dragon_lineage_white = 3251 + +# Marshal Spells +spell_marshal_minor_aura = 3831 +spell_marshal_major_aura = 3832 +spell_marshal_adrenaline_boost = 3833 + +# Dragon Shaman Spells +spell_draconic_aura = 3840 +spell_double_draconic_aura = 3841 + +# Draconic Feats Spells +spell_draconic_breath_cone = 3850 +spell_draconic_breath_line = 3851 + +# Dummy Spells for Python Actions +spell_dummy_spell_cone_small = 3900 +spell_dummy_spell_cone_medium = 3901 +spell_dummy_spell_cone_large = 3902 +spell_dummy_spell_line_small = 3903 +spell_dummy_spell_line_medium = 3904 +spell_dummy_spell_line_large = 3905 + +# Dragon Breath Shapes +dragon_breath_shape_cone = 1 +dragon_breath_shape_line = 2 + +# Heritage Types +heritage_draconic_black = 1 +heritage_draconic_blue = 2 +heritage_draconic_brass = 3 +heritage_draconic_bronze = 4 +heritage_draconic_copper = 5 +heritage_draconic_gold = 6 +heritage_draconic_green = 7 +heritage_draconic_red = 8 +heritage_draconic_silver = 9 +heritage_draconic_white = 10 +heritage_celestial_sorcerer = 11 +heritage_fey = 12 +heritage_fiendish = 13 +heritage_infernal_sorcerer = 14 + +# Aura Types +aura_type_minor = 1 +aura_type_major = 2 +aura_type_draconic = 3 +aura_type_double_draconic = 4 + +#Aura Enums +aura_accurate_strike = 1 +aura_art_of_war = 2 +aura_Demand_fortitude = 3 +aura_Determined_caster = 4 +aura_force_of_will = 5 +aura_master_of_opportunity = 6 +aura_master_of_tactics = 7 +aura_motivate_charisma = 8 +aura_motivate_constitution = 9 +aura_motivate_dexterity = 10 +aura_motivate_intelligence = 11 +aura_motivate_strength = 12 +aura_motivate_wisdom = 13 +aura_over_the_top = 14 +aura_watchful_eye = 15 +aura_hardy_soldiers = 16 +aura_motivate_ardor = 17 +aura_motivate_attack = 18 +aura_motivate_care = 19 +aura_motivate_urgency = 20 +aura_resilient_troops = 21 +aura_steady_hand = 22 +aura_energy_shield = 23 +aura_power = 24 +aura_presence = 25 +aura_resistance = 26 +aura_senses = 27 +aura_toughness = 28 +aura_vigor = 29 +aura_break_spell_resistance = 30 +aura_energy = 31 +aura_insight = 32 +aura_resolve = 33 +aura_stamina = 34 +aura_swiftness =35 stat_strength = 0 stat_dexterity = 1 @@ -3438,6 +3555,11 @@ stat_level_shadow_sun_ninja = 81 stat_level_fochlucan_lyrist = 82 stat_level_marshal = 83 +stat_level_dragon_shaman = 84 +stat_level_dragonheart_mage = 85 +stat_level_battle_howler_of_gruumsh = 86 +stat_level_fist_of_the_forest = 87 +stat_level_unseen_seer = 89 @@ -4088,6 +4210,9 @@ AEC_NO_ACTIONS = 24 AEC_NOT_IN_COMBAT = 25 AEC_AREA_NOT_SAFE = 26 +AEC_ABILITY_ON_COOLDOWN = 27 +AEC_ALREADY_USED_THIS_TURN = 28 +AEC_ALREADY_ACTIVE = 29 BM_INSPIRE_COURAGE = 1 From bca6ad3d8ef5505c48fc1dd270798a86900c1015 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 24 Jan 2022 10:29:52 +0100 Subject: [PATCH 029/146] added spell Tactical Precision --- tpdata/templeplus/lib/templeplus/constants.py | 1 + tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab | 1 + .../tpgamefiles/mes/spell_ext/spell_compendium_spell.mes | 2 ++ .../spell_compendium_spell_long_descriptions.mes | 7 +++++++ .../rules/spell_enums/spell_compendium_spell_enum.mes | 3 +++ 5 files changed, 14 insertions(+) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index e5cd0db79..3dd1e86b0 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3350,6 +3350,7 @@ spell_vigor_mass_improved = 1178 spell_sure_strike = 1179 spell_hunters_eye = 1180 +spell_tactical_precision = 1181 spell_inevitable_defeat = 1302 spell_kelgores_fire_bolt = 1303 diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index a619760e6..453ed7063 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -103,6 +103,7 @@ TAG_SPELLS_SUMMON_UNDEAD_III TAG_SPELLS TAG_BLACKGUARD_3 TAG_CLERIC_3 TAG_SORCE 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/spell_ext/spell_compendium_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes index 04d7b9f9a..8bab5349a 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes @@ -133,6 +133,7 @@ {1178}{Vigor, Mass Improved} {1179}{Sure Strike} {1180}{Hunter's Eye} +{1181}{Tactical Precision} // Spell Descriptions {5794}Vigor, Lesser {[Conjuration] Fast Healing 1 for 10 +1/level rounds, max 15.} @@ -265,3 +266,4 @@ {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.} 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 c7fb7fcf3..9b6ff3543 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 @@ -932,3 +932,10 @@ 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} 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 45dc37740..c85194913 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes @@ -132,6 +132,7 @@ {1178}{Vigor, Mass Improved} {1179}{Sure Strike} {1180}{Hunter's Eye} +{1181}{Tactical Precision} {5794}{Vigor, Lesser} {5795}{Vigor} @@ -263,6 +264,7 @@ {6178}{Vigor, Mass Improved} {6179}{Sure Strike} {6180}{Hunter's Eye} +{6181}{Tactical Precision} {20794}{TAG_SPELLS_VIGOR,_LESSER} {20795}{TAG_SPELLS_VIGOR} @@ -394,3 +396,4 @@ {21178}{TAG_SPELLS_VIGOR,_MASS_IMPROVED} {21179}{TAG_SPELLS_SURE_STRIKE} {21180}{TAG_SPELLS_HUNTER'S_EYE} +{21181}{TAG_SPELLS_TACTICAL_PRECISION} From 21e1542675d9d1b5a759f6e5b84197dee4528136 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 24 Jan 2022 11:07:20 +0100 Subject: [PATCH 030/146] added spell_utils to admin files --- tpdatasrc/tpgamefiles/scr/spell_utils.py | 208 ++++++++++++++++++++++- 1 file changed, 207 insertions(+), 1 deletion(-) diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 1414dab1f..1114a80fa 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -11,6 +11,9 @@ def spellName(spellId): def spellKeyName(spellId): return spellName(spellId).upper().replace(" ", "_") +def spellTag(spellId): + return "TAG_SPELLS_{}".format(spellKeyName(spellId)) + def spellKey(spellId): return tpdp.hash(spellKeyName(spellId)) @@ -92,6 +95,14 @@ def queryActiveSpell(attachee, args, evt_obj): evt_obj.return_val = 1 return 0 +def querySpellCondition(attachee, args, evt_obj): + queryConditionRef = evt_obj.data1 + conditionName = args.get_cond_name() + spellConditionRef = tpdp.get_condition_ref(conditionName) + if queryConditionRef == spellConditionRef: + evt_obj.return_val = 1 + return 0 + #[pytonModifier].AddHook(ET_OnD20Signal, EK_S_Killed, spell_utils.spellKilled, ()) def spellKilled(attachee, args, evt_obj): args.remove_spell() @@ -156,7 +167,6 @@ def countAfterConcentration(attachee, args, evt_obj): #Used to replace same condition to prevent duplicates def replaceCondition(attachee, args, evt_obj): conditionName = args.get_cond_name() - #if evt_obj.is_modifier("{}".format(conditionName)): if evt_obj.is_modifier(conditionName): args.remove_spell() args.remove_spell_mod() @@ -240,6 +250,51 @@ def verifyItem(item, args): return item_loc == target_loc +# getItemObj, itemTooltip and itemEffectTooltip are needed for +# buff tooltip icon handling +def getItemObj(attachee, args): + itemLocation = args.get_arg(2) + if itemLocation == 203: #mainhand + item = attachee.item_worn_at(item_wear_weapon_primary) + itemWornAt = "mainhand" + elif itemLocation == 204: #offhand + item = attachee.item_worn_at(item_wear_weapon_secondary) + itemWornAt = "offhand" + elif itemLocation == 205: #armor + item = attachee.item_worn_at(item_wear_armor) + itemWornAt = "" + elif itemLocation == 211: #shield + item = attachee.item_worn_at(item_wear_shield) + itemWornAt = "" + return item, itemWornAt + +def itemTooltip(attachee, args, evt_obj): + item, itemWornAt = getItemObj(attachee, args) + spellId = args.get_arg(4) + durationQuery = item.d20_query_with_data("PQ_Item_Buff_Duration", spellId, 0) + if durationQuery: + duration = spellTime(durationQuery) + if args.get_param(0): + name = game.get_spell_mesline(args.get_param(0)) + else: + name = spellName(spellId) + evt_obj.append("{}({}) ({})".format(name, itemWornAt, duration)) + return 0 + +def itemEffectTooltip(attachee, args, evt_obj): + item, itemWornAt = getItemObj(attachee, args) + spellId = args.get_arg(4) + durationQuery = item.d20_query_with_data("PQ_Item_Buff_Duration", spellId, 0) + if durationQuery: + duration = spellTime(durationQuery) + if args.get_param(0): + name = game.get_spell_mesline(args.get_param(0)).upper().replace(" ", "_") + key = tpdp.hash(name) + else: + key = spellKey(spellId) + evt_obj.append(key, -2, "({}) ({})".format(itemWornAt, duration)) + return 0 + ### Utilities for defining touch attacks with held charge ### # Keys off 'SPELL_NAME_CHARGE' so that a buff indicator for the holding @@ -421,3 +476,154 @@ def __init__(self, name, argn): def AddTouchHook(self, hook): self.AddHook(ET_OnD20Signal, EK_S_TouchAttack, hook, ()) + +######## Spell Python Modifier classes ######## + +### Standard Spell Condition Modifier ### + +class SpellPythonModifier(PythonModifier): + #SpellPythonModifier have at least 3 arguments: + #spellId, duration, 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, spell_utils.addDismiss, ()) + self.AddHook(ET_OnD20Signal, EK_S_Dismiss_Spells, checkRemoveSpell, ()) + def AddSpellNoDuplicate(self): + self.AddHook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) + +### Aoe Modifier Classes ### +def addAoeObjToSpellRegistry(attachee, args, evt_obj): + spellPacket = tpdp.SpellPacket(args.get_arg(0)) + conditionName = args.get_cond_name() + particlesId = game.particles(conditionName, attachee) + spellPacket.add_spell_object(attachee, particlesId) + spellPacket.update_registry() + return 0 + +def aoeOnEnter(attachee, args, evt_obj): + print "aoeOnEnter Hook" + spellId = args.get_arg(0) + duration = args.get_arg(1) + spellDc = args.get_arg(2) + spellEventId = args.get_arg(3) + spellPacket = tpdp.SpellPacket(spellId) + spellTarget = evt_obj.target + print "spellTarget: {}".format(spellTarget) + + if spellEventId != evt_obj.evt_id: + return 0 + elif spellTarget == OBJ_HANDLE_NULL: + return 0 + elif attachee == OBJ_HANDLE_NULL: + return 0 + #elif spellTarget == attachee: + # return 0 + elif spellPacket.check_spell_resistance(spellTarget): + return 0 + + spellPacket.trigger_aoe_hit() + + conditionName = args.get_cond_name() + 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) + spellPacket.update_registry() + return 0 + +def aoehandleRemoveActions(attachee, args, evt_obj): + spellId = args.get_arg(0) + spellPacket = tpdp.SpellPacket(spellId) + spellMesId = 20000 # ID 20000 = A spell has expired. + if spellPacket.spell_enum == 0: + return 0 + spellTargetCount = 0 + while spellTargetCount < spellPacket.target_count: + spellTarget = spellPacket.get_target(spellTargetCount) + spellTarget.d20_send_signal(S_Spell_End, spellId) + spellTarget.float_mesfile_line('mes\\spell.mes', spellMesId) + spellTargetCount += 1 + return 0 + +def aoeCombatEndSignal(attachee, args, evt_obj): + args.set_arg(1, -1) + return 0 + +def aoeOnLeave(attachee, args, evt_obj): + spellId = args.get_arg(0) + spellPacket = tpdp.SpellPacket(spellId) + spellEventId = args.get_arg(3) + + if spellEventId != evt_obj.evt_id: + return 0 + + spellPacket.end_target_particles(attachee) + spellPacket.remove_target(attachee) + args.remove_spell_mod() + return 0 + +def aoeSpellEndSignal(attachee, args, evt_obj): + spellId = args.get_arg(0) + if spellId == evt_obj.data1: + spellPacket = tpdp.SpellPacket(spellId) + spellPacket.end_target_particles(attachee) + spellPacket.remove_target(attachee) + spellPacket.update_registry() + args.remove_spell_mod() + return 0 + +def aoeEffectTickdown(attachee, args, evt_obj): + #This is only done, so the Tooltip can show the duration + #Actual spell end is handled by the AoeSpellHandlerModifier + duration = args.get_arg(1) + duration -= evt_obj.data1 + args.set_arg(1, duration) + return 0 + +class AoeSpellHandleModifier(PythonModifier): + #AoeSpellHandlerModifier have at least 5 arguments: + #spellId, duration, spellDc, spellEventId, empty + def __init__(self, name, args = 5, preventDuplicate = False): + PythonModifier.__init__(self, name, args, preventDuplicate) + self.AddHook(ET_OnConditionAdd, EK_NONE, addAoeObjToSpellRegistry, ()) + self.AddHook(ET_OnObjectEvent, EK_OnEnterAoE, aoeOnEnter, ()) + self.AddHook(ET_OnD20Query, EK_Q_Critter_Has_Spell_Active, queryActiveSpell, ()) + self.AddHook(ET_OnD20Signal, EK_S_Combat_End, aoeCombatEndSignal, ()) + #self.AddHook(ET_OnConditionRemove, EK_NONE, aoehandleRemoveActions, ()) + self.AddSpellDispelCheckStandard() + self.AddSpellTeleportPrepareStandard() + self.AddSpellTeleportReconnectStandard() + self.AddSpellCountdownStandardHook() + self.AddAoESpellEndStandardHook() + +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_OnBeginRound, EK_NONE, aoeEffectTickdown, ()) + 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() From f520e382751ca5c64bd86977827ec09686fc7996 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 24 Jan 2022 11:40:05 +0100 Subject: [PATCH 031/146] Updated helpTag Handling --- tpdata/tpmes/bonus.mes | 17 ++++++++++++++++- tpdatasrc/tpgamefiles/mes/bonus_description.mes | 6 ++++++ tpdatasrc/tpgamefiles/mes/damage_ext.mes | 1 + tpdatasrc/tpgamefiles/scr/spell_utils.py | 3 +++ 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 tpdatasrc/tpgamefiles/mes/bonus_description.mes diff --git a/tpdata/tpmes/bonus.mes b/tpdata/tpmes/bonus.mes index 52f1ed85d..f2f0f80ce 100644 --- a/tpdata/tpmes/bonus.mes +++ b/tpdata/tpmes/bonus.mes @@ -12,4 +12,19 @@ {346}{Weapon of Speed} {347}{~Seeking Weapon~[TAG_WEAPON_SEEKING]} {348}{Bardic Music - Inspire Heroics} -{349}{Hiding in Combat} \ No newline at end of file +{349}{Hiding in Combat} + +{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/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes new file mode 100644 index 000000000..7bf08b20e --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/bonus_description.mes @@ -0,0 +1,6 @@ +// Bonus Descriptions +// Added by Sagenlicht +// WIP + +{18}{~Insight~[TAG_MODIFIER_INSIGHT]} +{19}{~Concealment~[TAG_CONCEALMENT]} diff --git a/tpdatasrc/tpgamefiles/mes/damage_ext.mes b/tpdatasrc/tpgamefiles/mes/damage_ext.mes index 628aad7fe..0dfba3117 100644 --- a/tpdatasrc/tpgamefiles/mes/damage_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/damage_ext.mes @@ -13,6 +13,7 @@ {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]} // Feat Damage effects {4000}{~Flying Kick~[TAG_FLYING_KICK]} diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 1114a80fa..b58f643f6 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -17,6 +17,9 @@ def spellTag(spellId): def spellKey(spellId): return tpdp.hash(spellKeyName(spellId)) +def getSpellHelpTag(spellId): + return "~{}~[{}]".format(spellName(spellId), spellTag(spellId)) + def spellTime(duration): if duration == 1: return "1 round" From c0ea4ec0da558a6ecd4d77532dbd63f52bebd094 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 24 Jan 2022 12:36:22 +0100 Subject: [PATCH 032/146] Update bonus_description.mes --- .../tpgamefiles/mes/bonus_description.mes | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes index 7bf08b20e..626406cd8 100644 --- a/tpdatasrc/tpgamefiles/mes/bonus_description.mes +++ b/tpdatasrc/tpgamefiles/mes/bonus_description.mes @@ -1,6 +1,34 @@ // Bonus Descriptions // Added by Sagenlicht + +// Stacking bonus types (0, 8 and 21) can appear more than once +// to avoid stacking from the same source +// example: Focusing Chant grants a Circumstance Bonus (type 21 and stacking) +// to avoid to stack with itself, it actually uses bonus type 159 internally +// to stack with everything but itself. Still this bonus will be displayed +// as Circumstance Bonus in the game to avoid confusion about its bonus type + // WIP +// Vanilla Bonus Types + +{0}{} // Untyped, STACKING +{8}{~Dodge~[TAG_DODGE]} // STACKING +{10}{~Natural Armor~[TAG_MODIFIER_NATURAL_ARMOR]} // This is not clean, as Bonus Type 9 also seems to be used for Natural Armor +{11}{~Deflection~[TAG_DEFLECTION_BONUS]} +{12}{~Enhancement~[TAG_ENHANCEMENT_BONUS]} +{13}{~Morale~[TAG_MODIFIER_MORALE]} +{14}{~Luck~[TAG_MODIFIER_LUCK]} +{15}{~Resistance~[TAG_MODIFIER_RESISTANCE]} // There are some vanilla code problems with this type +{17}{~Sacred~[TAG_MODIFIER_SACRED]} // I think this is the vanilla Sacred bonus type (only used by the Consecrate spell) {18}{~Insight~[TAG_MODIFIER_INSIGHT]} {19}{~Concealment~[TAG_CONCEALMENT]} +{21}{~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} + +// Bonus Type 20 is used for enlarge and reduce person spells (bonus for attributes) + +// Bonus Types added by Sagenlicht + +{151}{~Alchemical~[TAG_MODIFIER_ALCHEMICAL]} +{154}{~Profane~[TAG_MODIFIER_PROFANE]} +{159}{~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} // Focusing Chant Spell, to avoid stacking with itself From 97d14f1e414810ebb496cd36569888b2e5817de8 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 25 Jan 2022 11:35:05 +0100 Subject: [PATCH 033/146] More work on bonus type handling * Added Bonus Types to constants.py(WiP) * Added Bonus Type Size to modifiers help file * Updated bonus_description.mes --- tpdata/templeplus/lib/templeplus/constants.py | 19 +++++++++++++++++++ .../tpgamefiles/mes/bonus_description.mes | 6 +++--- tpdatasrc/tpgamefiles/mes/help/modifiers.tab | 1 + 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 3dd1e86b0..ed57dbf7a 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3477,6 +3477,25 @@ aura_stamina = 34 aura_swiftness =35 +#Bonus Types (aka modifiers) +bonus_type_untyped = 0 +bonus_type_dodge = 8 +bonus_type_natural_armor = 10 +bonus_type_deflection = 11 +bonus_type_enhancement = 12 +bonus_type_morale = 13 +bonus_type_luck = 14 +bonus_type_resistance = 15 +bonus_type_sacred = 16 +bonus_type_insight = 18 +bonus_type_concealment = 19 +bonus_type_size = 20 +bonus_type_circumstance = 21 +bonus_type_alchemical = 151 +bonus_type_profane = 154 +bonus_type_focusing_chant = 159 + + stat_strength = 0 stat_dexterity = 1 stat_constitution = 2 diff --git a/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes index 626406cd8..79c1b639a 100644 --- a/tpdatasrc/tpgamefiles/mes/bonus_description.mes +++ b/tpdatasrc/tpgamefiles/mes/bonus_description.mes @@ -12,7 +12,7 @@ // Vanilla Bonus Types -{0}{} // Untyped, STACKING +{0}{Untyped} // Untyped, STACKING {8}{~Dodge~[TAG_DODGE]} // STACKING {10}{~Natural Armor~[TAG_MODIFIER_NATURAL_ARMOR]} // This is not clean, as Bonus Type 9 also seems to be used for Natural Armor {11}{~Deflection~[TAG_DEFLECTION_BONUS]} @@ -23,9 +23,9 @@ {17}{~Sacred~[TAG_MODIFIER_SACRED]} // I think this is the vanilla Sacred bonus type (only used by the Consecrate spell) {18}{~Insight~[TAG_MODIFIER_INSIGHT]} {19}{~Concealment~[TAG_CONCEALMENT]} -{21}{~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} +{20}{~Size~[TAG_MODIFIER_SIZE]} // Bonus Type 20 is used for enlarge and reduce person spells +{21}{~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} //STACKING -// Bonus Type 20 is used for enlarge and reduce person spells (bonus for attributes) // Bonus Types added by Sagenlicht diff --git a/tpdatasrc/tpgamefiles/mes/help/modifiers.tab b/tpdatasrc/tpgamefiles/mes/help/modifiers.tab index 3cdb41c79..20acc9a9d 100644 --- a/tpdatasrc/tpgamefiles/mes/help/modifiers.tab +++ b/tpdatasrc/tpgamefiles/mes/help/modifiers.tab @@ -8,4 +8,5 @@ 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. From e58d0f2a48ee9597edec26d74874dbd5434ce438 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 25 Jan 2022 19:13:33 +0100 Subject: [PATCH 034/146] Update constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index ed57dbf7a..6d97f994a 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3493,6 +3493,7 @@ bonus_type_circumstance = 21 bonus_type_alchemical = 151 bonus_type_profane = 154 +bonus_type_undersong = 157 bonus_type_focusing_chant = 159 From b48eb2f13e15b31fbac6949628ee79d967e93e39 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 26 Jan 2022 10:09:16 +0100 Subject: [PATCH 035/146] Update spell_compendium_partsys.tab --- .../tpgamefiles/rules/partsys/spell_compendium_partsys.tab | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index cb8725238..3883d02d9 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab @@ -62,7 +62,7 @@ sp-Fugue startup perm 150 Sprite Polar fire-sprite 60 Blend 0 0 0 0 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 hunters_eye 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 0 0 40 0 0 180 0 0 0,192,0 138,0 3,0 3,0 1 +sp-Hunter's Eye eyes perm 1 Node Pos bip01 head Sprite 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 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 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 @@ -85,6 +85,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 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 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 0,192,0 0,138 0,3 0,3 20 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 From 37025432a405b59cd14388accf3e05ae19b184de Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 26 Jan 2022 10:57:19 +0100 Subject: [PATCH 036/146] Update spell_compendium_partsys.tab --- .../rules/partsys/spell_compendium_partsys.tab | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index 3883d02d9..61fac1985 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab @@ -62,9 +62,9 @@ sp-Fugue startup perm 150 Sprite Polar fire-sprite 60 Blend 0 0 0 0 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 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 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 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 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 @@ -85,8 +85,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 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 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 0,192,0 0,138 0,3 0,3 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 From e7e56477f6716b48f22d68edcb0d9ef1b15e7a4c Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 27 Jan 2022 10:02:49 +0100 Subject: [PATCH 037/146] Update constants.py * Added bonus_type_draconic_aura --- tpdata/templeplus/lib/templeplus/constants.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 6d97f994a..92d0a49d4 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3495,6 +3495,7 @@ bonus_type_profane = 154 bonus_type_undersong = 157 bonus_type_focusing_chant = 159 +bonus_type_draconic_aura = 190 stat_strength = 0 From 4ef9d820d741b4a56826b5701befc15d3470045c Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sat, 29 Jan 2022 12:22:11 +0100 Subject: [PATCH 038/146] Update constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 92d0a49d4..10597a895 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3495,7 +3495,9 @@ bonus_type_profane = 154 bonus_type_undersong = 157 bonus_type_focusing_chant = 159 -bonus_type_draconic_aura = 190 +bonus_type_marshal_aura_minor = 190 +bonus_type_marshal_aura_major = 191 +bonus_type_draconic_aura = 192 stat_strength = 0 From c0723fcde7f951a575938725980adcc876c3df95 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sat, 29 Jan 2022 15:34:52 +0100 Subject: [PATCH 039/146] Added AEC_SILENCED --- tpdata/templeplus/lib/templeplus/constants.py | 1 + tpdatasrc/tpgamefiles/mes/action_ext.mes | 1 + 2 files changed, 2 insertions(+) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 10597a895..56af30d58 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -4237,6 +4237,7 @@ AEC_ABILITY_ON_COOLDOWN = 27 AEC_ALREADY_USED_THIS_TURN = 28 AEC_ALREADY_ACTIVE = 29 +AEC_SILENCED = 30 BM_INSPIRE_COURAGE = 1 diff --git a/tpdatasrc/tpgamefiles/mes/action_ext.mes b/tpdatasrc/tpgamefiles/mes/action_ext.mes index 6dc08f6fb..195713d33 100644 --- a/tpdatasrc/tpgamefiles/mes/action_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/action_ext.mes @@ -3,3 +3,4 @@ {1027}{Ability on Cooldown} {1028}{Already used this turn} {1029}{Already active!} +{1030}{Silenced!} From 2efd1a955d848f1adb1cf95221d78aee36a523f1 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sun, 30 Jan 2022 11:53:47 +0100 Subject: [PATCH 040/146] Update spell_utils.py added a getSpellClassCode function to spell_utils --- tpdatasrc/tpgamefiles/scr/spell_utils.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index b58f643f6..a64eb9ebd 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -232,6 +232,13 @@ def checkCategoryType(critter, *args): return True return False +##### workaround getSpellClassCode ##### +def getSpellClassCode(classEnum): + dummySpellData = tpdp.D20SpellData() + dummySpellData.set_spell_class(classEnum) + return dummySpellData.spell_class +##### workaround getSpellClassCode ##### + ### Item Condition functions # An item condition is a condition that should be applied to a From ac2ac34244e2927e8a9f66fb427507df14e498f2 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sun, 30 Jan 2022 17:15:45 +0100 Subject: [PATCH 041/146] Update new_classes_help.tab added Unseen Seer help entries --- tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab b/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab index 95a900557..0d72cd810 100644 --- a/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab @@ -74,3 +74,12 @@ TAG_CLASS_FEATURES_STORMLORD_SHOCK_WEAPONS TAG_STORMLORDS Stormlord Shock Weap 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!! From 549396ba5432c8464d39300b62ba63a2835dc509 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 1 Feb 2022 11:36:44 +0100 Subject: [PATCH 042/146] Added new orb spells *Added all lesser orb and normal orb spells from the Spell Compendium *Updated Spell Overview help to include Warmage (WiP) *Updated old help file entries to include Warmage in the description --- tpdata/templeplus/lib/templeplus/constants.py | 20 ++ .../co8infra/mes/help/class_spell_lists.tab | 38 ++- .../mes/help/spell_compendium_help.tab | 10 + .../mes/spell_ext/spell_compendium_spell.mes | 38 +++ ...ell_compendium_spell_long_descriptions.mes | 70 +++++ .../partsys/spell_compendium_partsys.tab | 21 ++ .../spell_compendium_spell_enum.mes | 57 +++++ .../user_sounds/spell_compendium_sounds.mes | 242 ++++++++++++++++++ 8 files changed, 491 insertions(+), 5 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 56af30d58..782ff5af4 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3351,6 +3351,26 @@ spell_sure_strike = 1179 spell_hunters_eye = 1180 spell_tactical_precision = 1181 +spell_accuracy = 1182 +spell_hail_of_stone = 1183 +spell_lesser_orb_of_acid = 1184 +spell_lesser_orb_of_cold = 1185 +spell_lesser_orb_of_electricity = 1186 +spell_lesser_orb_of_fire = 1187 +spell_lesser_orb_of_sound = 1188 +spell_blades_of_fire = 1189 +spell_fireburst = 1190 +spell_greater_fireburst = 1191 +spell_ice_knife = 1192 +spell_whirling_blade = 1193 +spell_ring_of_blades = 1194 +spell_blast_of_flame = 1195 +spell_orb_of_acid = 1196 +spell_orb_of_cold = 1197 +spell_orb_of_electricity = 1198 +spell_orb_of_fire = 1199 +spell_orb_of_sound = 1200 + spell_inevitable_defeat = 1302 spell_kelgores_fire_bolt = 1303 diff --git a/tpdatasrc/co8infra/mes/help/class_spell_lists.tab b/tpdatasrc/co8infra/mes/help/class_spell_lists.tab index 5d9dcc454..bea1a1636 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] 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,24 @@ 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_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 +35,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/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 453ed7063..9618012b3 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -70,6 +70,11 @@ 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 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 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 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 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 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_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. @@ -77,6 +82,11 @@ TAG_SPELLS_NAUSEATING_BREATH TAG_SPELLS TAG_CLERIC_3 TAG_SORCERER_3 TAG_WIZARD_ 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_ORB_OF_ACID TAG_SPELLS TAG_SORCERER_4 TAG_WIZARD_4 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 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 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 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 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). diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes index 8bab5349a..cd2bfaa82 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes @@ -134,6 +134,25 @@ {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} // Spell Descriptions {5794}Vigor, Lesser {[Conjuration] Fast Healing 1 for 10 +1/level rounds, max 15.} @@ -267,3 +286,22 @@ {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.} 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 9b6ff3543..a6cae3884 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 @@ -939,3 +939,73 @@ 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} diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index 61fac1985..ba5872a62 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab @@ -69,8 +69,29 @@ sp-Ironthunder Horn shockwave 40 150 Object YPR Sprite Same as Emitter Pol 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 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 c85194913..e374f4db5 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes @@ -133,6 +133,25 @@ {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} {5794}{Vigor, Lesser} {5795}{Vigor} @@ -265,6 +284,25 @@ {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} {20794}{TAG_SPELLS_VIGOR,_LESSER} {20795}{TAG_SPELLS_VIGOR} @@ -397,3 +435,22 @@ {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} diff --git a/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes b/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes index e1d82e931..3d7d4ce58 100644 --- a/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes +++ b/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes @@ -1439,3 +1439,245 @@ {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 From a585198c8f0edbb7d1af6e54a5100e7cef26c148 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 1 Feb 2022 22:49:38 +0100 Subject: [PATCH 043/146] Fixed Tagging Error in spell_help --- .../mes/help/spell_compendium_help.tab | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 9618012b3..7bd6d9feb 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -70,11 +70,11 @@ 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 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 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 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 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 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_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_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. @@ -82,11 +82,11 @@ TAG_SPELLS_NAUSEATING_BREATH TAG_SPELLS TAG_CLERIC_3 TAG_SORCERER_3 TAG_WIZARD_ 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_ORB_OF_ACID TAG_SPELLS TAG_SORCERER_4 TAG_WIZARD_4 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 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 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 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 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_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). From 0aa968066acd209715871d67b8b397d8c67864de Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 2 Feb 2022 11:54:03 +0100 Subject: [PATCH 044/146] Update spell_compendium_help.tab --- tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 7bd6d9feb..7016cb741 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -1,4 +1,5 @@ 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_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! @@ -8,6 +9,7 @@ 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_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. @@ -48,12 +50,14 @@ TAG_SPELLS_FAITH_HEALING TAG_SPELLS TAG_BLACKGUARD_1 TAG_CLERIC_1 TAG_PALADIN_1 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_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]. From f46deb6d5193df9dab92902221ecfbc4a224ce83 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 2 Feb 2022 12:07:49 +0100 Subject: [PATCH 045/146] Update spell_compendium_partsys.tab Added Firebust + Greater Fireburst particles --- .../tpgamefiles/rules/partsys/spell_compendium_partsys.tab | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index ba5872a62..683cdcd02 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab @@ -55,10 +55,14 @@ sp-Focusing Chant note 2 0 perm 3 Node Pos bip01 head Sprite World Polar Pol 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-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 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-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-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 From b9ff2478ed4734d0bed3b7812637cf93c47950fa Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 2 Feb 2022 12:32:56 +0100 Subject: [PATCH 046/146] Update damage_ext.mes added Blades of Fire Spell --- tpdatasrc/tpgamefiles/mes/damage_ext.mes | 1 + 1 file changed, 1 insertion(+) diff --git a/tpdatasrc/tpgamefiles/mes/damage_ext.mes b/tpdatasrc/tpgamefiles/mes/damage_ext.mes index 0dfba3117..8c2b9c6a4 100644 --- a/tpdatasrc/tpgamefiles/mes/damage_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/damage_ext.mes @@ -14,6 +14,7 @@ {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]} From 4d8d632a89e573b9739c4f1c816843f69c44620e Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 3 Feb 2022 12:04:45 +0100 Subject: [PATCH 047/146] Added Hail of Stone and Blast of Flame to Help and partsys --- .../tpgamefiles/mes/help/spell_compendium_help.tab | 2 ++ .../rules/partsys/spell_compendium_partsys.tab | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 7016cb741..106b23553 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -11,6 +11,7 @@ TAG_SPELLS_AWAKEN_SIN TAG_SPELLS TAG_CLERIC_3 TAG_PALADIN_2 Awaken Sin ~Enchant 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. @@ -58,6 +59,7 @@ TAG_SPELLS_FUGUE TAG_SPELLS TAG_BARD_4 Fugue ~Evocation~[TAG_MAGIC_SCHOOLS_EVOC 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]. diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index 683cdcd02..45a0e34d0 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab @@ -11,6 +11,8 @@ 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-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 @@ -63,6 +65,16 @@ sp-Fugue Earth grumbling perm 150 Sprite Polar fire-sprite 60 Blend 0 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-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 From a1311c93ad65bb5376c77ad31d7216a0abf7019e Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 3 Feb 2022 21:39:32 +0100 Subject: [PATCH 048/146] Added Evards Black Tentacles --- .../mes/spell_ext/spell_compendium_spell.mes | 10 +++++++--- .../rules/spell_enums/spell_compendium_spell_enum.mes | 5 +++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes index cd2bfaa82..9596144d6 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} @@ -155,9 +158,10 @@ {1200}{Orb of Sound} // 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.} 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 e374f4db5..1763b86c8 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} @@ -153,6 +156,7 @@ {1199}{Orb of Fire} {1200}{Orb of Sound} +{5158}{Evard's Black Tentacles} {5794}{Vigor, Lesser} {5795}{Vigor} {5796}{Vigor, Greater} @@ -304,6 +308,7 @@ {6199}{Orb of Fire} {6200}{Orb of Sound} +{20158}{TAG_SPELLS_EVARD'S_BLACK_TENTACLES} {20794}{TAG_SPELLS_VIGOR,_LESSER} {20795}{TAG_SPELLS_VIGOR} {20796}{TAG_SPELLS_VIGOR,_GREATER} From e8e2229554b4cfeb3c9ef65407d78ca2e2fb3041 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sat, 5 Feb 2022 12:11:33 +0100 Subject: [PATCH 049/146] Update constants.py Added bonus_types for abilities --- tpdata/templeplus/lib/templeplus/constants.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 782ff5af4..7bd8e6fd0 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3499,6 +3499,12 @@ #Bonus Types (aka modifiers) bonus_type_untyped = 0 +bonus_type_stat_strength = 2 +bonus_type_stat_dexterity = 3 +bonus_type_stat_constitution = 4 +bonus_type_stat_intelligence = 5 +bonus_type_stat_wisdom = 6 +bonus_type_stat_charisma = 7 bonus_type_dodge = 8 bonus_type_natural_armor = 10 bonus_type_deflection = 11 From c48cca4e9637f65eddcc8cf3deb5aece78bb5916 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 7 Feb 2022 09:08:23 +0100 Subject: [PATCH 050/146] Update constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 7bd8e6fd0..d9dde37fe 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3395,6 +3395,7 @@ # Python Action Spells spell_epic_of_the_lost_king = 3080 +spell_grapple = 3110 spell_ki_blast = 3120 #Dragon Disciple Breath Weapons From 8d8f094c5368d250be0a615c5f6b8f7be2caaa18 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 7 Feb 2022 12:31:15 +0100 Subject: [PATCH 051/146] Added Black Tentacles spell_object --- tpdata/templeplus/lib/templeplus/constants.py | 1 + tpdatasrc/tpgamefiles/mes/description_ext/black_tentacles.mes | 1 + tpdatasrc/tpgamefiles/rules/protos/black_tentacles.tab | 1 + 3 files changed, 3 insertions(+) create mode 100644 tpdatasrc/tpgamefiles/mes/description_ext/black_tentacles.mes create mode 100644 tpdatasrc/tpgamefiles/rules/protos/black_tentacles.tab diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index d9dde37fe..e09b9b81e 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -411,6 +411,7 @@ OBJECT_SPELL_GENERIC = 12003 OBJECT_SPELL_CLOUDKILL = 12003 +OBJECT_SPELL_BLACK_TENTACLES = 12999 OBJFADE_C_NONE = 0 OBJFADE_C_OBJ_DESTROY = 1 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/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 From 64260da8de689996dabc39a0300734181f46cdc5 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 9 Feb 2022 10:28:45 +0100 Subject: [PATCH 052/146] Fixed Sniper's Shot Description Added Somatic Component as requirement in description --- tpdata/templeplus/lib/templeplus/constants.py | 1 + .../spell_compendium_spell_long_descriptions.mes | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index e09b9b81e..f217789c0 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3397,6 +3397,7 @@ # Python Action Spells spell_epic_of_the_lost_king = 3080 spell_grapple = 3110 +spell_black_tentacle_grapple = 3111 spell_ki_blast = 3120 #Dragon Disciple Breath Weapons 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 a6cae3884..044da8552 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} From d3d294a4d00d2d602c536bc226a0beb075dd6bc1 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 9 Feb 2022 12:34:38 +0100 Subject: [PATCH 053/146] Create combat_ext.mes --- tpdatasrc/tpgamefiles/mes/combat_ext.mes | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 tpdatasrc/tpgamefiles/mes/combat_ext.mes diff --git a/tpdatasrc/tpgamefiles/mes/combat_ext.mes b/tpdatasrc/tpgamefiles/mes/combat_ext.mes new file mode 100644 index 000000000..c6fe8a8bf --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/combat_ext.mes @@ -0,0 +1,2 @@ +// New History Window entries +{5500} {Grapple Check} From df61e31e39e75ada404617b3b894129f536d3071 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 11 Feb 2022 09:20:01 +0100 Subject: [PATCH 054/146] Update spell_compendium_help.tab Added Evard's Black Tentacles help --- tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab | 1 + 1 file changed, 1 insertion(+) diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 106b23553..67cab4d43 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -47,6 +47,7 @@ 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. From cc47159434897a9035fdffad297818f8ea4f82be Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 11 Feb 2022 09:28:51 +0100 Subject: [PATCH 055/146] Update spell_compendium_partsys.tab Added Evard's Black Tentacles particles --- .../tpgamefiles/rules/partsys/spell_compendium_partsys.tab | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index 45a0e34d0..9f0134a4d 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab @@ -51,6 +51,10 @@ 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 From 1af2388ec5ff319475465d22a63ec2605290029a Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 11 Feb 2022 09:35:00 +0100 Subject: [PATCH 056/146] fixed combat.mes extender combat_ext.mes is not functionable, switched entry to tpmes/combat.mes --- tpdata/tpmes/combat.mes | 3 +++ tpdatasrc/tpgamefiles/mes/combat_ext.mes | 2 -- 2 files changed, 3 insertions(+), 2 deletions(-) delete mode 100644 tpdatasrc/tpgamefiles/mes/combat_ext.mes 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/tpgamefiles/mes/combat_ext.mes b/tpdatasrc/tpgamefiles/mes/combat_ext.mes deleted file mode 100644 index c6fe8a8bf..000000000 --- a/tpdatasrc/tpgamefiles/mes/combat_ext.mes +++ /dev/null @@ -1,2 +0,0 @@ -// New History Window entries -{5500} {Grapple Check} From 5711c91b779382b9f888c40ebbf27c69cce143e1 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sun, 13 Feb 2022 11:05:29 +0100 Subject: [PATCH 057/146] Update constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index f217789c0..eef6d25e1 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3524,6 +3524,11 @@ bonus_type_profane = 154 bonus_type_undersong = 157 bonus_type_focusing_chant = 159 +bonus_type_storm_spell = 161 +bonus_type_curse_of_ill_fortune = 162 +bonus_type_curse_of_impending_blades = 163 +bonus_type_wave_of_grief = 164 +bonus_type_distract = 165 bonus_type_marshal_aura_minor = 190 bonus_type_marshal_aura_major = 191 bonus_type_draconic_aura = 192 From de24748b32e047d585ee44222905d3c2f18c524e Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sun, 13 Feb 2022 13:12:01 +0100 Subject: [PATCH 058/146] Updated spell_utils Added batch skill bonus handling to spell_utils Added batch AbilityScore handling to spell_utils --- .../tpgamefiles/mes/bonus_description.mes | 37 +++++++++++-------- tpdatasrc/tpgamefiles/scr/spell_utils.py | 29 +++++++++++++++ 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes index 79c1b639a..b471e9ebe 100644 --- a/tpdatasrc/tpgamefiles/mes/bonus_description.mes +++ b/tpdatasrc/tpgamefiles/mes/bonus_description.mes @@ -12,23 +12,28 @@ // Vanilla Bonus Types -{0}{Untyped} // Untyped, STACKING -{8}{~Dodge~[TAG_DODGE]} // STACKING -{10}{~Natural Armor~[TAG_MODIFIER_NATURAL_ARMOR]} // This is not clean, as Bonus Type 9 also seems to be used for Natural Armor -{11}{~Deflection~[TAG_DEFLECTION_BONUS]} -{12}{~Enhancement~[TAG_ENHANCEMENT_BONUS]} -{13}{~Morale~[TAG_MODIFIER_MORALE]} -{14}{~Luck~[TAG_MODIFIER_LUCK]} -{15}{~Resistance~[TAG_MODIFIER_RESISTANCE]} // There are some vanilla code problems with this type -{17}{~Sacred~[TAG_MODIFIER_SACRED]} // I think this is the vanilla Sacred bonus type (only used by the Consecrate spell) -{18}{~Insight~[TAG_MODIFIER_INSIGHT]} -{19}{~Concealment~[TAG_CONCEALMENT]} -{20}{~Size~[TAG_MODIFIER_SIZE]} // Bonus Type 20 is used for enlarge and reduce person spells -{21}{~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} //STACKING +{0} {Untyped} // Untyped, STACKING +{8} {~Dodge~[TAG_DODGE]} // STACKING +{10} {~Natural Armor~[TAG_MODIFIER_NATURAL_ARMOR]} // This is not clean, as Bonus Type 9 also seems to be used for Natural Armor +{11} {~Deflection~[TAG_DEFLECTION_BONUS]} +{12} {~Enhancement~[TAG_ENHANCEMENT_BONUS]} +{13} {~Morale~[TAG_MODIFIER_MORALE]} +{14} {~Luck~[TAG_MODIFIER_LUCK]} +{15} {~Resistance~[TAG_MODIFIER_RESISTANCE]} // There are some vanilla code problems with this type +{17} {~Sacred~[TAG_MODIFIER_SACRED]} // I think this is the vanilla Sacred bonus type (only used by the Consecrate spell) +{18} {~Insight~[TAG_MODIFIER_INSIGHT]} +{19} {~Concealment~[TAG_CONCEALMENT]} +{20} {~Size~[TAG_MODIFIER_SIZE]} // Bonus Type 20 is used for enlarge and reduce person spells +{21} {~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} //STACKING // Bonus Types added by Sagenlicht -{151}{~Alchemical~[TAG_MODIFIER_ALCHEMICAL]} -{154}{~Profane~[TAG_MODIFIER_PROFANE]} -{159}{~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} // Focusing Chant Spell, to avoid stacking with itself +{151} {~Alchemical~[TAG_MODIFIER_ALCHEMICAL]} +{154} {~Profane~[TAG_MODIFIER_PROFANE]} +{159} {~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} // Focusing Chant Spell, to avoid stacking with itself +{161} {bonus_type_storm_spell = 161 +{162} {Untyped} // bonus_type_curse_of_ill_fortune +// bonus_type_curse_of_impending_blades = 163 +// bonus_type_wave_of_grief = 164 +// bonus_type_distract = 165 diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 22fe99df7..28f404704 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -491,6 +491,27 @@ def AddTouchHook(self, hook): ### Standard Spell Condition Modifier ### +def getBonusHelpTag(bonusType): + return game.get_mesline("mes\\bonus_description.mes", bonusType) + +def applySkillBonus(attachee, args, evt_obj): + bonusValue = args.get_param(0) + bonusType = args.get_param(1) + bonusHelpTag = getBonusHelpTag(bonusType) + spellId = args.get_arg(0) + spellHelpTag = getSpellHelpTag(spellId) + evt_obj.bonus_list.add(bonusValue, bonusType, "{} : {}".format(bonusHelpTag, spellHelpTag)) + return 0 + +def applyAbilityScoreBonus(attachee, args, evt_obj): + bonusValue = args.get_param(0) + bonusType = bonus_type_enhancement + bonusHelpTag = getBonusHelpTag(bonusType) + spellId = args.get_arg(0) + spellHelpTag = getSpellHelpTag(spellId) + evt_obj.bonus_list.add(bonusValue, bonusType, "{} : {}".format(bonusHelpTag, spellHelpTag)) + return 0 + class SpellPythonModifier(PythonModifier): #SpellPythonModifier have at least 3 arguments: #spellId, duration, empty @@ -512,6 +533,14 @@ def AddSpellDismiss(self): self.AddHook(ET_OnD20Signal, EK_S_Dismiss_Spells, checkRemoveSpell, ()) def AddSpellNoDuplicate(self): self.AddHook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) + def addSkillBonus(self, bonusValue, bonusType, *args): + for skill in args: + eventKey = skill + 20 + self.AddHook(ET_OnGetSkillLevel, eventKey, applySkillBonus, (bonusValue, bonusType,)) + def addAbilityBonus(self, bonusValue, *args): + for abilityScore in args: + eventKey = abilityScore + 1 + self.AddHook(ET_OnAbilityScoreLevel, eventKey, applyAbilityScoreBonus,(bonusValue,)) ### Aoe Modifier Classes ### def addAoeObjToSpellRegistry(attachee, args, evt_obj): From 158328ddd0fd229c4a49129228d563c564010e57 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sun, 13 Feb 2022 19:57:54 +0100 Subject: [PATCH 059/146] added DR Handling to SpellPythonModifier class --- tpdata/templeplus/lib/templeplus/constants.py | 1 + tpdatasrc/tpgamefiles/mes/bonus_description.mes | 5 +++-- tpdatasrc/tpgamefiles/scr/spell_utils.py | 17 +++++++++++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index eef6d25e1..51a2da360 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3523,6 +3523,7 @@ bonus_type_alchemical = 151 bonus_type_profane = 154 bonus_type_undersong = 157 +bonus_type_camouflage = 158 bonus_type_focusing_chant = 159 bonus_type_storm_spell = 161 bonus_type_curse_of_ill_fortune = 162 diff --git a/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes index b471e9ebe..af6cf3ba8 100644 --- a/tpdatasrc/tpgamefiles/mes/bonus_description.mes +++ b/tpdatasrc/tpgamefiles/mes/bonus_description.mes @@ -31,9 +31,10 @@ {151} {~Alchemical~[TAG_MODIFIER_ALCHEMICAL]} {154} {~Profane~[TAG_MODIFIER_PROFANE]} +{158} {~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} // Camouflage Spell, to avoid stacking with itself {159} {~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} // Focusing Chant Spell, to avoid stacking with itself -{161} {bonus_type_storm_spell = 161 -{162} {Untyped} // bonus_type_curse_of_ill_fortune +// {161} {bonus_type_storm_spell = 161 +// {162} {Untyped} // bonus_type_curse_of_ill_fortune // bonus_type_curse_of_impending_blades = 163 // bonus_type_wave_of_grief = 164 // bonus_type_distract = 165 diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 28f404704..b2cb6a4c7 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -505,13 +505,20 @@ def applySkillBonus(attachee, args, evt_obj): def applyAbilityScoreBonus(attachee, args, evt_obj): bonusValue = args.get_param(0) - bonusType = bonus_type_enhancement + bonusType = args.get_param(1) bonusHelpTag = getBonusHelpTag(bonusType) spellId = args.get_arg(0) spellHelpTag = getSpellHelpTag(spellId) evt_obj.bonus_list.add(bonusValue, bonusType, "{} : {}".format(bonusHelpTag, spellHelpTag)) return 0 +def applyDamageReduction(attachee, args, evt_obj): + drAmount = args.get_param(0) + drBreakType = args.get_param(1) + damageMesId = 126 #ID 126 = ~Damage Reduction~[TAG_SPECIAL_ABILITIES_DAMAGE_REDUCTION] + evt_obj.damage_packet.add_physical_damage_res(drAmount, drBreakType, damageMesId) + return 0 + class SpellPythonModifier(PythonModifier): #SpellPythonModifier have at least 3 arguments: #spellId, duration, empty @@ -533,14 +540,16 @@ def AddSpellDismiss(self): self.AddHook(ET_OnD20Signal, EK_S_Dismiss_Spells, checkRemoveSpell, ()) def AddSpellNoDuplicate(self): self.AddHook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) - def addSkillBonus(self, bonusValue, bonusType, *args): + def AddSkillBonus(self, bonusValue, bonusType, *args): for skill in args: eventKey = skill + 20 self.AddHook(ET_OnGetSkillLevel, eventKey, applySkillBonus, (bonusValue, bonusType,)) - def addAbilityBonus(self, bonusValue, *args): + def AddAbilityBonus(self, bonusValue, bonusType, *args): for abilityScore in args: eventKey = abilityScore + 1 - self.AddHook(ET_OnAbilityScoreLevel, eventKey, applyAbilityScoreBonus,(bonusValue,)) + self.AddHook(ET_OnAbilityScoreLevel, eventKey, applyAbilityScoreBonus,(bonusValue, bonusType,)) + def AddDamageReduction(self, drAmount, drBreakType): + self.AddHook(ET_OnTakingDamage2, EK_NONE, applyDamageReduction,(drAmount, drBreakType,)) ### Aoe Modifier Classes ### def addAoeObjToSpellRegistry(attachee, args, evt_obj): From fc93857bab6b6429aa53869de413244c9e9c6265 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sun, 13 Feb 2022 23:56:04 +0100 Subject: [PATCH 060/146] Update spells_radial_menu_options_ext.mes --- .../tpgamefiles/mes/spells_radial_menu_options_ext.mes | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes b/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes index 39e6de638..7a7490243 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,9 @@ {3042} {Cold} {3043} {Electricity} {3044} {Fire} + +; weapon and shield target +{3050}{3} +{3051}{Mainhand} +{3052}{Offhand} +{3053}{Shield} From 410227b3d04f323d118109716bdb3474496b38b7 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Feb 2022 10:00:37 +0100 Subject: [PATCH 061/146] Added more functions to SpellPythonModifier --- tpdata/templeplus/lib/templeplus/constants.py | 3 ++ tpdatasrc/tpgamefiles/scr/spell_utils.py | 48 +++++++++++++------ 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 51a2da360..42548d7e4 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3500,6 +3500,9 @@ aura_stamina = 34 aura_swiftness =35 +#Bonus Value is passed by spell +passed_by_spell = 0 + #Bonus Types (aka modifiers) bonus_type_untyped = 0 bonus_type_stat_strength = 2 diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index b2cb6a4c7..3305eef22 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -494,17 +494,10 @@ def AddTouchHook(self, hook): def getBonusHelpTag(bonusType): return game.get_mesline("mes\\bonus_description.mes", bonusType) -def applySkillBonus(attachee, args, evt_obj): - bonusValue = args.get_param(0) - bonusType = args.get_param(1) - bonusHelpTag = getBonusHelpTag(bonusType) - spellId = args.get_arg(0) - spellHelpTag = getSpellHelpTag(spellId) - evt_obj.bonus_list.add(bonusValue, bonusType, "{} : {}".format(bonusHelpTag, spellHelpTag)) - return 0 - -def applyAbilityScoreBonus(attachee, args, evt_obj): +def applyBonus(attachee, args, evt_obj): bonusValue = args.get_param(0) + if not bonusValue: + bonusValue = args.get_arg(2) bonusType = args.get_param(1) bonusHelpTag = getBonusHelpTag(bonusType) spellId = args.get_arg(0) @@ -519,9 +512,27 @@ def applyDamageReduction(attachee, args, evt_obj): evt_obj.damage_packet.add_physical_damage_res(drAmount, drBreakType, damageMesId) return 0 +def applySaveBonus(attachee, args, evt_obj): + saveDescriptor = args.get_param(2) + if saveDescriptor: + if not evt_obj.flags & (1 << (saveDescriptor - 1)): + return 0 + applyBonus(attachee, args, evt_obj) + return 0 + +def applyAttackPacketBonus(attachee, args, evt_obj): + flagRequirement = args.get_param(2) + if flagRequirement: + if not evt_obj.attack_packet.get_flags() & flagRequirement: + return 0 + applyBonus(attachee, args, evt_obj) + 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, ()) @@ -541,15 +552,24 @@ def AddSpellDismiss(self): def AddSpellNoDuplicate(self): self.AddHook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) def AddSkillBonus(self, bonusValue, bonusType, *args): - for skill in args: - eventKey = skill + 20 - self.AddHook(ET_OnGetSkillLevel, eventKey, applySkillBonus, (bonusValue, bonusType,)) + if args == EK_NONE: + self.AddHook(ET_OnGetSkillLevel, EK_NONE, applyBonus, (bonusValue, bonusType,)) + else: + for skill in args: + eventKey = skill + 20 + self.AddHook(ET_OnGetSkillLevel, eventKey, applyBonus, (bonusValue, bonusType,)) def AddAbilityBonus(self, bonusValue, bonusType, *args): for abilityScore in args: eventKey = abilityScore + 1 - self.AddHook(ET_OnAbilityScoreLevel, eventKey, applyAbilityScoreBonus,(bonusValue, bonusType,)) + self.AddHook(ET_OnAbilityScoreLevel, eventKey, applyBonus,(bonusValue, bonusType,)) def AddDamageReduction(self, drAmount, drBreakType): self.AddHook(ET_OnTakingDamage2, EK_NONE, applyDamageReduction,(drAmount, drBreakType,)) + def AddSaveBonus(self, bonusValue, bonusType, eventKey = EK_NONE, saveDescriptor = D20STD_F_NONE): + self.AddHook(ET_OnSaveThrowLevel, eventKey, applySaveBonus, (bonusValue, bonusType, saveDescriptor,)) + def AddToHitBonus(self, bonusValue, bonusType, flagRequirement = 0): + self.AddHook(ET_OnToHitBonus2, EK_NONE, applyAttackPacketBonus,(bonusValue, bonusType, flagRequirement,)) + def AddAbilityCheckBonus(self, bonusValue, bonusType): #might get expanded + self.AddHook(ET_OnGetAbilityCheckModifier, EK_NONE, applyBonus, (bonusValue, bonusType,)) ### Aoe Modifier Classes ### def addAoeObjToSpellRegistry(attachee, args, evt_obj): From deb50a0736d43ed6711c6db894df5ac46951d2d5 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Feb 2022 10:55:41 +0100 Subject: [PATCH 062/146] Added more functions to SpellPythonModifier --- tpdata/templeplus/lib/templeplus/constants.py | 2 ++ tpdatasrc/tpgamefiles/scr/spell_utils.py | 12 +++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 42548d7e4..1a1c8c55d 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3525,6 +3525,8 @@ bonus_type_circumstance = 21 bonus_type_alchemical = 151 bonus_type_profane = 154 +bonus_type_sirines_grace = 155 +bonus_type_sticky_fingers = 156 bonus_type_undersong = 157 bonus_type_camouflage = 158 bonus_type_focusing_chant = 159 diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 3305eef22..83a277178 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -552,12 +552,10 @@ def AddSpellDismiss(self): def AddSpellNoDuplicate(self): self.AddHook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) def AddSkillBonus(self, bonusValue, bonusType, *args): - if args == EK_NONE: - self.AddHook(ET_OnGetSkillLevel, EK_NONE, applyBonus, (bonusValue, bonusType,)) - else: - for skill in args: + for skill in args: + if skill != EK_NONE: eventKey = skill + 20 - self.AddHook(ET_OnGetSkillLevel, eventKey, applyBonus, (bonusValue, bonusType,)) + self.AddHook(ET_OnGetSkillLevel, eventKey, applyBonus, (bonusValue, bonusType,)) def AddAbilityBonus(self, bonusValue, bonusType, *args): for abilityScore in args: eventKey = abilityScore + 1 @@ -568,8 +566,12 @@ def AddSaveBonus(self, bonusValue, bonusType, eventKey = EK_NONE, saveDescriptor self.AddHook(ET_OnSaveThrowLevel, eventKey, applySaveBonus, (bonusValue, bonusType, saveDescriptor,)) def AddToHitBonus(self, bonusValue, bonusType, flagRequirement = 0): self.AddHook(ET_OnToHitBonus2, EK_NONE, applyAttackPacketBonus,(bonusValue, bonusType, flagRequirement,)) + def AddAcBonus(self, bonusValue, bonusType): + self.AddHook(ET_OnGetAC, EK_NONE, applyBonus, (bonusValue, bonusType,)) def AddAbilityCheckBonus(self, bonusValue, bonusType): #might get expanded self.AddHook(ET_OnGetAbilityCheckModifier, EK_NONE, applyBonus, (bonusValue, bonusType,)) + def AddMovementBonus(self, bonusValue, bonusType): + self.AddHook(ET_OnGetMoveSpeedBase, EK_NONE, applyBonus, (bonusValue, bonusType,)) ### Aoe Modifier Classes ### def addAoeObjToSpellRegistry(attachee, args, evt_obj): From 208808da628ac4c124079ec0dfec8ac84b3c2755 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Feb 2022 11:18:07 +0100 Subject: [PATCH 063/146] Fixed a few mass spell version handlings --- tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab | 8 ++++---- .../tpgamefiles/mes/spell_ext/spell_compendium_spell.mes | 2 +- .../tpgamefiles/rules/indicators/conviction_mass.txt | 5 +++++ .../rules/indicators/curse_of_ill_fortune_mass.txt | 5 +++++ .../rules/indicators/curse_of_impending_blades_mass.txt | 5 +++++ .../tpgamefiles/rules/indicators/resistance_greater.txt | 2 +- .../tpgamefiles/rules/indicators/resistance_superior.txt | 2 +- tpdatasrc/tpgamefiles/scr/spell_utils.py | 2 ++ 8 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/conviction_mass.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/curse_of_ill_fortune_mass.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/curse_of_impending_blades_mass.txt diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 67cab4d43..3749f161b 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -26,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_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_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. @@ -99,8 +99,8 @@ TAG_SPELLS_PHANTOM_THREAT TAG_SPELLS TAG_BARD_1 Phantom Threat ~Illusion~[TAG_M 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_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. diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes index 9596144d6..e06abadf6 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes @@ -47,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} diff --git a/tpdatasrc/tpgamefiles/rules/indicators/conviction_mass.txt b/tpdatasrc/tpgamefiles/rules/indicators/conviction_mass.txt new file mode 100644 index 000000000..c442146ce --- /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_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..1395572bd --- /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_IMPENDING_BLADES,_MASS +tooltip_base_text: Curse of Impending Blades, Mass \ No newline at end of file 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/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 83a277178..9910343d5 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -555,6 +555,8 @@ def AddSkillBonus(self, bonusValue, bonusType, *args): for skill in args: if skill != EK_NONE: eventKey = skill + 20 + else: + eventKey = EK_NONE self.AddHook(ET_OnGetSkillLevel, eventKey, applyBonus, (bonusValue, bonusType,)) def AddAbilityBonus(self, bonusValue, bonusType, *args): for abilityScore in args: From 4a426e55e9e9e86cc38291649301675aa5d931de Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Feb 2022 11:30:09 +0100 Subject: [PATCH 064/146] Fixed more inconsitencies --- .../tpgamefiles/mes/help/spell_compendium_help.tab | 4 ++-- .../tpgamefiles/rules/indicators/nixies_grace.txt | 4 ++-- .../spell_enums/spell_compendium_spell_enum.mes | 12 ++++++------ 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 3749f161b..5b4362269 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -88,7 +88,7 @@ TAG_SPELLS_MASTERS_GIFT TAG_SPELLS TAG_BARD_1 TAG_SORCERER_1 TAG_WIZARD_1 Maste 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. @@ -106,7 +106,7 @@ TAG_SPELLS_RIGHTEOUS_FURY TAG_SPELLS TAG_PALADIN_3 Righteous Fury ~Transmutatio 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. 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/spell_enums/spell_compendium_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes index 1763b86c8..8ff3d4a7a 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes @@ -350,7 +350,7 @@ {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_IMPENDING_BLADES,_MASS} {21090}{TAG_SPELLS_DISSONANT_CHORD} {21091}{TAG_SPELLS_HAUNTING_TUNE} {21092}{TAG_SPELLS_LOVES_LAMENT} @@ -361,17 +361,17 @@ {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} @@ -417,7 +417,7 @@ {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} From d2fb36a1489cde00c400c8d353e80bd073113ebe Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Feb 2022 11:31:09 +0100 Subject: [PATCH 065/146] Update conviction_mass.txt --- tpdatasrc/tpgamefiles/rules/indicators/conviction_mass.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpdatasrc/tpgamefiles/rules/indicators/conviction_mass.txt b/tpdatasrc/tpgamefiles/rules/indicators/conviction_mass.txt index c442146ce..a2aced672 100644 --- a/tpdatasrc/tpgamefiles/rules/indicators/conviction_mass.txt +++ b/tpdatasrc/tpgamefiles/rules/indicators/conviction_mass.txt @@ -1,4 +1,4 @@ -ID_string: CONVICTION_MASS +ID_string: CONVICTION,_MASS effect_type: 0 texture_file: art\interface\player_conditions\buffs\spell heroism.tga help_topic: TAG_SPELLS_CONVICTION,_MASS From d122f325a8886cb0fd506688f7fa5e119b7cf77d Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Feb 2022 11:39:51 +0100 Subject: [PATCH 066/146] Fixed more inconsistencies --- .../mes/help/spell_compendium_help.tab | 2 +- .../curse_of_impending_blades_mass.txt | 2 +- .../spell_enums/spell_compendium_spell_enum.mes | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 5b4362269..72eb83786 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -31,7 +31,7 @@ TAG_SPELLS_CORONA_OF_COLD TAG_SPELLS TAG_CLERIC_3 TAG_DRUID_3 Corona of Cold ~E 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. diff --git a/tpdatasrc/tpgamefiles/rules/indicators/curse_of_impending_blades_mass.txt b/tpdatasrc/tpgamefiles/rules/indicators/curse_of_impending_blades_mass.txt index 1395572bd..b73ca20a3 100644 --- a/tpdatasrc/tpgamefiles/rules/indicators/curse_of_impending_blades_mass.txt +++ b/tpdatasrc/tpgamefiles/rules/indicators/curse_of_impending_blades_mass.txt @@ -1,5 +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_IMPENDING_BLADES,_MASS +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/spell_enums/spell_compendium_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes index 8ff3d4a7a..da6874bf1 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes @@ -46,7 +46,7 @@ {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} @@ -198,7 +198,7 @@ {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} @@ -209,17 +209,17 @@ {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} @@ -265,7 +265,7 @@ {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} @@ -350,7 +350,7 @@ {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} From b0034211d8f86e8d6ecbbd8f438c4a6834c79bdc Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Feb 2022 11:56:23 +0100 Subject: [PATCH 067/146] Update spell_utils.py --- tpdatasrc/tpgamefiles/scr/spell_utils.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 9910343d5..33cb7c3ff 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -552,12 +552,13 @@ def AddSpellDismiss(self): def AddSpellNoDuplicate(self): self.AddHook(ET_OnConditionAddPre, EK_NONE, replaceCondition, ()) def AddSkillBonus(self, bonusValue, bonusType, *args): - for skill in args: - if skill != EK_NONE: - eventKey = skill + 20 - else: - eventKey = EK_NONE + if not args: + eventKey = EK_NONE self.AddHook(ET_OnGetSkillLevel, eventKey, applyBonus, (bonusValue, bonusType,)) + else: + for skill in args: + eventKey = skill + 20 + self.AddHook(ET_OnGetSkillLevel, eventKey, applyBonus, (bonusValue, bonusType,)) def AddAbilityBonus(self, bonusValue, bonusType, *args): for abilityScore in args: eventKey = abilityScore + 1 From 7a9711bd6d3769be52bad48a33624a40a5c0ef33 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Feb 2022 12:17:03 +0100 Subject: [PATCH 068/146] Updated bonus_description.mes --- .../tpgamefiles/mes/bonus_description.mes | 19 +++++++++++-------- tpdatasrc/tpgamefiles/mes/help/modifiers.tab | 1 + 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes index af6cf3ba8..7056ca7d3 100644 --- a/tpdatasrc/tpgamefiles/mes/bonus_description.mes +++ b/tpdatasrc/tpgamefiles/mes/bonus_description.mes @@ -12,7 +12,7 @@ // Vanilla Bonus Types -{0} {Untyped} // Untyped, STACKING +{0} {~Untyped~[TAG_MODIFIER_UNTYPED]} // Untyped, STACKING {8} {~Dodge~[TAG_DODGE]} // STACKING {10} {~Natural Armor~[TAG_MODIFIER_NATURAL_ARMOR]} // This is not clean, as Bonus Type 9 also seems to be used for Natural Armor {11} {~Deflection~[TAG_DEFLECTION_BONUS]} @@ -31,10 +31,13 @@ {151} {~Alchemical~[TAG_MODIFIER_ALCHEMICAL]} {154} {~Profane~[TAG_MODIFIER_PROFANE]} -{158} {~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} // Camouflage Spell, to avoid stacking with itself -{159} {~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} // Focusing Chant Spell, to avoid stacking with itself -// {161} {bonus_type_storm_spell = 161 -// {162} {Untyped} // bonus_type_curse_of_ill_fortune -// bonus_type_curse_of_impending_blades = 163 -// bonus_type_wave_of_grief = 164 -// bonus_type_distract = 165 +{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 +{158} {~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} // bonus_type_camouflage +{159} {~Circumstance~[TAG_MODIFIER_CIRCUMSTANCE]} // bonus_type_focusing_chant +{161} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_storm_spell +{162} {~Untyped~[TAG_MODIFIER_UNTYPED]} // bonus_type_curse_of_ill_fortune +{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 diff --git a/tpdatasrc/tpgamefiles/mes/help/modifiers.tab b/tpdatasrc/tpgamefiles/mes/help/modifiers.tab index 20acc9a9d..98b897a22 100644 --- a/tpdatasrc/tpgamefiles/mes/help/modifiers.tab +++ b/tpdatasrc/tpgamefiles/mes/help/modifiers.tab @@ -10,3 +10,4 @@ TAG_MODIFIER_RESISTANCE TAG_MODIFIER Resistance Bonus A resistance bonus affec 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. From 801d8df51a13512bb8d165efc78bdbda5820a02e Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 15 Feb 2022 11:50:52 +0100 Subject: [PATCH 069/146] Added Bonefiddle particles --- .../art/meshes/Particle/fiddle_bow.mdf | 3 +++ .../art/meshes/Particle/fiddle_bow.tga | Bin 0 -> 65554 bytes .../mes/help/spell_compendium_help.tab | 2 +- .../rules/partsys/spell_compendium_partsys.tab | 4 ++++ 4 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 tpdatasrc/tpgamefiles/art/meshes/Particle/fiddle_bow.mdf create mode 100644 tpdatasrc/tpgamefiles/art/meshes/Particle/fiddle_bow.tga 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 0000000000000000000000000000000000000000..9f627385f88b08bc4c6ae8a3322fa6db6e96b217 GIT binary patch literal 65554 zcmeI*d#u-U9LMofiHJ1OAGFm{(jpP1i!QnwyzzH}3C*TB}fD_mcCs2oTF4W`s;b@GeXoi+( zgHv!i&O%q5gPtY5c*FvSfkrqM z$D=t~qa8Y+6S^TY&Ac+B%w+&v#W6{`^u4Px&wD1*SZ1^VJ+5SJvNj)%46i` z3S?&YBJa;E@>%)JE0LMxKIPu^M-QBhba4jSBiGRexu!xZo)@w&ugUAXpgYo2T8?oUa$ZBw z7sY+d{YoEM=lT5vA<{bM%jKD?6{#;Lb&2ch| za?HUjxY4O9!u~xYO{^wMO8a`hJ9%6d4A3Fs$2c4J4!!y=dpNSz5{F8(nJ&FT(Tw>BkL*m z_Ivz=;y5)u<~3>HH~ft6uoGY4W4wpV;YCy+YjY;X;Q|c7c$|ow%W-Ii7HEl9$hu31 z?a&^XTSsJVW{u|j`(YTerY9laQ`3;o%6HdXWNqa;Zz=98$={<_g8V*f=!MertkX}CmaE&Qu(LR3 zO^-R3oyalEk!xv*T%+6no50b${TNi8Xae&sX!9-;YIgTe_W(G?(}OfH$!m`OJKmHiX;$F@YmF%``I-`5QP2S+~8hw=Lhx z`ELui18)LZ<8DsC2{-{K-~^n26L11fzzG~g6Y$?j*6!a)Iw$9312$j-HedrbU;{Q_ z12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j- zHedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-Hedrb uU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Q_12$j-HedrbU;{Rg2L1-z68}U1 literal 0 HcmV?d00001 diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 72eb83786..27cdd4755 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -83,7 +83,7 @@ TAG_SPELLS_LESSER_ORB_OF_ELECTRICITY TAG_SPELLS TAG_SORCERER_1 TAG_WIZARD_1 TAG 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. diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index 9f0134a4d..ae60b705d 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab @@ -13,6 +13,10 @@ sp-Axiomatic Storm-hit body steam 0 10 100 Bones Sprite Polar fire-sprite 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 From a442e00939b3ada3c791e1fa569188e9e2c9c3ec Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 15 Feb 2022 11:59:19 +0100 Subject: [PATCH 070/146] Update spell_compendium_spell_enum.mes --- .../rules/spell_enums/spell_compendium_spell_enum.mes | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 da6874bf1..7a4f953a9 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes @@ -49,7 +49,7 @@ {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} @@ -201,7 +201,7 @@ {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} @@ -353,7 +353,7 @@ {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} From 59dd7fa2ab85276d6fb13abbda8828f4867b13f5 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 16 Feb 2022 11:30:24 +0100 Subject: [PATCH 071/146] Update spell_compendium_partsys.tab Added sp-Acid Fog-Hit particles --- .../tpgamefiles/rules/partsys/spell_compendium_partsys.tab | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index ae60b705d..f762cb010 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 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 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 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 From 9bc744ddffd734d46d19dd2520c3b34e49f214d4 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 17 Feb 2022 19:26:41 +0100 Subject: [PATCH 072/146] Added Rhino's Rush --- tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab | 1 + .../tpgamefiles/mes/spell_ext/spell_compendium_spell.mes | 2 ++ .../spell_compendium_spell_long_descriptions.mes | 7 +++++++ .../rules/spell_enums/spell_compendium_spell_enum.mes | 3 +++ .../sound/user_sounds/spell_compendium_sounds.mes | 2 +- 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 27cdd4755..2620d0a58 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -102,6 +102,7 @@ TAG_SPELLS_RESIST_ENERGY_MASS TAG_SPELLS TAG_CLERIC_3 TAG_DRUID_3 TAG_SORCERER_ 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_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). diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes index e06abadf6..a08fbe076 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes @@ -74,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} @@ -227,6 +228,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.} 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 044da8552..16da47e3c 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 @@ -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) 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 7a4f953a9..738acba1a 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes @@ -73,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} @@ -225,6 +226,7 @@ {6114}{Clear Mind} {6115}{Deafening Clang} {6116}{Grave Strike} +{6117}{Rhino's Rush} {6118}{Faith Healing} {6119}{Summon Undead I} {6120}{Angelskin} @@ -377,6 +379,7 @@ {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} diff --git a/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes b/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes index 3d7d4ce58..b4d5a291b 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 From a39875392f431392680519ad8301b350eaf0fefb Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 17 Feb 2022 21:20:24 +0100 Subject: [PATCH 073/146] Fixed Aid, Mass description --- tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab | 2 +- .../spell_compendium_spell_long_descriptions.mes | 2 +- .../rules/spell_enums/spell_compendium_spell_enum.mes | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 2620d0a58..8469a6a3a 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -1,7 +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_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_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. 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 16da47e3c..a710e8513 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 @@ -749,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) 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 738acba1a..c0b12aee8 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes @@ -109,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} @@ -262,7 +262,7 @@ {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} @@ -415,7 +415,7 @@ {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} From 5a3467efb4c6025e3ee6af7ad742a263528a7df1 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 17 Feb 2022 21:51:36 +0100 Subject: [PATCH 074/146] Update bonus_description.mes Added sacred entry (bonus_type 16) --- tpdatasrc/tpgamefiles/mes/bonus_description.mes | 1 + 1 file changed, 1 insertion(+) diff --git a/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes index 7056ca7d3..fdb1b0866 100644 --- a/tpdatasrc/tpgamefiles/mes/bonus_description.mes +++ b/tpdatasrc/tpgamefiles/mes/bonus_description.mes @@ -20,6 +20,7 @@ {13} {~Morale~[TAG_MODIFIER_MORALE]} {14} {~Luck~[TAG_MODIFIER_LUCK]} {15} {~Resistance~[TAG_MODIFIER_RESISTANCE]} // There are some vanilla code problems with this type +{16} {~Sacred~[TAG_MODIFIER_SACRED]} // I am not 100% sure that bonus_type 16 in vanilla is actually sacred, but I am pretty sure. If not I would switch sacred to 152 {17} {~Sacred~[TAG_MODIFIER_SACRED]} // I think this is the vanilla Sacred bonus type (only used by the Consecrate spell) {18} {~Insight~[TAG_MODIFIER_INSIGHT]} {19} {~Concealment~[TAG_CONCEALMENT]} From a48d7bb998f06200383c5a144fbd7d7ed535df00 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 17 Feb 2022 22:07:29 +0100 Subject: [PATCH 075/146] Fixed Sacred bonus in constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 2 +- tpdatasrc/tpgamefiles/mes/bonus_description.mes | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 1a1c8c55d..53fdc9708 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3518,7 +3518,7 @@ bonus_type_morale = 13 bonus_type_luck = 14 bonus_type_resistance = 15 -bonus_type_sacred = 16 +bonus_type_sacred = 17 bonus_type_insight = 18 bonus_type_concealment = 19 bonus_type_size = 20 diff --git a/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes index fdb1b0866..7056ca7d3 100644 --- a/tpdatasrc/tpgamefiles/mes/bonus_description.mes +++ b/tpdatasrc/tpgamefiles/mes/bonus_description.mes @@ -20,7 +20,6 @@ {13} {~Morale~[TAG_MODIFIER_MORALE]} {14} {~Luck~[TAG_MODIFIER_LUCK]} {15} {~Resistance~[TAG_MODIFIER_RESISTANCE]} // There are some vanilla code problems with this type -{16} {~Sacred~[TAG_MODIFIER_SACRED]} // I am not 100% sure that bonus_type 16 in vanilla is actually sacred, but I am pretty sure. If not I would switch sacred to 152 {17} {~Sacred~[TAG_MODIFIER_SACRED]} // I think this is the vanilla Sacred bonus type (only used by the Consecrate spell) {18} {~Insight~[TAG_MODIFIER_INSIGHT]} {19} {~Concealment~[TAG_CONCEALMENT]} From f252713b5f9d6c13ff0eabea9bf37e062cf2fdc8 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 18 Feb 2022 17:45:51 +0100 Subject: [PATCH 076/146] Added spell Icelance --- tpdata/templeplus/lib/templeplus/constants.py | 1 + .../tpgamefiles/mes/help/spell_compendium_help.tab | 1 + .../mes/spell_ext/spell_compendium_spell.mes | 2 ++ .../rules/spell_enums/spell_compendium_spell_enum.mes | 3 +++ .../sound/user_sounds/spell_compendium_sounds.mes | 11 +++++++++++ 5 files changed, 18 insertions(+) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 53fdc9708..d9fc3e66c 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3371,6 +3371,7 @@ spell_orb_of_electricity = 1198 spell_orb_of_fire = 1199 spell_orb_of_sound = 1200 +spell_icelance = 1201 spell_inevitable_defeat = 1302 diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 8469a6a3a..aba5901d5 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -68,6 +68,7 @@ TAG_SPELLS_HEART_RIPPER TAG_SPELLS TAG_ASSASSIN_4 Heart Ripper ~Necromancy~[TAG 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. diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes index a08fbe076..643828012 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes @@ -157,6 +157,7 @@ {1198}{Orb of Electricity} {1199}{Orb of Fire} {1200}{Orb of Sound} +{1201}{Icelance} // Spell Descriptions {5158} Evard's Black Tentacles {[Conjuration][Creation] Create Tentacles that grapple in a 20ft. area.} @@ -311,3 +312,4 @@ {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 {[Transmutation][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.} 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 c0b12aee8..5d2438f3e 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes @@ -156,6 +156,7 @@ {1198}{Orb of Electricity} {1199}{Orb of Fire} {1200}{Orb of Sound} +{1201}{Icelance} {5158}{Evard's Black Tentacles} {5794}{Vigor, Lesser} @@ -309,6 +310,7 @@ {6198}{Orb of Electricity} {6199}{Orb of Fire} {6200}{Orb of Sound} +{6201}{Icelance} {20158}{TAG_SPELLS_EVARD'S_BLACK_TENTACLES} {20794}{TAG_SPELLS_VIGOR,_LESSER} @@ -462,3 +464,4 @@ {21198}{TAG_SPELLS_ORB_OF_ELECTRICITY} {21199}{TAG_SPELLS_ORB_OF_FIRE} {21200}{TAG_SPELLS_ORB_OF_SOUND} +{21201}{TAG_SPELLS_ICELANCE} diff --git a/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes b/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes index b4d5a291b..b9b341212 100644 --- a/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes +++ b/tpdatasrc/tpgamefiles/sound/user_sounds/spell_compendium_sounds.mes @@ -1681,3 +1681,14 @@ {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 From 349499e8b6c43fd5f190fc0768820d3403645db8 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sat, 19 Feb 2022 12:57:28 +0100 Subject: [PATCH 077/146] Added spell Revivify --- tpdata/templeplus/lib/templeplus/constants.py | 1 + .../tpgamefiles/mes/help/spell_compendium_help.tab | 1 + .../mes/spell_ext/spell_compendium_spell.mes | 4 +++- .../spell_compendium_spell_long_descriptions.mes | 14 ++++++++++++++ .../spell_enums/spell_compendium_spell_enum.mes | 3 +++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index d9fc3e66c..2ec1a48c5 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3372,6 +3372,7 @@ spell_orb_of_fire = 1199 spell_orb_of_sound = 1200 spell_icelance = 1201 +spell_revivify = 1202 spell_inevitable_defeat = 1302 diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index aba5901d5..1b2593f63 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -103,6 +103,7 @@ TAG_SPELLS_RESIST_ENERGY_MASS TAG_SPELLS TAG_CLERIC_3 TAG_DRUID_3 TAG_SORCERER_ 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. diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes index 643828012..d30a0d355 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/spell_compendium_spell.mes @@ -158,6 +158,7 @@ {1199}{Orb of Fire} {1200}{Orb of Sound} {1201}{Icelance} +{1202}{Revivify} // Spell Descriptions {5158} Evard's Black Tentacles {[Conjuration][Creation] Create Tentacles that grapple in a 20ft. area.} @@ -312,4 +313,5 @@ {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 {[Transmutation][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.} +{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_long_descriptions_ext/spell_compendium_spell_long_descriptions.mes b/tpdatasrc/tpgamefiles/mes/spell_long_descriptions_ext/spell_compendium_spell_long_descriptions.mes index a710e8513..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 @@ -1016,3 +1016,17 @@ 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/rules/spell_enums/spell_compendium_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes index 5d2438f3e..93ff11316 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/spell_compendium_spell_enum.mes @@ -157,6 +157,7 @@ {1199}{Orb of Fire} {1200}{Orb of Sound} {1201}{Icelance} +{1202}{Revivify} {5158}{Evard's Black Tentacles} {5794}{Vigor, Lesser} @@ -311,6 +312,7 @@ {6199}{Orb of Fire} {6200}{Orb of Sound} {6201}{Icelance} +{6202}{Revivify} {20158}{TAG_SPELLS_EVARD'S_BLACK_TENTACLES} {20794}{TAG_SPELLS_VIGOR,_LESSER} @@ -465,3 +467,4 @@ {21199}{TAG_SPELLS_ORB_OF_FIRE} {21200}{TAG_SPELLS_ORB_OF_SOUND} {21201}{TAG_SPELLS_ICELANCE} +{21202}{TAG_SPELLS_REVIVIFY} From 4bbb015b8687fcb0b8156ec33f1da2765f17a3cf Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sat, 19 Feb 2022 15:51:44 +0100 Subject: [PATCH 078/146] Update spell_compendium_help.tab Fixed typo --- tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab index 1b2593f63..2ed6cd5ff 100644 --- a/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/spell_compendium_help.tab @@ -103,7 +103,7 @@ TAG_SPELLS_RESIST_ENERGY_MASS TAG_SPELLS TAG_CLERIC_3 TAG_DRUID_3 TAG_SORCERER_ 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_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. From 5edea28ef4e014e57221e2186d49e78696c86a3b Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 21 Feb 2022 20:20:18 +0100 Subject: [PATCH 079/146] Update spell_compendium_partsys.tab Updated Fugue particles --- .../tpgamefiles/rules/partsys/spell_compendium_partsys.tab | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index f762cb010..340df8ba0 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab @@ -69,10 +69,9 @@ sp-Frost Breath Fire Strike 30 100 Object YPR Sprite Same as Emitter Polar 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-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 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-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 From d947737b1d857e05799d3c4fca906f4d92730a5d Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 28 Feb 2022 11:19:32 +0100 Subject: [PATCH 080/146] More work on spell_utils --- tpdata/templeplus/lib/templeplus/constants.py | 3 + tpdatasrc/tpgamefiles/scr/spell_utils.py | 347 ++++++++++++++---- 2 files changed, 269 insertions(+), 81 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 60470bdb8..e8cb6a1fa 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3506,6 +3506,8 @@ 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 #Bonus Types (aka modifiers) bonus_type_untyped = 0 @@ -3539,6 +3541,7 @@ 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 diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index b494cb307..13ec3a746 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -255,6 +255,34 @@ 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 = [] + idx = 0 + for idx in range(0, targetCount): + target = spellPacket.get_target(idx) + targetList.append(target) + idx += 1 + return targetList ### Item Condition functions @@ -540,6 +568,13 @@ 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) + resistanceType = args.get_param(1) + 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 +598,86 @@ 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, ()) +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, ()) + +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,8 +694,12 @@ 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 spellPacket.check_spell_resistance(spellTarget): return False @@ -648,10 +713,12 @@ def verifyEventId(spellEventId, aoeEventId): def aoeOnEnter(attachee, args, evt_obj): print "aoeOnEnter Hook" spellTarget = evt_obj.target + print "spellTarget: ", spellTarget 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 +731,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 @@ -684,6 +751,7 @@ def aoeHandleEndSignal(attachee, args, evt_obj): return 0 def aoeCombatEndSignal(attachee, args, evt_obj): + print "received aoeCombatEndSignal" args.set_arg(1, -1) return 0 @@ -709,51 +777,168 @@ 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 + +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 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_param(0) if args.get_param(0) else 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, particlesId = 0, args = 6, preventDuplicate = True): + super(SpellDismissConcentrationFunctions, self).__init__(name, args, preventDuplicate) + self.add_hook(ET_OnConditionAdd, EK_NONE, setAuraObjToSpellRegistry, (particlesId,)) + 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, ()) + +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, ()) From a5c99d98306ed2667f2dec14c34fa346c1af209e Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 28 Feb 2022 11:21:36 +0100 Subject: [PATCH 081/146] Update spell_compendium_partsys.tab --- .../tpgamefiles/rules/partsys/spell_compendium_partsys.tab | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab index 340df8ba0..08037d6f4 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/spell_compendium_partsys.tab @@ -1,6 +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 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 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 0 255 144 +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 @@ -32,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 From 5c0e3840220b54dc74783c7f44c00c3275776838 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 1 Mar 2022 21:57:11 +0100 Subject: [PATCH 082/146] Update constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index e8cb6a1fa..3ee08d9f4 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3396,11 +3396,28 @@ spell_new_slot_lvl_8 = 1613 spell_new_slot_lvl_9 = 1614 +# Warlock Invocations +spell_frightful_blast = 2301 +spell_sickening_blast = 2302 +spell_eldritch_spear = 2303 +spell_hideous_blow = 2304 +spell_beguiling_influence = 2305 +spell_breath_of_the_night = 2306 +spell_dark_ones_own_luck = 2307 +spell_earthen_grasp = 2308 +spell_entropic_warding = 2309 +spell_leaps_and_bounds = 2310 +spell_miasmic_cloud = 2311 +spell_see_the_unseen = 2312 +spell_spiderwalk = 2313 +spell_summon_swarm = 2314 + # Python Action Spells spell_epic_of_the_lost_king = 3080 spell_grapple = 3110 spell_black_tentacle_grapple = 3111 spell_ki_blast = 3120 +spell_eldritch_blast = 3330 #Dragon Disciple Breath Weapons spell_dragon_diciple_cone_breath = 3231 @@ -3545,6 +3562,7 @@ bonus_type_marshal_aura_minor = 190 bonus_type_marshal_aura_major = 191 bonus_type_draconic_aura = 192 +bonus_type_invocation = 193 #Bonus Value is passed by spell passed_by_spell = 0 From db65b7d62f2838603639851fbc3e7342754da570 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 1 Mar 2022 21:59:09 +0100 Subject: [PATCH 083/146] Create warlock_spell.mes --- .../tpgamefiles/mes/spell_ext/warlock_spell.mes | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes 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..136b2c59f --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes @@ -0,0 +1,17 @@ +//Warlock Invocation descriptions + +// Spell Names +{2301}{Frightful Blast} +{2302}{Sickening Blast} +{2303}{Eldritch Spear} +{2304}{Hideous Blow} +{2305}{Beguiling Influence} +{3330}{Eldritch Blast} + +// Spell Descriptions +{7301} Frightful Blast {Transmutation Frightful Blast} +{7302} Sickening Blast {Transmutation Sickening Blast} +{7303} Eldritch Spear {Transmutation Eldritch Spear} +{7304} Hideous Blow {Transmutation Hideous Blow} +{7305} Beguiling Influence {Transmutation Beguiling Influence} +{8330} Eldritch Blast {Invocation Basic Eldritch Blast, dealing 1d6/two levels (max 9d6) damage.} From 919e3f16a9ac05e39dc6d3c1ed8697e23a83588b Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sat, 5 Mar 2022 10:01:41 +0100 Subject: [PATCH 084/146] Update constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 104 +++++++++++++++--- 1 file changed, 91 insertions(+), 13 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 3ee08d9f4..8f8bc9688 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3396,21 +3396,99 @@ spell_new_slot_lvl_8 = 1613 spell_new_slot_lvl_9 = 1614 -# Warlock Invocations +# Warlock Eldritch Essence Invocations spell_frightful_blast = 2301 spell_sickening_blast = 2302 -spell_eldritch_spear = 2303 -spell_hideous_blow = 2304 -spell_beguiling_influence = 2305 -spell_breath_of_the_night = 2306 -spell_dark_ones_own_luck = 2307 -spell_earthen_grasp = 2308 -spell_entropic_warding = 2309 -spell_leaps_and_bounds = 2310 -spell_miasmic_cloud = 2311 -spell_see_the_unseen = 2312 -spell_spiderwalk = 2313 -spell_summon_swarm = 2314 +spell_beshadowed_blast = 2303 +spell_brimstone_blast = 2304 +spell_hellrime_blast = 2305 +spell_bewitching_blast = 2306 +spell_noxious_blast = 2307 +spell_repelling_blast = 2308 +spell_vitriolic_blast = 2309 +spell_hindering_blast = 2310 +spell_utterdark_blast = 2311 +spell_binding_blast = 2312 +spell_penetrating_blast = 2313 +#spell_baneful_blast +#spell_hammer_blast +#spell_deteriorating_blast + +#Warlock Blast Shape Invocations +spell_eldritch_spear = 2320 +spell_hideous_blow = 2321 +spell_eldritch_chain = 2322 +spell_eldritch_cone = 2323 +spell_eldritch_doom = 2324 +spell_eldritch_line = 2325 +#spell_eldritch_glave + +#Warlock Least 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 +#spell_earthen_grasp //should be a normal spell!! +#spell_summon_swarm +#spell_baleful_utterance +#spell_darkness +#spell_devil's_sight +#spell_all_seeing_eyes +#spell_call_of_the_beast +#spell_otherwordly_whispers +#spell_serpent's_tongue +#spell_soulreaving_aura +#spell_swimming_the_styx + +#Warlock Lesser Invocations +spell_warlock_charm = 0 +spell_curse_of_despair = 0 +spell_fell_flight = 0 +spell_flee_the_scence = 0 +#spell_hungry_darkness +#spell_stony_grasp //should be a normal spell !! +spell_the_dead_walk = 0 +#spell_voidsense +spell_voracious_dispelling = 0 +spell_walk_unseen = 0 +#spell_wall_of_gloom +#spell_cold_comfort +#spell_crawling_eye // no!! +#spell_disembodied_hand // no!! +#spell_mask_of_flesh // no!! +#spell_relentless_dispelling +#spell_witchwood_step +#spell_dread_seizure +#spell_ignore_the_pyre +#spell_weighty_utterance // no + +#Warlock Greater Invocations +spell_chilling_tentacles = 0 +spell_devour_magic = 0 +spell_enervating_shadow = 0 +spell_tenacious_plague = 0 +spell_wall_of_perilous_flame = 0 +#spell_warlocks_call // no!! +#spell_caustic_mire +#spell_hellspawned_grace +#spell_nightmares_made_real +#spell_painful_slumber_of_ages +#spell_dragonward + +#Warlock Dark Invocations +#spell_dark_discorporation +#spell_dark_foresight +#spell_path_of_shadow +spell_retributive_invisibility = 0 +spell_word_of_changing = 0 +#spell_casters_lament +#spell_steal_summoning +#spell_impenetrable_barrier + # Python Action Spells spell_epic_of_the_lost_king = 3080 From 7e2e6e5fdac744c7f28e04d4049d31c51ecd6bf6 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 9 Mar 2022 12:25:25 +0100 Subject: [PATCH 085/146] Update class_spell_lists.tab --- tpdatasrc/co8infra/mes/help/class_spell_lists.tab | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tpdatasrc/co8infra/mes/help/class_spell_lists.tab b/tpdatasrc/co8infra/mes/help/class_spell_lists.tab index bea1a1636..922ace863 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] 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_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,6 +10,10 @@ 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] From 68cd5694b75e96f8fd8d16e4a291073092dd290b Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 9 Mar 2022 12:27:50 +0100 Subject: [PATCH 086/146] Update constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 8f8bc9688..4388dd631 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -80,6 +80,7 @@ Illusion = 6 Necromancy = 7 Transmutation = 8 +Invocation = 9 #Added to handle Warlock Invocations # Spell School Subschools @@ -3396,33 +3397,34 @@ 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 +spell_eldritch_chain = 2303 +spell_eldritch_cone = 2304 +spell_eldritch_doom = 2305 +spell_eldritch_line = 2306 +spell_eldritch_glave = 2307 + # Warlock Eldritch Essence Invocations -spell_frightful_blast = 2301 -spell_sickening_blast = 2302 -spell_beshadowed_blast = 2303 -spell_brimstone_blast = 2304 -spell_hellrime_blast = 2305 -spell_bewitching_blast = 2306 -spell_noxious_blast = 2307 -spell_repelling_blast = 2308 -spell_vitriolic_blast = 2309 -spell_hindering_blast = 2310 -spell_utterdark_blast = 2311 -spell_binding_blast = 2312 -spell_penetrating_blast = 2313 +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_baneful_blast #spell_hammer_blast #spell_deteriorating_blast -#Warlock Blast Shape Invocations -spell_eldritch_spear = 2320 -spell_hideous_blow = 2321 -spell_eldritch_chain = 2322 -spell_eldritch_cone = 2323 -spell_eldritch_doom = 2324 -spell_eldritch_line = 2325 -#spell_eldritch_glave - #Warlock Least Invocations spell_beguiling_influence = 2330 spell_breath_of_the_night = 2331 @@ -3432,16 +3434,16 @@ spell_miasmic_cloud = 2335 spell_see_the_unseen = 2336 spell_spiderwalk = 2337 +spell_soulreaving_aura = 2338 +spell_all_seeing_eyes = 2239 #spell_earthen_grasp //should be a normal spell!! #spell_summon_swarm #spell_baleful_utterance #spell_darkness #spell_devil's_sight -#spell_all_seeing_eyes #spell_call_of_the_beast #spell_otherwordly_whispers #spell_serpent's_tongue -#spell_soulreaving_aura #spell_swimming_the_styx #Warlock Lesser Invocations @@ -3495,7 +3497,6 @@ spell_grapple = 3110 spell_black_tentacle_grapple = 3111 spell_ki_blast = 3120 -spell_eldritch_blast = 3330 #Dragon Disciple Breath Weapons spell_dragon_diciple_cone_breath = 3231 @@ -3641,6 +3642,7 @@ bonus_type_marshal_aura_major = 191 bonus_type_draconic_aura = 192 bonus_type_invocation = 193 +bonus_type_hellrime_blast = 200 #Bonus Value is passed by spell passed_by_spell = 0 From 1368b4cd1f73f6a70f8707fd21c18dc6fe73b658 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 9 Mar 2022 12:36:07 +0100 Subject: [PATCH 087/146] Update bonus_description.mes --- tpdatasrc/tpgamefiles/mes/bonus_description.mes | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes index 7056ca7d3..1015b9487 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,6 @@ {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 From 6164bcc9206615a8c73003344e4218443cf0018c Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 9 Mar 2022 12:38:38 +0100 Subject: [PATCH 088/146] Added isLivingCreature and applyFogConcealment functions --- .../tpgamefiles/mes/bonus_description.mes | 7 ++++++ tpdatasrc/tpgamefiles/scr/spell_utils.py | 22 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes index 7056ca7d3..1015b9487 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,6 @@ {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 diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 13ec3a746..77fcbc102 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() @@ -277,11 +285,9 @@ def isMeleeWeapon(weapon): def getSpellTargets(spellPacket): targetCount = spellPacket.target_count targetList = [] - idx = 0 for idx in range(0, targetCount): target = spellPacket.get_target(idx) targetList.append(target) - idx += 1 return targetList ### Item Condition functions @@ -849,6 +855,16 @@ def aoeEffectTooltip(attachee, args, evt_obj): 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 @@ -865,6 +881,8 @@ def __init__(self, name, args = 6, preventDuplicate = True): 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.add_hook(ET_OnD20Signal, EK_S_Concentration_Broken, checkRemoveSpell, ()) def AddSpellDismiss(self): From 5b2d682dabb8c7a5b676378bf7805552ecb98179 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 9 Mar 2022 12:39:38 +0100 Subject: [PATCH 089/146] Update spell_structs.h --- TemplePlus/spell_structs.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TemplePlus/spell_structs.h b/TemplePlus/spell_structs.h index fa42afa18..eabb5d1d5 100644 --- a/TemplePlus/spell_structs.h +++ b/TemplePlus/spell_structs.h @@ -233,7 +233,8 @@ enum SpellSchools : uint32_t School_Evocation = 5, School_Illusion = 6, School_Necromancy = 7, - School_Transmutation = 8 + School_Transmutation = 8, + School_Invocation = 9 // New, added by Sagenlicht for Warlock }; From a9fede7e9837496b64d5d6ccdb7fc22f8665facd Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 9 Mar 2022 12:45:25 +0100 Subject: [PATCH 090/146] added new spell_radial option; Warlock add to stat_ext.mes --- .../tpgamefiles/mes/spells_radial_menu_options_ext.mes | 6 ++++++ tpdatasrc/tpgamefiles/mes/stat_ext.mes | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes b/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes index 7a7490243..ca0d8d384 100644 --- a/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes @@ -44,3 +44,9 @@ {3051}{Mainhand} {3052}{Offhand} {3053}{Shield} + +; save types +{3060}{3} +{3061}{Fortitude} +{3062}{Reflex} +{3063}{Will} diff --git a/tpdatasrc/tpgamefiles/mes/stat_ext.mes b/tpdatasrc/tpgamefiles/mes/stat_ext.mes index 7f3c93b07..cf5dfc354 100644 --- a/tpdatasrc/tpgamefiles/mes/stat_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/stat_ext.mes @@ -307,6 +307,10 @@ Requirements Feats: Spell Focus (conjuration). Spells: Able to cast lesser planar ally.} +{13026}Warlock{TBD! + +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. From 6c4734e08088e53f5c69b638cd8132ec71d8291b Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 9 Mar 2022 12:48:07 +0100 Subject: [PATCH 091/146] Added Warlock class --- .../tpgamefiles/mes/help/warlock_help.tab | 24 ++ .../tpgamefiles/mes/spells/warlock_spell.mes | 79 ++++ .../warlock_spell_long_descriptions.mes | 127 ++++++ .../rules/char_class/class033_warlock.py | 219 ++++++++++ .../action03301_reset_eldritch_blast.py | 18 + .../action03302_detect_magic_sla.py | 27 ++ .../d20_actions/action03310_eldritch_blast.py | 28 ++ .../action03312_eldritch_blast_chain_shape.py | 28 ++ .../rules/feats/warlock damage reduction.txt | 5 + .../rules/feats/warlock detect magic.txt | 5 + .../rules/feats/warlock eldritch blast.txt | 10 + .../feats/warlock fiendish resilience.txt | 6 + .../rules/feats/warlock invocations.txt | 4 + .../rules/feats/warlock spell failure.txt | 5 + .../rules/indicators/all_seeing_eyes.txt | 5 + .../rules/indicators/beguiling_influence.txt | 5 + .../rules/indicators/brimstone_blast.txt | 5 + .../rules/indicators/dark_ones_own_luck.txt | 5 + .../rules/indicators/hellrime_blast.txt | 5 + .../tpgamefiles/rules/partsys/warlock.tab | 6 + .../rules/spell_enums/warlock_spell_enum.mes | 111 +++++ .../rules/spells/2300 - Eldritch Blast.txt | 17 + .../rules/spells/2301 - Eldritch Spear.txt | 17 + .../rules/spells/2303 - Eldritch Chain.txt | 19 + .../rules/spells/2311 - Frightful Blast.txt | 15 + .../rules/spells/2312 - Sickening Blast.txt | 15 + .../rules/spells/2313 - Beshadowed Blast.txt | 15 + .../rules/spells/2314 - Brimstone Blast.txt | 15 + .../rules/spells/2315 - Hellrime Blast.txt | 15 + .../spells/2330 - Beguiling Influence.txt | 15 + .../spells/2331 - Breath of the Night.txt | 15 + .../spells/2332 - Dark Ones Own Luck.txt | 16 + .../rules/spells/2334 - Leaps and Bounds.txt | 15 + .../rules/spells/2335 - Miasmic Cloud.txt | 15 + .../rules/spells/2336 - See the Unseen.txt | 15 + .../rules/spells/2338 - Soulreaving Aura.txt | 16 + .../rules/spells/2339 - All Seeing Eyes.txt | 15 + .../scr/Spell2300 - Eldritch Blast.py | 50 +++ .../scr/Spell2301 - Eldritch Spear.py | 50 +++ .../scr/Spell2303 - Eldritch Chain.py | 55 +++ .../scr/Spell2311 - Frightful Blast.py | 25 ++ .../scr/Spell2312 - Sickening Blast.py | 25 ++ .../scr/Spell2313 - Beshadowed Blast.py | 25 ++ .../scr/Spell2314 - Brimstone Blast.py | 25 ++ .../scr/Spell2315 - Hellrime Blast.py | 25 ++ .../scr/Spell2330 - Beguiling Influence.py | 27 ++ .../scr/Spell2331 - Breath of the Night.py | 36 ++ .../scr/Spell2332 - Dark Ones own Luck.py | 36 ++ .../scr/Spell2334 - Leaps and Bounds.py | 27 ++ .../scr/Spell2335 - Miasmic Cloud.py | 36 ++ .../scr/Spell2336 - See the Unseen.py | 27 ++ .../scr/Spell2338 - Soulreaving Aura.py | 40 ++ .../scr/Spell2339 - All Seeing Eyes.py | 27 ++ tpdatasrc/tpgamefiles/scr/feat_utils.py | 35 ++ .../scr/tpModifiers/sp_all_seeing_eyes.py | 8 + .../scr/tpModifiers/sp_beguiling_influence.py | 8 + .../scr/tpModifiers/sp_beshadowed_blast.py | 28 ++ .../scr/tpModifiers/sp_breath_of_the_night.py | 10 + .../scr/tpModifiers/sp_brimstone_blast.py | 64 +++ .../scr/tpModifiers/sp_dark_ones_own_luck.py | 25 ++ .../scr/tpModifiers/sp_frightful_blast.py | 27 ++ .../scr/tpModifiers/sp_hellrime_blast.py | 34 ++ .../scr/tpModifiers/sp_leaps_and_bounds.py | 8 + .../scr/tpModifiers/sp_miasmic_cloud.py | 14 + .../scr/tpModifiers/sp_sickening_blast.py | 29 ++ .../scr/tpModifiers/sp_soulreaving_aura.py | 15 + .../tpgamefiles/scr/tpModifiers/warlock.py | 408 ++++++++++++++++++ 67 files changed, 2226 insertions(+) create mode 100644 tpdatasrc/tpgamefiles/mes/help/warlock_help.tab create mode 100644 tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes create mode 100644 tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes create mode 100644 tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py create mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action03301_reset_eldritch_blast.py create mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action03302_detect_magic_sla.py create mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action03310_eldritch_blast.py create mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action03312_eldritch_blast_chain_shape.py create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock damage reduction.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock detect magic.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock eldritch blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock fiendish resilience.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock invocations.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock spell failure.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/all_seeing_eyes.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/beguiling_influence.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/brimstone_blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/dark_ones_own_luck.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/hellrime_blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/partsys/warlock.tab create mode 100644 tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2300 - Eldritch Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2301 - Eldritch Spear.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2303 - Eldritch Chain.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2311 - Frightful Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2312 - Sickening Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2313 - Beshadowed Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2314 - Brimstone Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2315 - Hellrime Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2330 - Beguiling Influence.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2331 - Breath of the Night.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2332 - Dark Ones own Luck.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2334 - Leaps and Bounds.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2335 - Miasmic Cloud.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2336 - See the Unseen.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2338 - Soulreaving Aura.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2339 - All Seeing Eyes.py create mode 100644 tpdatasrc/tpgamefiles/scr/feat_utils.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_all_seeing_eyes.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beguiling_influence.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beshadowed_blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_breath_of_the_night.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_brimstone_blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_dark_ones_own_luck.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hellrime_blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_leaps_and_bounds.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_miasmic_cloud.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_sickening_blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_soulreaving_aura.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab new file mode 100644 index 000000000..e3695a3ec --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -0,0 +1,24 @@ +TAG_WARLOCKS TAG_NONCORE_CLASSES Warlocks Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_STORMLORD_TABLES] Class Skills: TBD Skill Points at Each Level: 2 + Int modifier Class Features: [CMD_CHILDREN] +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 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. +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. +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_FRIGHTFUL_BLAST TAG_SPELLS TAG_INVOCATION_LEAST Frightful Blast ~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_SICKENING_BLAST TAG_SPELLS TAG_INVOCATION_LEAST Sickening Blast ~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_BESHADOWING_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Beshadowing Blast ~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: Yes TBD! +TAG_SPELLS_BRIMSTONE_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Brimstone Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 3 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +TAG_SPELLS_HELLRIME_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Hellrime Blast ~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: Yes TBD! +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] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +TAG_SPELLS_ELDRITCH_CHAIN TAG_SPELLS TAG_INVOCATION_LESSER Eldritch Spear ~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: Yes TBD! +TAG_SPELLS_ELDRITCH_SPEAR TAG_SPELLS TAG_INVOCATION_LEAST Eldritch Spear ~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_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: Instantaneous 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: Instantaneous 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_DIPLOMANCY], 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: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +TAG_SPELLS_DARK_ONE'S_OWN_LUCK TAG_SPELLS TAG_INVOCATION_LEAST Dark Ones Own Luck ~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_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: Instantaneous 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: Instantaneous 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: Instantaneous 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! diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes new file mode 100644 index 000000000..882e182d2 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes @@ -0,0 +1,79 @@ +//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} // not implemented +{2305}{Eldritch Doom} // not implemented +{2306}{Eldritch Line} // not implemented +{2307}{Eldritch Glave} // not implemented + +// Eldritch Essence Invocations +{2311}{Frightful Blast} +{2312}{Sickening Blast} +{2313}{Beshadowed Blast} +{2314}{Brimstone Blast} +{2315}{Hellrime Blast} +{2316}{Bewitching Blast} // not implemented +{2317}{Noxious Blast} // not implemented +{2318}{Repelling Blast} // not implemented +{2319}{Vitriolic Blast} // not implemented +{2320}{Hindering Blast} // not implemented +{2321}{Utterdark Blast} // not implemented +{2322}{Binding Blast} // not implemented +{2323}{Penetrating Blast} // not implemented +{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} // not implemented +{2334}{Leaps and Bounds} +{2335}{Miasmic Cloud} +{2336}{See the Unseen} +{2337}{Spiderwalk} // not implemented +{2338}{Soulreaving Aura} +{2339}{All Seeing Eyes} + +// Spell Descriptions +{7300} Eldritch Blast {[Eldritch Blast] Ranged touch attack that deals 1d6/two levels (max 9d6) damage. Update!!!} +{7301} Eldritch Spear {Transmutation Eldritch Spear} +{7302} Hideous Blow {Transmutation Hideous Blow} +{7303} Eldritch Chain {[Blast Shape] TBD!} +{7304} Eldritch Cone {[Blast Shape] TBD!} // not implemented +{7305} Eldritch Doom {[Blast Shape] TBD!} // not implemented +{7306} Eldritch Line {[Blast Shape] TBD!} // not implemented +{7307} Eldritch Glave {[Blast Shape] TBD!} // not implemented +{7311} Frightful Blast {[Eldritch Essence] TBD!} +{7312} Sickening Blast {[Eldritch Essence] TBD!} +{7313} Beshadowed Blast {[Eldritch Essence] TBD!} +{7314} Brimstone Blast {[Eldritch Essence] TBD!} +{7315} Hellrime Blast {[Eldritch Essence] TBD!} +{7316} Bewitching Blast {[Eldritch Essence] TBD!} // not implemented +{7317} Noxious Blast {[Eldritch Essence] TBD!} // not implemented +{7318} Repelling Blast {[Eldritch Essence] TBD!} // not implemented +{7319} Vitriolic Blast {[Eldritch Essence] TBD!} // not implemented +{7320} Hindering Blast {[Eldritch Essence] TBD!} // not implemented +{7321} Utterdark Blast {[Eldritch Essence] TBD!} // not implemented +{7322} Binding Blast {[Eldritch Essence] TBD!} // not implemented +{7323} Penetrating Blast {[Eldritch Essence] TBD!} // not implemented +{7324} Baneful Blast {[Eldritch Essence] TBD!} // not implemented +{7325} Hammer Blast {[Eldritch Essence] TBD!} // not implemented +{7326} Deteriorating Blast {[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!} // not implemented +{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.} diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes new file mode 100644 index 000000000..007176a11 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes @@ -0,0 +1,127 @@ +// Warlock Invocation Long Descriptions + +{6050} Sound Lance {Projectile of intense sonic energy that deals 1d8/level (max 10d8) sonic damage. + +Casting: 1 std action [Evocation,V,S] +Range: Medium (100ft. +10 ft./level) +Target: One creature or object +Duration: Instantaneous, Save: Fort half, SR: Yes} + +{7300} Eldritch Blast {Ranged touch attack that deals 1d6/two levels (max 9d6) damage. Can be modified by Eldritch Essence Invocations. +School: [Invocation] +Casting: 1 action [S] +Range: 60ft. +Target: One creature +Duration: Instantaneous, Save: None, SR: Yes} + +{7301} Eldritch Spear {Ranged touch attack that deals 1d6/two levels (max 9d6) damage. Can be modified by Eldritch Essence Invocations. +School: [Invocation] +Casting: 1 action [S] +Range: 250ft. +Target: One creature +Duration: Instantaneous, Save: None, SR: Yes} + +{7302} Hideous Blow {TBD! +School: [Invocation] +Casting: 1 action [S] +Range: Touch +Target: One creature +Duration: Instantaneous, Save: None, SR: Yes} + +{7303} Eldritch Chain {Eldritch Blast that deals full damage to the primary target and half damage to secondary targets. A missed ranged attack breaks the chain. +School: [Invocation] +Casting: 1 action [S] +Range: 60ft. +Target: One primary + one secondary/5 levels +Duration: Instantaneous, Save: None, SR: Yes} + +{7311} Frightful Blast {In addition to the normal Eldritch Blast damage targets are shaken for 1 min. on a failed Will save. +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, 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 min on a failed Fortitude save. +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} + +{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} 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..e600c856d --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py @@ -0,0 +1,219 @@ +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_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,), + 4: (spell_beshadowed_blast, spell_hellrime_blast, spell_eldritch_chain,), + 5: (spell_bewitching_blast, spell_eldritch_cone, spell_eldritch_line, 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: () + } + +#spell_earthen_grasp + +bonus_feats =["Warlock Energy Resistance"] + +spells_per_day = { +1: (-1, 88, 88), +2: (-1, 88, 88), +3: (-1, 88, 88), +4: (-1, 88, 88), +5: (-1, 88, 88), +6: (-1, 88, 88, 88, 88), +7: (-1, 88, 88, 88, 88), +8: (-1, 88, 88, 88, 88), +9: (-1, 88, 88, 88, 88), +10: (-1, 88, 88, 88, 88), +11: (-1, 88, 88, 88, 88, 88, 88), +12: (-1, 88, 88, 88, 88, 88, 88), +13: (-1, 88, 88, 88, 88, 88, 88), +14: (-1, 88, 88, 88, 88, 88, 88), +15: (-1, 88, 88, 88, 88, 88, 88), +16: (-1, 88, 88, 88, 88, 88, 88, 88, 88, 88), +17: (-1, 88, 88, 88, 88, 88, 88, 88, 88, 88), +18: (-1, 88, 88, 88, 88, 88, 88, 88, 88, 88), +19: (-1, 88, 88, 88, 88, 88, 88, 88, 88, 88), +20: (-1, 88, 88, 88, 88, 88, 88, 88, 88, 88) +#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 #spell_source_type_ability ?? + +def GetSpellReadyingType(): + return spell_readying_innate + +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 + 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 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: + ebEnum = [] + eldritchBlast = char_editor.KnownSpellInfo(spell_eldritch_blast, 3, classEnum) + ebEnum.append(eldritchBlast) + char_editor.append_spell_enums(ebEnum) + #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) + 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 \ 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/action03310_eldritch_blast.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action03310_eldritch_blast.py new file mode 100644 index 000000000..fc6a8e9e0 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action03310_eldritch_blast.py @@ -0,0 +1,28 @@ +from toee import * +import tpactions + + +def GetActionName(): + return "Warlock Eldritch Effect" + + +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 ProjectileHit(d20action, proj, obj2): + d20action.performer.apply_projectile_hit_particles(proj, d20action.flags) + tpactions.trigger_spell_projectile(d20action.spell_id, proj) + return 1 \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/d20_actions/action03312_eldritch_blast_chain_shape.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action03312_eldritch_blast_chain_shape.py new file mode 100644 index 000000000..1044907ee --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action03312_eldritch_blast_chain_shape.py @@ -0,0 +1,28 @@ +from toee import * +import tpactions + + +def GetActionName(): + return "Warlock Eldritch Chain" + + +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 ProjectileHit(d20action, proj, obj2): + d20action.performer.apply_projectile_hit_particles(proj, d20action.flags) + tpactions.trigger_spell_projectile(d20action.spell_id, proj) + return 1 \ No newline at end of file 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 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..bc6e938b9 --- /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 heroism.tga +help_topic: TAG_SPELLS_BEGUILING_INFLUENCE +tooltip_base_text: Beguiling Influence 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/dark_ones_own_luck.txt b/tpdatasrc/tpgamefiles/rules/indicators/dark_ones_own_luck.txt new file mode 100644 index 000000000..15cc28e69 --- /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 heroism.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/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/partsys/warlock.tab b/tpdatasrc/tpgamefiles/rules/partsys/warlock.tab new file mode 100644 index 000000000..a5016dc86 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/partsys/warlock.tab @@ -0,0 +1,6 @@ +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-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/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes new file mode 100644 index 000000000..aed0ce14b --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -0,0 +1,111 @@ +// Warlock Invocation enums + +// Eldritch Blast Shape Invocations +{2300}{Eldritch Blast} +{2301}{Eldritch Spear} +{2302}{Hideous Blow} // not implemented +{2303}{Eldritch Chain} +{2304}{Eldritch Cone} // not implemented +{2305}{Eldritch Doom} // not implemented +{2306}{Eldritch Line} // not implemented +{2307}{Eldritch Glave} // not implemented + +// Eldritch Essence Invocations +{2311}{Frightful Blast} +{2312}{Sickening Blast} +{2313}{Beshadowed Blast} +{2314}{Brimstone Blast} +{2315}{Hellrime Blast} +{2316}{Bewitching Blast} // not implemented +{2317}{Noxious Blast} // not implemented +{2318}{Repelling Blast} // not implemented +{2319}{Vitriolic Blast} // not implemented +{2320}{Hindering Blast} // not implemented +{2321}{Utterdark Blast} // not implemented +{2322}{Binding Blast} // not implemented +{2323}{Penetrating Blast} // not implemented +{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} // not implemented +{2334}{Leaps and Bounds} +{2335}{Miasmic Cloud} +{2336}{See the Unseen} +{2337}{Spiderwalk} // not implemented +{2338}{Soulreaving Aura} +{2339}{All Seeing Eyes} + +{7300}{Eldritch Blast} +{7301}{Eldritch Spear} +{7302}{Hideous Blow} // not implemented +{7303}{Eldritch Chain} +{7304}{Eldritch Cone} // not implemented +{7305}{Eldritch Doom} // not implemented +{7306}{Eldritch Line} // not implemented +{7307}{Eldritch Glave} // not implemented +{7311}{Frightful Blast} +{7312}{Sickening Blast} +{7313}{Beshadowed Blast} +{7314}{Brimstone Blast} +{7315}{Hellrime Blast} +{7316}{Bewitching Blast} // not implemented +{7317}{Noxious Blast} // not implemented +{7318}{Repelling Blast} // not implemented +{7319}{Vitriolic Blast} // not implemented +{7320}{Hindering Blast} // not implemented +{7321}{Utterdark Blast} // not implemented +{7322}{Binding Blast} // not implemented +{7323}{Penetrating Blast} // not implemented +{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} // not implemented +{7334}{Leaps and Bounds} +{7335}{Miasmic Cloud} +{7336}{See the Unseen} +{7337}{Spiderwalk} // not implemented +{7338}{Soulreaving Aura} +{7339}{All Seeing Eyes} + +{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} // not implemented +{22305}{TAG_SPELLS_ELDRITCH_DOOM} // not implemented +{22306}{TAG_SPELLS_ELDRITCH_LINE} // not implemented +{22307}{TAG_SPELLS_ELDRITCH_GLAVE} // 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} // not implemented +{22317}{TAG_SPELLS_NOXIOUS_BLAST} // not implemented +{22318}{TAG_SPELLS_REPELLING_BLAST} // not implemented +{22319}{TAG_SPELLS_VITRIOLIC_BLAST} // not implemented +{22320}{TAG_SPELLS_HINDERING_BLAST} // not implemented +{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} // not implemented +{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} 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..aec893bde --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt @@ -0,0 +1,17 @@ +School: Invocation +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..02357e391 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt @@ -0,0 +1,17 @@ +School: Invocation +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..c7df24742 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt @@ -0,0 +1,19 @@ +School: Invocation +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/2311 - Frightful Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt new file mode 100644 index 000000000..119835c83 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt @@ -0,0 +1,15 @@ +School: Invocation +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..119835c83 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt @@ -0,0 +1,15 @@ +School: Invocation +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..119835c83 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt @@ -0,0 +1,15 @@ +School: Invocation +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..119835c83 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt @@ -0,0 +1,15 @@ +School: Invocation +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..119835c83 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt @@ -0,0 +1,15 @@ +School: Invocation +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..686dd608e --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt @@ -0,0 +1,15 @@ +School: Invocation +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..ba15c65da --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt @@ -0,0 +1,15 @@ +School: Invocation +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..9a6484ab4 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt @@ -0,0 +1,16 @@ +School: Invocation +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/2334 - Leaps and Bounds.txt b/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt new file mode 100644 index 000000000..686dd608e --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt @@ -0,0 +1,15 @@ +School: Invocation +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..e68c8cb2d --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt @@ -0,0 +1,15 @@ +School: Invocation +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..686dd608e --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt @@ -0,0 +1,15 @@ +School: Invocation +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..89060b738 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt @@ -0,0 +1,16 @@ +School: Invocation +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..686dd608e --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt @@ -0,0 +1,15 @@ +School: Invocation +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/scr/Spell2300 - Eldritch Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2300 - Eldritch Blast.py new file mode 100644 index 000000000..f1c77a1f4 --- /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-Ray of Enfeeblement", 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 = int((spell.caster_level + 1) / 2) #capped at cl 20 (9d6) + 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-Ray of Enfeeblement-END", 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..eb9c4a68a --- /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-Ray of Enfeeblement", 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 = int((spell.caster_level + 1) / 2) #capped at cl 20 (9d6) + 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-Ray of Enfeeblement-END", 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..d623c55d9 --- /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 = int((spell.caster_level + 1) / 2) #capped at cl 20 (9d6) + 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/Spell2311 - Frightful Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2311 - Frightful Blast.py new file mode 100644 index 000000000..af69c6faf --- /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("sp-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..008cdd166 --- /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("sp-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..2f2c0b318 --- /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("sp-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..cfe9967e9 --- /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("sp-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..c6b05171b --- /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("sp-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/Spell2330 - Beguiling Influence.py b/tpdatasrc/tpgamefiles/scr/Spell2330 - Beguiling Influence.py new file mode 100644 index 000000000..14a1f00c1 --- /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-Heroism', 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..298546257 --- /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 = (spellTarget.obj.stat_level_get(stat_charisma) - 10) / 2 + saveType = spell.spell_get_menu_arg(RADIAL_MENU_PARAM_MIN_SETTING) + + if saveType == 1 or 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("sp-Heroism", 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/Spell2334 - Leaps and Bounds.py b/tpdatasrc/tpgamefiles/scr/Spell2334 - Leaps and Bounds.py new file mode 100644 index 000000000..f1e86d52c --- /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-Heroism', 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..c7d815d73 --- /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, spellDc, 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/feat_utils.py b/tpdatasrc/tpgamefiles/scr/feat_utils.py new file mode 100644 index 000000000..9aa7f3348 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/feat_utils.py @@ -0,0 +1,35 @@ +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 + 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..010e2cb0f --- /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("sp-Beshadowed Blast") #spellEnum, empty +beshadowedBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) +beshadowedBlast.AddQuerySecondaryTrue() \ No newline at end of file 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..ae818df43 --- /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("sp-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..0ba6386f8 --- /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 +from spell_utils import SpellPythonModifier + +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) + spellTarget.condition_add_with_args("Brimstone Burn", spellId, duration, 0) + return 0 + +brimstoneBlast = EldritchBlastEssenceModifier("sp-Brimstone Blast") #spellEnum, 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)) + spellTarget.obj.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 = SpellPythonModifier("Brimstone Blast Effect") #spellId, duration, 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_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_frightful_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py new file mode 100644 index 000000000..655a1ea25 --- /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("sp-Frightful Blast") #spellEnum, empty +frightfulBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) \ No newline at end of file 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..af564742c --- /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 +from spell_utils import SpellPythonModifier + +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("sp-Hellrime Blast") #spellEnum, empty +hellrimeBlast.ModifyDamageType(D20DT_COLD) +hellrimeBlast.AddQuerySecondaryTrue() + +### Secondary Burn Effect ### + +hellrimeEffect = SpellPythonModifier("Hellrime Blast Effect") #spellId, duration, empty +hellrimeEffect.AddAbilityBonus(-4, bonus_type_hellrime_blast, stat_dexterity) 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..3888aeef0 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_miasmic_cloud.py @@ -0,0 +1,14 @@ +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): + return 0 + +breathOfTheNightEffect = AoeSpellEffectModifier("sp-Miasmic Cloud") #spellId, duration, bonusValue, spellEventId, spellDc, empty +breathOfTheNightEffect.AddHook(ET_OnConditionAdd, EK_NONE, applyFatigue, ()) +breathOfTheNightEffect.AddFogConcealment() \ 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..fc287ff87 --- /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("sp-Sickening Blast") #spellEnum, 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/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py new file mode 100644 index 000000000..9274596cd --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -0,0 +1,408 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp +import char_class_utils +import tpactions +from spell_utils import getSpellClassCode + +################################################### + +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, ()) + +#### Warlock Feats #### + +## Eldritch Blast + +def queryStance(attachee, args, evt_obj): + stanceEnum = args.get_arg(0) + evt_obj.return_val = stanceEnum + return 0 + +def updateEssenceStance(attachee, args, evt_obj): + if (evt_obj.is_modifier("sp-Eldritch Essence") + or evt_obj.is_modifier("sp-Frightful Blast") + or evt_obj.is_modifier("sp-Sickening Blast") + or evt_obj.is_modifier("sp-Beshadowed Blast") + or evt_obj.is_modifier("sp-Brimstone Blast") + or evt_obj.is_modifier("sp-Hellrime Blast")): + args.condition_remove() + return 0 + +def getStanceName(spellEnum): + return game.get_spell_mesline(spellEnum) + +def floatActivation(attachee, args, evt_obj): + spellEnum = args.get_arg(0) + if spellEnum != spell_eldritch_blast: + stanceName = getStanceName(spellEnum) + attachee.float_text_line("{} activated".format(stanceName), tf_light_blue) + else: + attachee.float_text_line("Eldritch Essence resetted", tf_light_blue) + return 0 + +def verifyEldritchBlastAction(spellEnum): + #currentSequence = tpactions.get_cur_seq() + #spellPacket = currentSequence.spell_packet + if spellEnum in range(spell_eldritch_blast, spell_eldritch_glave + 1): + return True + return False + +def addToolTip(attachee, args, evt_obj): + spellEnum = args.get_arg(0) + if spellEnum != spell_eldritch_blast: + stanceName = getStanceName(spellEnum) + evt_obj.append("Stance: {}".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 EldritchBlastAddHook(tpdp.ModifierSpec): + def AddHook(self, eventType, eventKey, callbackFcn, argsTuple): + self.add_hook(eventType, eventKey, callbackFcn, argsTuple) + +class EldritchBlastEssenceModifier(EldritchBlastAddHook): + #This class is used for all Eldritch Blast Essence Modifiers + #It has at least two args: spellEnum, empty + def __init__(self, name, args = 2, preventDuplicate = False): + super(EldritchBlastAddHook, self).__init__(name, args, preventDuplicate) + self.add_hook(ET_OnConditionAddPre, EK_NONE, updateEssenceStance, ()) + self.add_hook(ET_OnD20PythonQuery, "PQ_Eldritch_Esssence_Stance", queryStance, ()) + self.add_hook(ET_OnConditionAdd, EK_NONE, floatActivation, ()) + 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("sp-Eldritch Essence") #spellEnum, empty + +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("sp-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): + print "applyEldritchBlastSpellLevel Hook" + spellEntry = evt_obj.spell_entry + spellEnum = spellEntry.spell_enum + if spellEnum in range(spell_eldritch_blast, spell_eldritch_glave + 1): + activeEssenceEnum = getActiveEldritchEssence(attachee) + if activeEssenceEnum != spell_eldritch_blast: + spellClass = getSpellClassCode(classEnum) + spellEntryEssence = tpdp.SpellEntry(activeEssenceEnum) + spellLevel = spellEntryEssence.level_for_spell_class(spellClass) - 1 #Eldritch Blast itself is level 1 and is already applied + print "spellLevel: ", spellLevel + if spellLevel > 0: + evt_obj.bonus_list.add(spellLevel, bonus_type_untyped, "Warlock Eldritch Blast spell level modification") + return 0 + +#eldritchBlastHandling = PythonModifier("Eldritch Blast Handling", 1) #empty +#eldritchBlastHandling.MapToFeat("Warlock Eldritch Blast") +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) #empty, empty +warlockDetectMagic.MapToFeat("Warlock Detect Magic") +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) #empty, empty +warlockDamageReduction.MapToFeat("Warlock Damage Reduction") +warlockDamageReduction.AddHook(ET_OnTakingDamage2, EK_NONE, addColdIronDr, ()) + +## Deceive Item ## +# TBD! + +## Fiendish Resilience ## +def radialFiendishResilience(attachee, args, evt_obj): + chargesLeft = args.get_arg(0) + 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(0) + 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(0) + 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, 0) + chargesLeft -= 1 + args.set_arg(0, chargesLeft) + return 0 + +def resetFiendishResilienceCharges(attachee, args, evt_obj): + args.set_arg(0, 1) + return 0 + +warlockFiendishResilience = PythonModifier("Warlock Fiendish Resilience", 3) #chargesLeft, empty, empty +warlockFiendishResilience.MapToFeat("Warlock Fiendish Resilience") +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 getDurationLabel(duration): + if duration != 1: + return "rounds" + return "round" + +def fiendishResilienceTooltip(attachee, args, evt_obj): + duration = args.get_arg(0) + durationLabel = getDurationLabel(duration) + fastHealingAmount = args.get_arg(1) + evt_obj.append("Fast Healing {} ({} {})".format(fastHealingAmount, duration, durationLabel)) + return 0 + +def fiendishResilienceEffectTooltip(attachee, args, evt_obj): + duration = args.get_arg(0) + durationLabel = getDurationLabel(duration) + fastHealingAmount = args.get_arg(1) + evt_obj.append(tpdp.hash("WARLOCK_FIENDISH_RESILIENCE"), -2, " {} ({} {})".format(fastHealingAmount, duration, durationLabel)) + return 0 + +warlockFiendishResilienceEffect = PythonModifier("Warlock Fiendish Resilience Effect", 4) #duration, healAmount, empty, 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', 0) +warlockEnergyResistanceAcid .MapToFeat('Warlock Energy Resistance - Acid') +warlockEnergyResistanceAcid .AddHook(ET_OnTakingDamage, EK_NONE, addEnergyResistance, (D20DT_ACID,)) + +warlockEnergyResistanceCold = PythonModifier('Warlock Cold Resistance Feat', 0) +warlockEnergyResistanceCold.MapToFeat('Warlock Energy Resistance - Cold') +warlockEnergyResistanceCold.AddHook(ET_OnTakingDamage, EK_NONE, addEnergyResistance, (D20DT_COLD,)) + +warlockEnergyResistanceElectricity = PythonModifier('Warlock Electricity Resistance Feat', 0) +warlockEnergyResistanceElectricity.MapToFeat('Warlock Energy Resistance - Electricity') +warlockEnergyResistanceElectricity.AddHook(ET_OnTakingDamage, EK_NONE, addEnergyResistance, (D20DT_ELECTRICITY,)) + +warlockEnergyResistanceFire = PythonModifier('Warlock Fire Resistance Feat', 0) +warlockEnergyResistanceFire.MapToFeat('Warlock Energy Resistance - Fire') +warlockEnergyResistanceFire.AddHook(ET_OnTakingDamage, EK_NONE, addEnergyResistance, (D20DT_FIRE,)) + +warlockEnergyResistanceSonic = PythonModifier('Warlock Sonic Resistance Feat', 0) +warlockEnergyResistanceSonic.MapToFeat('Warlock Energy Resistance - Sonic') +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", 0) +warlockSpellFailure.MapToFeat("Warlock Spell Failure") +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, ()) From 470f325535d7892924bd5f0a08cbe6766dc89869 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 9 Mar 2022 12:57:02 +0100 Subject: [PATCH 092/146] regenerated .dat files --- tpdata/co8infra.dat | Bin 1272153 -> 1276284 bytes tpdata/tpgamefiles.dat | Bin 3742535 -> 3843258 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tpdata/co8infra.dat b/tpdata/co8infra.dat index 178389aefe57867f20c5f230817b6e53ca790813..d334feab0ed2d1b045e014a40899c4cab5809196 100644 GIT binary patch delta 21403 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 D*;>K; diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 8f7f340bb64e0a2c3e6b05a63015c2ac090523c0..27e0ba9b5ee2f27fb0f0fb8095926f6a112d17ae 100644 GIT binary patch delta 205281 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

@r;_oFHWFJCgCreyzkcd@q4jE9QVB$ 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

{(@;{Z;{(#qMA_xG3m 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 From 618bb602ebc9426841a72b21ecfbb456e469d277 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 10 Mar 2022 11:14:51 +0100 Subject: [PATCH 093/146] Update class_spell_lists.tab Fixed missing bracket --- tpdatasrc/co8infra/mes/help/class_spell_lists.tab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpdatasrc/co8infra/mes/help/class_spell_lists.tab b/tpdatasrc/co8infra/mes/help/class_spell_lists.tab index 922ace863..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] 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_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] From 0813256127d4c93ed50a7d29a91df0225a25d6d5 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 10 Mar 2022 12:11:38 +0100 Subject: [PATCH 094/146] Warlock updates Updated Least Invocations particles/buff symbols Finished Miasmic Cloud --- .../Ailments/Miasmic Cloud.tga | Bin 0 -> 1042 bytes .../Ailments/Spell Breath of the Night.tga | Bin 0 -> 1042 bytes .../Buffs/Spell Beguiling Influence.tga | Bin 0 -> 1042 bytes .../Buffs/Spell Dark Ones Own Luck.tga | Bin 0 -> 1042 bytes .../Buffs/Spell Leaps and Bounds.tga | Bin 0 -> 1042 bytes .../tpgamefiles/mes/help/warlock_help.tab | 2 +- .../rules/indicators/beguiling_influence.txt | 2 +- .../rules/indicators/breath_of_the_night.txt | 5 ++ .../rules/indicators/dark_ones_own_luck.txt | 2 +- .../rules/indicators/leaps_and_bounds.txt | 5 ++ .../rules/indicators/miasmic_cloud.txt | 5 ++ .../tpgamefiles/rules/partsys/warlock.tab | 13 +++ .../rules/spells/2300 - Eldritch Blast.txt | 2 +- .../rules/spells/2301 - Eldritch Spear.txt | 2 +- .../rules/spells/2303 - Eldritch Chain.txt | 2 +- .../rules/spells/2311 - Frightful Blast.txt | 2 +- .../rules/spells/2312 - Sickening Blast.txt | 2 +- .../rules/spells/2313 - Beshadowed Blast.txt | 2 +- .../rules/spells/2314 - Brimstone Blast.txt | 2 +- .../rules/spells/2315 - Hellrime Blast.txt | 2 +- .../spells/2330 - Beguiling Influence.txt | 2 +- .../spells/2331 - Breath of the Night.txt | 2 +- .../spells/2332 - Dark Ones Own Luck.txt | 2 +- .../rules/spells/2334 - Leaps and Bounds.txt | 2 +- .../rules/spells/2335 - Miasmic Cloud.txt | 2 +- .../rules/spells/2336 - See the Unseen.txt | 2 +- .../rules/spells/2338 - Soulreaving Aura.txt | 2 +- .../rules/spells/2339 - All Seeing Eyes.txt | 2 +- .../scr/Spell2330 - Beguiling Influence.py | 2 +- .../scr/Spell2332 - Dark Ones own Luck.py | 4 +- .../scr/Spell2334 - Leaps and Bounds.py | 2 +- .../scr/Spell2335 - Miasmic Cloud.py | 2 +- .../scr/tpModifiers/fatigue_exhaustion.py | 17 +++- .../scr/tpModifiers/sp_breath_of_the_night.py | 2 +- .../scr/tpModifiers/sp_miasmic_cloud.py | 18 ++++- .../sound/user_sounds/warlock_sounds.mes | 74 ++++++++++++++++++ 36 files changed, 157 insertions(+), 30 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Miasmic Cloud.tga create mode 100644 tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Spell Breath of the Night.tga create mode 100644 tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Beguiling Influence.tga create mode 100644 tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Dark Ones Own Luck.tga create mode 100644 tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Buffs/Spell Leaps and Bounds.tga create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/breath_of_the_night.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/leaps_and_bounds.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/miasmic_cloud.txt create mode 100644 tpdatasrc/tpgamefiles/sound/user_sounds/warlock_sounds.mes diff --git a/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Miasmic Cloud.tga b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Miasmic Cloud.tga new file mode 100644 index 0000000000000000000000000000000000000000..b4b31787727d3d496c7ec9fa1e3b48bcdd92a725 GIT binary patch literal 1042 zcmZQzU}As)0R{mE1r8W*kkS7sa1Tf?43laMSl_g1(_s2RG_e4#_e9x_|0J3L*L$w* zz<-ebO2ceY%mAwe>78!d3dSJ)e)6u!X5jM&SRJ}vkaXUXWR&>Idls`5mMW z<`+`z2k8gd3o-+SNzo4qFPIsyupmW0$jvY_K<0ojDf(ey1~LPNiPVoTZt%(h032k( A#sB~S literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d25ee0c0a76d335558886bc690c6c69126a09a55 GIT binary patch literal 1042 zcmd6ku?+(u5Cl(-9DWI|jRcX<1HI4$rBKcJ$I@EJ!JBhrq>W&9_YSk0=^S?0VE zZ#o;Em4535D@8rTl~TeUE8AN0h{wu~F}&95Ip=K;c=G0)4&Qr!DW&xGxY~ty-hX;% uj$NMY)g!{g(gCppW{L1H5?)bWdlSnXk$mzb*y#RYBv^XvGx4S2?3#d#0 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ed082bd167b6ae0c0481015d187bafaa342f2b39 GIT binary patch literal 1042 zcmZQzU}As)0R{mE1&;s!|1(gEfhPXX%*^~B#9)ttiy0!o;vji^c3{*0#Qyz%a`fM3 zSOIp!GKTv9Jq+0-*$=W4q#s0s^n)<8%w(WKfB zvK!eSr0NIh1>qG8jU?F*i$j=Rkbaomgu)M$Hb81%W{|2EmbQ@1fU#k6#L_T*AevY` N=;|oZi*6RJ`2f*+jn@DG literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2c5e74b74a11aac018a8311ea0332608654b5b12 GIT binary patch literal 1042 zcmdUt!3lsc3`K(n@z@buufuqA64!AJ?=iplH59}Y@nE2&Y4d(kQjtz*Ns^3%s><7C zikfrQrJqgeGQ>E?z1eLY&r<`wmEWfI>;Wv|milNCjQ1@(*&=Xg{fYPQ=3Aou`x!#V m&+cjdmToCh{t4>ASU19g$MPE7^DgSi!AF@o?+sgPeI4)jN5KdH literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..451fef493fb6116b4ac8d31543406752b079811d GIT binary patch literal 1042 zcmcJNO-sW-5Qdj3vcdjiS&hg;}`VRpzZ`4u_$E=>S zi!mHrrcv{%%DjEO1gklVUerP3eh<5$HV|LBO2fHX#PjPDyjv6A-AaEhs{dc~N73p$ z(yY*GKcL`i%KQnhVEru7XS&e~^8N@m8Xxzf;$Lyfm{?|*F_W;}GN#sskX;q`=hl?w zM;_Em%%nMt%sfNYIqI{&`O|x#9*Sez!uZ11cdM|(f7hV5DD`AbHA`*~-?;W)*tphz GpWgxQ8G_dU literal 0 HcmV?d00001 diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab index e3695a3ec..0744856d0 100644 --- a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -15,7 +15,7 @@ TAG_SPELLS_ELDRITCH_BLAST TAG_SPELLS TAG_INVOCATION_LEAST Eldritch Blast ~Invoc TAG_SPELLS_ELDRITCH_CHAIN TAG_SPELLS TAG_INVOCATION_LESSER Eldritch Spear ~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: Yes TBD! TAG_SPELLS_ELDRITCH_SPEAR TAG_SPELLS TAG_INVOCATION_LEAST Eldritch Spear ~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_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: Instantaneous 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: Instantaneous 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_DIPLOMANCY], and ~Intimidate~[TAG_INTIMIDATE] checks. +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: Instantaneous 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: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! TAG_SPELLS_DARK_ONE'S_OWN_LUCK TAG_SPELLS TAG_INVOCATION_LEAST Dark Ones Own Luck ~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_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: Instantaneous 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. diff --git a/tpdatasrc/tpgamefiles/rules/indicators/beguiling_influence.txt b/tpdatasrc/tpgamefiles/rules/indicators/beguiling_influence.txt index bc6e938b9..a98060836 100644 --- a/tpdatasrc/tpgamefiles/rules/indicators/beguiling_influence.txt +++ b/tpdatasrc/tpgamefiles/rules/indicators/beguiling_influence.txt @@ -1,5 +1,5 @@ ID_string: BEGUILING_INFLUENCE effect_type: 0 -texture_file: art\interface\player_conditions\buffs\spell heroism.tga +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/dark_ones_own_luck.txt b/tpdatasrc/tpgamefiles/rules/indicators/dark_ones_own_luck.txt index 15cc28e69..31e36a7c2 100644 --- a/tpdatasrc/tpgamefiles/rules/indicators/dark_ones_own_luck.txt +++ b/tpdatasrc/tpgamefiles/rules/indicators/dark_ones_own_luck.txt @@ -1,5 +1,5 @@ ID_string: DARK_ONE'S_OWN_LUCK effect_type: 0 -texture_file: art\interface\player_conditions\buffs\spell heroism.tga +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/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/partsys/warlock.tab b/tpdatasrc/tpgamefiles/rules/partsys/warlock.tab index a5016dc86..02229781a 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/warlock.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/warlock.tab @@ -1,5 +1,18 @@ 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-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-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 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt index aec893bde..838c8dc1d 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: 1 action Range: Specified 60 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt b/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt index 02357e391..6abdc874a 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: 1 action Range: Specified 250 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt b/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt index c7df24742..93c12b00c 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: 1 action Range: Specified 60 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt index 119835c83..cbf714846 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt index 119835c83..cbf714846 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt index 119835c83..cbf714846 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt index 119835c83..cbf714846 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt index 119835c83..cbf714846 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt b/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt index 686dd608e..7c914b3fe 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt b/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt index ba15c65da..b65d4e27a 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt b/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt index 9a6484ab4..c71833f71 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt b/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt index 686dd608e..7c914b3fe 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt b/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt index e68c8cb2d..8660245f0 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt b/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt index 686dd608e..7c914b3fe 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt b/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt index 89060b738..d4f99f473 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: Swift Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt b/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt index 686dd608e..7c914b3fe 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt @@ -1,4 +1,4 @@ -School: Invocation +School: Evocation Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/scr/Spell2330 - Beguiling Influence.py b/tpdatasrc/tpgamefiles/scr/Spell2330 - Beguiling Influence.py index 14a1f00c1..fcd4dcdea 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2330 - Beguiling Influence.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2330 - Beguiling Influence.py @@ -12,7 +12,7 @@ def OnSpellEffect(spell): 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-Heroism', spellTarget.obj) + 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) diff --git a/tpdatasrc/tpgamefiles/scr/Spell2332 - Dark Ones own Luck.py b/tpdatasrc/tpgamefiles/scr/Spell2332 - Dark Ones own Luck.py index 298546257..a91e1509a 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2332 - Dark Ones own Luck.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2332 - Dark Ones own Luck.py @@ -13,7 +13,7 @@ def OnSpellEffect(spell): bonusValue = (spellTarget.obj.stat_level_get(stat_charisma) - 10) / 2 saveType = spell.spell_get_menu_arg(RADIAL_MENU_PARAM_MIN_SETTING) - if saveType == 1 or not in range(1, 4): #not in range is fallback + if saveType == 1 or saveType not in range(1, 4): #not in range is fallback saveTypeLabel = "Fortitude" elif saveType == 2: saveTypeLabel = "Reflex" @@ -21,7 +21,7 @@ def OnSpellEffect(spell): 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("sp-Heroism", spellTarget.obj) + 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) diff --git a/tpdatasrc/tpgamefiles/scr/Spell2334 - Leaps and Bounds.py b/tpdatasrc/tpgamefiles/scr/Spell2334 - Leaps and Bounds.py index f1e86d52c..bacdd764f 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2334 - Leaps and Bounds.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2334 - Leaps and Bounds.py @@ -12,7 +12,7 @@ def OnSpellEffect(spell): 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-Heroism', spellTarget.obj) + 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) diff --git a/tpdatasrc/tpgamefiles/scr/Spell2335 - Miasmic Cloud.py b/tpdatasrc/tpgamefiles/scr/Spell2335 - Miasmic Cloud.py index c7d815d73..78e37c5c5 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2335 - Miasmic Cloud.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2335 - Miasmic Cloud.py @@ -24,7 +24,7 @@ def OnSpellEffect(spell): targetsToRemove.append(spellTarget.obj) spell.target_list.remove_list(targetsToRemove) - cloudObject.condition_add_with_args("sp-Miasmic Cloud", spell.id, spell.duration, 0, cloudEventId, spellDc, 0) + cloudObject.condition_add_with_args("sp-Miasmic Cloud", spell.id, spell.duration, 0, cloudEventId, spell.dc, 0) spell.target_list.remove_list(targetsToRemove) 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/sp_breath_of_the_night.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_breath_of_the_night.py index ae818df43..5aadbbd06 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_breath_of_the_night.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_breath_of_the_night.py @@ -6,5 +6,5 @@ breathOfTheNightSpell = AoeSpellHandleModifier("sp-Breath of the Night") #spellId, duration, bonusValue, spellEventId, spellDc, empty -breathOfTheNightEffect = AoeSpellEffectModifier("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_miasmic_cloud.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_miasmic_cloud.py index 3888aeef0..2e755d22f 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_miasmic_cloud.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_miasmic_cloud.py @@ -7,8 +7,24 @@ 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 -breathOfTheNightEffect = AoeSpellEffectModifier("sp-Miasmic Cloud") #spellId, duration, bonusValue, spellEventId, spellDc, empty +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/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 From 2f426f0d365ceb101477e3931882df5901c3cfef Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 10 Mar 2022 12:12:52 +0100 Subject: [PATCH 095/146] regenerated dat files --- tpdata/co8infra.dat | Bin 1276284 -> 1276285 bytes tpdata/tpgamefiles.dat | Bin 3843258 -> 3846623 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tpdata/co8infra.dat b/tpdata/co8infra.dat index d334feab0ed2d1b045e014a40899c4cab5809196..747050e0cd4486d949b4b79108c1b9d865a43389 100644 GIT binary patch delta 20684 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%0D$*P{lRDicgXb$ym)|xbeTX5+}dJZlF zs(lQXUhp;9nBzoxZz}fEhUXEvCoMTdQmZa6Q>w2>XOi^I1=lP7H^|wdku z%)t6GBKKuuuJf!%yYMo!4caCbav8w}ormRA%68$XM9f7aT4&8_SnHEgF_#g%sn*FV z{d?In*WLkj9`dQ{1p?VDo$^T1qw(c(h_@oLT;lRbvi+DlCbO7_mE`V|*Yaq5!k=}# z(H=lX+vSryT3M&q?mGJz@khCv$8(?WW!JiqF1(KRc9}kpdC2*bi^Ca{RP0~SXs?uN(@5!oPJ^O?0;#qWVb5xFXH`DE$WnhXI?#QMIh%qQ-8wVp^T zU%)zA4qB0b#vPz0_ApdSmjb4zLr+vTHOT`Xm)HVo(xM`E`TPPrMwS*ZRITcA5Z!qK zmw%JJ1;lMsdnY)IbZ*MM0@ioD7Iq}~U93Z7+Tue<#MHv=j;$2&BwU;wc_>_8CJxW32O4mSf9swgcKK1*a$r%Z_|eV5MU1p z79moo=g&vy!yY7mt%%KgSVwaxcmUWZqZV*1J2agU;DO-hrD_4zEoa>T-vMWVv!r1G z+7Wu92CK+!`Nmp%{^?prfcs(HA}V$%7%F$v(LgHPK zr`3AA^eV9@O`iuxgP*~AwxpDBE~DC9>j~iD;N`NVgh#nT#WCQK;9trY)_U!~9$80% zPs@ab&P0zITj>$duJRhx8@%cok5?QeM;0ROx$NSJDxE2POPv^Ror*jM9)-v%$tgu7 z(Ee?aM%huy2zs*JN1R#o%yywoE|t>Z8r9CA=}Ty37a3B<<6vs0Ykio3-Hi1z$tYv$ zeOWG!WjWdj3YYiG7}$8luOKoLktuS^X-_M7orL>|d$I;t&26zO+Q%f{PnJHd zR3g}bo2A}b$7_J`;CqNP%RN6+U!wu$;W7<;Orp!3u^uhpW#UUhV~G5yocR12h+U(p zjPVj_w7C8Ma2oi8+$m>x{3_C&6PXVlCb1P**J}YEimZ{P6&$E&#n;eI$NGviR*-v+ zV%y5|#1|)bE7&F-m)z#qecTQnC^40Y)T;GNvY86*CQB=MNz)wd6yJf)klmF?2NmB& z!#=M~k*_O}4pZrJ_SZ?Q>m{~|;l8Q$yM}Z!_$N|hajjZ!po^v87CBJG$!=EdGVlcO zROz$`?Rsrl{Ro~&Sys#B#YKojTye8G8)?jS`qNidF5>;FL0yg|?iq-5mg9>UwZqzA zA;4_#Oz|w{WVh;}yhMQZ$?*e8TudZU8p#*jwQo>cudH3{4DZvN;!a>LiQ6|a6UsNP zbSJ313o7ZTtd^eDY}lq$*L(~4*gHd;yjV>M+ZCS!CxD-l*TMYTXxBOskypW0{rmjy zO{5iH%(1Dg$}i0;v@Z=cKXa{rI)OTo{eHPs?L0FnT19%IJsgpc$VVa<5dfP9FCFdr z`PS{m>>Fgi2}ufYP&+h}>X$frc>Ge{4DiyC@P_N{)?ii!-qy$`0lwKW=`Oy+Yu?9v zVvpPi@XbyG)(^f^^DS|Fu|7?Azth=FSwq8r-N#%ejE8S=VZp|)!#j3Oe`EFDrs@4o S{C0Fw+>~xSu^)QYnEwK=fSsoR delta 20661 zcmZ6yWmH?=)4z?o2WxSsxVsg1*W&K(8mttGYj7>@?(P(KcX!u9|LOhvzIfL2V%C{` z?a$1fGiQ>ulB~SnD*U-s2n>Y`g$jiZg$acXg$sobMF>RMQcF6V*pyE zQX2db{~gf1P!Kd_GNq7X<+o_N0KeXLGPJeGWxwc~V>ZkFG)Ygq1M<1b4_Ktj$qi89 z6M4^f3wV_{dA^UFJvqTE?4M(nwJbJFic#!-uJm$QjLc&G*rKyq0zCrNRhb_;Iv{U5 zIs&{647voEs|~V2c+6A3Z9zu|g}~o;SmR|!-5Y=Igb`J#u>yQ$om@9;AJ`MBo-s1U zL+EFsz8AD40}#e_Rt*XMajODr{iN$MfiQk0z#VRj726ld?Dz4s`QWO2Aiwvbl= zm@LGgPOU^yCPz>OX?6mhvVyGplx_tlaqlfoH+{X@?0$S{yuRvi+PCH*nFgM(Syuj* zJR6dc#AH>%hnf>BhQG>c79hKPD;A&Pi*V@|cs{{KKZl$~_a`1ibN zcKW3|5%1Ks!=rN8C#f@C%oIsa-1vG#ZNwh%{(-?5%<9|_gI5&rc{&DjIkht5^?Tvy z7t;YZS$KPe#K14zRHs?!*XdJ&+?rABS!wRCJgV$D-4MIsy&hQyadAM2p>L0l;UrJT zEuJ5oo!N5(2nw-9JpG0UUibFWM6YB416w=%LEcj}7l2&%?EA}V6em-@MYlH44{sJa{Z z$x*Ws5?6^5$dvtep>$wyJ3eyFYw63XUgbSmLJYwDYY8)CZ7ER7NDl^f0f+|YT{^$g z<(eK+JvjE>_!QAg9lcTeLy+vx*J$W!gv?1M3!ASI!H~XXWvwQz>ZU%GM_R7LMITnD z7_`KLdxEf+ra-p5N3uOJTk+tk`C4@C=--~k6BUKXr>`u8M_ND;dr7}(w=N6SNoT&w z^}SyLUr(e+IM59B@!yEYk3VS8FZCSC($f6ojucbH^Wa=Rn+74nR-voKzQ)$VCjx)86a{)ZR)A16mpD!d_0lApco1^bMidSs)gMSb- zq}vYcG*0|xyIlnyn)kNWwZrYPk)6 zji;Xd=FWRl!iOKB##tWvLHY?j@R)Vx@AGB>8NtA~8i9P|N@6W{0gd0$P-^?1@I@=O zFnpHBKS@KCh{+S07a<_&2(+C@L`>{gXK8N2k}{GR&P?AK0f;sLjDnU9BW%d8550la zflth-)GB}+Ab!4;BnhT*z<#HjD7XFq@yu{vwo=68cp!g1uN-ZR@6~G%KT1n=sj#n< zF5eLOahqwL_SiVOf2UqWd{KPv3y(>d(Q)hzEP{h9bee*!>J%#WVV0yZ_M8FD>3#Ok#Kf9&VfKW&jx7$Kkm7?ed@^9zwABtBB z6A?Ou#U#g>T{FU_B|=!e2?Mgzz%Bw4`Yyz$-5;hO?P#lh zU6ij(0lu&bMJm`(Q7k%E5((!0=($9M#;&wDZ|_IYOGROIzOsHX<@@65;5UJFnC^5Z zU`$P3MD6jk7arcjTT7v^^>!SEzIkekjp$LYHwIH%qYY0y_)kh;5oA4M^l# z4(BmFQLGQ?48alTr@xjHWw0@TfvwRdIp1C`fkHQa?z_TbQMd8ohXtY}_kTk1HOQYK z#ExJxFNT}DbN&AkJf!)#P5S5GlRyw{VfpyU_6Z8wV*uQhSiA=-68#i6zP6{k|Crd_ zdW(Z;agFU#5SY?oTeou8Rjm8XvOghoA3sfWHp+ll9%Y5fx<~oo4GJy({WW$0mYdUZ z1$ck-mBUpkR(q_;G`iZ$Q?Zyjc1rgFO*rqNl;*+$St(ri$?_wWB?fbL74O2r ze>#{6kv-4+t!3J+^V`5auROdEmbVYGW)5i}58hVf!+EV`=(l4p&n_<}FR^oZL27B| zs$HwySOh=GSdy$nD9Xu)-|7)w9B#YN_CUm|-Jz&4k`}cvw*^}NOk`pw)^L$7($vx` zSW{_8{t9ni$Y98l^G7^im`_~06!8>2jZnK*7$YyEmiuw7G=&Uk{Mq*cuyquIMx@_c{{vviPSKu-qL87DwhKdfcQasD&^i z(PZJ`856I*Dj`fMnV|2FNn>I(9vARBE4lS?%2DH;s^QBv%BcgB`#Staumli8=d7H$ zC&Y@Nxb_OaZ_Rx%dA;;a2h6kpkQQpFEY1%P6k;eN^@j^$E zSrs7POv096Gm$_}=CQub5NaDl>!?yp4rfeAjO~7;n(rXPRYKedg+gSe;dy26CZw*p z5ARK|sM2Mo_{pxrBT(LDGufX*)(VM>m+2({{6@JpsZ`&FZryy_fCY{X&IYiP zmq*j=rCBPAVSM)-6@$_1-HyD;47sUx1Sa+-*fpfHqvIm><5rHrOF$bknI#1NBqew| zxQ~EGx~gGbZspHu!5XF*#n;1t?l{LWGw53$*lwhGQ6uG{CYN#w;_6sIQLT-m>K}v- za6;$<{?6O}92)<5@)MKlu_~~{J|P%|$q5hd?))^m*KkqoD5UZh9~sJY@XYs20!^+x zmJ1&OszT6MN0*EuF5xwJGUl=Ngvu49EfUt38TLd=eCCXV&qVF9luVSXK#@J-JVT%a z+`nD)&EtmN>5rf7Kx|bMi0ut+@y8|Yfo`8{7fZ*Uh&^7U%U=q&U^b` zzUCbTsL8KO_2srmvROnQ!N^1{aQjrvLoo0wCBOKwOX->eW(|Ym4sJ{NkA4J-pYxBp zIie4B)8bHGbZ(;dO#@>w88O8!KSnhLQ-ZR-;Mbyez`4JDue*+R5!)F{wE7AaT%W;! zpffi#(qK;UX!A+%HZ@O0O#vVE;yhE734zF*30Bw6)d7Psm9O0X;ky~FjNA@L-~TM| zFTUeYK5@NSo#3W@qi$Mi$fWj&^7|a|S=Y$|MJy_sL8;+p040!PYwB{bcgiht{0#li z>dD%g22X0OP^y1>hL~F->Yc80Dg`IXB!AeDNRVj2)i|~3ORNE%YHYv2Wt6#$9rrJK zVKRBzg!^HXRdsIhCCeG|`JX5&yAgekNR2E0e92seSe3qN^UKR)pDNG2sfF9I!!&=> z=B$Aj6^sps_L+d+>1QPy0_uHl8mv$Leq8;%8*D1$2 z;k7JPP(R^CFH=Z5;cYHcm_Ok)ERRkaC|5r<=V;LJq@O>Xx^Vbz^WM5qsa);2pg-eH zwN-fQ?<||mOyG&g4ASt&%`)RUSNHB$fBLqgSZ~~XommRJtUq?EuM*ocR&(dNB02!o z_x9q)X4-^rb`{{%bofir=X$-xX!cw^68V>$9{02Jy%v@g7-rARb|m9rHtx9d`zQ504640$0#f2bj95G3RK0 zPx40Z;7}@)SK8@22`y!QD2A|*ELT7xE|8q;GOmbH`UKl8zJGnMi#S*y5YW0=4BaKE z=)2s3w@kPM^bh|1@GGGz&cd}t%Ecll8&twd1qSp;8+$7>GLs-a87WI#dA{~Nq4qra zyD?ce&?RN=P{ zO|nI6Uz&PL;R+lZa8Ej(g+Qtl5X=x4PEyE36iGRm;VYNM4N0X){;(u^08 z0_MCnWWfYjhOmXMG_2HS{UZA9xjf3d#^)`p{-W^!TxiLfJ zyz*m)K^?kw6UXLZmD?BsWAzh@({v}xDv(3q(auOXkkjk0WfvK&b}=k$kbz>c>t5(4 z5q+^ov0ILD#!7h$lHncdvQZX87|WgY=EZHlpS2Uum;^PW18c5^5BD_$tKs8YS^ZNT5p3l`ety!tboo z!fbyp2@Qm6n5Q81vr``;j+FB|b(%Q3)!psCrC*R&1jy3bOsx~5rhCyDj)^;DhFloG z8*!Eid)Y$>8?AS#(Tsc`c%ohDvjN?Yl;Ih7DK{`On0+@XuLHD%UMlAl&$b+;B~hst zoI2~(JSC?;W`k%b_v&;dATEqWMQzHGyrNQQgtqw~j+~6CSeK6Lle?lR)s}c9b0b3^ zntIlUaSttgOiKTP;sj3&yQ+|~;_<)M%v$?9%;0QfwRXSN501aE2yOoECjovH$!U4< zDbRrG8m}E44Gx#(F@Wb)&+`hIBXE$VeP{5H+Pu4I_0So6^ZsJzqk2!MA2Lk!vp=TQ ziyHUukG`qkBsF&)H%k;Z8<>gD>->bfW{~ciL~qYE)KouBM9Y}y=?r0gxjVOZ;1g_O z!xy^&0?qJ-IelBdeZ+dDuJVCv0QWBflx3H0yPLlBH%)0hNCO)shEKZ61CL`USbHYL zCAhWTR4;`xqW3RIf2vr0py7z0O$QuPK%3!Ch!?x23yrOIoIV@KtFzVI>s^O>&pXfh zSu47$wNb2en>e}0jq9_$bPgvyCT8g{Oltmm?#9O1V$1;?f2*$up8o=Sy78DPVP7kx zKOmAf2SP5NJFK@v`^KCb0$Y*7^mOr1P(KC=-&i;Mhv8?d>OQf*$%ty%T$Pp!;9aG; zKP?^1Rkd~gmKis2%PaQy)37AOPtw37(`J^TZgXQM3x&Ca4}Z74rmEI7PZhu5n7#RQ z_gak0ikWDa_ZHJ@V3G)=gd{F9B8|JFE}wf}vBRX>k~~!zZ+zqDSA@I1UPs$`q_J=! zk*4a^$d-7T6;%*%FspW-d1uhNEppP5NxckjY4~Pf@LP+sXc=l~N>{J{NOo8_!Mx5| z(FBu-uPUBbR3a#IV~~(WvLE?kWi6?Y@4KOW+jM|!@y2GZV2cB=2}RztL*v)k)Hx7@ zC2BAc6ycUx`%T<-h%aoLDbP8r*9o7&XzzNrefTpeox%8=xXvf)F#;Uy+(7tnL(^*B zPq0Cs$wcChj<(K-lf{A(8i8NDl@P4weXW^jIb%6;K&_q?35Fbd%?K+qxX$E%N^Qxo zhV4Aj*22ReHL=%$EL|S5>)x`>MlphSw$nF|;g-rnKK0~$kc}F36)dy$Mc=)<>MVw> z71}Lp7EP&{kQUkSuNW?yl_%T|_+s^2sP>5Vo9n3WGu+W9Ri~hf zA(}qd-~zUWcTI{zh2>)?#gqB9&R6&PXc3;53)d%l{PYE2)V=eNG|5eD4pX}!U*(~W z%m{zo%+ySV{}YJJ(k!Ra+4tgVj;PMBg48eX^CVowjtS9seXP~gW(}w z;#~Oq473V&bZ*6W>2^le&6z~23qfszT{%E>3m>MRNbFX(mf3qMaN0|T{(&j!NoBXU z83>Dfan1#N;?g>)6hdi*w9}`IzuZ*v^Gcs`QQNK|z8ma8GC&~N6W1rT zL?TBZ@qs$mm$WUg-jChx_&iQttA*82z{yH;ZV>1Mv3~1}{gH$fEJ~YM9jX=wg?&aY4ap%45y@ZRymPCra=n@W3@0($}+0$TIGE@)0Ycqi&isgky$$Zz`BE zK}%)U+q|TDmjsz)x!jFdEXQK^D|$V*ku}lDVGE6IZSE1$JKJp?>~W)NM_*a-u3g`? zSNZ~lm)GPQy&Hb&2#>Lz$$VyJ_#kcOSZHDp65g{RskX3)>8^&@_`-5$&ik4s5Vv{m->HECSJ_)&rZN`&y7J}(WQkBOuq>DeN70}`># zGot2o$BGpjTU2~JcF4ESf`h<`?3M>xW}Or0r5f?H1p9+V^pPqc1|JeSPMB)-2ae-R z$OrfvFN;|_Rg~(mB8Kqv1i}qA$#N(d}hL0PwDy_XNY?-q6i%Oqj`ef z$Wy2L7wKV0QTW<2HZ%Y8P8q z_JY{*jw8Ld+6g<5-kipG)A6v63L!EGsNG|UMbAPciM*3r{DJQ|kGKx|r}im}uf-xl zM+437Z-RVjj^k+e^s`I8jh9Kh)tj$FS`)R;>%7&r0Mz!Aj? zCsearp{O0f2rK@Xy{kwLl(i8PVq;TCRQKSpSOk`Q|6-2_0ELYozW8)^>BuM17CHyz zX<~n*3Q~w$6;C;NS?su|i$3pU7)q~utmqh-zL;bSl%Jfh+D3&kHKO6GH0lCsrgN>( zh_x|@@NRe#pNQ}JVQRJA!nI{+ftzDJYU1}!9dZ|LJTVG~MXxgLVtA3#ik%Z}5dsHY zMeMfI6Smx^S!>K2XLR)u`!#fQ+cEY&0d^`^=rJ)>!Rj-9a}c#w1EIG)P5#Cz#&Yy8 zt)Z(Im5Z%J!iBE<1`m<4+6kK?Mz`NY2WypGdK+s7xE7!9@kDk?Kh1R(zWf=`osOb2oHWuVjCI z&(K+|V#NqyZ%aqz19O;8K=%Hp1DUU3j1`kKI6mW(Q2OfYHxjRN2kj`f+2C_5&z*`kbu)OwhsME8jU1_Aza0% z32K)i@!bChdv^5vrp_-u_NpWv^yKx3{T)yEv81+GN*zzg*R$QSweqK~RoD0yU6Yp_k6nt*{?Jvp zSk4uG70Zxb@7t73vL;Jb5N+@0-SgdWJbK*+b!5!2^O6D<4`xfyObUoxkLxaUGCr#*syvNJ5FQP2r|10rw!?A0_A2r;63GA>3j21w6Nc{Ej`pgV7w?AyGyHsa)^ zXKkZA1p8q=T@Hu~(ZlFNt-Y9D8_;z@g=W4!92ps${FrLMCl;R4%S9X~^_YNNET_{! zHIO!3%)sQ_fcy#XGduJa?q~o-Nnd69ItU#f({a>;%L2v^!Fp3mc(oC=YNj~^12b9a) zP*i$9kNY{IMjT}n7V>YBn89zO`>>cP#@IGuC*!X1pGUTy9+Md=^>A+?7!mF_0XSx3 zpLl>uS@^GZsT{n)pQ{sSuZQmmUwBS4G2P<#BYzWm(ESap1H=ORK{<(4j9Z zZ`huEm$X83cNujb4%wky({~f|>zMyQ7#0YdP%2LO`|0c}45hrV(o*JI@$j|fMz46* zUZbUSX@YVMk`>{uSju9x_BL$$nE5g7xzPY_mratgLa?_ za13M!d{D$vVE`zaNx$*D7VVFm3GL5(6muPsmU`?nn{U*y*?(&l^sKM;ZY3X(vB_Kp zG*fIW7#vy%`i+;)P+&grc&bYzFz`=gE=#$0eco_Cj4t$J`BnQGlX&1%gviPtG6o!2 zgbA39nNN+l6o?g9Jj)WgH!7|y4(-#h+DR(GzqbQi@t%)Rj3V)Z293cJ48{=#c*ifNYLk)d%uN$yEKs+)&gB=txZW^0VM+1N5#NDS$%ic0GK6Y|vmLqcW>{8Ij*Hu6N8;RCeDLZs)ecbC=H6PY@fHz} znW6%g?I0R{GuK|cmX6NqhQ9+xhf!uwc(ocSkx~FSj2Y8vlfv4rZfqS?mbLqYYNs)c zr&=4oKkSQry(Q;Lo*dlz+U8l#e4u>xXhe-PuDKzxa#6Uo@-kx;(b6$VG;ixof>dwq zaK`7ME)En91ykHZeeAfmQ*k`qx5?{aHLrp{yyfZF$;aWP4wI)X}{BeZ_r|H5?6ftvxKaS z^LSZ|H9;gcwdiLggCElbzw4IcIb{ZPwaLipQMA&uy$oPcrr)1(jP|?5`Jx$JK2;>S za-W9b!MhmUNnqtELXUVkeSR=iiUC3Y6v5nG6P3O;~YyUQo1~ z!*2Bud>63h1e(rpP*QlJ&1Kp!`|>{_A1>7^zU|j7Tsh(fydN@L|4^Rvho3bd63A-D z-O`=7>%!ka@uxJkid8h6Q-vcMtsD;v%9C<=5e(F(6e0smt`$7#N%A`yzW+h~bU$O$yrHKnqV zOE&!%;b$88Ls|-#WFQ?81>#k{gT269HYU}uI_Su0k`v8)lc+Xr7?L>hOMg%sGG0ya z#nnOHWt%WW^vi4)13lk`fR2Pvy)1^HpKDWG!=2$DCjwZ@jabG`3-`rx%U`s5jQL#% zUO;0+;Jo%5e*l?MhM8*nllCq7^1X!vEe!y3EpJ1!Aq?sqGLH+Dj6pn!GrJmp-S)Z@ z^YGs8$9X-xl9Ku}DN76m76X;$6SV&5i<{B{Fj^)Xt8|g!$Cuz+0$2B|3KTJEQo+oA zIEY3XdtX{8+~Y7yOc9*VKpGiFKc>?N4t%#pAn~tIJQo}v1Z}|&eH_HnuU3PL`-$U> z{oycz>6MEyHf&p=KVz3m&(?llniq5O6dPu^2M(b|u9fKypiJJL1vi zf!$}zPqSkh>Qmhq@Z@<{P5XVxB9x=!<41=)N;idc$F;TtQ(H4^+CxLEA_7`VrSBw! z%dIj$q;t;>CeA*U72g}VEHT$DV1v|1mJEC?>}Q5$&oZ6WB{@T*;c>s9TQTl! zoOK?O58|?pA&T7w6R15{#kNSViA}16_tK>_Wq4%#x~7Aq#6pokM!oKO;1G7OiAl-x3I5 z`4J=Q%0Mb&Cjg;DmIRx_RY5ri(Kb9;~-}=ST<<>L9O>x=jm>93i4rH}FKJ_k7)Zit3 zSx(4@u7G=_G48vn zPD!PVI8V_a4uc3GxfrmTFwbZf|7@EhxAJ3GDa|@5`awqu_LB?|YJF1V_Rtj%A2Mp^ ziaHeBX?PuLaDg0T_;HoL>`;c zj9{3z;faHk3N4%@?<8=UJuDKXX?u+&AwdCEP7onGL(*$Vg>R zu^`v>MC}*xtsmwTMS}}`w!USb`3+WOS@Cv4X(QLS(np=Nkpt)B?GRyWE8Hx3|*Fe<*lL;1r#FC#GBma2rkV~vcPx6YJs1S zqAPu{w1VTgV)>ZRQEg5F$uMWsyHVtr?XB+nM*IFzr{Gd;w(;a+T@S6LrB+Pj60Q(4 zaykR)l>jA6`@}=MVp~=(dlr9MspY}04E8VGl0@BbGwR2L#b?95xx4M_PK}RakrQD2 z#f$HY3ls*>lzAH)zsd@ES(rPzz%e01$3BlhAdO<{x5r!IW=89DXt0B3@)v4p(qHaB z@<$xLl}-Mdb|-cT9~S4N5!TeaTygqZJV;D(oZrR2<9;3G$>*K`4aA@$Qyxd#_PMwDSfNQqgaJVbQsMfP7TRieO ziV(QZRM@b7z6qBu;cCc|nDIh>Dl%a@YlJjbI;@p69Gi+Q{yV-;dgi2mkYDe-lm&UH zJ`{{Un)4F0uWD!@LkQ=Gm8vitaM;#$>JHDS5}N(khUZtu?cvd-idVRT)2eMp6Sn z(SYWQQX@?A${)0$;ctl44zG3@S`N2;Wl%?_K*ZxJTn;`LCGrV?9OF;NxJ#VaFY@i- z5Q>yvWrM^G+Hm20s*Qimysw{bgcDmrUt*i2C)uXnQSZBYM=a#TNT@EgAJ`CM5QQi!t_0F3DVywu3EFkFq^^ss#Hc%QpwgC zEJMgvr0WK6Ner7v8ReTO?d|{5{1epk9WdmO#qjw;y@(%&;meGJZaUPRPK*|I?%eZR zQ|a^rUd+gwqPh1{I?~cF+5kAj5drR~Ey*i*{LkiZ2K<@%hZTxw4~=a*G5(p8S-`1D zaXP-m@4Y6G+DJUaE3Gc)Hm$gx423RFSsOmb+F80EIaoQPbi6oMjhU?Ee&M^0pMhh6 zu-$IHIS%t~z+G8I3u=#>&38c@Eh_DACk3e0G=I<>ICh{;#%CjD^Kr@SGmF3I3NZB;)O3%xHnkxUpc(Qq(PLR1d^LgEjxMg%cRN>n=#?{2!`81G86d4u$ zYXRY(bj7Cuk08kC3xwOJBnw=h$fPR4J`&qZdo}EXRol+(x+0Pzt$d1M4W|<9?r}pd z9=m`-e$SZ;{|))bmqRGJD=94E@EPErpi!=J4Um!{xihh!cdN!(w%*BSGJ=G@Vq5W_ zRY+xIrm<>m!#T<&68dpzcAY?E$L+Yk??!dibln@DVg~WVBFf&f*tvMnFDcZeqmQ-P zioX03c@xm#83pG0zdo;)(l_+4K7OS>F)Jfu{i;a87fOmJGY}+|$F_U>MEFn})#)9h z#NXZ0b>TLp*tVh6yku{}S&a>n9G-Zpr8O!g?Rigj&HwAK5s2zJa;^hBK|V#RkUZ{q zOHK>>5Rm2cK1W;hqF!@O9%S7P&r(8<(^%$I8%M#mp`*jrc~lVn+0>JO^^Ac@nSX+9@|8WairWD+ep{5I+ZEa*qAs%- zge97H{gkL$mD^UmjFsJpfJHxZ;wszNAszRnJ-54!#Wgi{gUqZOh+iIx8HF);e647n zFij|};6J>1lrbuB_CoynKGRCWgs*91$dEj)KxU2HaIx(Ndq9S)nS^ts4tsjA7M?ed z7)VeWTiQTJLK*&@siqa-cEp)PuXm@-<;LeAzP`NjI^j=>2e~C5)hALpU-mpE-jj-` z-UG$loH|J-59B5-AS0YMua7h?L>OdOq6B8y-g+0;2mN!he$bDSC+5>E-B2|xZ9Q&! zM{iioK?$>jyHP2(*&$rb_k+#X^-egb18Au~&X|5>Q$pzOYUGv_9l(uwPAX`4P{0g@qvSuymj)zs7-n?!`P5RxgZ96^duNoK>ym!QeYrP6PY(e5lL>kFVQ+q!h+70vU8Iafs z_LXVzFSqn0YQA>b7>sI7MP5@VyfT*s)V1}DCeBnV?S+KVM_lsyL5hfD;7vFkETaY* zOV#HO5Jzn!ZS+%e8^y0JvY&FK+&E3TH6pb*81gB!S86w^FZV@8krjIy)v{8;OXwQaicFP}gm_60 zTjh9+n^&ADfi$CQ6|vs4zPpt+S``tt>z6<6L}%jsR!+10H=3fF+@C7{e9_!$4W;|h z*rECaqt8inI?%8+BC1r#5q0z&KeL0SCSA1~NME)2F?Hki+-@GJ`sEAV?4d(+ zR?}T{br^aUCtZ7{&{1GqL;Eb6ZZYSHiC zZ4yu!@1=aDcj*n9$Dnr55^0IC*!br0O)092?SKY+t(G$H-d0W+&J^%hjg{`zMSjY4 z(1Asw92)eGNGW$cS>@vDI3DSO&oMg)^LV_GKT_Fn%Hk5#m_qRm)mId-gWiJYH02@s z58;#rG#2@~Gi=mgW|vVT=a?y0j<3`}Ui8(uMHdU*)F5 zHYoLoGINceb;;wtb4OBjl861JB=g)fEnBKclVuoEL+_~{gkf{UK(&37f8R=dSoMD2hW_Dl(>)! z+&=3`$a?pd*sXr;nQV&ClXzWyuspRrU@RbXi&Zbdq9sTv8e?`w^oasJJH5syq5z4J zmrgP@7gy^@$Gkh&w4yBXR*P`FF72F2iboI$9GwAg<5(RvvOg`z3Dme{<%3We?DyER z&nT`8xxMGnhq2saOnwqg6a>`Z%;&d$urE0mywQEK9TbxkCK!z6AVFx~jBIotRCNI2 zPN?3nh8gt3_EY>l;X53flIkr?t^y*-zNJH-g`45t0Fv#zXQ@N=|wp$l&N=pT6a;Xl$!=QzQ11VQSofsJDvmi(7w zn+9SJ{`n?C7y|TpuII2L0VR#+K(abJUo?KlSlLa#U2(0Qxnj59GkTNZ-+87Ex_BD~ z^GpjnH((9J8e~V-;eQx(l$!$~_j@EBk&_{Dg7AE)th$NS0nd$JhL8@w1V2f<{-k_$ zXaCvhU_D2{PgsG8Q^(*S+n?P)#M)T)laOAmJ=%Iv3vJC3H@T(vS)UC(oYHxh(61z9 zgxVk#y{k+yJ+&I!)ckpNv@K;8#LcxZuA~ccI)NFIB4*=a`mJn2`BDQ+*ggkkstD8r zGD{-EcFUAAW8&*WsXXAScPQrY1y7K^X_tJxGfAMK?NhEx`mL-L&A^IMEi$|vW5SkX zY0)Px8(I@<8+2c{f$FQ#sBv!9&#g;Ci3RFYm9*D^E)&!>lv*q^ErF(TV3JSmfDcxSFxrF1C}5fowkXPOgtG({Z5mw zN>BuZv5*9aKHLF~5%c^Cd3;S5m-w( z!5Yt>z18^AbVq$j21D@c`N$1{@F3?iblcc3$1-IZ*_AQpaX)t;BtQeknvJY0nCfxF zEV1TKS4#(`t*pD#?A4_mTJ3glO&5*(C7>|~fx@Lrg7UOL5As~;NMW}CJ*ypq5N6c! zR%F~v(G5QP1Aoej1iwIRCXavH1s>+hA7=-Jg*^F15@KBjqt`33BjD`*d}f_={c=Vr zALXs=(ebrtOzQ-Y>pL&jaj+TRPpMw4$NI|c<6!GhioK-R(E9mFv#jf~g`@DBgwEba zS!?gazI5lC(PWBifLy)VL(Mp(VMj5N>1fS2byseHf+WHQ#ZC#_tLR?wJ^dccxV zuwgtzqN6c46V%T5@i?*~U7}4X97IdKCKQZ*Q5Td8tLLyw9DDURM`t$(L^xPIMP~|ym^cWSR^6dNsy8Wz?|683>dl1YK7xc5 zEHx+r{uLEW{CI$sQIzzt(K-`C%PijW(~_l5_;n_l;KqBw$lUCwNYf=L=yDwjYuX6> z^SdzFQX7-XK5dZ7K3>%t6}CPhas;7lm&_#>*5UYDX{N{AaI4}quBh#hO3t|&xhN;Q z*f$~LW{sAW7jkl2c#eCdsaq~QHDkwBc*P28pp2}02Os-hW;wO1Sve#*RSG)ksJ@xI zziGjZTmvQBJ(k+62u@YgtZ)-S&C z0l}YP4olBROda=KD?bUdHg+ylNw~_e7G%a{|>z&+-;xFLzE}?mgxGlv-b1w=z%$>qNt6swWHHHC92pomHgH9E0UfO6>y8- z@0!@p!w-#i8FY-9_zbt$Nh&?o?*{L#XR{7}R&uKGNBr(u{msL4yhZ^BD<{uXkfrqF zKWDgWbEM@_;>q4mS}rYH6?>slrvWodoxY+x2@bolz;1fJ>Y!Eb?z>_6s|;%+Y#RM} zKv?>+eRpI;h^4z|Of<>WmpZK1#H_-i<2>5s#$UX)0~c?RErNzuY4P@&zuTwfuitWW zy7r(IFqkFmlI?+IcyOuTcDJ=ROR`|Fi`vzw_9(nt2zs4C*LfFq^>q{A6$NHWsR$gN z8`uSoJs0=AFLW)x67M}gZ*%VTa&@duwT_`6PDUWs(QR3TMXv#13@^;!YGnJY$Blkk z^cBB4PqhWps5le4-YK>T1X_>XP{M?Kfm9H7a}Q3R^(5>Rz2-f}D(tEN+9bE6CO+tm z%VbBYXa~!cR!U%H`COrdWC5YuCdq^kGIA&u7I??LR7g?gEa`kK!KYWs!s~@zOl?6% zcQ8EKorU)PEwLKV(`CaplhC8f7O$)JP zg?mWN{@%hKKEueeo%Krf?&__3g;}DX!gTa`DA4ifasBJy1S2c_>m?A^@%?2tLJk-( zv8C^IS8CWphgVsC_t>-DQEk9iDT-{U8*)e2z;dkLtiD=V%y5^{+KsvkYtupYdojZt z@cKKsxqIbfy=%Pz=9*oN*X|JI$=??KsWIPsI0=G_Rh4t(1UY9xA%OM~FHvEbHvagd zKER9tkw@DeTQ#=rKFHXtaEE5>`}`wUxf9n~@-LdMGS-S&dfd}vXJAGC+MbTs+}-1K zXBtg=(*?i#UIMy4C`FzP**pbuaMF>vPDWE!x%gYI;XphpzC>}xJR(`cPks=Z==W&w z|B2s)dEl(*e&|`FgAD_0n9X|DSenb&jb8x}#}E(@Fkmxwaf2YWW`hJlN&~P#t6u@Q zFzWx7f#TpLf+zqR#!8kI5=1HrV1iNB0eh;V0AUyrF0hv@3J`(`5TT0GMHxzkxj|2{42B7aJ@A;DI6K1bbZ)04^B(f2Tc50KUM` z{>wro39cJM7wq*)f^W!H5&#R^_VO9EJ6wzdDa!4A{&k3CC*%NY3=_J3k-DF7Z! z;J;W^DewluzgqrpBVG#Jmg|2TrBVO}nDBpXS&;%z!tgl$uaQ(RcK2KcH0T9W~=V3vSe@DIm;@gDff1|pONtDpZ%G7QFVV2lIOlLfG0 zLh$~t@_+ab7-N8PWWhL@V& zS71L#T@FBl+4G;e;6HUCC`t~%idpiXdK`@3!RiRmq#XFj@c-0lV0;S3VIXvQFvkB6 zbAs=Q2E642QkDlFDZ>4~N(#Z~0;~psBIE&IFl+w9>0o>g#-X5oc>oh;F8}}3i(riO ze@UPez&*hb_#YksBPg)>fJ7C*M_T=-J_aL9u=#;P{;321Q^SEPAq3-SP`?5=H_LzO zT`)oiTPX-i5x|1M^}p2ra$tk41tbcln5qBa5io)V+c+ph5!{mJ|8DXh{#VEpXiyP+ zqS1e94Dg9WU_1kYRRVBew)|H}2^hVCZ}Ji(s|4W0y#5cjfiWc5jzMus04_}F|DXB< zwDeEC{9oBKU?nox_CQ3+;M`vSHLwnh{#9}bGEoMrr~j*@0*wAm&o!t-8Jzq0KXnlp zgI^60XP_%(05_&G+y6!|2aF%Ucn`#_0#2gM^S_>ygYgR(FN6G501TK2|0Rh8<9`D? z18P$N&)Ud;>KZV<2IB_Mg9?BT(+d2?0B#4wEExZro?jplRRAw$3HV*&|BLfLKUKl% z)c-2^_ZVQnmJM1^1wS*M|3>itHEA|bS(axUzts#}rMy1TUOfh{T8bfr!&Fk1mYJnf zk`G@#L=Ztl1O$QCu{J!biEc+tt&4=6k!MHo=xNUFY^ZIL%}KhGRDR&c3{4r$c0fxb z^JBkz&&4*+@p$^ZfByINbzkrEaPsmaBf;C`;Y26W6A|wQI3LuC_hCs$WY)42_a6C% ztW9LrY84lwZbQ9E-nV!rYs5xk@875VTOfB5oyR@ZESp|z$NNQzO>#z$ZB;y@pD~m9 ziP&!jnGt+^Pyg7BUY1j8T2}S0lC4QjsOL8SY2D%s;4U6 z?r_8Jx0kcW;&#P7l-J%Ok(l|+?M9ugMt1dPKH4Fb^BK9B*In;dF$kc3TK3MTApUDE zZt8E$0PtSGLJ9`q3DaAdZGrBRbsRlh(w?|=&=H;qfX@ri zM;#`Aw0Mttk7Q2j!8_$<2BivU+-a2RbxfX@i3`}v2`5~WJg^^pN>*81qqq{B3yzip z3z!qHw&96^#spKU&2oJKM>cf1CWQo;0;2uzvsA3;25b} zNMW1R5mVoO z)-}nct``ZUUi#*cWUW>zn@hY6lUL-~9Fp94!&T2?9@db1xK!uR_$I|K;T=Xs+vQ*m zt!%vMs_m|`4-J2jTRA-C1%J=Q`{=??@!l@87BdemT9P4*Nju(S)2=N_-wQnW-jr`TQC@PO9=4DxbD;INce_ktgL( zdBokS-n+nF(&>^rd93dS^^OL=fjUT@T0%{{n&mc*%mvp=@e=zTptuY5E=>B!jwM9m zSMTAZ6GbGu<;oH|@7GA`NXI@NoRR2!MzBZK1Hqqw-;;uTYErE@5_}%KMRr=;sNaL3$A(sI1>DdY%Ao!t>IG_PX??j?0}Arrz9haSlhOf{#hu3MV#1v*{qdBs?CIAFUw1TFu6;Q9olGko^{y z{2xvQw@S|nhNnpjIDi|O3mzl!rKsC9n_iRkQdP=@O3*;A;+=-NL-v=F`y^G{E?gkK zsdB57ZIZ8zxBIvg941rBFo{r;xnwf~e7{tc@k*xEwp08ybhaEQ!`i1|-@wB@uRSN< zmSNqkVXt6+eT@1y62Fq+j?l7R#X1GNT2@=!a^9`qTXeAqd|D2#CwjuI*g%dg0*W<>WP2%?b>)yliVFlgse(Umn zxTN8-P9Cge!?u0n;6MhQ`<9E(gA>3biNwd7nE8Oq+iT%7sNLV5 z4PWK>rbMXcA*ZjIzQLH~dk32iLhpS=>z;FN%fSA5FRWSr*FjGF@vY;MrcDpx0sY8C GWBv^?1K&9S diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 27e0ba9b5ee2f27fb0f0fb8095926f6a112d17ae..8645f036650c6a62e0c9dcfcd83a528932152489 100644 GIT binary patch delta 59951 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%0A;8=A``w;T-$VfV5~70Yh~Ij%#Ii^Y*`9HHZw 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%0Dd1vWBbI&84Rqx^#+ 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 QJYm4#MwwWohI2js9}JC)UjP6A From cf68f077ae084a1cf178860f4429fd6035ecd238 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 11 Mar 2022 11:41:05 +0100 Subject: [PATCH 096/146] added more warlock spells to constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 25 ++++++++++--------- .../tpgamefiles/mes/bonus_description.mes | 2 ++ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 4388dd631..ea159b1f0 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3447,25 +3447,25 @@ #spell_swimming_the_styx #Warlock Lesser Invocations -spell_warlock_charm = 0 -spell_curse_of_despair = 0 -spell_fell_flight = 0 -spell_flee_the_scence = 0 +spell_warlock_charm = 2340 +spell_curse_of_despair = 2341 +spell_fell_flight = 2342 +spell_flee_the_scence = 2343 +spell_the_dead_walk = 2344 +spell_voracious_dispelling = 2345 +spell_walk_unseen = 2346 +spell_cold_comfort = 2347 +spell_witchwood_step = 2348 +spell_dread_seizure = 2349 +spell_ignore_the_pyre = 2350 #spell_hungry_darkness #spell_stony_grasp //should be a normal spell !! -spell_the_dead_walk = 0 #spell_voidsense -spell_voracious_dispelling = 0 -spell_walk_unseen = 0 #spell_wall_of_gloom -#spell_cold_comfort +#spell_relentless_dispelling #spell_crawling_eye // no!! #spell_disembodied_hand // no!! #spell_mask_of_flesh // no!! -#spell_relentless_dispelling -#spell_witchwood_step -#spell_dread_seizure -#spell_ignore_the_pyre #spell_weighty_utterance // no #Warlock Greater Invocations @@ -3643,6 +3643,7 @@ 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 diff --git a/tpdatasrc/tpgamefiles/mes/bonus_description.mes b/tpdatasrc/tpgamefiles/mes/bonus_description.mes index 1015b9487..f2840acd2 100644 --- a/tpdatasrc/tpgamefiles/mes/bonus_description.mes +++ b/tpdatasrc/tpgamefiles/mes/bonus_description.mes @@ -48,3 +48,5 @@ {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 From 6e615653a684bb46a7bc62574e419e1de6caec6e Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 11 Mar 2022 11:49:38 +0100 Subject: [PATCH 097/146] Warlock Update Added more Invocations * Curse of Despair * Flee the Scene * Walk Unseen Fixed Miasmic Cloud Buff Icon Updated Warlock Help File Updated warlock.py to handle feats more cleanly Fixed Fiendish Resilience missing Indicator File --- ...smic Cloud.tga => Spell Miasmic Cloud.tga} | Bin .../tpgamefiles/mes/help/warlock_help.tab | 22 ++++--- .../tpgamefiles/mes/spells/warlock_spell.mes | 22 +++++++ .../rules/char_class/class033_warlock.py | 7 ++- .../action03303_fiendish_resilience.py | 18 ++++++ .../d20_actions/action03310_eldritch_blast.py | 28 --------- .../action03312_eldritch_blast_chain_shape.py | 28 --------- .../rules/indicators/curse_of_despair.txt | 5 ++ .../warlock_fiendish_resilience.txt | 5 ++ .../rules/spell_enums/warlock_spell_enum.mes | 33 +++++++++++ .../rules/spells/2341 - Curse of Despair.txt | 18 ++++++ .../rules/spells/2343 - Flee the Scene.txt | 17 ++++++ .../rules/spells/2346 -Walk Unseen.txt | 15 +++++ .../scr/Spell2332 - Dark Ones own Luck.py | 2 +- .../scr/Spell2341 - Curse of Despair.py | 50 ++++++++++++++++ .../scr/Spell2343 - Flee the Scene.py | 36 ++++++++++++ .../scr/Spell2346 - Walk Unseen.py | 27 +++++++++ .../scr/tpModifiers/sp_curse_of_despair.py | 8 +++ .../tpgamefiles/scr/tpModifiers/warlock.py | 54 ++++++++---------- 19 files changed, 298 insertions(+), 97 deletions(-) rename tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/{Miasmic Cloud.tga => Spell Miasmic Cloud.tga} (100%) create mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action03303_fiendish_resilience.py delete mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action03310_eldritch_blast.py delete mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action03312_eldritch_blast_chain_shape.py create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/curse_of_despair.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/warlock_fiendish_resilience.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2341 - Curse of Despair.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2343 - Flee the Scene.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2346 -Walk Unseen.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2341 - Curse of Despair.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2343 - Flee the Scene.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2346 - Walk Unseen.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_curse_of_despair.py diff --git a/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Miasmic Cloud.tga b/tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Spell Miasmic Cloud.tga similarity index 100% rename from tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Miasmic Cloud.tga rename to tpdatasrc/tpgamefiles/art/interface/Player_Conditions/Ailments/Spell Miasmic Cloud.tga diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab index 0744856d0..8ec26cae1 100644 --- a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -1,7 +1,8 @@ -TAG_WARLOCKS TAG_NONCORE_CLASSES Warlocks Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_STORMLORD_TABLES] Class Skills: TBD Skill Points at Each Level: 2 + Int modifier Class Features: [CMD_CHILDREN] +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_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 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. -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. +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. @@ -14,11 +15,14 @@ TAG_SPELLS_HELLRIME_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Hellrime Blast ~Invo 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] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! TAG_SPELLS_ELDRITCH_CHAIN TAG_SPELLS TAG_INVOCATION_LESSER Eldritch Spear ~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: Yes TBD! TAG_SPELLS_ELDRITCH_SPEAR TAG_SPELLS TAG_INVOCATION_LEAST Eldritch Spear ~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_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: Instantaneous 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: Instantaneous 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: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! -TAG_SPELLS_DARK_ONE'S_OWN_LUCK TAG_SPELLS TAG_INVOCATION_LEAST Dark Ones Own Luck ~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_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: Instantaneous 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: Instantaneous 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: Instantaneous 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_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_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_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_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). diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes index 882e182d2..518059b21 100644 --- a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes @@ -41,6 +41,17 @@ {2337}{Spiderwalk} // not implemented {2338}{Soulreaving Aura} {2339}{All Seeing Eyes} +{2340}{Warlock Charm} +{2341}{Curse of Despair} +{2342}{Fell Flight} +{2343}{Flee the Scence} +{2344}{The Dead Walk} +{2345}{Voracious Dispelling} +{2346}{Walk Unseen} +{2347}{Cold Comfort} +{2348}{Witchwood Step} +{2349}{Dread Seizure} +{2350}{Ignore the Pyre} // Spell Descriptions {7300} Eldritch Blast {[Eldritch Blast] Ranged touch attack that deals 1d6/two levels (max 9d6) damage. Update!!!} @@ -77,3 +88,14 @@ {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} Warlock Charm {[Invocation] TBD!} // not implemented +{7341} Curse of Despair {[Invocation] TBD!} +{7342} Fell Flight {[Invocation] TBD!} // not implemented +{7343} Flee the Scence {[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!} // not implemented +{7348} Witchwood Step {[Invocation] TBD!} // not implemented +{7349} Dread Seizure {[Invocation] TBD!} // not implemented +{7350} Ignore the Pyre {[Invocation] TBD!} // not implemented diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py index e600c856d..10fd87ff3 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py @@ -41,13 +41,16 @@ def GetClassHelpTopic(): # 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,), - 4: (spell_beshadowed_blast, spell_hellrime_blast, spell_eldritch_chain,), + 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_scence, 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_hindering_blast,), 6: (spell_noxious_blast, spell_penetrating_blast, spell_repelling_blast, spell_vitriolic_blast,), 7: (spell_binding_blast,), 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_eldritch_blast.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action03310_eldritch_blast.py deleted file mode 100644 index fc6a8e9e0..000000000 --- a/tpdatasrc/tpgamefiles/rules/d20_actions/action03310_eldritch_blast.py +++ /dev/null @@ -1,28 +0,0 @@ -from toee import * -import tpactions - - -def GetActionName(): - return "Warlock Eldritch Effect" - - -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 ProjectileHit(d20action, proj, obj2): - d20action.performer.apply_projectile_hit_particles(proj, d20action.flags) - tpactions.trigger_spell_projectile(d20action.spell_id, proj) - return 1 \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/rules/d20_actions/action03312_eldritch_blast_chain_shape.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action03312_eldritch_blast_chain_shape.py deleted file mode 100644 index 1044907ee..000000000 --- a/tpdatasrc/tpgamefiles/rules/d20_actions/action03312_eldritch_blast_chain_shape.py +++ /dev/null @@ -1,28 +0,0 @@ -from toee import * -import tpactions - - -def GetActionName(): - return "Warlock Eldritch Chain" - - -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 ProjectileHit(d20action, proj, obj2): - d20action.performer.apply_projectile_hit_particles(proj, d20action.flags) - tpactions.trigger_spell_projectile(d20action.spell_id, proj) - return 1 \ No newline at end of file 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/warlock_fiendish_resilience.txt b/tpdatasrc/tpgamefiles/rules/indicators/warlock_fiendish_resilience.txt new file mode 100644 index 000000000..b362f1e1b --- /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: Warlock Fiendish Resilience diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes index aed0ce14b..e76ad2ab8 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -39,6 +39,17 @@ {2337}{Spiderwalk} // not implemented {2338}{Soulreaving Aura} {2339}{All Seeing Eyes} +{2340}{Warlock Charm} +{2341}{Curse of Despair} +{2342}{Fell Flight} +{2343}{Flee the Scence} +{2344}{The Dead Walk} +{2345}{Voracious Dispelling} +{2346}{Walk Unseen} +{2347}{Cold Comfort} +{2348}{Witchwood Step} +{2349}{Dread Seizure} +{2350}{Ignore the Pyre} {7300}{Eldritch Blast} {7301}{Eldritch Spear} @@ -74,6 +85,17 @@ {7337}{Spiderwalk} // not implemented {7338}{Soulreaving Aura} {7339}{All Seeing Eyes} +{7340}{Warlock Charm} +{7341}{Curse of Despair} +{7342}{Fell Flight} +{7343}{Flee the Scence} +{7344}{The Dead Walk} +{7345}{Voracious Dispelling} +{7346}{Walk Unseen} +{7347}{Cold Comfort} +{7348}{Witchwood Step} +{7349}{Dread Seizure} +{7350}{Ignore the Pyre} {22300}{TAG_SPELLS_ELDRITCH_BLAST} {22301}{TAG_SPELLS_ELDRITCH_SPEAR} @@ -109,3 +131,14 @@ {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} +{22343}{TAG_SPELLS_FLEE_THE_SCENCE} +{22344}{TAG_SPELLS_THE_DEAD_WALK} +{22345}{TAG_SPELLS_VORACIOUS_DISPELLING} +{22346}{TAG_SPELLS_WALK_UNSEEN} +{22347}{TAG_SPELLS_COLD_COMFORT} +{22348}{TAG_SPELLS_WITCHWOOD_STEP} +{22349}{TAG_SPELLS_DREAD_SEIZURE} +{22350}{TAG_SPELLS_IGNORE_THE_PYRE} 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..f86be2b2f --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2341 - Curse of Despair.txt @@ -0,0 +1,18 @@ +School: Evocation +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..cb6300750 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2343 - Flee the Scene.txt @@ -0,0 +1,17 @@ +School: Evocation +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..7c914b3fe --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2346 -Walk Unseen.txt @@ -0,0 +1,15 @@ +School: Evocation +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/scr/Spell2332 - Dark Ones own Luck.py b/tpdatasrc/tpgamefiles/scr/Spell2332 - Dark Ones own Luck.py index a91e1509a..6848fd44a 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2332 - Dark Ones own Luck.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2332 - Dark Ones own Luck.py @@ -10,7 +10,7 @@ def OnSpellEffect(spell): spell.duration = 14400 #1 day spellTarget = spell.target_list[0] - bonusValue = (spellTarget.obj.stat_level_get(stat_charisma) - 10) / 2 + 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 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/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/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py index 9274596cd..abfe21c4c 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -84,8 +84,6 @@ def floatActivation(attachee, args, evt_obj): return 0 def verifyEldritchBlastAction(spellEnum): - #currentSequence = tpactions.get_cur_seq() - #spellPacket = currentSequence.spell_packet if spellEnum in range(spell_eldritch_blast, spell_eldritch_glave + 1): return True return False @@ -155,7 +153,6 @@ def performResetEldritchBlast(attachee, args, evt_obj): #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): - print "applyEldritchBlastSpellLevel Hook" spellEntry = evt_obj.spell_entry spellEnum = spellEntry.spell_enum if spellEnum in range(spell_eldritch_blast, spell_eldritch_glave + 1): @@ -164,7 +161,6 @@ def applyEldritchBlastSpellLevel(attachee, args, evt_obj): spellClass = getSpellClassCode(classEnum) spellEntryEssence = tpdp.SpellEntry(activeEssenceEnum) spellLevel = spellEntryEssence.level_for_spell_class(spellClass) - 1 #Eldritch Blast itself is level 1 and is already applied - print "spellLevel: ", spellLevel if spellLevel > 0: evt_obj.bonus_list.add(spellLevel, bonus_type_untyped, "Warlock Eldritch Blast spell level modification") return 0 @@ -204,8 +200,8 @@ def performDetectMagic(attachee, args, evt_obj): evt_obj.d20a.anim_id = new_anim_id return 0 -warlockDetectMagic = PythonModifier("Warlock Detect Magic", 2) #empty, empty -warlockDetectMagic.MapToFeat("Warlock Detect Magic") +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, ()) @@ -216,8 +212,8 @@ def addColdIronDr(attachee, args, evt_obj): 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) #empty, empty -warlockDamageReduction.MapToFeat("Warlock Damage Reduction") +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 ## @@ -225,7 +221,7 @@ def addColdIronDr(attachee, args, evt_obj): ## Fiendish Resilience ## def radialFiendishResilience(attachee, args, evt_obj): - chargesLeft = args.get_arg(0) + 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) @@ -233,7 +229,7 @@ def radialFiendishResilience(attachee, args, evt_obj): return 0 def checkFiendishResilienceCharges(attachee, args, evt_obj): - chargesLeft = args.get_arg(0) + chargesLeft = args.get_arg(1) if chargesLeft < 1: evt_obj.return_val = AEC_OUT_OF_CHARGES return 0 @@ -246,22 +242,22 @@ def getFastHealingAmount(classLevel): return 5 def activateFiendishResilience(attachee, args, evt_obj): - chargesLeft = args.get_arg(0) + 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, 0) + attachee.condition_add_with_args("Warlock Fiendish Resilience Effect", duration, healingAmount, 0) chargesLeft -= 1 - args.set_arg(0, chargesLeft) + args.set_arg(1, chargesLeft) return 0 def resetFiendishResilienceCharges(attachee, args, evt_obj): - args.set_arg(0, 1) + args.set_arg(1, 1) return 0 -warlockFiendishResilience = PythonModifier("Warlock Fiendish Resilience", 3) #chargesLeft, empty, empty -warlockFiendishResilience.MapToFeat("Warlock Fiendish Resilience") +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, ()) @@ -310,7 +306,7 @@ def fiendishResilienceEffectTooltip(attachee, args, evt_obj): evt_obj.append(tpdp.hash("WARLOCK_FIENDISH_RESILIENCE"), -2, " {} ({} {})".format(fastHealingAmount, duration, durationLabel)) return 0 -warlockFiendishResilienceEffect = PythonModifier("Warlock Fiendish Resilience Effect", 4) #duration, healAmount, empty, empty +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, ()) @@ -325,24 +321,24 @@ def addEnergyResistance(attachee, args, evt_obj): evt_obj.damage_packet.add_damage_resistance(resistanceAmount, energyType, 124) return 0 -warlockEnergyResistanceAcid = PythonModifier('Warlock Acid Resistance Feat', 0) -warlockEnergyResistanceAcid .MapToFeat('Warlock Energy Resistance - Acid') +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', 0) -warlockEnergyResistanceCold.MapToFeat('Warlock Energy Resistance - Cold') +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', 0) -warlockEnergyResistanceElectricity.MapToFeat('Warlock Energy Resistance - Electricity') +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', 0) -warlockEnergyResistanceFire.MapToFeat('Warlock Energy Resistance - Fire') +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', 0) -warlockEnergyResistanceSonic.MapToFeat('Warlock Energy Resistance - Sonic') +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 ## @@ -371,8 +367,8 @@ def WarlockSpellFailure(attachee, args, evt_obj): evt_obj.return_val += item.obj_get_int(obj_f_armor_arcane_spell_failure) return 0 -warlockSpellFailure = PythonModifier("Warlock Spell Failure", 0) -warlockSpellFailure.MapToFeat("Warlock Spell Failure") +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 From 451a0f1784827c4437c09aa7461c9d3ca19b1deb Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 11 Mar 2022 22:44:55 +0100 Subject: [PATCH 098/146] Update spell_utils.py updated applyDamageResistance function --- tpdatasrc/tpgamefiles/scr/spell_utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 77fcbc102..7cfb346e9 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -576,7 +576,11 @@ def applyDamageReduction(attachee, args, evt_obj): 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 From a7ee65fff676d2126ae4e97ea1b57f6e1c968784 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 11 Mar 2022 22:48:47 +0100 Subject: [PATCH 099/146] Warlock progress Added more spell long descriptions Added invocation Ignore the Pyre Fixed Walk Unseen rule file naming error --- .../tpgamefiles/mes/help/warlock_help.tab | 1 + .../tpgamefiles/mes/spells/warlock_spell.mes | 2 +- .../warlock_spell_long_descriptions.mes | 28 +++++++++++ .../rules/indicators/ignore_the_pyre.txt | 5 ++ ...Walk Unseen.txt => 2346 - Walk Unseen.txt} | 0 .../rules/spells/2350 - Ignore the Pyre.txt | 16 +++++++ .../scr/Spell2350 - Ignore the Pyre.py | 47 +++++++++++++++++++ .../scr/tpModifiers/sp_ignore_the_pyre.py | 37 +++++++++++++++ 8 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/ignore_the_pyre.txt rename tpdatasrc/tpgamefiles/rules/spells/{2346 -Walk Unseen.txt => 2346 - Walk Unseen.txt} (100%) create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2350 - Ignore the Pyre.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2350 - Ignore the Pyre.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_ignore_the_pyre.py diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab index 8ec26cae1..e2c28cbd1 100644 --- a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -21,6 +21,7 @@ TAG_SPELLS_BREATH_OF_THE_NIGHT TAG_SPELLS TAG_INVOCATION_LEAST Breath of the Ni 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_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. diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes index 518059b21..80e75fafd 100644 --- a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes @@ -98,4 +98,4 @@ {7347} Cold Comfort {[Invocation] TBD!} // not implemented {7348} Witchwood Step {[Invocation] TBD!} // not implemented {7349} Dread Seizure {[Invocation] TBD!} // not implemented -{7350} Ignore the Pyre {[Invocation] TBD!} // not implemented +{7350} Ignore the Pyre {[Invocation] TBD!} diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes index 007176a11..1c6486a77 100644 --- a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes +++ b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes @@ -125,3 +125,31 @@ 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} 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/spells/2346 -Walk Unseen.txt b/tpdatasrc/tpgamefiles/rules/spells/2346 - Walk Unseen.txt similarity index 100% rename from tpdatasrc/tpgamefiles/rules/spells/2346 -Walk Unseen.txt rename to tpdatasrc/tpgamefiles/rules/spells/2346 - Walk Unseen.txt 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..a0603cf16 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2350 - Ignore the Pyre.txt @@ -0,0 +1,16 @@ +School: Evocation +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/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/tpModifiers/sp_ignore_the_pyre.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_ignore_the_pyre.py new file mode 100644 index 000000000..76518716b --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_ignore_the_pyre.py @@ -0,0 +1,37 @@ +from toee import * +import tpdp +from spell_utils import SpellPythonModifier + +print "Registering sp-Ignore the Pyre" + +def getElementEnum(elementType): + mappingDict = { + D20DT_ACID: ACID, + D20DT_COLD: COLD, + D20DT_ELECTRICITY: ELECTRICITY, + D20DT_FIRE: FIRE, + D20DT_SONIC: SONIC + } + return mappingDict.get(elementType) + +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 + elementType = args.get_arg(3) + evt_obj.data1 = getElementEnum(elementType) + 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, elementType, empty +ignoreThePyreSpell.AddDamageResistance(passed_by_spell, passed_by_spell) # bonusValue, elementType +ignoreThePyreSpell.AddHook(ET_OnD20Query, EK_Q_Critter_Has_Resist_Elements, queryHasResist, ()) +ignoreThePyreSpell.AddHook(ET_OnD20Query, EK_Q_AI_Fireball_OK, queryFireballOk, ()) +ignoreThePyreSpell.AddSpellNoDuplicate() From 4415c9d54638fe7b1773206564fef80e333e9b51 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 11 Mar 2022 22:49:40 +0100 Subject: [PATCH 100/146] Update tpgamefiles.dat --- tpdata/tpgamefiles.dat | Bin 3846623 -> 3853724 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 8645f036650c6a62e0c9dcfcd83a528932152489..7dbb690d0082a1dc2cdbd055a1188ea345fc2e55 100644 GIT binary patch delta 67756 zcmW*QV{k4yw*cVUwr$(pwQbwB@z%C&?b^0&^VGI>ef!;+Jo%MLGMULrva)x00i2V4 z2^`Q2thL{^xeqK2o^E~sjF#@P4{VaodJBviPJasg3*;B*FR)+WzaV}={(|}i{R`$7 z>@T=q@V^j#A^t-8h5QTU*Z=xL`-T1s;}_;HtY6r_aDL(b!uy5)i{KaGFQQ+>zes+O z{v!KD{)^%l!aC!m%iJb>GjCP_a{t2ngc@I zvK^xZT{^4HAugVHoMqauC6Jp|F)gU>dW-XWVw=UE))bhQ(2A2Chl`6l$ig~n zu4F*}1x{v|v=vxanLx_X8FV#>d$}lt`BaLH8Zy*CeblaMF)x+BiJIPlM7wG?GXf4u zYN+s17cfNOeD~joi199U1YI%JusZYXgF7?x_k;ZYo_ZUkRl`ie1xhA+T=g_uOE|aZ zZDKfiMnTDF?ancsRs!hV!rk>2%(4djQwKmv8kNk2obATV&Mmqyg{)p9ym?-9W_}Av ziAJeoCEva-NB7)qUL_FoN4&XT>u?3*o23To0zEKGatn~9+bQa)b;Y0PB59~)%d z(&Tfh-k4&oPFW1VwrFu(yx=|l5!6XE(I+0I2Aa=}u>=imeJq}wgoYCAZ6U-Tu|a@s zu@-b71??4?bkK-1M$D2SN9OG2zfhGZePylx$XUFOn!OkZ7y?qmQY5NlP(w>fw9FD{ z;TfGfU?6%Gr)7?2H}zT;j=5kk@7bgT);bx9Lr*L`K-+YUx$tb zraqFNagOT=9FWd4bZQzVS_GZTyHpKqMVec=+fFR;b+wo^2$%?%o$v#b7WaT5>K1~S z+SETBI6pDzeD;r_x1$p zXp089_}T&)La>ts%55=jjWdM@ZD*z& zWAO0D%xONAi2d4AZkV+F*aOE1K!}hQ!s^BG`{ixl_95o`2--8LfK(Ld86_yqUOy#t!#< zi`VCsR#z>S#pSw2I<1g!cjIFXb+?IkPQx;=gK}di##Kb;p%C-U7%`LuMqT+XWuf#) z>Lo#ZoOdL%tNRm#&x?O3E38^9R9@NS#~`g-Xvx-w;wfnm&H7+;k(OtWN3S65*jFjWguw9!nb%Y-e;G?|i!5fMj44$7v^cLqXP zB_DUHF*GnIVUAKh`RCo6R~mS5pg9^=auMC7&9iYauR^b^s^X4 z(i6?FYHCs_PUfv0=@{j}zaX}|;$pS0{t z)%{xO7U{vHq!}A^OIWlcL>W7_32rl>k7H>Mdvr z1|rol@=g~Phf#qIh>Q2zv=o^|llVbJ8o(?{hFB3@s`*|E#8BXWZoFBkXOl8~uR*=a z+vj?+C3kzX;`wtMDgA*fxvXF8zeYa==47olEy&8iT^Ge|5qxm@AoV0Q#xVN3X2 z_~mBswz5AG%$chr?xX2jb_lmv3CDp3hF^vK7yUx2x+3QvLey#o&u)SPf%bR_niyzvD&t+|#@-JI^ z1c0$E{*v?VjS?5{#<7>)C@9#9RnLzd>h3Mymj}~$t>mG|IxOS;HJn?{{2rbS6U#mE zqo~U61DW6haReB$ z7q|)z!(oj_we=GQE-mX|Z5;O9(~}NxG6vLI9O(SNwzglrKV~<2&EWvH-O!hy;h!FWfPs%f>`{u$=P(mjNXxHG&*e z8>13Phkb&pRX!Q>Ak%dg%T8laQ3cRQ`(Yr`j_|w^Gl~q=fGML6N2S}S5TQ31_Bpx4 z-yn*`7g8+LBm-A7B58z|qr~-5k%ID&B8-qhnJx8>uA?O&>MZac=81pSLj=bRjc8$( z&7bF32u=iQQg3@qXlyz-;k1mFyx0KJpqb)#6or`@o6<%G<#&Q!V(m}8qz6<3*_n)1 zHzW7I11(J91SX~nr1jRi8&N&~U2c*>V`~~7hkI<@J_Qyr!pHt7IQCM3Lc`DW>7*!# z77-jlLy^8oBlxhbf^qgF^^32Bnq22~d52Bkju~3x?#@7_`UENCBrPX*YH*}O#hyj& z8z0{1i7bxVU&O7U(4gbmRReT`-cna~(#09BXdTeTR|<{t6Po^*6U)a}xzW(1EVy%= zcy%zWT*pSszpm*g)1uy(E4rqsXX95#fTPVxaxJMU$40^JT0EYzkam=}W^#*})#`;^ zs!b9Ff{v(mEwPtcfp8Y~p?MvtmU$H^Bgj(3tr|fStI^69+NjZXMgx+)WXUuL%wyO> z$75(7~sOJ_O&~beiXtR-zja5@)5c*IE|Wxsq7WloOP=2HA87X>fd6 zXPKm&rob9{`m#wu_*5-vcO_^XufAIyX9*RtuXVnPKH%lp3FN}Dk z9R+E833?mBHa-F8pulmZiZ`koTjU$y#&_5s>xPGAVD*rO|&^1%?&~6fNSi?{^w9EAfHgc;s>y}qj zOM&WrjJ2vt_khO344TDBJBy9VV8dt;@pq1Nq&;GdlL8*L)pD=IcPrPAx;)H?vv!DT z%Y>GPm6ySZZ+o;_NevlOPMF#b63!2#!a_Vkpioq;d0+GMs zG{LIy6nCEj??S0$hPy#u3UQ_ONe)8LB}os((>Whihd0z$IAy6qbWQZzvUt@`=|h?X2u)mg}dlpG_V_* zU>w=eoM!r68$LQHs~Gi5PRGV&? zJp$^c$0h8xoFUiPlHomnRM%QQGCmeGhk7RnKLUXHy1;9$ayJ{_^IzKj(|+lu&qZkx>?@0x4t{MZlaVE5SQaN3dW(`j&=R50 z*qG}Cuf0~;}+^ z_X@(|k;~z4wV5p}5Uv6e8AJR6mlyy;by@akuaU64AE%mBE}22qA9^f&?p$cHPz=Oe z+L+l^Ve=o-?|~Vcmqy7L$3nw?E~-uG^gap2{q{GbqFpd3HpA#Ys4^t)l8xt<7{OCo z;5WIJ1p9xFWTe}<69D%}(9I{6&8y?MZ+i!0;? z0?O{!n_uzyT3a{$n}v2dr1#$_mv~4PjH}h@QwD0h$4UC&1U(o8x9a8EZ+z5qZRl8x z$Unx?=>mKPz(+}A%iso;fisRPl&XKLv#o8aeN7l`)t@Nxg@FQ+14r)}wl#MLe^(3wUK@m!R?(%>*C(P7g=^^Ifk+Yk!^} z7^qb_{*SNJnKVuY6aeYV&4syb z+&&JT9084g+AvjKM%+7;8LP_L1^<-_R9WqNRQ;frJ%5EfA7-Vk*vIQ`l?5+++u9f1 zq^5Ysu70t%I|jL(Zytc_nsV zQXXm@T+zIPEs^8cZ?@)K*oy|Z5vVt@2NP&WRW{C^Y~|-%T);N>rayQuU_Fup<(~E9 z5NW(src%HGF&)aIPATX96_!ks5}`PV`PN{A$ya5%HyKAPbJ{~S8RIl2K&{0tlR2?U-kB;Ez<4xdLy&7A$d;p8Lf2d%hp~mp(m`X zFi($uG+LVJ0qy38xx?{Y=eC7}&)^avfI^r()N7MGtljEk#r;Kz*DJS<+7_bClI?w= z;QXmS>3Xo>ta@b+Pz;sCQ~u&iH+U$9hkk$u)MBXDz6p>mE*exYWz}(7xAXzAOz*@0 ziLUvNrLDJ9%&+e6ZZX#r%fE=cDUe#<#eskJ^IeORon!MM<+*L8TNrZ|TYvBE>-NT-=;J2Yr;`Rt%bNdnid%5XA zCzb2V1A6VlXU7=)PG!?P-#UKKL|pAnzLe_G(xaagj3f7ul-izkuDuy29Wy7Pjp+=K z|FX$QlHLc^b*pY7a0R`3;I}W~(f(B6B;0Du1hQYQ;iE4ZY{X33XnfG{FIw9aPG&Yp zp^E<1!vE9k^}q~01ml|0v#^Hr*3A5%|Dyj71km%zGIAmtCfEj9`5Jg=_^j?V6nLU! zfV`-~sg8G<-oLf8dREPO)tU#?vbC6P{{CU`P}0Y->JKD;uHtv_H9NDk^*&!N<7DK3TlDH<@&F7Z;{9%H~iuh@y`1I^QhIJ|sD30UXqoZ-r0mIXi;n6ok1na2>Ay9E-D2$AQ zI6(!8jg;(-%Nw6zxv5?=w_U+xxghN_p8mZ=F9E@dMy@ucN+j>u>5nio# z;1@cS65{;Obi^=yPgYZ{t9~h`^n#=$W7W`iedYH%JdRhDF6B~;ye8ILJ?t7~B|jZA zrg!n5FI&6Hv_^Y^R>h-_Gi>{T4Hl{%X)AP7ti(Fr!-d77AV~xYp#k zPUg%gdc%yF~x<0JlAhx%rkY@H6(ox45byU<};@ zf_~fn`eOiX&$V@Bku&0$n{x|pp#fP!>vx<%YmmdhOTza&1?dLs*%q9sMZ^7*?>grG0-^hty>gIlKB7!~in?{g8P8Fw9r5Fu+O+B&)U>`^s8Aq2}psi>Jk z@5Rz$Jq^(4Et(ACz}LtKY#jj$kSw512eoSKXoVSwhcWh;ARoC69Cbw<7bsVzPk`|l zq7hiJBV}bM*%kB&2x|M#c32Cd-8A$7=olbjv9zMWfztXOQMpwJNX}Uy!U76%p=YHV z^sSz;F;@LN>$~h&#U_u#T;aaJ$IfTlKiFGToqG$huA`LBewMk_SH}dVjsaNPHgLVj z2$+YD2s{T9KE?ipR!>Q6a}#RU!3s6b@N-eJ^n%H*5F&6z#kSvb_zvRyw`(5$BHEp z-#Q5tA69Lf0so5Na?FPGR-_!WLlF6??+yL@5&m)$W7D z#40x3ErKMgD!Rc7HjuE=?i-Gj(aA~HCxRsqN&In(G#GDA1nV9Vparm-hur}c;!q5> z6)cGDhY~=cg0@yfxqdm*32u+LQfP|NceSDdCx^{uegBL8hp2o4aI?zD{2KJ5^hY-c zCX|--8}m;oRLgdK5r(@i-xkm~vf_86rn8nWUdbA(3KJu}Ejc;HM7rGX!Qw7Lw3mwa%Y-D*mnISe2JgJ$_5!W>&jWjDQ$ z1qQ0MR=cy!EWsYRHGwOgK|;Q*dkpAkT`Tn5Jl4`vz?DGrlQ22wB zrn$=anh|qgS25Q5w>XF|V~*ylqj#RpL7*{5V0juk%9y>_GBmE3bNESW!Y>yxS=r#h zcn;ci8L_RPqetXXp-k(?Qs@Vcc}}yLo5V>z8uALlxDTP-h5J3I$hM)D&?D)g!&-eN zXo4W?4Z z>SfN_@))>e@5jZUyW#}dJ(&dr?w+vsBw1xdj??h8!#f-{>}*(r4GoA& z%4xJ^tV9G?t5*7-MxgT<(Ns@|hBArKN(s(@*Z^>w@F>O0qq%EEd{SgY#iU!Kx_A!6 z@6M)2?2-*9e+C;eMdqLa=wtTQ{}%rc4(x!w##Q4f@D=1xuL&kgs$kF5Dy@v32=A=6 zW0#@FkP%helgw(WKm=X`tL_A@kWryZl2G@gdm13T@P!<0+O@W(8Ty!JTHO+RDy)-0 zLj!&nJi|=!GkeZJ17_dSTH0r-k9T}F#pF!HKgR?L0>KQV&1gr%c%6cLZs-9!(wgnC z73hY5PeeJXSN3fS6rHDjE~0E%w|@bEzLJ>4lN)SpGV+*P&;N5d>EtA`QR%sEkZtAPy5lF=m-hLDAq(js0Jm|^69pTN;JQKdCFG<1kcMZo@^ObId*Qy7J(b?KDY7t&C}KNzSttASEA&cxgF zb(aVVg!#ak5X*i0h~Tx>9XUf3aWJ5cC@Dm?Bo84=-R{j>=4z1^g(D9lDsFl}D#QXu zHYL&u@E=Z!v{$ru)xrfU8UGCa81j7I?Kep15TM=E34CA8M32==xdE1pVqw;(n;4p& z;>qLE|)4-`4EaA zn~E=!FN5ctuAFlaAN4`%^jFIL->#KN!-&6bLwUN2KY+J{MCPn!8YYqKFQBD-{&AQx zt&XbSyRfv(P=K<~>)FcMtHn9r^UHupC=#jeMMl)q?dm^#b|ouH1${f=GbKU`fV+M} zv=5%Ww-Hn`3uOST9B@0HyMTWn2SK#|u6CyR4ol(E;SokQxT6e~Qm z=U$`{`|%;1;N}X)>#6|8%^UOBGp#fgj{zg1(~&kC-*fkf`Z)ksQ=0y}s$`F~HUlb| zk!bBGIS;%-_@vW zk0E^JLnBWPn)pKD>MPg`uzq}O56*)85K7L@i zwwKA|K%TwHKXO$tT{%SakVgL~iZUwGQ)ssksR=WuohiX)(zBL`uN|2dTjf%|hm#=I z!=tQ1-pxBQFao}#*ahR`uy~Yt<_vEfQ}SWG@s0{$K|INRk-^j>NH){1hQ+rEu(mjp z80~l-o&Um|@yshTIS??8BpakEHvv~=V?Ty$%s-VCd7B9_!j@qgkRE^K(@Fagfay3% zma<~Y)r#* z(M1K6MJ9wX2~C5HtB;@lB>nb;ccPb9Kn2qv+5)ls-Ce4bwDC%FtkoW5FpJM+Nq#!0gbL@G4T9+Hvcud}AG-IU$*H;eUbpiLvPc7a9Ya%5e2eMw2N2QOejoUP+7;@Tkrz#?T6G zLE0jFbD^;xp<`>jlM}hb3U)9Uv0iqIku5<5V?Y~JeN&mJT423qOz}CL+lR{15-%Sk zY5Ev}b{;@wjBg8PN_yExm-0z7fh7*>MjmO4^2HNQB}*H9mQ;q6O=>*Z z$)G4mPf`1pou@E`xPs)EkGph|Z;}SMPr?GuxnlkU`6e4g$hhny4&poIFeJKQo7SzwSqJ4WKIIDAFoVjaiZoO8~GKPzMH( zLpjoS(`yMC38Qu!i!)C!i)9<@uap&#=&{dsn&n7lrrNp$&&;YR3#rr5*Chg~|Lw(= z3JnC)zy(H}L|v4I&XtT;ZG8FgyMtG}jmmN9qF;r4s6S)Jw$fJb%CTQf+@()sWGqc`)7ruxZVWZ@=fnXJ$Li4>-_4;vakGDDxi$PBtxe_} z$KorP(YA6KWrBGOgJ-dBbSIf6Mf^G6aV*C9?LpSicrDk;hA3VzCG!FCpXl&DAU+3c zZ6u)BPdU?$O3b(q zmvwgE29Cyd^TXFDs)2zzasAItGyUe{etOqsm-rS=_WL^XaoJLns-%#8Z(8e38y4u;;!!?UBWhu!$S^#lMjy?elh@k#~%A@Zj* z-6}lQ%Jjpz@1Di_IURc3Vto(Z-ip4VRAoG3w-V^_o)d8Cr!uGKSO`Rdu&WC7ZyHqY zqJ$8D37;qq&x}M}rN0!~SQoW{N!+;bD@C;VExSt)-Uwn|Wn#FKDo0*?e$R+FEl~XJ z3WunYCt@w&DUbndUnCjbiMlD~!K<*+y!^e>42}fp9SYd0*o*3~>1F@S|BOO=c3a(a z;2qAui=UvDpJe920U&d55ALCUirsIVOy7H7r%L#Jf#ZfrHNHaAU}KOF(}Y6^aO z8mIyMwK9Oa^74>ja97OgWEj`k;2ncX27D{)5vU8P9r+zISjh zAL_W%5q@B8mSRIZH(PM59Ja(?n&AHlbg#Fq$g=Qj01|{0hM3?&Z&Tk1t8+Qn3ausV z)w-P5Rmq?ZutG=aS2s(dcR+vgQkf{$og4C#U-`N1?m#0Xz;MI~!EP3h%99t^gm;~? zN+L%v2$UXfrR*SdYY7&?3G^wU#odxp4vT4+&u(46%aaLuj%GP52-2%_`+nXO%foh$ky(T%P{rPp`!YN23X z^T6ntbHbnIo;)I;B~qPr-wxrmMkh}3=aC`(byOSwc%LdgamXO`c2G;)P179NfR1Wx}akid0xgaOh%?t-=}eZ=7zw^>Z-`4qFHL` z&~&ly98{~J!aD61I$LP=AAcd*Sf{b?eHt>}8zNICJNW2Tj96~>26J$%5pfw-6vt6M zR=Z{Dyw8Gt$A8ZMtt_vA`hmnnR->(*z*!Ssj42KL0FRwzqHN0v{X03HBP~M3Pcx-j zTfvRr6YXgGuwZ?M1(?k?zyvd)fzRvR5k7#IHt7@&z$`{}qJhL)IR%Ce+-sBPZ;Qa@=c%u<&q5$z~|^O|z;k@#@`5SXh{k zFsU}XZwqT5_OYk#Ji=?(Wf3T_k^C8*47^QNbe4Z#)9MRGM5sbWS-!w)FA92XUxBO? z&VV$%Er|C{3nCF*+-cCIuP5uWD)!oo)qA1$Y z7gcaC)JYps(P6DAWrDPOmnxQycRV#2mprn|xCr-{4jLd;QWV%urP=wl)J>dWdUF3! z>&r{tb^|{^j^pr37rW$P1ge|aXpAYo0T~^Fe`l687G4CV5CUIsG@AtWGW-mU2zVYq z?bau$@_};O+7P%ewacBnJyl4@-ybAU0^|s+Ic1J%p*Rp)N`U_1vKoFEbCUS4${>v{ ze$e+v5>{P-*gn4Ezptp$>gmGJ_?2!#qsiLbR2r|~!J)w8_>g(#U?DB17p_oikRRXu z^Z{H%&)Yo(rxh|Fcmu~COgBWLM0^T-LQwnLB}gvW~1Mw_tHALY=T z)(`LGzK!PTCemiqo0Br>D(qmPkkBzUx)}z+v);U(38X7&Qw)95 zKqS0v#fJ5u$Y1vPCge2b3LI9oUT`i6D!|io>fyw=!gFZvRU%CchJK?#KioSu$3R-^ z^Om}9$t%>l=9O)VF|*cR1Ato}N|qvlGFjaF|MhN)L=Sbmw+g{?8J{FMlmtr%DfM6? z+`eRx;}hJVl0!%_B~o0TAeT4D{uy*g@h+5v0x{mRIM+qA;}hPX&>pb$GWh?>6I?|i z+HwW{vLuN0GUBo%j5Qf3yEPo{AkKtf?50pGk5KF;KrmKYD3+{1{JKEgSuvjB zC*Eh1u7Fk+3Z98scWUW$AjNW-cP-1P3*viqTbvbz&1I@TPJuY4Dba68|J%X=wt9|z z${wT&CD!CHZoKZg9Bxd@JtwO=%451n+T5PR1=;Kc;#Ox?SL>(i}K7N|*oSQlm7w*h)&H1=i zbDE)@80bux$JxJDq3pY&R2i9KnTT4{F;1LFOT3Zx%F(v{Hi#ILd-er%qO~1M(}l$R ze<>A*08~et-=oi0!v-W8QGzstvR~{UrG1p*$V&kG@B(Je_Dy4AMC^iJy74Y1=u)aV zy8&M1Iy&kf(B$oAIrJ{0q)oWWJ-9#`p1D`}YHXon33_BZgCV>NbO2oRs-#s)a@Xd# zaI-#o%^JRO|Jb7I_D?cKZY@-Y6CP;+fj&D9!GgumF|>;9*L9biR$bB5>a_c|%yU(K z>X`tRj^Ruj{6E%6en7&2{O^q*>^AWM!3&rS22QcA->skp;I?-ov}(~9Yir_Z+? z3TX2X<3`{0TqCVOMc85w-34{DxJ{mG4x96IX;p&KB#Mv5)OaZ^-kZu=m@#7UY7Jra zUrTNd_@*1_R|aC)&O_|bND)U|`6L#x_((+g)$W=12_kST8$e4L>~eWoS%*b6e`8JJ zS$1FO8XsOk_m4pZmuvc`McGSI->T=a#l%|xZp$$%vbW;^bXP|u{uO;}72;zJ(``$}ZaE<4tUBZm@5ED|! zEl5wWe!+ZG9Y6{;^c(rZ9>dGHYFwMRX6fj<3xT+Fq;1E+-GbfvYZwpr)zw%5g-feR z;+foZf3Y0_IWu~@1b;3QHHocuC9X1rt&?Hea{CdbnD;IT!Uo|tbU9!Rvgj-=p7U^` zf7@?&@lZ`^o+^o;OB2wxoiyEHc87Rg#wU($dZ>z@iOp2iuycKU*VRM9>vW6p+212( zDz<|8Z3Ty6Y8_`nZl|t&{Ctkxly>TYor@F0e_p;=!iVZJXf0U^`LoYQ_ajzX1e&E! zF|!Q<6our6nc%u5CJ7$`Q`bS#^#f_ETYEIrFIvU_>X8?AefVr+G=MxaDf1D;QmVWO zk)_<&VIXFP)OaO2p@`3xR=EbHMEYnfMU?XL++|EWt>Ss&Nw&*qP66aX4-U)L-5d;pW!Kfwc)ri~` zWQpOmjYHO_3r;$kRHm>?tHk__BnCgg)Pg9gNjZzbCxbxDUqAEUb6pAxd&o}~HJkkq zwtp_ZX&=*H3fJqXb)Gp673tI1lh1-P8KgLr~sj>SOE37=sA zFuUNtm6iNqIg$#;BUg^*!Zi-}Lu4hI;*W+L|Kuc{dy3mjM2~pB{Hf4uS|)DF6RM;j zDgmYtRB90J!xd&c8_L85D2%Yfo(&pv^q_+#lURQMXor?VdFY?^YjE3a zil$hgKD6voFSy-U+0iTAl&60*8;dI--dJ;)$;;!)OPSxMICU01jklYM-fE%|mCr)XS$y*;jCm#Ti42mVdo+LmyQ^x$O{)fkxHc@}K(S z@j|0w2c|{z7im)9?B?X<#6e= zp+vpxxWlo*0WjM=woYyepB}^7vqKH#1!~R|5N$HRI?+KRf=)pG(3DCuW)oq3csX(W znpb2)p)M*w0dN+1kn^Dg*$Z9BlsIvXJ%T;tGnmCBb(Sf6U2@W?ABh6r5LCVRs8CJS z%4R=GGG|dFKD2Ztoo}7K*e?`hju*dm;GetXMVGYb76&#*Lvsf+njAn27)4qfu4x2lwCG)CKmvnCe#S&^cbR zxEJPUI$&HNP4e(dAo<+?HT3qIZ?MvEl;q!Ge1x|w!ZWTPb$glTW~$17{T35k59GLj zW z(Pj+?!XE|7CFn7Tn-xS|*ynmNY5>cn^HzS;2*4HOdjqEs&(velrxSiqBo-##w-NC_ zK}Bx!)w2q;Rr)5BxEM-ZYlTpA!7(3b>|qshr*LOzQXu$~@iudMbsh7Z3i8cuR0H0j z6g%FrocW8+)e8j+M^Pm>>yRS*Y=}$PQc1kVys|NI``t_=v@}7K4-=#T+$FeOezD{r z8i2pZnN0Xes(nW3KH@XEE@_nF#<@VKoy9GJ<#?eJDM-#Bh&v{EhGXTHN4GbZJFZURzO zQmgotJ9E1#qb1|Wr#qz>gDU)x^zg$YGq^8ALC5RlY&(+;> zTN$}R%aeknrg9+2j}_lb8UlM0oa0Wa-99{HI|i$sLi`@fkpAhP_$DKB1Nb}ddUlc{2qu>zyO5R7lI=kl7=(`u^vH1Joyx4c6=$l7`|)G+^O zH-m9=eQy6s-EMp_iLB$gO$lW}P!&YW#)gQprrpWi1{=E0c0>jady<^s8z4++znD>1GKt|&Q!PrHCYw!o{7CGp*?$wuRMmO01TM}a?~I0b+0j)EwCW?#g)zHIoHb39Ac zx0>||E;V9HNFJi@Tfc7W;vSQ*Uuld<<3Io)M@XRA3j|9?mHoSY)RcZBJd%IiFra=h z-BcRc?wlaQ(~wv;QM-Z&kj++;d_0PIF|$s^Tys{p$8D8`)T#V{q?dDh^Ks+qA6I@Uhfzq zg_$7(j-Xl6TJye)<3E_?Fk@SfKR6P_Hr}Z6eM?&lzOEt;MbvsBPIz*CUg~=ZF(?Cl z39!u|^c@Ne3ozv7fb>Ywj2eY^PbOsSe@8Giq3R^mY7r?^cJ3okp?lWQHyuA4xCu+p z$q#wt0GW8sX2uPe&a=ViDD^xIeKpOJ^$`;*NH@BKfQ~HBuGYd)%pNCM2_d#xWHBXs zEpt&4VhND{Eg~il0HEJT-^{+o`ewE z4`0$-q!DY6#EyU9fYAC`QgpUNt>FF z8oJ9r1;=b{Z5s9_8zO~Jux&;dUC6$h8|iCHWASu;-)f-@TW| z{qW;IYu2n;vu5@_csTq=qBoCbt@4U(Fj+6KN<ny8?!Y@(Suz8)!2Q~RetTA@(wrUU}^IG^>(b$f0kdrO^k_ZXZakUTD z9I57vcZwfJ`snz*X;Z4@I^F*$7J4?t40Bo=vhRO)zCwz6IWT5e6B~rK@g3of_wskD zRUB#2JLv}~!Mf=@`f0_nu%^o=KkwBib+Ta_k6B{Mweq!0Wpa1a@cg(YpQk=6@gdo&DKqAe2R4XnX3{VlpQwd73s!z z^nIOzuYq`RS%JJ)Q~9)g$`$eF@Ob72hyCrYm(H;an0_!SHr2;?ky@_!q3=EEZ{KeD z^49vKmT}O8;D+uWX=#_p-Im#%o#(~35G`!Mq?J86ShID;xZ2|H#HG;s5bva`I5Rr$ z=eK9Q%}xIE*0vmF^K$MoV*vB=+dbAJ&DOJRn>&N`?|z$T8YeQ?Kgw_aNHrREz8v&k zFj8q#M&3L(KS=~rV0)0#*4Fmp$LUXKk8ibf(^q0r;m^^J@!*#mJ|gy|X~;yK*J7+e zAIIX8`a-XAuP>!qpOgp98J38^(hrUh#43)g6FfAw$N0e5=kWLgEF}pgZYpp&^Ni=A z<;H5=MmlfJVV_aI5Hh%i(f_eq=BrFehLn3OIl<0SD1+-RQW1{?HB!UgR!{_PDGa|S z3}A{Nlg6Y_=@P>f)x(Xa?IatA(FdEdEG1OqlLyKW(Fo5Ey$P5nLImq6W=q`|06xTcM6{gGdP*pkar$au$qr3_AEQ8`7|}%E9iZ% z5jrbhfPJ7?NDsASVTnCWFM{WNBAS~3s!i5yuc%xi6E;uI{UV&Fjm*3oAN8I8h@8kg zXLd&&PdxIg>8xGeAbpi8blc!_(^$!7LqO!!_QkkY z1cmuTf><~1UJbaoD}T2o$N!j>FB#CTf741bXDFTl+tuo=&G$!{7T zp4&oMg+jJ-&N%VKZwkqhcO)&!UucrcX}wOZ(ej~+615Ut9K(NtpBD2dRV&jocB#tq zF}AfVdMW-Cp@F-p%j&(Z53fr#mPQx%e|(*Oi;&oMS4f^wUWqWK%d@=N>zmdqWaW}nR-r>D*EEz)vmGr z@TV~+gFi&}Icgf2@NCmqgX@iOJjKP*%C&I23w3VN3i~==8p`p6)L68kd+zL}7SF%;?dfC;oo>#za}UYoK#@^ z@E3dZ_hsq*w1lp#p8AcB ziv3*Y>0Dj0^mMZzDY`-gb=chdCrv~C?EQGCuSoKKA@yrX^Np>@W{1wr$Wbxw3H6NA zZ*G|!$n?3C58XMErH+@B_tKlq3ZPD8{SbP?K>E#$o;f?`jS&bS=v|| zjarHvRZ(y4z9rW}dnrx1rk9oYmh8rBGKKT6A#wt?QRv30S&AY3D9h6^z7iu$#bQ+! z3L9j?OM(ZK6xO9^35=U1)6>lhDU&+yGYRon^JdVbttX5qmMih*#*1rY%~ajdpI=FT z9ZSt0VycOmEFt}BorT!R4K%&bB__BKig?Jw@>PDGJDBuWVC@autsluD4pIg5htxg@ z3D3ywkJ!|@O58#LmpJ(!UpWxAflu5Jl&-{DW?~PMqwAjkzP3Pf+rf3b(8A8NWn|Fd z&AI#s<%k>O)^sa(1v>S$U6O>)VXkmK({ zNyD4s<*Om+PkgEVM1)IET%<@q=J+%TEqnhVHL)BXANl^m1mb?L1I0K7jjvMn2dmb- zq^Beze)P9xSYk3t@ci|qFYkXhQB$!Xy1(UgQ;ac7xcs%CIVEGI=zCN7Rv0X!K_!9U z=hFBO=@JyQ8~9j1ErOWTgs1yb3R_KbDo-CAFs6Nq?s=%ISoqw6{22+YHPiU9)7cB0 zM1RSAU1{MM>z!f5S_!{lteu{iM}SV=VBLj4ZN3J@4vBYNNN3hY( zC4wag`6<7+mF6Hmfj%jd9j(}mpXBt@G(b-`gx->j_IyWpK-_9)zr(#RTW#0e&EC!P z&-wn=bhV(c=p&DkOdY95PSte-o%4sSpBq2Yinxo4h*Eq(yd)tr^K=OrAlbTfeX{yg zKfr(BVGRKyg@pe*Cj0QX55cpi1X*&7zfUxx`MVt4brS~UQNDa4RWal=dBE#x9}?ax z8E>TX)j+d>EM|}4c7(2%+Dm~Zf>?%;Lww#1(anp2EW2BK6Bf+RGU!Zn_ZF;t)|xZf zapEYp)CoDi-9aS#%c&XdKYh%8|K8~_wP#5f1wGdH%A`*j_iA(KG!Ny+-50keuHJIq z$dqA}+&%2=yxAtp{zqm3Yv9ISyKhL^_wP6SSDukCiqHyu+`ZuAc9c;fSkyE7$W*?N zHKREyn@7U=M#wySXid5#(akcx#$Z{6GhHPoZY}QFTN{KZqUR|7u7Bo|z#=ocuLd%OLeAe~k5Hr->iNYOAKv1y*DMblS)N#;k7N8X0)3=*u? zWiIlQoU5F}Oul|MqE8?(3)pjD9Wsh+oc~j&;ZHLjTM>`A?^0FRsfH@>4IamcQ^a|8 z>p*Pc6WZIB%@d0BXkLBMTJIAvkv_v8;odqj@2!+_63{2OUMY)gZKB??5mDv~xh14y z%}Q~bs91_}A>Ny1#u=A+hQ&?)R+Ps((H;t}=wHIhxLMx)rN%-BDHrxu%Eug*52<7> z>F?B2W6_-3A@-()175K<*yx^Z`2s6wkC9~*e$iuGX~y`ucaj^Un?pX zElfQdd(lu zWxsm5`=oG>TuCipZf$+uR(@^|`6v$sJMTT$=hHV^zi=j{t46*)b+Ru)!x-fjtj=)b zL+yN$-dTWwu=4GhdFZClE2KfG9of0J{OIPx#&%l~haqdN5@*<9W>SbZK4$%bypl>9 zx1kMfscWl*>BNiy^`Eb3=2fQVTZ*sD&Vsrb(b5%9m-LMCB-#bB>0aiG#y&;o6336% zWfk({s3g7>`y(|>l8LB|O!0!~uw1QJ!j3e?DE>*~7=r5|^Qa{Lap)T&*)*zrGLB$z zdaR+=NhDJhDu;;%qTIx~g(YnPohWF~hf>|w5K96P$0X5SJINEgK&Rm`F8OV3{qwo- z7^8ZLy&p-7;yKsVTrzV-au#E|!=YwztrD5{u+$f?V#?60=l#Eh>X?^qy7A?>=lS`W ztw~6A1|p2P^%T=?-YFuU_G=M;rTp#}E*;e{r7k)47lV`c<%({oy}j|Bc&MTAr!1cv zeD?9;jI3!{f2zGUV5u_+Stbb07s7pUAmK%{t3o?-x25I@_co1Ds0)z}Y8%w$MV_(H? z=k`;xfVSIZmbed)s)PJ02&awSh^bQXRzmFHT0Z%;E`!BLRYlV1KWnDegjP|*$vu;! zoAvJF;U~B;!LDiXueA$;iIbd)M#mi0KM~;Djr|(a95J7%Whu>A&M~!rT`EERv0x)d zt(Q`rRRg?vh1m2+n`pL>sf2k#_j%bEjSOq|iAKzx`g@CLvgp)CTf_%mUCKUcUxN2$ zfy4>Qaq-Md>^!Xx2GKuykKzW$6^}3MovqK0;LpS#kTz5Gt$K;B9E6hlNTIS2RSgKB z#fOzx*;ut`hf0;@=sb+ZCBUT)^l;`?M;QPVohRP9S?#=19R!jStzLSbE0eDPx6 zts}H|aN16s?woiLqmo!!D2czGI4Y=GIO*M9Qp8>jS2fiOqf)Hhrwy6=JZ%2mQsgv^^%=Y~z+q5QJE z(&6S2_7sn;PiX~uo&Br|JsV57ZESN+WOrY)q&E^-708QjWUWi$ zjS6ODg)y~goWi>pp0h}a`$~HkPtv(}?&7VR=E@7)=G2JD*%{xIf1!{bJ}N%85m;&I z%{*!^wNjof;X{enr~hD7TxWq6O@vXK!{*)gc1l-CE>{2hltB8PaMt3z$G5j`7cE@8 zQO(A_;N(4acs9f#mVy4JTxxL0bcQ@L5zeO1MIePjPl<_=5H>i`uf`4&_;QBwv$4sI zUOhz`Q#WRW|L%ilzswT{b-g~*AQ;NQ8}qwvM2JjNk;ci`YxLsgrk@{HS9rMmnnsF` z@YCFQjU%FZ@X82jKEh9hpfp_@f@g(eyW6XM_|X`V-=xxYKPJdobo@AGqp0!aqA3SA zCoHr$+meSbTj-Wsq+GUI0CP5LlZ5#=%Vuh0p{zp&Kuj zE&iA&Fy_UtOwzdUd}h#keOGpNSdFsn#ZDLHz(Rd(fgle?$S)%o44OmwHjti3wwCXV zSaow!-@Z9i3^aVY2xO^tAvm{3(jnTgGhUjIRWVfZ`}pdj zxneYBJ$1yMXIJ$Z#?b9LeMVYr7Q4t3V>?44a~MJH&P$KXu8`Q%U3P-Pua1LhF=EeYxtJb$rVvZ2glr)rVqDk| zgEgb@t|N*oaqB-Ctc6Bbh&jD_?2I^{uPltUlOLD|yGh^co^?vwDb5-tcBk~u3w&+* zR#ECtSEMQ2^UDT9EBke{M79|J#)S`wg0&N!!B^XH~TvQVW0KdCozNzvzq*&9?OXuQSyUh5&HfEp}62S z(MH2($t-1b_66ogR#PIE*t!!RgNE6}N-9!h=+JG|8=7A5HD$s4%P|itl_qyW*A!h+`hwHx(!hMu?AhMpH^#N6 znvzxpZa8ORoI5*y1ye9LX1c09SRR5kICj0OsB~{Nb_=cjf&N@mkC1Zf9k-nuDb%&7 zvzCj&AG}?VY-@Y|>Xg0mS#xJ+N#x`Z=U<#B9p@wUZC2*Hbe*7^#Pjw*hl`xTJE!I$b zE4|C&*KnO)Q%23|;j~jsM8?mKq_aDn{(n|2CJo|IjS@1qRzGoDtnz3DPf}*#s6MKm z5-}7%$F=s|9C^A*P#-~V?_hhSizt5Q@dSa_Lj5#?$^3kY(Ybkk;n#f2T@m3&@H&xu zFWqE(HNjtwd$=9`+}l6hI$TxPlNvL7^uo+MMCC+vpt4bDGR@`MNNie^`w( zu2ppX=KR_mP%AGg(&YYW-+V6F0dWXsjh3}u(YTt zPw8O_t?bu0(HlE(VXDYvmv+;nOndHMXnLS(h8$yf_Xh>%iPOEsGbS^CeU6{ud9iJR z5BS~+f2Og=qODSjq5NNscsyA+OpWM0o)!4-XId_cIJjBd&zv1Nk9qalI~vyOLjS z9GRXW%D_H{qd0+pjVHIf>I9dXRqX9UO`(B0qhz$)#+=5oyH*o}OADiukF89u2J3Gx z-CUX~r?2lz-s0ENy46Cg`|!CYqRhT)>QoXx=a+X+-e$qmQtsOtUC&zim_lFk!be)G z&Gg21SNIfdHq*b-!XMR6F15*Fk3%PXlho1@gR^EnPV+&Sa*86LL$xPh3TWv%m5 z#QgE+>Fh@)(>L7wp~Qop2#!0-dLE`ro9d{W98JA8Q#qA}-Ng~Z>;`>_@NIU+cdV(- zbN&7gKK4eOv#tmjNL|!=-O@aY4oKNGtsa9--<=bnsr48$KpW_r_I?_WI%dIxWFEa& z_$5DslJGE{1J2UZH#v~&J1vBGw_>VDV2+lMn^pR7mFqyq!~6` z+I=3L1NSLR@L_0envvdyE(|J{;8G0 zUGF~Hi=cMas^aMMne=nXlg#yfW~$m%o2L_>s%|$}ma9q_3M2HQRo&#r5Dx?gt70|D zW>U$wo=naoU1Zfbjhjvj?6t!Jk%f-(_h0zCa(bD%tIQRjjk@`glkz9O zjn@8j2$wA`q*d)@Z^$(29uUEc=+{b0a&;REQ=yMdRT(0m4LK&@eMs_Z&z4MU5Dzd7F7tGL<&(^u4kN0ZJuAb`#Sf1oLyxCP# zZ|P&&4*5>Rza`3!?4b(hGyL&b(v2eye+F<;#}jUj6P@0l*@1Xs8cnvhyM0&)TqiO zN9;Y8Zg~usZ%kp}gw&kp{E~Sgc6vKL@_U-a0rkArTF6dDFjzBY4A2Z`^y z_G%3u-ShcPbY$It*xg%oza>!c;Z2H-W__xv%2B$VaQpl5c>ASo1nYsW6mDI?J7%n_ z*SRzvINkXV%r7xHgVWu~%=u2~&=1`|b(^Fh_R!-$N#K|J&E$#m5c%ma5;$dD^tZ>7 zUr2jZGD;=e*fn0w1IcyNwyLBucJ6K)-QSxX+m-K$9eyApZ(5i==6N_(c&6TF z)x|SPJ!OY@&?txF@!iViQ#-Ywnj9skQgAm%9qHVm>sgv_0YSOa@vk8GMKx`_<=s%c zrI`!ZMy8wC_YwHxv9blzq5__rd*^7e+^z?HThs(+uvXcTizJCSv#ZR)e3pouQdw!@ zx!knuyk9$}>{_1@(!EMPwlCw2u9U6dgl~`(iAtlZ(|PC{ck(Hp|CF_mG&cU>rt!aLsbXM_RH){KMPr1~PIyY^z??~%>EPhSKx)sKk{UTgSN?YxldX2IT)y#Nq z!OD{R#|7cr#0U;mqV3^#ksEKhs;C$-oQc;JHsMhr;o++5PLY zRhQ`#pT4puE@z=alN~zu-e~uT4U74?6|c?2TgJS8DMliCbEi4>XwQ?b+EY?`K7Z2p z;i@mctL0VP_B&H5)RuRW`bSKU4A#0s+@gsWNU*zOJf~FCiv&@@|Krp`y5>w=l;{3dv8WAe4rhMz_y5rs=91__63vN51$rsOIVu+SY1tpbQwR z$7y7JK9g)6z|1e%_ondP@@J50ykz=qUu-M+#Nft_;7d7Lg*D-5(vw_F zYU_-e18ezWFP@3hvCf|cQ+q^<4{qeuIz{e}j85L5mUEddv45H8=$3Ahc3|%BZTM2>0t)^l%1>QA*xBQrL{iA42n9CMJzqqWP(PE#FnEq;?XBG= z&&XTdE;^Rc-u1flyx{$`EMIe@oibTAWw1u9{ASo~<`GF5c5#>^DdAOmLX$`m1 z)|zk~)i~5lcMPjP<)U7!+rbW(YnVDZB_7-^SWvRk(^Dkj{@k0|O0>bh7Qfo<&NF89 zgK{?Dz>T;!^>md;DB#}O1D*HJv&O!hy*b10&Frty`K|k#XH7n}N-i`=^;7$oja@=T z=k9H6cIGAfRkv?axL%0Q!d?Q$H#k|R{%Uu;n%>{um1 z;qQmqB)&#FCp_BTc|zk9g4*c#MU|PU91Y8lFSa5NyTLM0j23$Xdr@ZCg`7%Ig~fT0 zUtRj{?#DSL9lLhUn@$;3qGu08Lu{C$`G0&{>6W=4C++7*-l>R(aGGIv{3v)Dw^F6H zGd>iJXt+2i^Yu)Pcq-)ih(!-sVEy3!tdS^QFB`#5%hNZhcb4unXi{@bW(PlkedU{$ z%SY9+QlF$2VU_zHI_uPdqnU^;{N-k``P;AC%msvp*f#9gWd&My=)CA8sV)+gcUvn) z&RcPe%hc3-GpqVh`~+RMf_g)o4l@n-?&c|aZ%+vc#>c}%=B{>O-vhVZKd|rmEO7{L zmQ0AONokw#EZi2AxWovf$jdI5ZFwjgiO_YNY9sbM3BGEMkGJT+Gq7X z-CereDZ2Gy@wKaAR9Lm-x0}A3{YM)2KE15h32LNWecQ0BU$2@Jkyx!zFL;+krTrDc z{^?23YI_^gPx_Z+Egv*$mg+d$%_FS7u=KT5srNyKc}A_+pRYPIIRY0^)>s&Z%fDt zkK1+%6Ed=;Ji2Omcg|#ybCUcCO?vt_rMR>T3vqhM?`Svo}}y4otBm2J8y*bGI0h89?f-DuErf3r##j%tqf{v zzv-s@`CKR5i0{}N+pRR2S5hHX$ds>r^%c>X%JK?>JM!UXoaR0m!%vTu1N}=~OIaJv z{AQUSCs(=@G=;03w)AOJzrjayp5e~1Gs0;`yMJupy*OdPrLH=Tn8iFp1eOF|pw(8^ z7U$=du8=Vs9Qc zwFl3=;K(v{*}jGuOjHY)*a;vIWIwBT1IGDGMae{e@1 z-#z%5*z{H}U!+!M`_{;k8gX7Ne-3%fAjXS8#XFZcQO;_42b;Eja_kjT>yitz-_ky- z1O&(A888Xn=_peA7*Boh(YS;31rm$zeNE0yQqAoB@ye}m+hir?W9xNFr!Q3d?_7&;UhB@L*?)J@>rIoKUqV6v}N3}K2MBJM)JX$q9fiWkLl^1Z-(4ysEdx2ND+UD zwvRoz;>c|dxQV~-%!~Pj*=IT&u(8MwjpqrvCZsoK+LO~)#e94+@1HuDP3>AbefN`d zzlf5Pu6tUgS&oldm&SyLke!oyV3V75h+WMWh8D;YzWiyeon(FbLbeo>$o!^}nyRme z#eAI0WJZ>M!h462XEF@~{Yo{7;tbs`m?(O(3%F)xVL0)v_O+Six=+|xqFa~=hXguL zy#>iRyQ6S>Xv{eTQ87rUo;2Zq`DGnmp!M{5)$q&wib(T`Z(C7D+K9xi=<<1aZ<&W} z*8Jymj4NUC;-Ok5Hmh&a$$1om_A3iysywTU-ViRj-hIcTfA6V|a!XHP;2jp6I9j_t z*w;7)S6BPVu^g6^?f9QR=?73A1hLi0CPiVdbiR9u8T;*s$6C`mAWBzDbpO_af?ap| zM!$2co8dA93S=!t-&8UXG)CArQAE*AsF^A@N$#-sytgepGYCk}{@cv?}a*Nl*1^>5M~BBFEjMEr-ZYH;dq5O84)# zA-Ob!YEpjA2NCA4S-%LmmlaEpQ`egK+VL0k$&qAZPQD^uObmq4@ls)!*1O^<=Zg9X z-w4}Sj%fYzoDvhO@BRtmH+o_S#tl?=m4>*ANHv<QuDUm7glQ*1k!F?_0c-7{B|J zoatew_GrQcSfNIKKBQup?uYZ_=O(oN;rHq7-6-r)kY0aKg1Whv!p-}-I9)~N<>=GA zEl_P65mRWt^!jAU!W2&fpA+Bmz?+Z^Yx5SDEfOGjk?@@!qg7%XA!TRwLO|5U_5M&= zTeqd$FAF%zT?^SyL)&4<*&yyX$49Kh%x}8rCnHsJiUWB|ySu2$q9_(CEt&)=IFKKe zww0Pg#$aO65~?G^ z=VR98xW#A_`2>|i<0!S$lA)YL$(WyhIgWD3xtls2#r>?1^3VH)@jEsB6EXx* zvlsyvu^coTLSE*nh(>pc1B8oW?lkwRHyt0#Qw`#`j4!)?p&*Dprg$``;TA?UifBgu zkbbg}re8=PA@5shs=T9a8F440kldSS;>mWiR)w>9al;h&8zPVRdFF7VD<<^h({EGN zG>l%6gr2l^6p!vO_|CHpBWj~m@g_@r*XZx_W__hR>-ysP8n(0wIzpBrOGAb{*dU#%9E zYd~E@%AO2wx8eCKW7xA*1nkiex2IShC*xtcp0#b;!Q;=(;)vN{9oyMq_x$8=?TSW6 zoR0%PYu_|Q-_y$&Uu(tqa5m(54C_$24gXQD!h6+mM&c^Cb+dzSL3crs(c}%>Gj;aa zaLE0L7tAbP33BUwD!C`G=ecjpX*0AsW{WeJXA^$?y=gm#`*s~3A^!cuiHkRG^5N3@ z;)kZ@b=D8TJaj{>bI{L>I#A4n@mAhb$-<6@`?i@5|TX zEC=RUa>QjQsWrXP43gzWAuIV;;HCKeGE9=4}TvDq4*F6>4AkmF1ZTH4PN5eHUFr>l^4DExS1eqfK=z<0A` zC4VrV$e9VVe~CNzo))^(aw&{np@mI^2n1tcW5}K900QaO!f}T49rQ?j?RZHU5TXXIKTH$7Y z9m@B23bq#5x^*h$eqGMaP(ReP5Vxx>Vqf?FByM@!bU&evSL{s_riJ%YnLi9;9tSnR&z`h0@3>%p4?jvLyCoW%Dl zPtTG#0|OG@Mk7WN14ch9-cm8HBW>zF*G>H-5!Je=M_SNorFUnbJ%+clu%4DE;L231 z=E*qQ4>+^CO!a%V!>d;@gnRDIi?@dR{S&2s+|Mjh->j)&x9Wb+w>kuq!YsqrTt-30 z;@9md#<@9 z(-U13Iy#+S#bO#!e(TPS-f$c+kd$#U+eFo_5qSD3tS;SHy)$K>?ORDvrjNeDRZhI; zYf{#^7M5q22$^QHxro~`L&Xg53j9BrqmAmy*LZ$O4{Is*Zz@*ei=qMlI}=1=nVM)# zy(qX($qDC+?WQ~u$t8~p<^RIH5+uMECps2&+;fk8b!fop%<;PvW09N%TNwc&<5qY} zaa(h-Qb{~;;;5M6SUvIVBbT`dU&L;0F2&Ix}lRZ6Sb{pFaI@bJ@q3w&h zDj7tot!IAh>XHBv%LFcBQNn+KC4Q5tk?+m2tMvK$FgMVAJ{(>7#v&)<}>v>%BZ z+27m5kRyFun8lrCCzZEIc<5C95k^qua4~;HSHv|-w(%m$M%G#JxSp>0>}WfI15x+= zeZbM4rI8I*mQiq=;+#JF6y}SmrS*W#m#y2mJ(dWI)kjx%@=1xlMZarJX&htUY`hqtkwe z(@XIbQGbej&hh&W(S=zbgZBz`YnX%*8Yg!qr{H2DohRG*eIL3Lin0*ZRU(p$GnGKZ zF8vwLvA-P3@)5;%oJ-ZHK_xAUKO0U4muFbWrF5E_izOySwdl}NQ-@bZ~+t9~;Avz7cR1^kImKBj8Nv z%Gw5iV&Fu`UlDLhbY&~>BS9pb2c1b4kW3^Tj@}>*$S)EujP?XT6C`m#(p4l}3{47v zL=n;K#Hm;7HIC&}0;x7v0Sq5J5DY1HA)km5c_h`2Xz|5)H=B zf{gQ{;R5I#&|s_4a7OfbNF$7abEEG`0+NAfTnvy0L`ByQIMHE{-Es_^A6*NIiV6uA zM30pLq>Y3>M0bNijzYp8p&LM6Mj^t7?8ssPnTrF`frtj8gjf(-mM)-wX7n=_PK<5` zxxb2qQzBL3;Pi|1qIO z4#&Y+srF+3H4#OD!E_e?^>QCc84stUvI{c!??6nz1iAFD2^~@|9)6FY2*muKSSrCl z^+@G-I5{#c9!`K*19SXO8#U4iM;HxQ(0}R-DF6AQ0>FqojfdYw7n1-RqceR3 zB$f!4+U+MGk3_KiryGDup;j1J0pwvK7&mMkXq;a_U#2xcuf6~~8ptmB3n;N36qA4U z0}*oW3!D%=Ob0X^K@AlUg{OnzjU;G$&>6yz!AWo~bo~2(8X$r_0CboH zXG3>`cGW-K1e4)(=rCw-{bUfv+6tifWMJY2Ro6czv&rxW=&`HdN30aM5W3hVAZdsy zph*278iyP-LBs`S8S@oD12o-75XnM~9uQ$cPO84b#nJ7cu2&GvL)w#6Kv_$Gf*?|c zw7yih7`i!>0>U&vg3Ew3Ao7AJ9-=*{$1Ft2P~7*^0pUYrmJV{$aXm>M^l@4+@%D6( z7G*|27Z3?T$>7ZZBt{R&A_LBjPWIny7G!|UUIaDtWq{0uF#tl%1k?eM07NtpS!RM% z?fo~K1(_gKT2KVznczHvDu^TtOgxqi*s4L~#tJAR3se<83!onmk#PgU%?2dP0Z0xa zF)l#<*`P;1L@f}}Z~{Wj0p!IDNDLwasIO-ZsHF;aK(!EcK&^iu%7R*ja{(noqrJ@q zXX`k0ApNtjHMt<#BFO2_T;Pfe3XMJwlLigQ3Y@o zG^kf&0q_(CN$7=un4nq76oP%G1qBrdQ6Q9&&O+dw3j@$UK5rL+ZEOdvDSHu|6I~W6 zdIN~opztCgnul83iooV=fC9xT29yj{hI}!YeFfAb5F#!}YlFxO($K#F(t;LS;v2}w zDb&{!qJC&OVj<4{7}nnM1iIDFJi}kzNUy;2tza z5=3N>=fx7>#ZCYaV=3gB2at6ssOt`hiXdWwS`Q%#dk9Fd43HKtAP;2uKzpe8?`i94?LqN&S%I26Z5+0C_csCaw+<7ZaeE3Q#xZ5RE{T3=vT!NCp{n z6IO)?3rcQSB}k+JIiNv^?1&+|DzE`%F#-LvI?t=%ROqpgiBlE0Cz_K2%7zGw0?;f( z{ZQ+jYG{v=0Fr~q4QfR|CP3y8X+x9+*&!i1g|rcf+`a+2(+o%q8bhTS zR4x~!g+PP_`Rjye59*820tg?9O1uS31L}Zi0bLuQ4z&<@LBaoqXe|p6ycN)11|V06 zxUvD2LR6Fn=l~*o$d0=W93d6|T`Q8j;^2!h&cQA}`1tEBFXzbUUcW zD~Ob#)>McpAZ-pJ806({7w{Ygkp@Is&14M>5nZ3DGH}fw#j5 zqKl;is)i^KqLXfLP8LDM%+&)3AF5Ofh-4x93XvGpI@JS}0@Q=77b*Z~y6O-aKokK{ z2XyoM(F+!b4M?~8K!UYS04YFJaSkX5BCb;jPI5NHjAr~)G8GeG-LYckZAbr=vCG&Pf9aF=L+f{Gr7ZUInG z9S~^|0s1`*J?lfnJ_6mfNCD}OfYvZbi-0H)3b_?(rMU~}1R_Dm3-c(rdD1|hpO1nG zL0R!11&?q2hk)uv;rwXO_{XE*5TA#l6CMLcd;{doa}1oi4bTELje+xW92ymU9J+Zx zc5>sujtkO)$H9#v7SaaCK@TQqAxS1cYX=mG_5?Vm!yt;EfNm7WfaWIPPtd&}Vw?na zT2QOyBR9P(TCx`udFgG6!d5HvkbsGWqp2 zOvVL!3Iyl{1N4OfbaPW{J6N6&7;1kGE=oWHCJqgig$9Fd0@H1z*gX6`LEv=+gFqGl z?c+$tc{m#ZO!%+$7w~ec2L}ebjVzjnvl3v5{gnq2!}!-O!H z)D0Ny6nSp}&O~5-ossut;3XU{3?_=yTmV_w1A7UIB##pY!@doJDIr4_KrY1Kf92sF z6xg6E45p3jfvnd+c|z89!1oyN&5A@@gwqphffPY9jtmTje+LFby+pzn!Sn8#2$-<; zBAkOz3;VA{!A%%!5zLN|02#LkzfWj)?XU*)2E)J(iIBbj=s17vTY(k}E-PXr$`YKP zP#M${G}2RWL2HCYf|Ol?vlE_z3W4-8U9jGiFqkk2GGGbLO4tB&Xl=NzFG^ly%Mys# z{N`W#m!K04FnG#~JYNEF_Fu>8T!aD>R0A(^`H(`(V2AF3q#~`C;Sz+&*O6@kkNM#G z6o_nChCe18kNNw;HZ}(as{;!q5`-jJfs>g&CV0 zI_Mi)8#+3|vVdbG4UZ5JGIkYCLud}p259`}z$_J5Z}cO(R^d#9vXB1i{Gim%fkDVH z5`7I$M_6=Sox~s}Yb+QnUwEi1g>^74{&k$g zz}^Me-#bD2tb=irul@W1F@6X0iu#SLScfwbR$SYg-34)iHkm8rFW~16*>x44kN{gS z=YbpGJ<1!PjJ2)@jsnI4z>z5)(rg3HNho%G1W16L+YJW(Oo+_f00R_V>yN;8(+Bou zq{w+lce~d8z`%FG(b!6XB;SNH6Ecxsmmt`@8(>xE>5*!iU_0zx2P%RO4h%5iE>>jJ zCP)NV*dUsk_POL#gM4mz+UUxJ`MM; zF8Ty1z76uWSN_+&8%ied<0pgk+=jCe&R_ev1pcjnt}c(P*#`5fxV8@g`B?&EG(1Hf zLVf~E|N7y30E1P6yrrrmxpzQ;l3nZiApg-I|9S>Us~tEOAGk7o@teA|JJ1Ui-_a%l&Q+i>lNmk#&`MU-TVyt@n5%j-HG7|`DUUCSM*whQ9vzxIO< zV!R9TFyN02--UDXonHGP1$j0A@oWY0z@RM%ZAIt{qz7ig!=-O%>||kU;|Rn0&pyP6 z0ag{rTYGR8!V0v%XRIxdp!4WyC{k_@oKtq!x(NuJ4kV5K6EboS4kv_x`!x6w_8sUZ z0A#|Evyi}zvDarfDp-_n!2WYI()kzg!v&rTAU|cmb_aY{ zj72v5g7Xr(UF$!9jtMT|I3&hC(DyF?E=noTPJz96JW_rijGKHtt_je4fe!zSjM|4k zB%Hq`%{TF}7 zMFV;^(AkraZ3l1xLbB_4EPy@)^wA{b?L)XIVb-;-5A<%JXD1_H9D?`-um1XZeQocQ zg8T~U_}B433pWbvWxgU;58-@-Uf1^a*E&@ylKlwet>ap^y4DX;k#0xOz4H5C|4=-T zpUyO7{SnAR(VxG%6VS(io|KNnI)*C{?p^=(HUQ{9f$oxlG(CpP5(+l_wf6)1GSKxh zk@b)++w_0yVp&M?6Sx@R_~2h1iWABMeKykS1jMh^_g8lX`UKEVvXR9nAa7hh{^~y0 zdVdb`>;%qZvUY8+1J*?nv}Nb=z@ou-sF1&b?_f{B{uVM9FE1CbzL|xojfsV$xxRy` zqlGp2!Pu0;?hVYV_pkdP&}ANU*~nv^09&fqMR*V8Ts7MH-{X3@VEWyp*(IHx?;^*B%{bHL8m$Tw^QuD-5!Hx z==$Go)u0xIXc*`C+h75Xsa2e+PpG1UE{UnW>=@ICE967Y(BsxO;_E z_ycF7Rlcqa9U%1s)5&R`f93>rZ2=k`Qt1zz1X=J0j!)%Q`8UtcfexKZIWzy-wj!tg zz`1Fe2L75n1}1~R#DDf*lQy6+Lhgu>5*Kh{;`!^L6@k72Y_;ZqEt2*EPKyiy?Nn~p z+Y>roc0s%7{J*|Bko6bv2UK>~x6=dATnsL@g?~*tk*Jq&1}fP9>FYeet16m4e(9ly z5(ps|Zm6M$9*!abL4vfF zPz^SssC@r9JD0iozVG)v&%S=#^PAb(+1WX}d(PR&41g2ME|e2K$YC1$H?;UkyEtbQ zqOAHxwH%=}e~;)IP$>7kVq9L0((YTfHSg~c9qIGGN3;qS4Lr6O+0K_?Hhb|sYIFtT zxLS~lxcoHA*i(wUPmxzfgg7f@s85F^--mwoK|Y|>S4M;e6iaJ9#N|CGC%Nu+$3kn`Ahf#K-^!`DKW2l%@0Y+tZs@oNh33e8b zhwR*JM<9Zl<%Wado;~Cv_tDmTtAn#jh#epjLNj-@@4rv z7tF6xDwrq-RW6wTXk*o z1luHk*mVQ2=0B_0NqV)O6+AskdWrpTKgx_>6!``s?7YO}Wy$GoS6pUVhB3L^-{|G} z*b4wo`v`qYo(5K6FL#rf}&Boo{rYoiQ`3}nV?7O7&_tYPB?<9Bfk|YS&yhnQVB{Al?TIGLWzPq#72k`^; z^6!dNv%TGe|7GHVKa@DlCU$lD3F5Wu&}Bu=(8UH;mw;SBUJ%ni_!9`7ZeY23E>BJr zd#l74hU%ky{FmxEM;Q&R;2Hj(7>99ma1#FPZ$-}IH~Us+`Y#)5j0vr)LNzp{ z5nPim_VTp!A(XcD6uC$n{HzW=;!|@>Fa%0`ehiLB)iXZqPpmGeM<(_Z?5+*{)Y$9Q zJGs8<{h6jfZ)kjGM*2#lxm==>C&6sR86Wx=rn@;yq=OjY%GWedg}<_)U7X?4Jzo2| zHdN#{dfyMtEfY7gS=&(F@Ifw7i^j;wwSpWMWL_iHQfn;7q;{E%r%3Ui*Q{TC=-=5V z9eOUu48=6F(8npX2lOgmAE|;S8Yplp+bYow-t(nz^IyJF^13WUf zh{o?cRr!uty3*Jh5bUVM~9vi47pS4L3xY%x%1FIn)9=U^OS+x-_-9 z)t;s_vsyb{5-GhftqsIjc%Y?n_2|}SR_~Bl@$wOfH$Zu&l_K>a(!;p$i)L0kXSpm% zIKB2jc>x=;-fA0Ai{=QtQt4s7ck+$#%QlKMWXpPm)Ce*Q8a@ZIq^%;2P-Bp(ac^_0 z$+QZwE*ab$l+gjo`hn#My-BIAOiYOFZY+>-{0OeCMJe==X-th;SkB=6rlUh)0pIjO z+Nsti6w$(JpBEuH=1W|D80C8(q$w)KMhI7&8K?Eu$i0O}3(w;2Zm(LKL4=c;5y9I# z_CkRtMuja*)?r(|05K?#rLe`oec7B&w6KC^Cy6n9liiQfyn||P0nGtdH7`$2O>|`? z#d(Y?YQHcIy&1}D03GlVY)O+_S{_w6AYeSZfW)Gosc0pJS^~^Obs*Oxz%l;Gt|~e zDgKs!NQsPxzPSDz^zCpe+xBYxJr*ZtnpV5SUao&1_-UP#51SHwX~DHFhnJ*P3KnqXTMt4`F6LoE4^>jvycQ*s6i_)!!BAsbT z8>`z)hq#VCdk0F7o{G58VLa(e#mc~)iT`nBWyl)AB}0L=z69iPAF&Ynx{cM>StNTa zX+Wxg#D}WpE|lKZ3Z_nhR`Y-eY3fbFjp+rBTy3pxbaz{;xwFLQIliO-N}U!V-Q zwGgO-@_Ap?+mjXrSi#Of2^!vs;w_mk`Y94h6kzp=iV`Fk$O}L|>#s;JRL%Lx6PKLs z%Ff71NV4-{q_~%N16reO7@#7($-kWyG_6dKY+U{c8g_*#(g#{O-P*HbpY=$nq&?1( zoIvgys4{)&=61+2`Qj%wj933bgB0mUf3&kYV~U;-mu`k{jX0kBWhYA7V9@krJF6#k zXm2%j7Rq?x>pM`I4N+|aXmoqbN@4}!xy@rJPxv5Vl-J(s7~(H?3Gduy+ECRp5O(&U zNr6@ey4=R{cSamBY4iu!&RurShaE(90$+ETgUG_nJh-<9HzMLN2}ha`qe`?EFF3Dl!7K^KB?A zAtNUnOaJ8b#4KLB*patUQpPn9ErGy}>`%H(^49Eev{64hMC`CrXLQXu!!mO0!%rtDe+V(|Dd~SkRQxtcE zid{!v23f&#!bLNu*K%m_j8Ov}IW0RgImLvtM7uM858pLq%t6{$!hd7M@d z{(y;Q+IqnHOi*Nkw_|e>vGjDgeHP?JGG2H{@fxB3jVg8{edV+|%&HL077$JsT_!3r z5t?~OWf{$BakKNNYPqrKUiNZz^6XY_zA^Ue1+<@)U_@v|mD~&H;L+lhuy?>|`|w zi4x!z0KWp*HC44nL2DOE>ud#uUavVL{DkS1Yazi&^8P55m`2H+tuSZFVS{W3!rN`B z(-fIb7dzuQ`Qgr1lYj_`6An9`D=nK2j-Kjl1@|1E8HdLmJP|II`Z&9Mg!=B7p~_}b zUzgR}>0f2)qD0RMi~% z)n)Z@mVaq#8xG_kkY{Hr5=|pRtloJW1=$Pa4S71)D4)sZxxYC^2wU_p4- zY#gu-^HlEw3hjcaS>Z|3sO7lK{#i6%5q^xs7B6$>a?OiVa;-~;)vAvf7Wc&gZ zTSP_B>@51)Xub=Y{{r&94-!KsyI@LHBmKwSODIPcs+L&l)D;;jQjoR{kS<_P{31o- zXkk~Ri+n+NgOKk7@5U+;PrJI}R^gCX;_dhxl*4g~B+!YjJVg*kghESyXc-l+NFsIY zX1S)9NGxr`<$5S-35vKO#@)0Wdy80jy4;C!t1Xc}_!a{GD4s+WT1-Xw%i{r|;>-=W z%==gQZXon(H!G-qE-sm;LrJLM5fsipajB^>S#CEvCC0tNZMKYRC4k??^&*rtiw8TF zfakoLjQ`?U4$HZhWMCk4Bo=cR!349CYF(psMoe}$uE{w=p$wW`$(pHq0 zd_+=ceRpiahKd)I#w`ynp#68!}q z#6yn($*Y!5=bZ_@*)B>^ElW`|_eXqYa#~h)M!GvD9!zw)CggZR zo)DLok%M6+p;Fz(3@X0O^1#{yk;dLW%%Ukhtxi!%|7z5zG*z4JRhyB%EZKfD!uCVB zL|_S2@&Ksx5y_!fds-c*xa6jM0GHWVPr7Pd2CV`3Eg>f}%N>)kI404Zg_VTaKMxag zyiwOG1A=s}rxhCDIAzBFNyt9K#lF-l)au_>YWo?#a=MH6uuw{<)i0o2F4f@Y=TU-} z@}+&D)}R2tgGOI1elA6+urK`*YV`;xkeM>ymbe=WGFfUsFRSzT3JJ*P@G}QNSQaj! zMLaBS#eX@>6WwVU=}F#6Or-Pz?-Xo7Im8mQwU^}za3vTMxPy5Ab73}LI?R{yW6dQF zk^50Hia)VQrv62 zsyS?5dZIV#3XRjccpN4zXQ{7yTYUoj#SC^3FX{iXFLmx?bqy$AV5D~AXKq(fE=$en zgYA2d)Ww~_8^}Xe@TGhESk8b#@kSATz8B>~`%+mSt5@52qwiz<%1)12$wGfY->iZ~ z<`OS0xVlC+B+gt?yQ(4SEpbOiHjF;ksTg%n+k2Qw-`XEkKa6*aVy-JG4Xg3m=%-4_f&J!k^p%c z2s`prGap%^n*LTNr=PU+D6VrZ%fCa_7gC=AR_B?q(jOn-GCMrvPDLJo1w84omxVF^ zSQc)S5yXR-4S(B5>_OTw!0Ip~P$Hi_#yv6rF4epZnmInQlCjP84?jnV6pvbt&0l?_ zwo{WZ%Q>?~Vv{q)CX~&qRq;b!le3c(QdZ#oA>K(dQC})z-jUsPjf(A{o5QT&sbx|* z`}97PG9QFrCF2ZsMm$xFq=xvNJ#mwuS9X+*T@o=cL_Md&%RrA?12t;_i{Yf<}tG*Guge^ zj-riRb098ph;Zs^e2>?!jlvbyDMOf$%P1$f02Be7ed zB2PkuyB717%(T>uOl;N1#Up>3DG2X)<>6{ju}bU}iENLw&X%ZXVCtyuhaF;g;{lb( zyRr`=Jn@u%G*!$sZx=l5k7rQzFqL~st6&fCyHlQwWJFt5|C{i?j_@<4hV!W5Q`E5K z8TI$msGt!GWM*V%;Pvg>6MbIarrv|BCV3@5`1MS_>0o+>Xu<>Z?6?H%iP`q#rW*B^ z;c5&5HfZRjz7@^d&b}3dHjBqE)KEUI16Pi^)+ndh4tmK!44MV z>h@E}P%AL6@U*F62wb`tNP`24ya1FFJl7BwHZUd;{jr!|5{s3lw1&`p2&KHGLN7uH zF(X2QV%({=NP&n#7V~#DWhA5g zDlksyn)j9Je)k``!+CPD!W%B3-y4Swg4{{yUS6eg2dVi8>cY1#-p zjEMctAcIBAm{W=zqO~LN8jYXyZzCY=)2`nua+r>cu$-yYg8YH_ssQrW4~iV|X~V!_ zgJPCvWF&gq5Gj4ZZQ#-U-f5NN(aqU2i%)roai`~`;f7KzuZuQ#4_c2=nuX^>rE5$R zcs_F%%HFes9Y=AQ6}(T6TG+;|JYrW zR<{{}a-)0(m;XYAljz8-%``5Sh0GZKPkuPZfNF)_cy0MX8=V*vBxrriQ(#4Th z_ij<5r2v<|XDv+?Ie}&b<2U*$$qHP=mRE|yt3WqF8PQDXuR!xcWuS5A40om*Z`;jI z&hqYX6pJ-aLGV1l>zk|a*Hm&H+JpzB_QY!$kWYbxwNRvrE?kFjPZARtsRYufr6MP( z=O{cEEQuD5#5i4bHpkZ*zHc2eXgn8g!>fddB(MK6tB9+!e=PcwMy6ed=S zWHlsPq0H~Bl0Vai>#c9Si6Bxs8?_ zApA)7+AfOxMpMS(PEaNLXxTt`fOYJu$R#QqYdNF+Z!%hL0mAZ6FG z9=&mc)wNTkIC~YYe+e}c`YKbW-u>gz)@pIb9w4 z>d_tJky$In9X|qLr}__2q&~el9`~GFsfcG&e8UY4Q=|c19*-c*7jroX?IbWzk%lxZ z5*3w8t7o9q*8poUNRdXA4P<_)Xi385V=y;jup)k#LIvTsL4(5vqHD&bCgQ7>gd`UZ zyNWZr&NU*P4C&(_TMtp`##F;LgiCll3WV=8-}@jwL((;23(vp&I#LzC0 zzPSPBz5#Rhj!-TBw3m@8sc1ZqH-V&BinO91Z^Tr#Oe%^4!aKKpuTi8m4V;J;)e7RR zsLr*Dw4tRF5&B8u7p|xbTFQKow)E6Qw5V#K8GK$X`6E?J0G;ECs^s3e2wHescGPu> zw4=V0tS)(xYyPRF$tXp5DaUh@L4${IoLtY(CtMkeF_!iDMA2#^zX?@b0DH(so;M#% zoDCTa`5RK*ZoJ0icFjn@ti{X$^F*AVj&iPiF+!{F0C7%)sD2p4=imhg*DQRmAaA>u z-~CU^?;Wk8yuR&di`tXJ3HDaFU3ZjsE4;>TIP@<@)t`W!JVxa^QpzOUGOE{_DtJl4 zGnlT|D-uk5Cn1p*78v9pF8>ZK!^SG&q-xgU5<_{O$y22P;}q#cy(Z(;$FjSOmJmr} zK{qJUnKCBh;ds-$vjd-3%^Co`DaR`A|Z5Xvehs6h*8oW1ix=G zdx8>OC}Ijs3BSi6Er7HJl5(RWU1>EV1yavNT&|CD>qJGm(NRYHC9J${zHO2s-Kq6d zyf_doZh0CScs`UmS&<$zcd8ZY43p>x0rD7-s40r{q#aYO{?4Ss#@t(haHhKCgM`v) zM*QC~$c;eCfE<~sT6)otDA*Dzy?6W@h>fJ%~50^T{9iF)JjhuhK4#Q??fvy zh*nNVA61CCyK(t9_~qTXiVUVVrXv_ON>9HGgj@9LJVl03gBj=mKe2_i{0c3v&sSt9 zO`2i#>gkcdJOZR4%5w`88HVv50_dJm9qf$U!dgqqE?oOyoLMtW0IJj_A`g)u{}ZbOg2zwLd?YK>oI(?5>&u~0Phek$D^~1^qA}w9&C2|0 zuDFc<uLCGAQc-7G8=XA9kKbXij1Y4*~sWo>kRTRF0VnU^g+haGqbI3 z(>HE1NFucGf-`27YPkUwa!0e(eA6^v{qY{=cSdL$guVqZGEarZQ_ne^K<+ijyFhrY z>&jOolH7A(ou9Pv10WpIO>R?U0_~cE31q0WF$TyNKpNhz$c^;n9L_O<@brRbhbMiI ziPSL~6*)F*8`)FO-Jx10(VS@Hm@@IyN@(Hf|EfC`nas8X(7tG^v9ngVD`5BmK;m7> zO`(sXt*)|=Yyg(`MVv(<`Bg-3biCmtPVf6(We&RZUEYqiAlhah&M{OBVYMU&^E zwUOdhx7c~_8dW}x*3Gq?vuh;|xux4tvI`WMj{5Nk$fy3yxU1ENORsvX_g|}mGw8}( zc+w@&G6j0lVZzfs$V|Fs9;SO?(tMsl?MHFmqgrNB?mRRiTC^O(Wqw`Zm=7|WUYv*U ziICXnjY=5vtWzy`#cm!Zu%+UPy2ug(fQ?wMNHm4dN4CxtEjw|!HA>RGip-@|^Rf9; zDB)9%%e>pMa)ToC=-_-L^b*m+%jic?;x;NWpIR)yox@*jxgA>gj@odOA`5870!*gM zrO|vB<3+|5A7mkIU4Xk-xWwr=cy}DIbDLGmBKmj%7UUj5ZpLNa!5z3okr?W{5MSIR zNe8@#%j{jpRz+f=xgR~V&8lnXVp4kSG zYKv#0JGmBF&0X&(mJ4iCp<)TBv@=)Q$v!fn7`G`9j#w#;A5=7v)-6KsS4tB;1jiXL z*#~jc;YG*{RdTZn2J$kHS=&_0VrmeBFsqSHX$9mUke1sOSwdrD@Y-|!+s5oZKwbm# zi4T%Q8)LB7Qy`;a5|D3z-1m@bNv1+7*k%d)a;eM2dWnH2N;q3JEC?q$%uq3YCr8rCQR_ z8U1NRoYlodK;c27j!%f=iRXDAHiL5FtU=Dua)bB-;l90TkE-)9(t|^wS%}AnTLJEy zhm~83YF%7yXFCR>U?GUBF);s8MKftmJe(S~#nc)J?kLb#e2^^K8joyLEA1R1$ePDg zOE!HNj~FPH@xt4`JRoKiE0RP02^e)%f_M{_>v2VvQB(qQTA)<)J~VJj{n!UtPU{n3 zZtWstt`}MQglfrUEdf-OfDce&GlfIe;`?IrCzV@4euF_G zkdzz9OnK3F48Q1$JBXjZ5oOK%63&Ias{LllPlTZnf^bgc{h_t{6uE_7PlVI*TNo|g z{CwL}irh+nCE|lv*J*?N0S#p+ou39m{oPiN$f_UAr9#~3rZm9TA};alhNmuh_%F}0 zaPo*f%i3!uWR@G#B|Hr1w_nkG+U~YOq8u_2{Tco`43j^5Uy<9Ojh{MuR;1w}nVuXY zBbE~y@AmDfP?6iI`C`1s5+z!Z$sOl0CtmiUB6mP*3yASUXH{Ax67w-3dJzL5;e<-u zNx6$LGApIu_^^21pbPp&k-O;C#aMY2G&8;#j5;`K3%^xlHPv4NE#<8Y!kffBfP8pL zku?;#1b3UN)&^;bsqtxGm%dY^fY##=&Nu_56a3)qJAqVHE3%f3Ejg#D(Yhqug`=fKI2RV@ zxnt1RD6*c8C2>*{zjQ;qoB?v_q9XTFyJXDJN+l?VL(5hmCx2FC1Ixkb_e7ho>u zvSq(2vXLH0#z-!gZX_W5`u@+qDYA(^Nk*y;7w=v{MKwSs)+(}@y50m^Dq0%XgR7s;hNSR{RJ{8*TC@O2U|mIsR;Iw*YN?1%-i!y5T~CohdL;!NP%Mp( zfGzy7_b2rgd4R5@@ETh}>J)nVH6RxnD)JzWN(GW62v@`*^<-m3wox7<8wGg;eu;*b zmQ5AePH&`Qz7-|G@D#N0cHffbiabOO(-7XJqGh`T!#gb$*+Jvda8`vV2|_(BQO`Vo zC3e#4G{k~OzQPGdo8Ln{$*mPBqPNnlkl-_>pXWkJIFt-)tHiGR(=nhUB`W!3Nvby}h38R&laJL33vWHfuV?fu4mb$QnmyWM@RODegl8zRa)EF(iP~Hn9 z)2YZK)FcCb3zP7FAC)8n>C{<~M`>CH9#V!%;8p?QH)7Vf6nTtxX29H7spxMY8-Sb% zQKXnoWWbgPY0)s)!V`iOT@`tpf<1^Qhs4tx@XJd0Ot%mmVDtRgQ^eir-^C|c&BMf_%Q<~T)O zq&Kr*OZhpYe3M6l`BCpVEj6{o;T4<>Pa!r&XuhNxlgw#es_(?hMT6UbF$ZIqv2Z%!| z@*)FfD)Ktrm4j~dzs1;cUbI|4OOZF|5VQnDtTG5|X^o2J%mzX`m*bCl&Eguf;(8Vib9o9$OCY7mMFG z`*U(BiB;qvo#u+F1X%)G{sht{UXgO@my1_@18*~ac|vSynW)Gi{N}>c%>Gk0|Lai> zromC7qZo0p15HkLtB%9a(aA^0zaHo0@$($0C=eBw(B98rX`>`naRe&(k&M@je?QV; z3oe>gYylbz@v3AMKZ@TvtN1@3>-2QH?B_br5iZVZjlq|LRz#$zj`zrui|v50+f6m| zF=724YWJrp@;<$siwG&a)gTjr@YdwErHXt&byfgL5-qE+Vd@7YKSz-Yid=z;YQ-H~ z5o;;PRpdk3yaGEZ)e<4I#g?>N6gfs;tiaSNQsV4$IQ12HWk$XtA5rK^tjH_9!ve?~ zKw8|c$Z^VMq(-zH2l5h-_wG>SV=7yT=Okrf?)yM^tA6!eihM#%Z^nHtTgjnRK zh%eo%$mbMz3leeu9j1$pLd!MK^5G^$zMxn}N(IS>DbE6FwndRIsrVM2LmD1)Am@);(i5-fZq}p3?Q;rlZtw>0)-HLomYZ!?XBpyg-Aa^{X$SL|{71|uQ(wG~CivETzyNeb1j)L-FOTJH|p950# zgd*S5ygZ&|=Nc_tF+t!bG&A-p@&gs+!7qVwQyzhe`02;mrxmHDuk$eDER;sS0oUZ2;uE>wH?Ka%~%cRjyOXXcLZuql_PmU_`Gu?eVd=(}cCk`=G4dj*& z6#0dY-i}sQNJUd&-wi+#k12wesqTO~L&XujG0ZOkdE&StztO}y5Q$L|i94a?10cIT zRpb(FxWj6fS0t0EHy^^d!d=Sqxgxc21V1~Nk&}i`5GUi42b|tIGb2Ne%ayok3Sabr z@>##Ds2h=0F%Z6U4!gPJJ=r9K>X814s7dthMxVWt3G`!n`{;v_A^Spl%L{|4w{BOE&rxl!+B%S*M zHhNZ~zEiywxdM&6eH6DeCk|gjdEc@wl~x{u%lO-(MZ;BuTZ0WC?`O&QI+;JqhbfiW z#x;=>uwr7RmMzrCHoZ=L+IW{0G$nVrfgTOULJ>cQv(o6F4gWBF zeGZmHPgA~LeX707a&>Y^V&XqAu?s#JJ5!nZ^=a5@DvSz9$dvDv;zW7P+p#+LJc9rZ$jH=W5%Rq#N+7cZ2J)98c94wF!upSy&XNw z(Zt(@jp|d?YP`emCw`a&n^OTToTsY&pqhufQN1(=U#a2yH#__aWc=_~_j4h3XugUy zu1{0f@aGD`420@^V7e?+hQD%9tFv+3nf(SI99`n=7-;65;tv+7R8vUV9g~%X6BqH0 zCiuu-Ovkhyh;)IA<6?!c&rwb1V9A79v4l^B9u2*3rmD{7_zigihuz{+D(EYgj&6&s z-DSuQbu*N0K~oFRuu^d>=avGPn46Nxn6$gl`E|vfT^ANE^0}Rm|iQUzugyeB*f{LtGpst zuCylSTD*KvBxA!LeZo6;8`mnr51wq(Gx3Z$DaO1~z%KEZ_VVs5uYbDVqe8qJ#^0To z<8AR-uzYv2QOxH*YcU2*{^4Ghahv=RfFC)3#OLr4M|N|ogkJ}ve#50+o3svo9%Aq% z_^{N*0|k$OIg=pLd9&i}sngwPYPAGX3e1~|(Ux+bB7Bo=i&_%mJlV<1ka2J#gZ-H# zT3aq1wGFD@g6fwGRSrj<+Z|;e$s}JW<%`$1faT|nw?1g|L+o@D1OfDf17EFWCMU2n zT@tU~;TFeVXDr*M>O0bfyR8m+q03B2C*X1jwBE2okzlXo=FoI^E)Ma{PR41wP#r1# zbP_U+P?qdeIVa>e7vfl_bVQ`Lv0-BTA~d!fBI!lL9K*diqLbJ7t1lZANtO=-ejNC) z-C9FudhH$zj#x4NMI_aG(10cnE8>Dej}qI!@k!N;zY}Wv zB+;GiPRNc~g3o){jpfqF_ksU}iu>(Tk!}#-a5o1M$Jm*XWh%svFJc&T$aj9q$k<0H zcc;H$%Jc{c$j|Zqaw~Y}?q^kR56IY_u@A|`t=>K)7mBN-jd#EWe<6yuy`(}tDP_Io zoECVO371kRC<9XXh9da0l)m`65@$`JEcGzs;(zJ`+@k$spdVW>{e~i}l2+lUP z-+GQoN%!8-99@h@W}|-?d-zWk8%P-&FxL#-YAQdAkmHrcamVnhlP&(jj7P40WP$(dkr z+%lYpfmUVYq;jM3#mF&eb$|5Dn06|2ExiJ@v!bNkji7>`qk1|jG7`VBzZR#i;1rpF z(wmsIvTJUA4L|3>K&Lhe1O_LofR2HOE#n3CDLwwV*40s zAJtuv2-*cC&m$F$L6!;y_I(dUM#DgkttB`CRzFA%l+hF09M3qJ=&cfC@Ne!)-%mjO zB^Hmu#yx1t=KjiGPb2TcTCh~2iX-6y>>N5!k+GC_AI``3lcw-Zk@pk24pwBG)av`4 za*|lt91i49#6yNEe*<`K*FV1y4wK&820Qyh;@EJN7|%(EGgMLzzCPr>FBSdAK+b_Z z4om4sny>}?ST)kBQIO?U&ACRA3AAntmaj!l6T8QNbc3dGBNe%kj&9)%GwC2+Bi{}! z$)gmRNKLj{on}{cG+OS07T(`D8==S~{Kl`IC8yzg_hlTs-cuCOh-z`F6Z4j_==?v% zsNiH;wbkk{w@jj}74!~7_1E2?$Q0=24|LM7Y<0WLBobe`@if?8mAGU~^+itW3-uY} zRdy=XY{iFnv7L?Sc?iE2K(^heNEG$FAKw>L2+|P!@&hb*e6k|bU;$4U(pF^gQWBpA zAZJcBCkw>m~8 ziQadi_Y+tYFkAJ`gdC^u3=c2jbJFGRlq(s34OG_P^4a++GK;PuY$8S;GWnWgZwWm8 z#R5fUQ$AS%lcFU&({S&rkBY{`C^85C=3AmCE;TOEtd$&6=~{GcEi~Scpm;Q$B%GJ+ zlI9+PUHoF@b&D053ythp`{Y>rZ`LFy#MwzNRJ!9Nh*&5dxkRPr;Wu`Gk-EA-s1?%* zmwB4~P%?|4$Jwv*X;mQt!CwZ;a{T-b)W)W$+6A<~&~oJ!O3n3=VR#MOJzbH7P|aQH zdngTuL4hQndT_%k$Shr|GK(OC+8my&WJYVmV_yMv0sS#s(HNjK^8qVhW?5Ggu#Y19 zH9&4@nX6PRD4r_W%V#%U(ay+9n7Cjv|XiQarD{)XkL_P4u^{FsJ~CX zBJt1+v+!~ZpBuy0mTWN*bEoug)E!DEh#i@6p5(-sGIt!;~K;K{YDx55^ zeIO9Sg%aAg^}$UKBO`T_!Z(R8vwB>ed524sya>IkVaSu)6;Gkpw_$NnD=p?-=$F|k zI}}NUM!xH1Wn?DcduqFXDy4ryaiif!17~+Cp9Y?{`?5SS|2`%Vwnqh+P#KC^4uC4# z14(ZdN~hTER=_lmwC^l5g~90CA6D%d_>G4GYrlFpAoNzr9gFuQ10eJ4qblQ}ceh(1 z(Ut8?)iY3aIaC}hR%9vE@+)vq8}G)vE)jom1*dn}hv`9ketRSO1+ZSwzTt5d&7@He z;ke>rxlO$Uq&bk%Cl$$}oQH6;E0DI|3LArgyt7Y{YJFwNPSE^r`pKsi$)Sr6 zSkjO8mkV+LLz7Qnd(#J5Nym3!E4xhG zQ;IP#6Uf9@Rm;s3xD#2#Ax`#(2e+fLov$l$3vA@1j<(z9>0vP^cT1PlJspZ4hvI9> zRO(hpNj&K(d}xxNWOc5|A2O#7K*k%VtLTlL{9V0R6A!(6!Tj>J>dm9yc3Pe1MoQr9 z$HMR+21?OEMeo9+iN(G z+ul=z589BHEyl#&9Da?KMQk&ef)0_s6%S;HCNxFS4L<5?LRhCkPwinA%b=Tf5jia;aClX`wcnpvrWt05?<vKf-HxRn}vr?;hF~%7=1iVRsXI!_e(r;ex*P z6xm9p4`a0v-P0fwpT% z^)Sd_+%?w#Th~~TLi}4stDbeoQ6;0b0IiCJ+BPjz<^kIF2m;!5*bL}F=ve;jEz4h# z2dU~2JRI?anwlR$5B`GAeY%Yz{9zq0)X}m3JgE+~C-pXRAES1@@9havx$QLdQB0O< zWG1u*a|C|Qax_?xhp6CD%Q>q^v|I-bJTQ;D6xjh0Og4Q^fkU-L51JOeI0UmH=nd+k z0y`nVS(AcC;8d#$=}~?qnGgF~+h55d8t@o4b;_kjV~~QI04W@($Sx?e?-}-a>Nw%Z z{OL595GsljA=L^}yN9UMZb;cFK%~rHP=ipu#K33>u{F;P57&L%Jyh|S6*MD4f?z3_ zMqmzDs`%l5njkUc?P5!L+a2-m3o9m7Gu6yB8s_kw)j|tB9B6`9bLv^L@$nM zhuV!2T_KQZ3Yl-OSDDBDDP#VO8e~djI@tp<%^-8(23ux?z1}H?5U-K4mL+E{PIvR4 zUEq3hr9-bkrVnKPn4tAMPR$?3t80~_wz?N?(1_&jlNEV_Mn8@zR;={N5X8|$#8K=V zMV_SPkK?dpiF4lX;Q{_+v=V!zJ#vmY5{LP`AxV5t39Y-K_5JxOvkx*n_w_wctW@|j z;A6pi7Al|j6a+XlvNP~E5`DM$tEG3UAvGUT6^m5rX|GUbvd3fRH2#ZY>^2b!fzT`n z^@&xX5(puUIkGb|OketKk8?}{Xdh8H7XMFvoYK#L=6>NtTMQ?dID03$O4`y7IiWj5 z-cC@FXQ}E5D=4H=2Jdi8H{H;3+O5cQ_;)b%?Sf5qSX(MF+7;QP5?7|&q~!DXHxD#( zl6#EzBzH(Tq|2PBelptFBSWS3LkiViJ-rcl7+T4VTs9t0-4N1Q9vdHON8by|Uwzyy z{7F0>_aOQ{&R6v>(%C1m_^A>LhC=T=STJs_BBjvC14lkfUYwDTV?Q=7mw+xu7epe^ zcHXTryaM31icAuoQ^`7cqoktSP*VU_TM_S$=x+1@vlr8z52;q7(DqEJqYp_YVBz`+r`P zD`zt^b8sH0joW9@qU_Gh4}8d9$A#rhf<<{I%}? z$(Ms~m&pMfZ1xIh96XTe7+aJ0AD)1tqaE*qs6gRPF`mf%FDUl~tNQ@|weJu< zuP8Z2{b%#uqva)5=Lto)gyHGP|IU$0?cU&Ws)c6yafm;aZP~=9ESi8`)rS? z+&+FG6b55pIr4C&7XQ!cM^xZr2=HRVdq}d6SeV>3nj$S6900jh#VW_v)lKM9Jgq~^ bNd@j(Mx1)|s}Bdx96h#UHeN*QQpfRsKu=%i delta 60927 zcmW*SQ*fY7vjE`Owr$(?#2{alaqY` zx^r+28rTe~vzM{42TGLDb_{CPrn3hs3z;E!0}30#cmnzj>>Kzuh;NYJpuRzWgZcKq zJ#gRPzae}>{D$-m`5VeN)Ng3t(7$1P!~BNz4f`9;H{5S{-|)W?d?Wlu^o{r%$v4t( zWZ%fYQGBEPM)i&Q8_hS`Z*<@2zcGAc{KnMAc*0CV50q-`C~e4~1k^8nnGlJJK^KN4 z`??Z>YobFRjpklgO{~|9&cOL{w{;<9h(9{^t+gy$t*9rO$!_Q`?_fDxS{Z5(`Ui+U+mrh|&N(_5DC>4AA zWiFT%8n9{`CNEyf5o|CooO*Z)TLadrNe13zG0{>56Kbq2NnEwei1B5yR5iS_r+K%| zV=beO1*eb?g%c|F&`Cx{=BUT(jH!a#oAon#Vdd9Z3;?Dy$Rw&AVi6$K7v!wh^xvk) z&x&e;h}o|5kVLE&w}du(LNxv2?bTB3vR1|uN1!B~M($j}el2fv2R>9jQ)8Sf)0@dM zU@typp)_sV%XidXTm`IU8o6b_9A+GFs%pqCzK z(Ev-kX;~N!9TR31w5j71<4mZOIj{NQKRK$8vB(3*IvM2&2U7|F?& zX`*!;-4jQ2r!Qix%t`!qZA(&ZLo_)f2NWMXipLAg%t$_G1xfmRFZ8Lc15)GuiJ@~e zvX%z7{Ln3S^;uj!UzdNqPc=~9tfvKPBgAE$@cwZGGkve=6oC_%)*agUis_~ZnIiWtLdHjaTU zcOI4hbkG2D0AtB?DW>RBb#JhAYEso?pK`pPQs2dWXWU#Ts0w0|1_~ z<&Z-3ogt>4!m|B7|H87nomvUPVtvDQu3qnuc$@{u*J_dJ#b$H*#qi~^3_F6pHaSn^ z=ljq*ikt*K^0khht=5@z(6>9-(#kgh(eVsz*qMnQh5?rD1Sw}61ich5VnORP_70=D zA#*=`ifu=sFB#moa~A$K5*;wkTi`l~RPx-i37?0{DxaY>NM1C^4IY;Cv$B!j(-RDS z|MfH6lgVb|Xi3QsM=76A+cp#nO+ofK*Z0QIfLPQN64)%^)sO^#VjxDcsiIoiYMUWQUj(<^r)t)Tm9 zcec?L@Jz421ZQ!)u9wOnF5G?b9Dy#>*m6SO+`pMZU?Sxsu6JLE-2sG(;X=~WdQF^` z9{z|=lp1TN##mVFf(Fy%AgH z;}uuo^KaN+_!m*oElZ_$7cG*|AecxXO;^&Y@{8+M3;k=m@tjFyqnwP7kqjgOjsDGb z;=;7^G82~Lb8}4GJ?^yWPfVb2H)$$4yjLq|+oDTolXe>| z7TzXinY6nD?p+Q@Q2&vwzU*j_jd~MfQg#2rCme&Ge(UAVRd_chk{?Z(-1C~xR_d9V zMXuAUb)c)o9H>=PyUh3SDO%d!8P=$48idnrp0;j9-f01wxoKag;>k|!8}Z29+oXPBZpXwdLF zEtx8%f@K)cDz=o3)qE!5wZWPE;V2ob;apdf;@TCER-a}QGk<<5#b92w&xR@IT`c|! zE{)c;300DbEX;^J3OYK@?xB?K5p8t9d>(_08O@?0)*=-$w`^ZKEKJa*rQ2Rf1WgBy zoICC6&MZ9TLA%?Z(X_N+z_<%WiEK>Sv`I}016Bl}+Pc#g`)}xH7zcNibqe(ZCv4); z-~|6`rHp)UxCYU{_UQZY)P7g|+vO3$;h0oon3Kt zdH30@f0TKU7M!&!b@f*&3!{9_7)RMfHgqRteLBy5Gh*Aj*88B#hdfS+)hLTP1D7}L zp=}y~#Mie!daLjV&floB#4 zwi#kIV`x$YbJq@^AP-X^)QRD_-u)l$vLGCgPaQZYRCOyl+N4SnEvF%agom{(mJ>@; znC^hzxN{|4<<+8G80s8WcRQ2(nRu?J0qvK4R_X&5VFcpiiP3D%#1*f_DlUvHM{js# z=)4KSbam=J0RH>VfSj*EX_V#R7^kAuyTT%=BM;nr2 z7lH_M6cOA8^5WJ&XHDM0&`G+Warw1^JHV#e`#S-sx?t2AC?%k*UP_+g99Ua=*{0YT^bGM58?IV;b7 z7F?8hVgP;P3_j7DgO>4s`{XcUJ%A=H7#qj+a!rH^2u5L!DSa}OCM@AVq9O*^3!_f+ zganIaukKM94SQgENUbx4O@}hs{BkP2NCRU4Gpq=5w@xif=}h2k1qTIo2jLgMbtP%T zO7E8B^4kC85I^?ER@WrmSd4B6MM!!d9G3_D<`gF-it{D(F1}m?PnVj{J=75FNe`NY3m|u&)Z*M(5S6j*stfr?7-xQlVA))3!-oM!|5b z?JJiwfc|P6Dssaz=Cb96YoilpKzU;=iBagarx2Dt7``O&o%o5{UP<)=XC-Z7CJs$xQ>y27F3Xd051tIN3nuPBlynrbKv)q#pAfVI{=d zAzQRnnVYZr+`v@kHn5r%c&O2VYN3rU+(|C-EIda;@G4}BD8;P*XLxA%hpXF*{LC*r z_UKY&>EM^{%{f&ih%OUok#N7H$WiKfnd>?8a73pfH6l+qR`e;^Q7~pMRA|AYE4BN? zk|sMB9bKpayHJ}BKi5jFa)WXf6OXt0Kze^lf)8v5wcv&1iqk+SkeWH+lwXTRSH2r% zt!6={#c9s;%!Q>{*5Wc=srz3Ny@be`SaiNdh}V=@eqOKo`PFZ$!!K9OH(~X4_|nbAIdz-A zszwBS`|yj7a+vMGK;}Nq-Ruf3s#~@TUSk^i6$`Xb3R!jZyhS38v+llkX1mZ3R}r2{ z^h18O%B~a#0<|fB6-h|f{?7xLtWMn2t_lwkOVT)1k+M?vUr>xSgM@S78C~zu_i4YFM6C)Dm|kb*mz6|Azx%x%0uvwIrS zHn!u#X9*@q0ES(P6+!G*g;|oP8fk;`_#!2-R_Nqv>7dl!{poHMc}vM%Wp%Vo)ok|r zqgjRn0gjlZ;9s7PBk!1J=+6pn7$)NfW0qlN17PRWzaOu~53EUV7%h&(qwwK@G|M?u zl!+EW7O5z*U1-c6nGe+rt`QS4@38Dj_GT62wC-yaIA)>%$6Ib!T}%^QOzTWOk!Nt% zERv91)PNLBSN@W$-r(n5vUty==7kf5#Z)vf6!do$LH61WT-BqV4Wp|rbhoyk1f$?_ zdcgH?IXVCLdLqmW;#oXR4!jQUx*RHP`s7ZD7v}!Oex@S<3uk5$j9W^*af(w=G@z=y)DXy;FuBU z*T)6oxu&XWuJjFaH&86~D%lHnXsj-qRw9%y{1#VZiHbGDn8WDOAxq*@DFZF9XC`h3 z(u4^H?^6c4Vr&2|``E~>V)D-y6IC|i*X9Di(V9%*XJIzpjxd5e64DcLtbU!|((q@m ztdN7*)s~&}^7(PaExQDIEKzf3-4T{rj|8JH-SzW2(3T%K|3KB#Fk!3_9L`S2<57^0*%In)RQsk-I&sXSG4uFyEP2pv;qw7=u+7pf?7b0olU z@_q3C#0SrHcbHX?9U2-}FwDCoxckuKSkSStvG*nhu{BYJMauMGuIsSxL)P?G`FODv z=&3Wj+Am4+?a8X5VlrZ z{BaKBWOCf9P;pT0uSjm|*WeEwLcr|HVI~(+6x}Jqz~8K9nMGU*Gf$EIIj|xeFV1 zX(DSfJ*rBd=4=HISo5_LJaz+>eItJiZJ?p`r$#?s9tZOiDjs}-0Gpi5MP*`@=f67d zzON%Llrw;^wCKA53o#I=W4ZO5&!wl7rRTPH>Nk2Jk1%=rgg?o`GK6_QRl$7|YgN1r zuR5hXp60%DgPIcX!Fvn~=ls}^3f%7AmIc)RgK%{-KNn(p)#}jK7zS7vGd7S3%bO-= zZehjR3A_f53gElqt$LLBPgUi*77I_yym9@_C<0BRbX>Uxm5Q+u3{$iFrrE01pESgO zS#>>H5cPo5di2@uI$mztX^c5ZtJwqy9~tsFt?k=ZrbJB1GCMheeabrqoy9PH1}yvI zo(M^x*O!!<%8FVVj){n>t|;k63}l5E&x$Ire|Y)(Rb-N7)kSx-)gPF03k2WUN2b2e zYe;O{@Avdyc>lPGSaTw}d}Va{`~tzxPdjcyLuIYV1T+;KH+WEbuup-^oYoPnJFR7h zc;{RPF!O~1ht>#5RsOI9F2_j^mXAcfJ@tbne7bWj zKC?+qs`SxoQc}mCZT=tUf2$1>j(N*zx1wW#8vU}yBqmwwEVv8nyvQ7Il+d5y#Q}Yr zi{O)6z$=M1bSul!Ys04gc&57vYTXLu9z`kPID-*{0ezu+#Bx@n*|aM$*mX zwAItlBYwrn(Xr84>|$jspJ{}@Fb|#OLL5It{qsy?RG5zYNbotW69A66xzlKBH9L51 zy@Oo%ucN6psaKS2a@7s8$c$Y|N7d8Fgg-ADpNz0gt`l9x`9b7k2NEf8VNnKs zK+H#!$)xjdvChxnvR_sYDf_|<{<`#?v_%>%XMGw+u`_d0V{z0?Ezziv9VSV7XmIE? z@R%ELP!jLtVbg*4q)U?ejK!C{4^L9h6KqXr%L{KhuF&Jrr|Eieb z$mu|0cOWH@cLNUYqdp|TICGZFUD)qzftA#eY2a^|S6BV_1uLZxp4Sn*1ViW6JELUyNWljo0PP$w+IHY#7_ za&x_MOO>s%c{vfcEn6nPK}3rNh4dzujv8$- zPpO)pBEYnCe4v++>X30f2rqNxoSpDRq%AghEM@6A2}V{%JO^=~(|b1&Sefo|^f# z=mUmYpAA~l2p>Do4zEg!sySU96C|F`19phuc)bI_2;4j?WF9nT$MOg202}4C|ETqL zf1tcvV}+|U6$=?`d58D0>p!N}VN(PLYVZG?0&A8Btm;B%w+bMFF~LQ7KSI{%q*j%U|L z!c()7wTT)Z2I5MRE?9i6XWr8ZlGQ6wTL;|4Q1f+tf>ZEa^MPV1Ih zZnoiE=%PB}R?ClPk^aZ(xX|yf>#ytW3+r}UswG0b$4!k2|xE3sm=_ z$z!VaZr%cMO?SSug6u$&a4GMy0y#=4{5dAHI?8G;V zHps*H7B@O`aK2d?An7-)!;b+?9CT6`fl$h3zKy+gRk*d4#GdrrXvcJ=e^LoneMh51Tl#>5Q`r#?%0yEcOxJb}qxOh7%%V5a& zvKQm*&{`}*>UOmCD9p6j~1sgY86Yo%d(0ItWL= z+$u*QHbnpNfa8tA>Q}<9gSaoX;$LV`WyRc!#l%F_(gx}ZybHL(8=p;#1w1J<7ENIk zEqj`XfmYBez=q5gEfpRE^+!HNUWT+lb>e1w_3|`ygP`+Nb06Hcs|SskSbaU=2`>TQ z{b_K8k|)*b;(6Z{ak)2#1vym& zHf9P0dSKJebuUz;tuU8UWmrFbr9IB^<)4g$_{)xVFjsvmrfN8EKYeQ0tB+!Pu+hiV zNQ-MT0&l2Tm$R&o$k`i9-jwYON7IWY1_W)lx3#YVm+p%)e%RB&U)QKFbB9 zVinLp=fqqSai!{pn0c|3Ev%w~a#%9i@Wjm861sb!D+f{4b>u(8d46VSM9ZXVjtlVOX$R%5aO=7!O^&juueh182tjSudv(qYebl;zg#tdR5}%@@$9` zsTVV=Q?lrkM_DcGt43L>pkG4abdlC5a-1Su?Ew=Nt~lAojH&_3za|%1EcR;p_`w7% zdH^?Oo?4PX;_Yw3q|9l>Ak>F0rbTUGOx5YxNjY)*JwK&iAsb(8bbEDgA%e)xxKChu3+#R*KU(cQ<>ezpAzE#&g29+;l-+ZOt;1N0X2 z3e$b|UF@;2GtCez!B@kIvUge}o8zGAP?}-i?j_UvKHsVjjvzT=k8J%EhpJrMu~1$4 z9V$*p;IW25e=znu@?ufj$sDUsEV(a`qUbtn)+_QG?U#htfTWFqz-Ny}&`d4co?gjv zkEXY_LH9+QHF6{MJS9h)Z7T});9~tLjT~78u8xhlp^Iyg*aJpOCU~hr_ zQN+s0!4XgK0@XH%r2GWL4@f4n05`97i{wd%4Hgv1XQ+4N1r0q6g-5q!AB~c>oMu*< zOu+8@5_Iny_zq15b$uDbjm@7xHG&z#5v6CA(rO)i5g|!BJ3nSAo+Om~-->VhSAe)` za%IHAp%YY&_K>&pcCq?+EDo%Qc5CWHV&BybX5T)fhRRgsvWf%F%3pAq%p_Z&{`vLK z=k})|80`zlu`b-3cG%}UE< zra8P*)o2tu?U$I%dkI!_<}qIkQ>0+@6DYRA*b}(HkV@_GOkLOWkUit}K5i-Zss(&E z3Hvd@+@@9H{Ka@1sS}Z2vEE?QCl$W8*ZB-UbD1Xn1-_0C9^1MH zH+!wQ`k5#E-*2c|@E5$$aGI3xS~}8oNuLUB2j`lzA_z@}aL_YO3r61G?EsZLIw_(_ za3*9TuVrcr((laYjodgvHa>#lxN8st{Lb1ScNeeohGwY02c91)4=cdjyAc#Cj^v>+-lfS(%qhJBtH`$peFs2`wQ z-5~LbM^0j9|How{KoITp%mEBVYk;w>z@%QFaWy^bOR&Yw_9orh93`+xxrZ}FcTAyU z|I!?5M-$8K8mNN8pT(5!&pg1IkeG1AUpZ0lQHo`IUYBX+7hF-m5CDLw=(K@N<`kP~ zJ_Q~}Yu-|3Dc8~hRhQ1HYi4EIWr&9LyBelB4y+=~)?_P*90VaiBF_2j1l8(AX2ohQ zro1h z@wL($`_}$@@0s9<^VGr_&8`wp`eZI9?PzbN z_l0-j?2pP!K)lN*gDm{V^u;W*VFVEHLic!gH#x`J@Dh#g z5}QVR!In-|!>LWo;?LT`;tSKkPzK9?uHbB4%x+&djp~Sj5JLQ`!{oMIM-2UdNn}@Hv0i3E2GpLdSNDxMk}67sYM(-Gq$c~jtX$BtJuAQ0)%3LL+&MX zeK4X^I4Umq4O~Q?Hq56d z*q01{NHL&kj51R=T|m?P&zN=%Y}{yUY3p&Q{B1)iVeU$}+>=sMkns}T0fwKpUf9q- zAjj~A3fMj_UitfQIVuRUi~|YxS^DPkbnt849UNz11~0dld0D;9?~QQ@`Thm1Df0n0 zov4R%9^7g3h9y16LO2GDQ(d%w-4W~tMl1o0)RpG_*iRB^@~zOORpJJwbu&Y^2*vTD zqBeeeD~L&(ozb37HR}BRb4y&UQsz9p+;|bz9Dq`nc8gLom`C2OCP=gTSVV~SrW05; zE(&xM-sL*&l{D5g!uwS6kc_@Uvb=GmA5P3c8t3(xAjQM$gTc?;eMabmAtLqjd+)iz zY1WL}iSZ9z-&zp%gY_hAG{-$ur#vF&F>Av~_)%{bRXa~d@;j+U(%-gnWAZ1pcf_sh zJaD1!1D+~3f1&G@YX?dHn)J-l>gBdQyHe1F`2}I;7Mp7?JElGirytiZe|qcBxactw zSUw@!RL`*IAdK+_YKdA%A5DlXXEYc2t^)aYZ*3L~cjK>W2kS)N((C|Zt=N!qhU&IP za%h+Eo*PuDM0U~j+HZrU?Ll}#huVcgQ$TC`lgg>bW0c7^W^DkD*4`^te(NET0D20F~kdMxNK(c&Z=$ z4i_KMLLV8Lq|{U*WGh_o1@N*?(^7A^nlBPNOfQp;(o|4J`rlzl@BxmNpUJ;)9N^X5 z2%~^&EPXGDgoB%HsJ{)-486*0(O?(6Z=lA@N*Bv2Kf@3nxbbOr_i21FJ)v+jQq#u8 z=cEPIj98iQr1vg+%lmOkE&O211RqjMGm~-*nvd`K0G%}AH(o2?bHG(1-7v&+P<%1? z{$jC6+1ve-#Mjd;{JEwHS70Ns9>7Ks7F7RbL}l4uS8N$N2({6?Qi^Gx3B@BiYb>Cl zEv<)vuUB{k7X75Vkdqpn{ZCFl`tp=%dE;WM_uaOo^D5pTPa-q_BRJ_VBl@aM=p=cz zHC_aZyuSPug^`Oq3;23zqyN%726g>9yX1XY<`gZmZT{lh6W^ z1sw-jP{KVaK0`(zFr#VA+Bih$H5h9n7w6cXC~WU*sMYvj8ruJjw~3e?Mb*ZM zDctuj>p&$_f#1=Oxm9Mb{f^xHlCA~PW4v1SZpc>HL{x)#6Pa9}7OMWh>>qlY%E3|= zT3h$LYJeJYVVQOHOzs4sk$12BN?+**g|-<)-?KUC&kUlcSXT3KW;qo6@e(gl2|-7s z_#CKRxp=*+FM8!$l^&yf#0yXU?3Bm8?y3|_w=?L=iY9y4a9M2SiM8)O*yafQ98_u^ z?F?S;uP)mNt;0H=x=xtnlB1SFVrkL_ks9Q6-Kz_^4WYV*NKS`(=MZ`AukrpP%)f;k z4db2%?y`gN0JXdk6kbr-8p#cAoqDbRR2^^_WI^a5ze7f)&Qu=Zxn9OxEwM2} zPxFYCKS&o@hZq$kxjI;xZwUh`$4M0pw;!5PQtg>m$>4JNu>|ydx|B2-ndt# z&^z~w5{$zL+z{ZgD~p*6j$%iMZx?G{#7B({zG) zC&AD2>`rHTcSHyxv}^XhPnR=d?eT|CwF>`!JZZZt#u$|uUVe;_mh^U zyOeV~ckqNTa?mYZad=3Jm%C(T0UzzSky|{uvEYUc)=q(sE z;^*B8Xq&2KlOAYma%BGp-=^rt4u{kRAHz=J@?A|#Sm(po(mDsm>Lx+w<2Oo4!zIiJ zFsO%ot7*Xgpr8_@CKO`s_dVkUL#YuAhMQcv_RRQLxm*|ccu3^CBs$J8g+w)cbC3pe=o3>iWbDV}`9xb|ZHn9D&%^5r&& z2D+I*^KOu^)RVm}O0$1bafxY~dV{TF!%9_Cq$vd7WSn$h93u!bB`W4QPK}+wQz&e> z6u}=-$O$1R=ZdJNi!pst)+1BI#XS0J^enAW`uZD3mB+LsR{E_l1*R3!XpOV&M3s7g zcO%5OscH5{d4O`XlTGd_3Im#z9#sQ>0J5@VMwDmAaFe)Nn0HKQ)`@^qgLj5X-C^r~?St0E|v0%u5#vxoUSOTT1lxyqy$f4s8d?DjPi;L|{$yA_Y zC|189$Cn^q$koZ6!VsRqzX#B{j?cD=e{Szs(bQ8o^AygvfiHr%9VWjW7W@A*!gd(Z z9n<1k*DUz=>Xzv-(6bP_8{Yki=`qo>aArHK(+AsUstaUiU%6tsP&r$?P?`V^mk@5t zgT~y6W^uYOajr0Ntq`i*$e1*5*iVY)h_z60H;kN{NOfvRJOnt~`Q87;!(#@8_xmrw zzBIx7Ki8DE(V3_|d=?>c#$Ui@yo(>Oj`r7&Kia3ZW%jB9cBG!s#6Ne* zc~@c6i9jXpwO5h;S&BK-+rB8o4KE_JYxVAAcus{cX{bN@9z|wRl+TgL59}K5!B4}X z?)QiNgg~Pr#sl#6ponLa@LDMeDe-ZodX<6od>$5bqUPwv>@eG<%H}FFTevNzR>}iGbNBA>bG?T? zO@ZvD-6J8+Mq)LR!=?F6tCNby%?u!jV2b+Xqi$88_y{<27koJiJe@F<&7B@0bpJ<* z1@(y#%03#Tt04D>uO)RCH-R<8^Hh3j@8pp$O%3^h)|^;H*kuMKmq&5TIVJ9Y#PU($;kn)YWo2aLA6>Vbn#$*iZ#Ln@|CtCL1SMMhgdzYI#fVu&)urp% zA7YE;vPnkV|D6^O#Z{^<(~Quh_tQ5knvoIiFqnc6g69X z5x2ji`Pbg3s~*0hAMvhp?1+ZByf7|?XH7sglJ@EUepYAAodcOE#D~0vV#<@7XJqog z2i`U6-?2oJ3&)~L|DFt0-#Lku6|YI(oA3}Tj=Kqvw-t|=3iuK)erlg5>Uff9prg!# zpchnV7w%k%FrN8|^y?~dLn;XvuL(t46Pj_!AjcIa!t{K{N#lIh|n z0NLXQ`})iIxi{dco7w~3!(d^iD_pY7b_q7*RsgBzMeYgyF?qUAJ zs@{Tcro)p2PQN2Q3sFPrhQlOksiz1x9Tm&9**0FLl3B!zs)AeQAPO(+AXQG6BT5lh zdLtjq|4-fZHQkbj?Js6>{@`$Pqd%O!KKov(Vy=!kb|`dHhgd%_@4rH8@bDz}SBUZP zFMD)cf2{ytpFMP`^<6qtWOf}|jus@TVquS~WID4Sm+J15_*h9|Xk7(j$B&>7N zgI{7}W%R6biUU0m4V4&c`ciX>RHgtGWDCqgY`%}l?Gbhm!9$xG$mwkPLBZSOBs0W& zas7}ND?0R|)fd=z5mb7GjoJ7uRvrweP1d4U#*7s-^do9YFhDp(2jh1Y{P3EjSj;t$ zILQZxQAZc{G2+LxpxBlVM*op?X&+Uaw|d{I-<MAMN_y?Ek$zJRJ0WbEp

8-Ig2PC3kJxeN<8EQYQ@CrGm&SL=Bpn9@%&kG@ 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

j};t4ev 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 K58tGc?f(D-2GNxO From 962b1114a5f240500f8e78a75236e5aaf7c1c8f6 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Mar 2022 12:03:40 +0100 Subject: [PATCH 101/146] Update constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 83 ++++++++++--------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 8f8bc9688..0facae9bf 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -80,6 +80,7 @@ Illusion = 6 Necromancy = 7 Transmutation = 8 +Invocation = 9 #Added to handle Warlock Invocations # Spell School Subschools @@ -3396,34 +3397,35 @@ 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 +spell_eldritch_chain = 2303 +spell_eldritch_cone = 2304 +spell_eldritch_line = 2305 +spell_eldritch_doom = 2306 +spell_eldritch_glave = 2307 + # Warlock Eldritch Essence Invocations -spell_frightful_blast = 2301 -spell_sickening_blast = 2302 -spell_beshadowed_blast = 2303 -spell_brimstone_blast = 2304 -spell_hellrime_blast = 2305 -spell_bewitching_blast = 2306 -spell_noxious_blast = 2307 -spell_repelling_blast = 2308 -spell_vitriolic_blast = 2309 -spell_hindering_blast = 2310 -spell_utterdark_blast = 2311 -spell_binding_blast = 2312 -spell_penetrating_blast = 2313 +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_baneful_blast #spell_hammer_blast #spell_deteriorating_blast -#Warlock Blast Shape Invocations -spell_eldritch_spear = 2320 -spell_hideous_blow = 2321 -spell_eldritch_chain = 2322 -spell_eldritch_cone = 2323 -spell_eldritch_doom = 2324 -spell_eldritch_line = 2325 -#spell_eldritch_glave - -#Warlock Least Invocations +#Warlock Invocations spell_beguiling_influence = 2330 spell_breath_of_the_night = 2331 spell_dark_ones_own_luck = 2332 @@ -3432,38 +3434,40 @@ spell_miasmic_cloud = 2335 spell_see_the_unseen = 2336 spell_spiderwalk = 2337 +spell_soulreaving_aura = 2338 +spell_all_seeing_eyes = 2239 +spell_warlock_charm = 2340 +spell_curse_of_despair = 2341 +spell_fell_flight = 2342 +spell_flee_the_scence = 2343 +spell_the_dead_walk = 2344 +spell_voracious_dispelling = 2345 +spell_walk_unseen = 2346 +spell_cold_comfort = 2347 +spell_witchwood_step = 2348 +spell_dread_seizure = 2349 +spell_ignore_the_pyre = 2350 + +#Missing Warlock Least Invocations #spell_earthen_grasp //should be a normal spell!! #spell_summon_swarm #spell_baleful_utterance #spell_darkness #spell_devil's_sight -#spell_all_seeing_eyes #spell_call_of_the_beast #spell_otherwordly_whispers #spell_serpent's_tongue -#spell_soulreaving_aura #spell_swimming_the_styx -#Warlock Lesser Invocations -spell_warlock_charm = 0 -spell_curse_of_despair = 0 -spell_fell_flight = 0 -spell_flee_the_scence = 0 +#Missing Warlock Lesser Invocations #spell_hungry_darkness #spell_stony_grasp //should be a normal spell !! -spell_the_dead_walk = 0 #spell_voidsense -spell_voracious_dispelling = 0 -spell_walk_unseen = 0 #spell_wall_of_gloom -#spell_cold_comfort +#spell_relentless_dispelling #spell_crawling_eye // no!! #spell_disembodied_hand // no!! #spell_mask_of_flesh // no!! -#spell_relentless_dispelling -#spell_witchwood_step -#spell_dread_seizure -#spell_ignore_the_pyre #spell_weighty_utterance // no #Warlock Greater Invocations @@ -3495,7 +3499,6 @@ spell_grapple = 3110 spell_black_tentacle_grapple = 3111 spell_ki_blast = 3120 -spell_eldritch_blast = 3330 #Dragon Disciple Breath Weapons spell_dragon_diciple_cone_breath = 3231 @@ -3641,6 +3644,8 @@ 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 From 9f5725d904f6460b50d23c408ab8847b18a40951 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Mar 2022 12:04:18 +0100 Subject: [PATCH 102/146] Update spell_utils.py --- tpdatasrc/tpgamefiles/scr/spell_utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 77fcbc102..7cfb346e9 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -576,7 +576,11 @@ def applyDamageReduction(attachee, args, evt_obj): 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 From ebb7a6af305bfc62d453e6343b6d388bfb06d8ec Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Mar 2022 12:08:36 +0100 Subject: [PATCH 103/146] Warlock Progress Added Replace Invocation Added Eldritch Cone Added Eldritch Line Started on Invocation Charm --- .../tpgamefiles/mes/help/warlock_help.tab | 5 +- .../tpgamefiles/mes/spells/warlock_spell.mes | 16 ++-- .../warlock_spell_long_descriptions.mes | 24 ++++-- .../rules/char_class/class033_warlock.py | 79 +++++++++++++------ .../rules/spell_enums/warlock_spell_enum.mes | 22 +++--- .../rules/spells/2304 - Eldritch Cone.txt | 18 +++++ .../rules/spells/2305 - Eldritch Line.txt | 16 ++++ .../rules/spells/2340 - Warlock Charm.txt | 18 +++++ .../scr/Spell2304 - Eldritch Cone.py | 41 ++++++++++ .../scr/Spell2305 - Eldritch Line.py | 41 ++++++++++ .../scr/Spell2340 - Warlock Charm.py | 38 +++++++++ 11 files changed, 267 insertions(+), 51 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2304 - Eldritch Cone.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2305 - Eldritch Line.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2340 - Warlock Charm.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2304 - Eldritch Cone.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2305 - Eldritch Line.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2340 - Warlock Charm.py diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab index e2c28cbd1..a8fa3aa6f 100644 --- a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -13,7 +13,9 @@ TAG_SPELLS_BESHADOWING_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Beshadowing Blast TAG_SPELLS_BRIMSTONE_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Brimstone Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 3 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! TAG_SPELLS_HELLRIME_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Hellrime Blast ~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: Yes TBD! 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] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! -TAG_SPELLS_ELDRITCH_CHAIN TAG_SPELLS TAG_INVOCATION_LESSER Eldritch Spear ~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: Yes TBD! +TAG_SPELLS_ELDRITCH_CHAIN TAG_SPELLS TAG_INVOCATION_LESSER Eldritch Chain ~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: Yes TBD! +TAG_SPELLS_ELDRITCH_CONE TAG_SPELLS TAG_INVOCATION_GREATER Eldritch Cone ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 5 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This Blast Shape Invocation allows you to invoke your Eldritch Blast as a 30-foot cone. The Eldritch Cone deals the normal Eldritch Blast damage 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_LINE TAG_SPELLS TAG_INVOCATION_GREATER Eldritch Line ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 5 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This Blast Shape Invocation allows you to invoke your Eldritch Blast as a 60-foot line. The Eldritch Line deals the normal Eldritch Blast damage 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] 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_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. @@ -27,3 +29,4 @@ TAG_SPELLS_MIASMIC_CLOUD TAG_SPELLS TAG_INVOCATION_LEAST Miasmic Cloud ~Invocat 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/spells/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes index 80e75fafd..0509dc23b 100644 --- a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes @@ -7,9 +7,9 @@ {2301}{Eldritch Spear} {2302}{Hideous Blow} // not implemented {2303}{Eldritch Chain} -{2304}{Eldritch Cone} // not implemented -{2305}{Eldritch Doom} // not implemented -{2306}{Eldritch Line} // not implemented +{2305}{Eldritch Cone} +{2305}{Eldritch Line} +{2306}{Eldritch Doom} // not implemented {2307}{Eldritch Glave} // not implemented // Eldritch Essence Invocations @@ -41,7 +41,7 @@ {2337}{Spiderwalk} // not implemented {2338}{Soulreaving Aura} {2339}{All Seeing Eyes} -{2340}{Warlock Charm} +{2340}{Charm} {2341}{Curse of Despair} {2342}{Fell Flight} {2343}{Flee the Scence} @@ -58,9 +58,9 @@ {7301} Eldritch Spear {Transmutation Eldritch Spear} {7302} Hideous Blow {Transmutation Hideous Blow} {7303} Eldritch Chain {[Blast Shape] TBD!} -{7304} Eldritch Cone {[Blast Shape] TBD!} // not implemented -{7305} Eldritch Doom {[Blast Shape] TBD!} // not implemented -{7306} Eldritch Line {[Blast Shape] TBD!} // not implemented +{7304} Eldritch Cone {[Blast Shape] TBD!} +{7305} Eldritch Line {[Blast Shape] TBD!} +{7306} Eldritch Doom {[Blast Shape] TBD!} // not implemented {7307} Eldritch Glave {[Blast Shape] TBD!} // not implemented {7311} Frightful Blast {[Eldritch Essence] TBD!} {7312} Sickening Blast {[Eldritch Essence] TBD!} @@ -88,7 +88,7 @@ {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} Warlock Charm {[Invocation] TBD!} // not implemented +{7340} Charm {[Invocation] TBD!} // not implemented {7341} Curse of Despair {[Invocation] TBD!} {7342} Fell Flight {[Invocation] TBD!} // not implemented {7343} Flee the Scence {[Invocation] TBD!} diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes index 1c6486a77..43f176cc5 100644 --- a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes +++ b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes @@ -8,33 +8,47 @@ Target: One creature or object Duration: Instantaneous, Save: Fort half, SR: Yes} {7300} Eldritch Blast {Ranged touch attack that deals 1d6/two levels (max 9d6) damage. Can be modified by Eldritch Essence Invocations. -School: [Invocation] +School: [Invocation](Blast Shape) Casting: 1 action [S] Range: 60ft. Target: One creature Duration: Instantaneous, Save: None, SR: Yes} {7301} Eldritch Spear {Ranged touch attack that deals 1d6/two levels (max 9d6) damage. Can be modified by Eldritch Essence Invocations. -School: [Invocation] +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] +School: [Invocation](Blast Shape) Casting: 1 action [S] Range: Touch Target: One creature Duration: Instantaneous, Save: None, SR: Yes} {7303} Eldritch Chain {Eldritch Blast that deals full damage to the primary target and half damage to secondary targets. A missed ranged attack breaks the chain. -School: [Invocation] +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 for half damage. +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 for half damage. +School: [Invocation](Blast Shape) +Casting: 1 action [S] +Range: 60ft. +Area: 60-foot line +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. School: [Invocation](Eldritch Essence) Casting: Free Action [S] @@ -126,7 +140,7 @@ 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. +{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 diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py index 10fd87ff3..46a37603e 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py @@ -63,26 +63,26 @@ def GetClassHelpTopic(): bonus_feats =["Warlock Energy Resistance"] spells_per_day = { -1: (-1, 88, 88), -2: (-1, 88, 88), -3: (-1, 88, 88), -4: (-1, 88, 88), -5: (-1, 88, 88), -6: (-1, 88, 88, 88, 88), -7: (-1, 88, 88, 88, 88), -8: (-1, 88, 88, 88, 88), -9: (-1, 88, 88, 88, 88), -10: (-1, 88, 88, 88, 88), -11: (-1, 88, 88, 88, 88, 88, 88), -12: (-1, 88, 88, 88, 88, 88, 88), -13: (-1, 88, 88, 88, 88, 88, 88), -14: (-1, 88, 88, 88, 88, 88, 88), -15: (-1, 88, 88, 88, 88, 88, 88), -16: (-1, 88, 88, 88, 88, 88, 88, 88, 88, 88), -17: (-1, 88, 88, 88, 88, 88, 88, 88, 88, 88), -18: (-1, 88, 88, 88, 88, 88, 88, 88, 88, 88), -19: (-1, 88, 88, 88, 88, 88, 88, 88, 88, 88), -20: (-1, 88, 88, 88, 88, 88, 88, 88, 88, 88) +1: (-1, 969, 969), +2: (-1, 969, 969), +3: (-1, 969, 969), +4: (-1, 969, 969), +5: (-1, 969, 969), +6: (-1, 969, 969, 969, 969), +7: (-1, 969, 969, 969, 969), +8: (-1, 969, 969, 969, 969), +9: (-1, 969, 969, 969, 969), +10: (-1, 969, 969, 969, 969), +11: (-1, 969, 969, 969, 969, 969, 969), +12: (-1, 969, 969, 969, 969, 969, 969), +13: (-1, 969, 969, 969, 969, 969, 969), +14: (-1, 969, 969, 969, 969, 969, 969), +15: (-1, 969, 969, 969, 969, 969, 969), +16: (-1, 969, 969, 969, 969, 969, 969, 969, 969, 969), +17: (-1, 969, 969, 969, 969, 969, 969, 969, 969, 969), +18: (-1, 969, 969, 969, 969, 969, 969, 969, 969, 969), +19: (-1, 969, 969, 969, 969, 969, 969, 969, 969, 969), +20: (-1, 969, 969, 969, 969, 969, 969, 969, 969, 969) #lvl 0 1 2 3 4 5 6 7 8 9 } @@ -115,7 +115,7 @@ def GetSpellList(): return spell_list def GetSpellSourceType(): - return spell_source_type_arcane #spell_source_type_ability ?? + return spell_source_type_arcane def GetSpellReadyingType(): return spell_readying_innate @@ -183,6 +183,31 @@ def getMaxSpellLevel(newLevel): 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 :) + 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) @@ -198,15 +223,17 @@ def InitSpellSelection(obj, classLvlNew = -1, classLvlIncrement = 1): #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: - ebEnum = [] - eldritchBlast = char_editor.KnownSpellInfo(spell_eldritch_blast, 3, classEnum) - ebEnum.append(eldritchBlast) - char_editor.append_spell_enums(ebEnum) + 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): @@ -219,4 +246,4 @@ def LevelupCheckSpells(obj): 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 \ No newline at end of file + return 0 diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes index e76ad2ab8..0872bbcfd 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -5,9 +5,9 @@ {2301}{Eldritch Spear} {2302}{Hideous Blow} // not implemented {2303}{Eldritch Chain} -{2304}{Eldritch Cone} // not implemented -{2305}{Eldritch Doom} // not implemented -{2306}{Eldritch Line} // not implemented +{2304}{Eldritch Cone} +{2305}{Eldritch Line} +{2306}{Eldritch Doom} // not implemented {2307}{Eldritch Glave} // not implemented // Eldritch Essence Invocations @@ -39,7 +39,7 @@ {2337}{Spiderwalk} // not implemented {2338}{Soulreaving Aura} {2339}{All Seeing Eyes} -{2340}{Warlock Charm} +{2340}{Charm} {2341}{Curse of Despair} {2342}{Fell Flight} {2343}{Flee the Scence} @@ -55,9 +55,9 @@ {7301}{Eldritch Spear} {7302}{Hideous Blow} // not implemented {7303}{Eldritch Chain} -{7304}{Eldritch Cone} // not implemented -{7305}{Eldritch Doom} // not implemented -{7306}{Eldritch Line} // not implemented +{7304}{Eldritch Cone} +{7305}{Eldritch Line} +{7306}{Eldritch Doom} // not implemented {7307}{Eldritch Glave} // not implemented {7311}{Frightful Blast} {7312}{Sickening Blast} @@ -85,7 +85,7 @@ {7337}{Spiderwalk} // not implemented {7338}{Soulreaving Aura} {7339}{All Seeing Eyes} -{7340}{Warlock Charm} +{7340}{Charm} {7341}{Curse of Despair} {7342}{Fell Flight} {7343}{Flee the Scence} @@ -101,9 +101,9 @@ {22301}{TAG_SPELLS_ELDRITCH_SPEAR} {22302}{TAG_SPELLS_HIDEOUS_BLOW} // not implemented {22303}{TAG_SPELLS_ELDRITCH_CHAIN} -{22304}{TAG_SPELLS_ELDRITCH_CONE} // not implemented -{22305}{TAG_SPELLS_ELDRITCH_DOOM} // not implemented -{22306}{TAG_SPELLS_ELDRITCH_LINE} // not implemented +{22304}{TAG_SPELLS_ELDRITCH_CONE} +{22305}{TAG_SPELLS_ELDRITCH_LINE} +{22306}{TAG_SPELLS_ELDRITCH_DOOM} // not implemented {22307}{TAG_SPELLS_ELDRITCH_GLAVE} // not implemented {22311}{TAG_SPELLS_FRIGHTFUL_BLAST} {22312}{TAG_SPELLS_SICKENING_BLAST} 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..6cb71be59 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2304 - Eldritch Cone.txt @@ -0,0 +1,18 @@ +School: Evocation +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..4dc1c1856 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2305 - Eldritch Line.txt @@ -0,0 +1,16 @@ +School: Evocation +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/2340 - Warlock Charm.txt b/tpdatasrc/tpgamefiles/rules/spells/2340 - Warlock Charm.txt new file mode 100644 index 000000000..0bbc2f3f0 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2340 - Warlock Charm.txt @@ -0,0 +1,18 @@ +School: Evocation +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/scr/Spell2304 - Eldritch Cone.py b/tpdatasrc/tpgamefiles/scr/Spell2304 - Eldritch Cone.py new file mode 100644 index 000000000..07c2c6756 --- /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 = int((spell.caster_level + 1) / 2) #capped at cl 20 (9d6) + damageType = spell.caster.d20_query("PQ_Eldritch_Blast_Damage_Type") + if not damageType: + damageType = D20DT_MAGIC + saveDescriptor = D20STD_F_NONE + + #game.particles("sp-Ray of Enfeeblement", spell.target_loc) + + 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..1fb0ec5a3 --- /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 = int((spell.caster_level + 1) / 2) #capped at cl 20 (9d6) + damageType = spell.caster.d20_query("PQ_Eldritch_Blast_Damage_Type") + if not damageType: + damageType = D20DT_MAGIC + saveDescriptor = D20STD_F_NONE + + #game.particles("sp-Ray of Enfeeblement", spell.target_loc) + + 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/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 From 231741e76ad8cf3499c052acf8972fa171bcfa83 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 14 Mar 2022 12:09:34 +0100 Subject: [PATCH 104/146] Update tpgamefiles.dat --- tpdata/tpgamefiles.dat | Bin 3853724 -> 3857374 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 7dbb690d0082a1dc2cdbd055a1188ea345fc2e55..b268e4cba9cc8f52306550909efdf140f62f3710 100644 GIT binary patch delta 47586 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 N(#DOq1lvDi`afiWkUjta From deb03fdfaaf6aaae978364ea5be5f13a1af9ecc6 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 16 Mar 2022 09:23:51 +0100 Subject: [PATCH 105/146] More Warlock porgress Added Noxious Blast Added Hindering Blast Added Particle Effects for Eldritch Blast Added Particle Effects for Eldrich Cone Updated Essence Stance OnConditionAddPre Handling --- .../tpgamefiles/mes/help/warlock_help.tab | 19 +++---- .../tpgamefiles/mes/spells/warlock_spell.mes | 22 ++++---- .../rules/char_class/class033_warlock.py | 52 ++++++++++++------- .../feats/warlock energy resistance acid.txt | 6 +++ .../feats/warlock energy resistance cold.txt | 6 +++ .../warlock energy resistance electricity.txt | 6 +++ .../feats/warlock energy resistance fire.txt | 6 +++ .../feats/warlock energy resistance sonic.txt | 6 +++ .../rules/feats/warlock energy resistance.txt | 5 ++ .../rules/partsys/warlock_partsys.tab | 28 ++++++++++ .../rules/spell_enums/warlock_spell_enum.mes | 48 ++++++++--------- .../rules/spells/2317 - Noxious Blast.txt | 15 ++++++ .../rules/spells/2320 - Hindering Blast.txt | 15 ++++++ .../scr/Spell2300 - Eldritch Blast.py | 4 +- .../scr/Spell2304 - Eldritch Cone.py | 6 +-- .../scr/Spell2311 - Frightful Blast.py | 2 +- .../scr/Spell2312 - Sickening Blast.py | 2 +- .../scr/Spell2313 - Beshadowed Blast.py | 2 +- .../scr/Spell2314 - Brimstone Blast.py | 2 +- .../scr/Spell2315 - Hellrime Blast.py | 2 +- .../scr/Spell2317 - Noxious Blast.py | 25 +++++++++ .../scr/Spell2320 - Hindering Blast.py | 25 +++++++++ .../scr/tpModifiers/sp_beshadowed_blast.py | 2 +- .../scr/tpModifiers/sp_brimstone_blast.py | 2 +- .../scr/tpModifiers/sp_frightful_blast.py | 2 +- .../scr/tpModifiers/sp_hellrime_blast.py | 2 +- .../scr/tpModifiers/sp_hindering_blast.py | 29 +++++++++++ .../scr/tpModifiers/sp_noxious_blast.py | 28 ++++++++++ .../scr/tpModifiers/sp_sickening_blast.py | 2 +- .../tpgamefiles/scr/tpModifiers/warlock.py | 30 +++++------ 30 files changed, 306 insertions(+), 95 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance acid.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance cold.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance electricity.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance fire.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance sonic.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/warlock energy resistance.txt create mode 100644 tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2317 - Noxious Blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2320 - Hindering Blast.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2317 - Noxious Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2320 - Hindering Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hindering_blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_noxious_blast.py diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab index a8fa3aa6f..70e49767f 100644 --- a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -7,16 +7,17 @@ TAG_CLASS_FEATURES_WARLOCK_DETECT_MAGIC TAG_WARLOCKS Detect Magic Beginning at 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_FRIGHTFUL_BLAST TAG_SPELLS TAG_INVOCATION_LEAST Frightful Blast ~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_SICKENING_BLAST TAG_SPELLS TAG_INVOCATION_LEAST Sickening Blast ~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_BESHADOWING_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Beshadowing Blast ~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: Yes TBD! -TAG_SPELLS_BRIMSTONE_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Brimstone Blast ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 3 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! -TAG_SPELLS_HELLRIME_BLAST TAG_SPELLS TAG_INVOCATION_LESSER Hellrime Blast ~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: Yes TBD! 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] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! -TAG_SPELLS_ELDRITCH_CHAIN TAG_SPELLS TAG_INVOCATION_LESSER Eldritch Chain ~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: Yes TBD! -TAG_SPELLS_ELDRITCH_CONE TAG_SPELLS TAG_INVOCATION_GREATER Eldritch Cone ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 5 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This Blast Shape Invocation allows you to invoke your Eldritch Blast as a 30-foot cone. The Eldritch Cone deals the normal Eldritch Blast damage 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_LINE TAG_SPELLS TAG_INVOCATION_GREATER Eldritch Line ~Invocation~[TAG_CLASS_FEATURES_WARLOCK_INVOCATIONS] Level: ~Warlock~[TAG_WARLOCKS] 5 Components: S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This Blast Shape Invocation allows you to invoke your Eldritch Blast as a 60-foot line. The Eldritch Line deals the normal Eldritch Blast damage 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] 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_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] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +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] Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This Blast Shape Invocation allows you to invoke your Eldritch Blast as a 30-foot cone. The Eldritch Cone deals the normal Eldritch Blast damage 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_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] Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This Blast Shape Invocation allows you to invoke your Eldritch Blast as a 60-foot line. The Eldritch Line deals the normal Eldritch Blast damage 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] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +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 ~standard action~[TAG_STANDARD_ACTION] Duration: 1 Minute Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates Spell Resistance: Yes This eldritch essence invocation allows you to change your 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_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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! 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! diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes index 0509dc23b..ce7c0587f 100644 --- a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes @@ -7,7 +7,7 @@ {2301}{Eldritch Spear} {2302}{Hideous Blow} // not implemented {2303}{Eldritch Chain} -{2305}{Eldritch Cone} +{2304}{Eldritch Cone} {2305}{Eldritch Line} {2306}{Eldritch Doom} // not implemented {2307}{Eldritch Glave} // not implemented @@ -19,10 +19,10 @@ {2314}{Brimstone Blast} {2315}{Hellrime Blast} {2316}{Bewitching Blast} // not implemented -{2317}{Noxious Blast} // not implemented +{2317}{Noxious Blast} {2318}{Repelling Blast} // not implemented {2319}{Vitriolic Blast} // not implemented -{2320}{Hindering Blast} // not implemented +{2320}{Hindering Blast} {2321}{Utterdark Blast} // not implemented {2322}{Binding Blast} // not implemented {2323}{Penetrating Blast} // not implemented @@ -43,14 +43,14 @@ {2339}{All Seeing Eyes} {2340}{Charm} {2341}{Curse of Despair} -{2342}{Fell Flight} +{2342}{Fell Flight} // not implemented {2343}{Flee the Scence} -{2344}{The Dead Walk} -{2345}{Voracious Dispelling} +{2344}{The Dead Walk} // not implemented +{2345}{Voracious Dispelling} // not implemented {2346}{Walk Unseen} -{2347}{Cold Comfort} -{2348}{Witchwood Step} -{2349}{Dread Seizure} +{2347}{Cold Comfort} // not implemented +{2348}{Witchwood Step} // not implemented +{2349}{Dread Seizure} // not implemented {2350}{Ignore the Pyre} // Spell Descriptions @@ -68,10 +68,10 @@ {7314} Brimstone Blast {[Eldritch Essence] TBD!} {7315} Hellrime Blast {[Eldritch Essence] TBD!} {7316} Bewitching Blast {[Eldritch Essence] TBD!} // not implemented -{7317} Noxious Blast {[Eldritch Essence] TBD!} // not implemented +{7317} Noxious Blast {[Eldritch Essence] TBD!} {7318} Repelling Blast {[Eldritch Essence] TBD!} // not implemented {7319} Vitriolic Blast {[Eldritch Essence] TBD!} // not implemented -{7320} Hindering Blast {[Eldritch Essence] TBD!} // not implemented +{7320} Hindering Blast {[Eldritch Essence] TBD!} {7321} Utterdark Blast {[Eldritch Essence] TBD!} // not implemented {7322} Binding Blast {[Eldritch Essence] TBD!} // not implemented {7323} Penetrating Blast {[Eldritch Essence] TBD!} // not implemented diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py index 46a37603e..dcbdc6edd 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py @@ -63,26 +63,26 @@ def GetClassHelpTopic(): bonus_feats =["Warlock Energy Resistance"] spells_per_day = { -1: (-1, 969, 969), -2: (-1, 969, 969), -3: (-1, 969, 969), -4: (-1, 969, 969), -5: (-1, 969, 969), -6: (-1, 969, 969, 969, 969), -7: (-1, 969, 969, 969, 969), -8: (-1, 969, 969, 969, 969), -9: (-1, 969, 969, 969, 969), -10: (-1, 969, 969, 969, 969), -11: (-1, 969, 969, 969, 969, 969, 969), -12: (-1, 969, 969, 969, 969, 969, 969), -13: (-1, 969, 969, 969, 969, 969, 969), -14: (-1, 969, 969, 969, 969, 969, 969), -15: (-1, 969, 969, 969, 969, 969, 969), -16: (-1, 969, 969, 969, 969, 969, 969, 969, 969, 969), -17: (-1, 969, 969, 969, 969, 969, 969, 969, 969, 969), -18: (-1, 969, 969, 969, 969, 969, 969, 969, 969, 969), -19: (-1, 969, 969, 969, 969, 969, 969, 969, 969, 969), -20: (-1, 969, 969, 969, 969, 969, 969, 969, 969, 969) +1: (-1, 89, 89), +2: (-1, 89, 89), +3: (-1, 89, 89), +4: (-1, 89, 89), +5: (-1, 89, 89), +6: (-1, 89, 89, 89, 89), +7: (-1, 89, 89, 89, 89), +8: (-1, 89, 89, 89, 89), +9: (-1, 89, 89, 89, 89), +10: (-1, 89, 89, 89, 89), +11: (-1, 89, 89, 89, 89, 89, 89), +12: (-1, 89, 89, 89, 89, 89, 89), +13: (-1, 89, 89, 89, 89, 89, 89), +14: (-1, 89, 89, 89, 89, 89, 89), +15: (-1, 89, 89, 89, 89, 89, 89), +16: (-1, 89, 89, 89, 89, 89, 89, 89, 89, 89), +17: (-1, 89, 89, 89, 89, 89, 89, 89, 89, 89), +18: (-1, 89, 89, 89, 89, 89, 89, 89, 89, 89), +19: (-1, 89, 89, 89, 89, 89, 89, 89, 89, 89), +20: (-1, 89, 89, 89, 89, 89, 89, 89, 89, 89) #lvl 0 1 2 3 4 5 6 7 8 9 } @@ -158,6 +158,14 @@ 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): @@ -192,6 +200,10 @@ def addEldritchBlast(): 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): 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/partsys/warlock_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab new file mode 100644 index 000000000..4e4eee570 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab @@ -0,0 +1,28 @@ +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-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-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-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/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes index 0872bbcfd..375f76077 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -17,10 +17,10 @@ {2314}{Brimstone Blast} {2315}{Hellrime Blast} {2316}{Bewitching Blast} // not implemented -{2317}{Noxious Blast} // not implemented +{2317}{Noxious Blast} {2318}{Repelling Blast} // not implemented {2319}{Vitriolic Blast} // not implemented -{2320}{Hindering Blast} // not implemented +{2320}{Hindering Blast} {2321}{Utterdark Blast} // not implemented {2322}{Binding Blast} // not implemented {2323}{Penetrating Blast} // not implemented @@ -41,14 +41,14 @@ {2339}{All Seeing Eyes} {2340}{Charm} {2341}{Curse of Despair} -{2342}{Fell Flight} +{2342}{Fell Flight} // not implemented {2343}{Flee the Scence} -{2344}{The Dead Walk} -{2345}{Voracious Dispelling} +{2344}{The Dead Walk} // not implemented +{2345}{Voracious Dispelling} // not implemented {2346}{Walk Unseen} -{2347}{Cold Comfort} -{2348}{Witchwood Step} -{2349}{Dread Seizure} +{2347}{Cold Comfort} // not implemented +{2348}{Witchwood Step} // not implemented +{2349}{Dread Seizure} // not implemented {2350}{Ignore the Pyre} {7300}{Eldritch Blast} @@ -65,10 +65,10 @@ {7314}{Brimstone Blast} {7315}{Hellrime Blast} {7316}{Bewitching Blast} // not implemented -{7317}{Noxious Blast} // not implemented +{7317}{Noxious Blast} {7318}{Repelling Blast} // not implemented {7319}{Vitriolic Blast} // not implemented -{7320}{Hindering Blast} // not implemented +{7320}{Hindering Blast} {7321}{Utterdark Blast} // not implemented {7322}{Binding Blast} // not implemented {7323}{Penetrating Blast} // not implemented @@ -87,14 +87,14 @@ {7339}{All Seeing Eyes} {7340}{Charm} {7341}{Curse of Despair} -{7342}{Fell Flight} +{7342}{Fell Flight} // not implemented {7343}{Flee the Scence} -{7344}{The Dead Walk} -{7345}{Voracious Dispelling} +{7344}{The Dead Walk} // not implemented +{7345}{Voracious Dispelling} // not implemented {7346}{Walk Unseen} -{7347}{Cold Comfort} -{7348}{Witchwood Step} -{7349}{Dread Seizure} +{7347}{Cold Comfort} // not implemented +{7348}{Witchwood Step} // not implemented +{7349}{Dread Seizure} // not implemented {7350}{Ignore the Pyre} {22300}{TAG_SPELLS_ELDRITCH_BLAST} @@ -111,10 +111,10 @@ {22314}{TAG_SPELLS_BRIMSTONE_BLAST} {22315}{TAG_SPELLS_HELLRIME_BLAST} {22316}{TAG_SPELLS_BEWITCHING_BLAST} // not implemented -{22317}{TAG_SPELLS_NOXIOUS_BLAST} // not implemented +{22317}{TAG_SPELLS_NOXIOUS_BLAST} {22318}{TAG_SPELLS_REPELLING_BLAST} // not implemented {22319}{TAG_SPELLS_VITRIOLIC_BLAST} // not implemented -{22320}{TAG_SPELLS_HINDERING_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 @@ -133,12 +133,12 @@ {22339}{TAG_SPELLS_ALL_SEEING_EYES} {22340}{TAG_SPELLS_WARLOCK_CHARM} {22341}{TAG_SPELLS_CURSE_OF_DESPAIR} -{22342}{TAG_SPELLS_FELL_FLIGHT} +{22342}{TAG_SPELLS_FELL_FLIGHT} // not implemented {22343}{TAG_SPELLS_FLEE_THE_SCENCE} -{22344}{TAG_SPELLS_THE_DEAD_WALK} -{22345}{TAG_SPELLS_VORACIOUS_DISPELLING} +{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} -{22349}{TAG_SPELLS_DREAD_SEIZURE} +{22347}{TAG_SPELLS_COLD_COMFORT} // not implemented +{22348}{TAG_SPELLS_WITCHWOOD_STEP} // not implemented +{22349}{TAG_SPELLS_DREAD_SEIZURE} // not implemented {22350}{TAG_SPELLS_IGNORE_THE_PYRE} 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..cbf714846 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2317 - Noxious Blast.txt @@ -0,0 +1,15 @@ +School: Evocation +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..cbf714846 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2320 - Hindering Blast.txt @@ -0,0 +1,15 @@ +School: Evocation +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/scr/Spell2300 - Eldritch Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2300 - Eldritch Blast.py index f1c77a1f4..53fd1ac37 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2300 - Eldritch Blast.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2300 - Eldritch Blast.py @@ -15,7 +15,7 @@ def OnBeginRound(spell): def OnBeginProjectile(spell, projectile, index_of_target): print "Eldritch Blast OnBeginProjectile" - projectile.obj_set_int(obj_f_projectile_part_sys_id, game.particles("sp-Ray of Enfeeblement", projectile)) + 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" @@ -34,7 +34,7 @@ def OnEndProjectile(spell, projectile, index_of_target): attackResult = spell.caster.perform_touch_attack(spellTarget.obj) if attackResult & D20CAF_HIT: - game.particles("sp-Ray of Enfeeblement-END", spellTarget.obj) + 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) diff --git a/tpdatasrc/tpgamefiles/scr/Spell2304 - Eldritch Cone.py b/tpdatasrc/tpgamefiles/scr/Spell2304 - Eldritch Cone.py index 07c2c6756..839d02eb0 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2304 - Eldritch Cone.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2304 - Eldritch Cone.py @@ -20,13 +20,13 @@ def OnSpellEffect(spell): damageType = D20DT_MAGIC saveDescriptor = D20STD_F_NONE - #game.particles("sp-Ray of Enfeeblement", spell.target_loc) + 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) + spellTarget.obj.float_mesfile_line("mes\\spell.mes", 30001) else: - spellTarget.obj.float_mesfile_line('mes\\spell.mes', 30002) + 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: diff --git a/tpdatasrc/tpgamefiles/scr/Spell2311 - Frightful Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2311 - Frightful Blast.py index af69c6faf..bd40b8d86 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2311 - Frightful Blast.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2311 - Frightful Blast.py @@ -12,7 +12,7 @@ def OnSpellEffect(spell): spellTarget = spell.target_list[0] spellEnum = spell_frightful_blast - spellTarget.obj.condition_add_with_args("sp-Frightful Blast", spellEnum, 0) + spellTarget.obj.condition_add_with_args("Frightful Blast", spellEnum, 0) spell.target_list.remove_target(spellTarget.obj) spell.spell_end(spell.id) diff --git a/tpdatasrc/tpgamefiles/scr/Spell2312 - Sickening Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2312 - Sickening Blast.py index 008cdd166..2479bb1e5 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2312 - Sickening Blast.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2312 - Sickening Blast.py @@ -12,7 +12,7 @@ def OnSpellEffect(spell): spellTarget = spell.target_list[0] spellEnum = spell_sickening_blast - spellTarget.obj.condition_add_with_args("sp-Sickening Blast", spellEnum, 0) + spellTarget.obj.condition_add_with_args("Sickening Blast", spellEnum, 0) spell.target_list.remove_target(spellTarget.obj) spell.spell_end(spell.id) diff --git a/tpdatasrc/tpgamefiles/scr/Spell2313 - Beshadowed Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2313 - Beshadowed Blast.py index 2f2c0b318..64db0c70d 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2313 - Beshadowed Blast.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2313 - Beshadowed Blast.py @@ -12,7 +12,7 @@ def OnSpellEffect(spell): spellTarget = spell.target_list[0] spellEnum = spell_beshadowed_blast - spellTarget.obj.condition_add_with_args("sp-Beshadowed Blast", spellEnum, 0) + spellTarget.obj.condition_add_with_args("Beshadowed Blast", spellEnum, 0) spell.target_list.remove_target(spellTarget.obj) spell.spell_end(spell.id) diff --git a/tpdatasrc/tpgamefiles/scr/Spell2314 - Brimstone Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2314 - Brimstone Blast.py index cfe9967e9..f34ab0223 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2314 - Brimstone Blast.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2314 - Brimstone Blast.py @@ -12,7 +12,7 @@ def OnSpellEffect(spell): spellTarget = spell.target_list[0] spellEnum = spell_brimstone_blast - spellTarget.obj.condition_add_with_args("sp-Brimstone Blast", spellEnum, 0) + spellTarget.obj.condition_add_with_args("Brimstone Blast", spellEnum, 0) spell.target_list.remove_target(spellTarget.obj) spell.spell_end(spell.id) diff --git a/tpdatasrc/tpgamefiles/scr/Spell2315 - Hellrime Blast.py b/tpdatasrc/tpgamefiles/scr/Spell2315 - Hellrime Blast.py index c6b05171b..d8838d681 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2315 - Hellrime Blast.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2315 - Hellrime Blast.py @@ -12,7 +12,7 @@ def OnSpellEffect(spell): spellTarget = spell.target_list[0] spellEnum = spell_hellrime_blast - spellTarget.obj.condition_add_with_args("sp-Hellrime Blast", spellEnum, 0) + spellTarget.obj.condition_add_with_args("Hellrime Blast", spellEnum, 0) spell.target_list.remove_target(spellTarget.obj) spell.spell_end(spell.id) 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/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/tpModifiers/sp_beshadowed_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beshadowed_blast.py index 010e2cb0f..610d1ee5b 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beshadowed_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beshadowed_blast.py @@ -23,6 +23,6 @@ def secondaryEffect(attachee, args, evt_obj): spellTarget.condition_add_with_args("sp-Blindness", spellId, duration, 0) return 0 -beshadowedBlast = EldritchBlastEssenceModifier("sp-Beshadowed Blast") #spellEnum, empty +beshadowedBlast = EldritchBlastEssenceModifier("Beshadowed Blast") #spellEnum, empty beshadowedBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) beshadowedBlast.AddQuerySecondaryTrue() \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_brimstone_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_brimstone_blast.py index 0ba6386f8..640adc880 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_brimstone_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_brimstone_blast.py @@ -28,7 +28,7 @@ def secondaryEffect(attachee, args, evt_obj): spellTarget.condition_add_with_args("Brimstone Burn", spellId, duration, 0) return 0 -brimstoneBlast = EldritchBlastEssenceModifier("sp-Brimstone Blast") #spellEnum, empty +brimstoneBlast = EldritchBlastEssenceModifier("Brimstone Blast") #spellEnum, empty brimstoneBlast.ModifyDamageType(D20DT_FIRE) brimstoneBlast.AddQuerySecondaryTrue() diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py index 655a1ea25..77e3b690c 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py @@ -23,5 +23,5 @@ def secondaryEffect(attachee, args, evt_obj): spellTarget.condition_add_with_args("Shaken", duration, 0, 0) return 0 -frightfulBlast = EldritchBlastEssenceModifier("sp-Frightful Blast") #spellEnum, empty +frightfulBlast = EldritchBlastEssenceModifier("Frightful Blast") #spellEnum, empty frightfulBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hellrime_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hellrime_blast.py index af564742c..27d561921 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hellrime_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hellrime_blast.py @@ -24,7 +24,7 @@ def secondaryEffect(attachee, args, evt_obj): spellTarget.condition_add_with_args("Hellrime Blast Effect", spellId, duration, 0) return 0 -hellrimeBlast = EldritchBlastEssenceModifier("sp-Hellrime Blast") #spellEnum, empty +hellrimeBlast = EldritchBlastEssenceModifier("Hellrime Blast") #spellEnum, empty hellrimeBlast.ModifyDamageType(D20DT_COLD) hellrimeBlast.AddQuerySecondaryTrue() 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..2d734f64f --- /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 +from spell_utils import SpellPythonModifier + +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, empty +hinderingBlast.AddQuerySecondaryTrue() 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..8a9f72a50 --- /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, empty +noxiousBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) \ 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 index fc287ff87..b941bfe87 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_sickening_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_sickening_blast.py @@ -25,5 +25,5 @@ def secondaryEffect(attachee, args, evt_obj): spellTarget.condition_add_with_args("Sickened", duration, 0, 0) return 0 -sickeningBlast = EldritchBlastEssenceModifier("sp-Sickening Blast") #spellEnum, empty +sickeningBlast = EldritchBlastEssenceModifier("Sickening Blast") #spellEnum, empty sickeningBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) \ No newline at end of file diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py index abfe21c4c..11c0238dd 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -61,19 +61,19 @@ def queryStance(attachee, args, evt_obj): evt_obj.return_val = stanceEnum return 0 +def getStanceName(spellEnum): + return game.get_spell_mesline(spellEnum) + def updateEssenceStance(attachee, args, evt_obj): - if (evt_obj.is_modifier("sp-Eldritch Essence") - or evt_obj.is_modifier("sp-Frightful Blast") - or evt_obj.is_modifier("sp-Sickening Blast") - or evt_obj.is_modifier("sp-Beshadowed Blast") - or evt_obj.is_modifier("sp-Brimstone Blast") - or evt_obj.is_modifier("sp-Hellrime Blast")): + for spellEnum in range(spell_frightful_blast, spell_penetrating_blast + 1): + modifierName = getStanceName(spellEnum) + if evt_obj.is_modifier(modifierName): + args.condition_remove() + break + if evt_obj.is_modifier("Eldritch Essence"): args.condition_remove() return 0 -def getStanceName(spellEnum): - return game.get_spell_mesline(spellEnum) - def floatActivation(attachee, args, evt_obj): spellEnum = args.get_arg(0) if spellEnum != spell_eldritch_blast: @@ -92,7 +92,7 @@ def addToolTip(attachee, args, evt_obj): spellEnum = args.get_arg(0) if spellEnum != spell_eldritch_blast: stanceName = getStanceName(spellEnum) - evt_obj.append("Stance: {}".format(stanceName)) + evt_obj.append("{} active".format(stanceName)) return 0 def queryDamageType(attachee, args, evt_obj): @@ -122,7 +122,7 @@ def ModifyDamageType(self, damageType): def AddQuerySecondaryTrue(self): self.add_hook(ET_OnD20PythonQuery, "PQ_Eldritch_Blast_Has_Secondary_Effect", queryReturnTrue, ()) -eldritchEssenceCond = EldritchBlastEssenceModifier("sp-Eldritch Essence") #spellEnum, empty +eldritchEssenceCond = EldritchBlastEssenceModifier("Eldritch Essence") #spellEnum, empty def getActiveEldritchEssence(attachee): essenceEnum = attachee.d20_query("PQ_Eldritch_Esssence_Stance") @@ -144,7 +144,7 @@ def radialResestEldritchBlast(attachee, args, evt_obj): return 0 def performResetEldritchBlast(attachee, args, evt_obj): - attachee.condition_add_with_args("sp-Eldritch Essence", spell_eldritch_blast, 0) + attachee.condition_add_with_args("Eldritch Essence", spell_eldritch_blast, 0) return 0 #Spell Level of Eldritch Blast is dynamically: @@ -159,14 +159,12 @@ def applyEldritchBlastSpellLevel(attachee, args, evt_obj): activeEssenceEnum = getActiveEldritchEssence(attachee) if activeEssenceEnum != spell_eldritch_blast: spellClass = getSpellClassCode(classEnum) - spellEntryEssence = tpdp.SpellEntry(activeEssenceEnum) - spellLevel = spellEntryEssence.level_for_spell_class(spellClass) - 1 #Eldritch Blast itself is level 1 and is already applied + spellEntry = tpdp.SpellEntry(activeEssenceEnum) + spellLevel = spellEntry.level_for_spell_class(spellClass) - 1 #Eldritch Blast itself is level 1 and is already applied if spellLevel > 0: evt_obj.bonus_list.add(spellLevel, bonus_type_untyped, "Warlock Eldritch Blast spell level modification") return 0 -#eldritchBlastHandling = PythonModifier("Eldritch Blast Handling", 1) #empty -#eldritchBlastHandling.MapToFeat("Warlock Eldritch Blast") classSpecObj.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, radialResestEldritchBlast, ()) classSpecObj.AddHook(ET_OnD20PythonActionPerform, resetEldritchBlastEnum, performResetEldritchBlast, ()) classSpecObj.AddHook(ET_OnGetSpellDcMod, EK_NONE, applyEldritchBlastSpellLevel, ()) From 0450d2fa9773be448dcf55c35f4b2a795ff7e3b0 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 17 Mar 2022 11:17:05 +0100 Subject: [PATCH 106/146] New Conditions and Removal Handling added Added Nauseated Added Shaken as a non spell condition; required for quite a few feats Added Sickened as a non spell condition; also needed for some class feats and normal feats All above conditions are also used by the new Warlock Class in Eldritch Blasts --- .../tpgamefiles/scr/tpModifiers/nauseated.py | 111 ++++++++++++++++++ .../tpModifiers/remove_special_conditions.py | 33 ++++++ .../tpgamefiles/scr/tpModifiers/shaken.py | 92 +++++++++++++++ .../tpgamefiles/scr/tpModifiers/sickened.py | 85 ++++++++++++++ 4 files changed, 321 insertions(+) create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/nauseated.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/remove_special_conditions.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/shaken.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sickened.py 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..8bb6ae85c --- /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(getConditionName(), 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, ()) From e8d1cc42ccbb56e162d42feca40f2af7a3d8a10f Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 17 Mar 2022 11:21:08 +0100 Subject: [PATCH 107/146] Update tpgamefiles.dat --- tpdata/tpgamefiles.dat | Bin 3857374 -> 3867368 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index b268e4cba9cc8f52306550909efdf140f62f3710..744d7087bbb05a872b27b69557976eb572104f66 100644 GIT binary patch delta 65871 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

jg1tFlv)bKuYJtT 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 p1a16gp^*YR?|dv{_>6{0>V+{wg64&VM Date: Thu, 17 Mar 2022 14:58:55 +0100 Subject: [PATCH 108/146] Fixed Sickened crash --- tpdatasrc/tpgamefiles/scr/tpModifiers/sickened.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sickened.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sickened.py index 8bb6ae85c..f2da8d210 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sickened.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sickened.py @@ -71,7 +71,7 @@ def removeParticles(attachee, args, evt_obj): game.particles_end(particlesId) return 0 -SickenedCondition = PythonModifier(getConditionName(), 3, False) #duration, particlesId, empty +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, ()) From 64e492287cd5ee185188a51ed57fef8cdbe77d10 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 17 Mar 2022 14:59:55 +0100 Subject: [PATCH 109/146] Fixed crashing issue --- tpdata/tpgamefiles.dat | Bin 3867368 -> 3867363 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 744d7087bbb05a872b27b69557976eb572104f66..aaebfd8934a0efed65a96662cfe3135867bf56ef 100644 GIT binary patch delta 13625 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 delta 13684 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 fqU+qM*4=zA!% Date: Sun, 20 Mar 2022 20:16:01 +0100 Subject: [PATCH 110/146] Added Invocation Entropic Warding --- .../tpgamefiles/mes/help/warlock_help.tab | 1 + .../tpgamefiles/mes/spells/warlock_spell.mes | 4 +-- .../warlock_spell_long_descriptions.mes | 8 ++++++ .../rules/spell_enums/warlock_spell_enum.mes | 6 ++--- .../rules/spells/2333 - Entropic Warding.txt | 15 +++++++++++ .../scr/Spell2333 - Entropic Warding.py | 27 +++++++++++++++++++ 6 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2333 - Entropic Warding.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2333 - Entropic Warding.py diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab index 70e49767f..8ab591e36 100644 --- a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -23,6 +23,7 @@ TAG_SPELLS_BEGUILING_INFLUENCE TAG_SPELLS TAG_INVOCATION_LEAST Beguiling Influe 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_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_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. diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes index ce7c0587f..71efcfa3b 100644 --- a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes @@ -34,7 +34,7 @@ {2330}{Beguiling Influence} {2331}{Breath of the Night} {2332}{Dark One's Own Luck} -{2333}{Entropic Warding} // not implemented +{2333}{Entropic Warding} {2334}{Leaps and Bounds} {2335}{Miasmic Cloud} {2336}{See the Unseen} @@ -81,7 +81,7 @@ {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!} // not implemented +{7333} Entropic Warding {[Invocation] TBD!} {7334} Leaps and Bounds {[Invocation] TBD!} {7335} Miasmic Cloud {[Invocation] TBD!} {7336} See the Unseen {[Invocation] TBD!} diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes index 43f176cc5..b70aa5d66 100644 --- a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes +++ b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes @@ -105,6 +105,14 @@ 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] diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes index 375f76077..9df2a51bc 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -32,7 +32,7 @@ {2330}{Beguiling Influence} {2331}{Breath of the Night} {2332}{Dark One's Own Luck} -{2333}{Entropic Warding} // not implemented +{2333}{Entropic Warding} {2334}{Leaps and Bounds} {2335}{Miasmic Cloud} {2336}{See the Unseen} @@ -78,7 +78,7 @@ {7330}{Beguiling Influence} {7331}{Breath of the Night} {7332}{Dark One's Own Luck} -{7333}{Entropic Warding} // not implemented +{7333}{Entropic Warding} {7334}{Leaps and Bounds} {7335}{Miasmic Cloud} {7336}{See the Unseen} @@ -124,7 +124,7 @@ {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} // not implemented +{22333}{TAG_SPELLS_ENTROPIC_WARDING} {22334}{TAG_SPELLS_LEAPS_AND_BOUNDS} {22335}{TAG_SPELLS_MIASMIC_CLOUD} {22336}{TAG_SPELLS_SEE_THE_UNSEEN} 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..d35a4a70d --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2333 - Entropic Warding.txt @@ -0,0 +1,15 @@ +School: Evocation +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/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" + From 27496a7afb6ace20a6e9483ac0f1317f9399e880 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sun, 20 Mar 2022 20:18:45 +0100 Subject: [PATCH 111/146] Update stat_ext.mes Added Warlock Short Description --- tpdatasrc/tpgamefiles/mes/stat_ext.mes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpdatasrc/tpgamefiles/mes/stat_ext.mes b/tpdatasrc/tpgamefiles/mes/stat_ext.mes index cf5dfc354..8b264ba3c 100644 --- a/tpdatasrc/tpgamefiles/mes/stat_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/stat_ext.mes @@ -307,7 +307,7 @@ Requirements Feats: Spell Focus (conjuration). Spells: Able to cast lesser planar ally.} -{13026}Warlock{TBD! +{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} From 966800a0a90bfdde8266039bebfbf83259f3c295 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Sun, 20 Mar 2022 20:19:45 +0100 Subject: [PATCH 112/146] Update tpgamefiles.dat --- tpdata/tpgamefiles.dat | Bin 3867363 -> 3868320 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index aaebfd8934a0efed65a96662cfe3135867bf56ef..0e6fcc85fa97b9a041b38b5cf4186637a67b0d48 100644 GIT binary patch delta 50810 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 ZllzBr&2F!6)VEFhLu2r$Wt+$F{{SU~!$JT6 delta 49788 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

Y;n4p&x$~05ZNgC{LBk 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 From 72c4e41a976c4cb767624c696dd7be295155426d Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 21 Mar 2022 10:30:34 +0100 Subject: [PATCH 113/146] Create feat_utils.py --- tpdatasrc/tpgamefiles/scr/feat_utils.py | 42 +++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 tpdatasrc/tpgamefiles/scr/feat_utils.py 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) From 7094baf52582707471b23bfdf4e1dd4addc34743 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 21 Mar 2022 10:32:35 +0100 Subject: [PATCH 114/146] Added SF + GSF Invocation --- .../feats/greater spell focus invocation.txt | 4 ++++ .../rules/feats/spell focus invocation.txt | 4 ++++ ...feat - Greater Spell Focus (Invocation).py | 7 ++++++ .../greater_spell_focus_invocation.py | 18 +++++++++++++++ .../scr/tpModifiers/spell_focus_invocation.py | 18 +++++++++++++++ .../tpgamefiles/scr/tpModifiers/warlock.py | 23 ++++++++++++------- 6 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt create mode 100644 tpdatasrc/tpgamefiles/rules/feats/spell focus invocation.txt create mode 100644 tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus (Invocation).py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/spell_focus_invocation.py 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/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..a12d68f2a --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus (Invocation).py @@ -0,0 +1,7 @@ +from toee import * +import char_editor + +def CheckPrereq(attachee, classLevelled, abilityScoreRaised): + if not char_editor.has_feat("Spell Focus (Invocation)"): + return 0 + return 1 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..e9ff347b8 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py @@ -0,0 +1,18 @@ +from toee import * +import tpdp +from feat_utils import FeatPythonModifier +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 = FeatPythonModifier("Greater Spell Focus (Invocation)") #featEnum, empty +gsfInvocationFeat.AddHook(ET_OnGetSpellDcMod, EK_NONE, dcBonus, ()) 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..f8b168bf6 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/spell_focus_invocation.py @@ -0,0 +1,18 @@ +from toee import * +import tpdp +from feat_utils import FeatPythonModifier +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 = FeatPythonModifier("Spell Focus (Invocation)") #featEnum, empty +sfInvocationFeat.AddHook(ET_OnGetSpellDcMod, EK_NONE, dcBonus, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py index 11c0238dd..4790b61e2 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -52,9 +52,7 @@ def OnGetSaveThrowWill(attachee, args, evt_obj): classSpecObj.AddHook(ET_OnSaveThrowLevel, EK_SAVE_REFLEX, OnGetSaveThrowReflex, ()) classSpecObj.AddHook(ET_OnSaveThrowLevel, EK_SAVE_WILL, OnGetSaveThrowWill, ()) -#### Warlock Feats #### - -## Eldritch Blast +#### Warlock Eldritch Essence Stance Class and Handling #### def queryStance(attachee, args, evt_obj): stanceEnum = args.get_arg(0) @@ -83,11 +81,6 @@ def floatActivation(attachee, args, evt_obj): attachee.float_text_line("Eldritch Essence resetted", tf_light_blue) return 0 -def verifyEldritchBlastAction(spellEnum): - if spellEnum in range(spell_eldritch_blast, spell_eldritch_glave + 1): - return True - return False - def addToolTip(attachee, args, evt_obj): spellEnum = args.get_arg(0) if spellEnum != spell_eldritch_blast: @@ -124,6 +117,20 @@ def AddQuerySecondaryTrue(self): eldritchEssenceCond = EldritchBlastEssenceModifier("Eldritch Essence") #spellEnum, empty +#### Warlock Callbacks for other functions ##### + +def verifyEldritchBlastAction(spellEnum): + if spellEnum in range(spell_eldritch_blast, spell_eldritch_glave + 1): + return True + return False + +def isInvocation(spellEnum): + return True if spellEnum in range(spell_eldritch_blast, 2400) else False #2400 needs to be replaced with the last Invocation enum once done + +#### Warlock Class Feats #### + +## Eldritch Blast + def getActiveEldritchEssence(attachee): essenceEnum = attachee.d20_query("PQ_Eldritch_Esssence_Stance") return essenceEnum if essenceEnum else spell_eldritch_blast From caceea1ac72fe2e16c95c41f4b83e72512b173c9 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 21 Mar 2022 12:50:43 +0100 Subject: [PATCH 115/146] Fixed SF + GSF --- .../scr/tpModifiers/greater_spell_focus_invocation.py | 5 +++-- .../tpgamefiles/scr/tpModifiers/spell_focus_invocation.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py index e9ff347b8..bdb74eade 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py @@ -1,6 +1,6 @@ +from templeplus.pymod import PythonModifier from toee import * import tpdp -from feat_utils import FeatPythonModifier from warlock import isInvocation print "Registering Greater Spell Focus (Invocation)" @@ -14,5 +14,6 @@ def dcBonus(attachee, args, evt_obj): evt_obj.bonus_list.add(bonusValue, bonusType, bonusLabel) return 0 -gsfInvocationFeat = FeatPythonModifier("Greater Spell Focus (Invocation)") #featEnum, empty +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/spell_focus_invocation.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/spell_focus_invocation.py index f8b168bf6..59ad435b2 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/spell_focus_invocation.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/spell_focus_invocation.py @@ -1,6 +1,6 @@ +from templeplus.pymod import PythonModifier from toee import * import tpdp -from feat_utils import FeatPythonModifier from warlock import isInvocation print "Registering Spell Focus (Invocation)" @@ -14,5 +14,6 @@ def dcBonus(attachee, args, evt_obj): evt_obj.bonus_list.add(bonusValue, bonusType, bonusLabel) return 0 -sfInvocationFeat = FeatPythonModifier("Spell Focus (Invocation)") #featEnum, empty +sfInvocationFeat = PythonModifier("Spell Focus (Invocation)", 2) #featEnum, empty +sfInvocationFeat.MapToFeat("Spell Focus (Invocation)") sfInvocationFeat.AddHook(ET_OnGetSpellDcMod, EK_NONE, dcBonus, ()) From 8974991c1b518de678fe5ed68e6426ea80069f17 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 21 Mar 2022 12:51:12 +0100 Subject: [PATCH 116/146] Update tpgamefiles.dat --- tpdata/tpgamefiles.dat | Bin 3868320 -> 3870116 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 0e6fcc85fa97b9a041b38b5cf4186637a67b0d48..2bfd4482740f59e4b10d3a7d8e76f27bdcc2a38a 100644 GIT binary patch delta 40722 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 NaN`s#* Date: Mon, 21 Mar 2022 16:10:52 +0100 Subject: [PATCH 117/146] Update new_classes_help.tab Fixed Typo --- tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab b/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab index 0d72cd810..1b9f0427f 100644 --- a/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/new_classes_help.tab @@ -24,7 +24,7 @@ TAG_CLASS_FEATURES_DRAGONHEART_MAGE_TABLES TAG_DRAGONHEART_MAGE Dragonheart Ma 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), ~Survial~[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_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]. From 56e010aa289814d398b6bc6c6d37eb72459ac402 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 22 Mar 2022 09:34:33 +0100 Subject: [PATCH 118/146] Update constants.py --- tpdata/templeplus/lib/templeplus/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 0facae9bf..ec19ade79 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3439,7 +3439,7 @@ spell_warlock_charm = 2340 spell_curse_of_despair = 2341 spell_fell_flight = 2342 -spell_flee_the_scence = 2343 +spell_flee_the_scene = 2343 spell_the_dead_walk = 2344 spell_voracious_dispelling = 2345 spell_walk_unseen = 2346 From b22cb1cf43e99be4d661c720176c0bfd4df8188e Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 22 Mar 2022 11:36:01 +0100 Subject: [PATCH 119/146] Update spell_utils.py --- tpdatasrc/tpgamefiles/scr/spell_utils.py | 30 ++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 7cfb346e9..73b007414 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -290,6 +290,19 @@ def getSpellTargets(spellPacket): 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) + ### Item Condition functions # An item condition is a condition that should be applied to a @@ -712,7 +725,6 @@ def verifyAoeEventTarget(args, spellTarget, spellPacket): return False elif spellPacket.check_spell_resistance(spellTarget): return False - return True def verifyEventId(spellEventId, aoeEventId): @@ -721,9 +733,7 @@ def verifyEventId(spellEventId, aoeEventId): return True def aoeOnEnter(attachee, args, evt_obj): - print "aoeOnEnter Hook" spellTarget = evt_obj.target - print "spellTarget: ", spellTarget spellId = args.get_arg(0) duration = args.get_arg(1) bonusValue = args.get_arg(2) @@ -900,8 +910,11 @@ def AddSpellDismiss(self): def setAuraObjToSpellRegistry(attachee, args, evt_obj): spellId = args.get_arg(0) spellPacket = tpdp.SpellPacket(spellId) - conditionName = args.get_param(0) if args.get_param(0) else args.get_cond_name() - particlesId = game.particles(conditionName, attachee) + if args.get_arg(6): + particlesId = args.get_arg(6) + else: + conditionName = args.get_cond_name() + particlesId = game.particles(conditionName, attachee) idx = 0 spellPacket.set_spell_object(idx, attachee, particlesId) spellPacket.update_registry() @@ -926,11 +939,14 @@ class AuraSpellHandleModifier(SpellDismissConcentrationFunctions): #AuraSpellHandleModifier have at least 6 arguments: #spellId, duration, bonusValue, spellEventId, spellDc, empty # + #particlesId are expected as arg6 for the target particles + #and for the aoe effect as arg7 + # #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, particlesId = 0, args = 6, preventDuplicate = True): + 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, (particlesId,)) + 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,)) From 730b4bb9065547ace3fea424f6fec32dfb61304a Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 22 Mar 2022 12:08:17 +0100 Subject: [PATCH 120/146] Update spell_utils.py --- tpdatasrc/tpgamefiles/scr/spell_utils.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/tpdatasrc/tpgamefiles/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 73b007414..537cff891 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -910,11 +910,8 @@ def AddSpellDismiss(self): def setAuraObjToSpellRegistry(attachee, args, evt_obj): spellId = args.get_arg(0) spellPacket = tpdp.SpellPacket(spellId) - if args.get_arg(6): - particlesId = args.get_arg(6) - else: - conditionName = args.get_cond_name() - particlesId = game.particles(conditionName, attachee) + conditionName = args.get_cond_name() + particlesId = game.particles(conditionName, attachee) idx = 0 spellPacket.set_spell_object(idx, attachee, particlesId) spellPacket.update_registry() From 0431645d6cbe8432ab3f9c157e17e072a586087a Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 22 Mar 2022 12:39:31 +0100 Subject: [PATCH 121/146] Added Cold Comfort, fixed Flee the Scene Typo --- .../tpgamefiles/mes/spells/warlock_spell.mes | 4 +- tpdatasrc/tpgamefiles/mes/stat_ext.mes | 3 +- .../rules/char_class/class033_warlock.py | 2 +- .../rules/indicators/cold_comfort.txt | 5 +++ .../rules/indicators/cold_comfort_aura.txt | 5 +++ .../rules/partsys/warlock_partsys.tab | 3 ++ .../rules/spell_enums/warlock_spell_enum.mes | 6 +-- .../rules/spells/2347 - Cold Comfort.txt | 16 +++++++ .../scr/Spell2347 - Cold Comfort.py | 33 ++++++++++++++ .../scr/tpModifiers/sp_cold_comfort.py | 44 +++++++++++++++++++ .../scr/tpModifiers/sp_ignore_the_pyre.py | 20 +++------ 11 files changed, 119 insertions(+), 22 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/cold_comfort.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/cold_comfort_aura.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2347 - Cold Comfort.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2347 - Cold Comfort.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_cold_comfort.py diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes index 71efcfa3b..3073776fd 100644 --- a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes @@ -44,7 +44,7 @@ {2340}{Charm} {2341}{Curse of Despair} {2342}{Fell Flight} // not implemented -{2343}{Flee the Scence} +{2343}{Flee the Scene} {2344}{The Dead Walk} // not implemented {2345}{Voracious Dispelling} // not implemented {2346}{Walk Unseen} @@ -91,7 +91,7 @@ {7340} Charm {[Invocation] TBD!} // not implemented {7341} Curse of Despair {[Invocation] TBD!} {7342} Fell Flight {[Invocation] TBD!} // not implemented -{7343} Flee the Scence {[Invocation] TBD!} +{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!} diff --git a/tpdatasrc/tpgamefiles/mes/stat_ext.mes b/tpdatasrc/tpgamefiles/mes/stat_ext.mes index fea7aba0f..8b264ba3c 100644 --- a/tpdatasrc/tpgamefiles/mes/stat_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/stat_ext.mes @@ -245,7 +245,8 @@ Feats: Cleave, Power Attack {13016}Dragon Disciple{A descendant of dragonkind who uses their innate magical power as a catalyst to ignite their dragon blood. -Requirements: Level: 5 +Requirements: +Level: 5 Spellcasting: Ability to cast arcane spells without preparation.} diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py index dcbdc6edd..09856068e 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py @@ -49,7 +49,7 @@ def GetClassHelpTopic(): 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_scence, spell_hellrime_blast, + 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_hindering_blast,), 6: (spell_noxious_blast, spell_penetrating_blast, spell_repelling_blast, spell_vitriolic_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/partsys/warlock_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab index 4e4eee570..b580ec455 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab @@ -14,6 +14,9 @@ sp-Beguiling Influence emo particles 2 60 30 Node Pos bip01 head Sprite Po 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-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 diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes index 9df2a51bc..23e5173a6 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -42,7 +42,7 @@ {2340}{Charm} {2341}{Curse of Despair} {2342}{Fell Flight} // not implemented -{2343}{Flee the Scence} +{2343}{Flee the Scene} {2344}{The Dead Walk} // not implemented {2345}{Voracious Dispelling} // not implemented {2346}{Walk Unseen} @@ -88,7 +88,7 @@ {7340}{Charm} {7341}{Curse of Despair} {7342}{Fell Flight} // not implemented -{7343}{Flee the Scence} +{7343}{Flee the Scene} {7344}{The Dead Walk} // not implemented {7345}{Voracious Dispelling} // not implemented {7346}{Walk Unseen} @@ -134,7 +134,7 @@ {22340}{TAG_SPELLS_WARLOCK_CHARM} {22341}{TAG_SPELLS_CURSE_OF_DESPAIR} {22342}{TAG_SPELLS_FELL_FLIGHT} // not implemented -{22343}{TAG_SPELLS_FLEE_THE_SCENCE} +{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} 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..43c0baa11 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2347 - Cold Comfort.txt @@ -0,0 +1,16 @@ +School: Evocation +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/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/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_ignore_the_pyre.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_ignore_the_pyre.py index 76518716b..f3f8a25ca 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_ignore_the_pyre.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_ignore_the_pyre.py @@ -1,25 +1,15 @@ from toee import * import tpdp -from spell_utils import SpellPythonModifier +from spell_utils import SpellPythonModifier, getElementEnum print "Registering sp-Ignore the Pyre" -def getElementEnum(elementType): - mappingDict = { - D20DT_ACID: ACID, - D20DT_COLD: COLD, - D20DT_ELECTRICITY: ELECTRICITY, - D20DT_FIRE: FIRE, - D20DT_SONIC: SONIC - } - return mappingDict.get(elementType) - 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 - elementType = args.get_arg(3) - evt_obj.data1 = getElementEnum(elementType) + damageType = args.get_arg(3) + evt_obj.data1 = getElementEnum(damageType) return 0 def queryFireballOk(attachee, args, evt_obj): @@ -30,8 +20,8 @@ def queryFireballOk(attachee, args, evt_obj): evt_obj.return_val = 1 return 0 -ignoreThePyreSpell = SpellPythonModifier("sp-Ignore the Pyre", 5) # spellId, duration, bonusValue, elementType, empty -ignoreThePyreSpell.AddDamageResistance(passed_by_spell, passed_by_spell) # bonusValue, elementType +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() From 51f7e25dedb9738dd2694b3aad8aa46dcedec704 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 22 Mar 2022 12:40:08 +0100 Subject: [PATCH 122/146] Update spells_radial_menu_options_ext.mes added Cold Comfort options --- tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes b/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes index ca0d8d384..cd504b5bb 100644 --- a/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes +++ b/tpdatasrc/tpgamefiles/mes/spells_radial_menu_options_ext.mes @@ -50,3 +50,8 @@ {3061}{Fortitude} {3062}{Reflex} {3063}{Will} + +; Cold Comfort +{3070}{2} +{3071}{Cold} +{3072}{Fire} From 7f8a75e58360d5524e65a807b60586191486acb0 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 22 Mar 2022 12:46:55 +0100 Subject: [PATCH 123/146] Update warlock_help.tab Added Cold Comfort --- tpdatasrc/tpgamefiles/mes/help/warlock_help.tab | 1 + 1 file changed, 1 insertion(+) diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab index 8ab591e36..a3517585e 100644 --- a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -21,6 +21,7 @@ TAG_SPELLS_SICKENING_BLAST TAG_SPELLS TAG_INVOCATION_LEAST Sickening Blast ~Inv 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_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). From 3ee9b9164e75b6b5b8cc073944689ad662fca4a6 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 22 Mar 2022 12:49:21 +0100 Subject: [PATCH 124/146] Update tpgamefiles.dat --- tpdata/tpgamefiles.dat | Bin 3870116 -> 3872499 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 2bfd4482740f59e4b10d3a7d8e76f27bdcc2a38a..f1f193ac3b09bb8101cb4d0c94e8c4cca32ed4fa 100644 GIT binary patch delta 72471 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 delta 69627 zcmV(%K;pmit?U7$o9qFAgaL#Cgad>Ggaw2Kga?EOgb9QSgbRcWgbjoagb#!egb{=i zgcF1mgcXDqgcpPugc*bygd2n$gdKz)gdc<;gdv0?gd>C`ge8O~geQb3gein7ge!zB zge`--C$SsC~)kEQ@mV8 z9Q_5A65jm$B8;}Ll*zUwNlH|Tv9O4>-1p+L`&&NGo639eloU+n zi5J8WpV*49d0%LE{0_@497LF`ICNzMh9!3FNOxC;#p>X@;N>JY9dRQrX z6N48K18g>N!NDu1j<;h8n9fob7_T*)pE-Qyq7U& zo1&?f*hCUTl&6-Vbo#W2mIP^PQ~`Hhc3Md!{aMBxjm%cv`Ig=K}OLTcKl^XX6 z;yK}$arQjouW__s&483Lk}nk}d)@_v(TbmbTcd<6@UR=7Abohiv`l0KSfIH#&!xIF~erO-Af5ab)ru*NV>v z#%{*O2oCUp`fkU*VwGYp>n0*@TxjB@xLKMihxRgJwA{q$5OCJN);)}h?S6XI>D=}% zuewdzro87R^4dTy4qJ|B1SS z+-RKUv9A?1H&#W>33h+OG+;c~1*iBWk&+MF8OBl`yJfkNIB(mhYj$Cr8)ez*7(su} znHM;)5nFRI4nSk96_pK20r--BMg8ZwD=T||g9CJ2#6dlEc6Y4+;e}=4Ed>&#bKil0wjA_xzZ#v5?7RE zQ8C08$1Nl#1ahQ~K~dp@A4gn`k9vQS&E#_oym-A4R78jlnas!Vt8-Y$$d5DaTAlk>|WFK#hhxAD=a=2{c{!-S5~f$$uTHyF3011l$w`dN{c` z;sYXSvLusoxkqi><@02uLy5B_4~rF3NE8KTgK%6jEGvoZ8bsVD8EFZ`@}PhJ%BH|P zVo`}BlLT`%Kg*gJuOElc9tzQ^IZ z9v9UxE&(~OC1P2e3=$Fv8y(X;zQtEKf?g;w7YASo2^(bROk=EpG)Scb9^EGB=RPZtcHMmh;Ix4BvC;`kDr%>}%mZah_Qtn_7dY8liEdVh*s zQnxS#l4!5DB{a-5`9#p4=3=|HPS5QPPMV1GZH??IViJdGaWmRrmXE?I*Un4THh7j;yPRo!d}{4JD3lRM(qCT+4q3=bMI?65Xn~ zfeF4Qb`iz1h@+p2*z1$G|1H-YxNa~aRo!4*uwIcY?M6A3LDoKFNCpha48AT+Rd#go zLYZX7i+ZnrUhjz6pnKVET=s0Q(uEr*G@CGogEq?!YW}`!xF&LI*($Hk4d}?ptf)zZW58a1fjhEg?C3uR??CL zmqiMEkDWKJ@f+zLL_e$7V=>|x8hAD08r{l z!;O>as#c&$iP^*&G6$Udtghf(7Khgm@fT+8MTeZx2II(9y|&!blosqk(m=VGe4KD( zhdv7s4l2zK;P#MW)1Qid#ZzYLKc6dz$_PMo_U@!!)`J^F@jgi5H=>FBvBAQ=mRL;> zeFD0Xr4xVB0n@y3tY}*gSzjTA{+y0rq;l(*=^_Rb-Dh%Z#fx+jWFf%x!yG?ZnT5etBio;b@CbaEH^$uPy&60A(a~M|Gm_cta7`w}4A%K6<5mFCAUB3J~hoSbOfLKO5)J5Yx zlJSWJVPvokt^}D{vm`DDBZ&^(7Gi@&JmLadqD69aaWsuxl*BVroA^^*l9&T2YLYyX zOP4jv2Wb>V6snVuhDeHA%mSD5xe$&WNo`7oI^R~J;WE4`P%LuM0^s0zAQe1{kz-+1 zMz?=x8-*23HBHyFIB?EL)p*Unl~)Yoauz;2c;hT_IY`5Jt+46XSBr8}Y=q)nrXGBf zk~{94&VV%?jyPfke99L^Nn{g!F#~U8#I5_`0~aBKLI(+px}k%Fi!DTOq&K9@`|1F^ zP*X*!W$4EGhJiUUN**-6W`qHxA+SrjMZkZq_K|WGd(B~3O%?980*9o{gax#mA3?gB z$9aFHvh_dijnijWwYc59*wt#Ct7kdm@^IZ3S76`bi(3uqeO`6-M>y#8o9p()&0kSz zU9ZFj2VE{>Y;nt7*t=}GK)}qK$v9 zE-t17;%RQ_oZIXke)!XR{%HSx_huVeGUB#xGj6tf_^bW< z_{}z=c~<8~Z;M|iZ?+N)BW_FI+~!GPtbWz2_m>4QBcar@*iCk9Eta&xIOTuZXu1YN z6q+jOzT6o{nv@@MX6`vxTYx?gb95;QYbc1s7j=Dm3gk7>oX9G!EQYmgFTO z%&lBDEYQlR&))?MrRxQuAC}qnk`&_KQYHL-Y3lx-H)XY2>|UEk{g@3d;0Zx0&*6G{F0x!2hU|>8FdDZdH`=zy)=*ZaO#=4$IuTuc zQiet0e`aTd7}bUnMt&uJ*}_B?!W&X6Y=OTddO@~cEU@Q?qab5*!NiBvY`mW*g(D-u z#yCxyciuvLxn}80N%A_}+x1#Un9cH-+c^0Ze2e{GTI~L$48WWnqY?QV@X~fTnZwWuXCWsCd?%I71ms zcy@I~1ikjC6J!>j@4iU5Felqfxrln1F&K6-!L5y)kcOY81CxJ?quqzKqO3$w?H>t3 znpYvM$M(?;81lo{Ct~@#$Zf%ORGiZRSH^EMT&$3Y=(M(Fxd_wZtTayLv2S`QZWlz2 zd!8oq>`%Z-G3!93If=X8@=BY;`K8c1&dJb0EgVgBu=`jH!F7P1GPvAcw7aC=^Z9a9 zvJTw#NiS_RZwP;4=4Tq>&uecku{IL#1HhHxUzI*`s@VB|fhcyDh~fp<>i^d6bZ$>C8&@mX60?8ZX*9}`z1)1cPly}2k`rqX z#g~@A#~`djY{wRh%adv)d`~7SNw)gpBh%Azsp~Oc0y|OK%`5qAmY7F8_~2`ZsS2RQzf%NF zuAP`U)bfgKc{BpVfGDGLk;GTL<(R$I>F=9zIr)DTPAH9IiA)9y)r6dq)Wq=wNX#lk z9R|QiIJ&6lx_Jd0NDTR7#<4`;AXzG;P=a47dwyIc#Vt{brTle2wd2u>{NvO)JSut~ zbExr33o8{|+)58?`YEv`9RRZeAym4ekQ}dPUOkR+D8jYY|Hg8M&;#FglbQ5PNJ(ok ziVc4lxHD&OMVQ&w!ugtySRXV1A?a8&FF!BWh;!t&-e}PO1}!^qrNZG!>}52{xZ0AA zWO-y(ZCTnYNI1Zn#9U8Zsnd@;zI_A+$8-jbWKSg}czYaEb6xK}160w>uHE>>P!bz- z<0&mu?9UKyNvj%Xi9WXySztHCI+Vd}wl05At~z%rR0p~#(Gj_K;>DonJ&;oTpq8K; zw0hLO)#O?Mt=@CM({afj7YtDG4-x<}mx;A3MlptnILOg36f0d%-m2lo`N zRVD)3kS_)mAFpEZf>8&UF28)Cg}&;x2j8lLb|HB$1luKh^|`d&%Rt;xi;{+jiXng2 zPho)cf=2%(;14)vA$j>8Dv`4r)zg!>c=H?S^POh9)q8*X+_9`5 zJ3HrG2DPsPPi=q8FS+i+CRl?RTr9zSE>|eag`*ya+vj8%pX6)c!rW9Vsfy~mJ7pVz zU)KM*e0!m8AV_QhJFBQ`%F_mgX3sf#^Lp)OAVgjEsv{`h3-#EGo*|yub6g^<^IH0S}1pdpq zJnGV2$#&)@TS0Q-KXJbQ$s0hMReT*Y#^nE6>^5do?7cd&EQg5X%NL;V*OReL_W^(PFwCWeH0`aQQi9#k|U6x9wYp%f*%UNdMUX3kobPV|!v?f;<4>*Y>g?sY z%=!W&e2~TLf5&}pMP(eg30$1#MWyDkJ{WbOL(Tee-C^OHv~NFNE*-lWS*sOflR~0M zi>r8_xF{LkRT9Y8QAJ)~WtPRWNJ0)xsS=E~rW&wK8V6g5c=N@`8)*5->=#Qo{DFIr z3+P(ib5wtCYTo{%PMo;ieG;;kTn6Gf{}72M*}-*NTKwTkOY=|!hXTbMIGBjboH&}D zt6h$$$ZIyZR#|JliRZ{%lxy8@i0ALNO%5tme}MVj4lZw7omOMeqa_$T$x3>;uLgs( z0+QEB*oHl~o|I-*?HXH6w#D_eL{h=Rc{DDe;HOG#0E$$p0!-{WY9SFXqP|qvO;?)Zx+$A-%yoZLTX5RGxL}v*62G~93bAeL3a}EpS-OO7 zne*6JhgpQXbzkCdaE}svs3J&A=k%)g?a8(0zXC`4et6pdr&+vMz3k26`?ST93`Mcc zV|>q-D@pn~yYV^m7ip9$Ay!LWAxI_fMdeV8VT8$LvAN=+4u>Cds3LH2*1 z4${{*1VmF@*MQ5D5g&+R+!Dov>(SIJ!R1xA-$I~XOGg!~F*sd?2{h-vQt{5k0&ZlE zhr#?*kl}tRT?$Lu(SKr;Q1c{jB2mPAxjs=gOi}+@%Dk``hXQLle?QL#KoFm~ry{TO zfK+z+$47NI^OY9D%wC%)eGM1~M5=#a#!sZ;mlhi(ED+=`FzKBAd!=R^myU*P1}e&@ zhmJM-Pfi|r7?x(6i0Ogj^D*U=?P(~Nl55*`?Xh(I-Dyg9!`CXNu}*TJ*~HOZ2D5F~ z4}V8&c0z)Oxnz&UHR@0yVpFPG@Firvwjl=#EiI#G`)1^tzH!_tc+N8B)YO0Xw99zt z`w3W#mFWnowe-rh2TCRs7)kOA(-@N+py~gCsKUK;F~b>;iE7a}-mm4?sue-=W?Z?F zLYU=H-DR|DF>f7Xk#m#fB?0?G8G;fNCQpLRiTd(3l=iqo?7j7MqRZVBa0+UQE8uW* zthu#7+>EhhE##u-wl(p1rRslqZqPaRjrHuj4RgT9^|x5*=TD~2JI7Dob*0~zlIfj~ z2fG{ZL}Pm$30<1wl-o=l5;`xjIWs5r(CRSr1(3n~Xx9OH*72UH&82Py|ttoZ&zl>;h| z@o`JG{*RBbTs+{~j|Ko#v*vbXhmy0Pg#3yZLmUQ|vE^x46lOw~ro2(3$ zJ+du8lrJRvKjZeXaOHm%=l^?eA=^BY6;pCaBDU%{Z#N^qz<69MEnTgmE!ieGDb#CS z;;@m-9E+{$*V;$R#L?g7Ha+3R4n&QG*;uQ$m&imz487U`(oN8aqs3 zK_tcI(0gC5HC|pIF}EbDxTU!!89%&wxjLt=lNMKpE2!(uux3 zYZfb|gW2LK#0eu|InnGxIoYN#f^1*Gdh@GT+&d(ycDM75I^Qx*+pU8-3YvNF9dsuf z?w}iqr4}xF!%pmL9)e&PMfbo!pvzpBxks$9jTM&zx35~GhIwF2LZYIuCMnFx=9r>7 zf{e-gXsC?-YN>xa5=12%D2$BhRu|+hta19jfi;>{sd6viw#U_V4RrP1g=}4Of4oe3 zPj?2V7VFmg+5lza3`tLHSVNAw)MNzn;0!_{9j}a3=@=-{ta4fxf*gW>8 zFjE*i(wl$xd6SZ5s5orh^7LqHVnEE&n%{~&LkjsbOFyxihf!!XE#Do#mF&*0>b)j0 z&WpAVMchnmTr8ikeBp=Qj>A4BDT9j8Z+oJ0XMP?YHrEcFD{R< zC5;@HiAmXmRHt*L2#DI6t-~hIM8C*|Eki*K$r=t8E9IbRR}P|9>)-zEU;pKQ0~VJw zySGemFu9F?+Q_zk_My&y=<{-7SBM>)#FJ#d91L=-6D~do#yhpkMG4fH9t(-BiwX1K z-+sQex+NsQm}DlYWcHq#nn|QqU)K88eKr01hv9X-*XlMtItP9HrPJ*+x;<;yXw@CZ zat;m-uHDEF$9M6;c^CyEoCsIM>0CyEo1~HJi;*9HhMuniS;d=$9xP%h?_!aJV&=w) zj6^b(0^cY}RK+3=Q~y{D0$<%p{3RO8NJg;;Be77wyO9@H z#bO!?cRr6ocRUqtG=Fk!}=+ zGbua?Qp^-as*vXO#Dor+&0E|h4o39C`x$+o#C(_{*+EvlfRId!<4UDcFEB8=#}~77tVtTXI6xF) z9mOPZy?Ys8Cq#g`8zoEO#)J&RwH4FE0$lZu#U;Kp^D%9GHB*W7Xgb=TJ5s(%6qX!^ zGfap#Ko74>EX00%IcBcFTGoN$Q*KyijP>c_~2WATzU*3 zs9S6U53izdLZS*-99}CL_Tb0>L}`bKx;M)@R>!f1?QY-xl@@+*m~pgQ^Zv?ewHm$p zMW5ad=xgRlQ{JnwnPbpyf>=x@aTTfnKmjZ)QdKQ^Fa7u8R6G|rFeJcJ6D6aJv=@@3 z8my`OqtR{-8<%#g*|Rz~|M?$(PqK%#c5~2fe_H8kQN+N1ZzAA;x5I2K4CI&kBrWS# zt2I3Db_TEkH#G193Q#4fXO4Q&?e*>cplRKJRBlGZ&Chyr;>*waZO^)BS$}`xgKH2^ zzq__utsR3aHBtKKf0E}f#XkS+7`Xivo}N}tH=fnL*=nyUuQqqE?`pMwFMP-Az21EG z4cB{JdGnpuJKKD==W?fC_6|?qRDRifCjQ`ZJ63zU@$Bs6NpOD6QfHNSU%Aw)FMG#p z)n2YY`{m>bDcG^nqYM2~snyn>y*+snj$gUd>H4#GCr=`A2UxefqU~2|ufF*@`BJaf zMDXRwlW6~%mEKiqZ`P%My>_x2e>((k`zyW9+4?%CCp)nBMT;pS?QS z0c#RC@ddA#_?6nb^=Ge7b^z_`7CC)ce)8sI2gJT`38wr`7wg)pUv)dfdavE>4X=9L z3--41fEf;#bmu0Pt4D}y*x6KLC4=!YkDL)$NOJAYyuv6=C`#2Y;;BNI6Cdw9g#~BQ?l&&ssn?zU`Vp)wOgg79=>U5`j1wWg z(P7E55S99fWP@02#8$^*6*#)=OvY%14y<<2=UfI34{4Zqbr@ zG=eJ?CoXn>L<~!&d9H{9J#hu-nZT9vEzAIoF#{_N0-z5edX^(F^cqj)SZBNNDjHL& zXMItu8Ha{u7`Gulj{t>vWbi@L^P!+9+A?uW9F>k=|OF-|QgqFy~#Hkz2a1oAw(^wpqmpCc_m%eB=IAg*3t{@%w zPEponc?49);aItp4Km{S==MiTae7?LQ&FOfjzjhm(nQ+#XqMf5Q zK3Fa0kv=2h%p*xTDgykN;m>JC5>Jhp1!-l@T~5kbN-u-}1(dtfIi-0BF`<7+^T@f3 zl2Ao|teA`*tpW)X%2t>}*D6f;isajETS=3TrDqMYU7Z@_Gm!{zhBvcBAZ9q9hf$J$1^_J!TVYB%C~x{3B@zpI z(~O8x6#${0&Uq5s@&6*d$SeklN_?HWbVVs2rnLksq;xz6&tdqW3^ajDXPgj;74d}e zPKilvh89!hYlV7;r8hQebQ0%VvEg-Aj;CQ5%PfglUQ=UCL774NvF6OZW8xR~y6rT7 zRX*o^s60b;{^&8X??S-i>RP0Mj~$dZj43=Bk0Ukb&ET6cqm3wv&k|__aRCEaUb&>W z8Mr!qzuFJ6F}IQUOUX7u_w+d%e!o&|B}$S~Q;GHom@^o8L~|mZeNGdrdpJEoQnJa< zi$)lmY)oC4_L-aK36F)tN#kvj!USZ0jXh3MO@WP~hp`VPODrZ)I4c-Gt;R{SbDAE5 zp_?+Lzwu33`O{Zb0^x#Y!vA@kwn{9Ha+dmB8p%yoW>ATE+YVGE)JD)h#r6Q^wxRemid{m-;D?DEE zPzZta=oWS@;dfXbn&+-4WFvX20^{%AWr=7OgP`aJQ4vc~6@;XBl$Rrb7jkoWx8ji3 zh3&1!1uovYG(SToX6s@6@jx!hXLHE`n#};B-=T|u%0Br`?U0vI4oqQ6E+@3*rqbrj3wN)-SfF<8FrXp z61ikkma(bKYc1LmX|KVQTnYoTN)OepNK%=|1`#-HBF-|ucD?qNFRT%;)&3b@1rj=e zNeYt9p@&o=@;sG!zkFt`Sl3UjF)=o}TS&!c(KCjT0pJmDx>nnF*ZGHkJNEx&RQm%* zS`(!(%B0DhYF}P#o8kvNU#=>!1Zj#R$isySNI_T0rjfQP)Cf0p;0_aMJW6drCXmw< z@5fUeXT$}mhLmFdT{#M@h=Ac(?X{;>`LRd+~ z=9MltRoTCBjZtfrN@eALO^X)v%lpbhi}6|Tva{k}=8+FuR^92}&`1XG?xBuj^)U8> zLBp=WA9@G_cytq7**UaX?|s}|f@@lRtI;2}>mTgKdI-^!3Gs`|ga_wj8#Im*aSBds zMLIcVp8iamN)zvEPG>QVxKwL?4ErnEiDwQOUuE~!>)5q5>{-o!L4!`av3(tN_N14x zbA7-SKsX~FIf%TgVmpGi#1rHGo1*?G^p?dlBK8a^hm(1CjOO`t8FTh0a~yHbSCLmp zgfK>{Z2o9+6Awq(&P45G96|! zC$4Fqo^m41-kXzu2CZmEBv)C^ruJ?(#V>5D)3lvS(A=?G_)EiDC;A115|PLhWRIZ< zD1lOj&f9HDQmZ>+NfNRdwHyL zKs$R`LNBMkia6zzULibsBV0bMcD0g4nAx{gFrG#H%Q-cFxMPJNmn5btxTyx1;jGU@ zMY3wLt$`YU8@w>A=u5Uj2qI${R5i=ZyoJr=aR!^CTd9eC`f?j;HIE7(BSOlK!i(Z4 zy6cDHY2E?#Eb*F#@Z6N)Y|C%!HwOpXjLLe(`(b4RcDBP5(nU8F)6nr?45w*XFuc7H zrZo|8sUn6Ud{ z8dn^hNb6G~?Y-z=or(_SR#z7W9_1x@i7Xd!!qBVa&NvT<+ir=P`>(6a+1m@9H-!VW$6;CD?rKW z7EN7$7AVWAHd?PB&&ovC8c#4M~4eahqTai zE={aB8>F-0R6NoiN)`H%ay%x@N&~X0(F2!_G)?;50iaUv_v?+1H|A4HJ}w1i$En>* z6qd`hHl0bwzeyrzb6R;Tr8xt|oq($n!6RCKv1NZDT3hPhX#MlhdS=i{Ez)afB|`sn zXr*)f$q2>Y>%A|q+u)fSeS3udxJLZkaxUx5?zP?du#eNjcKlq%Q`gfT;nzDphdC20 zUEuwR?fH4nZaaP0^8INTsac$mivFGyeD%Xp@S2uQJwn0Ax1ZE*!8G?nQT?r?{MtKN2{}^?W6$?mm$Bm;rwy6R=w34 zI+jHgv_6?DC_4#Q$Fz==w4Sw;@z0TRIejgrKzJ1=Bxway~gDY=jtAud6?gSQR?<@ zOg9>4>gbLzU(P6_>w%fs)U>pz>vK|#ZjwcEDyc33$xh*^Qx(}CNhF27;F z9&N{8%fOvm9|m@d@L+c?T7x{by%QAYd~uNoYX=iQ%v`zoi#5R#J?PN zFNXa~YuF)&Zx7y*vY%!!?~v2?O?X@TR;E?_5&hU0^c;&Q*0h|fy4~BuuWJBL+zZl_ z@!VC>H=)*_?#ErpXy(#%A~Uw)kP5$v{G1%Edna_YkIRIG`+bj*G?N#9s)#1#4lOM& zh{6_-hB1>Z<@&bn*`|hoUhBgn#ARvL-C>}<}z^ogzq6gnAW{0^nFuc);X48uS?e(A9qry_&h{x z`pg-2uK|-m56C2$i4 z{5tL%h^XJbN=adV(?zZuj~+}O*fd@k2-Z6vtftXYpbzWNoD&Y;H!7*ooUhKMZMB-L zNw>P5z9e7;fLr7$pC_IZRw$KC`^RHMMZCXN9hn~9Y3Yus{rFfMX0`!*0u@JD%M1qT z1UdkojW#{fG?$s^s0>Poo5g;O)37?$9(MY|m%1kIV1D_3b6Dw8-1ikuD`^zCl{0D) z2PB(e7?lvvwA)t4;f|?pw|7%$Nng8HQo4AfuV4Y+*)M@m^Y@f~XXWtpjhKMb&jtVg zzxPXNvxAH4($&e`qdpm;?<|#K0vf@ z1N{>?#vVL0{M_q1IWiNph*7?dAg2}`4?x54$BmdKq z?mX7NMnjVH*G>RE660%EbLRfeCiynIr|?K6ujxqg%4*t~HBMWRS{~$n!8~kM<{ItU5 z;=gf9b)S0{a6#ed1n2R}d!T#(X24@o&RM*ywSl?Ns+~-tudN5NaFnzxF$HtaST?u8#1{w|gZQ$D-spKZ@xRo+)ug7xDvtxfY{j#G(vC zd!JO|)Qx68mp^#oZ;O?;W(>1Zrg$oKnCH}2IXcrcmH*~LznH+|;-g9K33jix=3dBu zIaFH0;PUfj|Aa28-O{o7hY_GK6aIBRea$Ru%yRSE$_r1<>Do+?|Hj6#=yF8PKRAg$ z(LE58j~Q#1t>8;6!bnFL1VYY5%|tt-=Js+}#&{XF!C1QQq64xOG&x+F(g zcbHMCA)0Y=fHJG(VVY~+tDW#~LF8T?=&DaF&OSCF7+pJNuXd{4$%0dweFVh+Kb*8m zrMIgTF~pdENadi+v~87Vq$x>*VO{?3`(#gI%`n5nzPN0u)vbQr>i2wb@F+~8qZwVR zCmjhVwW649WMt;Q+xPF@zdJafQN~F^w<6_VD;G&@q>H9>mI&);G!+>KPGGj^_6`r1 zi?ZQzz1|7d;aiwuy}Mjo$(VI+VXo&(LL{Xf$uvs_IA!HHUK^M6tuY`C-$Xody=fVm z3u{?Lua_aNF*$!GNK@V&mnAD@yfeB`UNsFIA z;XF5%JqUk8wwaK{xak9eOF!5ylNByacjyC+%cRI*6m05Vk{0OuQu z9Ic+xP}<`0G#>zL-eU=~J}^7iNsQ5!jQNF^wE&&8C2HXnX=AmjC63 z8!eB3>-9uwvj*bs#dsJ3ei)XBV{z=~f0ZZ}-^+gsKj^Da6U;QHbF2yH1lY(;g#!s&H6X+k*PS>w?^*qbWsy+c^EPl?udaDje$#rHe7 z@jVs_fgN14+0h|g-FY~FGH7m}uE!(-gIMBY;)%|2nxXB?3kHFsJ1v#_4LC+jMU_>q z@%O;T9)Ws2-vj7ThJ5S{CA4)Vgq)+5oZAKth(4-{zDCrc11ZpfTg5?tRit5a7_?VO zEp8PE?N%osxAK8T3^Zl)MbU+!%&Z=b(HI1cSeBmK9Y_C^Nytrus@v$+kyiGqLAzY6;oHAoaCe>L*HHo=f!tdQ zO%KmxTwRL(4Sf2-uF2S0ETPf{JPaln1lV#hJ!=qulD3L39Eby1csKVv_r4B$6s=b9 z;aoPt+V{)FkVa874%z6B@i=_dx(q5Ahld@>pwe;pA@)^w)Y&-P*FrlgMn6U%J7Koy zW>3uM#M@&={}iNZp#nZ;{O_s?g$aNP&9;Y~HVzN7Ct<*?w$Rf+Q8p3$B zDvlm(O~_Nd+FH&-r@k-0*jj$JwW+|_|D73sfo;VO!S(I*qx1dhL|ZZKk(W!ZE5lk= zjQfL?#6!?bdm=ggV=u@53OIP$#avyJ(@2(mpNRPnxlaRut0>nuycJXfJp(jB(aUpM zO4~{4!>yFccq;tg_ndn(W!dF|p6!j;=nk+_Qs(`>=iW^5{JFVlZEHT-(gpLjHm_WN zyL7HHM+Yxny!iXyo{bEFrn?HQ!}j_5wgqqI{5x-o1)HcWj65p#@>N{mfYOb zT_Iy&`ZKPt!1XLH3VwgJ{#)0E&V1NV4SsKI#+TnjiJgGqo3?JsqE_-Ndjh_FXAMi{bp&ye9~pNIwqq2 z6fhZ7^}4s#GrTFIeC_N7FIL$ck6`x3*D~8VIHrtmD?gRx&cW|jUqqWaC#$Y;ld{+K z`3YrLXSR(qfXffAwWY5_w&!PYRr7n5*`~6s&U+q*v3}CaIXL~aYIX#Fc}{H=b`_U< zLDOn%QNWU9fr}%NkNKbr3iDs;(wTZ{UfH%S93L7}M_sUyk&9zW4eAe3tQTr?lLAl3 z^=VW+ynQ(^r;D>V9%w-3RsTHrxpr=WVL1K`ED21Asa}AqU+{JX)7m@^rv8cF=F_}( zmH*xw$p!e+)kyzGOv2F^OYr!)o2;TAoBsx{z8Cpr?}Fy0tN7A4mt4IuV*$Ijz`Zdh z0e^4tDn^5N#TbAP5a-kwFuO^2#rtRPny6Fp`u5#2JuOcDrjA$Q*u78dfA{0$+H1WS zrwj4l&o*-pJ@=TNdo1t^py>#!ysali1W89nG^K7fK|G2BSom#K7lmGqkLYPdVczU3sHQ;j05X79nd6K^Jl{jcKGJmF8 z@XX-7Bieb})YVL~MVt&wznudIEq!oXiocpn8h7U*%(~h#fD;6%nqV zAR&iHj+u0=DZC` z22auWg7sou`4SX?Q!{HI3xAXO)`N3-wPQUuYv88&p)pW>(a~NpR~Hrl$#sW$X_bf+ zpmEw2Y7Z^a4^g*>590I)!(9KwGrg)Y0cP&h-BKv`Zl~Yl=ctYWsf2-@6Ce30e^eqmsrvv0v8n9 zcx;|&Ic^H-id0~l#%3N5OzNrw!H_gw5B5$7nIpdPv8z0%3#x2TUQbb#bw#_ zvX(Z|!TzmEP+3R527e>)mX`dDAM)37YNO7TXuPc_2+ta@G+HsZae`Bm*ZIuF_aT9+ zhFVs})9YkDqcL_6d{V-}dwaCvp7I|s3=Be(l0`eac&s$u=q&j!BqY?yRDZ=C3inun0`5nQ-X zv4Xg)Z4gxGkAED%%d7_%b-Pb?yRyN$<6b!DYeOt!1ks38EW*vAfnMWccOL%LO<*34 ztsH98dO8jBx^71)Ud@4M@Dj+O0N&RHqs9+J^cs~YklB-|D=p;w060L$zf_+6DzMHx z(V;_xe~_GerUQzANv2BXqVm(&D0ENN14N?Rd1Fhi>ZhOoOo)FP3ihkl5aTv}7b6Ov zk)H{Y3C0=?M&MMtebi>C+AQ+)6Nyc*7fZ9q3v+!pmdd zai91i0lfsbva2u4uA*Ks$)fgwQ4B0EY-5WRq&SKaQsLZz^B)RE@;)B_P$O#G_`(T% zQ#&2SDCH`IS%iPRg=^AszPj_lOE_Eo*ql%3>l@&2233G)kLEo{`oUQ-ER_X9eIH8Y z(Irr2GvUyjUK>*=Wl?~v15poe$P`RgaWMr%0-qS4C62=0a@zMEJ2vin<`ylJiG~Pf z;O(S)ux-|l$HQa+$=2ZBsopSs0)&=N_fWURN$wi+Y-Y}lgUfy0qktJVpUfM(8SzT zf#hN36cZP0@v+)+VEs?x$p;W}Xw5R~R?#&8k#8R4$vMqa1~0!$%#qE5O}{vfDX z-4f@(MOJ+!gfIYkwVHv7y7xuUtR4+J0(c3OFi?^OR?%eDHFy3Fl0j;M20D-|O2Dm& zcqJ5DNst$U!ihYybg+M0 zvA2NdwXn3raHw@P38cwIdRvl9;O+-PJNQw<>pv(~?Sw^uGy-3m2Vx-sl@q)G=qJ;~ zeo*VOdFB7;1^`-85gm8Jz|jn$mtfz5b`+uS?+moy^%kT)k$N2gvw*}k-$YWC^fZ4h zAa1*;e)^~ZOcQX9CU6Az7_>;uuwQ@Lw{(AI44T+UVZrIAD4C$X^e$per+3|VU|lbn zkg6J<4Ma}6$8CajTKx2+c0AgC^a41Bm3UVYXUJSFGJpqw#Fr#l$-T!p?!WEDbaPc4_9~0{TVY5)*zPlF?F%6E^$Mc-Hsl; zp#r3X;hxh64X7Q3NXkQHSnv#lX1slFP7y@|OJHwDq^}EKPDbXRUAccyiSDb8dtikE zx8J5Qn;n}!9hAOEox6mq1LH%4^hXwA1CnW!6rhVn<3$-$#P$SbwIMx~U9Z1rV;c_s zFCFsHKtHh!{`bhIYuT~VZtA03RSo2}&W@p|`UT{>#lrhy=w`YL}}*looFD(rW|#9|Xk zYF5S&yr6zu;r&?$3=ce&xe5slqb%bLJQ~t1eUNVC9=Ux4p0&$qS0H$?ACX|gv*Vn? zyP=8*1aI-|wGUG2U%NYxtbFmfJP6VTf*|oHO|JRo*^X3B*6Cc~{lUS<-@cgFzkT@i z<6Cp{+ixEa4$OZQ@!lPaN2GTa_R_x7GduKvtEL@E5S66Mq)*g}K)<9k6JD?z0#V!W z6rak{GZ2)(P{J7NuRSu_Lbz2Hjg|VZEcqj;w|9^ zEXoRrFX9_Rxt*@l`OEt&Q}&0ha>O0 z5d&KZvZbB2He)Mn4&;t^0IdLa{dC3m7vez#%X=J>ZCj8st2nT0O0uDGIob*8m#_?; zkz)Ah+c>Ng2$vYm01${|#I$Mo-)dzl=gsC@!A8+9Lp#(pd3 z(hkjV=aYXMVr)Lql=1ArB5q*(l+#V*dC2j`3|>nfK@g&ynk#X-$o-902`^cWV7QGA zU!^?<)}SB|$_kjX8M1r6-Z^m#)5u*wOvu?Np-SaGG?|OjbV2jIXB6S-Mzu3YMjS{A zE=Z(hU%REDfJ@(|=%kZrKXi{^q@nbZOsk#4MxlSKJ<($5MEx!~jEfC*sl|qNf3c3o zhrwF~jKJQ7@9Wt%6)nTMtF*Tpb4`^|45WfifEOA4clIwEyO13@F$+fGO63s-2Uhp6 zt@__l|0mZ>dF1kBWWIDHdSDCJ+|Z;is9ZL=h}a^y?QnUy-aRf2IRp}~DLo#p@)l%w_! z&~f2nil>>pGWvf+kL3h%!&oH_COx05x4*L>Jkfzx2Y|B*gkJ)j zrnYRDAT>!(J@~TYp|uJsg(y@djPy} zb-EsYC-R8hR2teD9`yKl?pWJNJYF~^Gw>1}dr~*tC`mmE%|lWb1CCbvs+@nFl(K`J zMhY>;N25O34B&>=PoLeiaNpS=+sQfW-aF3LTi?Fi{{~@5WO5dTTo8;XfiMbDaROwl zn-cKDSP;AK(kh@@Y1pz=JZNTe$Af$D>3G+~=iFL&+}wxo_z8TDU!G91Pam`H81YDv zmGe-m!ws9~>-de%{j0i(*%E(MCpUOOVcO&c)!dk6#mZ;lFz!}jZN%HuBfFFZLr|<< z>HDFZPCJd{C`szB*u&OUN~7w@0`91O9%h=`y7gHyy^Hnm1ET(GBF-C6Z*3d&gb~{+ zgtt`!cHB^Qnb;x(r@OPZlGXq_M1_SxO7nA59#m3ttz0wGttUx8y3~JQHn5n4Hk??t zhFrdp`N??Qf48*xf{8H9vBNr-qa3<#LSGOPWY^dB9RqnZN|oQg#2zhkq#LHko-6J~ z@*EL6?*M(=a9}S?M04lsLN-7i#*Np%Jb(T1`Nv;I{Pv^eH&xC&I~_^V+`$stxvsa? zw{jGcZzGQ9Fru%A(RP0i%r|B=Hf1BV{|FIDX!GS`-5R!pg&3E=ltE65QlrW{-AH{> z$>~V3z?m)GQ~hkpvIYE-UAa2wM<%J5*i%zUYih#aGxu@=&>|=m61RE{Z1(bPuVsCx zk=!6It>u!~|7fsn=(H#h-CwRBd@H71qBPnA*D0kGT_>Tv9?pMEYVOygi0@|79pXcJ zBt~GM;8-pCYupoqa+NDr!;HQ!QM|HvPpdHVN*ZX-&PHZCc)r&9MWT($6hqYy8$dz| z!9p)~Wukm?H5G3cTj^IAuhTbySYi@?>KeO9EO%m>LCd8p&&^o5CNhrK!%q>#Jcp&8apk1$ixPiy#;%J}_yqlbvXH4Nq85-Zxp}7pMV%Ec~LVOPj5D@m3SU zuNCo#+WvpV2A_;k4c`eu>zz>%`5Dl^fFDG(BPOy-G!M@EDPs%Oz zC|67Ds=eG8wNkH1lmN)=_CemqT1V`8KuS(ag-s(V8e8dI%%5)j>hdRT#%rRE*y4b_hq+%Q>U-WVkJb;rf#oM%u`MdQ zv%K?`y;UFKrVOAYt#k{1(KVs-Z3LnS*QI|gD~ zLj+&cK~L=hfS1~^CJ_;k6sx}e2y)0b<^b4)Q#wF9kBrDtVx#PUiyJ-4RbzOP}9|tv)&oHN6!<9UCx$%m^UU zR^6Q2gB+P@sE=i!9K^sBsU@N@;MTc?oThY=ejlrF2O9)&KU;ng+kL3zDAnm`xV>_! zJMZT5@Mo>&M{wFGev_f_houX<-OGRaVMioMotvb#VjlYBVFLR%Orx-MM+z3jPyH^Q z>35&}%x`c>aI5>G{Jw&wZO{>{u4e1s!PsRm z9dmujj}A6%rTCTX=^3Q8TR@nH|Ng}8tkR$clHZ2#Bl+>TG5qgPdmOPl&Sg?bRt_yE zAS?fNZGUM{^56z8P|?hAyCC>PtD^4RUz@h8gqf{fhr_5q9qwCQXDoC#$li6`?Ah?i zc*I_u&`;TLyP&6=prcLDvrW)(8x$Tr-+uIB`_akvqw&GZtw-bDqZZ2H&rzQK9OdZe zD9?V5a(pk!2Kw`dp}%+-`pJXP4-bAF9f6%LQ-8(|(C^TVP=HYpQ6G@LNG)U!V<+Wc zMpN?@=3hR+oYI|^$H83vPUaU<+^!d*i*;OW57q8KqtB<@eiFuw7G3&RcA z*nd6PV?QqWsj6Is8mkcW8g--3gw3Qt5QrV78V;+BjX*Y%F|+tC<)g0S?D|T{*PAm`u`; za)TXiLmusQ)GMXUcoX$*Rdmtn_Yv9xJAahjg?+z86>c@_Km z=*{1*t}Co|;L|6pQ(Gy|-<^HDy*l4c++>`;>&MCO?}b1WF~W$y+o7KPeou9}5PvdX zJ8Sg%zTD~EONC$Q{nk?~kf&)nL2e<23SL4bG6MBLr z6Wit?6Q0o2gqDFW^$TZN=LW9}Y=4|EiDFu%Yle9UZp5g_T;+8kSYqDJvC7)HlQ0o% zj%5N3gmLR5&!J*~F0ub=VNI;Opb69}|5sp*PfM}bq}vQ^5Lzw!jqkT#C`aIjVE_JC zf2fuIrB+00`g{tU4dn@TrKTGG{`$>B$thE}$_LY8aH)W5pD!>NC&S>CZ-2i!8&31R zawH9pt;nN*?=axD*RMqox4!oNj{+AI&5Ho(PbGN7jz;Vl!^Q}~gCD@gPx12%KLC#b zKRo!h8TqhQi{CGo1KjRC|L(h>8!9T6LD8zEyuzBY!T693dY)7^gX>jqY#kBx=2J^A zd5`d8Ht2nV2~bYhpzryGlz-<*QoZ=O2fw<;i4a;oVpj3lIs-h6uHTeiDQ8RM^QSwf`_A$qyI8KEFS_aYM>XMYYHIMBi?>}9o1 zp5^WtFVn8wIXwKAl4#VzTvvDZ)iiJ{(^E%jIrsmsPHq+`gCt2ImY3gMKN zc~xg9Hvc)}6p&Q8OO9{8b9z;N$ zCuc^mQ$i%dH!jliR)4={?=fH&OJVGOov>kqAi>KyDAoz4O)Bzr_yq}dSBI|c1T}GR zrzIahW%_98269!vQ$F!ksh%$Tg!&#E{{W4le4-(Rih3c)7x z9{ovC3>~|r%_~{1cfQ+K_0Xw>tA9Y=pE7zVs32D=Ho{e?(RaUj& zB@u4#$z_GWM1RHjlFO9#jB@MqM>TY7CZhrw_bSn!$D{Brbv;g!u$ubpvdy^Go9)|D zymQ6>M~V+Fu`yORb{l-3;4p-G!pEV9hU(CV#%X_VNYgs^(OO;tSu~Z#Ry_h;>Pz)K zsN-?}BXfN%e)+l)e;_KU^2#OD)j==YQBR+9E4H5FE!cK~SPG=KPKx z^l=-oMNh#Vz>8dGXg0K+t-~ws_it07-!_J&zySVjhU$w4`f_)J&zQiapb;7-0PkGzaE#{!tuAjXIq-?X)8aUR4<3V zEIwo^ym#+ApNshJrYJA+K%km^HyKFswR~2^&FbvmmtZu0`Y<63Su8=8uL-mQO*q^RK7MLzaKaC&K@(M?H z0}wiL^zCp+eP3TpRYjQjhw3bT^Ox);ohwp$ChGQ*i{au1??{hxn!NxDQuV0%EqUiq zjNkh2surV-hMEE0G8-M91a-9JvNa7y&B9}};wX~nZY7F;g69MC!N5O%I!qb$&jax> z1Rm7O%?3%QVu1{8&8kLU5LMkD=!IalDfX^;y<6MvV_oOj*N$zkdA?FJ^ShY$cEGt- zjRz;7C1ZwPTgvhL-IJH$FCClKqr4N8%pa!hda(t*q$6K&<>_<$_%=&<$Eww(O`HCI z@~5KzkWrfI6v{nx78b^>KmMaOqKd6kW#rJ;_4P~q22v+X0^(js~e@Az4~_!wZaORTiD zB4jii2YtLbkBTMA=BQY5bT1amLZ36SgqB|11~P)|O53My2sa5&dy&}bWK|AKJv}@O zxh3o{~~!OoYLD$@cr&P{cdGRCH~wGVFOH ztt*5yGxI*Cos~MQ9W<{Fw_2zRMNYtM? zigdDs9U7Mf;1Wu~V?f6PU`j@%RMAwTd7iD1HU6LY1P1E6%+1!tlww~);wm+5bd~ex9Nluf#&?OC2 zEf;mrcdA=CSG0>=z9fNrrKKH@AQ-ETVa#c?G9TNA;#HTAy*%Ic%lRpMKLMdC2eG$h z#WS2se_fNJI24BOr)vHKcXQc((4Cn}Bta=7SOj!uZzxLAE!7AXAJaSA<$vE3h1EC) z@y3}>-W+q@_vGn*deYWWk>;Cs&CY)1o2W|iOygO-E5CmE`sL|KBWYYD)n=66=lM?kedt0tO`~7@wp6x;lqJtLf7&vH z_N^j$+g7i2dg;p$`e(`Joo7k*CT&2!6JBnkIRD_Wv;!Saiey(-(5ZcQ@pdRD)K#K2j4ABZFay7%A_GR6Br11s#7y%#ZkC}} z#`*E&GAX$q--9M`T*D_DoUQ|;F+1HF(7XDnim~62G`c&sej~otg(vk)l#q# z7oq{ilYi@iE0xdStNoVc#mR`}fA2!r09!}_e53$A>I;0N06w}6d~_T5s5kIYZ{UMe zL35;{Ia1Obsc4QAG)Irn9NnfldVuEW0h%Kf&CvriN4;r|9-=wwO>@+j=IAk+gT8~= zsEgUCi`huYY@}p1y3K5)U^eQAo=y*^*GoLPD`;`{pd1P=oo0Ml-yvfu9Yp)r=&~%*MnG7?g3> zs^2B2zvOQfHfM(Iw1str#&t+5dA=>7_F3|BTY_D8(Q!X?`_z;gE22I&l>M?idph&2 zfJ&wgWy6?l&WU3?Q&}V%e>5R%W?*+su&k0Tnt1kt`CyMMl1-YyC+My;FIQi;7VVxd zrS4cZ%5nd)Pw8LO{w_&8BL3}D`iFFGW&57(Qro!-hA% zTU-ur0>yi@GLq9=5{LMn;rBUtm9XKE^E|0fT}5sz7R0-INS*;qf4~yk?RU-b;A(!R zfql%_b}SkY$84YDcz89j#PDaKYlZ%dgpPPFtxz`lm<>$!Hx{~UC!~QnZ-rMVaeU8R z!j!BHPejwIWFILpmMk=Gm7c=f=6|Fz^A%a4LB zfr;MQpz{s` zIahn?xZcU!Q?x8GYed^EQ(k~KSTf1W*amad9wJ89od zrtTZXRuaEDcFuOLbJOc^Xc3ZFQ>02#c6Dj`x4-=W2!J0FWjh~zmrSRY$i-r@SS(7_7BoN_jo}{^Wz09Xc{3;2;aVXO-zZes6BBciS>z7}sPx(BU zD}Y5FMqwVx%!2yze~WGLLIT)Sifk^UXeSe~Ka+x5gn7nKy)gLli$IR~+bIBa=+kk~ zefs4W0{+q0VZ4}$1M0JXfe&8$qidNLuzf}*0gPLvGGC;zm;l25MCKm9pUEr=W7P%X z>>{B>_dm#G9R&(kmBRjFK9^~y+fRX&{z!JV#8yvid0Q^pe@lPTfO6|{@WQ)zJv=$N z@ZP@L>W`Cj=BrVaiK&pjQ2V49`Ms}0$#NO`iQ?U(y#4L;#xy-5v z-o9fDSwVe4e?~!`R#5K(!YKC zWLIOIC2>Bj$BP}-kox3_g*cN>>qkmxtF50r1~%=|9B*%Li;LWk13wMK%Otr59T49n z*D?^dVLlauAi$>r;8-WT1lR~PMV=&49?qe=Ul%e1e{}$z2w#knI0&(mzBu$_aRrJe z&T>DB0HL1&ncIlur};8BYU<~{>ZLQh^v+_?I+u*RCx$ z08dPY?)QPhxu3!!&t=*d$728k6bynGa_j-x`SW?2%+t`%rIF3s5GV$WpcP>=;08Fm zG!&Tmsh`96qosg}h0S6FD>R33h(L|ZA49LSe{mqqGKHN3cs2rVs1AUXs}y7`elPN{ z3rxW&GwO?9b^JW{M^h<#0@$7PguKbU?o5I($>%fPOUS>wwSxV7?q+XS3 zEMCwwz$?;`!16#b$UkPhNs?(Y!3U_OIZrFV* ze=X}3(Him<_xm7%G7dVZuR3qvbqkuYd9N6t?n7y}T~`@NSZ$-cSb`mtJ!?JU*APSy zq?SITSf_rNr8L zD+Y)!Jd~17*WyeGA@N5;({nGC+EFnN6vP)(-ZYbADTl-fLz|Fhaa6QijD_hMtR*_N(@~3>C$@{=HBZh zjPuOn1yRyGEUF0qa;}%CGI+t#2mL&|3S(_4=2Ou)n7S@^RA2p2_uAK6e{+vwwlC*{ z85)#oZfs)KYCQG2AMEdX8CU~eMjYr|sGWKk2W=Qj`l5|VHgA*!W22}|jnDz)+?Inv z)hMw*x@k-57(3%Q^Bfv%wF8_d>$Ke5!{MRYT7{<)4=b$Q14eAwVjASR58v3ayhvtJ zdjwPeMxxiFt%U(=3T6e|<3ow(vURc*V%P?2!~-VX%AVUrV)yz?(xyiV5kF(+bptIm*BM zbpd8D^b1RDl1iVQe?PVpV~7Lk5l4qT^IU+A&TyRqE_@4XcH-j#?yH4=n&hB-IM%?b zhISkvGogTkRyc+g{#8UgFkC@Aur^2b_@4u*@;4t9Ne?s`fAZnkBF%Cd*aaYiPpOJ) z#qgg@7CeL`4o51MrnC=+Uq=2Svt(3JX%r&tbO}Hws5`f9IA|OvxjlttO2q&Grod60 z5$5CA&qlNX0|yWY=4pv2R6E?xp|8bcs=4?k^CzT_mCQF=O|MgF8BP`imbi2OM$>8+Go571AJbOJne?1zWUKSW;es+z~7VQ3aMCVLj zhlbHNyb*t)7B#a5E!5b85l&1Is7WXL_g0lP%5r;KoY6`Fo{tw%VJ~DRGk0-~ky-rXIbjBUkiF*n8sa+5dVk2d76T zL+|v>$qB|tE&NB}2+;@d$AgWev$F?=e{O$0%=Mb|zMiRWnKO!dn!ZxkxQBXS z&~fQh4ODPJ4fQgG=?TXbCVYS3kV}@ewx}&>wve&Zvb@elUcQ`5E1Gc#^i6<_OL*KF zv6Fp*^Hy9M_`<5=|}yopLM!* zkYu8>VkDdvW{2={E7M|=!QlM9R)!$hf0($MB6hm3$y5S1vN@S23$QQw4f8-QR^l`~&Gy@B^YJkDXyk%3xAg=jDjKJWw=^4LVwED;f?Iu|*u= znt>|abqp!pDtKQFlze?X%o;G2@jFlqsDaS6V>h#Q){Ar`mju(vy|1T<#u&C_Hg zGt6#wTIf^<11flU=GNx6+@3i1<-Bi7|%2vQBpG z@<)0%(63aNuajF8d)QVz*i-|5e{QKg3j(Yvn7gCFYwzXR$v-Re%rK7*Y@pR>-ki2V z#9*sY9lji#U981KP^%H041QdT24HL{(-;i@>b&Md?JcYMq0ML}BdKRh??kWg8BbJ) z-{|S!Z%W_rmp-fk3ao`NoA`O`@eA5Uy49jgbaAi)1=cY*yQX+F0?9AU9G-Z90#*slN>ybL1a#-=j=J{hRBfFw z$9~z}HJuz-&3N4Ke+5Z9yZWU^aJnjq0(S7-DSx3DmrCr6xu)uBF*bFYR1h}B0lfS@=3?@p4zrZrp zig=!eGe2E+-S$5M_y85xmd0Z(-De;idSR_pSw6=n5V6yC2Wv?~O`8G=Ou zDipfWHUpZFv}0v2j%PeE(uvd*Gh8~qx#;-q1&ix z4vBS5e|jpFv9&z{#z@8;Y~C%QEI{2=feW?&OA@L^WrLAgmChzv<^P;aM|q=l!0Ut4 zt+uSS)Wg*+p?vI*q^?}a&?`&K>f;Q?EZ=k(8*M73!4zw*N<+Nu z{drQU3jHrL_Hs_sERz4hM=+ilZ5v45)KnbCUGB;pf6?K; zy{5 z^ou$*sN@8JpLFrqnFTWTLoC+^4W3!BRv1(L(>E!o_fc3JdpjroWEi?7xix}=TLX6m z!l+Dh3g9hLg46|D%J@zfv1XX!e=?SD-4;jmk{NV>taj>HQNYe((hI93Yn!K15p%%P z1vYi3Jmso7R#(>OCQl1qe5cBdnE3B45wD_i(xjF^Qz0-YH-4cNLs57E5e&BXapo*E`R{fB!p@J36t`EkR~zU3C8Y$+vsG zz54TaidL-dSA^=c{cdT}`ipsh`PNiUfU0!aspv>MFU940ML=C1@5r?gV(+HZsdh{x%O&S*8J%<0QnC zQju9v+d-(#aR)3^Si+&l0orew#DT#P;?CmWrK8aLHVm3YJoU>pfA%4p@yfJk%ac_7 za*lZDJTa7M#VDy${~|oN=gaf}M>p2D=$ITq^fe6rd*dJS5QbI+={dJ;7m4penW_ zajt0fYuh~j3R~HWe~HvAK(x5!!FJ76dG1OKO(&_VzOlk)@M-UxPEG2tn!OqO)Es!G zE52ZE?B+Y#gHwXfe~^16i@AmhE@q+Wh1Is8 zRSHI7a?5MYj-{@mq2Xwr_A)CSS23K*+asT);dJ=p(cqun`S9YhC+JL9Lu;;h3;94V z?(T%H+W>eeBf9VatSgL|>B_LR@aLH91IH#`-@?o~P{k8??gybCy#n59;*5%cc9$&Z z@P<_eDkxjQf2^Nwt5a@XuxnfW6GWWSRmHB#F(xx> z5xJzl^s2xo=teqCa?|n3RiLs`;61Mj*U*tz%+1b*qd?L zYrw#*o|8(C2wvM?84vdMxM60WfQ4~Fli_5|3;n2H0^MBb{-XsW_yf2%ag1$EDB*eB??%KI;(!-u^}Jv_pD zkLr(a?5bGN`VDi%$l0LSK%FDG=knJ@$kEA_EGWS?^MEZ+JxrA-YeKBYoJM zh-&U<&6(Qr8FkBN*ZtucF_uLhe#0K`9Q3l*M(LCnYegO~$c-YzeP1(z7m|;}o!~VL zHp|RX0n+P9TT@p?SIN;a$Lg818j2b8e=D)STLpVhgsYhtTwwvx@-A~h5jJjqF-lU| zFjQ-p4)j+#(Y|7!1FONR!L}P~+0x_T*4jU7WdG8?4&w>q+qWdY&Y%1*^JD2{D2In~9xW?b0s!qR~t8p2We@H5i z>oS4;pvAzdJO1vv87VMV=A&Y7G|6?j+sdLIttEX8m7rk;hh_TiqF5*-)q)zaJqst( zoZ^}Cx49oz!<1DDtuFK~doP+_B{#&+2jJc-zJyH%&-_f@izsDzF*S}A(tdv~6Hr`y zW#j8r0_!fq&2HPOxnaw(lGH6=f6kpb?JXyLE2DMa(1s?9&64^nn8*8tob-!>q27)*i2(t)?6j^rbF2D$LH>(W`^pI(_A3 zO%Z4VoU5p{H|H?-Mr~3Z>R#Pyy7}d)4Hu?vFj>wen$E?U&iuF;xsL0Ve-ydj8qntS zuWnT18Nm|Iby}ASAv3zY%nnW#7c=Y9D^-uhC3{>V16_&7E4s0jrQN0aL-(iY@+lp? z=Wa~dkGc-PYPV8CVLN|Zl~Q<0*Csg9x|mlO-J==pnuO>|(OkwR)&&*iar-jwvB}#ca&XjQ~ASb0dJR!BCe5G^Y?aDXt3vt9R5|HD*?ySo2o8e?4mb6+9K1fT%=z zq~vv}+&B$o9N_u(IG`|=)hXVjpx<{ay1Nh4bqveb>HgE`x_o6jPs_vf>*HN>zm1|r z0DB1Nix1hi9xo8^;Qc#o>dQH;UYaMd_SPq}GHF>Jt5aR-OAkk?K3kW%*dTaX!~kt_ z;S_0FP_yw6?@3&ze_Q7%xSL|jG@zfY+OpQY=5mopv9BRg%`L#EV$0Dy50cPWpPzSl z*N{;pn4?kC8QzWd5i>UyXYg+rSlSSk(`I5&cVBLJFD+l*SMoHROu#n7#WoFd+pufD zIj-Fxx8A;c1lY}4Nay-nhidn%a(VAmRm9FH?Txb(B`^A6e>?ni{kim#pf~2YYB1L% zxG)^=`dIFaD;YG$yz8c@<<<`~$W@lZIAELYo|aVOFM&83XrpyvyilFV#~;hvrCh%H zcpwJK!JPV;DpA(uyEQ^#Za+oxc30+VOLMC)KeFE5PQyr6VZLj;An9qNR}R2{cN)p2~|4SdwM>e~eijlBA*@kd=i_zsiVm7lj3 zKDAeXZz)5%zqx{8%Q~cHT_|4MH(Nu)S$rb>8~Gt!h&EeIyX|4~t-%(s+QTCyPo&(& zJws9h-1@?C#ea1>@q_6f>xTs#RdgTy^WK@(LU(V(e_IYg>fQb$M2SB{@CfY>t;++v zP2__Fn6``3c)=Q0V043S-zf8)h05@~VLl#$`xNzTz<=-X=X(t{u8Mh~ZdbpfQc?A# za689^*qU+U?JM(JMGU^KeJKe4ZL1)B3(Ku0X#NH-jHP=RXf*gE1oV54%VeQ{@C2HV zLJ+rvf8DG>G8BYbClPe0{m{pl8U03pxhF-SaB%&vGsNyjG5Bvcj=`^F{sYG4?<6}P zCmh`zVy%sBuFe2_Dth*zRm6W}U7n@OYL@DT+RVa`eguVP)DaB{OVm(fsY87i);Y4Z zx~Cdsu8A=I33Sv0EqsIUjPe0A9fa?!*cp0Oe*h2glvvp7{>hc;XWjSzQ1>Z+u;pc0 z?R~umTvo@kKK@2u6+56P3a^3%v4a&37VOxuV+BMMlqN;dM8QNO#)d{6?AWnmY*-Sp zM6qLR#8@yk>=-p-<^Rlk2AAA>|G)3&?sYQfnXUT@)+ylma9(V6Ld(gFF<(Hn@b*T5AA|XFtUQm8;!yk`q?t8!1${u6J+w8ArD(ZFl!?Y)- zzDr76^6=TR!Ol(h)qVUW&a+bMk}r-Yz0I9k^U%}|owK*!_@U*aADT}bo4@q=lt5FF z6H_|)zIATnmveS*>|&d{l}epmGWBMkxYBQvPVDQve(3P-A5uU1`8OSIf4zR))wd2U zKTzF$$+fh$=^IDS-8He!4_P?}J`O$+82GAB(J8BoM&bXSFSH)AbKjerPmi`e^kTKm z@OQnB$K*d7yK~~+{F?T+@{7I+xZix{HHQ}auQ{}wa$$e5e_GaeitFEJ9KPN)wfz0I z_K#<`KAbq=S?$brUc<)TXdXJY__x+S#f;x`V_}`s#hQM&GjZR~zn2R>^U0z6quvwW zO_}&;?j?7(xfV?t?-`#P?3VR>nBz}({rVLRnKt-jw>nJ^ooao3t<1c!>(k4w&pB2ms(+*YfiL_I&EHz& z^WzA^oBM~IGfua6D!1cq?{UM1^{nK&{QSD#D?VwSv+U8?Z<|~nchUa#%-69t=hx*u zs;JGZmg6*JM!%HntKLs~Z+U)G=HVe9hkk65({0_suJdN~oquZ8lb6;#W6nM=)v)fp z@sDDE=~O0udEAxa@jK@|e!H{v^IPL@7WdoPs^-7+e1B={J#UM6ylSwhQbUV9vlh&_ ze6s!8#W5?|Jb%&AA$o3+qfx8+)^*-r)M9$Gq_l0N(#IxvI+l7;>hCUBCR8!G^{E&0 zNAm%l?Ox8l(|bt7sm3LvHy&*L-l_H6Fz3b1FaGl2Y?m5KJ5P_Qa=K^v=(t-Aqh`D1 zEq!pX|BI~4i{sKizux!5)O8DcXj9wN8%8@qoNC-2*}DAs239Xl^q91+!o3RVgQ_>W zv3X8M!`fyyyKXPyGj70*>aFT`-97JibVlhxD@%E-D!D6Y^4jNhcUZqE71prSz8yXl zYR1>>VEVk$`{nOxS3mq-I$&S_{y%IwnEB20i7lVaIzKo1%_hHQcH4SRd;XW^wrrW9 z)t&s8hTRFzzx}D<%kS?s@_4%E&sI5|29IiTw_NM?Uy3E-ubs@SP}OaJg{tn4FIBvJ z&)x9GXfWXa4E~YP2G1|a2C{tSUe6fKRGVk+&c@v6l?EF7%-zM9(GAq9XYNgmIU_+` zdFJkJOdAHu>bbjSGzfWP3sBiijd|hT z)acR^)T$Tmjf@FBKxOjPoJdf`U&5{%FH~OV}9itEXvihaFtI^FL)D@-@ z*>1^PPzh0>+T^-7Hl}t3H9pt9xiN19s4cnfZpK{p>LIA2z91Z5xwkQ<^2GqAlG(%t zreXs?Jz~m}adrQJQ(3Io_aFDVMhA9a&Of-C*>i<~F8t%}X|z}j%KEi?N2A4bTpjY- zy_M0Asb#O-TN<4?R9BgbV9N3hTuI}rJ>IxG8B@5E6W*Y^E^K$p8{o3ILl52{q<-vj zjkloUxx2n^Vb^j7s5MLlF?H{)duwCTLr}H;b#G?OVB9dKEV)OE{&n{-dOZSl`Cr)0 zDYMEz<=-JJsaBx8-r;I8U!D05c5N$wckCTx)5?STz&ML?pql0(^dTkJ7-&Que9jvW zi3H{)^YHG@Lxd7JE{~attpkbb@6n_9+MxO|mB!S}_wEghwlTo%e-CRJrNR4$DT5`b zh97X%fd_y12c%VkHF(RJ@?)?5WXhX;sr(UCY*|nPn963}&rJDn-!3tg#JuvKKsj?i zdVX?mXLR8HE@Uc*sq0KxvV{F-P{~aBf5uowu*3$Y64|TAOr^86hF?HsF>gFmd8}nG zQ=aVU`!9$_CdZ{#K4Rd>F&M&Bk`t&zrW_nWon*>~sZaUt4UKNdtHlj97h@t=i~T`3 z1HX7Nh*SpHC+Guh-gGsP*onW^m2;5}l>XB4Q~MKpJ#OCYF` zOht?VwVEksrfxEo!?-F%HIJhHAO;nMs9ON2#Z38)1a+CIbXH!L3J#lH8f^$1Y?-zz`RW*wAMwrUyn*?t&Fy8 zw2p;V*Jx`4s=tNS)@aG*i779(dc#6%ZOrloWmghZrVprLC80QxCFYjY8XHsCY&uh! zPM}^h<;C7Pl>!yPR|l8UFddnS}3(BB&N9 zt1_T0IAMC0(U6KmK`mq|WiY7gWwiE22R~4zvY--pr~;S@V%}z^Qki;L7JYMJeRy-H ztuc$Km~znKJsi|Qrrd^r$}gvR8eN8g>QEk3EK@U?@?pDYnaX9mb$YCm#`&QQ)DdOM^Du}5Z=54Y@G$ObFK42<= z<5IH%A{l=WR3K9s`xsY2t7FWl2)N@%aKeuj{ud- zR60lPHd7WHUHi(IO-W1*W-6PhB}_%I#AT+^n6k8mgn_fJ7gJtL&0#8$sWVKuaH+AV z0xFiLU1z4!dVreFR8TKa$Cyg!y~?npDinKypw>)z^#nDUsSGbr`Ma%ROln2KQP8B>1Vpz7I!vg`^fh^eIRpf)mPVA=cjNZ3?%#lZy1hjGK0 z%41#BL`5K9D=b-Wt$yk$}kYTza6xeMlYsJj-Y({g7RT1y&tHbnQ|Be z>VhLA5*b&j2B<8iIx`i^xbK-tX4&7Evgi-$15-K7Yf%%FB~y`11+l&zHKEy?agUiw zWnQgXpz@gVWh#lUE~^CzPp&=Jn9ATGvaSuvh3)oYDw}aX)kbdGa^@aqDuJm_OvQ56 zH+KRRu^&{J6NcP*0I01@MKG1aR2oyY>wxmI1U0e_Vj3R+Dw(O|PoQoy75f>Ky)!5m zriL(OS!^{1l_@U+sB6v`tbAOoSQo4u7VTRXj`}b)kEt}idWNZlA`mEE50u3h@Y>hI zG`6$_6Tfvz}Jpm{kFkMSV*H#g4XCm8QFQaT<13lU z*$XPOzE;cV-2%IkJm$Humii5}7TDFoZXi?MYUiG;_ADGSQNY~g6G@_Hd5K{P^R2C;PV<`1q$MRq%)PY2h=}&)nOl~ z+KoY_FwUnju6ncgKQZOQR}VMVoQw$^jfad2;$Bv9(V7{ZIevYZO5}dbazW{KV4p9z zps;7NJ}Xz0+EnHZa7B?!W)H{}I8W};O;=v#IDXZe@It}3z$TDL;T~;nf~&cF^;r`X zXXitp8a9QjEnkgns&zEF89^Ov3Y;Hb{fw(cnboctjOFmo`iExh3a@u3n?XrVD^Mkx z^GZ+}xbDrhwnf{3HMcqRCNS#{u#BDzvuOb(-fck*YJozV) zN1n&*y*p1U4O9ya`JK$Yh}1B)>1<-XrZq2{3S1G~V9nTPFj&(=O{-^>0z1sw*4SVu zRnB1OO^zN~L#uQ*oqgrSH-OpuxL(3ws835gv|84&!k*pV zV0dR^FckSh=R7ofV?sx9cu6a*s&z&cU3f=HgW>O@2E+Rb)S#7C!#Y=_4?{6b8UCtF ze$2P6s^jq*pCJjYuPrTVr8T$C!SrV*dZ4+XJ+Y;~T4{|e5e{bW8)`7zwKo`QP?gqN z1FKYw@Hb$)NGnPMTWhtgJVp5kh?K_lrZlIu*4WBhe2hu`#^8qDw4rlg8x3IVgI1x9 z*2p^b@k+C)r_i|_ZNhBo*G6mGI2ZRk>_XBOgWttA zLtbY+G##yD;UEj;pp8enyM-#Z)!eLoq?@g9F$?^@TgksI#=wAZafdoet4B#~wFcIi z9{=rU*fzS>7GvWlWB%UKU|54Xv}zlb@zh#a<;e(FfS)Id8w_o!AG0$gid`^3TVSRr zE%VeIDmhDBOq~se2UXGQ1FnWn-_V*09uka4jInKhifK#6K#^ z5O2rPn}?LI-%fL|&PGCWhx-Ax4(NqfXm~r#*(w1ukonCKrVk*R(~@>tEh}eqjM+9Y z8)9KFG^VrdG$(66VNWS*F#LpmEx$)a+XEituEX1be;EAQ8^RMH|~gyNhVCgBC+EgW=>`y4_x@ZS95m#m-y-egg0(KafoatyYD2 z;eUdIyV0js`L5KX0~F=Th0%6!6Bl0=q3Io<$RI&@SIJ;lgbq(CO@}%lT`eRV76ID= zipo-62hGJgUHos4DS8%mJ5(aAqgKbt#Z&jE4d#?D;N>W?qvmX#C-CX8YFEl&2(3oj zI%;*T6Zh%xRuwR9Fz5-+^r#~eI!S`r3Q5u$-HmKabvnWOpb7d^`vmM}^m}JB^6jKG zwsx4T^V`7lYvB8|q~uOoBP-`vo!Vf8jxid zcq3N7K>IjwKlh~GUC=4-7+rhUng&A?jAM{D&FrGpx3(32Gbe-L0D`t`D4pnnVET!6 zU&MYfV&88xed&TR$(^X{xmDg^s0T|2+6E zR zHSYy}wz$c|bq)A7DKr^xdRRG2FvknOA|2_4*ry45oUos4rqaE!0=i*a&fc>-tR{U6 z_3aHev#>j3el+;k@$ZtYw7j?0-P$1Q)lBdof*-n#@_K7t)`<`F^=dl!_rdSCo%(u% zpOW)me#;%S&0F)dioK!p*-Z|E9ewtOI~iFzdm`9>g8gDAb?l?Huyzyv_rgDwN^|;X zO{_Do>G&b=wF9mt@1o2;(32qiS>RaOD6|Tys>J8EDSkHE35J(GSee z6F%o+5?V|Sog9S1?;`6;3V1)Fm8D`nsC=GMIC=E>($9~nGxL)L{tCREXdX{!rVqAM z28m%`ILRgJ$rJkB2ea7wJ3R=Oz*~ow^^{5t=GiTHo=O|hzI{f$2O}XYWF*gkw;Iin zejJRUh{eG30JnsCj#>J1Ix-kTmnMm_3jBBAFML672g4m(G0W5GBlxpkQqv)D-{pX= z=Og%~(5B~7^bo91mYU8#0bUifd9P^S5Jb&;w$48S9m~)*{X_3rPsC3;{}=FPqqTcY z+EA>z4zqMVyT1tS+-sUN6#jV4)%on>7Bs&%w122p(<&Wjt=zAJXp7NG(bJ*W1h~x6 z;bCxvBfa`9)fuLltPMD6W%%!CE6@`ErGdi`HBa16F@G@dZ}D#fnmY^|cR!p@GkYG` z_wcVH9cOg1WwM!ViEEv4$w(iDVeNLFrz>G!mY{X}K+T3@GP+pna9(ltfuH?>f`=mp zLE>Z@_$APme55VR_Y*w@{FR^R>2PeE5+s&fYgpI%&s2W|VxK4c1EOck7YYTxLWabW z`4(uq@|#fV2q=n|U=|oSV4z&)r_R?qP+%ba8*=f*pk#_eyqvP(lSL?;`8f$Xp7}uq+*_COeN4`k5ys~;A)`8C*K3u+ z=V9PIgP!U%#}B1AR@~&(XeC-{I_C%P)1+5d!Q!z^DM@Ag!S|6c6u>){q8|PTbE5Eh z@nSW1OVM2Br%O1Q&w8eorVIYKO-+(06zH!?Wkv#?C7osU%hC3gp`Ig=v6kY_72)?O zOS2j8CY>!%|Ew&X8woc(3-yZ4CX}Nx0l1m45dItR($H#ArvPj=l4XVQL2S5a-Yic` zz_+@hXDqY1WNfpfhXGm}>j9Wce@OxR)kKkM7N-ZtmSEs9^VAW7a zJzLGKKu&>B<5EZs^V2KRgh1@94AR-USc7aax`{S)IFMIaiSb#uSqv?uG8G+-tyP-1 z`8Rk@XxnY6=V%1YAyLmXE+bqnE?1#>qoF@Xg2P#J1N;$H>B?vX-$(Gl;0;1^vm@&< zxXt&m)-!Mec(c&v+fnB+xV5p6YV8a?TpMg@>KM%23`xM7V68{HWly`uXpYvg!sjvP z;y%qp569qsFwII=&uabxzb@GYp{sBz^H-k9DnKcx`=4)7aXNDISlS*!%V9q>G_rn}O_Fr-L|RMI8j zb9DMQp`Bq!Sikamw|L+A4chRgbUzFgIZL9(o9QpmGol%p!eKX8x@!;qKJbS%r+{$H z(JDx~brgJSZnQWYiJU8$$$S2P0Ix;o!cnI)#T%X?oUoOaM8IaeaO+~;^A>KU8@Wed z?t4qt-#_$BFBB+gz^Wkg1R{TS?X?dW|Z@-;~kY7qF`o{QWKL%q3AS~*pn39S0R6fPEsuti8FIU_5`E15FneMb>SdaD-@GY(+Kqf-FeZsI9XLTIqb=x8YhyIcDphvoeV~Ka!_xFT z21}vC&$^o5z~-U)y9YI#05ujev>am2*6f}%aRO#Z!eSjC3EoJwCB0}5^V5YN1>PvM zyk7Kb0^Cd^9X}F!xJ(c0P0c4_tQ;gfJgfMoyrnmVFh4^0oCp( z>}*6?6A@%f8S=Rai&l~nwANqC@3Shj% zfMd+1`uoAOkNFXc^w@A-UWT6eL+I5cOcO7`^FC}1+Q^~gHd$+7xj=`H0-V#kC{3M= zY)ug@ynXls>}SL1AkfxH0&fZaDe!+APDQ?jc3T;#ZQy?Zf5r&v`Yj@#Q$bJIci{21 zI?k8kzeN-*E9(3?z_Um0ezf;n#5i6iA@9sP;aY8a_APeE+2YPbu-MD7BdO7MP@gIA z72t8<>K8zP-*L4UH)jC<8T=aowDCJ6l#e7P2ZqqDkD`0uVV>lP`xT4n=T>2XRAUOd zWg+u{ci^1Je~h7E<|m3C=Cl6HAWEHrJKH2l@O1F=!9O2NUl?x?{|oe-8%v$0BAl7x z=RwhbW*p6(ivFgG-6ZfibQvLZaVio&Xo)^reD}h|;z%e}h{JH@6ySl4K|3Bsz2i^= zGsI74;2Qz&7EW{H5C=E$XE}I0QAS75nK%qfgbdd`@GQ}S$5VcsR=a7Q#Cbk=yz!qD z+0<|h{}vp3l!ndVuu;JQ{?Xx)Q3fxlF&}*ti-6(n6cMl4StpC{CxA^xi;tp}@me)2 zKS>2%8Wy5C(7AZ6hLv!)g0mRymuSk5N2SXWE$QH`M(YwoZqwkor$k^ac=OR7#!%=q zM8;Cm{yKPT&|)Ug=4nvxoTNu`FL+DQD$&hp2#lYwdF!2mwsRs?`5tO=MGfy!xd;x5 zr2*fgRM_ch%oCioe~hKM-(!F2AaUFW9_QwYNtFJ*RyWQ?yf3ioHo2)G93kR3eusa{ z0~-(?HX+!28rvv3HrkLRs#0-@k1Z}05}5*#ivJPu4aGAQvz*IPy@SVaom~t5wyB|H zfvu^O{exz2ieIK<3WlWAcgmeOsxn=3aLki{+=Yr=Xj=+F;$glTnWk%%>npoKVwaa( zp7BGcD4o;H0=K7Y_BG5tdalsz=K{9}&1R~?eor^1YxPWdvclxyavIv{LXaQGafVi{ zkHbn`%Qal)F`E{rv`mLZOYlYohK7gvjtY((6KJ;VB|YDbYdrjQKDWGPYQT_XEzNKlZ4V2iX!pzzeI%Aq>z}mBrbL1Kg3CNDrp#6D zE~oK7X;thc%KLGZ!&qUSLad;dVJLA45@oKqTt0Ucf~=%FKWUYGQe<)CknkkwJYQ*9 zg$`B*FCx-^QedR-$Uy&5QNH6ab^Xm9brT160>ZJmRY-I-^_;C$uPM254p+GhPfAqE zlcC%eJW93jsOZC!&{<}}MQ}NIRTn7q8lZV5LXWNTHko7cXj%G6D$-r_wS%5bC zXQc&Cx#nPUc*|C*U{=~MQjm?5H3ws2NYUNpsQrv~pb%seSb-Hzj2u>^U@_s+ZH-CSF2-6y)Ad0xXg<} zZ&Hx0RC*rble1kn#6!uIp-7T~Y@>Gb@YYJ=4jsa~7LM|kBnq9U)pBu`xUF$C7@ily z{nk>5exqmm4s^!?*a-ZRA!<^TA!(L8Tq(8_SN7A5d0GvVr`Y~d6_X8Y*VRo8EXXTF zDpi?}PR0u4KJ@Ysu3DoYyJ*;a&E)7H?ya-I?j6zt*D44q62{w)h$RLsao|A0Vj!Qid;@4CV5ZSaB-Tp4g00_3+qtJx^$ zxPGZN=Ko1tns{FMau~XbLzh{RA!3fWGWJ*SucC2Ke0_t%f}?$X8%0bqB#W6l@Qd#d zTmRA2z&hBk-|#PQR9Kgbi;HhiOsIbt3#FaZ9cYFqj)qW|%Sz}7HD0JyiIZ?y12Ghc z?N<~c9cqyiqPB@|V901zY7kGlLxfMNEUqb$qyO=wsqdJu@X$aO@)S?XLx_)oCtcTt zin0I4=-fihZa}tRssh6YF&DCw;^RgpRE86FbCdi^Bo50MlV0h)YQ31v{#MOt-JhRk9Q zKpw*5dG{3LG!0y&RWtbrgx@r204>oE6yyvoSfn|{*@}0ipydX%BtKG+vk>{(?-tE` z{r#hYL-l?;%Mf>jSRTYCKUQMrAcl#lhpR;k-%*j_6S+@$65=yi{TrX$Lf$V#Q;;P;a;k z%?Dm7NG3g8jNjOic0J7}0f?T3{OQ6L;3^f%k)88t{A2f1_R(nvkRGt!ma6|*& zDad8`R!KtR+QQX$OnAsB-%%)S=6RDKWAOnwmsDaLs(T-G<+;`U?%^-7qRVBskpH`~snGU|39OqtL)8gU_FOO7i|<2HJ~HP0b~R zr`mOjBdwt+`EPy7d=Eq3FckG!L9*yHX-$$<}2t8@=nsKHFmqK`*Z{uXNL?4E7$C+PwW?$WqA+s@WO(!d=qB6&_2kU zQY7qr9>HfKvnn(*2Z3d8(JO|eOMEkMxft5qiVAX@8Z6annOwH$UhKl<&#<`AMnUdS z=u)l903R8GTYywWn_o#mvf&RGA(xgd92z=w2oH<)AA|R)%)7G)aqt6V?9nz?R&sag zuccbGLCIqM7hHY^HNV>`$lp-SspIO>yb0^}4-JnQ9pW!HvU$=qe%^5lsKZs1pY0Un0i9W<)i$LGBmtKnvKD&4vWD)!<>$~ctD1u3(5&T}hn zIJsS2TDl+>1HwiHMn;8)jWNeLWv4!bESLpQPX{IVWXTGxfyr62k)KID1){d2LOi9e zD>R2%38}i07l2eiv#g;Y&tSbC#Hj5V&B>Yfo({5W3^(^HLkigU5W5Y?t3qNgsoP2nj+wHT7h#jw^5dTogRmc;AD47We_jjtZ zg1n|q4Dl8%1PCA1j;yO7Z)h4rve)P_=ELHD0O?*&LEh4@tFW0(SgS({I@G$pg8aK= zHRiP61|7lqcmqo6G*F0lpF^rp?J(wQ9NI79Yv-#NW_FLB15B2gzFPYU$!v3^4qR z>ieb&lV60K*I-WMX6qF?8W^5#{>>ByKS^7IyFP>X{v9A3YPaSJ@(pcWgVAsk2u}f)uBlY{*suQve}NK}wMAI?b`BAov~8k5DqjLm@1% zOjiSsre4yjn#U_h`eu)jtPF|RRtjB`XdM<99~siAxO@}B^II!ODau-h2qlY_b%5jn zGOmq+lqTEt$TUkCbzbZ^F#_5uNEsTo9_2nsBJ>gv4&p#h1u09*)@vpoPl+>chj_^x z(N00ip>vg?+10%{>QI+poVGa(48&Q3zLWAYLH-5DX7!@7_T{ zEU70$GR4OrT>b;be(b0qRy3O-7UE+tAbe}@(@8tEogtaBg)D$9 z?y9s@ru>Za=#FyDjnX09yw?J zSIg!eN{b!6XG6&s{tF4~sUY^`mVy%OB9PAL^bvHrX)gsa(YFjqKd)=)0?1K7{wV~h zM!%(CWy+CG`vY~B#|wybAQHS4!ht*)lJSRbr@$4jJ__PU@te`- zghH;cmJ)pxqz3)E8IcS6A00YX2vUeUf@hHwxl)Xpj=EOWU@h8(xw|qoMs8v`_X?kb3lVD=L5>w6Dqy~5DPK%3YWQhZt+);rqpAHR}{t2!u7INpn|ldV1`)Atz9=j(gDdU1aYH1JMp+JQ4GBUgdYH>jaFLR>Elie zg^y_Y1($iuGsY;0MjcWy(^9kaIg$%VIkcle3gSW2Qn9Cq6$szURz$lPtRSuEP%2V1 zM<6F~xd__5u?o_fKBQvIE&d1O!8iqJL)tFnU(i+E7d})diS{T&LE6%{yPzdmAO(hU zLlwl64()<3DRPr~1{%IW`zK66+R=wy7^7@~ti|Pj5trBD3euk1{=$hax8DZ=;T}DX zP>>EZ;};Bo^L5=_*76owo{m?Lj&u%M>ZD!MAq6*U*^vs;3EAZcv1V>AH2)XPw&pVQ_`bYC2(|5QIDZ`H?aUcOi z$kb-$pBM5mKo9zUk5)6zR@~ZK8&50YbmQ+8q$fo9U^O7pe{?jSGqTG2qOuV}vIo~r z%vbnc!1Kujemlib+bz2F-hldp9h<12y#eLZ@&Tg*5u=#s;E*U5iOA54(IT9A_`~x* z3yF9`q&P%a0zZj_asxVC_<#J%$v$ZFXwqKHI8T`fys_Snrv2Q^z)HCHeQ7^K5+(Tt z!bM)&9uYB+1WF(84#P?u!*<01Wcbve#IZ zIz;+Uz=DLX=E@yx9|+w8pz;zWG>|s!gLe@!drktv_r@OzK?c!-eef<*OkV_qllVR< zEk5M9A6x$n>7y?oe*u!6q#%Q7*nX{sjkn}E?^$^3d1xshbZehhnYQfLEKM#F1MVP) zY3?$mVklkT&kLhWz{!B{`tGw_L58s-HqQ~AK~1A{gz6mB^6OVer&GDx@i z{*xo~un=Sf!pR3e63$Ms(Sc#39QyLf4`P}kr%{)HSdDgirBd!o=hINM^2C0i_!+cH zLHwx90nIcpNhTflbOl__^4HSZwVTVVc4A;FOpcL3w%C1K*J5(XD$ zB`e(lbm#zfO7Q~WEzn-HcWV@66y+U2CvpXH8kbk0ZCk4#fzq{+qaKVftlK&T z8BH+4xZs>+Gpy3f9FA71%A`ms{?jfxLZO8vJ83b#-eFygHCZ%p1-8!T> zJGu$vd#K~Zc5;e>gg{+2U7h=3t(;?oV0oqE+o7n<3L6Tny^j6%uvW$~Td=%dbOPRQ zi^7J1=cHo~9o8zDY$Y(?0>=l(8@4KJIK4QGw}fov(eZg)=0S?yrXUee*O20W)f~zD zSFOCsO*UZ_P|^5A!Fs#Gj;HT_)m%-U66bP&@b-7!4h4y1NNsxgD|+E22hog+1+G}C z!bQPsbv9egk*7-#P8ESL_(_|xOF^S)=x<1)^gH^{T>_5l=&eGK7+U%p>PzA+9bym2 zK|oIbqO?q)E5C8R-qj&ifN-Atuv{XCSlyn5{#*3kjfbeiXE(DoO*N$i|fav+k=M7vVuI*D=zGaA0osQ;rhB!ir z;#C1SX1@Y|M-l1#oaAr4Zv~KwX$mrh_M~f$j@}Z)((q~rOztiOnTjE4L|#X=8hR!K z$?0h&3?FY>{SPR0an$iBW}Khw`z>XJZy!{Uc!oIXnUE){7&i&31|C+pX)x=+W~-Ys zArqYd;%g>c{8d4}C#PeYD9oBr3vvq5{KEDHG z+;Ii@2_fMlBUvc=P!(I5Zih!?Dx-_jX*LW$0%-Y4K_tU$Q-^2yidLXbH$ z_XL8LCh1gg&3poV=XnQW6%_Uf6K;JEit# z^WlC8z=NaB8_6E~^{t#1h{dJ~PHN97Xd;dKU8~VsCg*E}i*E>eK2(SWP{vQjBPNB0 zk5Zex46)AzkB==Y=O~edbn|!3)Jv3N7if5njrNm5h@YXf9HjU;w9=V+TJP>q?78+M z@2|g6Iu}uwlbEmxG8?UNnGYW4y;qRMH2b91z+S@I6ec)j%Y0ObC3KmUWXaI~gYG&3 z(&>|e5LG^fdmjgxFy*oN=4UkHJ}XEP4LgPL%aQ(BAk_R;W`9HTulw_*wEPsZz*0K2 z7QXQIE31ftETcb9;W)`h4DqKx_@#taMg>_;b{UvDS)zqMH_;k~sF;GRprIL9>Qf}& z@trLLLCcjA3bK;cWT4Zw61iGPmM4IWE2$u>=s^ayfvJ+T_yDB&H{b(GE68ecIt_O% zCAu%*E?2lGWfUZtf=*)^8zeIb5PsW!OgRNvLmTh~#k$$zZaxh0E%lM|3c|7CX9xZG zOEKiVLbGu|Eq9S2bH+_X4kUJ3DT#H|^o-UVsi9}jcYt)`FjY{H^)v%dxJ*H!^{oPy3!fYQRZBs()75jx z{RHu4g=C7mlY;D^is#Yi3<*nB7%C4#7wRa;P8x7ta~P6nrN3Y0hEAV{p<8toBo)R{ ztMoK*b#3B``>&4t&T~-kDD&+?yxcAfhJH8b-%?)*@1l$6aj=v3P!DQ7apCWV3WAR- zT)+%<`JlVd1M|EcOulNYAiHV61(bqx(NY9n?tzz0nkvX1T6O{9Fy!f4jv^e}0D0I< zLH5$07Z6lG8Q=>r5)8<~77DVD94=y$==MN&HyaRsx94L^1=&ww7vZkoJKfM1K;{E7 z!d*eqXxl~jVj(@^udeYH^0}rU2k7ZVlmf3D-Ov%lWimn+*h)bTQsYddNrD)91qi=M zd#8a=>-VC&1lzOL5|apf8Z|B_PySt z5`YwkyJrR}$O$^eS`s9s_^jy|LYFyML4Kzamyx?c;x4}m-ye{LLlxvC^}dX_L`c32 zL5~&y_HdYjoT9|b@WojY^Cd3xUE)Mv1<9au3`v!d-UDCwcz2_pf}AFcD=7NO;)@M> zve|>c)`7g4qtpVL%>_QjoJWhao-!$peJnF4-_fLC(>IE9g;{7;1~G>kY_^ zu?ljY%3lSzgeb@b^1h11Op|=MkIQ`I>k_UY7wKn)#QzV7XM}=e(zUBd z24_j{C!)oBynlr0c8#99``D9BZ+c^&n|TYNc&VH^&~rU?pijm9#>;)y;37NIii z1jHDtAlGTvb<87Afy81?*MPCzlN2P2-d#sr5})c?_(+ng)YWel< zh}#qexj}JR=ya+;_$y*5fGnJt>sa`%#g+~qgutIt%B zY$|sH?%Gz?Ka27XJ^B;A{5nfP?vnQnl*1gUb&KGOA0SI+E6Cq;@dn&ARMNFrV@}7w z(7$sOapjuBscl3&;^bPOMXqCsgScAPHjV3Lpmn`C)^CJf)Gh@G!{5R@ZU?5Plxf zYLkLIqwTkNKQ6VdFQUsoUivphL7vmoTNr>K(J~zne#d*tRt0%Mjcy|@Dbk}1?CUP8sf!yn zSv~Q~7u@OcFJG{^O_!7{iy3wf`Y#?Xnq=v# zBh2*z0UcxaN9dTgCPbkQHs(Tj@FM*5% zq>(rxfG^#op!mWur&T8-~8X7oRf<@{tbT)oNCY6<@g1y8#(^PC-5urO$UY=W4lP zsU|ih{H4N@7Zm1mQR?uw<~TH2^ti(mKLBcbNnv;gry}phucq|HZ*d%Y;x$Y2o8E4c zt49#l@(`YSSqbMCr6Yf9HSA@lQ5L%D!q2%^6$D?2g$t$>8JtOg3<6}|H3j*GJnkV^ z{Un7NptqTTl+99*A~fY51}95=*@|Le3x96?sUSt^*Lx_U4ieU(=<6i7`}UTC80pJB zBub*VTOV3@j~kY)AjPQleQZX2#NC}$v1~(Aulov8oF?7Z9Q)@=P}z+Qf;RDVq5Pi)+mJXG+Y1UO=-cP5i5g>9!G?=e$smlGNYkLTMHwsdkwm(2PGo%akP#xX@;`gtDl%eMjkfj+C z&ehOz5s*Re6{IY=KGZ73Maa}Vx)MbmZ*Mt$QV>2r<|i%vVnT7t)Dz!9j1G+KA0Dnh zs7n&b(uhTUC@*c-;_Jypc}Rk7&`*vo=_g02n{bm*1Bq@@z;7(+)I&V?j`*l=ciVPD z*~Mg7-d16(=$l7cg(`cX=Kp%!XH5+sX|~<{^a;r~E017#K(`hKD|o?A`uIp4M@NQ2 z@9TSi*6s2A1mB&u>aO4wDe;kJ?`qu!_?(SjBI1eMd(I2965X=Y!~71%Xm%5tEdVJ#~MKpNAz0BpIG91!VGM z1u@aI$M}&$teEZr?|AvC@STEGgK3_Oy6N#T!2#pKaIVag(L%(Wp?NUG;-)CE>XZx3 zaj61vh34&mWKC5N2WYnbsyTXMu>NypDE1U7p1yn-JtJO8ITj2+R1|(vj<^4Kd6VR| zcEzI`jLyetf;S@hYS6qVTGg(ZW%Tg!R}0%g@5FgZXHD=hi47zD@sly=OOQ0Gh|}W< zn7V0+3R{a_L0w!%Ib9u3`~5kk=r+Lxq+ zoTOhP1INS!hv@hWNvyK)BM5%fTULN?o}XU_0(|(2pSK2#8xte0CrKzyG{D9O`M5B- zKqNoknT|Zg?|-tabT2G1CX3-k=dB9D-_tU?9*Jk=LB9IS5bV0Qr7pxrz!awQg? zFx~?qS9dFTL%=K1iD$@m7wOzM{NSfIW|HGx1#3hfo*^d<<@K&Chod5pYnkt*4+2-x>4<{yZ)qyBQu9kBczY!xFfuwg%6wktEX({|$do`c9aVBo>C1DiQg?$y zil5VG08;Cif;21e_v!8oWP8lLl`x-qT0z|Co0k}?Gzrsi znB__kdR{@?p_$i!QGwBc0nzyBQn-2Yy2$|WVb(vmeD8u1!C%_YKf6%)QwPXyX9>c7 z6c0|{s~2?{^Kbn;C>gHwb(6HYVT&Fk5}sF--d2z?N8vwTI)LIN>EaJ4bf1xqeg0BH zt*LCTX6h3mdefjF9gtpk6$F3$rm(;I2M(attDL^h?M0e&M`0-UNXg*kv0TkQE>Gfb zjT-SBY6d@75KsI!*Yr`5{$tFapNI+wjtJ3z^;lM)98RvdJ3}-&|D(j(L5#~}!SCl% z<^8LdVESPEPJdC@xb^^J3IH4vtQXaeYt1i0-3OQVLXJgRe%&B+0GP`IenA%!9A)0L zSPJ}&15QF9l513O{*j-+3x05C(M8vO3vY(}iHLOSSx(_Q0nZbPf7pgse|$#;j>ao1 zdKt=<40}}@Z>PbIlZ}$=OgCQPr{fk9lYtl^p72AeDM%Nx`UktXw9dNur${>9!~ax6 zLA)Tsd5X8tBK>_s@wo`|oq<;eUE~AC+!pcJT~mqh4}`h4>mnE>^VqmZA9*tHBZ{-N z3nbj~^SeQWQ&1Pdw-O587K;_{uLE!mQg!MSNag2ur`!MF7qwmzgRW4_Z(V$LR*)VL z4IL;e^>;|uyxLE+{xO_2@+!w$c5b+Nt~ zU);P&>_y+b*6ap~O5R8DM#-U}QrR0S%`YBd%Qq$_5QQL`VBi2#*XzC&OdRKYUGH2bXr4b~G4pkB(cyGaV?CUSo9lZ2;`v;JG zFYY>Ap?%5q9ZsL}@Xa4}C7Bo%pQxJdJ^A0cCC$!KZ ze22>KSuGo>AR{5huQmjS;>!RNkgk#b5y3n&^@*0%QWu>87@s=Wk5Zxm)G$x8@8|5U zLrmDdbVP>KAFUvxAjUg$eq93l8m#N)A2T9U4$X8aD=2k^PvOBzDv(y>Y1RANirWoP z^BO>L@>m5K4aL0hga(F$>+%^&XYX&|LR#FRc6mV@D$uBpCnAGd#>cIwsN|pGOK0GcQa@GW>jNcNuDXapj7rjiK9fAg{#;UD5ZO22dRlgTm*S&#< zktpyuZ_Fa2V?y|AOZ>?!I1}4cAMuIE8~!fB%%34<0X!c(MAL>{UHhatboY`v;)d|l zhV8y73c`O21}@?C9G=GPX^y1&bQ$i6TNV0SYWG>I+B;Vi`l5sU%1rnU1^EsNIpzLa zY`kUQ_+Z(H=CeylOrb5Gu^EjQr3NVEXL-YZQIM%n%3~WTZ>$v>+a#$`57Gbj5DnR_ z#Nr^vas4V*uuJk2Asa-4Zy9#%ZCUE;Ml+szf6;2id1`vne1eiPP+V)jQalYjF8Gn* z*kf?ea;1MyF-YM6yBttp{u%*;%^yEvu#e1*Y4veXjLEk8kOKbzFpo!6T#)}b{SEXW zNuAdSEANh!YADP zOeJpPIVJcb1bK1CwiHh36)sPD@fNwsuP*vsQ23bzcznwwFjCK}Y;nvP-QZ^!5q~Ir z0`R`|?srQ~lGjMRmaiZ>NvE_l3H!th9b;}W6w4>ljpxk(W`07O|xwZ5&S=HV~S z!gQj8W2p|*7_Xy6#(8NOnjt-7Ef8ku4C@On333!W;`MRcTy2Yxc`scS!mO2Z%h>-bDT7Sop^9(9JK zwbdbMn0oyIx$r_kmcW53x&t_T80Q;~V@coeiDAAWIAh|eXb|r$5!)4TqsA*GOcYnt zqe@(oxX>5+H$(q#|0qZj^h-jSztULn#!_xKJ)u}Fe-3ucTP3p;GF;0Ll>dB!5#HoU zxJSa&Hi%7p*V0h3;DCG?IT$_g%LM7}UffWh!ZfP+L8)F&!;Bsd_8xjbLSVcqv^@E& z5GyFj=wWYi5D32=*AfsT{=Qs+ot1RS=uvr)pUjE=C|w@`@hGAotI!3RuA?LQ3x&Mg z;*3$hE6O)0Vvot$?2Qas&9^E}oc`H zP-7*r&Hz&!au=E_xm2<*>0ufWBt3V6YJR4FrKN)GDx^9Xw?>5{W+{Pgfz+vqh?Uor z+%Gh*q(?PVvZ(G3waqZBO%LAY4mI0yeshg6siLimrLb&qa5%ej37& zb?cxHSyL>XyiA9CD$%{vx|By{Q>;|41oX`h+W+mSAp2;1DG%rV2}5)(O)&7S(2apz z6l6cNO14hq)tv1IN1F2`zOyd20Y&)@hIU~$C6-3dOL^GUN|iCY3gf(t{@6!Bc#*{8 zVgtGSt5qFnA)~}^{_~TPo&6N@Adtv*eC5x7Ou_AGbY$>2vlm|C#Y}8z_%5L403~>c zR+RQI_44khJIXJ8aAl}JSV0a$gzxv%7X%U32-$YvhbM+`=p8>q3H(YW%6L?dOBbE| z7CC<~E_<|s{05!onGiE-6b>H)L(O+FJYESR<%@b>3Q{kFl@z})P*^G~q~MMxMMilP zq^uzIKBQ1tNT;1;JZ$?%2&Nq{>`$o(rTHi{o5xW1C)7VSI5c>&IeK~G(0GWIfLN6% zC3cML%6e2WrAdJM0a6kWhY1RDocfgYu#K}7Eo__}tUF0TPQbW%Rn?7Si>iNLE>)H! zN63_hjP{+9`Tf5#6Y=V>d25#>4M1zramxzzE^rr zkz+ZJ%KdT#l2aGc9XbEq3f zZb1TZ1Y`gp-zO;uzng^`XZZSczzp$%KVR7q0@s%+@I^XW-lI}~OBvvXC=Im%v0I@a znb5}>89gyv9y$7=YMakmlEsad*xCjH=DA9VU84Gy9yLuq66TsH`Mg2juvS6-pmCPi z=Vgf&6Abr6XQpgYkjoH(@~_|X&Kk$~`WkRAIBrcp&7H&cS zlMw=w<Xw06l)tFZw`hg6N0kw=vcR~bM`2KU{SO7XUEngF6BZm|`;E|t zgk4?>2RdabJf9ySR}FX&5H`v%=cD}0KQ0@3_!|DfIc5}IK3Ma=UW>Vdi+uET4-Kjf zL4hF=hByBQut3@00HR9Z#=-oDm7RT8|1X^arHvIl%J&%d>Hju*AA0!im@~A{A20Uw z```N5H}1y+`lg~sg}Ai;2jn53918v+U6jH0|ABlYwhR5yg)GDvHzEJ|UxDo$@G)U< zA{nQDWZ3Y3bi4rk7+}sh_3g+ggZKXf{{;9#G0hqN|L;eBejj~6qXHrgpFaQJv3&-8 zFVIvZT)zBoBuAga`rQ1|lugR8|84at&9=dwAp^dDgZ{)n(A%RMZszYtu=Go4;lAS3 z8IR961Mwk>|Dyw(Xt`pME4_SO(=1^AdWEwT9j**p02q_*ZeZp3er10CD-ibPk75qi zZJ0&;L}bu$z);exjuwdI=l=rNpzOR sls*NB#a#vA{`NanY_t6W=Z+~>rR;j`YMJlazg Date: Wed, 23 Mar 2022 09:45:18 +0100 Subject: [PATCH 125/146] Fixed .mes inconsistencies --- .../mes/spell_ext/warlock_spell.mes | 108 +++++++++-- .../warlock_spell_long_descriptions.mes | 177 ++++++++++++++++++ 2 files changed, 273 insertions(+), 12 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/mes/spell_long_descriptions_ext/warlock_spell_long_descriptions.mes diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes index 136b2c59f..3073776fd 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes @@ -1,17 +1,101 @@ //Warlock Invocation descriptions // Spell Names -{2301}{Frightful Blast} -{2302}{Sickening Blast} -{2303}{Eldritch Spear} -{2304}{Hideous Blow} -{2305}{Beguiling Influence} -{3330}{Eldritch Blast} + +// 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} // not implemented +{2307}{Eldritch Glave} // not implemented + +// Eldritch Essence Invocations +{2311}{Frightful Blast} +{2312}{Sickening Blast} +{2313}{Beshadowed Blast} +{2314}{Brimstone Blast} +{2315}{Hellrime Blast} +{2316}{Bewitching Blast} // not implemented +{2317}{Noxious Blast} +{2318}{Repelling Blast} // not implemented +{2319}{Vitriolic Blast} // not implemented +{2320}{Hindering Blast} +{2321}{Utterdark Blast} // not implemented +{2322}{Binding Blast} // not implemented +{2323}{Penetrating Blast} // not implemented +{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} // not implemented +{2348}{Witchwood Step} // not implemented +{2349}{Dread Seizure} // not implemented +{2350}{Ignore the Pyre} // Spell Descriptions -{7301} Frightful Blast {Transmutation Frightful Blast} -{7302} Sickening Blast {Transmutation Sickening Blast} -{7303} Eldritch Spear {Transmutation Eldritch Spear} -{7304} Hideous Blow {Transmutation Hideous Blow} -{7305} Beguiling Influence {Transmutation Beguiling Influence} -{8330} Eldritch Blast {Invocation Basic Eldritch Blast, dealing 1d6/two levels (max 9d6) damage.} +{7300} Eldritch Blast {[Eldritch Blast] Ranged touch attack that deals 1d6/two levels (max 9d6) damage. Update!!!} +{7301} Eldritch Spear {Transmutation Eldritch Spear} +{7302} Hideous Blow {Transmutation Hideous Blow} +{7303} Eldritch Chain {[Blast Shape] TBD!} +{7304} Eldritch Cone {[Blast Shape] TBD!} +{7305} Eldritch Line {[Blast Shape] TBD!} +{7306} Eldritch Doom {[Blast Shape] TBD!} // not implemented +{7307} Eldritch Glave {[Blast Shape] TBD!} // not implemented +{7311} Frightful Blast {[Eldritch Essence] TBD!} +{7312} Sickening Blast {[Eldritch Essence] TBD!} +{7313} Beshadowed Blast {[Eldritch Essence] TBD!} +{7314} Brimstone Blast {[Eldritch Essence] TBD!} +{7315} Hellrime Blast {[Eldritch Essence] TBD!} +{7316} Bewitching Blast {[Eldritch Essence] TBD!} // not implemented +{7317} Noxious Blast {[Eldritch Essence] TBD!} +{7318} Repelling Blast {[Eldritch Essence] TBD!} // not implemented +{7319} Vitriolic Blast {[Eldritch Essence] TBD!} // not implemented +{7320} Hindering Blast {[Eldritch Essence] TBD!} +{7321} Utterdark Blast {[Eldritch Essence] TBD!} // not implemented +{7322} Binding Blast {[Eldritch Essence] TBD!} // not implemented +{7323} Penetrating Blast {[Eldritch Essence] TBD!} // not implemented +{7324} Baneful Blast {[Eldritch Essence] TBD!} // not implemented +{7325} Hammer Blast {[Eldritch Essence] TBD!} // not implemented +{7326} Deteriorating Blast {[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!} // not implemented +{7348} Witchwood Step {[Invocation] TBD!} // not implemented +{7349} Dread Seizure {[Invocation] TBD!} // not implemented +{7350} Ignore the Pyre {[Invocation] TBD!} 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..b70aa5d66 --- /dev/null +++ b/tpdatasrc/tpgamefiles/mes/spell_long_descriptions_ext/warlock_spell_long_descriptions.mes @@ -0,0 +1,177 @@ +// Warlock Invocation Long Descriptions + +{6050} Sound Lance {Projectile of intense sonic energy that deals 1d8/level (max 10d8) sonic damage. + +Casting: 1 std action [Evocation,V,S] +Range: Medium (100ft. +10 ft./level) +Target: One creature or object +Duration: Instantaneous, Save: Fort half, SR: Yes} + +{7300} Eldritch Blast {Ranged touch attack that deals 1d6/two levels (max 9d6) damage. 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 {Ranged touch attack that deals 1d6/two levels (max 9d6) damage. Can be modified by Eldritch Essence Invocations. +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 {Eldritch Blast that deals full damage to the primary target and 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 for half damage. +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 for half damage. +School: [Invocation](Blast Shape) +Casting: 1 action [S] +Range: 60ft. +Area: 60-foot line +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. +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, 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 min on a failed Fortitude save. +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} From a683b78e176b1cb9e94033e417a2a7f646f30dad Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 23 Mar 2022 09:46:17 +0100 Subject: [PATCH 126/146] Fixed .mes inconsistencies --- .../tpgamefiles/mes/spells/warlock_spell.mes | 101 ---------- .../warlock_spell_long_descriptions.mes | 177 ------------------ 2 files changed, 278 deletions(-) delete mode 100644 tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes delete mode 100644 tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes deleted file mode 100644 index 3073776fd..000000000 --- a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell.mes +++ /dev/null @@ -1,101 +0,0 @@ -//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} // not implemented -{2307}{Eldritch Glave} // not implemented - -// Eldritch Essence Invocations -{2311}{Frightful Blast} -{2312}{Sickening Blast} -{2313}{Beshadowed Blast} -{2314}{Brimstone Blast} -{2315}{Hellrime Blast} -{2316}{Bewitching Blast} // not implemented -{2317}{Noxious Blast} -{2318}{Repelling Blast} // not implemented -{2319}{Vitriolic Blast} // not implemented -{2320}{Hindering Blast} -{2321}{Utterdark Blast} // not implemented -{2322}{Binding Blast} // not implemented -{2323}{Penetrating Blast} // not implemented -{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} // not implemented -{2348}{Witchwood Step} // not implemented -{2349}{Dread Seizure} // not implemented -{2350}{Ignore the Pyre} - -// Spell Descriptions -{7300} Eldritch Blast {[Eldritch Blast] Ranged touch attack that deals 1d6/two levels (max 9d6) damage. Update!!!} -{7301} Eldritch Spear {Transmutation Eldritch Spear} -{7302} Hideous Blow {Transmutation Hideous Blow} -{7303} Eldritch Chain {[Blast Shape] TBD!} -{7304} Eldritch Cone {[Blast Shape] TBD!} -{7305} Eldritch Line {[Blast Shape] TBD!} -{7306} Eldritch Doom {[Blast Shape] TBD!} // not implemented -{7307} Eldritch Glave {[Blast Shape] TBD!} // not implemented -{7311} Frightful Blast {[Eldritch Essence] TBD!} -{7312} Sickening Blast {[Eldritch Essence] TBD!} -{7313} Beshadowed Blast {[Eldritch Essence] TBD!} -{7314} Brimstone Blast {[Eldritch Essence] TBD!} -{7315} Hellrime Blast {[Eldritch Essence] TBD!} -{7316} Bewitching Blast {[Eldritch Essence] TBD!} // not implemented -{7317} Noxious Blast {[Eldritch Essence] TBD!} -{7318} Repelling Blast {[Eldritch Essence] TBD!} // not implemented -{7319} Vitriolic Blast {[Eldritch Essence] TBD!} // not implemented -{7320} Hindering Blast {[Eldritch Essence] TBD!} -{7321} Utterdark Blast {[Eldritch Essence] TBD!} // not implemented -{7322} Binding Blast {[Eldritch Essence] TBD!} // not implemented -{7323} Penetrating Blast {[Eldritch Essence] TBD!} // not implemented -{7324} Baneful Blast {[Eldritch Essence] TBD!} // not implemented -{7325} Hammer Blast {[Eldritch Essence] TBD!} // not implemented -{7326} Deteriorating Blast {[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!} // not implemented -{7348} Witchwood Step {[Invocation] TBD!} // not implemented -{7349} Dread Seizure {[Invocation] TBD!} // not implemented -{7350} Ignore the Pyre {[Invocation] TBD!} diff --git a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes b/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes deleted file mode 100644 index b70aa5d66..000000000 --- a/tpdatasrc/tpgamefiles/mes/spells/warlock_spell_long_descriptions.mes +++ /dev/null @@ -1,177 +0,0 @@ -// Warlock Invocation Long Descriptions - -{6050} Sound Lance {Projectile of intense sonic energy that deals 1d8/level (max 10d8) sonic damage. - -Casting: 1 std action [Evocation,V,S] -Range: Medium (100ft. +10 ft./level) -Target: One creature or object -Duration: Instantaneous, Save: Fort half, SR: Yes} - -{7300} Eldritch Blast {Ranged touch attack that deals 1d6/two levels (max 9d6) damage. 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 {Ranged touch attack that deals 1d6/two levels (max 9d6) damage. Can be modified by Eldritch Essence Invocations. -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 {Eldritch Blast that deals full damage to the primary target and 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 for half damage. -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 for half damage. -School: [Invocation](Blast Shape) -Casting: 1 action [S] -Range: 60ft. -Area: 60-foot line -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. -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, 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 min on a failed Fortitude save. -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} From 9d4866de25be34c508a1ae4ba661193f5d2397cf Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 23 Mar 2022 11:05:13 +0100 Subject: [PATCH 127/146] Update warlock.py Added Invocation Radial to replace normal spell radial. --- .../tpgamefiles/scr/tpModifiers/warlock.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py index 4790b61e2..8bc840000 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -124,9 +124,60 @@ def verifyEldritchBlastAction(spellEnum): return True return False +#Used by Fey Power, SF + GSF Invocation and Invocation Radial def isInvocation(spellEnum): return True if spellEnum in range(spell_eldritch_blast, 2400) else False #2400 needs to be replaced with the last Invocation enum once done +#### 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 should be label = game.get_mesline("mes/stat.mes", classEnum + 1000) + #But for testing purpose as long as the normal spell entries are not removed + #I seperate it by hooking it to a different parent + label = "Invocations" + 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_glave + 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 From ce0b448aef5b63ecbc247c66047e0d816a2304c7 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 23 Mar 2022 11:05:50 +0100 Subject: [PATCH 128/146] Update tpgamefiles.dat --- tpdata/tpgamefiles.dat | Bin 3872499 -> 3872690 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index f1f193ac3b09bb8101cb4d0c94e8c4cca32ed4fa..3be3454169cb7ea86a9f11722e0a8a2c8590785c 100644 GIT binary patch delta 44906 zcmZsk1z1%}*T;`~R4haULEsPyh**>g8&qs;EJRUh1f?Vd6V#((V-7ZAVPk@gTmuWS zvAHHTCfMJ9u}A0J?|FURxi0to)_>OIo;~}V^M2gS`@@4RuX*Ep=^m9ksT)u3AT3Ppzx2uhvuRs~e~d)Q0MYY9qC=+C;5Vo2t#!=4uOd zBXwi7rP@kut!|>WQ8!iFs+*~st6QjBs#~e;_S-*ilRaRkeTFjoLtFa|vDu&Y*q^GF zy==Svu}ZUYa_o^DkQ|YmkXj?P$5JG?6V_|rY3_PA;V?72N+@Q4xb zT88OY^J(z$O~GT=D6{y4SrNr{2}f$>rQKIO>Qn4neZi5K@#SAG&9Sb&dV7uEU%$-% zq4#d}h!0u!ijvkJ`1IOl@0UHVy54C%vEh-aW<9*GESR`9ZG-!+@os0YShO^&rk(Wt z*_%~Mp8x(QSlf5cLO0WD#~(MkV?6P~-8CPxqYQu48h^Czmh{di2)qY+^nLfYL;F?UJgM&Yp-GkNmzmBQ zy41QjW%DdGyYWIwb)K=M@F`sI@9}Y z@#`J8y6-wYsiE)PF$pUctjn8y$mEMzM2K5VyYiz?UcB1(_?*}NMkgkn)m9zc-|pRm zk?p&@Zg<3FxPxIx?Ds|cy5GI~(PQ=FopqaJC28%tSME?+c4d?5{Xx~)FERfdI{7+U z)o@;iGhWfZ+s5aedhlXHb<1rlM!ZRNzk27~*Z5P5Cw^a>nzy*MNsPfWZ@ZA4m75m6 zsM&aGt6M!^-=Dbg@(1?`hYvp9ukSJabM2cQz90XmZ_$H=bzR>YUi|lpLtH{)-{(8J zIy^j|GOFJ>`!{AuhxQh!PhK;$%nbWJy7Bmk*Om2BM^AI?+P7q4PyYpdCpLJrPlp-5 zQ;j@v`L*@J+o$I3cKfw3>1G?{!CMdh8FlO9uc5B)!&`0eb@a$CORBPXZ-e6_oMIF^ zmW;TeaxNIGRbEM#~`V7&!8@qmu~L&&1CaDJI4)Lb!=Bn@1yPz zq?NBd^5k!~PaO~U`~H3Htm^g$dVFcL(yC7D0`n!+%6K6Y`nErQEbpGBKlyOw?1xD%<1Sj&UvSsZJ7~EgVAthNcYS*m-L#Fn zwJPyI*^Y^EQ8Q~hjl1`JZ0OnCe(x*)nBZIKRFcnDt(<0YmGqDFHptnoPKpfL`ZPkd zK-=v16^rJ}mJhXfSZ$$RpOPhSJ4bd%Szl9c=h4^uf?RD{YC2iH|ZJ+PHyV&4Jao_E= zD(^k;cw9|Y_|T)%wwgC||EK-fQ6o=XURcT3(`(KKogps8ZmUkZx0;sglXE0#tah`p z`x4Ua`ko&$^33%)mln@9y6rRZl7Y@kr#D4CLSFhjxV`?^&bEVIGeQ-S1iW)Ycl9(5+VecKxFp z*YMZfH^0u?79pl*$G;!w?zDDGr#cgpZohrh`Mk5os!0Y*tWUa_b?FygyWshCzayz% z+D{vCxL0A4q3UjWQNx3867(lJrfgahInA=Fuk!v@No!86#icdeAI_NIKIqZoAWzRK z+5sKvW&BjfglFBn-*5Sysa3PI(yY>_HoRJSdPtG9)o6`NRAKE|kB;Wfy}zcKRqJs^ z3OA1=-D>w8QmXX%oHOj|Dwj^PM%O5AP>KQyf4%$=dVb`I3FwC&Y$Q`LSoEf0H*>h-A7xB=I<3|C0K2Si=}*Ze_g z>dr66ZLVhZws^W|R&?~x&+EsZE^YOAZOr(yQKG*X9QpU&}gp1=Cnbp zzkI53sqp92`Cq5ruiDSesc6!?!N%pkPbJk}Zh1kk|Coi2cgIHb3%@-7s==~KEe4eC zxW8t~tyl3jr*uy3t#9Jr{(0Y1kCN{P>h1aX+A8(;lQYKEn&jpujt+|HqL*$JU%A89 zS^91BcKL@`_g6GoS+Md>S!zJi;dA?Th5M9#*3n;hFSz!!FRKh+uiJN1uSMJiohqZ8 z6p!?`Evjqxp!((Q`s>XZRjH&~zeSzNte`x|vO z^gb}FTk{FcUYO@QeYB1)SAKrE`$W&PmbY`X#+@Hr@3Qy)8ei57kV$vwKTG+L8;Cdv9y-QR|w{!Mn4LD4taQvECrp@kiHsrS=6M z)T>W^J-hzGN&lJUjY1l&Ojz2s>JsIGI&0P%Z_rNn?^IZ-)D3a8(`jZ}S*O~2y&v^n zUGF>0i1|nhlWUc(%xHMhU}?+x9xnIlrM2l;@?^PA=Osx^9F|^~|H{S7#Cu!u7FCG$ zkKqNm8(z$Le6g|4`mQbfcZQo>wXM3yYU#|8U0Q5<{c`E7jk@#3RN2(6#!*2Zy~~T@^i=uyIdX ze!SMwP#s#PbNWbTm+JX-!c!ia&s!AGwd2NXzcaVy*gS>NxGNw zs!nLPk?lGvb0@VsWH+<&ih+J=trg8fUacM-rTCScdwTViRNWEpqqn?utDK+Q<-PW= zyQXQcqK)_V^e|X!(@)2)^jLmJ^V`Xnr?`Jr4qUeOdZ!W97wj1G_`L1F3Bxz}6nPAu zH2A%0UW1*xL#BTiTRf(_cScFXltrq=pY%F9`6O)&I-B=2|u`WQFDB%I6lvn(rAqxPg!9%HEmM2yCp>&1 z751Ajqg?~9tD~>j4nJJ8Q~afC@!6lh)f+O~ApB@(-#K&h8sDq&cv!^OW;>%ATW`AG zINa-MuS2cBO?L833OCZt?smCafz3;k{zG&(9JFk+PTTOzhOlJ&o~xFxjXh#*IV{d? zsL${gKC{AK{~T~WI=sxY&GLND+Fk5lKFq)Fy!q+sYNEK0Ik;m$WZFV)+vD zGfy`yIT3U5W9_EH-*#?({Gy9xJHs}^H(pva$Xi|Jb?Wznn}=dXwK8*_X@2PR)%tHs z4y3*N*yLEx^_^!9S?s@SL+%#GPPfZ43$z}$sdH$3$G1!0T6XR|#GCi zWAEgIF*~c=-52nB#iEjRDT-RY2VI}PR?cmk^kelS3zPacqK0>EJ7-s2_4m?b3zHkS z9v6<-z2s8#;RK8BU39u6J+W1;@wi`m@2nJyj9w)J-FhF|GSMnO@Xg!v`)<|yexlZ( z{r~!f-%op%Z*;HsuATqB`FvmR)A&Jq98T}J(toMTiceu5yuzRLG+7&&GR%8;P?KgJ zFCEJ|bxpoMW@1vdmfiQ=YPDzc+BfapI#jLc*}0c_>j^!*qL z2GLuU1{ODaj@1r0Sa#*i#0K_HohFv8Ip4k8!ScnOwF<25A1-!UlXd!O$(l*7%YWWz z9+6d0)#Y)g>f<(iittOD{(8rwNv-;yNOB5o+BoCq-FFYaxc2zCu-d+lKm0=6?4!CZ z`MRv?^d(K*YWHcVtN;CiZI=}i--=n<9Xk?ubvrFTH>z5cF{ivV4r*nK(9rIgP!9b)73YgMEr8+%0Q#u}Ark8At96bF2HVPLk2>z1IV$nAVxn@$5l6BX!%^ zH8X!7wyUK-{@<2nD}zk*?d&V}8MnQ#NAsw)=ARO4=2dr9I%lx@Cmjx#Zm99eu+xO+ zGmB>AnIxPW_@gnqUbVV?i_zKN`X-&YaqhUm0V!=$y&uPY=a_jf%Glgy)f&~Aw^yrN zf8(`(VuyRPR*yK+zVK_qA%59?c9pL*l)7wr@42Y)V|BAwyFNR;Li+DNk?`g0&SgjZ z5=Rz|d#vm?CGX2Ui=!tBr+p}T+eF)8#rw{ipA5ZwW}SWXvFj~|#D6u|*n3Q+H8t|j zjx01udiv6DBspq?*qSpXKwn&3{wU zdf0{&>o)In(f_`vUho5#AzQ~B|7?0pTGH%x)QLbF?WC*TM-|=)mmAu;cAq;V`qS@_ z)fuG|1G^iSu5Z1f+gZPN7K6teYu~Eb{TY7GKUSXORFs#~$T%sw>7A8%H7hlGwPV|` ze&=34Z`}ON*xgR8d{ZnoBpyhNalBS@`iqaz zll@*q%pJL3x7D=--%WA)*2VRI{!Hyv=~_tl(qUV+bvXQR$(%leOv?tR2Lv~35xTX{ zvltQ2O3MEX}Cq_)Sh{Hhb{-{O-*XLE>k`1LX&G% z+G*e4WNbFNXw&5h4R1MloOS5u^P#ut%lwh&d&Z8|HrRJAdT;rrwHpFG28>=4k?)(| zSvfYT`N!zDj)%Gx`<~zRJ}Bho$1v0K1FYMlpBJ3F+ARpy?=!`Ew{jYD7&B#}V?(3a zb=QQyD|_1doAC|*1A9l*z2;dOH1NlrR>o?d{O_=ibdDJ{)V3 zeLTVMQJ%x%+{|W`j_eCx{v)^dTjNJd2M3&4n)5W^+4X@*F3mzdxij`Ces)x?0r3x~?dxrju>aNYJx`|HANgxxeCwQsefqq5b}epLXQl4$D`QV88$`~E z{*`;ZcbnRmm*@ECe?07NfB)>^DfiA?Zq{qn(lMuPUpTD|Pq3J>tlMg{AF4Z_4y^Xt zQl$Uz=9S;ojW6zs8g=s#b4^-exnp{Z6u&TQt9~n&5u2^hZ#~-cfZ<6@<;VGH4jwpyRuf>`C((PNPq_PVcb6q4&fkD|e)XG%TK+ zwEMQ*q<=4458nTzsmJ^inVnbNes?M%>CCRWJ<5N7*qwdoQ}siKKd04F&RwTfze~SK zZEv#6E@xc3|42TwU1vd2v%;GL*4(zc@qAXLU*CLw#Fw`?5jFVaxV%;#O(*r+*lpK? zvd?DMVw~Gl^)I_T;BA))FFeLt|Fdw)x2N z*4EsvGqmU1dA5TStD1Z;{;A$DAjY>+UDei2LFY4Gd)cOy{+Wt@1iq?O(gtDBahtRj|>oUF?+ZF|gLYc5zUe zPlR>-wTp|=eG;sCZ(Jm$;bd6--r$>$p*1mOVsm!7>3Mn^bJ*;Z)P;TK^SkgO}Hp(JWj(g|QL|GaQYu!5+du3W8 ztm|Y&Q)x9yVHH!%?Mq!+DRYP$Tk6tU={*kCwo(^oWe#!AU{#^uE#AAdSEiD1AX({z zZ6d3Xa-Wlx91pAM2L$C!)$sk`(p0HMfzJDY+>}GG3O=~FD~rj}{piv~>3kU0u#YZo zO1l+n6l~>3m$pg;m2rcteA3hTgiul_xA!L(Yh?-Pjr)Y^7E^_`eFB$7&HVHenpB6P zYV;Xa30c0MQEqu3_^u}_(P^E6J^t*{PFYBnh$?EgN zrK2*Fd>4~dLf3AQ6-~7?`3WnnIV}I5=t_4gZ4+6=bnOLM`4#c~f|W%vk0r~Qt{ot& zoUVQSh1STVx>^248x*?Y+Ay*bsSQ%e%AqzmLzWHY{`l?ELRp0NTh>CdQ+l^qr> zBcF_AFzj4loP$x^7RFDhxiXpLTU3%HWhfOnroy5=-bz;5VqAMpmLG#XYS)Sz4unIg3$zupvHcMbFBTHumtZQWDr@^YHlw6ex((@$CnXWA) z%We^@0GU88)0p!F1aalDVFDCnUiu8 zEvcz8lspD$K_!uL8Ck_t^E+BnJ7qG}!?*^l6l#~@HK1%xdh=^Yt(1P$QMqJ!P%IzG zGNf3nYr+ae53!*&rS{4!nqRBPDk1BBP1HAye2r_tN=28lp=3o<%#5rQQn^tJZBRri z^=iX%rrbWYrH;xRYPH2=6;f2UYD=Az-qdQUIgvEsCy#+-rLBU+ z$TBC7yJTt6HM4rKN{9<2%Z`+{)I*!5Q{76)%A#q|RF_5xS)pW^)55bw7p>tzi}h2o zJSpbJ_0f{$*I@;dm41V``ce~RH1*8Y`jWlUj;>YLgXMP%mK#}$JFv!*RY=!1>q(e? zMX>IX<$W8Lu0AYh;ylQTz6NWGK1PYw23XtmG3v~Td!mmqR7`cVY=Ee2R>KM)E1Ily zvJ`7zJs>NGu9+BMMtRV+p=5cI?{czI>Do22ipbJ2ghwc~UthAa$eKr%JGJ`a;M$npq*HG!;>09e^%>5%ow2oC9FIT*t# z^o12oR$?HmU1a5w^_na@vTRKx*DB-?YJy8S!LT-yWk}^eF~NAXp=;(U8pBlVaI!pu zV5N~&O5Al7JjzGH(lv#ZM!BA3MU(FWvJ~Wdk*s3Mt!V};m9BY^kZuxd7fRZh9x$kG`DYZ_UZ#2qIqEdtgzvJ%OoO=DQ07Aadbft5pdy?`cYQY~5r)5%J-NXK9%%fk|ui4816 zQ&_{u@*^vaEYC);ZjzNt9(qk-xvO9eXo^Tv$XY;FPGeZ-$tt94)ofuoo5AX2i)rk+ z9_2>ZVhOOJiMqoU6R?mb;B8x}nbM9dt!9|U#ZP1#6)qF+^ zPy{%z6I z8wbkIDSBqzDk&6^NOkE6CNM56D$+MNF|K7qaI8Xy2Fua5SSe}`0{*hC)V4}GE?GLG zjTO|7L!7al%B0Mb?Ik_7%2{ftOd%x485^!dLMUUoi)5}Ws&I8dSGX@n7{gs8E9H*C ze_U6%V00!@#u*o=ms4MUb-^rCEW))m62^TN<;FApH9c3% zBXb6BfGe)0)3w>Im;pJo)E#$4RZ52NBA2^KMoOE_xNho(V7;lt0c0hUHPcP%taP`A z(j_;{uOe#e+U*ce3bl2Qc9Mg(0=|{eYGpbKMTU~i#x>oXE%LSatV#;!K?=nzS9Yl# zA}*zJs41!jp{++T!}d~B-Bdi|kiaXXok%AZvVrZT4yxnmV;S&Oh$&cueJuYuZhr zC^1qf!VZxGTVLN*Pg(ARTH?W5&nXJ7y&+i(?t!8HF}{J}{;{zNPxL^=V>&MX`9tGA z8fhuB>xk-3jMF!D@ctRbSw+)D5;WkIMNyo{0;1>I)|qL>n9v7D#S6ysXJ+h&ec581~q{=HGbY zn06_=52o%RUHGr^w+{~9Glch zGE^1vsJ{W30HoG?fh4d!oh0KyC76-aV8+x{RTYXEp9PZmpNiQ#`NsH1j*<&6#}p#B z>rfsC-#-k1~Mx()b zS7nF4Z8niD>?|3nqIuoR8ldOVkIuCOGKrn(ELo^>d4x-$&<4d{)D_5NrtBhFdS!Bz zPTC5^1yrJP1A$EWPlOJ3zWy(Zisq&QNoLtyBvVyBN8B)YUSa|0ZX=MX>_Zo+@n8?!8L1#Q9fhJDddI$%K&Jg? zY&bai2E_-5hsDNGfLgp)e?WFC1R|Y;-*h&*t7NHit}IKpNAukTV$fC~YPP+r)L2#Y zQ(oNKp!C`(9Vb_RJ7NZV)fIIp<|;R#qJx(B+Fl?tnRPd*k+)9M3S5jpY$_x617{>rP+D9OB*|6@C@vxj6^+%#Yu85PhLU9PAVW^LAp3g3KmsBbn9;Gh^<1!3J z-4KB+U^P4>D^(U(xsMyY0V3TpS|AHqFAu4qs+>2+Ss)C^@hE|$vZ)?eB1^c6BPwzT z6&V~akVWi}hh#D=pErjB$ao;yQw6g4KXr9-@r_OJj|~lo4;+J4kLsGnE24u=Ge)P) znkSr>uvR@J%RU~wEe$ZR{7~17g#w|K8hxnEbh7XD?3C7Y%9kZe_% zP2?#_i#^@yDlc_VEQL*S%h~fDxEm(g%198}r7=4Bjs}A5Vo#~1DwiYsfCK^gxm>8E zu}M9lQpyY3g}6&mfd2}CtYBw)N_MIgYq_Ax7;t-`(tnjeR@zL894}rw+Oe& zT7j%$BYR0UszR=E8Avsx_ZrA*wt)~&u5tj`P7?5i~=4}!x8`zFMl7p(qQV!P_$ORz2 zn+39weeZ*IF}IQt+JcaZ?G}M-V(xu`IP)6O-r**YpBl(!Hlwf9ROQWM8OxDtnL=d? zyU-WiXvfFP7>;b+Dv(UppdSrPKY8j?ji{icZ35ZKM)X4m*jdQo#sRqnWbk%@Y-5}I zN$x5|ysSbC<})D8cL-!VtKuoO)A#0x8psnMx;ufe@BO5PEYcID6h_JtfAYUjK3JL| zJ6X1;)LNA_K}M*?)NXfn31k^QH+<75m2FB=d^tS z*~h{L;4YWUSDM|(rWtZ}zd-i0Z39rF%t^9JHjrOHP8<-(0aiLdYNhf_5V1T2a_pc$ z4l=ial5vt9zgPZ-iVM=}Y=KYX+bT< zo*9?_{<)FkprBw$_7MKAj~sS$pj1C89~)#MJMg4Q9!3V1TONdOd|X&~Y{jjKKLX{| zQ79H-P18Fh)Q`XiwB6|Vw@s{ z@16#Lq`UIgm!g0IR_KlUMksHOE6Cn}#9j&HGSeRlB$tOti|}S7>9s%#*|4ElEwV6T zv1lpIBVnv7iZzfcD4d@8Fcad!gUtiN`B|D^=P}co{T+zMJ3(A$?T2A0P2tFQAT^OXmkQ(tOB#leP=X^p zs@5rFH$>|5ULZHw$zd1?`TVKy1hADzAs+;Ciz$8R$z;B)vKQHNkrW>VQpCFYVAtQ6^hY#iAybV8fi6Bzb^v6&-{l= z#shQK%E(Z7e+KeO19^aJ)TcrIF<6ewqvGSj{pC;%GvqiHfOrg|xJ(E?WS56aMqXKX zk4RMBgfvnR&9P!)*K{v;HY^9Rn~F27{PgO%QMKZ<-B3vhKLBQBg4!vZY*hIDppx9#j`j?^v22 z8m5r9K5cB*Af49|NGU7wL#;D;t#2TkX27T#0(s92{GnpVYyC&1N=<=$U_<;dm=gJ5 zq3tmhluiii=Py~<1Y-E&$&&`IHy^k}QCaP3387Eywm-tr;zEDIxvhbGW`+R>Cq*Ni zRZxkqEmXcR?*J^9cDy~WBbyMNIsz$U%LA~AxobpBv252s%GoU{D2pRhZ$i3j3ze_T zAP}blrF>X@LUs<)V-4gR>mMjNs!I9()f?SJTZ&b6h01rfo)A9`gl=48bOiE)y(grE z@5o7o5Vv{)`N=v40ZHLI@;^u&U4i^!iwH^NTmL`E0}bRih1;Cf36`p>3N@rC=H2y$ z6h0Ug3@JMeDMFI;1X77j4aUwrnKw>TY+DU6vis=^q%u1jjLlRi@2Cr?R#l`?1_G(V zv_tSzYLh6>jYr6~MhZ6+h?04SpfA(83f;8mjSpQLyNq=)b&}~o<-CAyG zAT`huI=I#~F)qg6yia^Aj-o4e0S@viaSwSLkye`s*_!P5D5-%epO;Jnk~UcGDuL8u z??*`u2kEqyRjA~N*!mU4+J=P1$hEN9CUkd#t!^n;J?J*7&}|YM70J7^bgS$@ zLzZIQui>E2B1TJ1EmC=`4nU3q39u5H4WOxFV@Kna--XdqZB-7Js{=LZW%LWTOGgN;Cp*zqx# zZaQ3rwvd;h;?Yzf#_abPEaSPmk zb>;}YnWIhA^kzcElkrgBZV{E)7P5=~Th-aQ?G(z4sxUZ7S$ zX%=CvBK_myWBkK?1EM13jf=UHyqM4# zPo+wA6$%qa;njq_i^PkREFKV@Nzw6)%1IzL%q9x=0YlzLCO{4XF>Wo8rYtfFD_c5W z+34w37wL)yV$0S?Nk;uc`8pDZ><>_R+(xK0Lk(z6jgCqPj?s8vNaa4Xp3>TLqpk31 z&T2>FxIKp>O(8*#^uwJ6(t^#6mdwoYYRNxRUIt2dZK;>mA?jwY(^h8-(rXRYj_Hh*j4g_JaJ1mlK4yulkh6!J zHM>8S4ih4iVy!8)+pV_SX*m+a3lMWV3T0=ejFlRBdGk&f0)#pu zu9HAqP`Ey>#RlSG4G-^OI5(qrwiTtP^SZmjk(Q-_orR;sCdFdaO5;=cIkKr@&AJH0 zmE{mp$dRQ`q34Jj8i*VF6f0Q`3f(O?aw}vPK;?E^T2X zf7Zjen6NQ&=a}=?PKBVhK)*^4;n|Uy#bY^+o-bF7PP6E2Wm`{ybYg+=*v}R7!!eqZ z6OcT638XXI8ISYaXntevk3#5K;k*XYg?)|34JQAfTo9c((lB1%Tc~tp&f`!}DnC7= zu|&(xx;_Hw#!ifr3`}Ffg5;_t?~~L)WjFNJ>G@W-CBb^#3kiL+n=Uy%y8x|fMDNm;?K3whKL1XdZAmP;y zUUbj-M5(4lIS+RdfX@KJy@YCis5WBl z#!E&voyDSJxJT|4H+axW>OVwy3}7zf@k-EnvW%<-LWgHJ2*iimNpT>Ku3@&sW)!tXQ`S31| z!)K&uXB806kMRuK%G-*0D2p1P+}E+@-!>nBFI;SSuY@ z6K}d_Vo8U=(|O_rM421flkMdF=E3EcA8T|%NjJzT5dsNgrb)PmrgMZ|M#LjcixkLcHY^FdkWAjJHc)9vg=rvT zSXz=~J|KlxZ56U748`C|LfxsQ3zodi%!N1hg7~EoPuXMQioVa zMI^FGEgFB<#x?)&@ZeD~Q5CCXX&ZTZ(7tgo(nAe?EO>3=@kkSn{eyhcZO3EYj+|vk zW8*{#F|6iP$z*^B@48%M)8@8Xyg*_hO3fwjh4F|G#Sf$X_}Ium=0c=R8cuO6aVics zZ8$==a8pyilFME=-e52iWo5*PnWoX&@7!N^MM2-WTs$ zLvZR}(HMz*c{q+t3MF-d(4E9wr{hzTB{}jGrTgqwB>Ra1nfxc(sK{|)6(8BDP*w0T zlm(pT*&Pj+DR80vLf~H)UwrHC`jQk6UJxKdBkf|u%l&RE`fte_`kUM+?O!u0gDbQqn)p!7UrIzZ- z%TN9xS+x|vek9W*QSfwjM~xe6K3^Qmk)4BdRRd8oiy4w>{~}&R+AYw~nv*P4W*{~i zu|dHR_#k&s*q=w2TwdjU$fFVKFje@>WT`VG{iIYrKIi~xDbfWEWENzp^MiuNh2arA z{O?fpI40MK1{FO6`c4zNDSwq5^UF8ac`r&!2q9>d6bI;YH6!ZDt9#RJhTyidh*f9vO3Zm!>0U0n)V! zkLq$mFJfoXPX+OIUb%b@n%R$sdj#1lkzQ9Ia!;&c?dIU< zzLfXGUS!j>n7KfNyPA!igEyz%ybZIFP3>s1P#|mMBd=)QhO~y$!kMjstYr`9NDaKx zdAQUjG)wxW3Kja0o&l~!$M}yAj`0l$_795n9YfoYikcR4_1!?Iah_?orn5eCB~wdh zj$A}Gt-#Y33H9|*H^eoTrRAzuu|Lk@1LrcXQu8%lEa(i-G#4rk8+`wB*igdVXlbA- zoY8RGz`oDLr&$v@LTyDYK4OVb-pK6d0V(1~Dl}JVyp?Gno7kv%IOWyh+YVY$79lNN zDpWSJ_46=2{4UFj&YyW{wM-yeSkXM(aY_qhgqm#$Ql18q$?DCQ8kqAw`Lp^CUM@to zq8;Q%3JY4flDXJ*2+`T^3k`G|Q_sgaxeX8L5wdA%&R{}qJ3Bic`&_MLIi%;vrn`c7 znm~52S_{xTXX`3%4Mw<X@#bqsrbfI{3zTpDn7}t;L77L%;*#@;(>5G%eF6(R0GmZ z%B|4{NM|5NiUpF7e^>MjDdW3KaWPRigG0onT=y9U3BB9=^+-6KV@6Bye6E!z>*9A7 z6weT`?o)xBXI@M3)e}EnG<_4IIaJD@3FHD>v{Y)6#Akm^h|p)gEMExXB0T<9yN#2t zzkh64gk0@pKH9p#tsHK@UJAEMaHGw6MQgQb;~PXD9Yd8$cngo@P4(q9eE#f*3s{F` z=!N2Ua-C{J_a1b+yc4>YHN$afOW);*86}6~$H!{QE>OiPLUz7{v zIznr}TgJYPz3(V`$PB`|S21gBcxQdX2rPu>Ki`Ds4fX)#>)Y^AK_SvaU-AP8(`J&f zS2=p*e;sh#LYeoFa3@d%MTLh&`Br>k(llBtKzXBjz)k!XUE^P#Q~rVwc@=U)N!+??@0o8Ugm@4*g2O;yV8oq4DQ z9eZi(J5{s}DLr8C3CZO%A|KgRk#rjfjgJ)+O_NKfk6^q4v8|CHUb7ynC3DMUK9=aif%TD=H5SMllx_<* z*5SNlZA07HG(JJ-J^mBqWLgUPEokgw6l~FX$)MtSp@i3rj^|$@XP%Xy-+`uO+1}2D z#!p9$Bgrhj$W4RW10dt9gxdxr%%$s#TS02$VDy$YkPwMkQfd}KA&;`UU`ky${f!c}Yq@`-gNM5jP*WCn!Z8a&rPKC`KWq+gN| zdMEM$NMSRf@`W8+i~Vp~zKr~-QC@R_lr3L}DQ&|E8jyD&vZI9{%9-mr)VchkERxPc znb}exUs>WhJl!ZR$Ott{2~?t53FI5wLrBRv8KKwCuYnA)6UcY=avdH>ywA(XOdyYe zbha1B57shWQdv6lf=YnYL$Y=d$WL^>3U185Kx$a=oMgvah$8=poVJdF{>8SYOQxpz zyi7VPr+IJdB#_^g+0%54iy|%)59T45>a7KXpGI1b+kk@4i8vrM-JWS6mDt$zc#ibr zEjz8;;C%oiaVIyCoKTY*$z&(>pfne%w*Z74Nkl(RsT%sK<(B9$Yr zfoLK5xCo>w3&_Bulp*g@+9+OwN}wc=YHWQ5V$tILwH64iRBc=ZQk~tSf}(k6{6S3I z1fs zP%&atwxH6v-~Nk)^%00MJGuomD*S&cE&B?@gngxg-2Y!JA2kpabI!yPoWcw0hDx76 zrE~fT6;n2mkVLN19mq)_37!HmW5+Y;)}%?|HX1s1F>ckwjq{G9?Mjy&etZbWP;T_5gqSx=VGKYB!q$!`I4vtQ=T^NFo(qK0f8_d6bqr(T|pPIT4 z6|S}{dOMat4~`6nI?ce}8b~v?V>@b^!;ugmH-TIkCRCcUSKG0udGq$7ha%c8ZSfIE z3)XxG3M%G}aTeKMp>lY*Kw7fU9Z)IaHKi>q?aTI!5J)Swbq7A`=vhhbUJJg!t{o{5 zJN9k|K8#^LUG6(tgH=#E;42V&)^;aa-H@v&fzZ-;)lVP}EMX`1h@o7?00@1+>5jiZ z99iy8#Nx*XtTqr`AnyVM;>4=$0+Pjt+IwWv0$V9aAgx(%AeQ;O>Hbu@YOp})cRL!R zA(&6GWL9y5iRP`i8)CHaD%GIdvfI1x^*fy^yorEp0dhS=2s$&<-T2ye7O&i7Ahf1V z93>DJ7Dk96e|qZ)Bo|1(P=QEn|8BhJOX00p283SZ*9{YhEBn41eUZsk_9B})-E6c# z+*s!<%*N2la=4{Hw2=(Q2&5gGnuU!=E-#3liuI7J!v)fw9m$d!n{eV3a_J*hQiLEn zuy0wCr3o+Q58)Om2zMs!!SGAx2%SyTKx!W)kdAEP9t@nK|EJPDS|FX+kv*6##b4#& zcOD9rka~<2NN4tK4|>RhKlWxI`wLp7XN*9)unv1MaGbfyVIWi?_gH~+Wi$4o`O81b z1(C{UsC0@GNH=y7DowP?WaQ8DT-$ho(C>*@z|G0ojxF3P88-H+ct-X6BD-vc>JMbM z8z)>m*pPkrJ)}a8%mwloh)V(xHg6x^l85pq<3+Ww-#`H-iB5kH%zNVB700QXzlY?> z4?QxK3dMZPqq2#@fle6d{462ZKN@d>V>%dS+8aTT08z)3xYJJqL0ef+_7 zym5(9=p5s}sN~oOT90wLCUWF&S<|Ui7v#fVF|!6vWI+6r>{Ri)OQg}4P1}z{-ON{V zSqH4Jek1&uYJv2F3mw(s`;H-hzUsY$OSVMg>_?vQV!?ZYua0Z@X%8yBn4|rG`s4Ct z4YWT{I-DO&U#%8jRxjr@Us@F|h}>?8P#*x7YH*RijO}qe14|D6squ$?QfeSlDjRATmwpdb2GD5nUD^-e-W& zgLMBD0vXDl9z=9De5_suLc`g0r9g%;i)=h6xN{X>Aa{YZT_q47Har`1I*qH)rh;yg zx~l~;oUO`6L5W<2>PRj1L<1SYZe?SAvEzqv6M)cmVD}oKGLmA^XDxE@Eu0cA^&1Sm zlUTM^aK3C{j?{QaYPmcr>2Z}Br`oHUja4)sbF^bRfYf)RPzhn>hfs-7u5u39YmusK z638gl_ArKzH?OBH3L$L01`^8R4`XAS&ymWQYpsBd-YitYSk7Ur)R{b%b;zb&z=|yb z8O?qj#xJ(mCCR;Y7KN-t+MX$pF|5xKskuciU(EBN@El0jtpW*0Lo{ap9+B#^o%oN+ zknb7kX@3(^^KF8SVE2#UTUwqRnFcw!?_SYBA|Yog%efqtv@KG2(RACRr>FDVga{sNiEpBV+g*S?|LXd5&6US3W<0WXGX=DTF}y5ST|h(LgB~L^?d>z$9#@s^hDQ^ zgTDffR#2z?0!d&ij?>DbBO@k24g)biAdp0M{Wykc7DwsH>s%**!-fli1A@lAV4rKgFa| z30fLj90I}$PDm}AbgB6K6SYhZZ{$DFMS{?Hbkmr^qH}RJ;fKb?fwTpR8U+? zF0BBaO1Ie}4Q?*Gh0?rrc+7MsE(4NxT1d@9lh8pDzaI?ZpH}ZgpH|0!Dyk!^lkzI0 zLuZ8ReAe$2-dphUX@#ZZut8@9v4G77p~~dQpVhv1zCaeTi>D+L{j~S;>hKK;xkxVw zVLwkv)*iV$D-E~JzSvo9J12Hkix7Qv;9+qUKP;$sLEbS+!8mDdhecg2b+_guBqXMu(Y^FNMoecJH)g(l6_S9DS-2rf)60 z-FYRDWl+_I8@-biqB`8e2fM3m%!`&~!ecq>eg+dYh0j7=WYclv)9(UdZ0;F6z$tjc zI-(33vw=SalE$u)N;2>J52&y;kk!8gvVs|$#RHEgFQ{$}92Nr0`z?@_Z1`F9pfe9w z3yrM?vb}QazgzKDY}HweS3izqAQswYwW=zR)$I0JoHC{HQBOa8N}p#~QcWOhm~lSM z9p2dVyN~Tq(A(+)S<8I#aZC5$HF8F~FsL-cZy(X#nbx>JD0^SFptngOA2pd8l` z$Og6v|ECa5)42*g_Rv#w16_e^gd5Jp6a(ppbeZRBN#7iEPN6H$IU77Ll)$5!p77Yj z9M9vY(A?GXfSUw_zBct%Um*B>IK25%rSkRT9NK`s;_7TDkS#3#yky!mnm4u{LYskt zMj8nu6QMQw8(RN0k`aaG%tPCX+~M$eY%DysvK|-Eu=%`P5(og&K_!rFY|aIAPc&C? zM`(r!ZM~^LwzGl@7zZ}|p7{jh;24lY<^tKlv@Zfl;cZU^(SRG*SRgxDUqX`kes&X@ z$r~znECsTQEx0H(GvT4^f(RWaIy4c)Zg%4$tzKMYH6JOdHUi0FdY4e=VywrGMxE)Wo}8KkVSO%11}*LJWYvW}P8~|$$3rU@I?7*f7z#OO$W>}7 z&s)rmY3*aCy@Qjpa2un`HehAdShC5MD;uz1ag24F2KyUt0t>dMo{|^ z)a=#*ImlKP(EUzdMoyyk^d_)fTY+S=+XXo4$gL_P1t^5x1H5n+NDecm`~tEN$N^V@9A-N%BbFkLv_UMiMeNc}AV=7%%NSZ(HDr|& zXqO3Sx})s{a+I|y#8H!>OuPrdK(y&7h+{0O5L2g6OGeDmECnd%QfGl2XL}0~iVhEj zem?jWR91Br$O-nI$}x~dDx>-7E%QtdLF6*~D;PF^cG&pUWyL5|JFb^NPO_LQSnSGq z+YZD$pf5<=?JJNxmU9K2m{VOYXao@YM7&pjf&9aMUO}s*SCf%9h;}KE2LlCiigmmS zmHa9)(iaGQ>M_PkAg9^Pt9bM)ZXhGofmB1d7DEMchUJlpJ8ymuWapvfnhY1nSyufT zMs6xEXf_HN1mwjCf#kD(*Jy3#;SNKM76EJLE0A+6^%`PH=B-O_qqe6Qiv@i(7^6U7$l%d!0h*Vl#uCEcYk0RTBln}VY z=3U1vLWd*eK#GC<2op#FE4YrzcyOcx##=ui_re8onbo}k#91j9)Dy^XAkCr#Qph}S z&^sL7uuqUpr@6Dn3gik~LP#1PwSN#6Bao}?<_(MkPd=LH6B?wlB~~EUn9)tB*l4KK z1(F>nkn3#3O;p;CBM+cLuM^J13*-h{cM~--~yLOR*&E2I4b8Aph6bnZQ+5ZGZeagNhI`w`SQmk~-go(tq$ zrXVL&!4dc^i=9FjEGp&AmjpSfY92)cW%9$Ec-VRu$h8H6oKl01!f*LJ{n@~_I9?W{ zSS>mVTcR)N)M`nHCwljA=&OR1s9jW0Mx{n_5xA>?%w8nOY1QZ$nR{6yH&LUbu%+2z zLHk&VrUhK!z_7q*U!ah8h)J)CKvVyVHia z_HPPuR{8u+?>{&+G9EMOvnWh06QoQ{_#Kgu!bmufQXq4cAmwT;A)$=SYlsI+Kqjpc zUh*3nizn+$zX* zHS`osT3E{=6fzxk&eewL$fcASTFR!U!ea^fe2SA?_$J#0>^zh++GD_=MF(`sfc2B#%8d2}nC2ak~Y% zr!q>=*~7SjBT>+O*s^esAota_5^IOH5IKG@q>VWAAJ^Spv zUl^PhbQ+F{;c3xhD2bl^Ogkh9(xRQlEmJ@C-FEn{F^~<11*xgNB`p@7b9$kWt}tfn zQ9)qKY0MT2*xu)Xi~(}`m>{*4@dpAjlY^i;s#FBzvEzc&QFH%53*>SOe2f9X7xs9b z6r`^D<`0aeRonvOQ6t*-8hBcedg}fkFgJj^ST|^)3GUlx1o2Q$oWWeAiVND*8c&6w z>4kDZJk|4OtbtLX?7Ct2ndS)_Dg~ie#GATews#+TnIH^1rs!TFi^b?(ipG&!4iRgh zDxujwh~3!%eQF&v=U)+|q3T`=Uj^_u5{n=z2lCu?LA+E_DQdZt+bsh24FWQ#N{~is zV=3I3!38~pA>byE#kU1%tS*)!6k~X-Ujr?Bfh@Quh_?zkYi(&~CC#xo`FuOvDp>kd z-`+QYAFv8!8I?W*w@bs5ljtahsN`gwD>|EFq5)h%DUo)!6G>V`!PgdZnJBDOFB9c` zgznNFPk93cY^rvi#Y63WZSKPuM6O~z84ojKD z(+)IB8A@&*(Z@nJ+O$kTi=|j5vbeq0Z)vS@x|yIG(YtPVOSQDj>KB>7178_dnO;Dw zjT<2vDSBz`Dt2aiY#MeO@^+BWR$A+R)ct*EJ~&ZCTB*BbnA;@W(&Kj65UiCz#q1bC zTC0$9Yn$Qyu4`nSA6CB*L@_CXv_ZkJg?7eQA3&1DrG5a%RiM;8bAVh&^q5{ROyFPgiJZ8Oso zCr?X48Yk+DVYjtd5Hyd4*i$cwSbODwW_#fcjf6n+Mj+V>1nB_HKGmAjkVw$n1r5b{ zt_FZ&T6iA#vPgAwH2~+0CPQ*Kn0!L;I0mir^()NRM(}k~Z=AQb9umoQq^#=wp||fc z(b*Z_p${X;vp!#_oJY83Em1ytZpI2>yQs@hXAk8DrGB3U6DwB<5(IVBS~_R6ZL-e& z3_F84_FjQd8iZ!QD?*eulLBi}Tzoo`>X=)8yg9JEU`GP%IKSG(_jWoTf&ivu$fbaU z+41RYdLE1X&>fQ-#N)^hT_R3rH?{o&b_o@6KzO4~XeqF6o*>;_rt3@!`eg@lu`j!i zmV4>`WYwo4)I;^Gz(7{Wtw6^g4L}ViZWg2`zM~Pq?PQW8Z0TZ{a05TB*&;YjLu0&p z`%^ZzNk0@m3?eJ?1rG+^Lj6#IXwP96PxHoQ1wE-`t6(AOb_HUxn44}DG<^?E!P^CS z1e&N7%p_%$O%GMi;Cd|wOOG$F76?zUTW)e&yZi71u^f*$(? zc^sPQ5-=q$EpBoeb~q*Lv%$DRw2*ZLKd(I?B2PdBapB5ypc5#-*aD8NEogd*-W3P6 zOdYy-J*jeF%E$t?_81bkf9F$VEzOs4&dQ$0miv|h{h(xBGgZLIjsI8 zym=7Khk^nijm`?v|3Q0o+61Vzgy;p+%?Oilj0<}%h|B=>FNf97?%+oA!4Po~YFb?p zN>)wAkRz7)ckv8+C7r812BLQPQ=`&V!eDFX78*wBMpy zeXFnd_JM%W0|2Kdn(Y!WajgZdXgPy#X(m)sSLi{2X>@QqGb@GhYXKNYAd=@P_+Y_Z z+w!6(XzeGOqha8YfnH684+BpfiuS)D6}$~;*6|XG9%7erg)eu)8a2u}+e+kysAHG0 z9X*K0%V*I-G}5&0AjnYFQWuWg2z0T^vq#TMU2 zoBP5asX-z#3?ekNYZ0`P**5uH2z3T}81dReE{Ra5b2vmO1hohav2!{#q=Jvc=^iz;Mt=+dO-b;#9xSmYuhM+50p zoEMmykZjIFy`R%wN<=yIBGr;$lh^xhN2nLCT3e6FXPq>UqKQ&*i0B*%oirVuiYZ@w zdK^Z^gxGW>J;jDLSQB$cPc=Ski-<=E%)}MBzIc8~%J) zm<1VY9 zp`MM?Ri_f>emq8yi7N007AuSR!QN$PpjUHNjuqrN6@SCp)?PS7Yw?2?x|?q{UJx4_ zX70e|dw>{@GB3EAR=Is93LgWWs-A%SgSL3uMM9Ai%vD*1s`P}!_coD;#d+@LKvunx zJ)0f1A0*w1Uyc=ek_x$r6{eWM+GM&eP{qS03o==y-Ne0Pzc7vL2htIm`osw`MSXD- zuiASL*9hI9(yLSB;suF=7~;f|I0M-QW+Ri5f6KI~2zx3z7)Mbmifk#pcwQXIYtCTRS4Q5yTeH60v`(#o4gs0;RJ;=! zXI{!OSs)WWx&ff>JeNQ%r!z^NyG0#-koLk)FyuGbd-o+5<8&sgz}tA<63T)4D#~=A zjQv@Hq^PLd)*!pb6#Yz-A~PN?-?2!LnJAfJIVCm`uOla?Pfnm%E`C;zu`_Tztqr2< zVv(4Izv(iY5<5M13U*EbFNoIoB1AzI3h1#^@YLG9w8P9i%Qillha5IW3+;yCPU!2j zOoY-@&pT*`6pk)h?u~)oj>`o}$9Hr=)N1v4FVLF6mp6rkwacFjn38K&1Yq*4)L+!@^$dfaa&IA9pqgg4g8kS_8t183~1ZI-zWzje^WY*)R#O z;xf)dXhQ|*?U;u@7sL*Q6mky^Hd$PKT0E|ekMEZv zk*PM^!)!E?8;NFs^dQb}iy-r%l-kynAlj{Mk8r!4Mg8fHvU|RWQHB8WYqgkbnv}g6^R?)uYo90SO~w?1S~rHPcL8mb4A}9F zz%;%RY$jA9*uf5--wn$l=xeqDfnNbk&5@d5kDZ1+QNVpU=C8u51Mu_e-GaYbjhorn zK!>s=TVTa2s9Et|p|e2KJWc0r!v%p>9e8Ms=0TAbvFWMF)am;~a1jL2Ei5>g0!HZp zu8L#-Izp4)VhlJSJRO{D@@{7Y=docys0KZz2tF+QYwDyES8)!2-Y9+tN~`m`5R0J^ zg2=64b0xh*WtXyRF5uT-RCuSG#OwHu`YcIQr@e$sJ`aAh^w}ITH&3`q!NB~+ig^ak zmStazf+2-a(XiNsIGsyYY%|)9DjKXu?jtCqE0i2`BbMSjx-g<(_Y{`Yl3c;9AiN-T z@3iQBQ}w8UqCGe;=fXPL4pzTZ5WKBNNazS%HeH73?f=eYf-F<(YZ(6apl38P9MRPW zh1Dn*WI6t(J^}OGa#g}Q3+w#`0L=&bR)`QCZ%h4;gxph6LaZ=Smo*S$0X>}>RO!~0 z-ck`Y4d3Xz2+jNkH4VU2IYc!LC_wf!7et*auM zt+v-R+WS|H)Y^Bzg8zf|FWr!p>V8e5%edfC8p%ihi~`c{hG=;k2GGMV7=RUuX|`l6 zUD}f8B-y6pgk0)?8Em~b+Tgbve8qJ_fZGB6N6uI8YL3y(={0jk$m1YJC&l1l;<`S$+haKI%wA-F8^&Pe-*Vj z)ku&J)Vw+{v6%f%HyE^FI@L#z57m}BhQEI~7t{g>-BndI6J(vbT*qkZ#}Q0-cW2SQ z?OO`*k?L00XxrrodutGW-i11Ov=Ss2Vu8Azs>vd28+s?O%1<}I7oD*%4D@OBu-%&%A-34~2gb`{kd)f@GUR#CoOdV7Q(%`|O2 z1^Ks>o|Kr8h%SU1L1aIN(J|bPAJxb1Ftp=O!6LRv-Kl4^85PY2?uC{f(A?%xLGth& zkEiC71*Ct)a}`pY$tFj^o-9a(^%1F0RicLx;2+5*(<_FJfE0xa@|jxaVFZrOXDxk! z_y9R+736c2-AuP_Dh|6(inGm5Ol7BLvFcr5>O#)(xX68>{5%c+(GH$NbcSkrxPRkG zK{mUoPQ*Dg?j8#pufwMgLZ<^f7SdnjzEp2`8rZ4vtVY72_E9uz)YF1&Q9pYk6MDcH zjjTjTp1`sO3X+fSTI!0Kw*@rn@{)P`-wi{bGcO zZBrNP8*Mt~jML^FLg94z&5ag>1{6F|wy5A6I8iZsuqO9_N`ssBjT7=)kO+3Sqb+Qy z`e+MSk74sOnQy4fw1h=bq8W?SdM{Cve?gxzv!()UffCT16ZkY<9vLDY@u+_zq z47JN*Mc_MCub~lO=c>~y<&@2$W|9y)pwjFH=6MaaxEbbs4mqrdO|@aPuMepvGezqA zKS}ZV5s*q?A5MW(6G*j53zh504{B3G!#65&tgd2zFl0~nIimSTXf|6=+f#jh1XO2o z_|Ak_J%|}Eh}ci6jhBH_?^*LGAe5A3z+6Fgsu5m>?~rH?Un-mo49^s#5QUr9R9!e` zu{uv(5MPf1A=3ad6Ba;5&GRx^be@A3iOuBfsKroqcRyO?~3{%z*jF82w5J_2~%kOa?dbqllSs#LUsRMCw=dS|g*a z-GdQYm7~7jFio>(i$LFl6ZOq-Kz z;|) zv>cJkM)Zae^qS@6U4qf8bQBI;doz1AHE#~9E`+1 z*MgdycKF*JjF55`0sV16=|W==tXhEWpG#|NT>LatpAB~Onx5*#Fq$93rdJp zOKNg@(iF?K#%nFgyW+8CPn>}s`VIfX!e*+)fnO~2hueR&+rJc_GJIf$B_VElilw7B zR0K3PnzbZx%D;(m0ds0>j!Cs7#N_B7)!L?p&#=W{|4L~&q%Pq@5lD+-$h(cq{g&)W zIsb)I*;LRuRil~F)Sesr_sDsmR8`s~mud<4AIj+VoXU1P03#ok|JhVm*%iRiA+Q8# z*NKXY{|9^#FvXOla!j=pPWgM~mEhex=#94gJ3E}t5t5jpyU$`9HocoOv(#dtkLQ_CGYteuUxgN`E0&q@z>Fd+)spcS zb)`VM#wF57&WScn0W%$iFJFDB=WhV8=;y~Qq#XGxozCm{ho6}rbF41I6v<+dG2a8j zkkxCKOT_7<^=;~=X(?_3zGyUb4vQVX(5mqxWg>7>z1zZQ{dfWEY=ADi6Uam71)=(S i%?fTeeMtJ?|Gzf>{*u*C+CrlGKmE-dJbQeohUGu~q&hSJ delta 45034 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 From 23cf5a52608c3a349d9303e2ed0cfd315c24f961 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Wed, 23 Mar 2022 23:17:22 +0100 Subject: [PATCH 129/146] Added a skip for invocations in radialmenu.cpp --- TemplePlus/radialmenu.cpp | 6 ++++++ tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py | 6 ++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/TemplePlus/radialmenu.cpp b/TemplePlus/radialmenu.cpp index c6962e70b..bb0ffcb74 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/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py index 8bc840000..6a9c1f95d 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -143,10 +143,8 @@ def radialInvocations(attachee, args, evt_obj): knownSpells = attachee.spells_known radialSpellNodeId = [] #Radial Tops - #Label should be label = game.get_mesline("mes/stat.mes", classEnum + 1000) - #But for testing purpose as long as the normal spell entries are not removed - #I seperate it by hooking it to a different parent - label = "Invocations" + #label = "Invocations" + label = game.get_mesline("mes/stat.mes", classEnum + 1000) radialTop = tpdp.RadialMenuEntryParent(label) radialTopId = radialTop.add_child_to_standard(attachee, tpdp.RadialMenuStandardNode.Spells) radialTopBlast = tpdp.RadialMenuEntryParent("Eldritch Blast") From 9dad093ddd20d635494745e7905857a18c0dbca1 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 24 Mar 2022 09:15:33 +0100 Subject: [PATCH 130/146] Fixed spell_eldritch_glaive typo --- tpdata/templeplus/lib/templeplus/constants.py | 2 +- .../tpgamefiles/mes/spell_ext/warlock_spell.mes | 8 ++++---- .../rules/spell_enums/warlock_spell_enum.mes | 12 ++++++------ tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py | 6 +++--- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index ec19ade79..8abdc0ba8 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3405,7 +3405,7 @@ spell_eldritch_cone = 2304 spell_eldritch_line = 2305 spell_eldritch_doom = 2306 -spell_eldritch_glave = 2307 +spell_eldritch_glaive = 2307 # Warlock Eldritch Essence Invocations spell_frightful_blast = 2311 diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes index 3073776fd..8a3cb7591 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes @@ -10,7 +10,7 @@ {2304}{Eldritch Cone} {2305}{Eldritch Line} {2306}{Eldritch Doom} // not implemented -{2307}{Eldritch Glave} // not implemented +{2307}{Eldritch Glaive} // not implemented // Eldritch Essence Invocations {2311}{Frightful Blast} @@ -48,7 +48,7 @@ {2344}{The Dead Walk} // not implemented {2345}{Voracious Dispelling} // not implemented {2346}{Walk Unseen} -{2347}{Cold Comfort} // not implemented +{2347}{Cold Comfort} {2348}{Witchwood Step} // not implemented {2349}{Dread Seizure} // not implemented {2350}{Ignore the Pyre} @@ -61,7 +61,7 @@ {7304} Eldritch Cone {[Blast Shape] TBD!} {7305} Eldritch Line {[Blast Shape] TBD!} {7306} Eldritch Doom {[Blast Shape] TBD!} // not implemented -{7307} Eldritch Glave {[Blast Shape] TBD!} // not implemented +{7307} Eldritch Glaive {[Blast Shape] TBD!} // not implemented {7311} Frightful Blast {[Eldritch Essence] TBD!} {7312} Sickening Blast {[Eldritch Essence] TBD!} {7313} Beshadowed Blast {[Eldritch Essence] TBD!} @@ -95,7 +95,7 @@ {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!} // not implemented +{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!} diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes index 23e5173a6..8999d985a 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -8,7 +8,7 @@ {2304}{Eldritch Cone} {2305}{Eldritch Line} {2306}{Eldritch Doom} // not implemented -{2307}{Eldritch Glave} // not implemented +{2307}{Eldritch Glaive} // not implemented // Eldritch Essence Invocations {2311}{Frightful Blast} @@ -46,7 +46,7 @@ {2344}{The Dead Walk} // not implemented {2345}{Voracious Dispelling} // not implemented {2346}{Walk Unseen} -{2347}{Cold Comfort} // not implemented +{2347}{Cold Comfort} {2348}{Witchwood Step} // not implemented {2349}{Dread Seizure} // not implemented {2350}{Ignore the Pyre} @@ -58,7 +58,7 @@ {7304}{Eldritch Cone} {7305}{Eldritch Line} {7306}{Eldritch Doom} // not implemented -{7307}{Eldritch Glave} // not implemented +{7307}{Eldritch Glaive} // not implemented {7311}{Frightful Blast} {7312}{Sickening Blast} {7313}{Beshadowed Blast} @@ -92,7 +92,7 @@ {7344}{The Dead Walk} // not implemented {7345}{Voracious Dispelling} // not implemented {7346}{Walk Unseen} -{7347}{Cold Comfort} // not implemented +{7347}{Cold Comfort} {7348}{Witchwood Step} // not implemented {7349}{Dread Seizure} // not implemented {7350}{Ignore the Pyre} @@ -104,7 +104,7 @@ {22304}{TAG_SPELLS_ELDRITCH_CONE} {22305}{TAG_SPELLS_ELDRITCH_LINE} {22306}{TAG_SPELLS_ELDRITCH_DOOM} // not implemented -{22307}{TAG_SPELLS_ELDRITCH_GLAVE} // not implemented +{22307}{TAG_SPELLS_ELDRITCH_Glaive} // not implemented {22311}{TAG_SPELLS_FRIGHTFUL_BLAST} {22312}{TAG_SPELLS_SICKENING_BLAST} {22313}{TAG_SPELLS_BESHADOWED_BLAST} @@ -138,7 +138,7 @@ {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} // not implemented +{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} diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py index 6a9c1f95d..ba216a301 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -120,7 +120,7 @@ def AddQuerySecondaryTrue(self): #### Warlock Callbacks for other functions ##### def verifyEldritchBlastAction(spellEnum): - if spellEnum in range(spell_eldritch_blast, spell_eldritch_glave + 1): + if spellEnum in range(spell_eldritch_blast, spell_eldritch_glaive + 1): return True return False @@ -161,7 +161,7 @@ def radialInvocations(attachee, args, evt_obj): if not isInvocation(spellEnum): continue radialSpellId = tpdp.RadialMenuEntryAction(spell) - if spellEnum in range(spell_eldritch_blast, spell_eldritch_glave + 1): + if spellEnum in range(spell_eldritch_blast, spell_eldritch_glaive + 1): radialSpellId.add_as_child(attachee, radialTopBlastId) else: if spellLevel < 3: @@ -211,7 +211,7 @@ def performResetEldritchBlast(attachee, args, evt_obj): def applyEldritchBlastSpellLevel(attachee, args, evt_obj): spellEntry = evt_obj.spell_entry spellEnum = spellEntry.spell_enum - if spellEnum in range(spell_eldritch_blast, spell_eldritch_glave + 1): + if spellEnum in range(spell_eldritch_blast, spell_eldritch_glaive + 1): activeEssenceEnum = getActiveEldritchEssence(attachee) if activeEssenceEnum != spell_eldritch_blast: spellClass = getSpellClassCode(classEnum) From 9defe5c78497b9f6643a838eecbd4ce743fc9a89 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 24 Mar 2022 10:56:37 +0100 Subject: [PATCH 131/146] Warlock Updates GSF (Invocation) did not work with brackets, so I did rename it without brackets Started to add Eldritch Doom (WIP) --- tpdata/tpgamefiles.dat | Bin 3872690 -> 3873972 bytes .../tpgamefiles/mes/help/warlock_help.tab | 3 +- .../feats/greater spell focus invocation.txt | 2 +- .../rules/spell_enums/warlock_spell_enum.mes | 2 +- .../rules/spells/2306 - Eldritch Doom.txt | 19 +++++++ .../scr/Spell2306 - Eldritch Doom.py | 50 ++++++++++++++++++ ... feat - Greater Spell Focus Invocation.py} | 2 + .../tpgamefiles/scr/tpModifiers/warlock.py | 4 +- 8 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2306 - Eldritch Doom.py rename tpdatasrc/tpgamefiles/scr/feats/{feat - Greater Spell Focus (Invocation).py => feat - Greater Spell Focus Invocation.py} (66%) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 3be3454169cb7ea86a9f11722e0a8a2c8590785c..33ac99dc554792a5f2cf8c0dfe30b5888d08dd98 100644 GIT binary patch delta 48226 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 J$EL-!{|9!YvRVKD delta 47263 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�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 diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab index a3517585e..892e7b8fe 100644 --- a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -7,9 +7,10 @@ TAG_CLASS_FEATURES_WARLOCK_DETECT_MAGIC TAG_WARLOCKS Detect Magic Beginning at 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] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +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 1d6 additional damage for every two Warlock level after the first. 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] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! 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] Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This Blast Shape Invocation allows you to invoke your Eldritch Blast as a 30-foot cone. The Eldritch Cone deals the normal Eldritch Blast damage 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: 20 ft. Target: Any target within 20 ft. 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~[TAG_SPELLS_ELDRITCH_BLAST] damage 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 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] Duration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This Blast Shape Invocation allows you to invoke your Eldritch Blast as a 60-foot line. The Eldritch Line deals the normal Eldritch Blast damage 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] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! 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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! diff --git a/tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt b/tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt index 11a915911..43a8db519 100644 --- a/tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt +++ b/tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt @@ -1,4 +1,4 @@ -name: Greater Spell Focus (Invocation) +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/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes index 8999d985a..a92c2df10 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -104,7 +104,7 @@ {22304}{TAG_SPELLS_ELDRITCH_CONE} {22305}{TAG_SPELLS_ELDRITCH_LINE} {22306}{TAG_SPELLS_ELDRITCH_DOOM} // not implemented -{22307}{TAG_SPELLS_ELDRITCH_Glaive} // not implemented +{22307}{TAG_SPELLS_ELDRITCH_GLAIVE} // not implemented {22311}{TAG_SPELLS_FRIGHTFUL_BLAST} {22312}{TAG_SPELLS_SICKENING_BLAST} {22313}{TAG_SPELLS_BESHADOWED_BLAST} 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..c16586228 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt @@ -0,0 +1,19 @@ +School: Evocation +Component: S +Casting Time: 1 action +Range: Specified 20 +Saving Throw: Reflex +Spell Resistance: Yes +Projectile: Yes +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/scr/Spell2306 - Eldritch Doom.py b/tpdatasrc/tpgamefiles/scr/Spell2306 - Eldritch Doom.py new file mode 100644 index 000000000..c16659cd9 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell2306 - Eldritch Doom.py @@ -0,0 +1,50 @@ +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" + +def OnBeginRound(spell): + print "Eldritch Doom 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] + saveType = D20_Save_Reduction_Half + spellDamageDice = dice_new("1d6") + spellDamageDice.number = int((spell.caster_level + 1) / 2) #capped at cl 20 (9d6) + damageType = spell.caster.d20_query("PQ_Eldritch_Blast_Damage_Type") + if not damageType: + damageType = D20DT_MAGIC + saveDescriptor = D20STD_F_NONE + + game.particles_end(projectile.obj_get_int(obj_f_projectile_part_sys_id)) + #game.particles("sp-Eldritch Doom", spell.caster) + + 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.num_of_projectiles = spell.num_of_projectiles - 1 + if spell.num_of_projectiles == 0: + spell.spell_end(spell.id, 1) + +def OnEndSpellCast(spell): + print "Eldritch Doom OnEndSpellCast" + diff --git a/tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus (Invocation).py b/tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus Invocation.py similarity index 66% rename from tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus (Invocation).py rename to tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus Invocation.py index a12d68f2a..3afef2ee6 100644 --- a/tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus (Invocation).py +++ b/tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus Invocation.py @@ -2,6 +2,8 @@ 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/tpModifiers/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py index ba216a301..d6df241a3 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -120,9 +120,7 @@ def AddQuerySecondaryTrue(self): #### Warlock Callbacks for other functions ##### def verifyEldritchBlastAction(spellEnum): - if spellEnum in range(spell_eldritch_blast, spell_eldritch_glaive + 1): - return True - return False + 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): From c69885e56451203fb8949ed3d4f955375a687a7d Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 25 Mar 2022 09:46:49 +0100 Subject: [PATCH 132/146] Warlock Fixes Fixed GSF Invocation Fixed Eldritch Blast DC modification --- .../tpModifiers/greater_spell_focus_invocation.py | 2 +- tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py index bdb74eade..6786bc01c 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py @@ -15,5 +15,5 @@ def dcBonus(attachee, args, evt_obj): return 0 gsfInvocationFeat = PythonModifier("Greater Spell Focus (Invocation)", 2) #featEnum, empty -gsfInvocationFeat.MapToFeat("Greater Spell Focus (Invocation)") +gsfInvocationFeat.MapToFeat("Greater Spell Focus Invocation") gsfInvocationFeat.AddHook(ET_OnGetSpellDcMod, EK_NONE, dcBonus, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py index d6df241a3..6cc49cc91 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -210,13 +210,14 @@ 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) - if activeEssenceEnum != spell_eldritch_blast: - spellClass = getSpellClassCode(classEnum) - spellEntry = tpdp.SpellEntry(activeEssenceEnum) - spellLevel = spellEntry.level_for_spell_class(spellClass) - 1 #Eldritch Blast itself is level 1 and is already applied - if spellLevel > 0: - evt_obj.bonus_list.add(spellLevel, bonus_type_untyped, "Warlock Eldritch Blast spell level modification") + 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, ()) From cfe5f4cfea147d1e4c64f3f0f960c72cced54dfd Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 25 Mar 2022 10:31:21 +0100 Subject: [PATCH 133/146] Finished Eldritch Doom --- tpdata/tpgamefiles.dat | Bin 3873972 -> 3874093 bytes .../mes/spell_ext/warlock_spell.mes | 4 +- .../warlock_spell_long_descriptions.mes | 7 ++++ .../rules/partsys/warlock_partsys.tab | 24 ++++++++++++ .../rules/spell_enums/warlock_spell_enum.mes | 6 +-- .../rules/spells/2306 - Eldritch Doom.txt | 2 +- .../scr/Spell2306 - Eldritch Doom.py | 37 +++++++----------- 7 files changed, 51 insertions(+), 29 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 33ac99dc554792a5f2cf8c0dfe30b5888d08dd98..b92f3576b3393c5fe67699d271d63469cefc50f8 100644 GIT binary patch delta 34274 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

ORijk*JX;561+g=k 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 delta 33824 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�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 P*YWCG+)ij*%;*0B=&A<6 diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes index 8a3cb7591..2dea1e827 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes @@ -9,7 +9,7 @@ {2303}{Eldritch Chain} {2304}{Eldritch Cone} {2305}{Eldritch Line} -{2306}{Eldritch Doom} // not implemented +{2306}{Eldritch Doom} {2307}{Eldritch Glaive} // not implemented // Eldritch Essence Invocations @@ -60,7 +60,7 @@ {7303} Eldritch Chain {[Blast Shape] TBD!} {7304} Eldritch Cone {[Blast Shape] TBD!} {7305} Eldritch Line {[Blast Shape] TBD!} -{7306} Eldritch Doom {[Blast Shape] TBD!} // not implemented +{7306} Eldritch Doom {[Blast Shape] Deal Eldritch Blast damage to any number of targets designated by you within 20ft. Reflex save for half damage.} {7307} Eldritch Glaive {[Blast Shape] TBD!} // not implemented {7311} Frightful Blast {[Eldritch Essence] TBD!} {7312} Sickening Blast {[Eldritch Essence] TBD!} 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 index b70aa5d66..427a2894f 100644 --- 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 @@ -49,6 +49,13 @@ 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 designated by you within 20ft. +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. School: [Invocation](Eldritch Essence) Casting: Free Action [S] diff --git a/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab index b580ec455..d9c5de804 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab @@ -7,6 +7,30 @@ sp-Eldritch Blast-proj Fire 0 Point perm 150 Object Pos Cartesian Polar Sprite 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-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 diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes index a92c2df10..c5aafc805 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -7,7 +7,7 @@ {2303}{Eldritch Chain} {2304}{Eldritch Cone} {2305}{Eldritch Line} -{2306}{Eldritch Doom} // not implemented +{2306}{Eldritch Doom} {2307}{Eldritch Glaive} // not implemented // Eldritch Essence Invocations @@ -57,7 +57,7 @@ {7303}{Eldritch Chain} {7304}{Eldritch Cone} {7305}{Eldritch Line} -{7306}{Eldritch Doom} // not implemented +{7306}{Eldritch Doom} {7307}{Eldritch Glaive} // not implemented {7311}{Frightful Blast} {7312}{Sickening Blast} @@ -103,7 +103,7 @@ {22303}{TAG_SPELLS_ELDRITCH_CHAIN} {22304}{TAG_SPELLS_ELDRITCH_CONE} {22305}{TAG_SPELLS_ELDRITCH_LINE} -{22306}{TAG_SPELLS_ELDRITCH_DOOM} // not implemented +{22306}{TAG_SPELLS_ELDRITCH_DOOM} {22307}{TAG_SPELLS_ELDRITCH_GLAIVE} // not implemented {22311}{TAG_SPELLS_FRIGHTFUL_BLAST} {22312}{TAG_SPELLS_SICKENING_BLAST} diff --git a/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt b/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt index c16586228..d7b6b7b23 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt @@ -4,7 +4,7 @@ Casting Time: 1 action Range: Specified 20 Saving Throw: Reflex Spell Resistance: Yes -Projectile: Yes +Projectile: No flags_Target: Range inc_flags_Target: Other exc_flags_Target: Self diff --git a/tpdatasrc/tpgamefiles/scr/Spell2306 - Eldritch Doom.py b/tpdatasrc/tpgamefiles/scr/Spell2306 - Eldritch Doom.py index c16659cd9..eb1afdd02 100644 --- a/tpdatasrc/tpgamefiles/scr/Spell2306 - Eldritch Doom.py +++ b/tpdatasrc/tpgamefiles/scr/Spell2306 - Eldritch Doom.py @@ -10,18 +10,8 @@ def OnBeginSpellCast(spell): def OnSpellEffect(spell): print "Eldritch Doom OnSpellEffect" -def OnBeginRound(spell): - print "Eldritch Doom 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" - + targetsToRemove = [] spell.duration = 0 - spellTarget = spell.target_list[index_of_target] saveType = D20_Save_Reduction_Half spellDamageDice = dice_new("1d6") spellDamageDice.number = int((spell.caster_level + 1) / 2) #capped at cl 20 (9d6) @@ -30,20 +20,21 @@ def OnEndProjectile(spell, projectile, index_of_target): damageType = D20DT_MAGIC saveDescriptor = D20STD_F_NONE - game.particles_end(projectile.obj_get_int(obj_f_projectile_part_sys_id)) - #game.particles("sp-Eldritch Doom", spell.caster) + game.particles("sp-Eldritch Doom", spell.caster) - if spellTarget.obj.reflex_save_and_damage(spell.caster, spell.dc, saveType, saveDescriptor, spellDamageDice, damageType, D20DAP_UNSPECIFIED, D20A_CAST_SPELL, spell.id): + 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.num_of_projectiles = spell.num_of_projectiles - 1 - if spell.num_of_projectiles == 0: - spell.spell_end(spell.id, 1) + 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" From e8c7116ec9be69587471b1274926871b27a5aefc Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 28 Mar 2022 11:46:28 +0200 Subject: [PATCH 134/146] Warlock Updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed Eldritch Blast Damage for higer levels (ED is actually not complete linear) Added missing particles for Eldritch Spear and Eldritch Line Added missing descriptions for Eldritch Blast + Shapes in spell_mes and spell_long All Blast Shapes now have a complete help entríes. --- tpdata/tpgamefiles.dat | Bin 3874093 -> 3874682 bytes .../tpgamefiles/mes/help/warlock_help.tab | 15 +++++++------- .../mes/spell_ext/warlock_spell.mes | 14 ++++++------- .../warlock_spell_long_descriptions.mes | 19 ++++++------------ .../rules/partsys/warlock_partsys.tab | 4 ++++ .../scr/Spell2300 - Eldritch Blast.py | 2 +- .../scr/Spell2301 - Eldritch Spear.py | 6 +++--- .../scr/Spell2303 - Eldritch Chain.py | 2 +- .../scr/Spell2304 - Eldritch Cone.py | 2 +- .../scr/Spell2305 - Eldritch Line.py | 4 ++-- .../scr/Spell2306 - Eldritch Doom.py | 2 +- .../tpgamefiles/scr/tpModifiers/warlock.py | 2 +- 12 files changed, 35 insertions(+), 37 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index b92f3576b3393c5fe67699d271d63469cefc50f8..8507881671514a9898107a6c7c7d4378eda5aecb 100644 GIT binary patch delta 45858 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 G+5Z9C{v4(N delta 45180 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 Date: Mon, 28 Mar 2022 12:07:35 +0200 Subject: [PATCH 135/146] Warlock help updated --- tpdata/tpgamefiles.dat | Bin 3874682 -> 3874655 bytes .../tpgamefiles/mes/help/warlock_help.tab | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 8507881671514a9898107a6c7c7d4378eda5aecb..f5298b261474d805daaa337678369b93d8068db6 100644 GIT binary patch delta 31221 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 PwsQK+lgo*DX^iiG2*V!g delta 31532 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 diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab index 11eb0100b..fdfbc602e 100644 --- a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -9,11 +9,11 @@ TAG_CLASS_FEATURES_WARLOCK_DAMAGE_REDUCTION TAG_WARLOCKS Damage Reduction Fort 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 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 TargetDuration: Instantaneous Saving Throw: ~Reflex~[TAG_REFLEX] half Spell Resistance: Yes This Blast Shape Invocation allows you to invoke your Eldritch Blast as a 30-foot cone. The Eldritch Cone deals the normal Eldritch Blast damage 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~[TAG_SPELLS_ELDRITCH_BLAST] damage 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 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 as a 60-foot line. The Eldritch Line deals the normal Eldritch Blast damage 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 attacks to great distances. Eldritch spear increases the range of an eldritch blast attack to 250 feet with no range increment. +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_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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! 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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! 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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! From a93ae4521600b3cb4bf4ba5b7ee298011f42118f Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 29 Mar 2022 09:10:24 +0200 Subject: [PATCH 136/146] Delete warlock.tab --- .../tpgamefiles/rules/partsys/warlock.tab | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 tpdatasrc/tpgamefiles/rules/partsys/warlock.tab diff --git a/tpdatasrc/tpgamefiles/rules/partsys/warlock.tab b/tpdatasrc/tpgamefiles/rules/partsys/warlock.tab deleted file mode 100644 index 02229781a..000000000 --- a/tpdatasrc/tpgamefiles/rules/partsys/warlock.tab +++ /dev/null @@ -1,19 +0,0 @@ -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-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-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 From d78f23352ae1f6e58deaf2b3d1b9b613e4a040ef Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Tue, 29 Mar 2022 12:21:32 +0200 Subject: [PATCH 137/146] Warlock Update Finished Eldritch Essence help entries Added Eldritch Essence spell_description.mes entries Finished spell_long_description.mes Eldritch Essence entries Added particles for Eldritch Essences --- tpdata/tpgamefiles.dat | Bin 3874655 -> 3875684 bytes .../tpgamefiles/mes/help/warlock_help.tab | 17 ++++-- .../mes/spell_ext/warlock_spell.mes | 52 +++++++++--------- .../warlock_spell_long_descriptions.mes | 48 +++++++++++++++- .../rules/partsys/warlock_partsys.tab | 22 ++++++++ .../rules/spell_enums/warlock_spell_enum.mes | 18 +++--- .../tpgamefiles/scr/tpModifiers/warlock.py | 18 ++++-- 7 files changed, 127 insertions(+), 48 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index f5298b261474d805daaa337678369b93d8068db6..2a5f27dc6570b8e8b8f8e65e45d3bdf8cbaf42a2 100644 GIT binary patch delta 54414 zcmV)2K+M12zU%?y#_R!rgaL#Cgad>Ggaw2Kga?EOgb9QSgbRcWgbjoagb#!egb{=i zgcF1mgcXDqgcpPugc*bygd2n$gdKz)gdc<;gdv0?gd>C`ge8O~geQb3gein7ge!zB zge`<6Ck$3luQo~gi-Q5;BD3|)WUcU4V-YHK8;Zym zQyE4o5Ya>l_(r>a9Ky33J%UFvf}Y0XI8>pS=um`y>~4z-&(*gIeh5Y?P(djCK+N^O zWZ;B#F`xKC&SrrxM-w4~k@QsBUEs$z6B=o%934+_uHj6%ZkV5$_U`;!7;xs#RWOd- z(&wHZO|*Y^Bc^_!aEhLQ|I~Qw2NCu+*Dg%)cp)Y-@KhLLQ=Gc?fE;EjK$9Cij?ym2 zN(P}nRl-p~im8T{+Q)t!F~&tE{pM#03qyLr`zd}Og|wJF*@3LmjV5(5R5!796)k+O z#P zgargXjH8Jp(z#O}%mfKAlR>l)GDKt;u4POUbKt78El%M}(;v~+)l(fQ2fM@h$)R?2 zq+!UBKZOqA4WNfcMi#<+Ts0!PC0rd5vXHkxNMw2(Mj}w|LipTex;$Dj4m5KmlRN8| zmQH`D_7XgC$J?TVFqC2li>TuO{y0*e7;7NjP;rOStevnd-9SkPp#jT596`sqnIcJ| zxnCCm8khynF!uC6W0hMw0Q*im_;Sk3g6EN&LfjW1D+n6;nh50qNy0ZUAy2`~kcY<- z+BBj_0vC}q^s_DRlsNW1l(o+&o#H-{Lsx&@{{w}dg#G%&Y78#=mYpbs>p|nVW7$`= zS`!Eu3i}p78h)+`_;Y{kg5>ho$DNClldHP8Z~Cw>FA50Xre{zmR(H^E4BEXev}p!% z9MwfjhXC3TRK|VVivS4@NDqI}?he{#?N(!8LG%BOr?a~F>iKh5IX7yPI3&07k4S&B zxWKot@ECxgZ(thm@I3IxD5?O9%}b5V?rr4(QO^8G-P*2A+6oII6M26>1vV3z<)0zV1uSZ zY|J&Jm%NgW^^4WHKJIldzy@4l!xK<|I*J{$)RSI+&>md0tScauOo+JrSznD^^*g`q zTPGds*GE3M1mf|#%XX);qH%3k6#o2A^!B}2=g*3U)vw^`UTtsb+3t&twqJkSU!K9b zqwPNN9gTOe{OkqCJE$H0;PH-@pRGCE-qYT})5F?_A`_M)OL5v&pz%v3dd&-wO4-jY3ETSt^jMrE1Z69 zcmKu5NryTpiQxO4N74SAkv@Obb`Q(azPqy;e=7v9`W26JR32ww)^45 zNBCHNw!gCi)+lh|39pFwwcStUX9qhgfcCsW_TCqt9PX@u*b|2!%CB^>EO5ixgXSst zxD9*29#^HqWhJr3F~u4!2_Cyj-K@&D-~>Y$AVk@bfobhJN6QWeK3sqD3-;jQLDj=0 zSnR{YqpF8X*6IKreyn=9r2Y?`3O!8^mz=XBe7aZlaKGx|LFwTKe0W&(@TltHhtk83 z`0!)Z!%r0t_udzueR7UgqU6$QocFrdjs97$e|_HXoe)IQv>YKZ&8Qp3Yo~?V*!!TMQ;@QP~(Go(Y7ZG{P{BFqgqE!ik1p zINW{$*2_yMLU;q_0FiJ2VCLX;k;`4UN(NpimLl+Nk);RurwiYG0OtcBy^`ShY$%4!W~6(gs^`UdQ;=E8bu*Q$_=k9 zn3#tUfm|5c!#}+n$`>5H7h|Ph1#Q#lo?c;&0uvg%8jey1y$hgWV=!nmzh0Td01t`j z5tsp{YGiPuAPffX`g5F==ZjF@;lD6xGzUs8%?;NY3Qz(-911OATFKHQu?sC+(l$s3 z={Oo=@EmnQ%6WfWrb)0-pd{wqw8!6V3tMpx>3*e76N5+7231P)in11z_|YC_wJ1kW zwNA}5RsW3j9WdUDIOPZne8&rV1*XM{1J|n_3d&95e0c2QtSF0=j>rQsuF9#WP=tT+@HYSf4$g@ui1u|DN%#bD z5KYqLC1oDOIiTERQYZmPd}TNr1T(e(=z)KiB(2OeM-w&T^eemyMwojn4+>+3zM&qp zTawhJH8B1r(oJE9-P58-mT;umqxM4O`qq-^rIm^XHOz>@1@95Mr&;ZlIW2{^9@WE=aVm|+DZaZ-i$Ktg<(w9;GT0S*1& z&|yO3I_od&f9xkJ=AW^2HJA&Y*5@3@-V`T{R3v}uy`wyQy1bu_I)*vq#%6I1)EGq@ z6dZud!K|<3WG$@;5lT7tMC$`F{n^Y9qSyn|L1@c$iK`qc;pi}kXAx$yf5X%+=a&h_ zrbQ5I4|K4@S!iTC{GF#4njkOIk;~a+DGC`%788=lcr*f@gOLGgU;-D`I7Sj{aKnZ`gnq+2*l-vaN>4u}`I-JTha|`y8()d-9LIgym1VRuq1(vp;F#lb9bFMWaCkQcmZbyS z&5@X*Py9ioD|nY^tPz3u=mz|lh~B~Qpm}cdLN-)4+B3f8ZL&2$V&LUH0^C;AxG#m$ zJ4`o-057=BL$ei|H0~Dk9_F}sBe8#ff=o!(!}z|Qnitn5(F2%H0Yv`-T?D8kH|jI` z@~KlsD#rTd;ygcOKkb@OD6% zjd1@ElxZBYrGd~;;r4%~%gsLd&$R2yTBTOYylK$^{qnhX-ywYFyzFEI~Ig< zSJ;vOyt=7vTYYHz#h_tT<1c*(1E_TixU#ZotI_|udQ-Gz4Xozi`mBHPrQIxt5G@rU zzi8uj;}~rN<0uk)z==wvqhsdqXKX4>AkCakVj6L(OMVRbE9}G*hm5bXdg=|BwRPRM zS{F@R?b7r)?CL8gCg*yC_GG~sanM1eS>+2v*bTb!@`j5Ldj*KK)ewE?WJ=ohFXh4p6R=T*&UH)f7KzTisUMJ_VZF?GF6V zw8}(30ilFQWCCOlK@(tzUxd!bDkaJ44p|Zf;4qj z4nRyfdP*%Xm@*Y`bQLLf;<$(hg?vv;wHJef4LZYwBhUn+M{Hd$cm(XPj8W1j5YOWh zcG)Y~-LF^&aG+w^DHCu&3o-mkEA%eR{zU4 z;quj?3Atg(pL18IehlTMp%>b*&XiP(RDwDCRa>;-EW@DqusFbtI_n8e?nQ6?W zi>_*>#3o5!nj#Xz+bgkGYx)qKcpytaa=X^#bb%P?Dfr>L;=Yu+Fl9dg6EHfh>jtUh zt6Cq4_?Z&I(ROV>iQLZ^3u0cEf2_4)4#_`LVhNNg_y&F))@)Ak4lu?0S#)78H4gVO zynPnmRQP{)YWnZg^h>0st3|YV+GuxIizqsCnT$3kpc0-XqnkW)8z;8)n7|&qq`>Zq zx8S547M!+FY@#o5nE4NT@3+2#Fb~M_%7GxqaFdlnxB%~yWInO`zR2%f8Dd$#UXlM7 zb5x`;-bKfV>RB@d&GP=!Z}D^%{*>j8coUDMo-%*>=!%6!^b^C$5y7vil}ErLp$Wl- zL_RD`FC6B<2m7pf zYyXM97}1K%Ldu_$LpIi>O%+Unk#tgDA=v0!wure&C&SCU(}1R#e7fp(hdE1372&}8 z>ZX60(cb2wQVf61l#|p|HR&N*ywg~D?|a6dFza}eu|A2vQTt*oYOVqv)6ChHLJ=0J zwwr2738zHVUPkG9#fM1>9lSf^{{yRNS*8OZag159adLhj0TAva&^{DCG)O>HLrO>sqU{sEKlOY8069 z@>=xpyK2$B!$0o#RMrF|KUeC{+?sP4g0lXkvmH-YpA>lQzkfIO!Bqxjps2_~6j)`v z9K@H0PJ&w=!9ejD{s(Gn*Db4090?qJiF47k2|`;6 zK7LpE*k|!*03AOQpujIjLcXYItmj%hUo=R~VsamFRp5?6=17t&I`mz3{ih2c;V8{O zVairQ{O-qG!~lRnjqNEJ3{#6;D#w4p-i^S0S1AL`d+~H=_Lz*kIY8ALJibMFH1gbG znnnuulJM#&LRbjFRtaI=-hE$L>$IO}jyn4FnWLk;xE-;$;Yq|-Zi$YJCBmhYED>_) z-@y{$(!aArz|W2T6H-xt0U5l!MC|?P9JJ@gvg-GUocX7N-h_96KH8(h(jR{s6yne# zJ960}L`j+ilS{c86J0=;L=p^!D1u3V$vsVh>P5I5TbDSscK6HUxywX{9;-Qyj3j)1 z{&F*2fW_&WKdwtpvaJMjYOiluDPl4(*hFl@+*RqRqK@N)^3&PP=?PJ$T1gR@@DIza zmYQ-nN0m@qO(FT6#s2&i_Vw9A~+t|r7x zQzoWFGSP(+_g|cMoJq|pjLWdHPaCb?WrRQIB7|R`kH9#A>boM?u7v1i*N-!&-0vfD^2#So3q3?emjfD^28w;3> zi9iE~bhW{=d7LN3D#ej+_f)MBMzQB5%(Mp=-ENtgPt*bZ_L)8Cb*=R^K%l2#gn{^v z!Yl!v)vhpmCa^>-o5Bp~?-I`?;RZ4$vCS4(T9{8Het4NU+&&K%=5oB+ z0}Bi`w@majR>*iXOg21Bxx*Zy5f4jC485}a^~1BED?Dftb*z6%p;B)kIBw_xFpL#JQ3(Ry=80%)=kx#}(MLSpTFx^=^`7M|u~R2$&3Yw9kxMbnIE zsw?$$O4a?er&fQoNy(9z!kHCV2i{MVmVjsVB4#>OD=0$#6#fsUZGE$L3iALNQh$53 z>m$BMGgO4dCr05?+1+C{jq*7hALsYQ*6?v7Zu#y2cg>{BFuQMIS zl;dMj4w<^2llo{bpTTOMG@dgja5xQ)HXn-?3Sxg?x0~Rpu9;`NeRq`1U1tey>*zAa7ap#UXq_E3xhyrb>Isz{}P&R^Pt ze!JIcH`iCuzvw8?zN<%nE9mv{St1(h%+ezhIN%us!!oWA)C2?cF7YrKdRzdN-(u8i zd|rRSoJiME?z|^=S=36~4CD!#L0K^h;llv)n#Uk5QHAh(_mtIbN+KLndzt#J% zf}}LSwAhw~iro5UuKQf6#~Uz!trRZNTBv{U&wQ97la9RuF#(8&V!gfSuFnzB4Hc3W z&b9d+kxbm%Gd~r( z9!MGcEzEsE*EAs;mGfDoU6X?36Z?cmytOw_6NM)ZL9}B)9G(w%hYFAM6BIHvGwHwJdZB2{-kq}9$H%oietJY8VTF>#%@f<*#64E7@70wSfia?FHPx+ zndh968WKqa^duKJWC-8qIH4tV35_Zk%AJv_%BOKfUgq zTn|pI>n^5}*WfK`%t-?CE@tXpgtvdY-@st9T<5p2WHhY~G{O=6?q&0Gn zbV?M~ffu^J2$lB#91;+S*h@|VOZYz+S&!~NLX(Aeqv2U`%oV4nC<3a>3=|S>1ts1-?pp3<6K+GW6QG78}0r&00UN0O;SsRGpU0Y0olR#2HCj+FWsZVV4kLdK{2US4V!9TA>t-=fpYa;SCcx_P96nRSJ?I#^~aFG?;3%1*K7Y=KD!gdAR{@lmqd`ffK(a-;e;3G)E_ zM}u3gW4!M7Fmdp3J_>6$u6teUjeXs_1ejbjzdo+h=_Z7pr{093H}`);2OQzQw7tfY z%wu`y2U)aE4P|Q4jjPa|qo5 zMp(YIMoq031^x_zB0wS5DG{0;+86V!V zbcZ8~bvM7Ihbb{@G)!(t$2HVXxP}%H3p`zYJ+ny0FyLQ-|rV z^uap=C-@7KHuny(8eO~<^!Lu5$(vLni=?JX@3HI0pc^W1=p4HB8g}m-JUYvg4L({5Ab(N%>r~T`9jq6$Z>yad@!SrIk4o)MW8&2b;)CF zf9c|{&q5@gf9tOU#5QM!kdo(%;FTcp8D@T&zxk`X7KshVC?mL~d+u^KzL>*XSag-U zI|WqF>Z?=ex-3tRw(?%WeZ`IrvW_=!%q1~pSD|n}X>R8#e?LloW(JeSvg3_gATn5BYyC)k67R;RwB{<;!-3^0)eW&eA5)!+S(vozLxSVDj~G@1omUBe~d7a>gY@ z$CN((OFN|xB#_wEoXUTZNxn(0w|pRPbSz!IjtN3W{VL1*oT zeFg@(+38)h9%s&(mf;j^d(-t}=iev=WE<0e(S?71b=TPGG?xFugAmvI%R=~Zg-ZwQ zj8kfkUYURk6b@(4bN6RpJ^*@v$Ech~={^nlp?ncIJDEt|Ha8^UDAxM`vw)IqyG{G& z->ThAjDJn~{^#@#zd%`mO*rN0JcTl6R*r^5p9FT6g~ zYi z^T3+HV<04Z!Iad~`ugjqw7dIF*wn;Vbf&LOEW9$B66s>A=KQ~V_Q$h7c6Vt!muX7p zB9ryXyEL)N$1^%gh4VC?iMb4vKx{b}_Ij&je^YQ(uJ?m==oYqGAFP(ADv>645H~j~ z!b#eAQrSF}nbck;rQk47a6A)AR|=wV-Dp`Y?*+^6)$Q_ruskv*tCkOf<-b#*uH|MR zO(NboCv|+6gg%Ttv1&T=lROPs=)>Bvim#+rdfM24bw|?8L}G4a(%6B0M^IR{F$2?9pU(?>1;a`f>= z)B8NWsx~XF1uQ?&yY-b*oeBs7A@Bacc6UT852dDU0L3 zXeVWrOhZJ-c#d?mHzK|2q-cnU8Jj$X8P{y$VQxjG0P%5%x&h_9@oph2AQ3o0f7aS6 z;UchboLeWEgpqV}p{jxqfr1k*Jtt|wOBaR+Y@DQ(4dYnW86JU)&sZ8sk$|NwRz%?D zD|{Rm2{BTxN`dYVz#408P!@r*W0NMRJ=w(A%8?Nm`o<}EV@yJ0FX!D_LD|SM+Obss z=2mt}?t#OzsW!GW`eI?(=Ac@Se;Q?cdBD}UUACA1G#9?pC!wdPIo{-06W$B-20s%X zT|uOd`pG^eA`?@&L!;uCl#T(|Nk=F%GpZX(Dz9bgcIa4Wx|EceL`@VlUoN(m%$-$< zwI5(DIs`4(Qs18kUFQWpuMsd4mM!2&YMNFn9;_&AF`%GR@8_e@pB?-ke{c(;W((S; z3Iago+WdP%f@1!7hfZ=ht>l*1*_1iTxv&fJ!cL`sMKh630ud);qm#7&*gm98fz+gA zA*nrh34X3hddkx(GNRB1ZYe)$!m#&x;&%ve5Eti$QUg(ojYb@CJrXHMM`@x@a+1m) zQZC z$1pY3!k0O-FnN(*2(v+tt$6^#g8*SU$81TWt-+2NhFUXBQ&l^qIVnjbi7F<_Dx6WQ zvThzKvjqwoMjuQ?g;{+Bw9Y*e8v1A=R0=-6DWnQpzC#}{A-q1Ee@tY|-MO+HlNGfl zt6vQ_RYkMo!sAhe3|l;R^zoiD?9)$ zszz%Fy$@|icCJ%kqAW1hF#tu7;k5>ucF0$VclWAh6E>;=8dag7IztL*EW~RoP+gi6 z^OKE;x%1b2*S6pfe=K+%0oMLHmDP_Ixkg`l8dVT+)ME z{nM18*lxJ_e?KYihCMFecisY;lVho(l<#w=z4JWKEswa~@M6%CKTHxHCoNwEta6#C zLIHuz4ZZNHU(6*vzpbFJ>fQ?%vg=*v7*} zwIlC>@By;B}}QD1tD2 zFzOaW9?Ui0kT$~U#Dh?2yemEG>pg@;>#b=s(EkA0Ok9Guo<1?AbAMV}QyV!Jey586 zaQ0zqpu)vAm)V^+z)oNE$lYpNgIem5)DRcNf1mHD+jjfHLYTk~43&yO zQcLH2ea?3-^6oBu5>DIXl6vOKCL$PnwDRq%jcUt3?h`Ejq+x}{T{Iu(); z9c$qO-Fy^gC{qfy#DACwL13#e5`j`Fw5N7@NU6xhQ0`DSev&eYlfp|+*D8#r=WBT- zwcnu=VQ3&Jx2eh$b{>ppXP$a5O(Gkz`knQ)eloIF|3uTDFSGeyH!3;%BT>lB^|cfH zq0Df$xJ@F7N`LA9y1o{*Y3vk#4qI8kF&DxOWtgA*#YkdpLVxMx`dYVi@z8or&-fq= z{z+T^rv7+P{K=g=&aPbb{-yQ zBPg88g&R|d;(u<@Na(Dw#LL8*bhZHQbVRv=*QAyGq!Sk%K(EWnu&UGk?`||v?F|9L znI^jjH8cFVH?ZG)1AM^$d;xo{ZOBRx0krkOk_I74hlx3w69#Z<*s90ON118)l{|!a z1}yg~ERXOO=cib=ZO=P{IZNlm17WMhXM0+K-a!MscYo?W^bRZZwEC-}cX$_iEV;EI zivC@IJ8S^gwKk`lF2dp>YBL8GW=y8c2Y?GqUpsM(li-XFi`|5ZGV7WY@EozA>BN41 z_Gp#x-vh=rg5#M}!%@geJxM%zhD4gGC~wV<#=87&bZan$1G|jGr8E(~Huw=-i%kS& zLTUKTCw~RrjiyNNl}WdcvP>q7)V=sFCMv5yK66si(S10dOXsZ-dVTFQo<2YSzDkZf zjcw@`^j!jck~H;!c_OEnBHs2@0vI6OBQf2Aqg?UhlPFoE8@C0Jci?+wT~MJ+<-`2_ zC4q`Se=K2LslA4x-xbvXNGY9y>TC)A{F|VP;D3FL?7#;O+%>3o1fUs}W(uHjkeN6> zG{>?y+{A5>Pit(ac}KIF>7bg48`Q^0fgR)WSA{pi{adLuAb&XAiPh=UfG3dSKLEYG z5BRJsPXB_?y^3BYyUA_<@lu$=(#A~fS1O!-y8`tMu%uL@3Ct&#^bfk;#u ziFd}CacGG%SJLfk!mrcfo(7_}`xD;2+Aw{YBy!^RGk>ov)9aXiG@bu7p^D7)7^r>+ z27LgOp)_Uz%U4XK9VD>l$lU|4o#8vb7k}cqP=?F)H~TcOri|g+7f2a6yjKrnBpJ!% z((lm4!_Xe_r^32wCz!hOQ8;3Ac2z6*;MJ1tUW;>sVW~6&-!qvm}o+gv2$t;o4O6I8BJgry1m_dxWxHoy#xRqZ@Tyrgtzf3&Jc_rXr}Z+~-^ z50V?j?g3o*16TYAI6TNj5MKQdbcl$|vz3+bP@-)KuRNJDB#cv~)heEkhJ{2aK|IQ( z2~Pt_RC>9kbOr%@f#H3kq(7Q6ZoHG>7 z1C^=B-%IcySTUL=qPJ5%7xg5DV}G}m5enl%(#AB^*_u>F@Hh6;&6i_I+-^6)*#cS1 zC*fkGxaqY1$*pd7DQKOtZb{(FD4X+qb-hycCfRBJBFaXC*o~>tJxZfUekVoYBMlsL zpz?QfhtLef7X4i2MMWGJWj@d^k2FxKzE{HMc+)3L1B-MKi}%9WD-eR8BY%MgU&KWi zlWxix8}e%+i@;8^i97&Cf^mp8Eah_Bjc;)|WuJrt;YSyAVIjF-|> zHk1eic*%FSSIVnsD6{4iH=+i=!J9m72;W?XSQf@Fh&cWQ?QN-{TFkkR@O<5|Z#N4Z z#GQuvfm-zTyvi4msq9cM<9|E6>4KE=g6M=7GB2#-ORl#n(79D6JjT`f*D4G5XDsa& z-Eqy)ju$lBm9>z}g^6cvQ4*b?vheW=1m}A9JNMkV?V)-+0#vXk2J>_*? z;@|Le{1SLNh|9=u+wEyTjkl;S)|}NSyT2t(e%_n&Lb`m1CgM$jjd~XX)Fkw>G3_I! zpXr*J`pGOaW@ah@b60`YJxkoR*jq3>F-6>t8KbDU2(eCwku8U##&;@|M^>4u5WmL4 z*(A2x=p3;3&>M=MyMLX!J+WCm^E8N_OpdNkt`EM#v8!=D%?rGGU7z~xH{=Zq2JwFq z`f`c&8QWfi&1u6+ox$An3nKOd)KK3P_?uS6wK1nEIE0ur(Q z4RJ5jyKXqHl4m%7d=8kXM7{)c{s0&ZgF<-P)7MvUDb3BTREONSF^Al^GPm5gGlT|z z-J4x+qc{|Xuf5X#2TOagGZIL)2{gHirkxqhO0%76EA478X>c1)2}GDocmDkz8nZb$%`X9o#u| zQwGB&4c@W3&TAe;2q57Itl!YL9wX#U__p2)SYroDK<()l>n{ZOH0QEa3PLL&0p%mom6{a4rlQL0N98}+3@D9nOlY&kd_($ zC}h&Z9Gzgj@AG_t60kCDry)|exXu%AH3u(r z+@M@HJeBpXT`}-BT=7}qMWNGpq1);OZmY-KR*yKX-o$C~E}Ygba$388k<;1*ZaYn< zwR2iJ-)-%Dw=16Sw%7FCZt{G$;}w76xaV}ctKd7{)AJqgsQZqOv-qbElYJJiZq#}j zY>!!Au))TxZ zI*-gj7%66t8J9p*afbbWKFc7Yj)%HTd1m!d$MqO}YQlsm?QU2*TV9=Cv6^DhiteB+ zc+!NVM^LgM8MR)1I1L*sb_g7;HGERmDzXQMG^CRWVifE(XbWjWJx?LKgteL?OWcxD zwZ8B@(2`M0%x%&$t&&@SwU&ig$TH8kLu#saGn#b#tBvzKwQS>m867_s;$dFiuTqC} z1e1-F_n9<>w1S?ekR3jwYd7b|!@|AQd?xB(DbLnkEObe+iU6C7}@v?|Z$10_9KCLR*gL=ME zPlM2?c?+`f%(c#ch`mx;SzW1?e~YpZc`9a34f3#14QsW!lvdDlRk6iqlzf+__?B~J zryss^iI%ISNcC_Y8f{_CdEA8B3^*eGo%=WX(!Oj06n^lGXLLe+sTZ~$GFH=?^tdaq zLF-S{0JHgAjWJu%xLPT(p23#ouZ`}KKdeNm;Qq+&(-qHuW*qTFUWz=!OZf3(mU3mH zk$%u=53OwyT7Oz-*V5jd(zY?`d1zj^Wuv;eFk|SGXsQ!LW>>#<5pQTQJB4@hEM9U5 zFx@7G7NaH%*mM%vcncnvbDZDfa?bI!>PVy7=P=`s+dw*h1d1YhNg`@HDl1kG81CL6me)vWrNJKV|W_@<9;Hr|>?=VYt8 z<(YJ|*(!HxlFpuaH)jJjQK4sCqB392=2(;!YhaasZr2>Q?vHIJ!VgHJhuad?&|L-9 zXvTD-A?edlgC#}2T#8KY0^2u@?L;`wA2lfSx<;hXGSIzaHZ8*Uaq)=1Wc+uDzdU95 z^J?~pBs2(*sc8#!ik4Vn(N2qi4xxS4vKFw#W%9&g#rfmPa}(~sCiFTU!o;#$G=31N2ih1K1&B?0 zz@V|0650=m?~8naE8~ysa55F&pnkAkw(z)rSw~H@>R~2tJYMMLoP@T6UHapSMl*?vm= ztTNv$?8m%|7kVhFuf6K>1uxIHd200-zW)J-TY9Fq{l_z$OMlC9;yMt9_fs|R;N2|4 z#ffH?#+E^auqn%iGiO7&uo7G`Hs#B3=A?M{X@NZ;$0E*#B+{>z`tR;9JUnRYFi*1W zt47ja*)}ZWEY)~g?TfEpzJ7Ul&~Osvak<@TlO!xkjqSn%ztMv1Z8RPXPH(dCbXgzX ztg{0T^Ll-BdVib65znduzY><1C4{w?Re&QO7jmdF#>a#Mouq)i}dH#_Q{IfVbIL@T|)cx>&ZZ2&w9*9c3RPotZl0GMu zXqU^&$A3dnS00u-Eqm6=9oHPuF!d%FVF|z7lz%HU_n2z5+P>DCViM9a&kj%mxLep& z?|>VWhlfH7Q)r^BN~5CQf$SG?SnT15nPgQ|FGH@3^YisVT5w(u)fhU39bhc;W0<@u ztr|n;u&hcTjb9=~qsqfN0Q8BGBpL)48~8V`AAh2QCosKvJ$O2}U{-m-g$Wif4q;q_ zK?e(L=t<2^&c3MLpo1HBQs=<7yqRI5rbEWbTJR~n^mS2)y z{(sIz&aj0P_(cl*qQ3Y=3jCsO{Gx9BqHg@6{`dv0f~`o!R-|MrQn3{&*ou^FMcr&g zpI|Feu@$M^&}`#5ES($DEcfxQGXXfQ71uBe}bak1Vw6sjxOI|ePg;|OH3)- zU}|~9H)op(HJE>@HN$QV{B3xRW+Z85#KLaCAdI_Kk^S;5w=1wYGlb#+ONsf>xzV82YmSAz_Pa-NSpwh3o@IFR4};5mtId6n5N;tmfE}=`-h9^qXsAL~0HkNE-I50bI;8?6t z$-XU!!4?q8q;6m}64@n&@%ib21HUy;8p}h$mVi5NZP5801LYxMZa~4Bm4C3%2t1<+ zERTdisd#`8;h(rkLYHd+K2X=33u<}|%yhX5X5cX_ieO>3G)Mz&T`qwQpBtN=YoyFW zm#bmZ+8<`(zqHlmT8M268`kE&L%Lj>6?CR~W{pKyO_V!_pIV;Kxm+?`E}7|43qBUM z>opCj%N07)aP7L*hWU7T=OJdfWR@o~WtjXMcz6D5JjyjBQ^)l#MlOGP!pA>a84Fd1 zvlujovlumpvlupqvlutGvluwjo_{=PZ{tRm-y7)vP%Qx)X@*uLJ3X24#tXypWeQapW>afOTH{Oc7I5ho*hMW zAG=co6uGi)e4` zEo-&U-@YO67qWOC`lRv64!vOc&=8|<-|Rxyk4a<3)@~Ft__8Jq^5+6Lh=DUX^7mVE zL891>smC6fN1p^t`5gFJf`1VA9)nqw3PveyeaD}6&(75R@7gb5HvJ~|jr6&!$z=Fl zMD)2Ki&#AJoY0Mzn@gY}mK>a&b$ckam@VULd+jdM@l)6_mjVCLX2v4dgU?HrK0Z61 zY(*=|%XjS1Axqoy?(OA6L{7+M|B}EkncI(yJlfu#MPeUseb|9TaDU~-mw~^JF71f5 z>^QcU8^$bRhwI29>@lXn{Xf(WbMa0eJs?rd>}Z<=n$}A8uPv6`+xHwPELp=QcVG^M zF}ez*LZ>UN1ioA=v3Kr~KI(z?bZp0IDUcTFTBLXOW1BR|-j5GE=2*mG(K2**xKHP# z!F9f2sApH{G3OtpvVYiw!P6KtsE&QbNcJ>#019X|hciV<=scw`ho@bN_$cCXJXM z@X#79=&f&_NQ;bqrZ=}YBdh4VTBOyk1eQpZOM?TO_kSJH@qg`XFZDzL^e_-d%L z(Re!gFRM@~zZ&SL$#iNJ=!gU;O`r5RL>XZ+iXt?qWDYhF{^5pz+rcaNpNBq3_i6v! zv+y9M*6CivXGueiGq_2E53O!Sm4u#9P$A*V?boltkH({wx84cMsc;wN9KIuMW_JbHI zLD9(SPD4jji6pz3U^(t=u<=WeMYZ~rh`dCdfZTM>yMGHQc_xV!V%G?b68Rn_@13G^ zYTq+d)JC*B`TXT%0|*)&(21=bw^EozD<_U}?#WQg1e+S)c1EI+WVUDN@bp7epJV^Nr762*$pTpy!2@S|nb_#elOqAT;D? zH87=VD1SmPRRnF8#)K(*3PEKnFU$fRT?B!*aCiU5HB_Bdd$&W*l6_}In_j{!x9>xH zYp>Y?;>0?Ron)rYGRV~4R$KXWVFevCKDY??wR9BX=;c9kuS$#rMEO=sBReV_LC2f$ z2;`_q5%X4vocS@*Eld+%mpdhLj!S^qC$Sl&h`-Lir zQs9j121-WCa2PZY5-6nxQ6NGMkq#V9LkSRJttf_r~pn8nBpbH z2jrx zS>L$!Z17|}YUZJdFb$lCk7T`j>^o-Vl&D;TBjUlOdu2&9M{s zNkuZx2)TxtMydv$IGx3#%a)sb*ALeg0tU!ShVC*3#riA;d*`GvMKj;9#K0LJ0Cfu0 z$a@(10NFyE4*dv2LpxL@%`b)kHGe!9CS<8e;z7<&N_uTX_}~XmKCj$HM!k)XQ2tcX z!6EaRH-W==0QvXdrFWBJTm(Di?>rUgYqUtl)T1QLR0(DSK75arz7Bk7$U+@g7SP-- z>O(U-B*mkgvwaU4*rUtQ>0|?8fRINif>hk_kspT#F#X`$TAZeKW(nsp`G3Z3)pFx{ z4vhn)W_yn-*vP-xIoyB|{V^%Txbx^+5*Fnl)+NC@sZB^z6rWkZsSUuFf@;IpIcxeP10p&c=3~?%j zMK36|)N^XA0nsZvoN${ z8*)Gl^n{t^OGsp01zc83(|?pl!9WoOQ9-e>kP_jbf{l$>m~<&6p_pJ}V-7YpHa0dk zHpW%-8ray_n0)_v&f4VNblCy_j{3C2^liYfP#06b zUy+MzZ;LovF|fylZ|=39HT1eUtMrGiGb@eBjwlx1t!4E|wUhgeexCd9z{)fI^es1y z3hnsT&gIQSw^<{O&Fy(Ttk7-EY{O#ar))jnJh?Q(VQZ$<!K0i$p4d1PM0u+qQ{r}kdi zJpr$VlpEE<^kKLD0j(0=RGj5<-OVp$Us%iMqr2v9&HK7$;GibeHio?(+w0}{uy+fq z*qc?->p6Mk4u?;h&bBXm@~WSMSN5yl)6S(%7;3foWT}%oD%u4sz2Eqk<9e&0+_}?? z+#5d8#BM(mJv_{A*#pa08)`K=wPwknC+E81n{meros1rTIC1WQ)4owtO|8GyOz7MH zS=ss3%9gjjcGF|Xxk=9*{0hTfcplhI<;%96ebMj5`w>5Pro7u-|A_hOwo^NL`fOjD zxzWDO?a!OO7(BK&Jg~lXMCE8dqw77B5@*D&zUEtY(T%IS#*OT9Yr>nWW-e3fe6QbK za~d}y&Y^ybrmpyyp?|jB(<=SmH)?%L|HQb0iK`Q;?g&4-`p}U27j4F$JwC~@TbzUdOYVk#UmO|O#e8K%QdO_^buO9Id3VO5YjvOJckVYSe(^(> znl&rUXze`p;YPP&E3*@dyYF2&|H+{B`vx7HpkxHju?xQSA-GSY7^C5hItE?5UFNfy zc4gaoHOG2Z*Pmrj?op0Si|r-8E}3(xRKg;Q1u3uhJDB}^^kU41N$u~Sbo}6?zh|6& zg*h2UXPu86TXN6fQAE!b?hX?UU8;Fv?9}rejk@ls)BUaa)L$;yH(q4dI&%G(CSm0{ zBUhi-jZJg66%Q(Q^7gS;*C*U>H{jjf!`ko zy!kiNM(tlVHDcR>af=-%O?)KUe8!*$#Gf z&X2rxth-OIyL-!TzV~Cb)2;@!o-Au$E`9X3pdQVB zJgryQ%=Oz1%je^+S=L`xCgIq*2E)Is>0A6tk3;K5&6w)kYsLAvI;Jbu@6p@!t9W7h z)%Mm6HH%z^hgo#%f3DW~1tlxgEq$R*?Izn_JZjPD`-5F?)|LpWb8B9y>&L!_1ib%z zXMMQ_bJw1zZ<1AVa&%Be-P!xM&OQIQVRWz4?$IkZ-`YO$hly{$>NBd0`^Wd3)>qFV zBH^iN#+@%m3}TFbFM4Rb-}K7KF(+3}-Pic@tX76Uj;;0|=+*4}vUVlXo{utqZ`t(j z)3z(-JTBICmfMPZ=l2%BP_3Rp%as%JkC!VpC*(}K^vT|@-Yyb9y^} zeZe$qS8J!F(4Jea#*Ci5@7tgoFMSqw$nUhn$Tg`}`*6q32@6cW94!B(X6;+s%g2sC zVUlxyeuLP0Q_Ecqwd?&P%jx0J8>=?-z2H^p&AS!9h7YS-S^Kq&cdy|S>$_GM6I8Lg z^`6ug`^HS4)HUd5z(SWs-hMV^2Q}Y&q3%tG9f1cTF0XCsHzzvI=2{4KDA%^rwmh#+ zA+A?uKDjrg!mhOaecSH*_H0YS*0Je5FYgK~z3ol?9Zt=@e+<1dsn?0Qv#fSsKJYpt zXw37gTPhxyKlb;;)lNSboO$G&d2ozlT3C&3rYEizx-O_x{#f%7dy3T8*#D*VWT#b?J=PsJJ!2A-xjtk|nMPWJ>-`t)NhFt4#oKH0llj{QCrs6UzihSD zyM#8bC(e&EJaJw36WX!S z;~xZjX71Ti;qc8(FT1^sdwTp?@9JNzdmP=h$aGJo1^p*BHq^Vhf4r6J#r_jM(_y=T zBa*-Qcl%^^?N;xtrEM$K)qb1Z@?pWym;FxXciG|O+LE!v0MrTWxe%`8=hxyMgPfvA8TNGV&RMecdBVU}ER(kl0-9zd%GrYF* z#P!83dQDY!(Tr#Z3q#Z0=X`b*Y#Xq~-`%s}itwxd%88{>bsC9C2Va!diM8;>#1G({Or3*o^h*A4B0UA z-#ZC$+r6S&M>H*5FywRO)awe<(w+iUF4|2Sjlf{WHa*35ZyZbaoa?eda-O-j(W^z~TP!R5iP``4}(R(o+}dt`9z z`+x5x4fCot@Yk#cnKK-Nm2Xjd)0V}ytlGWRko`07oUFL1Ps0AZVVK;J(7YwGpgXVBome(lMRWu~O8 z{8HliSi?m#x7M1O`t?qi=*4ZS?e)HQyvDpL>yC7a>)UR3+5E!;Bh8L}=(x7?fDe_{ z-FZ;)(Z$yzAJtv8^Hp2p-w$5@Ynwp7&HHbx8Z*b|yAcx+>Zoz!jdCL&oPN;Z{)f|>jd#ZUoVf7r4@;BLao4UVbiU}DQ)%)&*DmL# zf4Vkr{;ZmFhs4zm{+%3{aIL}Dj146`JN?vj*;jjP;i|UFe=8<^Yp&`1ZtJeK`K6t{ ze>i&5Wb?JV{W4GPU)XTPu7=IJuleB}dT&e1X}iuj?ca6IIjUi$fd$T*Z(5B8|I_$J z$7)i)9?+2EC+CLR8%za!a&Dj(wogMfzc^Q-b)THg^-|mKqm!SU?X^)|!2kZq*;$+F z4yyTQXGLqoRNQCq@|fE7+1XW_*b&s{&(2ob++m=g$xbf^O8S0rw%1E)w~uChadyxv z0CDn*b5p%c5TDVcwHm6TE0Nn*XLD^<8~oMhtFxoli&ZcE>Reyz#k|vBoo%%~9YB3& zDvP^oS^z5kkAnCD=W5!hwrHRN=VscJ&Y-djoSn2z3@-c4xw$r%c^$twx6&4L12vr~ zO;=DCn6hGD4ZnkOXI_u*&UV_YKkAo!cQ(;#Sp6=Bq%YsAp-e9}WKr*OJ+_cCySb zL^p%&ac3%>l}!1CZk@Q>vrJ{p1h3R@=ayQ_S)e-qc6QK)Fm57K@tr^&{O#H zzY&Mz#``tYtPruWX#gss5UttVx~&lXMl}L2uMo1SR{J%JER|;390)AxuhiFGEPhb4 zXtGjIo56#dY_C*WbV8}9b>qMJ8scwnl6dP^k4^X3+%4OcR zVoGCeDuW`ZX)AG}juTU+PsHkSteFItUdCJDuc~! zsRt^aof*SaCQ}EP@?nXuOu6fv)`HS76{A&JYu)OC%3#W%A*f$Wr7+c|1Sk)trj=0K zv}vs60#n&6QNEne{a_N+WFw zHykli-1LB5TtR86&FTbBYo-j^f|^(XgJ$!`y0aCOYTA&W=W0pr$jWVcZp_@|b60s<`U;eBDR=Op(F)U!ZQ8 zDU@Wgl3b?TS)guZw8k?plqnBZyp5?GZhg;`5vyxv2Fj`(s8ME^F3dW@tXvi-Rs~cP zH@0UggQ@9EIdNDoRY6$u*q?G$L0SC<)uSp>$A_soOyzSdE>-1NvjJwBF+5k{hYqP#SpuCvMXWn9_ zj2L%=DYyQhjO&0(WGx;{#rFm^hpAkay~vag%a*Q-q|IVn2c|r@bs|%lEOC@6GsbScY@k>o$6p|O=x zN1M(Ky{*t?0aM9L*{~TGnKBpx%Af%jCJ(0CGL<(7)Oe;c2ZK7mR0_9#Y5<8SZ%{T3 zL8beG3S%nA2UHqU8Ql7$q2jE^EXzh3NNF(`MI=*(0+ zcRPhCr-7g{8$-f|c|V!*V)LAufJ$bGSf&ygm)-;!YQ$Olf+-))98_aFP-c0cLhLZ5y|~`;CWJQf zUo+UPYj&8727ekV+AEc{AuedJw#U5o;Bw$^4@jbbG}Wf^Tt8`#l5EK{{EIy&MAL&p zvz-Gfc`_^L>7Y1jv)PQ9O!=@GryUTmRCeJvQ)$d=-VCjY?BMWbN^?E-WlJ+O8gOi$ zFolyI4Ouv1#qenb3W_U{pCkGyVDlz8!jxQlPJY&j>%`5#5 z=CGd}oxw_Z4AvNDl+jE!>RxxV3f*$fi9272E>7Iq?Q^Qwy|aaG8JI0$MU&fojqc zxb%C#4Q~mY5%YGpgysU~6|{sz`Wx_ETA?-MC8%+&P=_;LfI89&vKee&F;}!EvTR#d z@RII>H_a8JzRnq=zQYw^^-#cjbHjcsja#?5VI<>O z;=UVpW9b}pFdNGYtZ;d9oEqw%E>%{S`+d*k# z>@#GqPVyC`x8cen8r4B@HO}p-@>4czG)JpzG;t|(zJub})Tx`w*VNN!LiIJ6F}50i zm{chK14|PV6&My4qnYJ~a5e3yv@=eI*=$}OuHm?rAEhZB6(?gKq$~4V;Qw;)r{OWW z(ov~r>;<#g&358?dW`hl;eI|+;BWUEWKuhKgfR+3&Uz9t6h{H*pGh;_l^VvDBJ9;W zpzo?0P304G*j+KRC}@39y@7{J(SK}zBxJkNdv~Rx9wce!Vic8XofJ#sY~&et(5s9_ zvlg8c-lcAx6f5I2(Qz}l{T+ZcxiqblQrp-^;7!nJm;oGqOouxub&caOvslkKLycwz zP7n-U)5lI2za-2q=C=m_F!=NHsX=E1!Upq?`3KSOFz~y7Cg0A`Um)<`!5Wb|9Dv_^BM9xd;xG%(H+dRkP}XkH@0Kikl) zu1N4G6i^OO3nPuDB^-XxoGN!iAUuSfKY`r@fO$*m(GB)^+!Fo5_M70JcBSNQ(32_n zj?hyUdX}}J>~84S@~(=%3A_>P+}M%IbjJjB`&Z?!0=75w?C(sSy8|CD`125lj=-1c zMpGD{e_O?`E35K7J?K<-WVFv6m45;HuR_m~UR10H;u(^o@_$4BFz|==CD$JCD@)kp zUR$HF!(jg7MI(DakGs(CfN6OEanlc=Jw1@1$pY_<_%A~IGb8A255>kfL*Va~$E-jf zePYPQ1BsX@_-DZ<@WbLM$OHYFiTK!~-vj7ZZ#=E^z<4DIz6ShJ;2)k&w>)5vm+03B zaj1qkG+RWKdMZsF((b8#RYshBV2?+NorY&!QTaf4Gy!%t-oE~^p^*_W8Y3=Lx_LMg z;>Pih)Zu0kE*R;{>0(b5l6+A}0$_4&gez$UnR+VD#x?@K8~gz9x2z&xPvG6KUg58r z?Jyx9y2`JiEuM;takk(W$8hWdpl~e}upTE-r}qK-7IHf`P}^RLy>Tj5a@KPN{F1m< zZKNdTn+bdNf>(g{^=Wje7y8W-dIG?|1pbOmRJpg(+}ItfKkGRHej)xGx|w`>qY4`d z{j1Q}6>XtgXlHMwg|SB9lfb(R{NAlp*ccA4vsr&A_}B5L zvYqDjQCb>jiuibge*t{M9hBP#_9qMd;R2ttgX;DL-vE0K))NK(P5ikford;R9E>fo z$7KF+!Jn{`()%KAA%Z_l@cZqeAAM1!-LICkp;#@SlL6xtH2_f$!EcL#L;RziuBb_fp)9GX|)9 zwv*$Kw4dI3!Ty|qDt{#Sx4|EnK@R;9HybaNKT+@<4$#>Cik&e4I{gD+Y+JM$9;D3v z@XM>8%AXEiF7$XDBK-m28}wKCgMn|4Hk-rLeE{;=N=*M9;BlVB9ih1cV2_8u?+5=k z_~A$Cp8<+uoY+_De*pflV^njXQm?6zn6`z$JLBq{X{T9;KZ~Xn(pjBWp_+>xSe11% zYQ{jt%-9V3AprmUH|aR-8Hhrkgo(#|S8;*=Y9MwpQDR9wffZ&hX3vS^RAUfUNO$lV zZzZmtXQ<~OrG|Z`zz?pW(cD0>A9cn~!(J6xhMJ+X%s(>R&o@?M5QeST>LrQ^Weid( z8zq#vi2({K|t-j#5NCOE=SK=Af3O-zSg3ikbF?XOYv1 zgB4q2_oCs0?ra#)>J^=UB9<=ToEhAv`9O|7$T9=Le-G9UZu>wZ zeXz)+3UfSRCReq7A8D@-X1PX~a}~U`xY~cB@67kOulCC`Z3C{nPvq*0#UaE^owet| zTZL=RXBx@;{GlqoIrMYbntY)hz8Jlz5H&n2!T$<=;TL-93wz9jex7YV!2j}^3Cx!aMoTM0)&n9lhb?GN<^v9klEm-Aa52;y%YveDw>yNcx z6Rq+i*hKKl{-(+SiiL4Vkjg&|-f~>Oep814geO_>`vdCfd3f$ zIU0M~%MCuEsv;ve-2simi`mm_XsVbPAuU=AiT%axscxWBt7868wSm{BeQ4;WXHNqH z73+#Nv1&sG8uW4LY3*qlH{=UdMGd7(*wfuWL@8BB@Z@E66-rXIAPho*h|&R}sj@x| zX1;-lHuDW|RX3njK^RO+5$&Q5>XoA0AS7>gq-s%-{wAf#G8p~lh<(w zM6{W&#pPU6E-yv(tl?iFbq^K*q?%x68XD$>zV=yw-(7U`c>iGGDbfBaweECar_3AG%G>~#`) zZh*)9qb4+FDD+4DkN*Cqba*KA_y~L0PVV=!Dg7LZ9b~%D{|USdT=OcE<1nQaZXDI| z@7xGs#Kwy%+DVDU;fJ~R4)wt{J-=t{!mpK!TeOQl(K&2&#Fde zm>(~e+HJk?8jkc=d2qtw}8-5VsT&A1*3fJ=|*1_z39Fh*SOI+_?k(g<5nf0`Yej{7~@v z;aXptibrArbrO?!J$Tb`{j5!nk;vObfwzJlt`t-1P$c6sL^Zez-a1^J>(bgtrKYi! znA$vET{fXv}bIWs*cbGzNY*@WmU`S;l8ok@#)k?`=$FqY-B>!RIky{eDfzllcZ_D&7wK z!{8fPQ%W?(E5kzN8-jlV{EOCfI~sW&CG4>WpV!qnO{q!@@K3R zb5&0o@a*qP8(JF!{Yk=KUU;qm|IwD7#9*EpiGD4>KL`E^JE|S4G&D{Y_UC}di|R~! z@{Yy)N~x^s=R*{(_SO!xBogGRK5vDK;X3O=H%4&234eJD&Rg587GyXQ{U(aI znS;L%{4*`7*GS}fl9(^Y!8gV=wiQhs34gPNzkI9k0r)wtbYvvvi-+i!=L+X-q8q&* z2|H6nJ#T;-!23J>*3=*#j~dr#7i!z?lqRh4(=yk+gvi`>UyR8qtZ7H7$5 zTt9lz{BfvCZlWsngbrST<9gHmap*VXx4PBj(?uSwu6@X2JoKcA)r-T-S=+fU1&`Q{Tw zAm--?KBoh(%5wc|g(cu~g$N%=#S(cIg{k)32d^5g z$U)?k2t5UYZv!63f5u>nNW`p830Lu4wRx5D971cEZzJ$y!RHmGvNz=}Fu|b08F`y0_?1c^-_UnXI2liYUr9m_@6I`&TSQTR=En;>^I5+#oKmMKEh~sk zS0>nnU^kDZw+#0Z!&0QiF@~B=ML3b9h-{u&lkha zW5Z>m!3ffuhH{c7^zhAZ9IhrK$#oivu%+nN3V3Va*Nmib(-4MSfnNq5PnYa?Iyeo( zk|)Cd7(63f*GJL2X-ZxDTrn-?g2y)nk4M{Uc%k|GbRsk&Ak^PCHZnR!;|92Tb}}#t zXC9fq#Qi5MOU3na49!kbs^io`O&VSv=Hr?%mX0t!L-e)LVt(|Pda!!;8P~k?3u79 zQ(wiO0FUjlm_ny#B5X#bRQ@UOQgI!fLceDs2||Sahv4nRHDoHe%tG?n2tF^LJZH;K zqjAi47kYU2%e&ok)9BbNBzLY@BMQLFz%?$3O3r3~ORN2IJ>z&bn@+7~W9N|~_`AX5 z_}`mOakDY(x#D<)ce4v|jhI0jXCppdWmP>KPu?+cpGg(wAZ`X_ zRQv_z;c}TpUFM)xy9qw8Z#?&NXVHW?urprpIi4$Vjhsz~=Rkk*U-~%>P3F-1IoKH& zh&Z#ayhGhQhivB}{@KDWPD8f8+gu8riyD^ahMq(bf8M5WAA9Cehh+4dCGwE#G27F3K8Mrnjh;51b&d1P13I2ZY*uAqvGw1VmNDKi_F`gQJDRc^YDwI>ZW$St5 zzo*dG`51XKF_JsLV-MynA-e_OCkg&V@OUOQSxVsxPzka`MqB}pUAVlIHZ8!&I2o$? zIonwO@MV;{02!wdd^VHaGFVQg3&GD5dsogN9)UH>sp~>yu8}D3oT2k@xvrq83!y)x z_J1=ddj%a?2zPVLRX*Fl09W`*`mzw2l~i8k7tJKiDzaLHRk5I!%D(|D-}@|FMWKr@ z^7$4j{}FgR%etk~)aC{yMX*1+y2|JHaE9(%P4yPT&J3Z43pe{a zWDN~otkkh_7x70#$pZ$%FjE#&z^%f`YB@UqB5WR!m4oSk)A8?K1 zn|0M*!*bm9LHub5UQC={w6A|)jCHK9pT?(Xz*}iFwX{%v4Fcq`M5%3UCETcMhTSrn z=HHaI9EL8Kt;3|tYZ|~5E&{%J8>!?v0JP+0F3Ln5O-i>=)=8&6*QM)JGtbx&x+tCdJOsvSo^eXS&Gw zZh*7}#4}Gqcn3Cyknfq2k&eMeDO1*?EOEv7Jq2&&=9LkrF3lRC^x1)o%uWw9f zxazm1$clClD}dOd4^r$R#Ego<<>=@g5FI&^eR30{H$=p0_9uHysiG9UL`_#<7`#M0 z%R=v6=>7ML)O-1FbDW!d2gC(N2dm~}2-Ud|vjA*=ffTz!E1}sUPgraR$U|tp@m)f) z>E;ThzJ*gwH5Lqc3CP}`5^|NQu7s9Mp~YTkS@l~&u94?TrEb4eQF!zL;fN+`9R5ti z>#)sKgvQp<);l;dEWkTpq;Irt-WZ7z{T(@&4aot;rQ{8|jQ&mXMVhjSJkuL$0ioY$ z(mEk!bQ}9t{8GrjxKLy@0g+*$k>0wunY;rd;=--N17kGqR;r`CR!+fHs-%Oirf{ve zMUktNCKg6MDr6!$@<2y({(|JtfmKR9i<|%zas(P8aNXCJT5i+NRfuS^fLyV|Lkv`k zt_Bivhul(?>P?gCsan<;cusvLl#miXcvx@5RU3k}tHbCAYMNESeFp_V( z)|or#oM+j4^pGJw0+NO161dVVB;-DsuU6_xUX zAXRZ~t|1}0u!oC}O>;-fCYEg@BVv7n@$QFiUzI23|98lk<2q$2HvDfbd~^9k!cpl;QYl8?!4jZ)J>BeHr6 zAm0JmQ(How(D*edC5a;O_&GvJT-)nN$WuDFMyYENCA1`=`59}eDUfM(s~l|oLa2Ky6rAH+K%Qo(6X++gyhkvwMxytiFMR`7y-yFK;~IV$P1Cwwl>Xe z5Q{z$0fEsmkrBbVQ25l9f;kWjX&?n(QvO<{v4w%33gL6`SAe)Rl#o~Cybcy-i0t*SS>CFg->PGmOMZz;5zIqAwS70O{r5SUpUR?euS1w ziiG^aa8(A6uHIBCTJdldh$!-D4^Q|^7m5B2bPYxu-BPO6VziBLA`a*WXj#!hq6>?Y z*(OYi5OE_B3k*-Vu`MMApJi==7b(Jvv4C*Ud$p2~Vzg`%#wAts#A(E{uZgRK6sMb; zP#1NI}5sTM=7~p#U7eq^*o0VD??gGO5zw6NQt+murg63_8 zEqP*eR|3Md>S7xSDM=T(qckyeMUY)>B}AVLws0j79r62YKcFS0orD-r`z=b{I@uyF z<~&S*Eod(xrLc%wK#bnqR;uV`T9O#L@j%{1%jOOeU7E7CAVgjwb=Lw?0Lavi5>kc? zwj$}=gmb*!ak`9mmyoj5bt@{ql`!iaARNWvog~DNW^7d~yyArx-U;!lIjXaSl!N7* zbhggTP@g)6`bNZB_6>~2ae=N#B?}ul19elqixe$Sg=|2Ufb>FKTmTE|Dj`PHavQHo zVgN$Wd<~tg?j|7>XbeN51SAv?zAKLDE+NKrfFWigq#FR?^`v7D38_e5w_zAP1cc`? z*Ea_b38_R5+X2ZFhbx>?*??5*DIq2_oFQpqZCee=V+mV=7Hfnlz0^~Fx z*`88MWqQL91Ka;X7WI-4Gitm88IWrIU&w&o5>kc2c0h~U|7fYvM?$L7mK}&on*D#Z zJoyWPx0-jrqogMPg>338wU|@AbaWK;KUyOCNr(jnrlVq8+NoMP!0BUf+TKe-s#99J zQr}!4Is$PVh!1}uYS626tZ7c7A74QDU~PAQsl<|+>_k`!gthK~WCD^jKtgI#I7322 z?4MVZDB3?gCwLjz1)e&+5C@|vwuPAkku}9lr6Myy6`#O)WK3q zT?*Ny)T)#GKVj)PL_+FedR2iK6?>$Z=n6xg7|;n&$o0y|TcYdJ6Yeu!K;{AR7LYH0 zL9D3GZl$J|dsB5N_%RIE@h3h~O9L^b?d%FO^bjmc~ecG+GcEPPwUo2yy@64HeF z??GWs7ml7q^EYT|7APUsw1~AB2}gO)%ey%1APH$oH}@zFED{BzrYOu+f+fU;%=apd zEIh9TrJ;p~gWCHJXyCouum}lhP9^s%Ru%;UQWKDkfb@uz5GU%g zU$L$e<*#ZP2MCwqFMmOt;X{4!X!Q%FHf8Qtv=$n%L+%WCCYsJiNsS6U+z-2KnyDJU z0>V$TW(=1Q7qZI02swGHkX>lzR9G41G6eTZZVEwSGqXk+D*y1ARM) zbSn_%7u_cA8Ydwg$@LIyGZI=hK+8{P$rvvo?lk$3QnOM6)%ux0JO*M<0uXfIkYbUL zZKyWQD}(b3m`RBae~zL%e0X}@>qqUKN zzEP18-m#;ia30HtAC^LB8H8LRR5(=#QJ=#~`7TCl4`RMS@UQ>)ETJ3pJpsQo`09(^ ze5Tb7Xz0*PErnN9fM_+{LDLm~vP5^D8^htEqGnk%3^0QCjC^D+tT31~U+`UC|cVsWvdVKFS? zQ%MckLL9aD!tyPDiFiV!Bt%#OheYfCe<0YkUbvEJ!x3IAMJDoYejBc`D;+efguU-g zPXOt!5vkZ0Ch}r=;4erYKymV|>kq3^8{gR2ut1z}#KZ>b4p%)yzO4gh8m`H!r24)z ziLejOsa(Rqg6-op`4NMxF;Zw0eSHk#EWhmg^^Ce$TNWO?fS*lQcM5; z8rjY_8slWyBQ7?~S9huzA}qK9SV8bAVJ_~+y@B`_h+S(XVjxXFhFPE0 zNF5d4nDFvCd!2*~qAVz}$QLt@`pua}U)q|H?7ctr^}Mgzk8h=v;^WC+~gO+Ak- zV%;uuL})~yW#7=?NL{F{#H=g?gr8~{ZIq(kl$eR)l_DT~&&+Ym_zU7gnVG1yIU>|o z(Yy-RvNWm1m%eAh(`=z7P}rz!k`O;~KCW2wO&40&%jLK%H%o{=+~8wP;YR!T*l1r% zPd*JpZpVuo%%biO|0NheTaP1(1`X9fcZZ$`m@sgQ)E!89$FWH?6IsXGti8C-ZIzH9 zs(S)XxCt%i(9BPz$8VF6UasSz(A4bch1%(qKO2(3ARy|b4X^x~L?O#yrQ7bKLP zo3R)c%1PB!PU19FG)fM|TgHTJN?j-aV$uwTy- z#$N@F3+UayAS0pfui4t&H#RQXH_Wn4WJCZbx~946w>d;nq%~Pbr1p3!JcAT<5|9dj za9&J2Dj}n&)mf#fMXK2yp&M$?S5I0Q=)Q?V-`j{qr|DIsI%9OWN}VuW??DLyG${Ryr10WN1r$Ykny9=1k_A>w=5 zi?G%DoPY%< z2}z>P7f|$4VJ`1uF5}{w>wZx}rqi?wFgH;QbP?pqUyvDe8d^-!gh%|Oj@Qw|OVC0` zE-00)M}`K)TDA`Ni;D?S7xx^|Bd@t%fgO5T_Be}NFX9|8Nw~(U_)QYuD-trBMqh+c zHbM&*NIo$8`4?mkWn5Hhb+>X+T`MZqpR%QvxtM2iIq`@b85nKZJ48IMbP~z`9eOiy z&A-atSY1-;xogBqlY%ER-LaGMye2nZ^Pp27@X**;&g)7$)g7V|sL^b#g15YGN$7l9 zd`YR9P++WD_z_{_eSg>Y60!i=_z`>5sPM=Dxs9_D25=?gQ&7{7Qe>fUYIt0z|FD=? zyu0BI*|;#>8kr(?qsb1KuGnY4_~=mj&yIBwxm{LFEIfqrf!IIqM~dGpl*$)V^kt-X zt{7=!H1m1pY;ChYT8Q>t#_e0a$QOHX40jUm|gRJEK#IO+kCYbhZcVIMDp z!jbsZple1ESru#dqZMgkd(-x(f=Yy zsUmp>z`uEbJq?zSb9Crmm=@nz&5UmFG4T>H8i)KF3dof>R`H%ybh?KsW+bfOcK*p1=Xj|io5tKjMBM*^u!?n~CFCj{ zzQ?Zt2*?vO^Vx8@aT0Qk3K^3BKalF#%?r3QF2ap>}CFB{oJVtI< z8K|}xqeR5PmQBkg6=^`lCkxXWYTdhn9`9$@eD~(LDL`N5) z#RXcFlYmh5=ct?Go?~>3MCcP?2>)hN+-a%e3+;Q3l`={MijIuoG4Bu;UX_ra)ZqnASyDx4gJ7;DG+n$72(@~F zpsZsR1trwc@k4tJw7S#lZ7E3=;b#IDRW0c3iYVLOZbx{@_=354NR%K z5`!NQeTk}>BP^+ntqlM2+u?f>QjE5<7B8`9az;=5)aXO5gcPSYFA>{x(a|vkjt$?Z{E1U2&0n7u6o^>!ok<10&z&?-;?3yiJH4MX}& zl6VU$@g8{{BHVj~sIEo?T2Gab>eTkVQY*nmK>ENP-dH@ECLuNcxDy^3?Hv>y7#I+# zn^H!?os|$MjcfmODP##DW1Xoi6dvgp8WtKmiYKDGkV=KIOCWW8hNGrb(E!$@H}CP? zMrxt@Gg+JmygCh-B{lO$Pdvvluc29YDj5-omt3IQOq6*32D(4Q&dio#wQ0}?rCNep zadil6p?Mo1HRei4o&VSzI}#=bhv=q50e&GKI(1cnPsT4MOR2h$(hW*X4BoX-&l}9d zJTtb%(;+mrnJ@5KBxybR{z0kQ$)}iV3IAkVYbZauQtGS^9%_Te&o^54geFAjtAyjL z5vT}-sS;~NgFh-&6Fh|PTu+il7ixr_OwnQ|pKnvW5_U zGUOK>7wa459b0q+?_6!Q{vh^<+N^>P$GGe^Wy6qyD!JPBish_cLgk}eCMz7)`G&n zq6p<`Rm@S>0%HUHWARB>q^<(^v{jwtGq?|EZumfo;2#;%rF($x zEexzTD2!}Ml91Vt?BJ9)&sAkg@KWhYWeb#QedEQj-ocwQ6%d_iPo!Qq$Z**ZdSgOD z1H*L2*obgWLI{2#i&I`nq1F(>jn^E-Gyx_=2~RViClkm;?EnYNJOCu{-ujx{m@%Q05gP<$Pw3w@Rdy)mlL8!c*4>MtqTjx4_+6WqlF ztcS`x32~WSy!oHqLwhLas$2Ahp}R2T9hhDiN~7`;+W}Zi7GUE-bur0qty=vAT;8yS z7)x+RfVs2;#Ptab3ysk&DMn&&K3U>`1~Sb}B;NfG{?8|gQNosc@cuS}vaq^@ccOCN zkyS>*wfA-LIvzBJ*OidY(8!A>1`zS`5AhxrQM9(Diwx+CA>yL8+FFWr!QVL<@rGO= zzV43}fwmOJyh1YaeaBThh!_CNiPe?Tzhm$Q+I-;r^;uY%J=%C^Bov&JyFx=We9bPj6! zq=}yOp@N?!hj){Ze&BJ{4+-b2cHQOjRSwSFn$ zz4w*aOI$(k;XNg!KUDKAMsQ#RFHzV(M(|sF`1V&;SP@W9aVG#U?uYVB1~Tk z59j(w{9x+x8#jw-vsEK_nR^R6?ffNV2+jVjG)TzxQeT z0gg#XXjqtcFn^=NfzEEB*0g2t(HbIMhRH7cAi)Lj&&U6%t}6H%fPB(0DqMp7X+lzhqT^jam6{}_ z!YRL)OXY-QH+B5@eCIk8ADSj15#V87Xd-;$VmKLf37FGL6-Y$1z5p<1x)g}S-?=tK z@>5vv=)f4ndKNu;mPFxd|^O&tW-5T|J^8$SY1{6dx_bMTpfhOC;Ac7?zLb z0Sjec!zr`4i&a84{<$U$jE0jn7)0kq5)uuqoZeBsp?G&YGR{AQ2Pw0q>OeTwW-Smq zNlL`v@4RG3`G)xhs5f;QVZ(GJO#wRCyG+7kwV`T_jpCPnym6m}dm!$^OO%xhFuV}@ zwyl&xap;3HO_lM-!i-DKx!iaD#Nu&`y^x>6!SYQ(Y~0}0pd2& zJ6v}otUHx3o1^M?Lfq=Ys-+oHcszt*tSYQqf$~J=Octqd>`-%ghLJ$q*qj1U0=(fn zziPDqsMMGUjhv6szEPpP7f^Q)Mj|qNlCH&-dR$6OfCO)Rr3Cg(T%dG`EV|)& zPW)xgMCwt}rK)F^82D$14&VFkIVqJ-f^v>}bRggQ#>D*DlBJ4}njj*4qw?jn6q-zj zO1jiZa2K=rCv=pB-mtS0!UdSui0H`RI9>Kxi7E67BNz#A{5c7pD!?(g8`P~n9s)d} z5w<3ni_b4e@HBvVNMaH~xWaG{l0@`ABCvdGQSX+7Cl$f}+`{CFYPTO&OoeA5|4Q_9 zpt*RdH#|reJ}?m#+DA+dKG)|bMG0^3O2HWrDKQ5;p5!cn6bp+PrWQaS5n(L2zHg}R zu+e6&IzbNrVF;-yZ>7|HT2jiTrb(ul!{cBde}^|e9}xUQr7jieQ7ISGej!2yuWtP1 z#P$zT#X_hRq4kRn4UdV9#K|pAvecWk0-?DZ(vS~3rhk-@i>OCw7qf&^q5KG%dDC(1 ztAs2DkLxkK^5>su!3RGe*lJs5{1xB z0Lnlp@n`eWf9_&aD8Do|LHPn>4rg~m$;{tU@e*oO#-)~phw$nI`knzbtqLV%DGe>- zQr{v+c$I+(%m1iPRxzhP9WA5nWn3&Rj6_F9i28DLX0DZx<@BnIOBD;Nd8(71(6R|y zGD=9u3aVMwrE>3dkz1^Ve-YHzKtfi^@C5{p2o1xy6y3Zg2^ajJc`L+*mzH9yXjWO5 z8WujH^S!u>=NE4*3?(F$vHNo87t2 z0S8UKT-*EoW_M?2cV}nk_5k@ST_E)k&0}$u+waE_0xqF4PO`;~T#pt|(6num&^}X5 zkHGs5m6^iZU=pdQz~Kym?0{sRyL50x;$?lTnnz)!aQN|#KpA4ZZWCwha}5mkov0i4~d=RGLQ*POF|Whjp}=3;N`W-1m|=EGa5RroN^_w( zp`%zJ2SK6zB$iqKsuHg`w5;xkc?9W+wz|8RNi0@DMO{>jd&GYG57&rsXveOi{du z>gYpG>>>QL4t-3fD~Mp&)tz;JjX**w;$aH{d~HwE%N1Z#^lHHO8T3j$}d?o+`T z49Ys!hNzJ)=8OmDVQ_jjX-=k&0{;LK?c)RGZhw)-i4|LOVtAj}56%Q| zZf=%xepGM8W5MiWhxy{;mzQwQVigs}~;7%R_!Y0ZOat=KA%pHMJG%~b8X zxNdT-0X_}0pt+%bn*eFXq-G(FfvgBqs<~G%n+GT5Uv7o)qaO;V9UOA-OWn?*u<3;u zPl=(Fwzqn_;Dg6NAPXt=(m`azG0{wJ0!6Xt^C8DR78b?6G|BJw`E=FXrP>xl>r8X# z9*SI$p7>Nq$3emjXbs%?=tI5c1E{YhorPaE)C>9q(9}J*#T0Wmw`L-yj&YzI+98w< zRWQO%Os!^>PJt`zgp^AS0wI4iSzUe=DHX7f?Lkx9F<8mT*I&3tkSFms8F;y~k{XB` z=sd+{|FdO{VWpt>1!&`A`-MePP^?w4!e8Pw@s$uq-8U|RtwCaGlZH>$M)-^1!)tua zTod!5uaNb@2)o-v{ApF3U?&A*xN9b(29&Ov_p?BLg+wwMz6L;hgnFTvW5l+i3n=4z z*Gb`=;kGizg|kkcwOZGkwr)U4Whm+2(_pEi33j|nO2oFVlQkH^dog%CXGH3`TctuJ z;j;}FYw#u*Gw_t371nQHkpb&72o4PAb3zR{j_;!;d(JUFh;3ab2sBd@Vc^W7lUv&k z2Bj`6{as3+kQGKP2x~Y4AZNDGO#)WPR_I2Z7xW+DR(MOw$t!gZgdQ5#?hWdAUM70g zgMu90LOUOB22MxA0r~2PW>7{>+hxI{A^k9E3nw3*LaX=Mof$`j=z>&w#S4P70qfP0-LmF04l_^kXWz_7G#05Sc*f6`w8+zV}3_*djl*ZrzFd)lyIa}+UD z-k*4S@sRCPC=bpsQcbM1D59uZ)P_rVrH+pL=FoO%==P$+c!~oANk!(ihFbLS-JqAb zCK2BPkbV!zIElUG*5?KsoJ1EL?C<}Zt8G%-=!VgNb?UB!{{9}|Bb3{Ck7|=vfVKiJ z`K^M!XdSx@NyMDyud>u!MWTpYj6{R&~4%d`pq@A4F%QG>}9G^gJ&xuTn#E`h_cuiKZv!@Nu z*Ru3gCHXwvyV}fPgE8d4 o1EThtAgCT`FD}2i+|fOI(}r=4p`Jk*PcF%t)m4F&YQlZi|NQ*ossI20 delta 53389 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≧j@9rmLQ56Eio$s!F& z6;d8~00);=A2F{q{KGA!T~#JbOFJwp>&DhD1E(WmG=JfxrAmuEd_=Qze;{LiAb0)~ z4=getW0eN}Kk**@rI1|_K^tFZ%yyV7x8sD#gV)=^={Mc3Ni1pN2=O?#LlXJq9;1ex z%a%a?lM`(SaGVHZX^_bgk&l+s_Px0NmEQ=thMB3v0GwtrYs&5+rF7!&rgCk;w?h;> zbe0ha)_*T@uy;-xQ?$qpOAefg0T8D^kGzMG4-lJ1$lY2;H~b2Ipx0Y6tWkXs$e;Vc5_-75)e zq(gy5A&4}gV(3NGimX{-Y7T^y60rj!l5~QT!X$f4%VMJ0J&XJSG}$!z@!8kvSF$D} zd4I9M>fV?LO_(E)^kZ zt1{0>v%!RgwJPJQh=YpM%OE%vP|jn?kXk7%dO=mBey6E5ztQWqL*m>g!XIK2@J;Ae~W$ z9gXbdEAH+VY>o35{SS07?a$|QJb&shKF&sS`l&yg-VVN}qv>!qSq!e|B|Kl`fRy?V zna(LMl29k^V*2#%r^VIn4ebvWliM4M6kn%`TbLBB?L7Kd3wN?*uN@DtR5#0!R(ImD zuqVZ1q!Du!tU!hZd8S2*J!rRpwx$`6fePe>-adG2>tOxr03f)s&5=H9(F6v(Z{(!*coZ&zupYqF{zIVXzUKY^czwLoIHfNCOk&XX^OBD=! z4yHqZ#)+O!u-HI!wI#7okbnKF+A^*zGo{B>o28A^1yCK}!D!z48a5~!2)=rVm6$VC zyG}KS*p~pu9#ReUDL-TClL`0WE(E&t63lN!4`vl|8B#;;;4MNYk$&xZFyNl=+ zSF1K1hJ99A+>h)Z-$C;b<`$Ea-Lr!(`AvF_hKec*Cy~GGtn; zEc4={C}t3khY(0=VkM`X@mE z#fPo-IcZ{*hM$YL2ghXP8CQwhJI4dUJ@|s5ny76@fwNx6o8jV)Lj*wrg6u_H1)vj& zi$V4XVg%6z^l2U@+%vrr|i?4sNgSrl8Nml9dT& zgO0q+spQU(w|{)&RP69fL)5@3B5AH5c~9NJ2%umR|}9p->FUF$_Ni3Q$7} zAk}(Gl5>^Da^(i<;FdYcoL$T7s!`@3@>Y(_xV@L+G4NfROal0%Jq{QV9K^9Mjt&wN~cbh|q z`3zN$Aed+=oWeN_`*$Fz)1gIrr@se0lOcY<*jX;XTLsJlhObYc?mt&pZBS$w?* zSXRgL2KuR=iXBlD6%?%40UI1F*s)_rjnV~_CPlG=ov2Z)gC&X@4R&l1Tg2F~W5-Uc zXe_9SVu{{&zB9P|^1t`y$v%#A-YGjfJG*Dk`Hnx7y}#*KziVgXdM+CIq-SEY3o))Y zy5BE0%O&GNgEQ}6{#|nVvYIuA9{KVqW`|9yTUHLYFP0m5a`C0}5l%gO0k- z?DTQOs~aUk=1e@^e$T}F6}z_VJY&+%j6#E&)_7aoHL>TEneSo-Z5nca;l1(qKKwFa z?x*#I4*zRr(RSnXEni<83mS1N!ll^jxJf6fjGg{|U)x7RXKlOOyk?;v3l;hD?QS>-6}|BMz2)6*yz~c>8BL zTgvvRYgR3JOv8QY*M585Iq6~Uj?&}y?~Sc~uiDq<{+q8h`_%l!w;A(8eXf~>TU#cK zczUPNfJZZTPfA%lWvyfX}qdho{R`_cTQK->*Hb&I8{*J>$&1inzbF z&Z_8heC)E;N83fuIFN0-vGcYr7hkow_3Y`cLB)5Mp4Ml=%)F_VB}QGkvCFUhqejEs z?v9#qaPiT$*^h3$iNDY%t?=z(PBSlLW!h=eXRolftoOrDpRODqwV~3?&l4xc-5I*K z)U>BFn|99ny14T0Hc@8vDtGayzH`J2+lN)|Z-_hd^U}ue>KD1u>qX>{u9JJ8nK$m-++;4D-LPh(sO~`n|JKnA+cRng{eC> zP8nGG$euY%oA?G)o}TQpGraxh>8CRnISroHbxEPKE_JFOnb+U!foGRL?*uw^kB_Ur zrc;T%i~7{6{I_$&vfj}t-sJLEzz@xAZO*p#JKb!2P|b;P^&57*a>?6qW$C(e*KBst zX4T$s`DU>%Gh25uKjl>JY1_r43xDZxv&HIjU9L@9@p;7K4GSlIb?RNh>eR08J*U*& zQF|IWjh-^GSryNn<$ex%{ozE5Pu1>r+v_`jZm@mquKK_G_V{$P(%Zi0e*UM@=e|J5qT&EG9akEM$<#bPP(x}UW8d0YY{nU6@_j5_U`&M0CbwCR| zF>gxOjyD##YfT3h9aMaXckGlez3m2muwNChD=qYgr)TO^e)Rrr)4w;zHCr`5=lrQ> zd#0JyzL)%PntP*FMI*kZUmei0^!-hThAn-kx$R6_5OXMH=9N)%3aj>X31T zI?ebku64V-aR%#RZ-V!{yZgFvg@41{xRv#sRumrQ_@rmO8rv(y zEZ*Mr*y&S$jqN)z_T1j*mHxe9yQ|XVqZ^LC9(7@Q(H>96#FW{w=hxP+oGdq-=~QC) zfOn&ME-tYvqh^55z#(fZZVf5l?{IjDSx<|XbZqnT?9X#s3~0P-PF$mDH%ITt7}7ns z`ILu6<97Kc{$2Olkn+cz(%*$0_Q^Z9#=b%D=_`q&;tqES8F^%J(~t9P$}P%`d((8^ z{zs>FXxEaWjAz$8T-2#g>v~Rf(dDFT*DszYwwTY)>XA99-_N&FQ!bX9^ku`|oU^&Z z4toy#W9(F~MT;iZ_@%@4-V>gb8+_B+W978e&w-o9t~(T+;Z`r_JoNevhA1N8Ju2g{*qD4cQvTf zd+q0P8v`2coc;8?^S-C&T_PG(toyf%;giu|!2brH$Y_Jxog#&3be>BCV>DCC^IYl| znQSOTKA&AG(#<><>ms>}zENJDOEY6eSMZyDba647yMqe(=%N{OyMWrvJa49+espPP zbY@(GPcHVxh$)~7aCEuvQXBbJF zq>DHhWB&%V^s`G#qgi)Q7eBkyGrBSF(`Oe)qbIx2^b4qDru>=8{Of&U~`QDieUtKJXc)7OF(o0%J`ur8a%kToM{x=slqpdfn&~GlCjIm7Z{pQlzn90;X z-(WQf_Ln+nt&G`BjMkisS?6Y;1{#4gXNmbnI2!U4d9vTA)iq}GSha7B z7<@2l6^!m2pt40ZC!@y)P@R}c_#u9 z%vypl_gr01C`bURCGB=q;TJMG3C$*R4!BYe6@)=C<9vyG1pob z;e6U+j@*g1g4WKM!08oQL2F`6uz|#y3J6~WU(IBmRSob8SJYY? z^VnJkrs7%iw2E4NV|GAqUKhFd)C4d(unTls>4^wGOy*2SZ zf^x7z2-27eValDU6f5MTIXn82sdVtVVwoyziy4+%9hw{4YL3SEYvB1Zm2d?VF=e<3 z>Ks${Y^{(T=2{+KZN*dyTMK2%ih1jq@?h$w9a6-N6R22CPC3T4tBC|M;~vG;gjdcS z<-<&+anC<970*1ETA-3S2IFdBHsx{8_b_G8xHn8CT7YU&8uBAUoBK0R4RMgu0HZL zfvrtsDvx>ln6l@|_KvAczS^__Byw3cl&NIaw}mNZw)>2!c&6$#1ZB=w1DMKTYCTiw z?ERlixp5t?(Fmm?h)1heBiIOHyFW6O)g9Cc6R!uTLXE-8b_dm_F;-=JraCc|!Ajzoa${o$n95}89|uTSu`x$SQ1OflWh$8+-NaNHJN4KR$r;2G zrMeT>NTvoemCI8hktuVgPCH@9@hb|Xb2Cu3>_JDSV!MKhXDXMi9d3q@dT@t6GnK@Y zOLI^WY;7D<9(_UWWy-xjsCP`I^#kSD0+fMy;Y?*SZd(g@n#9yIrmO~ms?!pb?Ep|d zOy#gwKexn0w&#g#+C|*qzozp%EZz$9(32~#>4JMJt+FwLael2ZrPH`?NeoHk!8bu} zw$iE@-MBjBwL&#^XGlY5t+vslqER4$&VV@ciZRPsYiV>F2r8YaOr}0LBWm94X)_m4 z_T0A+7hFx?s~cUkRz*BOWb?&T?nV_2R0PBNX;>%B*xTtEuLNATeq$2Iiu>eNg0dGQEtQYCb zOK*#MoySUy?Qqq=SG%@Dy*9rODxn=@kPRgIJ+6wpsB^nJx_Ltl1hf`LA)E5%5&@Z(nDv zj3Mv?R2V z)#$am*1{qggTwruXwGO~t5M5tT4Re8IL!Rth8YZhS{n>4ttqCP*3iNm!v!A=4$>;S z(5`M;Z42+3x}LHX42Ho)4Ti2Rl+#UXVi94d^J7vA8Jq_g46ECceRqT_6aMRC5Qe{6 zIQRNyU~_+=Z9}`hh_-jv+F4{R)A>o84Tj&V8w}GI)3@$g%cgD*bob8N7z~NU42Jf* z91VU2VpkkGOtFhHG^&#yxY!<=gGDAfz?O2*#-LqFqXRuOXA66O-O<*#m<4`^{bcN^ z)wM7naNOZe(yAVy);$pjcVuwEK#Vv*<9i~Yd6+Y-KOTefI{@A7oFc0v&akhR2xcSzS}pQKLd8FVIG#Vqe~uIeT!J(w?>vfN7^-L zNTvHCeLay2>`!ZR1QQ*u=tMpHA`qEk_Y1I_0O;F_X7q(WsiLPXe7_F+7EV9KI#5k2i_ch-f2&6{V+?j#Q!zG4uGB)ohXj+Nn&>);?Na%x2|-6 z@j0UZm(n_ac6a*N56K*X9B2Q}LjNTY7kW|4{)lIy^y@41j|P8@2SxWsznlf{Udv!` z!eEx{Ph0y#Pln)|*EJaSBW|rn(6jzXP_RwOj z;rqk2S_sQwq8@`Z7Yh$R9lslVfAF)H(=x`p2k89mFqI2komNryAkEbxN$`ac_Fcd? zUrmh%Lyzr99se7!uVD8{GQ|$onps3hjk*YaF|?~|=`izy1iu%&Jm7Dwqr#rBYbN^r z!9NfF<@MClQ)^|B;jQaG4E{Ip*Ze|DJyC59;^!Lp(i7KKZ=ffhT5F4J(USn)9pImD zq~=4QKT+^Sz~2P^$zN&85Ur(!v*-^7{|flwDRgp(*2W@B@Lu4b1;4{4vK$KkGY0Ga zgbKdQW*W-;Tx{9kiXj60>-aN!Gp!k_HMhtdq4UQG|FI2_(dwT8q0c=2Z(^xOnLaTf&-N8Iv;>-cHH z58h2Xhigt29z%8hPz0kRu65W${|raJtgt)c`1}Z7HvXKsms*biKVAAY92Yy|TEK5K zeFXA3LDGH)c$_Dj_tEhY@W)N!xexrW;IB)gl3to-k@$nse;@qh{WQo6)6h!vd;{JE zE$#r#_rew{qy^S8({gphOS7`b!)(IU@BgJ8q-S2J-YLRwhb!E`xAn#zC0mxrKd@{p zz*PBgkOp{T*>lF;g7w%-o0U$pys@O_*y-*KuYsw63cfv^_IYbIMqBW8H(q$d4Tt}@ zG3^Xh@FKDzs7e?HbvYI!HMZ5cg zw)$he@VKk<`@u~vT=QPibAL?a)KR*gOW>_XoA8R727sRwtn+y?ZA7zqP0;~JFf$Ap z>pz3G2JP5u+RA))j4bn8K|hDhH!5zKU6(Xb0{zDU0}^c zd-xA|1!9@?mTs~8OVGmJ)9OID<0g1^aWh)s4|FFG+aGfzICtv++ETQwAEtS$(L)|`)dIo7W7D-d|FrNT#6`IpWniz!eQVM9mN@B)NDl-*qy$Y4;i2EH$MXm9UO>;$lC&#CYhsfvo#o}~XS8jl zl#{viHB_ro%{L?_z~p0uV6Oqk>CnA2Iffzt=F-u89ZyQrm{0^PUiiG^vF_<*XczN6 zB=F2tBiHS&kyZkml~9|Elocm7~-!=no3h2R2{- zd~0NCoB4M3>Jk1>DO8KSrn~%RkDxdZKC-90KB?reX3DpB;uAL zIl|S4%S?0puKwTa6a7v-(W)@Be~3^>HJ`@2BY1wp;l2?U(-@`{s!=VM02c8 zqoa_^X}{@wd+6bka-cf>!uY(MI{yxMzo5m{psXm(<&0oX3k-g<7^$DjK=(E_~K= z8~n4j)IJ*PeY)_uB<)4pXh*TpuXT=0k0q@B?yV<}>H4|ucDdeow4(b&z~ z3!bZU3AD?#sBR2ak$CaH4tU#vzg?R~Gv7htlh6OL4yDFmTazN=)d=|Az_+SPUl?z@ zU-yUc+rWQbm)eg-oMR=PJSME4>d|cGCyRb3@DG9C*`Cgi#dw*EKV`uG1N=husq8r9 zd9LuAfzJ!@vHH||9P%Mc^zcf@8$I}5)(_&o1wHK$b*kSCdvC(FR+_`GXQS0|vR z28lnsE#{5mmljlFBJwRl<`LgE@HY3~megS)>}Ct!8vNhD|J;faCL+%rL_aSM7HB)2 z>EJ~4*G%|)+wd0nV=nY|BIb*y@OiFq-tN_??j-mbFZ}wb0lX1x?MfpiVcaui9J#MN z_6u6m2IeP7{F%QRtw|etF$wcJUHDw*e?>djh8j$U{OiqmU^Y?Az6XzY zGhaJUD)S9HbayO)KL&nEN6ML^)hWMSXO95;8Q7ycQS~@vZG@;F3_kaGKxY~rhtbNG zGY?nrIdhwJp=EK%<_y_SJOz)sy zwKO?8Ne^Ug{ZQ&Z6NfGiUG-haD)4#lUwIfM&%_Qb zUB-*!%$3{j2fEGt2+0S|Pp;ZchEt_km@V!SPu{hyMJqIdhBH4&;_nYU=lQx3^vf*h z$rL{C68PR_t{2^(g`55?@v{~9r@$ZXP4#9&Pppi~R`5T8U)zVmW+QHHQr$j)$J_Jj zzO-RB;*cWaH4k|9Da)5`%|`rFCH}m}?~H55{m3E#)jaW#KEC6?V?Rp-Q2zwz50Y`= zofucKw*fSV@n(PM_?f`}3;y_#bT$Ebl_7dKHiR}dkj#EW-sVX>D;Cuc!^#9v*B{ZZ zc!?Wt<2j$ljH3C>H%OeB&-%kh)3qP9Hs$54EgkG{V26ZItvP_Zi97jfMu*a zg!zD|4-TVUb5I6s#myw}Idp;H^!FU3zq6R-#}8aKMnsVFT$B^fd_1r*Xue}8dM=7^ zis0>mZvy;{F|=zg!jLNdtOSpzOVKELJr~20A!+*%JaaU&XsSIAVNRE{T>u{6C|JeN zuz5JV@We2Z=?o=to@N`DBWjPsg=DlEW1AVmV481MBJd~9Ck#FzApwDr;ih|m98t^b z!y>dJ1@L2lFU$C_z<`jb(ZTv1PM+k=7F=11)_0t;5J^pc(yT3F#ffxW=7s9XI2!&F z_e~b^b>J;Pn;A=senRY0C3U%stwpOio-P1i{n2{kqf%+|yl}s8g zl$_YElj!k$OiJ(L|Lf9?No2bKJxdl>e+QOLL``t`B@f4AW z>@`25^LhQ{N#AKI?P7jHIwK($IEIBiDuKZ;JTC1(8EN zYC4Twh^>o<=-CY(4~@kP+Pn})Z@H4ayd7SGwq*w0S%~=9ivJu>zV&N2lgcjwKU3n# z!?g_U)=cWM2yx4jc=D<52DFG-6u$_?K3n|Z1(J)0WOE50ZV)q(&9Jls!snZhZahGx7eGc1rHkT$Yf!#E*%LSeNnLCem zGe1`Ba?E(fH2I1CT7rB?5dS$o?9bt!sPM$H}U@E*O~IfmD8N7w%VJf2F^R?wfzc~5ph z=RXCHr=;^rsdm zQWnxzj~#`v7y%oBSH+{oM;Xoq%He&{R9s1;Z!3@o$r9kNRSkwvu&b`8W-B=_WuP8G z83%Lr1{%8(fy@;CdP{6(fN!^vQdc4X5z^7~3CPuQICtAbZ&qS?OOU*D1U3$OzN9t7 z?St;%Ui`_+Rdj^7*d*G=*N`b)%4v+PHo7!%zmoV361*Ue^N9=z_Zw}(+gj_}y?C7T4j(q-ycVQxWY z^=0MxVHha}8IuLWFQdfq7Qchf&!RbiUS7dr!O>n`O(Mn{a$oAY?!#f;FZ5i;71#Mz^q;%R>~Z?ITB~N0Ef9WU%x5G0?<>d&a$KWT8;~fF%7E}QpWm_-Iw^?qkb4tIiB9>mtZQex+q zt<@?IbeCZpA(2_0s}L8Un6sQS*1@HvS9EZ|$dKT$K<>HOYkjy&L-QSIe)?9)U8In; zTGfHc67+09Y@q7c-wMJv?Mk(?S74;i`21|k6xB|U`xC0O-z&LGbbGB<&n8jU2ZlTc z7asKo){pw9cEAXjPmI?W~|M@H`x@+}jP zkzW<$T7f<|wsi6u7as1P-vjL1G|R%xO_hQbWKr~bJX49is1L(5*ztg!6$KzS>G$|@)^1rZnsH%cwLz@M74lP^RHn!~;9vbQs=5M-ZOOO<~ z3#qDT`>QFbKOw~l>d>mCNeW9zU~ss8=jJTdK0(GB?Mi8DCHR0cH^Av^!R*5I576`4 zMnN7@sg0VAjmIOsUwqtq7mz2_732|h-l*9PiOta=TLAe4$gvs<@)#asnK3vzv~Y%t z?g5cLA^uUe9dTD`>Rr-PU6!AA6hk{~t7ML|!x=xQDC=+A4KogF_ObdbE~Bl^E^rB7XjenD+h;8wPH{tA!^Xj(l5 zc}WvfG{@RWlJ|UI{Rmom*(=B^*sR7jk6za*d$LXUCweIOpyxTRIM!F_*FbX(c0`@T zV6-oAGToeOkO=np`1aiQ`zwF;(zHOQ!OO5Vbi zzK#l=M-E#MiZmIAWbv?}lY)Gt&@GzvAZO9S(aM3Aip>;+U)01d+2H8tWl0b%e1OGe<6D_3~-RKw|Ha6HVI=}qo ziS|j5s%=LqCQC40 z0Ahw_XrmxSY4CQfrj5B6;vMA`Ak5k-NHJQr9lpd1WHlgMUFC=}2mS5czqy%-}fmxg(5Nl3qz}B@_kdicS2Zq;K3{Ao1JJ7Pf zgMyTz^E(h1E7?-62P6-Wr5zQdG?huk?k7dG@S4d<@>3@TDMNizQE&|cc?}4MF21vZ zl%)l!Sbnkv!dom}c@w%QNI5#4iqPd{=yBmxGu48w3Sv&iotoV+Pnq5Q(P>w}V%!y^ zJkkjFuLh@P4h~48&LRGh!O?y}wjJ<}b+l=^McmeR4?&Q;3}k9IC2c|RFks^;8;oE; zt^zWxyMk1p-x-o2kd1)w0yLfk0J28CDVu!H^P!-BXP{Tbil=2_Qz_Wg$62wE#>aPtn#>^Lwo??Q@}q8KF(ckg3qZ)vU%a1+k}RY$#QH zSqR80K#KmLAoZ#KKDe87Ne?PNgW}@6N z9K98!35`fY;kLb^_u~{Ue}tA!J_^#5RmiuYx$x?KG{vO`7;(CxzSI zPeB~XZok&h#_g(J3AwiO1L}7E3gSe;`w{j;F=PaUOYRQ=3et==?bjOFq|2_gG9di; z*ngygG^e-w;Y+UgQWg+?_hEdXg0vv#1Ayd7bl>1I7w)-13eu9M08-mt#y7vy3vk4i ze^=ECgI5cIpmQ&@8m2v$x1e`G8Se@wj8bT4Ds@n^x5*TU9U#8~GGerXxRA#|yg6rn zK@ZVnK)6sB4N(w{Rx%`8_S@Y7NeAR+0f;L-IjA+TalWdL=m$XfvEA}erKL4BK7_F_ z6D_-NnFoDSn1ZySm_wS~V2^9MmRvx}qOA*8khbVQZ*H19@b<4?KvZ;iq|f)wO;VOF z$v5p4(NZInWIK9!h*S554mpm?{9yg~7zJ^oMu(9L2I)mU zDS?&|r63(>8*6cs`~Q3`m!cJ)8@6qq8 zV-=(`jrm<`U@hJr0D?PoW}HHFp?yHuxJ#c|$v;qXE>=Oh(%0X$`t_{DPX7Jo(eVo6 zj+onV%$*(R=lDeUQ>f8(U)-_O|jpwe`p8|@R#zv43;RoKg!ObX6Qe!}#c8m|O;LV!>B#s&C9 zgok-WkB`79FrRN&$${fa2(^Py+36xQlutMCANYnSzevNQ*_ey`mjeIs_1@6@82pmp z`-O-4`b6{bnN@<(bhI<81o{L-ubIsa{5v$3=tFzbwOVnWI1++E!(QC^E=6a|e^d|; zK=}yCFVbgZw4BJri^?Vl)gD~iuuS3m0?#Kg{!R{TeUCu<0O|ww5K_>7fb!`-4LYio z?P_?dJF%oFknrX}0c3w5ivg*>lW+aw|Ls5bXaL$m+H#Z^Ny%s4?r%e@wxYR#m2jsA z(ldr6N=6KVXS_&e6o3q(dVla{U9$BTT%L`#c%{-ZnEd|GYWK^Otnr5yzU8jENOz9uC-~%QWP^a|FZID#!>baU7*5RmNcgAiRfgS*IXg)crVi{y75qhRgi4 zq{ey$@ur!_wOWJo#1P+ObG%L!fcT)NTw|rDon!GV#^1IdzZHN;$I3*!1jHJ&&A%w+ zzVz)lI_eXPHemDu_SDp1=WWiVSJKp|b@b0krc3 z!WATjc$$X6*r;EXmXY-G1h!mR0^z;XUbL(f1qq}EC*f|IjQVL@=EvqgZBmdR3Of`Du*lDp%Awp>KDXo!RkSNIjmd+pKn?(MW53ceo{VRathN$~@_=xLEIgnf6R6`^t*MQ>^sXTwhXL_C zs2~$*!CA~L=Qnzu^#tSrAeM&|WD;eZ)$A-&WB@w>!h`*RA=KlX)`S|J(@NT8i4{Hx z;X3f>uu?IFik;Ky*3)YwhbK?YtMb9qe^=l*NC2jRpIFhF*c{Uso9(;;kY&(X7GnH}SSihtUJb)WYag=y@n@x!XxwGY)mRCe1upYx z=qf{t?;GGGI(QlPc{u`U1{<8QRSPS~aw>8KS|TK&-=f2H0qI{vK~_-LE4ck}o2Vyr zIqbBb0XE*KAS-F!6%3)hbkGdZo&kt&aRpgLXRja;%%w-`;0y1po|I6KpQ*%E98_72 z(+%+lBKWf z%iLHUQXBd59FXzm3bK|guVIImBb~5I@v~5nbu{Q2+)a+vwY-A6T;1|2D9CzB zx`tWoCV5MM@Y~ZdmJ0Fh0!+vh7O$Ofu;9lqF3(hb?;ULgmN!&VBi zk^HV}Eo@SxLQVptJIAG}g8WK*uk%xE(Q+D{t_#R(YXwQ6yz5x{G9v?whFSD#@~Ru@d8N!#21kFb_%kE4&1;1c#1D>@P&V0=2=TY zw$j%d7-?_Gmq!?BerYG7j)H8XwpoDW$joCyoKlVL6=XY2VMwm@XanNn2`vljE65J| zJqtJH_L48#p@mNtpEXpFR4RHC>75|HtdeBt+E_t$QYU=D+a^PLR27EG!O)#13bKo4 z-qdV|ri;7I==6CQ`pZE`sOCLnTA9Tns-dEG&l zWV`BG-T*>?yzHzXztfsKm^}&7BU^;!0u0S?SCAw0;0|YrxXYh{;pgrBx+_RJ+1-U9 z2XVJB;?IxA+w@Y9qvUf}t6kq)($Nve9f9b0Lk|V{1AniXpC#0HhgQ{=S7DLpkC`$N zN*DE462~a#E(SGL26Z?f34oLtq#(zs@jZkoO=j&&c)tXYrJf3Mg2vp_>gNw?Zy@+h z$NIw*;w1fc5BGw3(!b(>6oa!_!xiKdy}bul@+6Rap!Ej=dCyxxGN{#kByy^F`y-4D z03_L0K~7WLeM~n8sl7wdp@o3`?WZ7TDE&TsF_+=s7Yq1aaOOw_IZIy{VkYkHfiHZ} zyC+aV&XIFAihPzB>W?1rYhqo3734fkU`S8_2)~tO5uzX$=nzB9CAcjy?)-%NL70ME zq_5fNk-I=9BL_zTa&L@+WKz370kN8*rzu1Dn>Oyz3UZ0!8R9%yL0HS~u?ljTj{eEd zlmzk!m-&3yX1s!2A>#u;vi}2VJV8OOQr8DamlT0K7cFfjD#$gO%UV3dT{ct>hI&m> zkn42e0pgM%kb8je1BxFeE65Epe~2DoX*JzGX92?Z>)}%rB#Zh!)aus9;iU<}hFHtg zI0dW=xyt=9Q$g<1R))CE(zT=lG8B+HvlZkXvW1gu7n=nKM^G{-k}6F=V#0 zbuF94msvk4$OHQH7``~n(IH_-LVndUd%l7^B-bY}l$P%c=FDn9N-tE9M-=x2?nX$D zKA=Z8;mhX53i6naK0!H+m&wW7Zf`)QFIA8y%buc|rU)VuO0EI%aG63pCAX*OP=dtY z0(Bw=uB0U?NDfVZiWdOW1u_h~@F%d;*DAN$i|P9p`mr-3f*GNS$6_ z%kM5>DT7&d4oVhgD99(8`U069A&?vdm)|KKenvq)Q~C?UKT{0Z!Ij>C3_PbGU#Qee zWPg%qu|S`BN4WmHg8WN8UTRJ@DUvHA;jS$--M*+GUugwH+!fPB8JAm8ZO zORZjY+xa@g1BSlBm#Wtl#9*W*uh6CR0=?c1j8&Gx;A^q3P%RThO)YF}_zQPuZz@P( z+6^s36I^slF0jOpiVEFTkRk}y_Z@OGXMWG1Ux1IlZ7;l4>SsEPXr&7u0g!j#Zugb2 zk($1Sm!1MC1M_^k+viUODN13lk=6E^u4OzRg8_+spdiI)>ucm=tc0u)MmQ6Yiw_l~ zIK6t!`#dqU1=YX`{;YYdAZFAg7j@K3vc7X>Lt_urtG zNzQu2`@p|0fZX|}Am&v4Ey9^9y=;IAz%M-3EZp+@QAc?i@m8xB=PB8>23jrxQl+SZ z@CgYY+~_Y}e?Pd%60MdvIUQdE{uNgud~VH;U;4*{;^oF(;bBqH0g(g3!}TMd9C5i6 zV$%@DeCjn!J59-v!yP)+I(2|_rX*S(*C5r93qts$AJ zd~k}v#}A2mh5HAO3=W8lGNeJ}e;XGsJg8Pa(QxP)h@=;YWm= zia35U6!?9Evjl-}SorRD(O?CyLWTa;tUXd?44>lkY685;^;D3m(8!_n854sy0Q~Y_ z-cOVps>=w(I%pmhphT)s=->F|jny=L*xkF~3!%BToGCg zfs$w^XDT5(I`ofLWniqBPKImC0m+=DApDytJq)ZjEI8CRBp?i@(Hw?&QO%Ftd94ag zP;#}X!F#Q$O@c(2fA2j6kZV6GNNw_YuT_hSkYGAO%Qiro%vF#&ux|0aSJC5wLxKZ? zOi69X9|9=mQ|{aIlvLgPA&82?XJGN#E`0Tn47YH^!yt@L-}!Nhi@2iUErIBe053$0y)gaY zCR^O*3X%Y~XRKFZaSb5HV<>Wdc)wE5H*axl7NnvfReFPxY6v0DH{XE3nBWi{pCO$s z1LuO^T>M6bZv;GccKWaD0%N2*W+>2Apxto15w=N4)10kJq%k?<;kQ*m)AcU%Csg@3 za@9TsX_D`HBp%2IdFd};aGdfa0r<$7?{pmZE1{;eCQqvzmoAlzzm3}gKD;}mAP(Sh zweXGMhajfO=PvMhaDm^1X>mls@y{Cw{QHl_++^;#!FW%IG)z};{#{QcYVlF4V&g0W zGa5g1?1T9=?x=z_qtPFcsHrkdRzlM;XgYaPL7GDoj{<*vI8esgN-Qq{mY=Bpn4$13 zfJc-K_+cXo3kNDfy7d^V6yL#5JFU=svSdL;KWUZ&(`3&10b&Qm{mv;EpA++3)n8D- z8#56Bk~ z-?dkjP-|-aS*sG4E`8~M3HdY3*S)SFZ6pT%0VAWm!XqN^GGk0wFkVzfh#e$>hr<`H z8OLraxweqwMZ`ZKI>0a5D-gc|Go`P@gpb?a;qh0jXw~{9i{)E*u2&w>SeC6I?IB`{gy}^Ruc)BlfDn`IED@TH3ivNl^4F(I zr~^&;qS^E{muyIbf^_P>I;3pW^OCs`Nl{@PDUdI?;$aFkzgM2IQJ+(fLdBkq(Dj8$KiSQm(K z{q&F2AKRtA(7kvKCcn&6qg1Q!TZFi-0Am^e920B`g{NIn{d5If-dT++tI+NMbBXYe z2?&vaj;N`_|F*@A4Me(>SMY8M9vP_rzA{g=-?hX+03y74c0Syc7pJlkAjS59;w1Yl^2p24RG_n58yQke>KE=Nw*bgGw(1)D*^y z+Pe3DA?NrGA-jnZ>7_&>eY`?rqV(e7AtIlU16GJn2?r4wjn%C;WVqtP3}o`HWJ;%b zGVntbJ11qO4DE~%xG>jycmt|Rej_o$$7(`2@nE(gO7zwA}V*@V~k zRQ>7YH?8X6JbCcUdoJEnjdf8v2SBIkZTB$RI-q3wSnGZm~XXO!f=-!3Ni#@9N>}RenBBI z*tmLyjE|H_5&y5QdNno$7h!x-FC{mWCKPhDiA(;XL--wvUtzsRe+3x^)f}(DpztVc z#G(Scf_y^0|ByIIoa%t$W)JDN1C-{>l8R|3U%0DRW4#aBUm#4+xB{*8vMRGTswkeyJw$zS1pf#<#l1>+y0 z2n_ZKGv#ioWKBp(MP1S_;Ztt;YM*Ctgu zj(?oQ)babH6eNHi7jea}PGoE^15z8B&W9+-NUCFWwew7qj`K}2zXtXuOhE!6#&2N+ zhvI7qW0BL5J`uq@ef8NGD-O&AtQ^FnB9v$ltv0$^_fItFH-$FX_jE#vOp8>IV2JTP zpWp1jh6o#isBnG5>?u;^q0|vRos3aZqo_<#*BS%TWzIB0Eo}tFAI2&OugAPvg$9J+ z=GD)O_tdgI%Mq93kg{bVR%?P13!(U;t~G5kC98{JoSwqC<75R1r6WaMtHjxge|uqN z7mQiODM%Rp&SfCXCprc{>-F*t$4{0qpavOGz7@U#wP&U)nQ-thBOntKg{^dez7vpq ziARjy1Mu_Ae1RhPjuj0p=333eTn6tX9JvmE7thJZeET*AGQ80IXFrr8OTcXSkc-Q~ ziAp4rP84&sk8?h+R|L+~Kn%faeo_tjP_ky!9Jk4z#XV?w-4 z8-3Hl#nAGMSfft!fh?eXE7x=byVQ+NB^)7!qQrP5<6uYTi{)>(@}vir2oc|V6#b)B$?wbEOiC~5itistw7)<}X(*m} zOevlP9( zDzn7*uLMFSqMk0pXR?-%ng3X1`0y!_UYB;op}%<2AD(1D$NHyA??P%^#q)M8p)2DTH6>yXLtkAEAt z_Jx8hp*sw*Dy&0zz2cuW9Db!BOQ~vE#L`=O&rhh) zm<4%C^>XldJHx7DBC(kbABj7=C@f{BGL<1-S);eR0bB7&iLM}ra@ZTViS|F>!5nDs z^;tnyQg}JndP8Fcl7=bD|Gvu4e<|*Re}(&DnH{No^`F#H&yiagZ@p>f2xpztOit4(f|9m5ui3p(wEhmLngwg zWY*A7a}<3~>AWx0ZUrR1n1UqJLUY`v;PJBQeta+P-cMm>H7cPXYw0{gA_NiwLsg;W zU1p-~5I&Fn zw~B)NO7<46HiI3C=+UVJ2;ZSiw^oo8s9)BMwW<8 zfyaCfdZ($gTKe#B230`d&86e#aRg%rpRPG5)jQ~01=lJAtV-xnt%3atD-Ajpce?gZOK0c4s=tHJyhA!)ox&#xYr60 z3qWEzD9B#eHZ7hJUQt-n@DyrnaFhhqT;$FGQw(ymJ1M!}=qF28n}Jy+bqDK0HNTMX zQx^rq%`V4m^hYuTCA_?6E(gSLnV_5&{p&tiHUJvG1cq57PEZu9fSVOBqW*-*|h! zqrZY2f{2}71}Js8R&6j;X2_IqLKd_}pUMqVcrFN%y5q3Wo16*O=VOw1vH_*~Z;W$~ zAxi9b8d2HRx|Wo=YjA|uVb`j59x`$HR}lOVC&*VJ(}A?4#3ap< z-wbn;e4LF95Z_4L@l(j7RL08HrnhrBJ-Yn53Ri+hfeP{mMEDkxe-a%U60Se5%8|N> zUoIKKp|?S>5;#V&R<1STJY<6L3-tW`zvVFsavVBM(;&tl|F(-)K&a_PhzBcELga;| zpd_SHVwKd1|44;};OU5IR%T1s{2|337}+(kKutJFwpCoM2AD}0+5^M>9GjvvpMqx7 znCbq6`oso@22U`l4wAGV1F_-|yF68iWzf7TxH(J}&HO@T2|#YnP>|EmY^r{`<|sT< z(+_QO3b?~AKbWnAcov#gTM@$VGW0JCO4RLOs1#)0&0!f=eHB0Zze4)InuCbu)zx>4 zbs8zB4{hms2w~G0I0Bh+N&QM6fe;F{N?zxNv!9 z>V-OQl1q@;*b2Mp0I2@BRmt7J->u0mL9^y^kuJzuSS$F}V8l*^%%VHiNccQ~*ua5a z=w!>^6yzpEU?cz2fIO!YB-puqa6pQ@n7&WJ`JF$3=P&T70_T6}HUb&B>$HO32D~Cg z+qhQl>mU=e1)SiQOlw|NuseY91d?Cw zoeH%vP<#A3AmmmZ(dL&owMYJeA2ui{)V*?&&g!vne-}=9A0WpHVqso8c4?}2ie10Jhz-6|s z75hE~>lqqU8-fBtA`Fdg|6djP;yD1KqF_6Z+7V^2$4f;9R$1V`Csf|n)zY{GT3CPF zb6kIe#tB;B9|F#<{C`E+4R-P`{K>eu46{yJHJ>Fc8o zRs;XPmFGgBKrlW3fBeWFI{qF;^SgRv2fu~<-)O4qLAdnau5j#G{2l%@Rqz7ujJa3* zzuvu}FLtgqnkS>Dm|ceW$9mKLayET!gH`<_s&E{Rhku-RQHBJ|BBt@y-itjh{{G=1 z!Qp~1ee@$<5}%90W&jRkx)@j+YyCh!*L1DbJ6o#4;A3E;dih^ckUT(nx<*InR`m~w zAd@gB3~{)^$JKtXl)y(STkHRswY0SWLDi2jIB0kWAVEC&`y+KdbUIJECZ diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab index fdfbc602e..f1fef6886 100644 --- a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -14,12 +14,17 @@ TAG_SPELLS_ELDRITCH_CONE TAG_SPELLS TAG_INVOCATION_GREATER Eldritch Cone ~Invoc 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_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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! -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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! -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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! -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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! -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 ~standard action~[TAG_STANDARD_ACTION] Duration: 1 Minute Saving Throw: ~Fortitude~[TAG_FORTITUDE] negates Spell Resistance: Yes This eldritch essence invocation allows you to change your 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_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 ~standard action~[TAG_STANDARD_ACTION] Duration: Instantaneous Saving Throw: None Spell Resistance: Yes TBD! +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! diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes index b1f29c3dd..f7e651e77 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes @@ -18,14 +18,14 @@ {2313}{Beshadowed Blast} {2314}{Brimstone Blast} {2315}{Hellrime Blast} -{2316}{Bewitching Blast} // not implemented +{2316}{Bewitching Blast} {2317}{Noxious Blast} {2318}{Repelling Blast} // not implemented -{2319}{Vitriolic Blast} // not implemented +{2319}{Vitriolic Blast} {2320}{Hindering Blast} {2321}{Utterdark Blast} // not implemented -{2322}{Binding Blast} // not implemented -{2323}{Penetrating Blast} // not implemented +{2322}{Binding Blast} +{2323}{Penetrating Blast} {2324}{Baneful Blast} // not implemented {2325}{Hammer Blast} // not implemented {2326}{Deteriorating Blast} // not implemented @@ -56,28 +56,28 @@ // 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 {[Blast Shape] TBD!} // not implemented -{7311} Frightful Blast {[Eldritch Essence] TBD!} -{7312} Sickening Blast {[Eldritch Essence] TBD!} -{7313} Beshadowed Blast {[Eldritch Essence] TBD!} -{7314} Brimstone Blast {[Eldritch Essence] TBD!} -{7315} Hellrime Blast {[Eldritch Essence] TBD!} -{7316} Bewitching Blast {[Eldritch Essence] TBD!} // not implemented -{7317} Noxious Blast {[Eldritch Essence] TBD!} -{7318} Repelling Blast {[Eldritch Essence] TBD!} // not implemented -{7319} Vitriolic Blast {[Eldritch Essence] TBD!} // not implemented -{7320} Hindering Blast {[Eldritch Essence] TBD!} -{7321} Utterdark Blast {[Eldritch Essence] TBD!} // not implemented -{7322} Binding Blast {[Eldritch Essence] TBD!} // not implemented -{7323} Penetrating Blast {[Eldritch Essence] TBD!} // not implemented -{7324} Baneful Blast {[Eldritch Essence] TBD!} // not implemented -{7325} Hammer Blast {[Eldritch Essence] TBD!} // not implemented -{7326} Deteriorating Blast {[Eldritch Essence] TBD!} // not implemented +{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.} 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 index 846da8521..275bdbd91 100644 --- 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 @@ -49,7 +49,7 @@ 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. +{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 @@ -70,14 +70,56 @@ Range: Personal Effect: Modifies your Eldritch Blast Duration: Essence Stance} -{7314} Brimstone Blast {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. +{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 min on a failed Fortitude save. +{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 diff --git a/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab index 0ccca203a..176925b8b 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab @@ -35,6 +35,28 @@ sp-Eldritch Line fire2 0 Point 30 300 Object YPR Sprite Same as Emitter Pola 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 diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes index c5aafc805..cb9c21e44 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -16,14 +16,14 @@ {2313}{Beshadowed Blast} {2314}{Brimstone Blast} {2315}{Hellrime Blast} -{2316}{Bewitching Blast} // not implemented +{2316}{Bewitching Blast} {2317}{Noxious Blast} {2318}{Repelling Blast} // not implemented -{2319}{Vitriolic Blast} // not implemented +{2319}{Vitriolic Blast} {2320}{Hindering Blast} {2321}{Utterdark Blast} // not implemented -{2322}{Binding Blast} // not implemented -{2323}{Penetrating Blast} // not implemented +{2322}{Binding Blast} +{2323}{Penetrating Blast} {2324}{Baneful Blast} // not implemented {2325}{Hammer Blast} // not implemented {2326}{Deteriorating Blast} // not implemented @@ -64,14 +64,14 @@ {7313}{Beshadowed Blast} {7314}{Brimstone Blast} {7315}{Hellrime Blast} -{7316}{Bewitching Blast} // not implemented +{7316}{Bewitching Blast} {7317}{Noxious Blast} {7318}{Repelling Blast} // not implemented -{7319}{Vitriolic Blast} // not implemented +{7319}{Vitriolic Blast} {7320}{Hindering Blast} {7321}{Utterdark Blast} // not implemented -{7322}{Binding Blast} // not implemented -{7323}{Penetrating Blast} // not implemented +{7322}{Binding Blast} +{7323}{Penetrating Blast} {7324}{Baneful Blast} // not implemented {7325}{Hammer Blast} // not implemented {7326}{Deteriorating Blast} // not implemented @@ -110,7 +110,7 @@ {22313}{TAG_SPELLS_BESHADOWED_BLAST} {22314}{TAG_SPELLS_BRIMSTONE_BLAST} {22315}{TAG_SPELLS_HELLRIME_BLAST} -{22316}{TAG_SPELLS_BEWITCHING_BLAST} // not implemented +{22316}{TAG_SPELLS_BEWITCHING_BLAST} {22317}{TAG_SPELLS_NOXIOUS_BLAST} {22318}{TAG_SPELLS_REPELLING_BLAST} // not implemented {22319}{TAG_SPELLS_VITRIOLIC_BLAST} // not implemented diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py index aa02ab286..4badaabcf 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -72,15 +72,24 @@ def updateEssenceStance(attachee, args, evt_obj): args.condition_remove() return 0 -def floatActivation(attachee, args, evt_obj): +def addParticles(attachee, args, evt_obj): spellEnum = args.get_arg(0) if spellEnum != spell_eldritch_blast: stanceName = getStanceName(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: @@ -103,12 +112,13 @@ def AddHook(self, eventType, eventKey, callbackFcn, argsTuple): class EldritchBlastEssenceModifier(EldritchBlastAddHook): #This class is used for all Eldritch Blast Essence Modifiers - #It has at least two args: spellEnum, empty - def __init__(self, name, args = 2, preventDuplicate = False): + #It has at least two args: spellEnum, particlesId, empty + def __init__(self, name, args = 3, preventDuplicate = False): super(EldritchBlastAddHook, 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_OnConditionAdd, EK_NONE, floatActivation, ()) self.add_hook(ET_OnGetTooltip, EK_NONE, addToolTip, ()) def ModifyDamageType(self, damageType): self.add_hook(ET_OnD20PythonQuery, "PQ_Eldritch_Blast_Damage_Type", queryDamageType, (damageType,)) From 9dbbc9023be90e7ea3374ebe45dc5adc9643cbc4 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 31 Mar 2022 12:51:17 +0200 Subject: [PATCH 138/146] Warlock Update Reworked Eldritch Essence Secodary Effect Handling Added Bewitching Blast Added Binding Blast Added Penetrating Blast Added Vitriolic Blast Fixed Brimstone Blast --- tpdata/tpgamefiles.dat | Bin 3875684 -> 3882101 bytes .../rules/char_class/class033_warlock.py | 2 - .../action03310_extinguish_flames .py | 18 ++++++ .../rules/indicators/penetrating_blast.txt | 5 ++ .../rules/indicators/vitriolic_blast.txt | 5 ++ .../rules/spells/2316 - Bewitching Blast.txt | 15 +++++ .../rules/spells/2319 - Vitriolic Blast.txt | 15 +++++ .../rules/spells/2322 - Binding Blast.txt | 15 +++++ .../rules/spells/2323 - Penetrating Blast.txt | 15 +++++ .../scr/Spell2316 - Bewitching Blast.py | 25 ++++++++ .../scr/Spell2319 - Vitriolic Blast.py | 25 ++++++++ .../scr/Spell2322 - Binding Blast.py | 25 ++++++++ .../scr/Spell2323 - Penetrating Blast.py | 25 ++++++++ .../scr/tpModifiers/sp_beshadowed_blast.py | 2 +- .../scr/tpModifiers/sp_bewitching_blast.py | 29 +++++++++ .../scr/tpModifiers/sp_binding_blast.py | 30 ++++++++++ .../scr/tpModifiers/sp_brimstone_blast.py | 12 ++-- .../scr/tpModifiers/sp_frightful_blast.py | 4 +- .../scr/tpModifiers/sp_hellrime_blast.py | 10 ++-- .../scr/tpModifiers/sp_hindering_blast.py | 4 +- .../scr/tpModifiers/sp_noxious_blast.py | 2 +- .../scr/tpModifiers/sp_penetrating_blast.py | 48 +++++++++++++++ .../scr/tpModifiers/sp_sickening_blast.py | 2 +- .../scr/tpModifiers/sp_vitriolic_blast.py | 37 ++++++++++++ .../tpgamefiles/scr/tpModifiers/warlock.py | 55 ++++++++++++++---- 25 files changed, 395 insertions(+), 30 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action03310_extinguish_flames .py create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/penetrating_blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/vitriolic_blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2316 - Bewitching Blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2319 - Vitriolic Blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2322 - Binding Blast.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2323 - Penetrating Blast.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2316 - Bewitching Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2319 - Vitriolic Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2322 - Binding Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2323 - Penetrating Blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_bewitching_blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_binding_blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_penetrating_blast.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_vitriolic_blast.py diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 2a5f27dc6570b8e8b8f8e65e45d3bdf8cbaf42a2..6dac560d60ec237c0554852f91320fa018f01974 100644 GIT binary patch delta 55463 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%0DP~v8 zm-Xy@&|L|^#@$q~DFj>4uQiAaUV~JK89RZk!EwtC^`bx04VzDnG&!%c8sK=SJG4aR&$fR%ucJES+}lvGu7{S^jDj+Z_T8hCWx%g&{ZH2Dscdst7C;fpu^C)kgJh1N%}h)$2nOm*HC0=4T=t*lcEaZ$(O2l8$o)#6L7mt&+Y^EC?!2Etbq>4A#0ra8-T zaUL!O@zR?^cx;d&Z76>^maf@?6hI4mz0?h9OJ|qEmPn})FMf|e%Za|K#g95=8Xe~3 ziC?Th4gx6%R>TT_`ywws5m%ARVq*}|De)Xe$?47rO|hEwCPw~raBvI|gNcPGXs zB*(-@+oBz5cLsqlS*JV?Id0_5p(@vvPTyKBJYjKO;|ieHT0v~D^Zb%R;F<- zWbar-`a3JKbfv2zzQSff9k0fBhbuckDq{Bb#MpF4qGNG@-Lh~+QY<#l z2EvV1ccLN&#bqJTs{{!J!lTkTHzbrcW*P0Rfzr7z;xyM__axOam`*X0BU*Udm9J(N zO;%(Gwa&&>m~T7N*L`sMD`>fAiXua4UbfL@R)o~(DIkq-ghVJZ41VBMh;BX5P=B`HNwTcGJ#H)I5jT7{7} zQ!ZP0bB(uwLT9L!k(9H_=w&UNZ4Q;(5%0xu#tj)o->ky^uIB<1nTkSqoj-4;Y8g%K z9)!6Sf14XIyp74h+jo{CV`%<^MlYY7Ii?nl8XkWFX9J;=4;t-h?}J7I|G--2`Ba=+ zh~omE2g`#-II7s191miVTn*M*Wii<_a4|T-Bb6OT{tp>lXA}#v5Gr_awbcz74|P0t zrDeq6`qt*YNsuk$5)a27IM&Qj%@gS5hm1DUJ(rk;bI;}5mQ~p^tF4AI? z%xOGZ6bC|r<1J-@N=4Ay4;#MI!bLH!w0L10Vpn7;6!SHzjqDVkTW!ZM5@=li1;b<0wiw9nC7D9x<#m;1O&z+isiT$r}M1al9L&DrS>E5L(Gx zgcKD6Jv>HDk5w*`wm)LDvsTtNt>r7mZ-5M5q{tk)^oY^JS|-*E1oAnMyA~@lmrH9w zW7ZfgXGDrsTfyA~cifGe=L*r~@r%-Jj>Lr-X>oGN9g=8Ta04Q|Uv?x;)!$8pYYg9+ zdD1ZJpqcBuHeM0F8^p6%`toGk@>oYoa*{38wTo3Oa=cSF8nPMpsN4dw=3u3kD@HHJ zX?D?vOBAuwf*hlbHAf8OOMIT&UrkUXik@RF8*2NJWZ|*PUNR#r08;?vKma3W<>iwwU z-{sDwNvY^#maVd-DjQ4XYmFdlp#*C&kQyM?G({G%y6*ldQa4wLe(8!VhLxRY-=l_K zfGsUKN#3FN!aB9;fD8Jrbs;1JZf~ElPA{ml^9QIO_wWj z5At}Szub|UkQ}|l7N4{%Iof$yZ0=cwhy{6IGH^7{RM{nz^%!>S!^MICsOk;%Ic`V- z?Rm_wO)C&BFX1!~p6{(tEr}50K?D|Hu@P&Fjgf2lQW>1iLcj~h2luK_67^YUwDAcP z=)XhgSBGxwy42OioTShi^|ALpR~%lQ;%ssoo5F z<#D6^)NH98PtO~19B@OHK`(EjIPc=b#^45MqO*qiGED8lxfgIO%2u_@smT*qCsjzv zU*k0IYt*>=_Z}vQkNp2qcdKt0o14(I1_Jho01KT1=d#@f3~-0~$(zlOvAaYY`Z z$DYPb&^*z?>u#REK669X(Y~kQmMB3uLe}G$|AcCJoNlo#7HMdD7oS%B&q6;BFY$|$l2c>t>2b04lohfYST3r0 z{l!ih{EW&yM|+<|=gXCd<1pZ1^|TxEJXCY%OTYpt&F)Bw!El_B6k|>$6%s?-`0SRX zXH_>*pXZD&opKtQA+!~zd8lgioFaM9-357crdep4ZuZzki(;eA;LMkvRE)EH<+{a9 z>IK^UoY6YMR}}BZX;wV-c~$%(6!Wl|7|-@5IFgn)y&UFa+Tx52oW9~F@)C7^-mqnb zNsT_j=@)UVB-Q#dwDRX<0|q-m0dTg0$P|=WT$aoD|Zvg zhe%5niA{>-$Avh=bsDM?gZQaB?qkbeY^0@aq=97MJ0s$q?KsaqZ~KxWo1ncF@={~d z;?vR{Nzt*Wtux%6z7J?(8g>W>5Ag51iM~qP$Y?*KQu^i*oaQEqd|9<`hIa0oY0=3U zc-m=6d}<;d19NIF5-}cqxXRUTVy}@c&uBe8PBuc=+1#p6zoMF7hi2!6YJ4hgs=GH) zm`uz(oN#paT(44FXkDIRol(@#|<~+O=#v>0R0deljSB#VRKWdYZiDkUzNUPUb2LXxyK;P zJIC!dDzcT{c){p0)6&w^@)J(;)bO1fvJK_(FtaQ^JvBZ#AwJqIe6mHgYaV!fld683 zF28_1m~h!(xd;_Jx%GWjk?j=tBBqKEDV?K)$HDV%NTIm|_L72lZOLu<_-1IK=Uz1Y z`&cCSH~OP**Tsd>Yrz(NScF%${2;0)@D#jMnzka%Qt*&G^tA&gKBSr#v3FA@KEK@t zLkHLOtzhQ^tSrBihQ5S55#?gwIjH5hShY=&U9{>Y!|Gqv%Jkr?7&bqLmO*bT@*e)S z(#8&6lD(}Q*;q0Hq zDp4d7=_&4Ilu3A0^uq0lx=@+1PeneUsF$(P9MHzJqjfkoAL^k8eh!3kUpD-D`^wmP z1>)bqx3;g;w;!QEj9eDnI!RAXv)sShbZypdoLG~D20WM;_B~qdz169{ocm_mK+u?bF*Oc9v?5x&(i?Tk~Tp3|03Y2A9Pm~zCHreOH~^Cv&4+5@z2 zJvQ2k#W`(&@OHHCIYmCBzZmfnE&QB0-`ZMsUXjl!Xag2iaS|J?fbav8CoU*b0{eO3 zHti3wFU(lHFxHXE)sARtx^o%AX)>_j3Kcs@`5O%Dv;ygFlYoo_vg(o|U*PXM?hFdD zr>7<-B(UBBZ&U9Dv~~+XpI%m>FR5uhF6SbokA?!d0E^46DsqS>oE#jF4;+frlD#4rF9Oq7l4jN!jkB?oHfVqWho+p|cL-R>!ZupnVeN71)v5fSU z7%m6GH$5-hROFj~s1D)P%8EMyCnoiU+!?6$_*>xQV%?QuhRu{z##(; zFEhA!k+K>`h-W|NSi$n&Q~Im8kx(?tL>@#j5h!Ml8}b9~eHGJ4=6n;`0}V+ynlw}` zC#lwEqicMCXgSgskG^6AxX%qa1$%g{C7W1wHM%#RinkPsjhnEpX^RjlYOUJYP9CeB zB59VqbutZ}hRO(fYcnF>Q{2n<9C-WeXuE!vA90#R%jp6mCDP+daJnvz@7gPJhWuYM zI%WAvG`xe;f1|*YHbs7dHePcD4j5?bWgD5Cn1~At=VC5j0)(IEY=h&3ze=5j6i0sG zzyVGvOeKq5kF(^<)O`~&emH(_+(8A;QR! zA3v(cMRZa174-4z2>(b?pM%pESbbMTex_PmaG6_RHS19hgr}i{0g7Cr;ajlf5!c>C z-p1)G&~mh!BEQfBTd<3nFUT?=-vKG^uE=HDy~XhBROW`10ihm>TtQVkbKaTbhQIUa z8Q-~Pnf#E(FF2FjQ|YTTv;by#*-Ydrkmfk%_EO{;-B(})bt;`>B7BSg9JD0%R-_VT zw&gPSeQUIe+DLg@DU(q zfp~^0avQq&su#NZa~Ldl;E4s>bl$3lC!(Z*Dj?~N;}JKsHAk-GH5HpFXW zN3(ps@yfpLH$stm)b?!zW0+{U48#+MZKNXgY4+QE4_pvlQ67bsfKiHg((`ZgSS$st z2g1W#wHwlazUG2*|Am|xty&sVlkEsQi^S9(XsL#l&&Mdzh{kV6KQ0%<^h~O2`wkW6=_0;xATzO$@I&sK&pW38mGuz)T9urpAs>bXH5>1ZQ~Vb zN>d9lsS>Lj;Kjatz3(2t|BoFC)dWpY%Eqo`RN5Riq`|dI!x{EK3CL**rQ%PgA574SE+y zes|Ml97?4?#!pwomzDwPl-hq|FRPTBEYg8RPI7qm^^$^AdU-=mVf@+-SZE za?)Nu;o)Mh9Y!5%VHZ=m3;%ScDsM|cI}jTw0slnS&QipWmhM1@$m{t}Wb$l9tW>ze z@Sk5Qt?DYMd88ukV3!|k?He4#GuepP<=kRe^Sd=#<-h7x<|f~suI?~wcU%5t=qq!y z2%A(LMGQg_vs^noZYAV){bwZ>&Q)=L>ao-4kQMT;61vV)qytLeJ@CH4efx4Hur>S7 z8ifC=2AAE0J3`oM3I{_tLU%CT3@rEiSMm5&q&o}OPIS*sEWAsk5@XQ(A4B1?`HFO= zZHz>8GwV4P$UY$b7bwz&DtBT~iIb>w067liPdB71_1%T2@D(lLK#GBUX;&=)lnP{S zl^`x#9*a_>+Z}HO^I$(I-ht<(qirJ-k~7SOa*=q8tz`Y<9V*2J7D zksj3RJy;p&*1dS=?w}jelM>%U>_$oKy0knSty+4~*7vv{OGQ?}79Px}$0*X9e&&J- zq-mZ4auvv+SVj6!xA$RgfE2{fQ}Eo^b&(>0wD^6a-JGz0)#$bx5(JO&+PiOXKl7pj zPl4mg;?AwjOp(1C>UmV#vsl&lr61qtc}tK*K)wa?WSkOks zj}{bR-YOHHevZ?BK}+U6iu9)!SxZi!8De~y!As?(OB5MEKNR6{p|T(o@t1k)?gT{! zlK%&Ix+ZYGiSX3M574D0DiT8RAHeNV!6w4*Ht>v-o21AfdgBA5r!`8J?X7_D6KQ$L ziWv0U2S#_lKBf|W%$^^9-Ik(6D203oYm22qzv47cTOTh~WH3GOq0zmgC~;N!lT;;! zpy@io4Rq+T(cXD25#HA=3DcC6K#te4DArDAb=q;SCKK)a}OdRK(x4!oA)U)mJ;?LDkFQFwcwqj1~_iruShs; zV=bl9M_pR#KA^}ry0V8mk!(JE0S&cq)X!36JoVg*rt@^|PvG>QsJCafA`@uoUJbbq zL2!j`yAc!VeGt|v3As%;eH}_H52}($bbGJSt!soJuFLJ~ZpdW#+@F0O5=i^@8onK8 zIj;x8#I)C;^%hQ7Kcrfx(Atmj3P_5yC zFZMqRo&T;s*Jv&dqPO;8(y{e6Ys42j+i*;IwV#ERaHZ$b&y4s=6wQKVJV)MgL++-o z`;GQKfihTc#_2UUKHm&2RO?fGAz1;qtkiV0^J!$;G=BVo!_?a}@oNwpaQwJUmB&%dr>Ll{zlp?(i7Ve$B%X#I zz@?k5nTc>EU&ax=U6Fez^8hxFOS`z5W0W7z| zq@uiz+J&R>yNV=I_s?K%rXUA#dOePPZb%Zve}>p8t!J9s9fdGv-=SKPY0GC=375)N zd~NiyKEMKYDw0B%KEuRcIl$Di0jGIwFngCGODXVkBhYG@Z6e)p`g0T%|DGbLwDNO& zZKF&oT>|7Hkihp9NrNLgl6MK7ct7>I(cD@jCGs}QYdBgJDVt7BN{j&il0jyP4?-PJ z$GhE-45({os*5i%?(+8%bv)_uW$LaERNXSLekS`?iP6|UTiDUa9}RxfhsrKTUKf-7 zrNn57-{UlGxDOoPE4cWPvYFKGpkedR6yz{Yb0fXCTagt|*NX}d;sYVs2aTrI0$HUs z$FR*?JTvwvdoOK0hzD{*WD#-~5MD!*mnNT zDFKcIVTqFC<9&**q{qJCA!x8!&#%GpAliPvA`j5PFVJ@@q@I32J_OR}6GgJ9&X46i0`~+m&0Yx69k}qMd zr`R$I2sd|+&lGux>K#J7M#vuANu1`UtP<7t2%S5G?eh?+ej`}*Hj2FNhO9x8^rp2Y2_xP@(BDzcW5E@mWz$zD5iE5PL)QtnX{YvW?uJ0l?{^q-O7{gtAR(X6j< zV$x*<=}lp`2BOGV39(7=QAV_&P5Tv~SoArkd3r0X||JjGgk z==2ezku_3A8NSoYlkX>P+|yLQ)UZWXi9tL+-vF}hsH%DfE^(WDXW+J@xgUZLq9Cwr zqMbFrgk$qD6@8YnN?~ZB#4?Y)yeT>CxFXNdo>DliKmyA(4-EWPk>}}Fsp01nAZxmt z&`^xyI3v{SYokkew#C>IQSX||HzO9eC$Pg2J$!xE#>0;-%#N$K-M%?B%j6}#g&j{xEc3NvF836 z*tRB$Y@~HZ(S)AT2%hlv!$6+*Qe+c-c@%*VD99$*!pp2S%@ui-8XUupRc@GB(5pcB z5t9d6D6*L*97FGk6fHwh&=3@K!bg$U=&@s%?JI_vT0-C#f|i!Pio8x=A48=>q(+?( zFPDI9Ypuu@@;Q#>UWyx(ai7kn3qx2j`de+0W;yo* z8P9I%sK_?j^)27c7q=Wlo%s#tj$IUao2tIW92mL8)Y1aBtVTiO0u9p5W*nV`_O>V&T34io8#wPN33Z;@vhVh(Fli6{1KHtv+Gc=2ng~wS=J3 zhfz>_Ly-?qI0hukbbheoe{L{h=&BfN3eSQ55a_=gs=|0M@B})$rNrXwR)aX|r1jK)eBA?QR zljuHyBTc{9;FqsZP|;LH4$x00VN0eo@GVblm_o}V(-rxQ{7<2vLNT{C8sI9BrLz?I zoE)c&PThQ^`vhU*gRcnfa}+7T-yK|GLQ}UJZET2*G8yHkqpREprJvoc5(lZ`6k0Vv zT6I1Ue%WHUU6C)S*N<>hgp_*)*7KwK2OWxhNlSl(mQv9&8OU}Z^J5e_MDP8GE5kVP zWPKp@U~S{YiX5ijSWCEcxNw}_4^K9`N0F~+;Aw<%ksxbP$P6IImMC(BvQDGJ<%qd+ zQKP4T1tcm`O2wyPOQ3|$HJs)v!w-@b`I>GqQX);Z6SnZCZ$*kC-%v<7M)_hXXgX?i z2%7FqRpcn$%SfEW1|$6B+n5YRj?r#L@&y@yhUW(fT4pM8oNkw+Mp5G3l?cLnfHb>L zk#A|(86ah%g^?vd?q8|Mca+UY)MztKU0NZ29;~_=9r?EdFUa|$bBwCg}tjG`a7;6a-TezU6C}`DcMNZOJKN+1Jm7;|o-Qrsn zxsNDv3XNiOMf?ACTM_YJ8DyZ@t;=5Anw+yxv0Qv1XMSiBB^XO|O zqJ|ufkOHaD_o(wnsPoW|6se-npRpekCbpab z@-dLVb}RB1tzjfZv>XHS0g$4-irl25KjZ#erfB&J2;b~kTC50u+v5_JDi-noG&q;v zf9$beky~{4CHOy3YVE!lz`ML_w& zb(;?=QbRp{F?zHsml_>{mQZNfeMk{Y9ZLVj=-#eSs+0|5_^p#0Unx_o4(3S=y+e#oA+lzw09pm{((hEfZXMcp+33|SuaRknKTMqr zrsRY&_3BXLD@KQQ5z<7>;1*s&xBNkw`gLgH6(gvfS3^_JB2hCwKa@3W;}QltqycIT=hIE0-$4c~jUO>%xd2(FD1 z*M1C;uUd9oR^hv-&ox+CE^~Mj6wjOE`>!g}l#;F?_EV&Nc{_MEkYBDT;ze7pA!-X7 zn-%Gax|RYN@v9=2@t)Hk)vLtXi0_3k$mX->(N zFt=E2=>aW#W%24?inO4&E3xJ)kb<`30kc48dgyOOeCSf8;XlJBS|;N36!we9fIGV{ zyrtRP6|wyX@Uu?g_(%fJy}q*e<;z+gZEDw3u~uaNm9M}inG2DQ=y&{5-@f{a_|hxC z!dK-|O9$es0?6WqinONFzj7@nnp&p7zA-?iG*P4twfhb343UDmW1P4F!nknMP5rJAdpTO5`slW+l!9Lh?UV%l^JRcRYLWFN$P0vWgd*73i zlhW`O@r>kT^V{teVsaz+hCfDjtY1GBZ3j{0TbwJHyu;=$UEvlyxzYi5IR_}%o% ztmAB=Y}j}V$mkm}a}=>b7aHG^o-zqvZ(9_Pmk)8p_TTqd{b~L0MyrV><7&*s3)<`= zMBBv-u&^4wzshfLVaLwm_G(PIG&5i0@s2^=Sj9V1tv?LEh)jw1i`ekH7uG~CQlt|! zvTGenGw}RGwClZ(JgL(+aKt8PK9#B>ohk7TEHQIrR0$u4Z7ZnA%21>Ww6WMI! z=d+W~sa!AW{wKbLQzEqrfa*Cw!by?d-4Sg->4;h%1*s#|YT4=nF**_+I5kQ1VTq<%H5jrUm?LN(qoFKPWQNW$&E_RWgT~V?2Ii%W@3# zu2V{nqSBj2n`y-|OummH@-f)E_Ov3Sp^yV6#(@{`7u)fEe}cn#3(RttxhCO=;yv>g zKdI0d8eDC(&Z>~M8i5Y^3W|T>tRiE@2lxPgx;;511>d;INW!NH*awkKOx5#Y%QC1Q za8c#LA;*(QOl&$nM`2%#7YJD-ZkSn1-l6;rr?*xNurzQ@W#i~nHNNFp8fG%@BLFyt z*Z-_)$CLLhqwTa5snqwl9qJ8lG`OnB1c*32;d~IsE}xh{*&!nI5Jtei5t41LtI$Mx z;Fe*XYLgljK|wK)R@I73f?ob`h55SycJtHltagZL?kf#M3(bf~Y$6#UJDTMWMboSbBjiBF4;Pf2jbSc!;r3Bn=}&S=_L#Udca<7W*2 z^aHFY5T{*3CO_%*w6C&RQvstJ0M5W?%s_`pGn_*%udFV$ReBm=?(;Dju?f=9MS}lf z!ww8YK4_=-bj4E_o3G|tB$QA2V8Z|&8Qn5K`5EB3Q}KJ-_>l>Gh6umxfG;pO1FEap zV}9+7M+#BSwcaW>lP288oRT89181RycwXulqR1@#%`u1P0-@6G{G2u_TQ1iBf|%ng zgz1A-WVVW=I_!z~VvTd~h>|wFi5T#Of9@Y5B1hyI1FpX#Tl^}E#n*+_%1QNln(7tQqgzYp$8x&9t~GX z`*RCI+fOZ&dVUT)e1~xP6eXgN$6arcV;R28gGwf6INwpvmp~fB?VGAHj_1A# z#p_REaeZju+vV40DY1|m)(UMq(`&U^DZbR=FWG(&sYo=$*unUiQCvbsv?Ix$up(7D zMWz_M9*cq_DE!)7m5ZT!YlT{~N~H8vXoD>%eQ%T^u~5zaS{#S(vMtA~V#k-|@4SN^ z@}Ozd2n=okkd9rbl8Ye8@wb@2J9g*u2c9wjL^Z)3ZV->h4s3X599m4a+MzA{#9fDA z?W?G%_dTjKjv{J@cD7oiT)wM(6&CMIP$Zt7t{vLVYMXDGb`2W%k%CQ0irhnGwL{xw zRfuc&B8_(!+NCJMBRa<(*Vc7ukt2Pl37X&?sP#)#J^?(}HZC4-lrN6wZ%HAZN~9_; zp(?#0aX4Ki5_>^}hr758yb5VO6ZGzc~g zdPt@4q+i|8_A`n^aZe1MJ)!uXhZV_yVxFGlTjO?KM9X^2S4NmD#OPfRdwz|IEu-wZ zp&hI_g49DZT}0uVA5~;IeOx!Rbyl$;yHLuzDD1Iyie%z%?)OO!d>h+=53eQT1$Wdb zZ?HM#`r`ais2%c@%B(;hx&UM{()hzkPJs#$$cB&pWTnrz1UzbL?xnf)Lfb~fJ#5DH zXE5Yj*jq2p#njZ?2N|AO{pu zDMz;3$EQ%YK#A2v%)z|*7`#y>9>Cu`HK*V=DDd7FyTVt7?X?JsDikpAHN~^)So%8s z=lrO;9Y4N>ug9=Zne?|WVRsGm^(j!HY}!yC&5|$P;Em}h=Cv>ah{03}V`1~E_Yyu0xb4f71O zWtE9Fbue=9)p5&0Rn3DP2T2OPvw^R|;kzjKt{U`KO5=FIGY>#!;SQDIUWVc9)^dnH-RV{x{(MN#x<;mN8swy_qktoZvO6fMQBi!m@b!cPO{MoPTvncFN@J{W3M2&jqx}6Su4$zrc~Hr5m6l?6eF+z} z&6L{yg0q3B@z-t=FCdS*GE3a~7A|C>#1P(t^?^*S-=!4ZYNd5L;8!LlSm;^RDu;oG4_D%Ji9 zM4fE}QS*IVl`EDa2SaWwkE3&Ls^EGE@}$jW@}8D_Oc%vj#H}BIXacDZZmAT0^tK7= zTP2!TLNmX+_}Ohm^64Za+2RtOBKg&mpDZDFR)ia=&0T1}NxMIH}AEad)OT!_Vq*k}wwd`qvsXNay)H&gLlp}vs; zkDIE$g_=fO@rJ7UHRMSX{m(~ip*~7P{ZQK-u;A0iD*8GFHpOxzUo6-U3m%2`z8R!u>k2Ytkw%MFSb;fw`i^x=9vnaLl;8r zRv>TsDzcTH^1_u+m>|2bLGU>`^Q^XtY@@@Bgh1H8+?FrL;q! z_}*cB<1Q-t4i$Q%O>NRMUxapk%D*5$k$34DjJD7!2D4?FwZS=6#I|XmtM|mE1)yHw(pgo}M&=dJIl~fy&koR^&bUu32b+ zHGjQ{?CgT64K?}N4SApZnuoT{%6ZB}44BAU%j1TqmLe1`UDfStt*|avivAuE{}Y53 z4pSi>T%@c1<5Rj2OUX6MdH@#lR_mw{Ze8_5DsB$PM~dph*yZtuO+!Yi>W`?Vd1&hy z7E#jyj_1|yf^bE4Yw7>^tSd?n5wR_pR%fC~4~$o_J(SP_aVWkx2_=1@xXolG_9Bnp zl0ZoP?>AbZy+RsnGdcoawoHsrS-#IKBeL^XdF=Su9DckAQem!UMpbfZWA!_Cx{4Lk z_bozg)=Xje0a|{|`=^$aH>IqQW4g=H!dp5ra67-T%U>T~WNs6&YpXI$ z(O@hV)&MPtQPC25yJcvrt|77j$U)tB7VQ(S$U%tso9#`7FW|lcRC-Bw>Wc^(j5&DfqjXCm&aYw?~{^$oXS9cGr*LKyjpmh#eiTA*6oERjH%@ zl9C_Jg;c3jF$PlJkh=bi+fa0jY^_6mXH<%3hl62z>XB+b4$aO+Gwn%qWX31P0wX8C~}=*<@)Hiu2_oUcM< z5OPlPB7~ogcWz}?$|UIznMRNq@G8rMnpeRm{wZYsVh#$*k#5liLX9Cb{BY0SQMfMWo}g&9&w$`%ReMzzw<*fFs4Wv zp&tTm0s?KvdysNn$Dg8GZLk9O5{9=md91npzH0tatVuWD;le7wyt7dv*6?Geo1oYK zBb7M~8NSMK|9oe$T;=d{zx*uXC%f(6J^YSDXclap!L8lMSgRc?Di$tNU?xT<|l%JYY)0pMc%wa99wX! zCMm{pvg&`IZ(`yPXyyO$pCu8Oz!tB+{ulfmXRqV9fdeI3;$jn0ETjGdbZO%qUJNi; z0b(dgv&6x(7G$~q`-8k~p*~q#|3eEGSA~O(;%MicN_#XeN$|OIRQTVT*eb5VU-+Nf z6kp=7JDk7Tl4i;N|L`}#XR(L)ZQe9X*nb%5Qe7>U@a96a1D~}?v)Cs7-6i@lY2-0c6V=56q9z77BX*uh=_?fi(!#OnWQ*Eu+g7UfsD z)DzkNfwCS}R|}+bymxzcF8@EQt)W}~Sf`X=5Jum#WS=*W<8=l(KiR^nJVX`l65u8% zM`@a+YRvyuoWr3GSeD_LBL<)BPZj~^hh$2m*YJq)CV-ij23c4+DqmAmw=S*k5ZYmi zMMmD)pWp-rznVJ`x(Q(J-RUW&8BVPhdE_q(XLw)#c6~#%;>*KzscFa1)`LStX(M#? q&%ylJP#HFNLtdLn`)q|{9^UfjmHTGIB?QeFJ}Mp8<2!rTviv_nid9+w delta 49449 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�rrip=Y?k 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 Bj7k6i diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py index 09856068e..3ec4cf424 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py @@ -58,8 +58,6 @@ def GetClassHelpTopic(): #9: () } -#spell_earthen_grasp - bonus_feats =["Warlock Energy Resistance"] spells_per_day = { 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/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/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/spells/2316 - Bewitching Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2316 - Bewitching Blast.txt new file mode 100644 index 000000000..cbf714846 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2316 - Bewitching Blast.txt @@ -0,0 +1,15 @@ +School: Evocation +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..cbf714846 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2319 - Vitriolic Blast.txt @@ -0,0 +1,15 @@ +School: Evocation +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..cbf714846 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2322 - Binding Blast.txt @@ -0,0 +1,15 @@ +School: Evocation +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..cbf714846 --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/spells/2323 - Penetrating Blast.txt @@ -0,0 +1,15 @@ +School: Evocation +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/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/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/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/tpModifiers/sp_beshadowed_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beshadowed_blast.py index 610d1ee5b..e94284d70 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beshadowed_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_beshadowed_blast.py @@ -23,6 +23,6 @@ def secondaryEffect(attachee, args, evt_obj): spellTarget.condition_add_with_args("sp-Blindness", spellId, duration, 0) return 0 -beshadowedBlast = EldritchBlastEssenceModifier("Beshadowed Blast") #spellEnum, empty +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_brimstone_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_brimstone_blast.py index 640adc880..c2aa03aa3 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_brimstone_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_brimstone_blast.py @@ -1,8 +1,7 @@ from toee import * import tpdp import tpactions -from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction -from spell_utils import SpellPythonModifier +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction, EldritchBlastSecondaryEffect print "Registering sp-Brimstone Blast" @@ -25,10 +24,11 @@ def secondaryEffect(attachee, args, evt_obj): else: spellTarget.float_mesfile_line("mes\\spell.mes", 30002) duration = int(spellPacket.caster_level / 5) - spellTarget.condition_add_with_args("Brimstone Burn", spellId, duration, 0) + stanceEnum = args.get_arg(0) + spellTarget.condition_add_with_args("Brimstone Burn", spellId, duration, stanceEnum, 0) return 0 -brimstoneBlast = EldritchBlastEssenceModifier("Brimstone Blast") #spellEnum, empty +brimstoneBlast = EldritchBlastEssenceModifier("Brimstone Blast") #spellEnum, particlesId, empty brimstoneBlast.ModifyDamageType(D20DT_FIRE) brimstoneBlast.AddQuerySecondaryTrue() @@ -41,7 +41,7 @@ def burnDamage(attachee, args, evt_obj): spellDamageDice.number = 2 attachee.float_text_line("Burning") game.create_history_freeform("{} takes ~Brimstone Blast~[TAG_SPELLS_BRIMSTONE_BLAST] burn damage".format(attachee.description)) - spellTarget.obj.spell_damage(spellPacket.caster, D20DT_FIRE, spellDamageDice, D20DAP_UNSPECIFIED, D20A_CAST_SPELL, spellId) + attachee.spell_damage(spellPacket.caster, D20DT_FIRE, spellDamageDice, D20DAP_UNSPECIFIED, D20A_CAST_SPELL, spellId) return 0 def radialExtinguishFlames(attachee, args, evt_obj): @@ -57,7 +57,7 @@ def performExtinguishFlames(attachee, args, evt_obj): args.remove_spell() return 0 -brimstoneEffect = SpellPythonModifier("Brimstone Blast Effect") #spellId, duration, empty +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, ()) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py index 77e3b690c..d7ee8e238 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_frightful_blast.py @@ -23,5 +23,5 @@ def secondaryEffect(attachee, args, evt_obj): spellTarget.condition_add_with_args("Shaken", duration, 0, 0) return 0 -frightfulBlast = EldritchBlastEssenceModifier("Frightful Blast") #spellEnum, empty -frightfulBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) \ No newline at end of file +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 index 27d561921..bacd26ddb 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hellrime_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hellrime_blast.py @@ -1,8 +1,8 @@ from toee import * import tpdp import tpactions -from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction -from spell_utils import SpellPythonModifier +from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction, EldritchBlastSecondaryEffect +from spell_utils import applyBonus print "Registering sp-Hellrime Blast" @@ -24,11 +24,11 @@ def secondaryEffect(attachee, args, evt_obj): spellTarget.condition_add_with_args("Hellrime Blast Effect", spellId, duration, 0) return 0 -hellrimeBlast = EldritchBlastEssenceModifier("Hellrime Blast") #spellEnum, empty +hellrimeBlast = EldritchBlastEssenceModifier("Hellrime Blast") #spellEnum, particlesId, empty hellrimeBlast.ModifyDamageType(D20DT_COLD) hellrimeBlast.AddQuerySecondaryTrue() ### Secondary Burn Effect ### -hellrimeEffect = SpellPythonModifier("Hellrime Blast Effect") #spellId, duration, empty -hellrimeEffect.AddAbilityBonus(-4, bonus_type_hellrime_blast, stat_dexterity) +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 index 2d734f64f..bd75d556e 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hindering_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_hindering_blast.py @@ -2,7 +2,6 @@ import tpdp import tpactions from warlock import EldritchBlastEssenceModifier, verifyEldritchBlastAction -from spell_utils import SpellPythonModifier print "Registering sp-Hindering Blast" @@ -25,5 +24,6 @@ def secondaryEffect(attachee, args, evt_obj): game.particles("sp-Slow", spellTarget) return 0 -hinderingBlast = EldritchBlastEssenceModifier("Hindering Blast") #spellEnum, empty +hinderingBlast = EldritchBlastEssenceModifier("Hindering Blast") #spellEnum, particlesId, empty +hinderingBlast.AddHook(ET_OnDealingDamage2, EK_NONE, secondaryEffect, ()) hinderingBlast.AddQuerySecondaryTrue() diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_noxious_blast.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_noxious_blast.py index 8a9f72a50..a02785831 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_noxious_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_noxious_blast.py @@ -24,5 +24,5 @@ def secondaryEffect(attachee, args, evt_obj): spellTarget.condition_add_with_args("Nauseated", duration, persistentFlag, 0) return 0 -noxiousBlast = EldritchBlastEssenceModifier("Noxious Blast") #spellEnum, empty +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 index b941bfe87..49ba4f227 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_sickening_blast.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_sickening_blast.py @@ -25,5 +25,5 @@ def secondaryEffect(attachee, args, evt_obj): spellTarget.condition_add_with_args("Sickened", duration, 0, 0) return 0 -sickeningBlast = EldritchBlastEssenceModifier("Sickening Blast") #spellEnum, empty +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_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/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py index 4badaabcf..67aff8549 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -3,7 +3,7 @@ import tpdp import char_class_utils import tpactions -from spell_utils import getSpellClassCode +from spell_utils import getSpellClassCode, queryActiveSpell, spellKilled, replaceCondition, spellTime ################################################### @@ -52,6 +52,9 @@ def OnGetSaveThrowWill(attachee, args, evt_obj): 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): @@ -59,12 +62,9 @@ def queryStance(attachee, args, evt_obj): evt_obj.return_val = stanceEnum return 0 -def getStanceName(spellEnum): - return game.get_spell_mesline(spellEnum) - def updateEssenceStance(attachee, args, evt_obj): for spellEnum in range(spell_frightful_blast, spell_penetrating_blast + 1): - modifierName = getStanceName(spellEnum) + modifierName = getSpellName(spellEnum) if evt_obj.is_modifier(modifierName): args.condition_remove() break @@ -75,7 +75,7 @@ def updateEssenceStance(attachee, args, evt_obj): def addParticles(attachee, args, evt_obj): spellEnum = args.get_arg(0) if spellEnum != spell_eldritch_blast: - stanceName = getStanceName(spellEnum) + stanceName = getSpellName(spellEnum) particlesLabel = "sp-{}-held".format(stanceName) particlesId = game.particles(particlesLabel, attachee) args.set_arg(1, particlesId) @@ -93,7 +93,7 @@ def removeParticles(attachee, args, evt_obj): def addToolTip(attachee, args, evt_obj): spellEnum = args.get_arg(0) if spellEnum != spell_eldritch_blast: - stanceName = getStanceName(spellEnum) + stanceName = getSpellName(spellEnum) evt_obj.append("{} active".format(stanceName)) return 0 @@ -106,15 +106,15 @@ def queryReturnTrue(attachee, args, evt_obj): evt_obj.return_val = 1 return 0 -class EldritchBlastAddHook(tpdp.ModifierSpec): +class PythonModifierAddHook(tpdp.ModifierSpec): def AddHook(self, eventType, eventKey, callbackFcn, argsTuple): self.add_hook(eventType, eventKey, callbackFcn, argsTuple) -class EldritchBlastEssenceModifier(EldritchBlastAddHook): +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(EldritchBlastAddHook, self).__init__(name, args, preventDuplicate) + 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, ()) @@ -127,6 +127,41 @@ def AddQuerySecondaryTrue(self): 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): From d83ba5d4216d26a85fff427c6047b69919a2294f Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 31 Mar 2022 19:50:05 +0200 Subject: [PATCH 139/146] Warlock clean ups --- tpdata/templeplus/lib/templeplus/constants.py | 83 ++++++------------- .../warlock_fiendish_resilience.txt | 2 +- .../tpgamefiles/scr/tpModifiers/warlock.py | 16 ++-- 3 files changed, 32 insertions(+), 69 deletions(-) diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index 8abdc0ba8..dcf5a395f 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3400,12 +3400,12 @@ #Warlock Blast Shape Invocations spell_eldritch_blast = 2300 spell_eldritch_spear = 2301 -spell_hideous_blow = 2302 +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 +spell_eldritch_glaive = 2307 #not implemented # Warlock Eldritch Essence Invocations spell_frightful_blast = 2311 @@ -3421,9 +3421,7 @@ spell_utterdark_blast = 2321 spell_binding_blast = 2322 spell_penetrating_blast = 2323 -#spell_baneful_blast -#spell_hammer_blast -#spell_deteriorating_blast +spell_deteriorating_blast = 2324 #Warlock Invocations spell_beguiling_influence = 2330 @@ -3433,66 +3431,35 @@ spell_leaps_and_bounds = 2334 spell_miasmic_cloud = 2335 spell_see_the_unseen = 2336 -spell_spiderwalk = 2337 +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 +spell_fell_flight = 2342 # not implemented spell_flee_the_scene = 2343 -spell_the_dead_walk = 2344 -spell_voracious_dispelling = 2345 -spell_walk_unseen = 2346 +spell_the_dead_walk = 2344 # not implemented +spell_voracious_dispelling = 2345 # not implemented +spell_walk_unseen = 2346 # not implemented spell_cold_comfort = 2347 -spell_witchwood_step = 2348 -spell_dread_seizure = 2349 +spell_witchwood_step = 2348 # not implemented +spell_dread_seizure = 2349 # not implemented spell_ignore_the_pyre = 2350 - -#Missing Warlock Least Invocations -#spell_earthen_grasp //should be a normal spell!! -#spell_summon_swarm -#spell_baleful_utterance -#spell_darkness -#spell_devil's_sight -#spell_call_of_the_beast -#spell_otherwordly_whispers -#spell_serpent's_tongue -#spell_swimming_the_styx - -#Missing Warlock Lesser Invocations -#spell_hungry_darkness -#spell_stony_grasp //should be a normal spell !! -#spell_voidsense -#spell_wall_of_gloom -#spell_relentless_dispelling -#spell_crawling_eye // no!! -#spell_disembodied_hand // no!! -#spell_mask_of_flesh // no!! -#spell_weighty_utterance // no - -#Warlock Greater Invocations -spell_chilling_tentacles = 0 -spell_devour_magic = 0 -spell_enervating_shadow = 0 -spell_tenacious_plague = 0 -spell_wall_of_perilous_flame = 0 -#spell_warlocks_call // no!! -#spell_caustic_mire -#spell_hellspawned_grace -#spell_nightmares_made_real -#spell_painful_slumber_of_ages -#spell_dragonward - -#Warlock Dark Invocations -#spell_dark_discorporation -#spell_dark_foresight -#spell_path_of_shadow -spell_retributive_invisibility = 0 -spell_word_of_changing = 0 -#spell_casters_lament -#spell_steal_summoning -#spell_impenetrable_barrier - +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 diff --git a/tpdatasrc/tpgamefiles/rules/indicators/warlock_fiendish_resilience.txt b/tpdatasrc/tpgamefiles/rules/indicators/warlock_fiendish_resilience.txt index b362f1e1b..6cc25c13d 100644 --- a/tpdatasrc/tpgamefiles/rules/indicators/warlock_fiendish_resilience.txt +++ b/tpdatasrc/tpgamefiles/rules/indicators/warlock_fiendish_resilience.txt @@ -2,4 +2,4 @@ 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: Warlock Fiendish Resilience +tooltip_base_text: Fast Healing diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py index 67aff8549..77f6b74bc 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/warlock.py @@ -169,7 +169,8 @@ def verifyEldritchBlastAction(spellEnum): #Used by Fey Power, SF + GSF Invocation and Invocation Radial def isInvocation(spellEnum): - return True if spellEnum in range(spell_eldritch_blast, 2400) else False #2400 needs to be replaced with the last Invocation enum once done + #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 #### @@ -385,23 +386,18 @@ def fiendishResilienceOnConditionRemove(attachee, args, evt_obj): attachee.float_text_line("Fiendish Resilience end") return 0 -def getDurationLabel(duration): - if duration != 1: - return "rounds" - return "round" - def fiendishResilienceTooltip(attachee, args, evt_obj): duration = args.get_arg(0) - durationLabel = getDurationLabel(duration) + durationLabel = spellTime(duration) fastHealingAmount = args.get_arg(1) - evt_obj.append("Fast Healing {} ({} {})".format(fastHealingAmount, duration, durationLabel)) + evt_obj.append("Fast Healing {} ({})".format(fastHealingAmount, durationLabel)) return 0 def fiendishResilienceEffectTooltip(attachee, args, evt_obj): duration = args.get_arg(0) - durationLabel = getDurationLabel(duration) + durationLabel = spellTime(duration) fastHealingAmount = args.get_arg(1) - evt_obj.append(tpdp.hash("WARLOCK_FIENDISH_RESILIENCE"), -2, " {} ({} {})".format(fastHealingAmount, duration, durationLabel)) + evt_obj.append(tpdp.hash("WARLOCK_FIENDISH_RESILIENCE"), -2, "{} ({})".format(fastHealingAmount, durationLabel)) return 0 warlockFiendishResilienceEffect = PythonModifier("Warlock Fiendish Resilience Effect", 3) #duration, healAmount, empty From 893aea072581bec097e63ed4cd39165657bedb8a Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Thu, 31 Mar 2022 23:11:58 +0200 Subject: [PATCH 140/146] Warlock Update Handed Spell School Handling for Spell School None, so Invocations are actually learnable Added spell_readying_at_will Changed regex handling for feat prereqs so feats with brackets in their name can be read by the engine Fixed all spell rule files to make use of the new spell school handling --- TemplePlus/d20_class.cpp | 15 +++++-- TemplePlus/d20_class.h | 1 + TemplePlus/python/python_integration_feat.cpp | 2 +- TemplePlus/spell.cpp | 23 ++++++++-- TemplePlus/spell.h | 1 + TemplePlus/spell_structs.h | 7 +-- TemplePlus/ui/ui_char_editor.cpp | 2 + tpdata/templeplus/lib/templeplus/constants.py | 3 +- tpdata/tpgamefiles.dat | Bin 3882101 -> 3881957 bytes .../rules/char_class/class033_warlock.py | 42 +++++++++--------- .../feats/greater spell focus invocation.txt | 2 +- .../rules/spells/2300 - Eldritch Blast.txt | 2 +- .../rules/spells/2301 - Eldritch Spear.txt | 2 +- .../rules/spells/2303 - Eldritch Chain.txt | 2 +- .../rules/spells/2304 - Eldritch Cone.txt | 2 +- .../rules/spells/2305 - Eldritch Line.txt | 2 +- .../rules/spells/2306 - Eldritch Doom.txt | 2 +- .../rules/spells/2311 - Frightful Blast.txt | 2 +- .../rules/spells/2312 - Sickening Blast.txt | 2 +- .../rules/spells/2313 - Beshadowed Blast.txt | 2 +- .../rules/spells/2314 - Brimstone Blast.txt | 2 +- .../rules/spells/2315 - Hellrime Blast.txt | 2 +- .../rules/spells/2316 - Bewitching Blast.txt | 2 +- .../rules/spells/2317 - Noxious Blast.txt | 2 +- .../rules/spells/2319 - Vitriolic Blast.txt | 2 +- .../rules/spells/2320 - Hindering Blast.txt | 2 +- .../rules/spells/2322 - Binding Blast.txt | 2 +- .../rules/spells/2323 - Penetrating Blast.txt | 2 +- .../spells/2330 - Beguiling Influence.txt | 2 +- .../spells/2331 - Breath of the Night.txt | 2 +- .../spells/2332 - Dark Ones Own Luck.txt | 2 +- .../rules/spells/2333 - Entropic Warding.txt | 2 +- .../rules/spells/2334 - Leaps and Bounds.txt | 2 +- .../rules/spells/2335 - Miasmic Cloud.txt | 2 +- .../rules/spells/2336 - See the Unseen.txt | 2 +- .../rules/spells/2338 - Soulreaving Aura.txt | 2 +- .../rules/spells/2339 - All Seeing Eyes.txt | 2 +- .../rules/spells/2340 - Warlock Charm.txt | 2 +- .../rules/spells/2341 - Curse of Despair.txt | 2 +- .../rules/spells/2343 - Flee the Scene.txt | 2 +- .../rules/spells/2346 - Walk Unseen.txt | 2 +- .../rules/spells/2347 - Cold Comfort.txt | 2 +- .../rules/spells/2350 - Ignore the Pyre.txt | 2 +- ...eat - Greater Spell Focus (Invocation).py} | 0 .../greater_spell_focus_invocation.py | 2 +- 45 files changed, 97 insertions(+), 67 deletions(-) rename tpdatasrc/tpgamefiles/scr/feats/{feat - Greater Spell Focus Invocation.py => feat - Greater Spell Focus (Invocation).py} (100%) diff --git a/TemplePlus/d20_class.cpp b/TemplePlus/d20_class.cpp index 939b79786..5eae81166 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/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/spell.cpp b/TemplePlus/spell.cpp index a007e1e9a..fe58a4d38 100644 --- a/TemplePlus/spell.cpp +++ b/TemplePlus/spell.cpp @@ -566,6 +566,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; @@ -649,11 +659,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){ @@ -1269,6 +1282,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 68ee67fdb..5ef33d064 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 IsItemSpell(); bool IsPermanent() const; diff --git a/TemplePlus/spell_structs.h b/TemplePlus/spell_structs.h index eabb5d1d5..66b473f82 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 { @@ -233,8 +235,7 @@ enum SpellSchools : uint32_t School_Evocation = 5, School_Illusion = 6, School_Necromancy = 7, - School_Transmutation = 8, - School_Invocation = 9 // New, added by Sagenlicht for Warlock + School_Transmutation = 8 }; diff --git a/TemplePlus/ui/ui_char_editor.cpp b/TemplePlus/ui/ui_char_editor.cpp index b268c5d10..927ed79b2 100644 --- a/TemplePlus/ui/ui_char_editor.cpp +++ b/TemplePlus/ui/ui_char_editor.cpp @@ -3486,6 +3486,8 @@ bool Chargen::SpellIsForbidden(int spEnum){ 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 dcf5a395f..e63484e9f 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -80,7 +80,6 @@ Illusion = 6 Necromancy = 7 Transmutation = 8 -Invocation = 9 #Added to handle Warlock Invocations # Spell School Subschools @@ -3803,6 +3802,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/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 6dac560d60ec237c0554852f91320fa018f01974..1a240628b5128bf02093dbe09d6d5363e102ab79 100644 GIT binary patch delta 39564 zcmc$^1yqz>`!_l`B8bur(v37yLw87bcQ=THpaVLTfPln}5`u&vQYtf~A|jxKV9<>S zC`d>O;@S5D&;NVBZ=JKwdf(?==eX8h{N}f>``TCEo009k6}*Mr6})H+9_ADVi8+nI z$DF|sUGqMFiaR`3=4)8 z!-iqUa9}twTo`T)4~7@RhvCOu#0X#nF+vz&j0i^bx!9;Bdeon>mHLI$Oc*PBVHV?? zdZw<#k9+MKcj;a}YYWXyVx=<_&+Nz%H+@Ubr!$CK&fR+Riz%3<-}B2f-x#a@lh?1G z)qLt$%3QD}}(~xf#n?I)A{!Ow|8`Ggy{ZCqF3n z+{e+isr&p#T5SItHTOFk zrE@0Zt?1Aj^sNi#(i1->cUAh8Jz5M@ z%X>x|#qWYXM7Lb+HBq2m(co0q<&=9@Nwz>C#{Ho`+O?EDCbsLBhs*g$;VgEa^OFIC zmed(<6ZT2#I^nVUXv%kDAdCafjeY}H!)ytaGKoeyG0Yj;x{%sE(modblKLLC(c>$P<@YRUmx~RoDJMs~v@=<$`~8TZcCbF$M-_Lqwm?xn#Bzw}Ct@t=k)~3l2bneL zTx%53^DF*8#-&Xu6_)V7#hZ*jEs_+m?#v<(frK*MkfaHn&e}zZVu(L?iC(|X|4Oy4 zmO~tWx%x*j`V8*Q-u0*3Wo4 zDx|b-BoWFQ^-+lfvG|6<7e{iErINNdZ+?8(yZBg9hYQDd$b8X`Q)nXbt#TixnU12Q z#`3I<2^FEMy5T)NQ{}hDOk9D=CFB>=?cLM)=MKJ=(4gs98Y>DZRX25s%)ZTX@dmKw zmlGLFTyCpsDmJw7?Rdt?@SXj#cO7em$zXF~+`Bz{*ZLmsS|O_Q&kB+DboQ?oMT*!g zhIYd3$6b6~y|0uHmr*x8Gw=Oftl~qkVRWmT{c=?XVXL?O6**sNBH8&w``ab2pNe!_ z?_DAf?RWD-zdwzN$w^Z*QX1AxRS@))-?n7f zs{1{;0*i=KxnkMhF)N??lhv14BI;H3Gf8PNl&HG0=-JiDwj!g4`DGHR#rHMK&{_|8 z@ovei%zYIw&I`aO#nEkC6^^d`K%;0-!)$V(mDZS>uiJ!|;gy#>1A zchhzj4BwxW+iVS&HM_U#T2!Yyu@`FWR0;9WpcpupAOBeP-Sb6vECr03jYluqwK>tQ zKRhQ*gh#yRrnqOOxYxka@^ZI{w&mp+5)x8oRMgSH?5t|MFf&SSEO4ar+CJ|Si_~`1 zjq^jVrq-O%MVBjLoqb6s&$J>INVf@>6IYa7Il}2>g}T`9Th)kM-xMvw{CLvDqFcY_ zc0=gRq_*@z)QU8VARjAEz1fru(cvRoZ134nLu` z-A2BE7OCcSvz-Ns7ij$`ycEAsKVfI%d4l&;vG(Kl$}kp1+o+Z#p`*~Nc24yi4-}ko zN5g-v{9b<4T=}dI%FX=w^aca^59{f73FI1wlO)@F2WaHNvTb+N!jr-82f?MGr1&?A zcP?v+YChzb(70NclI|bdE_B;6IQw^IR(TQOJT z@*IcDD=)1rDH(Zwoc7N8Lp}1)>@7`_Z*DZPN~PP&-|?%oo8)_JBQO7aX7MgXSJ0;4 zS9oyBLp9>2of{=F8vXlg(U;7`@seA7LS+06^*xJpx*2Gv^=_<9J~7X}z6?cNm-!bX zr7$|f@#SIm1RICQKbkQ~jD0Hlzf8_D*S#i}WvH{rk=j{Tz0!5%u%(T(?I4!}S@(D8>*Ib#*abYY9lol5&WUrB?ZUQs=e6*5#Bc)uz^?4}+1d@%!YA zTQ8zd^LF{72X=oczx&Bq!8|b$X=699MkqK7h$|^YobM=Fh3%_(*7c%SEz9TJjKZ(Ig*V%sA+jF09!9}KK~L%JAgzMioz6RSzO zbFpw_Ywqz}(fZE|-|x%XJ@gK8lek>|iA_zI7RN!wxrDYaX`k2K^0s9$&DW;8lNKM_>U0ez^m>#P!#j!It?SS#U*}>{y(woSS_%>Jn0+1LE<7IP0fF(xI(b%=l<2$d6 z_)S}GHTEd(hPU6E{*9MQsReM zf7mc7OU?FYwZOOCsH@T04jE;!FeQ0CTFRmA5VO`N+EpXa5Xt&YA$7!_*GW_D-l6B| z(+?>|MI2i{Qum1R`zS~6Qir@)l{`E0;#m&`6yZ^E&Rs zV|?MIxvvFiTXRBP(`4ZW)8`(UHV+gZ7cq*{Q+GFbBp%5z$3FeEEv?<|{q0$gOxf_E z=-0!7sgG>L-47o*lFq1Cn_OZX>o+e-X#PEJx`eBD;uDER=N0{$i+M3IId{e5+9p9Y zg}i&{=2HH>MB>`|1^tWPo+vvijIX&k#9Fo;1Qna+>XxoWj=l9fP1L#jbjV18_os89 zNeWfzJ><#)TG!Q|Ea0AtpGhX2M+yz; z;_E(nDX-GL{c%pKBGF>*scy&7i-Gd6jquObg6&KP%I8EIB?ZnJJ?}X`_1^ZKvA)fd ztiNB5G2!-xXfZGHRtV6o6>L^RkU!;K*)C0H`8;fRZR-1Prsf| zc@-OdC)zkqhU0L6nLPO_{gPJ3Bw_L3IsI45NDhG;kycM{T>jX?m{CSGAXBvZU9Ix# zN{SF--;tk|uXFB{n*%Sto?UXPZ`@0nFRdJmjzec>huPJODHCbxdpx8MPU$;n-@+{v zi?3CpU-`F-oR3>e-z15^D+wAcvIvb!44gH!s`$uI8k*($q($DG$C1_lNOAn-&#ri7 zP6_{u$wR)bdCzCYq-%(DxPDB=X!uTyDVKBl_AxhD%GMyx`Pp5$HNxob>beDRxXEHn)EI%%3ZY?AoTT zOsg2$^kw!u1PV#95D@B z2&j}X<5M;Mu(!))+@YT0+af!a zF8%#irn8FzMX|ZC7oFS87~Mrekf7d}Grql@(UqB&mGXf+7^XoZ)~&A*Ravn=uj1aL zmk(%o7)9^P)9_P|BrcvyGH=ei!)vvnfg!Z>B2AOc>=_QPO0YX{*n1-HUbX&|%AWjC z-u{JUqi+2a&MH~Ck}V>yV%Ox!^O?|lXSy>YY;&bLnhbF(eKf&&?!p@a{-@jB;wm2z zIEjU$eqU#s#H+u`P)baHb#L~>ds8Rq9uGzMU?NS0{JB% ziz;7@Jk@;TLO;I0yjpoLCI++eWzFi^hmWDGxAT8JJZ$=6n4W4Q>lr*G0rfa4&m3uGFcGW$dQ$+t09Eoln?+ zovhObPR4~@z7gMopg1owVU2cI(xWZQ$hz_)Ie3HbZ0YsLiAvM@fxe>~<1hVKxIcet zlXov1!;<=gr;Ai;8y01FPD3#@y{Uw5lQZoFwmv2q0w))b9l~5D^&Nm z-N5vX-OY|7a6p`G>c!UjR*2+QKTMa`FAMHW_hX$Xz$;03xbpS-`=9e3b`Okwd&8VR zeG?}xrm|&pQCF_$$Vbb3h)x-$3(TVMxr+F4dW4(_UnM|c$l6L;acW1#j^RohSr7%v zIr$+`7ST${ciJR#MVa44x=G>FPs|bqvUUg?Rjq#K)KJ&?{9!y8a~UFf6!zNr{N<>m z8K~hfbV2O%H5Mt()Mr1h-p-mDu_tj5q?g@sCy=pUl$;x#NWgfZvnhVDI`iqLk*_kslkx5N(3o73M6S76~9m^&jXMbxIP0)loCep3+<51bq_2 zYiFqioZs|`yQFsQIGLuT92mz)JV5o;r+tuiAYW(~Yd{)!PDtYY;Gi!f@dXV$Ww+9Ld2I1w zX9L>)-yA^yV-NnB1L%M3!9Q~V4RY|$Josl0p#K|1^bZ_B|2K;0AEW?%+y?)^gMa1# z`oGl2|EUA$|56|Srzt@H&m{U!J@{u1p#OWL^gnU{{ofm<|4|Ci|N1ick39Hi4xs<5 zZ?k{j0rY?MZT9b{0R4ZwkN$lF4j zH!$+Urb*1m%9_>t_tH{@sB}=(J64Zg$)nFw%wv}Mtj}}8`a7-3o4?uAE-_ZE z@AQNbZYvgWJh4R=W{MnUkXGbk?7a_b7w#h@?6PO;&6UiWNM(YB3Jl72#%73=zWf%VGQ+1<@W5cQMNZE@5OV>B3 z*fMG*N|Q50f`x2L=}UAcn(u1}OuUOhn=?g6;zuTBmQItk5UGr=FkjIG!$7kmopAcereN{ymHt%(z_XVXKkTTLg{Mb z9R{o1F7j_@Y`*C7q*T(DL^lTa?0bu5)l>*nHR93U4#|c+YK3!x+0}}Gf2nvfN!A<9 z8|ikE6LdhT7dc^vJ30*IVEjv;lgd9rE}z2{n9lW^H97Ab+Tz<8K1$pVC3zbE**1e} z`M^rYc+s<}wPl!|rSA`I&*277yCLIdc5-;#98(Sa`-I+|mEdmK;a19hjO?J<{z~Ud zTvziVmO|Bqc#d$d2~w(2U_wsOK0lIz(+`)UHUka1kE9Iv=T`7N9(4Z$&%zDeC|l)^~EPqC3&JkZx7_;Fhy9x8evhycBtLqd11%jIrche zW&e;)mY5e2w*UWh0s8;>)$nh2f!<}LC|N7PCd(!P(awDvFL~=y8#05QwERgXZFd!l z@n38CRgPxYdJeiHd%w2}P_#yV5kcb6n29H&PQdMnZHNx6->hTDEZ^V7R z53#RZb})4o9!e%J8)GTbEw3N;^+{0uV-fEElj1h?M476 zYe+C|qa8n+EmuX_x!I7_=x9A!)w;{4y|cC|-+Z(3DJ_B6qU#H%va8P$YV=fvv}*^M z>aV5OYL!@ee|-3~F)&ZJE5_RdP5+(f@+WVX`P0Q2Rk`)vt3M9C^q z+aksIF7Mp>(q7?{&o*}rPQ88Ysa82S&bOPdN9nY3uZmi8_z$stPt?s1v*>}lEH(Q+ zPhU&COb?%@fP&lc>6cX6nVDZByI5*eyhva6xDrg+2jZ-)e)I&rLWM_7mqX~FlAH(v zhW_3=V%IFFLkK2SNe76oVG0U8s$L+VF3ev&*5};;UNFZ!HgKidiYWG|?yWqbhvdeb zWvBVCpF3vR10U|@Zlzq>Z1^dD#n-lHxryd(+uQq;kA>OJL7m$P-L|ffwY?Y*rV^ zZV`SqXiYf147Fv-z0{XmC9${l+F|xILuz<@xXfIQSn-9kzp%2z!cX6xOWiXn7+HI; z&eGiVZH(|kiVDNt@ahx;(XA*qy<+_RJ|*E()4PQ?wc%9i`J>yFz+H@^kLl|vt&m(n z-zGe@5zV0vZCjbpOX5nA2lt<|pK|j+uPyICx^s))Vm4#{zV@5u{5u&$Iu$B@OkY$! z#GgyCj7>$<^;U~(1${T({!>A9Edd(y8|L6XGbM;7={g;YsoKwWqC#s3O_`yTg*x)bKSodWF=29j z{^w3pF%z=At$m}_#^>f!a+eU<-pq4>ZHYF|^n#UA5_cO@1{SW7R;XV8$>2*IRQ@2A z$i;`az+s=LC<0soG__2L%EC6wwlYMtZv9!=$URNW#PanXe5pycwi3p1eImwo-_y57 zTkLA#JqvsAtY$w%;K@ExuqE^&@XGM7TN?P%P4NpsTDbi+o4Q4OqaRt?lS91qm7Fa{ z%sY=KHaz9-eFy_rO~vNlY%1JNKG`2g+q)YBOZC&lg1%!vxy*8t9IDpi`DaKvy0FBHhTQ=6Pa)w+T|)@7eKAkh>vB5fC0=Qi zOcK>QTFe=em-2bbZr^jRwzRy0KY|YX0o*cbKKVMIWebUa|9RhxMEo_cOJKo2C2`lh zr1v(4buiwwdflv7j z^SZk0tBkAhZ!0yivuBNDJg{yyDqnSDe%`dQ=R<$WJ>N-@D8xo#NhLC;Z5K2COs;F4 zw@fL+rvKYJE}eAO*d=7T)dJGrv=@3XRqq#LpEY>)-d*B}kUuxE^u^0R3?r`1^sQPc zjx?=s_F3N_4Jau$>al0urcDu9#oo!9>W~m;AwniRAFo$f8YTBo$+q;o`%GTHP@jZy z&ux@%{Mb?7LgakBy4-4X5?_Os}ZO=1|nll>Le?57TkfT1GDVNZEE=k<|G7 zbd7TLbNo7AL7zv_v^)cgtwB;0^3vQvUHI7bjCl4yDI9yC^dkrK1)qTV&W!`ST^32P z0WHBQt zH#!=zx?>q z#eKdh)cBVkXTSIm^z5jST3Fq8b%xB=gvqv4&T7vdIfFLd%!@Sd*S%OC?IPo?zC4hn z`4K6yk-oupx%c4Jw%k`s&eQ#?_}>X$%(Dl}$c0I*Y*!A~=->JC+Ka^IZkT|6?bHb4 zkZikoQ6{ogQbps~ zXgP1M=3HAzkJ!?l$(*m9!S`+JcR{FEkWrNO)$DsN9@@S_PhRVE{umJaUORP-lAiR% zodgobrwMOV-=CcfuX}Nt*}3uN&!76Vr8Ljfqx@OtK-}?dYAB$jA+{bd%uGX3q7T-W5#^X1{{4$g-=e|9v@5qciD4>kxyEyVi zvdu7D1B$s67ZR5>16|?T-jUzblpiR-u1f30eqd)x3VHw1Cml`s^ymCJirl9;z&9pcD&9TchvqWY3?-7SSB+ENT7LIR|N%~qckgkGP z%$pabEtJ;>F7z)~p#!W-)Z-Kfa>sLv%v@_|ys-S~T*eC@X1d*5AH;=($mXXmt`QJb zIh}csausz!FAj|(%G!LEeuK_{+dSru7Dgr3H0lfc*O)uatl}bEN1CTch?C@ohhI@@ z@^jD`3FV(JCY%(%7ZV?gZm^lP-zGX*bW;1s!AaV8>bZUf2ML;MQb8r~%&h9O3?tn- zLLwqQ_ToHqU*qN~moDAl>vTLbY1-^WbH6yB|IW%Jv5WiR%_JPg+}gFoopH9wO(98D z_6%ME9^rSpSh7EoA4mcnL{3o!m=LWAWo$Q*n?1`#F)+y=1r-TqrVOU}-PA0&yri_t z_Kc;Yn1Ui@#a=1|t&*kow4LB(kjJffhj4+%lYi9axW-9W%0wLOv|fq7eUjGHS#FrD z`li*)SAQik?%L-B>?0P%{AxUOF)>43-Mstlr=DL&jMC*JK3y6tE5K!udvXqs)rUl( zGIhkV?GaWQy+`;JXU2Tz=Xq{w|K#wDV0%Q92qB1c&asbi#ZV6=jf|@fES`Vh5w2B9 z7i5l)xq0CUH1bjU0(u8+qnuSbHZCY6FdAz9e38p%VJh4)V1+tY^^PUZktgPp#d-F6 zsm}^B`IfJ`G8OaUo2?ayyh47KN2v9cF!9&U?LVtxcK)PCbM}z8Fd^b{N&g|;J%|PE z7cS-vN&4`q~)__L;${lrep(~YC^N$sE(k}thsE_-MRPk{#mQ%3~KMnQ5jCh zUURof6YO63rWC>;gqGi9igA6%R2IiGul(Ie*;tr!k7MkfIzyPEaVe5&sFPOn%{PYZ zg5uBfUlYS--uxJ{t=KAJIQ5C}MQl?S`Tg`?@xjQ)4rhnm`O{3)%7*TKK!zGyXZO?l zQg_L? zND~Y32cPY4m|RTBkI2k^8)T)sz)tb(Nci*{Ha2Uv*~6_J|0I&8&)Mpq-ET#^OL-Ps z_RD=!F|?ARY)MNkC_ulWGC8V$D3p*Yp3zF1lxo$?o0K~JZIJwRku@eOE6*u2UacqK z5A@KjsApLIwX)G`k#vEFy^f-&bbVQ&qsy;e(2$yDMdU85Cpj*5>92obIdwrib>kFD zi%^Uy^iv+0)MWfs)AwR3iRal_Q&_xMGDX~r2w5)FH+I za#FfGH!D#M8K-xUmb8FD>E^JI*c82J#e+|agABLA`&6Dz?9b68(BTAA1u(Adfp~K? z51;qOIt|HXx!soeI@i*CPV3NApb9SzJ%c84S6BincP-zaYw9zS1ME+;@jBVrJ7dYa3Q#3qGbNcZn53<}g zAwylVyy=F=JG5~-JH-aFA#HR&>hES`?IcF1Nek?3@8FOIB21?}zpaot2D#_SApWQ_ahbJhq&#;Lq$#vdv-8@osp0Z9JNE zdWOlAQQ^`TYKm#}$XoqKNIvJCbgERMc4H6q?3o_=@L+5@xZifHS{!RSKVvskB?2Vz;#r8xnDeEGCP6%ZuI; z@Q+}gG!E^p&s?V_vmf9gq$(|SH=#9gS+)LRKqK>!De&oT{Z3Z@ThFOkMyqlx|FfR+ zff33RbL<~GO89OON%D~KWzH{gglASX6`#J;{9!&ddwui0-|_(Z?l<%)E>6Fj8DQdrE{tW)qwEgKtq>Q&mgtyF~0`m91u-jsB`*=qW6Kn5MX+fEr zs=anWC$fVu%F3E88twG4)qB>#wNmxj^K^lW6)U$Fzn!mae{^N2NN&;3JiA&~bg5z8 z{qn)Pj2!l#ALt}gvlHD3E2)@UXP66bly+VqYu%)J_C@>0`5VCjn+Oxh>S=-R;%|4) z)OSmr?jJ$>r_&j<8U%W~vE}LcY5ih*o$a4(!1jvbuIbaC3)>Ge(DKBuqsAkj?i!WN z6;ziCdb%(s$pvq?)93}dUz2bnPtuJToCs`aO`Ec-958O@6j>Xeab;J zKo(~~sJPZz{98LfvbfkO;OGV_Z;-Tg`3v?Bl1cx}$Bh=Wy0BAJfvPcsV#lDpMtY{~ z6mGCMO!0k{eG;HTZYtTlgJE=gv?O1wq_f0#p?!g~nqTcsc z*R-Ew*v37HQQ`Ik$Wzo7!Z`0@7(Tq%v8tRZ5lAWGzab?Z^YTIGJBFZ%_ zF!z0S=1mNl+#7wj(2kGp+4i6F*tJrqmE8N1hI=fwTpTfMm}l?Gb@zP&{uc*ro(!R^ zt&-9!Z6y0-I|?64@Shq5Zx`9*_!p-@@1GDowDUt+26u7F{mBn}xWN44Q_qmGvAJ9u zxASj}n)W-S8n^pe9`en4e!+M^$SFbH@Me*Fde=_>?7x&wSJH>>=-Tq{Mu|Ppm6Eo> zZjFs(RDJqAP;D>nAtHUIjBu^ecd0Pm?fk9TsF4RBzfUy>y^QhZ{r3FrO$Tnb?&mHx zzx2>X{cZ6CXiam3Uqg=lIP?y8sE5|1GqG*oSMU^&nl+m(Cna;cCzSENfW{#1UI_=H1j}pa| zf@(*vUDmJFc|En+LhvB*op}G;a8NaA^1(X3NqvHcSy8h!R}wjzHdXHI99>7`xt@V3 z&-x2gq#kkNc5M&t7WqspmzSSjG;40%S}{{Qx)KvNw3f2e7bsoWn!6#fI&D9#*H%El zC2sPLfh8h8BVJZ-dQ)#myX_;B5wbGji|g6=uz7B=)Y|KQ0gHGAo0mn|Xl`rEl+Ajy z;aPj)m5pg>2NxOVqJ>^7F-<*Hy7$v3!she43u>2=)A+80s>uI}SxgHed|=vv$8(c( zW0X~HWg(3NnMirW8M(hvJN+qeJt-$(-FT1Km*f2vrEy%^Y(kGGX8CBeC7RYx_#OKo zzW?w6;d^mY5@oT$%u5l0bXz}^On8vsMt(#X(uq8bZhV##jYAWK6Vd7Zd3X!?GV%F~ zUyp5lWbT-@Q{T@WO-8LskkfhxGP{)0c!=Cz;~XIkPwi0d@1-d>RXjiGd@imlF{oG4 zHdnvn%%27tWSh{~CMPxf7e_ z;E0|q#oLx&e$m&(T%3=UTKPD>TR6)x_VSzFG_l8^Uchy#Gw|RFLX8% z&X*67+_&o5(zb^fzkAhb>)v=k_ zMO* zfw^I9S3W8D?orktT4jTl+zAA!q!f2&W{9{e#i$|Pw~eRJl9Qzg|7Ew}S~-}dF$?98rEsk3QkJ9af1pKapH zzJ7Jp_@(Wf-cRf7$ibPJq?}tSOmbcqdV9nVN@crtE(<@KecBuSbaIZ)BQa0=Y1O>U z69UOQw9*yO68oP%bjjVFP^rh8QJ>d-Q#fC|`hF8XuJ}~={RzhlQj{0o7}?R$^7hUc zZb}+9zOG4xEVYukHX3%>nn7FFMVHY&v;YT{!}99D4VzM2zI3^Y?X(t(Azg{2E0)@P};Hbv*B}{dCgX%263MO(5c<;+ok{kzd&I{-*wB?{cMv`yj6@Jr!}1 z&y}(7sRY>rjTESs6>}jzg+n=Qw%e-sv9+2+w~Nu$dEsxL8tbc)u1JT_`nS}OK_uI9 z6<#?c)CH0YTJ+yK&;=LY&AN^}FzEWdak%K6cxT4Yklt5yN0*-cwrXsAt)@;2(9)nW zzg%mr|E#U1rG$L`eFjxmPop&CG*dWfbp*K?*Hq+xhQfOw5#N;qM$KedUyDZi{ zhvr0zZ=9r@D6)Spyt{+qm^*vzGKX+NVgyMhz8P#*3eUg}D^Z@w*!Ji%F_Ckde^B3bS6&Zh+mi1}^9)%qJoJ{kvJZJO$JelR~ zGvf3wo9_?f*^v^=?+#Zz3|&$4{w%m5{K{2u|0ery7Vn+cB(&J~U+Qts3pQIWOJ(xY zzVS0^|J=aM%9(24K?Af8MewyT%8RtZdhfK&(=`Xsk>gyl=ZaFs)@o+o zCvJbVFGLAHj5tHL_DMGG{o#JwT^i}wiXCWS&pFg)!?>?|dv@t}z|H~ z{;hA%EB}<2yskY<(5&l66U-&1qp2enC)e~jB_o2P=cvKKzoBfwP&wGWAp$$@$ z1RfUR0l%&wdBJCUGL$ef2Y@s(pj^rOM1GtMoaqSYUt}mLWP%PBxRSOEi10N%ntDNu~aB_JqDfs#Z<>tZ2q3X}|z3|Lu4fs#fR0x(N~QbaBR zz(EOs7I4W828J3~=n)JMfLW#l23a0!we61p_(&2B=Z8VBCi&6#;7t^AYz>hDqC<&w^(0PFlfNmgYN{3Pa8yR%KH$!e5^qvlQE5e0? z2~h!R9LfM>!OfqKV_IOr)1YWZ-`D!dh_jDwgifTAb| zTQ)El;KxDtU?44kgN9)c4FEM006D-Y6BzIUqtao3;02DrAPoRwW|Rst9C&0511-Qn zFjxngCtxrF7&aD^GBN=i;RXXwU`7QC$PKUt{!9l%MOgu816r=afDjzn$O_!YL0?#b zkAc871~vc;fwP7%=sv_kaWF^#ObZ)I2&tq9)Ukm$C>>xSHg*7__py)}47319gaIMg zYGnrjAXEav?7)L=;N?XQ00uzudcgppgM%KyfJ_4iEpUK@udCr8c1{3hv~Z9E3=&jv zP#z4zHF3}=ClIy-!n9lflmlTi7_@<{3>ffg;B*TZECH|X^P?1yO2FcA7}SET3m1XHXdtY25ha351E)vBU=L*C84P%TVWF=u z@C1j_3&4#E@@E5snH?;YF97^<1Ty0=D1>DM0muQ21q=oN$PxsehJ$Pk!hj68Lo5Vp zi4FwU7zSD(l#mcg71;ocpM-%32sei?0EQqwUN9&G#@7hL?f?rnVbBIFln?=r7aHK8 zYcLQo#6d4bK*c%g;UJ_a0AyfG69$$5B*CCtA5=RG)`1MA7yvm&AUu*6SxFZM zO&@>e5C@;5!4n?he@%pPaS*f_;Qq2WNHpCM7UI1GfFS@Lmw>b3U;>uHpcXhge+h)h zQxperNdOQo2((Cmo*w|AzAFKSC!Gim>ViQbkU4}w0$@ZX0k9OpLGF^EAJ)Y{X~KY4 z90z@Xfg=EfQUK%tpdbYjtp%#WM+y{7EjXe?3e*4{aP5l}FoX3nsC8)oJOOZoK{yCe z0SpL%*Avok^#gb5WdNuJGUhPY10Vwi17K@F1_-x-r@-q6^aIeW3j;&&_-z=lg7)u* zfg{M~8Cd|j9dVEv49J|oAcVo59S&-f1qxXK_zeSTAcK+vAkYSM1Pn%OanN%)AgpAM zgEnE10Dy=*0EIx0KMcwpaL^MN)B-)s~%43;c$&^s7}TYu7?)(gIa@ z3kK4{IH&~%Y@aI=soZQNrwXEsta0-4EXe07qm|Un9}@uV7|=& zSL|Sr2D&dz55)ss*A4LJa0MLnT@PG|5I{YbJ^@lV4wud9)!1MfGy_? z00;y=svCeUEg*9P2A;qXoB^1&T5>pO$pC0(1t&2Y0x%#BJTe3Wy#bgN4TB}n%unI1 zZXmM&gJ`ftX9Ttoz)&3+7=n2bWdtr1p1`XzBOo&az^DIY9$5&a!>z%!f)!-vFZz`=iWS)n=r7hFkc8m$3pOa;zaO%;0e5ZI zZ@?oPpwbekY_tJY5B>xI+OYw(n6re1#B4#9(m+mJZ9)EXfZ}{xa0f33!k=tGMUyRJ zAqqRdC;=I5J5ZME;J6!hf7yI&gB^+i84cv8?0{*3Km&z6eDwj0hCNCRNd_7y#U2!T zAP7aTJ=};OZf7093!(w&RCEAw69K|#80-N6w1TYK)2V(PA z_~V^Xv`8`#?jmRKpd%0)bw8!U{Iq4eWFSLdp$YgAa0nzB2Ix{@VeO%2o{Lg3nfBM zH+D>2;zl4Ei4ce_NZ$*^M^1Jk=|F-&WP#ratDpoglqh-IiS#5X0znIYTU3GGd7-$- zN5+qpbO9Oyv{kk@iicd}gcauis?Q-1>yWfJikE!vL;j*1SQtT2ZbVUn>wbS0ooPNInV)+rr@19rmMjL>p;miK@@16DG`?gwbX6ASABwFji{LLPp= zLao0o1au#uZ$ou{C~5Mg$>Sqi0sRNi7SJz0loGkfiQx}`6}n){9J=g}k|z&8p%VZ# z0i+*7_xyow*12OPNI+Kr`UW)bkCGxU|8h)w0s14Ld7z5{C?&FE(gBb?fc#YrMFyb6 z$@fll_?-y9fnEjxZ8RT$F&s?$ghCxf^G((E}xJXKz;#a6*Liq z(k2f#X!xrb{-)C*$zYT+xrp5{4I2mheHBUw1~wxsj_EK!j{;f?>JJ7{3N$~aZ=TR> z5X}{oIK`6fF>MVppbEBrH9|I5fEFdIV?GgZGeC*2i=mpf>@{1T9_xp0ipW z({@0MI@ltGghD`-r;QvtSpz7zMogiA5TGRd#Bdy-j{vO;)rWwx^gK}lA2|(Z9SH9# z=r`WUV!=~0t0+2hgaQr$cK+v|Gn9E1#ZB%ge@rWa4R|?2 zJy%g2SfNwA0{5QsbHfoYIP7>e<4Kb^wBoHDdONfyvL0M2ECio-zk%SVqDngAMZ zmsRLn80eyIn`3E3Kz{)ATSz(_B};aaK|R1O05%u86%I-|?WAhpl3oLJG}IrC5+jd3 z8JIr-RR>l8L>>VQAsjwF5w6@Kuvj6J2q3+FA`Mq#4p^_C>exWIi^{<2f>nLXO+7szFfXV}F0^+^_A~JG9 zTLI~9K!-#2H$X%Ty^fXK0rWhe{h-VnpwZ~Ok7+W{C>mhP5bC)BDw;R=n1(IMh8J`i z4GiQxQ3AhAuz(hTWYEBQvJ(U0<{|)V4!Q=@sl)~}E5|}0g>o*}39SyWJ{2yoHLv1iUb8_b2%Fk!VfHb6?#2bD; z!beg-iZGpXq8p}9gGC43hyl(oofrs*3htf@5H1Ep5OLysF`!{DNukvkkR8O;W4oO} z1kC_V1M%Jjq4GQltSz8cfD#|b?k2F$^28GOC6f=91(bgiSW*~xtmHGG;9PD&6R>pj ziIaazr$HBPfxxbx(C{k>Rw4-5!Suk1J1`9^c?T8T0=h^358dw2VSozhlVHQ5+dq5~j~X8u8%e=6Mn*KJaFt1KFH_lH4jgNYtZ-}u*imJLpDk975C)bCjg|M0qI%j5iH&CFG{Kaoe8ZZfw2BxU7QDal-2TwmmYd{X#oj@ z7D6@juuBO=4JZ;Xc!>oFO@p9DKnOOXC`3gFAWZ0?NdSS+B=k_kh?D>#p{StOZ*uYPeV+4Nd3W}A=FFK>zc1@ZX#7>VgEXB$M@Cn1a8vLW@O6os!1zcGaBykx zPVjQsIDrm}tmNQkU|s%Rm%k>^?NL=7JRdZH5-#CiF#jhSPQhB+xKGA@fwrGDMpuf1 zSRa+$UoiG^&Fet$_uxfRXri})JKU_ZK)Uq3F6}2Wa5ByB0a)uC?JuJzvhhtY2d97w zQf|rCiBuV3+S>53lt1MDM0zsOCLXoi2#%8$li14o+ip>J&)MK6^1&oR6=GGsX4oye z6~_iTjaRIT{0%9QNC#(F<2!(L;AF~EiKIi6rNeZv#w1zBBr*ktnk`SS z?23-IZhmzSxlFDmQe}?Cq$>CuaEdgWOd97}cJBatD1GFW$+R-fv~_2$yV+QoGnuiF zY}PssG%@?jp~*NHW&^4oqguCG7p3?Vx;W0N)E3U8w2?@~Db{$!b15f9rZ8AthINi! zLK!Vbr=T5bjn{Fe6K0Tz^RqJ}j4)6bBiufb}l$^D^~IMtr2z;>8^bz8GO%qgL#E?iKs6^zbbZq~u$U~H&Jc;UO=BiK zxrA>d%DL$}L~Q2KZLw||TSQ6Z%A1lr+=!gsl4Wx9I9Z5JCbl=%c_D4jg z-4rP@gNS5UzUs))v+-DIqd3I^rTwm}=r|cZgPzQ>4)%gI3*V8YGc>zjcdDEL)=}SG zPOC_!&Gf&39-}-b0W%RvF&qlgcn_6lXEIo$O+=?%U0j;WSjBl}{T^7?hQB0jCWAHg zp3|H*U`_mMa(||`jXT-mJsYfB>D}`5EVfAg784DuPQC|ZoZ`5`j^CPrI`N*A9kUn< z*$*6T-8IdptQ5c5;Bd1Zh_$A1cj-PGkqis0uKaoc2$Rodb7pp#NGtGn;1Y6JMN$lZ z4ZZ_DB$ek7s)(VEC$~Ym<^4e-=g|02Yy1SP)tgV`lR3mY$E zM}gGAZ{+?QZ-_1Yx;@efX`Zy0i*0}<&nMX40|(22`Ea2R{H;mIG>?Xz|Mz36KiO z#4pP5CeyAcy^|T(3FcrDSc6qw<|TVuSQ~Zl=p;~5&L%TAB%2?4oP3*7R;tfuPK&oN zg<#zn>yM@Pe3~9&jhO|~k+4Q)&Zi54EY@d1{*?7{a6TOtYj_e!_u}75(FMH0ku)?- zkMI?x?E-Igccw}1rt)OUK6zbns%5&);ZrC>WzGUGf8u7Hy&N=+a{qnFT%f&esh$qg zMPjP>EyS@1YsLc5BuZ0hyO2i5T7n$|&8O^;(F<9Z!VIqm&7ky`6>1$+#OXoZ_v#+) zu3S`{YN@U}MV-19N}WaOiD4a{s{NGoUc?F+Z;tESq-mBTiHjH*>9(ZgSNXC0un50n ztXH;~NZ|CvOsfGU97l9QSW00&T#R&2-=3rgebkN<9-ipHw>vmK3m&;||SLA7$ZMXA4 zX_UTl{wp2+rmd5ZMzE69SVFwxOF7zWK^pJv^86Amijq1wQ_I5*BsfaOFCiwb;*PaO zP?zv4vPE%dNe62eOs9;O8%u~)m|6b-T1*L)1}V&|Y1Wsz{OH)-Dg9D#Fw44yCXc&9W-Bg}O1EAnv6EHqQd9$@V4Xap|&@Q4nL+8a-VncS-zG zS{ZM5BFUhMlxSJAlx~PMzmI}6RM+IXiX@we?if^mx&$wyN`H%>PM+#XnDkK`W%1T9 zY1*HZ>C4zPq?>~p6ZPaZIk?Q*+~$R^0h*Y_#Iv0BG+=-e)^w0=B^Jud%XM8c_cW>0 zx|>W{P722OJJ#w$BITldyPU>En0uQ+Gby8`;Meqfl0|zBNV}|@wEUWA`&mwH0IBCo zWysffonu&sh^BXES@bnkM!B6T)j93SQ*!KU`aRK_u6N_wZNtUAf)36$zxBdP{jMa> ztnfCprtbsj2w5xRS1_>C%xgU%XoGsnt`&4au3^n4t?;(oSwTedYy_*<+Qx|zx)SVX z(}3oP#+q~VO5BSGa=h03n@ssul2>Z?R(EiIj{H}St)%JEH5{y7Po>-v|5c<;o;5vx zfQ*xltMqhJ)3N>$OFdImk+G{d3*{I-1Jbc`ME0yAN7Ab~*7*bEQ@OuN@9+CLI15Wn ziN?|~mF9$-h=xkj@`S{t;&+^3osPBfAIU1LA5SRbh|I6SWoZ!>x5dp|dM~C|y81xG z57Ss)7aTr%xGQC>-82WR#;Zv4>V6f@TUZvC$kntVqpBl#4iSy$NSV5tXeL>F7FJ;Y zfOTWpzuFt>iMJr{PjI>ZEX$TCRm!gM2Dwu#ZcQ*9gUV$IUqd((EqQYqaiGK7*JRil zTuH3u)LA)#Em%=a^<^rOzgM`5^)aj~$jLR2uFFfW#l#ipeDf~eYOtfk4z9K``F^aMcKMmHS-cvGHts_jNELd+t(&WfG zZ-{?sN4g4B&ncy)nsVU)+%Fw$p?4Y6J; zN#Bq?nU*Fcus(tHuX6GmJc&2IJA?DU8^yDM*~!mvA9HZEJh_48G}ppi3hPr?Kgg3Y z8yFd}*34{pAa$OU^=h7JDow$sG0*#3u5G}VFv|_)m*B^xNgBb5wstl%^IbAHjb%30 ztc!uw^F^{ejbH^?uj?z@vH=H#f{^p?(U zpHLdfxQ)#BF*fc$;=7T2ca3Cj#NB9H2DW1P2Bn~s+r%u9V)$TFo?J1)Vx`w6Z~clH zjUDX;9u6~vZ$;(iuB?KxI@(*IP|^fT-rbuBa)6EVom8c}(G1B$z@29}15|{vPnvCJ zW=pkcW;N&@UL2AUo4s|dwLb%^P!7m4pgYTQ;0~xNB}dL|MmfbIxdwC_iNX@N#aqwg zZ;7P0Ha~;!)|RL(tX$bX1$H435z*g3PfI5zdVx5#HNU?3)6ovP9 zu-RQ>s zMq@_TCDWqLEBSL8to>sIo3T_z+&NP|7hfw7j)+t!$nK^QD56y|TP-!XByVUZ9i3h zD^nEvSt|#EbvB(MnTn%rcRL@fY1L24WDt`yn`yL4&HFC$wBnfhPGDa!?M9LS_5{>( zu-?&Vw%zF=dot9+h7RuxPlx|3g}=l9-5 zp6rnSFY) z{XkAc{7a>`jQ)Xfl3-!!K=bubfjHQcXzlC*-T}_)J$)Y{k!JleI1@ZWI_x7V$<}!8KWV$4_NSTWec`&dj+XZn zhgzkN)Hm-(CEO|@dKLT=xPdf0NW5~)T6Y?{codM=4Cmz#1Xjx(oz1Be4#kRwmSJ9 z_LU=t@Fdr&T!p2M#I921Fwd^y8aX00ze=xOY!|k40Ha4r^~xP(m~;dPhnY{k|bNO_GFoZ`6Bb*mwP`l z{1Yvkd=|Jp_?OS+jbq+`{C7HM^WSARJv_OLE6%kH za)Gkz7!e97@93?s!$2y{l0I1qXL*CXj&WmLT8B$-&ui}L!I$(<+l&7%2IEDg#<8Pa z4HrA6-7)P4t|xu6@IKuf`jV}2KOFi@60;t@fs|U(S3!1Ud4oN9)^1&>S5Pi5kiW8s zN0>$RzbNXgk|ZsUGc=Pd!xw?ZQwGSe;~an^EUN}$tsA&Yi)7t#PE)psKLo#!tS5o%`t7NQIdJwLCGfny{jyH9k;ZA}l%bXJ=XNpQCwa)>8~( zWUpU)$67Z}8lV5jYuVm#PllaJ$}vFS;~TkKWJ|WUt-s+iV0}z8REnSWw)MEInTq4U zXSYk#X*>)^oPWBat-K^NPZRtctMd?_>1f)#Lyn&&5n?UKRpFc9OLj{6GxT9*JI6=e z!)p}#$$!r96f(-@?FQhj;1HR6#v9^^vvhg}dR+w-+e0;&w71< zA$=Wn-QQ}euG{mdYd@A6XT8CXbsju&@Ee1)Lu3DC+(TBKWg?ESp3B#``JMcJmgpvT zalQ?N1l8tlg@dA#e3RY${k@} zS3BKpG?yB`;Y1J}&%gc`?G^jwmEUk8*PM&s!+m^SS{DB1ZQzN*oGgF%VyWWe2PFG9 zdMDI;)>Ex!#o~if{X8Q*#(4e+8zz0uqwa6&2QbyqTUTbCN5y4*nU8lJk`w0{z9H6^ z2dG*nw7ydD0xEHq5<1W69Y7c9ae?_P(R@_PS(I>@cmeTf6VcJA=Z}*=%Ki(uXm#d~ z^&>~6R1WtJ3APC7Z9zKaE$N)2Ck?|%6}gXL-ftpfa=cY--SH0MlC?6Ik+Lj@6wF`8 zZsE4B!VM%Rhr1F}&=I01vOjK1)r;IPr5aCcPO7mUX5`897rjBAWJ}GL+?=rJy!C}; z{6+T8S#6xI@WAw_HB|Oq^tSQ@SjIMEB)0}%Dk0@AVV-Kix`{Kv@LKZUORU%NogJ03 zESVSisEf?HL{KuUQomw6D+D){6PJi#uHglU>jLnNM=D=tYm#Ov3*mYjSw&vF%&g)v z^LD7TMdfXod6_MxzgdUjx!w<~sU)W_<6?yI+Qjt|yo=Pnf_RqYP%F%*ft$&oE6lnf zPdJ`mqfQ+U8C50a3dxfFn!^RI&!?Y|b631=Jh>+R02SSx&8aR;ui|60$%GW;cnAMN zhF$e`^zY}0ya(<2(DU6_nN-6Z`aKQ?L$}uvziZ4v=|de}9_>%i_^qyVx<+vQTRMCx zuDlF?O%krLoM*Oja0<9Tcu#%VdyV!-wRU(o^7<-Vh?Ksr+riQfK1UR{g2Sa7*yI2D zBNgq7d!aJ%I$amt&Ebo2Jqq)Fvi~~!xE%9+C6)HUd}DK|kV}$AJmZ+pw&+%p9=Z6K z=W}osRLY|Abt{>c%LL$W>S6e}ADPXq~_~GB?P^5Nm3ElSywYy>2kC zW_NYupCRo!;L*YMGVKNd&h|RIAo6+{aC{1V+QB<;Qm>A7cb3XG*_>zDM&bYx zgW<8#_a;kAf;pcJ)EL`bUYY@I4K&GeMxJ7^Xnfc#-Z2vH?DWSh>uUgy- z5`k;r(h~bSaSyT_Xi|a)zqolfO4j^ND#e;FJxGFgG4C(8!5%;B)!yI)@Xvju?H{-v zV7^?X(l6nIB>oS~BP=1G1+N1CHGm(7W}_Bl&J=?erPh>Jq~M>d4vFSX1Z*cwS~*yr z`jb6JsLef}qR|r`D--|3`5415;>~0}+C5Y<|76n4vk+W|=?3X}DS4ZmNwQkkp{{4T zkL9V`#L<=CRGitzH!8}fU{9nqsRvkJL^?A<_Nlqm*^)T^4PG-!%H+{Y@z&J$>801; zE8mgsaCh22_z-x2Ov+=D$^8db^Rbed$4x}I#rGUYPk&cGl=6S+3(}U?`TX8T((5nc zo?^aVGW*gpQ*qKi%*!GZC_kg(PBryku+{^5L#cj;L6BilR}r;tF9Yu2VtfN<5M+UM zJNc|Ex}(~*uI0NDEf*B06>^@sD^~4Tsecy{zakD+5pB>|8FH8OiZ1NnT*Ff(^{!4D z_nr6dchW<>vF4}4^6v5is6)SGysUz{q}|_4>&XQjjX3hZCOWGU<&(dOVXk?iCo&z4 zho;E)aCe09RQQYV=2Ge&9{L*|iFyinqIA1QtRf3I>N;tvN=un^k60x>aC~`{O8*AW zkR$id4!345Gwo?o@jeNfU?Ojj6#78v`YegMk9oY+nL=*Og+C^38^-6@d1M?%9`{v_&0FPX`wz|FtX@=P>PEcXt8Ode68IXW~&lvTXxzGUzjJ( zTK``Y{{0&%S-|J>gjt0raBwpYp4cQ&1$ z9{}rRL22<8^fmJMM>y&EA6hwHTgh8E1${j8vPwUOuY*4;n+xK3wqbn~+YVe%iWI^+ z&ti3io(P~p;ll4uwsNOhi}qpd!#YYPDUPwA#G|bbqNmESLcZqi9J4-(z)(DVLaG+_ zHS&mA^eJwl@B^;4jEEg>iIdNVxi{g5?nYTto z?@IUqsbW6f_v+&KxSba1s@`3mF6QGMOv9y7&{Jn0`K%ZsDb}LV;9lVIl2Odp#FJ)q zHY8k`;9qj3q@RyFP7Bv^GBkh+R^F7S{Rm7_Nyo>R@MScW?)g(D_#q!{_6@MtmAbv` z_474wM_H|_s_>+WuT+>t{gSAG+STxG&g~W)0Onlcw(6BJy5wTAF3%waARG zFz+oJi<4ft=6gSao&zoXVJP;Z5Y767*4cDW^sA zFh2+mk!>Y>H9gt3m8`&taCCLPQC@DA@P)V&&Bv1X*Z}ibX;9Kv#m)?=OIV$2a#E3= zC4KeWaaLpdt_&_Z)g=>4`f6~;#hp?kPe9kr4`&SBrCi{{O#|e5NnfBR!@i~a3*Fq! zA1KvI`RaN?Eypf!rg(=iKNuvvO8IKIbItxR9xdQIqvg|5zS?eoi%vur(v-)*kI6Pv z+?m#aUsdJygm@N_KTG+lyOT|15pG^VWVi&ErlV3VIA`e6`S{XT29_q2eukf?N}U{C zvaqzTwkOC2(_Byq%F!uuTzQv0)=tf$1Ztcr z>%nE6#*72%Gr`B?Qdt7)XI_*>A_j>`QpMj_!xLo6yBji*5_5i$zlO?T3(PQd$6X9oCF+2%nzG~5{~ zq2M3E&&d^!FT?`Afh_(U^*a34moM1<^jVLidU{JeEiaT~Gz67)dZ#1ZI|r2(GO?Vm zo*C<3?rP>7J}=*uV?^b&ajMgezdqQGkiW_i?BsS1-as;Gz`fF_JaI}i=@S7wWX6}p zSLK!RzFM9P<70W@;vQlB=69J@o-Ph6o*^B+_KqAaPuruck?YI5Tu+lJ!^N)x z=CNk(Vg0{Kt=o!9#|pkWujSaF3MReB;?eSwt^SwCk=SV-4;=R9D9z)<_KxS*fl;)+ zalj+n=dh*Auzh>*!=z7W>lmMd>V!B>4ppGr15D%hASPfwdVYFEUo}sf(VuzC>o`uY zsVkusb!dk;9eJY;dqJ!}msi1_Y`dWOFKrK{;_a6u>7mlH68#^Q-~{~`Vn2Z= z$dF28XT$^tcfne(O8d+FN_45~QwQs`_XT)KCpl4x7$jL@48~k9>YGdP02-V0g=4N0 zr_Pd}NO%C_D(^D~uc=1Q5u0FnCxA6E#H_!=m9BiFoO}~NcIBDl9qInYw5hjTQtNDU zr5M(F@ASC@S7!V~n}{x|EfINM`Y28v?^HRL+2$Z3pUd>hc#>iwAJU#Bh`cD7iqow1 z9m(1dJ}Mw3su03#>(l7c9OJ0Ap0ugrtL};D;N-U%QH@v2zsmT2Rf68ad4@UFyH)hW>e_6hd7xB5^vRb}z_o9MJDkQuu(0ZWuyRat@JOx=xT z6I6cuNa_drct&F?4N2dIm=}>jfxf!_mKI}(dKqXFnH|WQnqjUKrJ)xPX)h-O$66MKibW)~eQ9P5*pM17_ij1m8Vpt#TLFFeZm@l%b z8eJW2GUJiZN7mwp91k>15962_+iy?^7NP_77n?*kj)uHE3Ah5ivG_ zWtpGC$GR5PliEQ{CkYnHQH1hal&*X&F9&f5NH<=Xc~LhPt5?a4ARLM`hYI272k?7q zWPgyavOB~0FYqAvyK*~-eM_Xte8oU0LSD|=D2-~+-~KjkY7riN2%fxM2G*e3c;jJ2 zxehWLcF6o1zN(%OlmFP_b85F7RGm~yr@pwa_q9KMCq--ef;=%c0QLM*n6h=Rgw@oQ zW|Gq_E^PI@zvBmat0p?xi4H%HKe`Jzv`GN-xvUH^I}SYb{^3vd)*KHvEEg0!j4 z1mQB35bD&k;L*!6v^MKwf;FcF5<97P*>(ApN)FTO45b;!tY>(VxG z&F$a+lDs;sKVfFS5t-8Pp3*3o{dKJ2_c7O(FZ#(4#VLk$Wb0Gh_ho4?zQmb$5`d!`dVF>vH_g9^qK0ku5#Jv&%}S5QadOnfueA*(l|@B|Zcn z1I(HKV80am39>!}U$U&T)!ZN4LN11|poW=xf2_X-KOsT&5RWvG^=xClBL!|$k>2&_ zj6CB*QK^D?S~ZzbkMWW^%yCk$_*=mb2g%`j?6l%62YRwGxeG5YMd}mY#Nm$lJ_4iX z?84H%J`qST^_f_Yr`AsLL4EShf0Se0*jlu=fuzCR5ym@EsctKV%MHXm;pR(E#Lp9$ zEuqq|0X)sjpM>ot>H4l~L4QNub#n+2^Wz^5Lk#h}5>m=*c z6LixV_`P=gd?r&vuE~FZyl&Qi?I4j2Iehw!cI5Z7Z>xb;R!5oCP>*WnW=&e9Gyh*t z$+zgZ<4tD?L;HDx5G{8b;!dn})G1ok6!Z1nqXkk`XoZ%A9`QTG-4bCS&y^=d%&MdP-AM1GQ5{si-PC8ATKngOEQc% z!#o_m@Fkhrn33QzFZEiv7T%ogEk87-!&8hujcs!RR8)#QP7fx(@5E*X^2PbcEA1X< zfP}s4;ATufZ;Y&boDPhb;g~liVr{6jK0hQ%ok8z7cqS3p zh50MeFqDjsu{sy?#PN4NswV?NnIl8SIMzoIuZMM@%nBtgkv3WBGgLimJ}JjTX@8<= zk7wEQ!^2JQO1UQRZ1Y^N<}}ZCj*)InIGg60>l?UHcvHV4?>C_{;w(4xd7=K1!6@0- zgcJyP&+(-%eOdxMPOdBV|G>cm!ESJ()M-jjM;Pt^R+0JB<)x-1WVngH1uq6qogq`y zKF#d)i9m7qhS`$Ql<{M2F@ z)Qr7LxY<8|H-P7)ND}t$blYF%)MHMitIEj_&1hAsx!IhMJx$1-l>*JlffS3R?wB=` zW=NanIGJN2dJ(?>>n)q)t>&B;{LLA?{MWnXK9by=w&q$}b=Rp+ShsDJpOA4!T7>oW zyyxMSr9=x>=4eyVzi8>qM{h{07PK_oF0LDqE_J|bcFK?zL^#1zTCqwDA`6b~mIW=C z$FeMvwK!m8!Q04b%-zwJVu46>qtfzHsU@!G+MXq&7smzmGyUXAFb|iUu%G7oD3(xe zJ|iPrlD|0?uNJ82{eJ^l(UQPq+Z|U1BTt_@eR4(4v?Kz4@lMiwi22)?@4qeqtym^p z7T+Y8AEl#oYvrpmCc_f@E~q`F>&>wLoprC#6mr)!YVgp3eFqJFMbC!eR;?aY=2OL| zw;tJF$DXalL;K+|{bC=!)sgbF)2vLspqE1R|9td?+`=`S9nGl0@7TRiau>(EGE+eY z%^D(}FhUt+ZnkFg{RT?SBqGdLy-}u#t2cT^_AU-tc-r85GP)3){{CGAdAGP+C zFBH?&`Iq|+tyTS32K5^;+~vnN9~zx%?JHL((Tt=dzl>EV)cLGYp?Ln|S+9>jC$`Va zs*~urh7TC#dgkuKTD9^YyuL<-a;f*Om)qE^h|Mm##ufjYQ#wgopRanMd3OzOdv6Ud417(xsYh8RPFA;pkk$T1WcN(>c-8bgDj#n55sF$@?+3=`%Ih8e?xIg4S% zoWrnT*fAU!P7D`@8*?7RgW<*SVfZlu7(vVhj1Wc`BZ3jdT&x$HG()d?u(VJgdv`SCwl4k7j_{BxUFe-e0E3@V5YioY(_l@7Of4@2)Z)RM-vD~A^ zau#dW-R!k4K03ORwroMf^C4172K!-MZ{JkzD^Dzaqm+Qp)0LQ ztl6BXXsCHG^4rf}O%eB_4m)+b&Z?1-WDTB+9A9kCbgQf67kuHHBb?SxAS-_Hood|u z3w|8MV!ro8=<_CpkM>_V|9)t>=+#ocfw7qR9vOe>$y{z*!pldYFOShd$I}V4-&(hL z1dRd)ZVvs@j43jBKVW%Z^jIe_=#oCcJ0Y_Z$H41{56Hhc_UM-B){EX2aOAHIV&#{~ z{>t@5uY$WpRj`v0MOvfY&_2PE&Xm>XyTg3>r$%RtFS6yc5xqKw&~(zM@6lT~wuBw^ z7TKsKz0liu8a*;0@2-pOp!@VK`{b6zI~C%dM8`yG1XDk@`ji+`@5^rfbfv4y@u=?N z{kBx?6v_MRRj!X?zxnkXMwvx$ze#9uB$v4J(3Gv??ln!pvUg%{oCRo4nGx)_X)=DC z56rURPkDQ4EdjBV?ZssmNb|g9DXD*=Yf9-QeHOi8nQ!y6NHfN7i?2w~T^t|OV$252 z)@qbZ$1Zd93Z-T^qppiN?psx#5sQ5m!Sw5HOYwx`QeRZ{`-U)gl}7*STm=OmvoR81 z%Bi}(KBW+MDvRAu@@TSpQjhg1>8rGJtLMK*8Bf<1NQqkXrW1-n!fDP(%4i-3wSpKi z#K{Aa?!vY&bepP~LQ#U1==I0=42)-3&aEF2Ja@BcaswJA_?}+mSQE_5XhidBEM>GYbr1>@`)x>8!&wX<{Ric*l&IFyN?P0tpf9-{) zRa0tmw*^t)MQ%;o8iwaz_^A40^To2u?mZ|%X)oN<5LybMZYr z^4aSarACzKhzI!JR85l0%<$k^>N&Vr&W>JDEcR6Zs@GbconF1% zDXN27h+LGsgGbBk<9sWrq(PoXy;v&h_AQ$NS@%~nBJ>ur(Mimz4CZb*sw*aO7M~2c z3@2pte`|BIrbH@_b(O?alcI&)LwJUX-(n8K@n6{A{_SS|Cbw+Fh9R=NH)n~lo=*Na zx$X*!ey!Q1nQy+AjdI>=FBq|$(;-nylfQTBSTLJ*w)aWH&^!E`Y5u0C_lKnXBQWYQ z0T0K-65Y>a9Ses(K84Rv9Z|ku{aQUupuSTli{&XjXT8vu;6f7N+Ta96bhh~;*PLrN z)H8BQhai^UmmTz+9^!^p|KPJStj+iX$Ylt=M~Bw$qc-I zXPA3*c6rYxjr{jlN)_~$=QY%Bc2gX?E9^V{ ze!GWP9w*<)$F?Q+mCs#4$aesi7>gPa<0O2l(tAWm=?Y5!R7b<`#6Qg4k~T7?M}NIy|Bn~|3;9Xs@3D9CV~w- z{Ij~%{0FSnuiB>Ei2b`Q@SfUoABGNzN;&iQDq7UOPfXcXvFQ|G@EKrc$0B80Uf#wo z9%WNDzRzyAwl+2U(NUs5@$k7(Zo4ctD8&C|PSa~?^mtP0{5)y6fCC0ijc!zt-#^Oz z?#JQuGGJ_FJGA*l3n6iPGj_Syj9owdVSdv@ujZx8_FvU5$h^7xR(o`lB+G37$4VOB z3pS#xm=Vt*(>3oRwksc~a>OJ)-pbe%Ay|u(3Y-~c8WKGc6BNxppUp*7s8jphzw^E6 z(f~D!on;Q%+~HA720C1CzpeI}Z^SqOgH9&5Bg)uaN@Zwy&sfwn*qSIKv(fkF zvw(H(E2pv@uPY(#XAb&(OEXh-*4i!1XtRY}@f!wC=qJWZ_!&rjv%|?Rmpiv_9qo`V z6CF~m&7XXyY#3=Djn&l6(+{sJkn60heR{vW{q8RVpMlX^Yn}B>Rs!h!sjsAD9j`@$ z-cDBy-T!c>>a2XXqu@`z1zEDDAKUKKJrz}LCxsmZYIS?5$5-!Zthx3iUc4DkCAWun z^N>#Q-6nFAX|p@RGdqRSyz7q%R5{JDj1buow`0#>Em(Ihp@;*-5;~ zX1jNc+R*c5>F)=-M2apEb7&|7v5X-F!3ysunVQdGVs9syN&+D;K5xrc*IUm~>#%f>Am2 zJgdrmIZN>(QzBlIFD5w!6PsV-jg^d+g=Jpu4}II(J1<-Ae$2$|K~gP9@c|Ka@BUkL zbW4+`Dn`i8!l{OFRa!r_yQwFf zwo$gp27&%7Q+fupgn<@6w~ULEGCbH#39Pnas=+F_R}-;$KSyxjbBM1pyFdy#@_opxyNt545Ygt#d+!>Lc<`oGz0m6Wn_Z6I_p9`f z3Lm4!e(0kdtb5(-e?FtK4C3PEDwkj$dQiUsy}x`rIoadFRsDyfLN}BP3bb6?TS9s~ zE}oYhzQ^f3!}1u*FufwWxuPHIureWZOCfdn_ScqB6UrQmrUSyyNBo6R_egxwU#T~d z_)nek7A36jO}zChtVFvU&Ctr-^+Ue-8C7N}ldaEF*LQr43h1jUjV@vW$=+2oN5OI= z8%E}}Ulicr@_JL3@& z6~1g0%jc8TjNNX2W!-{o0Iz{43N@M2U9oc}wmgY5PqD9dgxbQ>iOAGwc;|o@bHiUW7p%h;;sn+ zVa;&_?{LG7D36Ob4fx`_&A!*???gE5529;zRx~-NfhRv)Gym+pI8mC(5*gSEjmH0UOOpl{Ou^F zH;C39QYPsVrBYuEWe?ojy*GR>e=_EA)6OXsR7`kgy|~+}>FMqzNM8RjvS&6UP5u;L?K>(}%3VczB_op$ zA5AktSIUS?lmzqZpU{k}f7eh>F?zp4c)5|1Xx8!>(= zUSL15_V{{_zF<1T=t#n5^p+YMIS;pfX`|=uaN+Ax;=07)^0#z&Y=XxXVp&FY{YA2m zNvuC!x`lbHO*_g=k7T0|_tvBBrQA5DoEmfa_Bl7l-xdOAb5aOz8w6y>y!Nnv6j0I4 zbe5Tmdyv=0>ESciv(^4j#4cX^%*Z#@x=~R1bMefZ&A_M%$tx5*XQ=Lqc-!7~{Af9f zsbRVH-kzOS+5X`jyzw1<>&B@<@r`n{yhpbvS!5vIiwI!@c5|_yTeVWkX+^2Z{b_?r zJmgybAEu);liNA7=QMt%=qr$MKK0Hv$G=MR{EKm~7E`m-Q29Nhn2^AHYL-Sns!HpS z1)K0ZQ3LL^nH%;AQTrpZPW!iJpcj1EqURg?E*Iew=Ir-63<|%Y{wO%BbY&RYK_i+q zX7AKA-j}YgioC@tY8g>-5-E9kH*uAojl;NNqff5bb&!u$A=yRq#U1XKbw%3J@^8pk zkL2!1$QxLm@C+6vtzK%N;qoas^R8s*_F~Y~t>jLRE>W`k8!102g7Kb&_Y{raGQH0% z{7691-$MVX_4$J8#yoZ<+Z4 z-o;LX7s$_e{@WktnLiC5iQE~bu9FN3zR=3?`(2Yw4N2CGP=zlS)!cc$Z6!*mjG&ik zw?r(h?M3Q9iAYJ5QYZ@Z7l9W)&o^Iqg+wAf_XbqJyP%PYNZQ7YAqj6+H+GTnme ztWTsDvg`$;-ur<$ZcCW}rdJ*l$1CBuH*eX9#I5=!zYikMTxHPgmGY96`gFx-B3j$1CjP(gbP$Z50u zY)YT$d0vzp{Ftq$GD!(`SN8^RH*yz$R+*8go{nT&$_;Xh!7maN*K`cN_w3?>?@t;x zq))3{4j9?}@^!GT@_J%IaNdOSc|D6;!AvstWeGJuBaHY7e4pU4{JPm8WJ0K^9LDgyFRhzja8 z`th8x{;%X`?E9s6=RQ%s$e(xG{4L0QethnGUPE5!!m>>@Q;Wu(s0Fqy`I3Y;S6Agc z?2^iB(}(LVEbG1`h-PH!Vd-dLUIyZ**8rhd7y`>Jafx|KeT82E`!{`Utk|IA3I zd$uI;vkN(7my2(n7IV`qOPx``AnA@?tKUuf%=HZ})<#QirStagbIuPVQ{0zYUEpHX z1H~#u(N$RXk78|Wvskh>ckjCZ^)@ik+N2L_o=UJ*QN@ z=_M0hUG+akPkex$(?qQ|`jm3HxNjbqPLQ@^t~4k>^2K}cX!hS@S4Ng7e`QMs&n{%& zs=)jH{ni+ZM37ubDpLxnP!OT;jUXpDb2V^BQ4Pd9AUskED=r)#b4=wNdhnXvX~2ae z_5PElp?OFbQApnUZ7xM)5zVX^-81m9E{Ko&=3sVws;JLXt3nbVj`i6r^=C74;pi(l zVIc&Am|T4OuQs;N-0WVyqtJRO7}!PSZHTguFB4nFU-MtRH~H`#w{5ALVW;vlV(NpL zT#oJ1l8yZ_D(p_X_XQ-6yH~IjbG&_AJC~p3A$#ku814N8mZI*D`%UQH%ld1jZ1cCy zNCsBkr}JE8-ny}F(p9Tn!KbV-eh48NmZjW?4}$8awTb$(T!a<~m47FU{8gZO-AZJU zyIg~;U+^`b)s^R8aQo=TW}XW5xH@QvtAtH26-Sed<{Zgm_e&B|Z`|m*`%yF9q%~wD z*f4yQr#{2*=>2suNg!<+ z@5MRRx|f|dNAwlAnRNn-<+^%3dgp3-)~kj&$>$b-DJqT<@8@okec$k&{=wl=xjiD~ zo@Bcmpj(_f?Hry{$(%F z|CEh?*^PhM3-mu_<6m~;U-kn1Ur!b01r{1ssE~Ep#Km1)c?kff7uK4|I=>!KYM}xS1yhJ#AKlVl}qD)cH>|60{#Er)%TYd z=>PBy{vS(*{D0^MhYIW^XwmqVN@=0aMIP>HQzkSdGv|I$)0fI(2VD>OLwRXP8d+bd z@YuVLjZk*=H+vNYB#U{k>Ww-sUZXgi_CMu8e^!*oo@gvh^yMAvH21}Thxs=6hNPnM|9ohp5`~DuEvzEfnAjn%b`Be$*j? zMl^unno@npKkPr0|H45PJ*Y7L@^0EoM&iinE1x)0t0e``sM~+GYBCbn%xdzbCpT+~ zM4miDAp%Ku&`hbKr`)wO&-sU@`7S>Ho`184Y6kBw2ZkypHDn%7VNB;vuNYY?uNhod zh_B$-*>0?UBj1a@98=J6TBQ9>!tmkJi|Mx-1N$DAG$TBheRVPS_3|>7XPEO*wi>hM z5nmZ^xLJNyrJX~ZRrH$w>+zQeJc!&)@rkmsLv!EdW|*X?BT$_*z4raNI{XzA*~rGI z9>G*o^XZ-bJCVxEA~bE-hulgW_U;PKOpz&Zf$0Isq~2fkB=Q4w2p0=b_<M`!uqQAqo`Q)ms9N^LcIa``nYD1SEyoJ*+Spx9o`@0zfP zK#!l?i5qTRVqWCp79jZ0vi0)!FT3Q^ClkLe5i`G#dqwIV_T7g?vR2`oMk&k96meZ< z(|4M9b%Cp|Tx6h+R%2s_h@Z;=m9SfFaAGjKn!!=62%2Zs;q+9_RnJCmB^b46Uk-2V zI|L8f!Q*wmmrs7@X!6Yj&{1Y#D$LP3ibPyryV74M5A;;X8YV?r%4~X$Q#YA-b!1{V z%#6GCe)=0$MozoktHo3C(zuc)R^7+j_=RdYo|#r5gf?IIBe6r=?O*ga$!n_aM$)J_ zlFuFQpDxH#(BynSw zFeTXQ<$u%DAP)yUa#yoiML6t~yQv+hBSArb%fivh2L=l}nGE4dH+Oc|zUGYtau#?^ z8_GG+Ja-W~Vvm1BYI@@|KW*c>syu_oa>qLpjfHEScpi>4_w96vm#&VhH8XgWPz;twxXIM8t}Z|0#&ns}LR(6VlrlnHON(D%2mCzu^o7dcb)0lUHUl+hnM5o&$ zZ0)M8eFZJ6EZuHXcBRmgYmhvD=;5g-DI~<&rZq33VD7QR_aM94n)}{^>c9=L!LI%( z%owUvTMmQNbzM-^>gKWGLGN}%bh2g$kWIEQWcUYM@VU`dVje%3={w<^$ z&utd72bt!VEY1Gh`Oa!k(q5NiPwRAyn<8i%KD0U%P>H<+`G3D_K-nGs z>2c%q3E@e2*X`|F^|F<$y7p^ym_lymM5mh~KaP*m7{)4of7#7FByQu0=X~D+{q@_U zOWb)UZIjx-s-D^J%^Mf5e(HRfa0Ly1j=Viydarh3U6b~9V*php2DzEv%cHIA&YUTt z;+T;dxIyRmfYybargw$Htn}(azM?|4*{_Uc-$}-g6ETvZ82Hy7x3pZuxwAw zElhIPsBkT@a_wak+`t&Y3F-vD-2MG~BsU3}K~;x;egn;?tL9IqnTxzXI?V=!9N(fr z)_03cw*PonE2vm{f28fgcm6na_gue65%99NTXhKZi^cM-9-8UY;??72NR>Ah{ zsjG|>dEL79t}w@y7wDxkkufS>EP4;b)RJN-^~PEU4_>nqFu6Arla7`Y7dKyjCSO~T zvXb2%IWBiLzxBknRN4anhIhnu<@hhcJql!931(F&hYKaq^E(eBDqw#H;h*j> z8~AMzHu=MKRa&Hx$JAI4hG2*CehZF@51)UuP;eBzYMk{9xGs6)sOK!puAhTGjkI~4 z#`bxq#gQfo>a4h#C#>(XXdg&aeoQRGNW2h!>pJs`rcieC!D)AjG<7vkrYnysEx3SY9D1jXkcaCM36PRg?4B zqRcXQekyc2;y$DKau(rC`Z)IFuy4KSh4ra#>Kx>Ut2?gbkv78SA6%91N)E?$P?lW} zcmD6%=RCl_BKhk_<6}H-z9{XN&#m}5XA0Bnv>0SsQhuD?!+IdXW1Gz8E){MCl@G_M zZb+q`f`5vG$O=V$wkk)6!B25B;irFlEVIv8p+gq*Iw_19?z`#|eE2xdD-+!K@su-H z@5)XlKjT7}c%uvSIhvVv!LrUNh9$aD*@l?Z=6R5ZZ``RcvPzmNw`^Ca}m6qtAO&#_xGy5P(CK{ zNB4m8GEmm*5hZKY7-0Juo<4yO*@O!|d*1esmsblmWQL&ze_PZ@?py+|@xC&5+WIX9 z_@NS<;!UGIR8;PFFD)j-^h0!!ENV0RJK2n&ch_I zUfHf6XA=p9&c31?LrCsRxjBX2JTEcg-yh?WP%inP?+H1*hFU?;RXP6Liv81?V}Vgo zcy1D4NP;2Ni05`mkpLZOWUUYWg;FT*qN3F#DN}7}5|6?a=MPO)L`H{qBd=no z$VeWUmJg@Cf0hoP)sR3x>{%4c)LYv6v?z4wce`R8gPn{_^w;F`4{5pU`Tj(Fa#~08 zYJ-!P^W~wk`aINFZhgy==>qCxE`##YIWnUJ62E%~0onx*#izQ@P*Y#}82tX+kD#wB zT-tfk^G(WhA`_=f-h^JMH)gvB1-;B9yu0gk$4g%5C(_gaYZo*X8rAA~sj<~ly3`ge z=k7VJ`CuOTS<%nQPUA(9^Zl~bWUHuoWhL_is=rH^#Df9#b()_?2dMd zvw_RCo7?5|gcMB1h?DJu^h3IhN7g@`o6$8YFMhA_J;qLKbCM6(^m;64(3sXc=JMLn z4M@gam!9hTcGO|du-}&(8FlW;9lOJn^IwiW-#+Jifd>EU&Vy~_yf=089l5~9we9lp zD!ts}s1IkKbF!H|vTLhpd^UOeEYZ*4BrJHR9mb&Ys^Y$@%3= zaALiBCQi5gwLGuN_k$trR6U)LD9=3L+@m*(=6U*Y&En6K;QPx ztUZ5Ycl6$6fO9VX(9Y#?9 za49RF`?q9~G~spD*x!63K1*%gW#ewbKQq;?Ob$4n9JXa}l(zk5RtQI8+pdMx=k~RK zN%mkw6K1?!8Gb7(qckRVy&)vgm;Ti5;3E3b+(EILh0`8wTXWkP3$>jaDK6zS=A0(N zb&Nr2a%_@SkKC{~ zqtof)o|9-qi*w4?160r_P3Kcw14XI!bOj+i;+xf*l!1aXCR`iCJB##jrMH>B+86yXY4Mv}N26=oR)7WLe}6M;r}*9P`qMOy0G- z6dCNxLGX^d?(%o$!pj#E>38*NWNH}6w#%r0=qaLQW)a8gED{dxeS>t)@88xGa)yYF zO1v-5ZA_tm#*YdzIcA-GX_Q0Vp+ant5-);BCwib<}+FKNAWQ{`K>DD}D)9-J!k zvX4bar0(}7^gIpkhzjjFd#*3cfw@IyswbJgSkr;2&&g5cLQ+g0mGE6M>C_G53aM7w zXE$5oD4#Md?tNK?`rIf^r|F|! z>65)*O_t8sF4||@lmw%J1-a%7PNZTjD4Lx6I%vwf`buKU6vo}DTlw3i>`xhK4$u5} z%bC!U_jCl0#C<8Q(7~Tv=iU47-oJWeHyr}6S6)3ZAji9LYX0)<649XMkxDb($104w zIDJ1qr?I=%H#}K>A)T*e&tsP!U3}}jw%Nf-Jzjmi&d*sxqEjcToZhlGwsCazym<== zmC>pJnz}3R$Wg*F#W!HMmMQqa<%5EI5BAaL*R1+d-Ht5dxxZNo(oXqt!=CG zW?IyhPjl;Ud|J!GH;5;FnG};x@V;(;Uq>(@CpazRwYT||Wloy9V_TwFmCN;)yY|2R zIHF+nD;J6@8$69S=rOEb^C);UGQZZ1Cy0YhULGC6Uwr7UW=+L*ohL+ufvqmUkb!Of z`+Mr{0t-xf`Xl?aKGipkCtB}ohnH7#7fVa+Gc_3uzt~?yrRd2DAM13!%-Fq}9-O_r z`NnRePj7RD4S7~PX$v2vNhHR)^F)Tj;|1kvX|6Md=8UQmv*HH@KKr+qsTHJec$XOZ zb$Y9!Nko0eUka6LT%C<%V&odUqC{uIp*i{~)5|PZd%4Qmsa4#;Nb%{rLdnxx_amJe zc3%lmUG%U#XGZiIvxwg#r0SMM+Wjn8;0>Mc+q$fD`I-uO7S$m^nZu3?7m}+MxlqZk z!s9!P=LnK6)c4=Sn96LP)SOUVh>Yv&%G~k4A&aj35wqN6c(Aa1&1>iRhxb|Md8IGk z>3tO4gJ&+9M!DvBM$9TXphrWsYj zm|4k^(B>Ww1PE;P2X5cW`7}oeb&>OkRfg>mE$g3WJ6k6q6tz{`JAXHoLoL?(+}hRT zt*iT5OKQSb~jLaleQzV1Aw!QQ9?2O=%sa zo^RT{%q|9=bdN>PEUUcxl)*dvU_>j=oqth~z4d`U6`!{I+hXD3jM;|%yp9L{@3PlI zD?*EW#U2J8sxy>TXnzx##s+{<}pXt5j7)QeZH82zngb;G>CwF#eI%Y^cZi{S}@gW-LZh`gzz z&vD7t51(MeMX0Vj`}+N zet<$fay%LeQObO;Bd_@8e(Qr%353zqd$sivh$OV`ZdoKcrI=#yp?dAJCr<=>KQ5X? z>VJKv5?nj|?3sC%!?5>add5!rS7o&?MHg@8^3x7dUE`O#-ASNyq@5tcetVhU<+bMe zW@xQwa2UVkxMzlB=I88t7N0}#qgE9g*()N9*SXG`niEACvDAiM`Hjh5HrA}Zx0bdR z8ocq<37ym_I=^%7he{fMLy6!G(y57d&UY5AacZ=WvTStCdpM2f8j8>=`ib!tKAh77rv6EEHTy)s+%t9+VeYV{quukjKC|9bPM3g**Q6>|HGI)Sy$ zHLRpH_2Ppy*BX~%YD)s&_H*T$R6nPuA5{=CI;$*8(3-Qd&y=ZT^DQUB)6=@OOa`ID z3k7@@uCrr2`kTG5C`bMMwHr})rafFvbnyH+}rtk`q{g@N>t&K0T z6FrUeW_9V-O1gPZ(g0C0rSxNi@yiQt0!-hwrD%OOFt?I9`oGX7f#hEN}nGhJB z4-$R2`|=^>0M9*KiV6fD?K9AC)RO`pzOHEX3b0*9x<}|!1eXh> z-WA(mj{Ok#O!eoPny^FCZ%!jc4_xZ~C?+`27~Ld^Z=pBSW`b83il<$dmc`5OxtdPz zr&|dVzeDpra&3+h*{*F!OQWZ(4l!#VD6d{BOmSeWT2T)Y^XaO4gXc-h)2g5OmPh_x z@b!n9XtELEPbCt!`til`t~5$p?);pZh_4tunh3BFzb-0$x|qnb^yW%_pEFs+;+=`S z536%g-tFNx_(ap-tlO#cnQs(M!#VnjDw+Iqywzy?rO~DdT>#NfS*()^pBNR!?Zt zDICk5TzRuID`ZXhT*L9EL;7bn86+K>l;y^2;%jabA-TH?nWb_|7w%GiJ?Lnnv=ud3 zYWN}TH;!I)y7;L#g;)7(M3B8b{gh=zM#QJZw_e4hd&XjZ32)BQr!TbLXf(}jOYCnK z86G}pqi#DxL0BIs{<8RJdbNdk;#aHIRT+bWK4t&4y_yUdff`@PPrku($mnP4{2RxJ%5p%4r-<|AI)+f=( zoGpZ+-8%XL&q4)$F8=8cC+|DM=T$8{=hEDT`ckx;F8hjS83e7a0N#bKW#UFBNO#G|j9(w*+3-5X&WNaH){8h^tr z^-APH_>I7MhU-#l@ptOph6f6LzVuuKbBK>!tt2aD)7lMH*kKB-Z?n&vyL*b9?ftQd z=YhSnpbINs0z1m~B8%i?naY?^VB76Bal5|ZeGa>khMuo&9XUzW{`S3i@}J~@}99OM}lrs1c=Y0)LJ zBaJv=?%EoPRHM$8UVl*Zn^5=?o^AEj8IxQyxg!&U5JA zL6)~uo@ow1hc5i09qQQ0xKbeQ?Wd`iTHv7Zh1j%vj(gjp_law}*G}JHdO3TO?Or99 z6a$aLyPI9#A~VwZ0xl6J6Za&kH`o0fM0I!i8?{?~(*0$T5z@V|5|>$cnKfR*qA06d z$#X+@I&=Q3+Rratn&zXF{1}H{gSMs%5eYxfE7q~K7^6p$tY4nXGIWXX&1!bZ9=TXX zE0Y>c;s5xO)>o?4#r;y3ZTyoxnw-`4#wR1sf2x1f;&PKjdz)w6C*9|Hl}ZyUG1=AH zb)|{U)88#p$^LZtgYgFgNCWE&7dU-hk5wwFsT{g+56s7-y55A6cXr+1HQN1|PB(C{ z=zisDl_*&#nxT@CyY1HdxND#657x5ND!WdFI<#+yX>`<=Q$HTd`mVbk@WkF%I4R_n zgzcm@sl|;H^ZOSP@W&eGGFW`C*|nXodYf@Z4E-$TobkcKSQC!O$4KS7j`}if4-ZT( z9*+oQnD-3momT61n18f$uoQmYuM$Hcg3Qo~RlJ+~gz6Q#=HBHAUXs{CbmgNU;szr< z70Na6tFp(PQYwgITkfe_W+HvA)N+j2XpFpRTKDT}#k@r9(tg!P8rDvZBC(14YguBd zbbTb0_IZ4giO0>Km=j96Z^#VdxBnc`ltbq}kxq0}dljC?C#by8-1TsFE*^W0Mx}51 z)ypPzbRp^~`r7l=#fx;Dlc&%>?)~l(dZe+n_AGVM8|=;j=#Gg>hp*0?CHdAVV) z*mUcx^1o|A`>8zjF`QvIZFthYBM(YMKOXn6+P=NZYxDC=v%=Y~ zlUFZiKaJS--!wHIx_IGkow2C=&a7FUf@9{!Lc-^bPH7{w2#4kCh8jDYybZ!VH(8_cMT)qm)1>X0xAK*4 z;a6!CJJNno&DVZq;%&czF^w)Aku85qXA`EbKNo0b@(_#fx0hj5WPGitSIg&wFf#RX zPS8}F`7O^Ssi^Kx(v97pWLyPkJIPT9A_4^B6as;;_whr7?H)l3_9%MDm>k7~cLd!e zNAV-g+z+5ka@0j+km>>SmK-IHGt#tsspg<`h z?Q{;HBMPv54=m@W1gomSa$8E2B;Em(PKlC0+Nl6_lqeA-yV?PC3`@A)IDjOmz)og> zaiv0CLVAIn9#f(Cko|xeq(X@yOMzZ|Y5+9BmX~0V?{)y)q(+G%!!92{dDJK=yWb7A1hx z1PWikQ_&Cip+j1f3NT%X4y6J9MAM-Z!JmFQpgio#0feLnKnW;UphwAqiQDujUSu*b z`UySoryod6z!GL)Gg<}^Cj<2Z$N&bJ032+9K=R=Mq{|FU-rPTc!T|%eYhXqRAvOPq z(nAN#C@!QlP|eN)HtPq#k_F6%DPdt%^iVzviU*0{!$PlFKw$)($3lc>0nh}D8VouB z69I!gU{xm!CcxAQ3`D_{JSza~U@C+abs1R-eCvQgGLRuS2Y>-^TN?&M03@A5DI@KG z%m)}W0mm8HK$d_>Y~Zsi(2@s(XaOv=1cOYlhL;@#0%z-WcGNkf8E`q89r&JkZ~(o8 zfhO?%Hw^m0lmG`x7+LzacU~N*vq*M8CvkuvP3#>&-7v@pU>61*y9baUCy2-JKUQ#p zcrXDQvp9ig`Je#CVZfw{h3L5eaJ`I$jJZH1*a0RP2GxKWgn_gg79!yWU_u)UX>bGK z4h<|634;}NEYuAHB26rWcOC!)kWoC3l0#|&a2E#ADp;uPJSYq-bO?WD2YO|BP=ZJ$ zMV$Y4d4O$vT3D!r2WZFys+M^`X_*1#9J~OO0+XzH!HTB8SLE}eIFN{=1E_}=K4`$( zBVKUYsX)Y(_`q3a`dcuH4|N9F1n5GTHv2mo-}ykv3??8-PFh6PY8$c3E)Xk7sG06vgI4nY8z zfN57@U;sdrAUI&v*aPS_45Weiq!)n0!$4RI23~-Pf&mebc?APkkWi!$2thPht_TA= zARHnD3NHxcpaTX5AYKH*C>5kAV02)x0GJdQ?14~^!=MQSmsJF~q69SC!5|2LLJ_b$ z`U)0Wfq|Va77`K#5+G-qf5)3%62*$#6U9Q3lA!sr3uB=hFjxSBc`%r`h=oQa!QmMe z2h}SD022^af`I`50Wc5+GS8$y-o5_Tx-JFk$_}icxdiH>8u(^gdVyiJC|9$E?Yb;a>gHl^?Xkbtc7*07L z+ys`}!C=A)3+2Lq3CPUApdaXAmIpu+Oqs!853I_NN6CXTItqWzw+A6m0Ob}2MD<`m z1(;YEYyvI4Fh~ZA@fCrv60k-I1_;31g@G5?yA=j|SFz9m45Ur5khBs2RAwOfFc3Az zLiI3U2QojEz`*cbwqqvbw*RYV4GT6t<2n%JxV8H@d2Lm&pgX%J9`yD`s4h%Md z@O>Br0j3iMVPM0<%RpGu80@S9zzSI92ZLb~EL05xSFrOM45|U(Qw1O&$T-2k4k*lr zK|jzlqY4x%fmMuZ01yE)j9^d-WD;PI37CF0AZ!4@DRlt&fXzxUXae943=qJKCUwxP zqCxd-!JrhBs(=OnD?(Vv5e8JC+#hLxBqjslNf=B3z@Q00G}zr3243KHN!A2m>j%AP z2nNw>pcJ(L*jojq2m_)OEEElc{4XF^Fkt!t4ATaH?;94n3EEJ{<4D$j^D_}tC z_u$V#U$Kyc4gjJ6chgcvBewBU53J3@jPc1@0>WM^5Vj zumGkM^}tjUuq_w{6F{a8o^k~~uE9VPFz59_2krnyT+;`dUBPLNfk7AuW2-)B_e2s{ zXdMRmV2a%UO!0|>Fv1`cfcpkuN(ltN2?m>B)prB%ED2J;LUe{eW)lDnL-2yh1oog| zPz`o(Gz7h}1H|Ug5VX;1uw2my^f|r-@SZRNtx6Nf6gGy&>Y!1J}n z1S}N=SHo`;uvF>W0VH`1Xw9Dm(Ygkk@bv&{xdxQ2%wjW4VJm@%iYb^012d7Ppta@y z05^;&Sd_eog^10-6cw1#F#}9LurkT)uZ;cm2!Cq^ZZ;+qh>jUb2&9q893(^ud^R!% zLCOa~iZn-wfQbfkkd7uW@x>fGK~_Lsm@Poi_GE!54A{SeH>3rM4~W)T0K+G~01qsH z4g}D_YYB>b1=#6i2^S#%`IaCnu0Y+0CCIlK&_Zej-s{PLxoib0xF4tsgBb&`ywM7j zAs+y1R(~1EYz-DigIc>{4Q%NL6Jap015CX&N)_1z!i=>BHQfZxaLbf1*>{k1buPw>|Zy)Nh1rP9jh|KP<_v|G*kTEl05ZVr< zfkc3qf?uE|kyKziJbR!#a|Jxf?ZLjTAnuX&AWqd_>bX6N9|QwL`2tcD?6Kt!9!OVg~?AP9Ph50B}148LIUI$QlL{U{mn_ zwUI_@0_MFl2t*L5c4`-}1rrd~asjLCW=S=vufhd@jK2cJNrH&8OvqH}*} zCtwp7aQqH*&K-rKUYP$w*8$oI(0P!XJ4%Ko2q#?$cG(1qkdL8yca$u(0ZtsB5P_%# z;=eL(0wtP@f0R52lIvj0B1q>ZN`iXx^B?*hpihI53MIpI2Tpebp!R@t7WDBZFmM8= z#0k)YfKGwfZlR>9nQ%(l0DS^z8_4w*N{QMIN9O?}u7D|PsQDI3o?3eO&z8}EngP;J zAwmzJn+Rt%63|Zp9SIqFpe|9ffBGZs2Ivof7KXAsP)byPNLxU@0VG}(^vwe$PF;-? zzJ(Kh3ki7wZ%T27cmaA0i045*o+wG`J)E>Rj`oL|JVB%~afZ0#XdMXYg_5E+v;Q|k zU?m)owioc7ef1CR2c*XVy$hv!q4X&K6hRaqzW{Ow+Vn!{;7AN0KLfHJ()LDaQ7;%C z{#6Tq)0xl{ZYPYXJQd(A3q0TR0SxwMl7LOSV^hlpFJA^eGF)0h|3RDB|A5f7~E^e-sb(u*${|P zVg$k#8ukZY#y8y#U;{)z9{>H$;*dxHXey%9e{%j%0fBG?ZAct)4glRF8P^X;BoT;2 zG6W(6$_+rVfCm3pUw;<>x>PbQc@{wHFtCCfq7DRMcf~0*1~hz5enVz~;P^1%;;RVg z5kL<^#epbUDjcf|*k!;zhPDDhEpOszxRy5n9R0w;S!N;c? zN`JCD0H{1L{GeAb9p?VW%S%8v94T7p=r%|c`}IEsnhWS%Krch$A;1!%xj)kI5yAp` z2J#L;iQ&#H7LX)hj6<~{AW&w)e>Us^)EO`qq2EB3+H3WXigvL4AsFCCz&pV8Fz-Jb z)&eRHj5H|d4oaAs3P;0Mr-8u+HQoVshgW{&n#993UQ0ZV;Ljs{F z0VO-1Khhq+3OKYskHrvO0K>;;7W@VG6~fWSKET;S*e}QrG2!}0{1u=dfw2Uog@Q=+ zyZxcf!HR7_qoKEi6K4u+VFnmE zkk4IU_$E#Xe7igcv^Z397X)R&#<+xDYnulpI0jfTn5scQg^0IzbgaZSWa9hIHP7WA05a~T&2@#I|2q-w2;EUcpAZ_6J z$IHK^At?49h%7rUvhXDZE0KWSz;yq=qhTfQA+iXdTN4+;zjfb&bRvLmg#W+k&IZ!N zP+SD4S!rA{M*#)XPoUQk;OzX7g*SvXD?%g~pu!6$3!4Yi(~vd>yx>Z4^lv~lfe{E{ zFepW8O$mKwDkXn z_JQc`1G>rf-=yI!RUjvrHv4zFVVV}IzYngvWL*6C!L7msvbh8u+y~9O1DAw1z(4{p zu#j>Tc(YOAlzajd4;TneC_V}VWe+C~cMiBk@IY^)P?vB4gbQQ}kTnoZGzhjAE(dOa zGKJ+KgJ^KYRpX9!5ujqg_yl31L0y*Or1^jn_|&^YZLqW#uAR&P>IoR4&{i~xlbQ;r z1WpdzyhkDK7*NHUIB8hPG@$Q57BQd^h`RiV6x=czz%YeUV!)R9xcedmNN)m~3>t_5 zO=bnBq#jUFU>rjDvG6+@=Q`X=iNT0~6k|~mtVAqFf8E&U0aXd4;|0b4(b#ApjyMz> zR27RNrrtdB&vGc}bu4&pc;S+G0W7Zr%U2-!IBgP zKMrKJ38z^M(5-;pfxg6n1EYj9j2zHifUbpj<3R=|nEogc2Q++9`a##@K^# zoD~hIG9KI%VK}-JNW)GKLtF81_dEMX34Eu#1JaX_SOPeVnK-Li0sR`#rI2?5N|4%% z^^f!fpx{f=8>&bECn*SLpd*lmyEYy4H37VhhjB_C02&{RT}UtyY*~s^0y`c7#y)g2 z5u{ccR|v3VGobH4g^A#`Yi9K)H;aI00Uid2J(Yr{y(}p6Yv_Zt_>e^2$CFA%t1xWF~@mnLx(?9+o%rFNhlhn zq{b*EI*<<9Xt7dlHHH#%OciQ~IciF4ilPlwQe#j=DgV8^D__5_|8>3BSI>F!?6uZj zd+oLNdy-$9vWqfm3R4_tbEzKcG)Kxth4XA06rRcRtCaYR)tg({oir`1^LgHuhd)C* z(-wy=JguM)$e7PK6y;gG&oZ1kze%=#hPKB7y8uX?&y=#C14mbJwF}{m(&KZ63^sT? zY~7mH%aqRs6ziz4hrNK0I_uyKtJI#Ui!G2u^ zOk>ib&5|j={yY(qI?dO}*03&-EVvKL(P@~MYk|@YPnVy+1W#v)}3hzkz|>cey9`G3k>lx!AXm1?7U4;pyCc`NX^++pzg z@R6%y7T8niHijXS` zhZsB-Sa*=WC3FTWIH9NQI+Kq%UmE?H;n>OGNUEx^Tf5U1Iv}mUQYp{Z)T&k~)`KYacR)zrSo=U-p zFbO@4j^L>vlT#^lQ6>=vyBX{x*`12(X~zB%NLRvl;x~&a$hK_#4JeRjt#q8_3vC&0 z@TWl9vF{r5&x+Jjm7b^u4DLJN)!xI03?1gl8+6A#$}gP7%|V7)unkfwPqrMJ<*OYO zYe}F5|1+L=@t^Ih<4res5zsWAqT}Sj*o|gPkGwPqS*u^ z(Z)OiG>d1uoSn@kmTGCb8t4n2{!)Do>^u|Eu30<0d-A-(Atl^A&^}Y^+6iO!nD#ZUKsJY((PO3JgTe1yj7Oy~JX zdd(+RIcDH)pl^BV$QSb|xGBcg%}N*b4%t5+17i)=5Nhl3vXn_f+hd_pZA~{`Ql-(k z23n}pLv16IWqcZeO*B}uP3>+aYtpD^`4&Nqp6;qUyBf=8pCksy{=fE?~%9V{27aOFGCNg_A9?8Ya#AU#0j$dW<}apvFWk z87v(a`dVATSPY<<=`V>3*?m)OCNqJw@t7|^EF^xxW!z|MQYpLp^hIP~WF;599}Lio z(rOXDMA~@Y1I^%hTjCe#Ny>~~0i-ilMdmId*wH4v21pHGB1actbcp$)OGL9fO1z61 zGOVIIq}rwvnJbSjX4(r(MDN;l)<((r#mujtS)%u7YIb#5x7gRjJl_ML3uKL4U(CYJ zw`tVlggO)>EtW6?83t=I>43K-ZV3U2vj$DARv$l;nF>c*8PF8bP&bi-OE52^s%y2T z-xQu*Qhq7galtNJm?AI8qf2o;++el(bDomSc5(veZoX)o<>xxtUdmR4BpD`E4tYUbpFHpzl}wpvLnJ#bKj|dD7m!D{rRL zuH=}rcdL0kZ$PRj8`CjA*G4|g&ucIzNRj0_&sAKn=2T)q!EP_ka$mSNy}AqUP2%(! z0DZZ*v<6#}%yPxgfuELdpaPZ%{j(}st|Pd9 zX89I|(4O>w^k2shW?8Oe0hQo6BD2;}$AT?b%Ypu8^y6}Bov(p~N^j_^@f?-l?{PlW zipF0+HF&N`^!F%-)NmbG0dy0I0Qu;9Uqf%6*`XIYCxA=VmmS};PbC|D5%^!=ze%z6 zZjM$*Bi(ha>^z!RG@DSO!0qwvL7rq2sf#(Iey@A6; zc25`9`=8UW-;gdFIk-gEa$!9{odfPJNgG)Z*|yl;0saNpkxd)%GQ!+hW$da_WRtIn zH_1dkF?O+*^3Wzd71eRY^^mN4$4MEti4bNQeG;&mk|paD4mURiSWjn*<%Ysh=8ql- zuL4h#mYJkuqQQlxOp+0qOmc?7IuAd?epAvj2}+htPpWA@E*CS2Y`poShUdXqUy5Dr-ou&AbNAH|>eQzXAI>GFR!b=4Kvv5YKrzv6+-jF<8gcM){7^+Jc4I z2J68{^X;Ud zT|E!DcFzGW0A4MVw^MSmY)Gvf8rUWB<95BDtM9Te1FJi!60n0%<(i0=Uad1}(q#wk zL>pVD!Ogb!b|B(0b`K16_-LAJQ8?bxGJEz`D9e z%GjNRB-2WmW|gjnS7oijsf}E-HQaiQ+f{A=dlMVG@GRipfvY_ut+NmhG`tJ=cJO;L zG>b_~4|VB<@HSbVMFiu+{ulm0t|&XD$^XJnO872cQ*XA#q)?0=E%}r zI>-MK|60x~JGsICiuaL5Klqw?BmTv1@S?o_gRbv?iC>U;Kadi+|DrFKvp=v*vP}Fj z+~0)zBc;)9UrTRvLwC&o1KteW<`o&d8%+Fs(7W&xN2ehIvNKbf!mFq6?sEUgF)`pfTo$@9p6S#wuv?<2ek2EPPd zGk1f$xDR9U4DJtn82D3}v5$C#Sa`L=(9NTt98-}T^Jpi~E!YWCWk2ksa5w6@b?OfE zro`;`wejY(aN#<($X^;H-|XieApB()*Tt_F%){i&exe@R%7u#q>$**r&}_E1SliyJ z0PAgUiVVr-UNg73%PtSBuOODlYK1e+lq*2G$~Vbvg+0bDw2543asXNe8 zN%~R0E@5yT;Q7Fx$=)A*K5tx%%YGYJmwEdUQuQa^LdIL`(-k}uyxd6X`xAp^n9NOZ zy%F0h3xDFmF7ZWIW(AN2@q}FcNsEY?m=9c@=dgqyU^-JQD%!nOmywc3{b>M2uU1@#D*VbELb1@s}I&^lYv4@~X8(!Et zU6;)YN1FOP=yzcAMdia(mv|HZ2v~R9oAU5sn%2Pbu1iz=xu&P-{aHo;7outOtdq%% z)iUp}?*VVDk-r3f2)Ogda{MsA_ICe!p_Qb}5nph?-TUuHCzj@DgWLpZam3fWQ&xaG z%If-T0p+;&`mD952OsNU^*R2xEC%s?kp9C541TRy{Af?XTvw(U#;)SCqcZD=uZC$q z1=t&Kvg|p62T5ksRNCU+7M|c`b*S1X~23 zLs2Ws9hsZM@(i~HHy3CU&rZqB;oKW%a9`Nk#69_~)IG{cD$w<nRb+>DsT53cibOR^QtGPoD;G2rXs|1$|1XbGyt^8QXKU4O>J^w#d6 zYKvMvTPFVepRYE&1*oO(4cYm#uaP&~lKCExo|k(pmSV?{_A?Fb*3@vmt9*==QV`@y z>s9PGJio};W4>^kz=dNU0`}&xLM8sd$UWrDveOkk9w_?`X~5$O}3rr zijo7(`7CUe#GUZ9u9M%^<$nXF74G@ftvx-lKy&X+{q`Y$*E`2R8`D;EosF`R#T zV(r-^Wlj?M)DEsGKk}KbrP^Dh%Sk=+nJqQI*Ma+QmG|HWd3-KE2wbDMUACO$6=kMv zT#bP@0DmmyPx->UQI<^IfKLH;*)CD1$PYhLe*|2^)p&OLTFpH2P58;3cvdrd!wO~gQ{!yBk@0jO6jCazUZ zZvmFb)-!s#F}5=Go_Vg^Rq=G2N?nV30(t0=bUcfR7VW~7-tMrBJ9#vu!))D$Kb4p~Zc7Z+6{2Ud zo(1x89(PO0R=AQ|lWOdUO>W8dJYR@6*YFpExWQ)fs+N$Od9=^L=Din84_n#dC*KaF$_0&HsV_Tt5uK>&e5DCN4hF=!1W$-ocwT(suE-L2T|#W%26qEo~APIA(tJ2 zpr1)y2QX^cd*d zrQ>Bfxj^%CDTC_yv}PN5|1wGH_n1rn%Az|)wqC}@NOQFsDgmejMo5W#3P64rmmYzQ zdy%Q_lg{8ldH?6)J>f^dzaZoC$wohuX=E}FJSaQ!sjEp*F1;IR*9nVSMM{Y)1UThE z7cYwZD&&Vtmn$5gGR&vV7^#;>VUNlOS7^^;EMohR7yy1y_FrLZNw-mRf%WdXW0cgo zss+P*y$k*+c&fa374<+frY-7PLYqG>UtZNEV=1!<`(d?5H(xp$Ky z6Z@z;d4=?|5?R1yMBpPXd>W>n|GK{;?-gK7)W7iF@5)a2L5YT+Gya=W<`!_6sjEx? zG85#9TbQ12>|cQOh@LE;-eM7C{FjKb=g5Iun3&YiwIv6(Hj^u);$LXTS!NWPxJ{l{ zIJ$`Yr5A-&`=HGD3z59L?ptXUQHRdTvA;;Kz+x^t-{6}Pa+{(NR@{ZRFheiHF7=7T z-R9e&uEtc>%QDcuvh+4(J%Zaoe%zBl{@2w}r^xl!1uOV=}*uEsW>OZz)m7-M)k z_zU1EGWHG@=9?)aQBMQDDjV()t1M${(NvWga_ucq*A5lJ-yMe z06Y%-J1_-9VZRct%DA$e+JOhk*?Y9;DgPy+>|xVdI1%1BbLcsfj#)EpjN^FI%#xq6 z@OvzL@cU_5jxQ+Eq)!5G0=^{`ia2~@*w_bw*8*oquOhG$jJ*$7uM6Ikg+-jEUXOYI zG+s_pFSiJP>Xfo*ro0Ef3Vek$F6!`V%DmL~uMYzEmk~u_CmMW!nFz+6xw59H(=I62 zOxXk5fxTYtDV%PmB%-Y^o^Q(k6>}(-rQJ{+LSPUUE|8ClIjy_}elEO=QlX`&(gFFg znA6xBWqVgSa%d0q;)kVtafj<1E75s4S^%Cc-HPLXioYwvU)JzE37jQT+-dHOHvhet zs5@ZgW0F(c>F5nCG329Km;Vq8I^Z~C8K3GPSa9RZgn~~AT+(mt|tS#X* z4@xz4wQ(izM{=u#)5e=z(iN}AcF`7*2dP^nF+I^Tv^^?%TQXe6m2{c}#hOQ(@JM&{ zmGXT_hwp@1c`Ap3o;tV4Un&xBaTyK#Jn(smDCM;9rk8ccY=SA-z@4wim{LwNZ?=uO zhy)F00Pi*Vz7&CpFXi%I#Fo(v+UTa-DTREd$v1|tJM|p#`8kb)(oAMqHO{#F$h$Jq z4|a&Ly8%6Q-}F^}PN+B7b}sFiGpxd_ll+FRBX-I4^+5OS7_0gP>@G=hYxfiRS?6U)HG| z6mKGPG4lc;LWhrF%zf^Py5fM zi{g2ETuhT0ma{K1=GC zcj|jn4c5%iBkPkhIObn z8V3TWnSlc_yfXv$mtKLm9%JywDCos-ntY;gqQQ{}bmOC$vLTQ(jWq3nfh-ng^qkxb zB;P!?yuO6J6?XfB5*~y~fvHRd)61wk(ksZR8I)SlT`<418nvanE|Y^CzKmoluL9}) z{dUi_Ud=jV>&l$NLr$G^j7hd?DDc2^32E1Oz+pId?9zePD3N>Z~kiLv^^{BDzKvB z9&(4%#{ViFE|vim2zGX)3$G!WG~hGk>k7mvzPvl}KL_)g8CyzUlEcuw5r)4@&+s>4 zt;S7kMW#5UoXgMP4j>b}3V)reBECm-bmdo9%Qgt;8CMY2eP}mHNEbhJIO&0DI%@ z=HfY=4`<|h5fV_@sq;v#sh=n0x@-05@Q;Ph!=r$C`Xvk>+Pl{qBZdulRh^2pc>P5T zgRyh03`Z#_-C&(mJ*Q8Vd6h|kl!$1edOrQ_JKZl3s;{6>DRzsKwL~n-Aq&6*k3m z8*?Y7=zYW}2@NK_QZ165ng3?^v{_yVhMjEMrC{sD(`A_+%mNC0-yKqS)wYPNm3;~) znD$J{&3;5KOUbHOl4T+j@Mk_E8zoZVh<99(&ZKP^AN7;BsuDs!OPAPkTo^IzWLaF* zsm=M+P0&5)&SA))*X2Z2Cp^ewDtf1L3Gr1@tD4g$DCA{V{4!L%ADbD%sVXkf1CZ^-D%=2EJE{RCj9dOVO?|KLKe!!(WN2 z?zHsAn=KESEl(%N(CRb=xrYA){s2D``IfAx?lkd6Ss1l{(A)LCVjkqNPYy$?Tt z&(27r8tndwMz2Z9euRKsmse}B1*MsK5X=^+w0~D-)NuILi_x2qzD=ONE{AG34FWB> z#uN4Opwp#nO*YjegG=J*Sw!Z_<2A|9OoLZfpe@Flk7Pnks!K`-*MDu!4#4g>MZT-a zB;^^NNY%N)XMvx~*_tHAd+ucHK;XN5(~ZAf`1nK1TbCf@k2)S8`^7loK>(y8(H{RH=|EvYHiAi-z3-0QG{|kO5K;p zp4yxOa%_a+6h`eXDyK{75DdyUcZ*@@IPg9zrDKRwH7KN$8_i$9wXe^W*FtDq@@@X+ zu@Fj-m;7eR*CEVzxXITeJo+BIM5Y`JVc2Y2@DW70J~B17NKhT8hBwnDK$TP7WO5XT$dFUVk!K@FEvvr-C4+VC1;cIM4osmh){bvS0=im7085TF7-=OG=t6g>jYh2a5T!3#q}r<={9BjIL~biF-<_hGI*;!70pyezA6g^aw>e{3F+v4M19~3M45M zQ{oJMl+Gc9H_mRhPYCOh$wScMvMopx3M|r5mzd5{$2R{O!Qo z)sfB(X|+5y>N7MZx4}8CHzd62M&CnV^q@UJmNg^-AvV=BU{7MyG`ZAJ8#9BOnMci= zNLVBGh%Cc9F{ri`Inuk4)6ko4+5QaTX9!H47V?$iS)aPI@fg?-guPTNIns!8Y3fWD zUlq!_W#k{FdShHln&QGf)T^T2r6Yf9leA7YnV*@aQ{a6bk`EeF8sd{({y5~dTYsdp zWH#pX8Dspt^lf#}>iDqSYfQ=W7{4xFY2|+BhKHl*8EbV6r!gd+h1amUYoa1=a z5_+{KWo{GQ<;~l<%#`kN-J&J83G$JJQ9xerxL@cYm7CJ#Bp9x*BJ?Xnr{w9Ttb;Tg zwH>e*IA4;RGHR~DKQL-Z;G!?cuBJ>$uvyazdL+2tOH!;EDoIe>e^U*i5v>6MeV1x^|q5w_eqcr)WnfCcsP?8u_SA6pU zQmZ)=7-$pNl8AL+&`+gLbH)rG>8i{i0$ZW)mam$V@rk2c_*-5%{>ew5$bsh6$S8vk zA>I)7JK`TsTyibp^(CqvHWx{kaQu%=a78Au?fGG0?XmK%;^{+OT<_*I&l)7khHwt2 z!H-yB=1O4*Kl6rM3}-T;%~5?}sJ~xuTpG3@1!62Ly_nN7z~`lx!r3-xU*I6%>%y%i zd#73630Or+itL8&4KwzM zGR*wegzRxbwo=|~MGgcStR1sv(p_2H3L~>jL~r6}!>;qaoNUE;A=CCUeTATx%UdO| zHNK`;47BUiSFH6m%44mmh6y%L`VGBj!NWPxCz(rR|c@&Z*rr#>CYcy`gJW zwEcg?_1cN~^9&m@VsKy2@dEn_T-6B2%SB<3kFTC}if}6M--!`URT&)N1Qd(wdQbnQ ze@F2?VN--tg}=^zPd;f6P1Jp=#Ji}fc>gjg-{-`>*<8zu8ONGtf<>RFeS<2LS z5`TA}L$bu@)Gk)=*geh6CAvZmio6m3Mq(Exjlcyc0t~HaH!hBOCT>uRXF5GH Md^G3MW<@;z4@udk0RR91 diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py index 3ec4cf424..8b2da7306 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py @@ -61,26 +61,26 @@ def GetClassHelpTopic(): bonus_feats =["Warlock Energy Resistance"] spells_per_day = { -1: (-1, 89, 89), -2: (-1, 89, 89), -3: (-1, 89, 89), -4: (-1, 89, 89), -5: (-1, 89, 89), -6: (-1, 89, 89, 89, 89), -7: (-1, 89, 89, 89, 89), -8: (-1, 89, 89, 89, 89), -9: (-1, 89, 89, 89, 89), -10: (-1, 89, 89, 89, 89), -11: (-1, 89, 89, 89, 89, 89, 89), -12: (-1, 89, 89, 89, 89, 89, 89), -13: (-1, 89, 89, 89, 89, 89, 89), -14: (-1, 89, 89, 89, 89, 89, 89), -15: (-1, 89, 89, 89, 89, 89, 89), -16: (-1, 89, 89, 89, 89, 89, 89, 89, 89, 89), -17: (-1, 89, 89, 89, 89, 89, 89, 89, 89, 89), -18: (-1, 89, 89, 89, 89, 89, 89, 89, 89, 89), -19: (-1, 89, 89, 89, 89, 89, 89, 89, 89, 89), -20: (-1, 89, 89, 89, 89, 89, 89, 89, 89, 89) +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 } @@ -116,7 +116,7 @@ def GetSpellSourceType(): return spell_source_type_arcane def GetSpellReadyingType(): - return spell_readying_innate + return spell_readying_at_will def GetSpellsPerDay(): return spells_per_day diff --git a/tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt b/tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt index 43a8db519..11a915911 100644 --- a/tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt +++ b/tpdatasrc/tpgamefiles/rules/feats/greater spell focus invocation.txt @@ -1,4 +1,4 @@ -name: Greater Spell Focus Invocation +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/spells/2300 - Eldritch Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt index 838c8dc1d..e63dd38e8 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2300 - Eldritch Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: 1 action Range: Specified 60 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt b/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt index 6abdc874a..302d34f6e 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2301 - Eldritch Spear.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: 1 action Range: Specified 250 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt b/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt index 93c12b00c..34266b2df 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2303 - Eldritch Chain.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: 1 action Range: Specified 60 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2304 - Eldritch Cone.txt b/tpdatasrc/tpgamefiles/rules/spells/2304 - Eldritch Cone.txt index 6cb71be59..7f6d912dd 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2304 - Eldritch Cone.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2304 - Eldritch Cone.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: 1 action Range: Specified 30 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2305 - Eldritch Line.txt b/tpdatasrc/tpgamefiles/rules/spells/2305 - Eldritch Line.txt index 4dc1c1856..ec9f3e1a7 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2305 - Eldritch Line.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2305 - Eldritch Line.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: 1 action Range: Specified 60 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt b/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt index d7b6b7b23..826df3ae7 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2306 - Eldritch Doom.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: 1 action Range: Specified 20 diff --git a/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt index cbf714846..09e89cde4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2311 - Frightful Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt index cbf714846..09e89cde4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2312 - Sickening Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt index cbf714846..09e89cde4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2313 - Beshadowed Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt index cbf714846..09e89cde4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2314 - Brimstone Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt index cbf714846..09e89cde4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2315 - Hellrime Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2316 - Bewitching Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2316 - Bewitching Blast.txt index cbf714846..09e89cde4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2316 - Bewitching Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2316 - Bewitching Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2317 - Noxious Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2317 - Noxious Blast.txt index cbf714846..09e89cde4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2317 - Noxious Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2317 - Noxious Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2319 - Vitriolic Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2319 - Vitriolic Blast.txt index cbf714846..09e89cde4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2319 - Vitriolic Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2319 - Vitriolic Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2320 - Hindering Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2320 - Hindering Blast.txt index cbf714846..09e89cde4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2320 - Hindering Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2320 - Hindering Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2322 - Binding Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2322 - Binding Blast.txt index cbf714846..09e89cde4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2322 - Binding Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2322 - Binding Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2323 - Penetrating Blast.txt b/tpdatasrc/tpgamefiles/rules/spells/2323 - Penetrating Blast.txt index cbf714846..09e89cde4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2323 - Penetrating Blast.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2323 - Penetrating Blast.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: Free Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt b/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt index 7c914b3fe..f17837d89 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2330 - Beguiling Influence.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt b/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt index b65d4e27a..f593f1c14 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2331 - Breath of the Night.txt @@ -1,4 +1,4 @@ -School: Evocation +School: Conjuration Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt b/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt index c71833f71..e6cd472d6 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2332 - Dark Ones Own Luck.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2333 - Entropic Warding.txt b/tpdatasrc/tpgamefiles/rules/spells/2333 - Entropic Warding.txt index d35a4a70d..db1d07c84 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2333 - Entropic Warding.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2333 - Entropic Warding.txt @@ -1,4 +1,4 @@ -School: Evocation +School: Abjuration Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt b/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt index 7c914b3fe..f17837d89 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2334 - Leaps and Bounds.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt b/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt index 8660245f0..f2e0cfbb7 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2335 - Miasmic Cloud.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt b/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt index 7c914b3fe..2371565c4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2336 - See the Unseen.txt @@ -1,4 +1,4 @@ -School: Evocation +School: Divination Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt b/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt index d4f99f473..641636d8e 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2338 - Soulreaving Aura.txt @@ -1,4 +1,4 @@ -School: Evocation +School: Necromancy Component: S Casting Time: Swift Action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt b/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt index 7c914b3fe..f17837d89 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2339 - All Seeing Eyes.txt @@ -1,4 +1,4 @@ -School: Evocation +School: None Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2340 - Warlock Charm.txt b/tpdatasrc/tpgamefiles/rules/spells/2340 - Warlock Charm.txt index 0bbc2f3f0..878c6bce4 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2340 - Warlock Charm.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2340 - Warlock Charm.txt @@ -1,4 +1,4 @@ -School: Evocation +School: Enchantment Descriptor: Mind-Affecting Component: S Casting Time: 1 action diff --git a/tpdatasrc/tpgamefiles/rules/spells/2341 - Curse of Despair.txt b/tpdatasrc/tpgamefiles/rules/spells/2341 - Curse of Despair.txt index f86be2b2f..d871102ac 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2341 - Curse of Despair.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2341 - Curse of Despair.txt @@ -1,4 +1,4 @@ -School: Evocation +School: Necromancy Component: S Casting Time: 1 action Range: Touch diff --git a/tpdatasrc/tpgamefiles/rules/spells/2343 - Flee the Scene.txt b/tpdatasrc/tpgamefiles/rules/spells/2343 - Flee the Scene.txt index cb6300750..f7633d0c7 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2343 - Flee the Scene.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2343 - Flee the Scene.txt @@ -1,4 +1,4 @@ -School: Evocation +School: Conjuration Descriptor: Teleportation Component: S Casting Time: Full Round diff --git a/tpdatasrc/tpgamefiles/rules/spells/2346 - Walk Unseen.txt b/tpdatasrc/tpgamefiles/rules/spells/2346 - Walk Unseen.txt index 7c914b3fe..37a9479a6 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2346 - Walk Unseen.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2346 - Walk Unseen.txt @@ -1,4 +1,4 @@ -School: Evocation +School: Illusion Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2347 - Cold Comfort.txt b/tpdatasrc/tpgamefiles/rules/spells/2347 - Cold Comfort.txt index 43c0baa11..c9d7a6696 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2347 - Cold Comfort.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2347 - Cold Comfort.txt @@ -1,4 +1,4 @@ -School: Evocation +School: Abjuration Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/rules/spells/2350 - Ignore the Pyre.txt b/tpdatasrc/tpgamefiles/rules/spells/2350 - Ignore the Pyre.txt index a0603cf16..4129e89ed 100644 --- a/tpdatasrc/tpgamefiles/rules/spells/2350 - Ignore the Pyre.txt +++ b/tpdatasrc/tpgamefiles/rules/spells/2350 - Ignore the Pyre.txt @@ -1,4 +1,4 @@ -School: Evocation +School: Abjuration Component: S Casting Time: 1 action Range: Personal diff --git a/tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus Invocation.py b/tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus (Invocation).py similarity index 100% rename from tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus Invocation.py rename to tpdatasrc/tpgamefiles/scr/feats/feat - Greater Spell Focus (Invocation).py diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py index 6786bc01c..bdb74eade 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/greater_spell_focus_invocation.py @@ -15,5 +15,5 @@ def dcBonus(attachee, args, evt_obj): return 0 gsfInvocationFeat = PythonModifier("Greater Spell Focus (Invocation)", 2) #featEnum, empty -gsfInvocationFeat.MapToFeat("Greater Spell Focus Invocation") +gsfInvocationFeat.MapToFeat("Greater Spell Focus (Invocation)") gsfInvocationFeat.AddHook(ET_OnGetSpellDcMod, EK_NONE, dcBonus, ()) From 1cb1b55134df085540aec89c32095bb8e50df486 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Fri, 1 Apr 2022 09:22:15 +0200 Subject: [PATCH 141/146] Warlock update Added default starting equipment --- tpdata/co8infra.dat | Bin 1276285 -> 1273692 bytes .../scr/py00416standard_equipment_chest.py | 3 +++ 2 files changed, 3 insertions(+) diff --git a/tpdata/co8infra.dat b/tpdata/co8infra.dat index 747050e0cd4486d949b4b79108c1b9d865a43389..b2e50ae3a02fc0cf41fe55f97ef281ea7351d1a3 100644 GIT binary patch delta 6814 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 Nm%!ITjax{h{{vAt3u*uW 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 From 133252f1e52442f331b9d0a86f16ae5be887a513 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 4 Apr 2022 09:48:07 +0200 Subject: [PATCH 142/146] Added Enervating Shadow Invocation --- tpdata/templeplus/lib/templeplus/constants.py | 4 +- tpdata/templeplus/lib/templeplus/pymod.py | 6 ++ tpdata/tpgamefiles.dat | Bin 3881957 -> 3885177 bytes .../tpgamefiles/mes/help/warlock_help.tab | 1 + .../mes/spell_ext/warlock_spell.mes | 2 + .../warlock_spell_long_descriptions.mes | 9 +- .../indicators/enervating_shadow_aura.txt | 5 ++ .../rules/partsys/warlock_partsys.tab | 5 ++ .../rules/spell_enums/warlock_spell_enum.mes | 3 + .../rules/spells/2357 - Enervating Shadow.txt | 16 ++++ .../scr/Spell2357 - Enervating Shadow.py | 31 +++++++ tpdatasrc/tpgamefiles/scr/spell_utils.py | 54 ++++++++++- .../scr/tpModifiers/sp_enervating_shadow.py | 85 ++++++++++++++++++ 13 files changed, 218 insertions(+), 3 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/enervating_shadow_aura.txt create mode 100644 tpdatasrc/tpgamefiles/rules/spells/2357 - Enervating Shadow.txt create mode 100644 tpdatasrc/tpgamefiles/scr/Spell2357 - Enervating Shadow.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_enervating_shadow.py diff --git a/tpdata/templeplus/lib/templeplus/constants.py b/tpdata/templeplus/lib/templeplus/constants.py index e63484e9f..36ec514c7 100644 --- a/tpdata/templeplus/lib/templeplus/constants.py +++ b/tpdata/templeplus/lib/templeplus/constants.py @@ -3439,7 +3439,7 @@ spell_flee_the_scene = 2343 spell_the_dead_walk = 2344 # not implemented spell_voracious_dispelling = 2345 # not implemented -spell_walk_unseen = 2346 # not implemented +spell_walk_unseen = 2346 spell_cold_comfort = 2347 spell_witchwood_step = 2348 # not implemented spell_dread_seizure = 2349 # not implemented @@ -3572,6 +3572,8 @@ 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 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/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 1a240628b5128bf02093dbe09d6d5363e102ab79..62ce5b0410462b252ef7e40b0b84e641bf2d662e 100644 GIT binary patch delta 61092 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

@9~$!03l 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�Z}DV4}k>#uP^P8L1f}X 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 B%C`Uj diff --git a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab index f1fef6886..1bda51fc6 100644 --- a/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab +++ b/tpdatasrc/tpgamefiles/mes/help/warlock_help.tab @@ -31,6 +31,7 @@ TAG_SPELLS_BREATH_OF_THE_NIGHT TAG_SPELLS TAG_INVOCATION_LEAST Breath of the Ni 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. diff --git a/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes index f7e651e77..7376bcc46 100644 --- a/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes +++ b/tpdatasrc/tpgamefiles/mes/spell_ext/warlock_spell.mes @@ -52,6 +52,7 @@ {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.} @@ -99,3 +100,4 @@ {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/warlock_spell_long_descriptions.mes b/tpdatasrc/tpgamefiles/mes/spell_long_descriptions_ext/warlock_spell_long_descriptions.mes index 275bdbd91..8e6c7a375 100644 --- 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 @@ -181,7 +181,7 @@ School: [Invocation] Casting: Swift Action [S] Range: 10 ft. Area: 10-ft.-radius emanation, centered on you -Duration: Instantaneous., Save: None, SR: Yes} +Duration: Instantaneous, Save: None, SR: Yes} {7339} All Seeing Eyes {You gain a +6 bonus on Search and Spot checks. School: [Invocation] @@ -217,3 +217,10 @@ 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/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/partsys/warlock_partsys.tab b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab index 176925b8b..9a22c9340 100644 --- a/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab +++ b/tpdatasrc/tpgamefiles/rules/partsys/warlock_partsys.tab @@ -69,6 +69,11 @@ sp-Cold Comfort-Hit touch it 30 30 Sprite Polar Polar flare-1 30 Add 0 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 diff --git a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes index cb9c21e44..265055655 100644 --- a/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes +++ b/tpdatasrc/tpgamefiles/rules/spell_enums/warlock_spell_enum.mes @@ -50,6 +50,7 @@ {2348}{Witchwood Step} // not implemented {2349}{Dread Seizure} // not implemented {2350}{Ignore the Pyre} +{2357}{Enervating Shadow} {7300}{Eldritch Blast} {7301}{Eldritch Spear} @@ -96,6 +97,7 @@ {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} @@ -142,3 +144,4 @@ {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/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/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/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index 537cff891..ca2a69612 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -303,6 +303,11 @@ def getElementEnum(damageType): } return mappingDict.get(damageType) +def isDaylight(): + if game.is_outdoor() and game.is_daytime(): + return True + return False + ### Item Condition functions # An item condition is a condition that should be applied to a @@ -621,6 +626,47 @@ def applyTempHp(attachee, args, evt_obj): attachee.condition_add_with_args("Temporary_Hit_Points", spellId, duration, tempHpAmount) return 0 +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) @@ -655,6 +701,9 @@ def AddMovementBonus(self, bonusValue, bonusType): def AddTempHp(self, tempHpAmount): 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): @@ -723,6 +772,10 @@ def verifyAoeEventTarget(args, spellTarget, spellPacket): 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 @@ -771,7 +824,6 @@ def aoeHandleEndSignal(attachee, args, evt_obj): return 0 def aoeCombatEndSignal(attachee, args, evt_obj): - print "received aoeCombatEndSignal" args.set_arg(1, -1) return 0 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..74f493b6d --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_enervating_shadow.py @@ -0,0 +1,85 @@ +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,) + +def tooltip(attachee,args, evt_obj): + duration = args.get_arg(1) + durationLabel = spellTime(duration) + conditionName = args.get_cond_name() + evt_obj.append(conditionName, durationLabel) + return 0 + +### 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: + bonusValue = -4 + bonusType = bonus_type_untyped + bonusLabel = args.get_cond_name() + evt_obj.bonus_list.add(bonusValue, bonusType, bonusLabel) + 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", 0, duration) + 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, ()) +enervatingShadowEffect.AddHook(ET_OnGetTooltip, EK_NONE, tooltip, ()) +enervatingShadowEffect.AddHook(ET_OnConditionRemove, EK_NONE, applyImmunity, ()) +enervatingShadowEffect.AddSpellDismiss() + +### Enervating Shadow Immunity ### + +def envShadowImmunity(attachee, args, evt_obj): + if evt_obj.is_modifier("Envervating Shadow"): + evt_obj.return_val = 0 + return 0 + +def tickdown(attachee, args, evt_obj): + duration = args.get_arg(1) + duration -= evt_obj.data1 + args.set_arg(1, duration) + if duration < 0: + args.condition_remove() + return 0 + +enervatingShadowImmunity = PythonModifier("Enervating Shadow Immunity", 2) #empty, duration +enervatingShadowImmunity.AddHook(ET_OnConditionAddPre, EK_NONE, envShadowImmunity, ()) +enervatingShadowImmunity.AddHook(ET_OnBeginRound, EK_NONE, tickdown, ()) +enervatingShadowImmunity.AddHook(ET_OnGetTooltip, EK_NONE, tooltip, ()) From 45436db6d76b2aeaace739d5b4953d098dae724e Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 4 Apr 2022 09:56:47 +0200 Subject: [PATCH 143/146] Update class033_warlock.py --- tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py index 8b2da7306..54465e6e6 100644 --- a/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py +++ b/tpdatasrc/tpgamefiles/rules/char_class/class033_warlock.py @@ -51,7 +51,7 @@ def GetClassHelpTopic(): 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_hindering_blast,), + 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,) From cf033d1bb641bad53215ad418ae783b69f40501d Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 4 Apr 2022 09:57:02 +0200 Subject: [PATCH 144/146] Update tpgamefiles.dat --- tpdata/tpgamefiles.dat | Bin 3885177 -> 3885185 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index 62ce5b0410462b252ef7e40b0b84e641bf2d662e..e1a7e92065b0f5b67d8fbce1cb2f8b6fd94b56e1 100644 GIT binary patch delta 26402 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 aWZv<5*?~PyxA5xJxY?6&xWKDjNb`T;av-h% From 3ece4be1dffc9963f1b407fd2d6f3662577b3f59 Mon Sep 17 00:00:00 2001 From: Sagenlicht Date: Mon, 4 Apr 2022 10:39:12 +0200 Subject: [PATCH 145/146] Enervating Shadow Fixes --- tpdata/tpgamefiles.dat | Bin 3885185 -> 3885356 bytes .../rules/indicators/enervating_shadow.txt | 5 +++ tpdatasrc/tpgamefiles/scr/spell_utils.py | 6 ++-- .../scr/tpModifiers/sp_enervating_shadow.py | 33 ++++++++---------- 4 files changed, 23 insertions(+), 21 deletions(-) create mode 100644 tpdatasrc/tpgamefiles/rules/indicators/enervating_shadow.txt diff --git a/tpdata/tpgamefiles.dat b/tpdata/tpgamefiles.dat index e1a7e92065b0f5b67d8fbce1cb2f8b6fd94b56e1..37af74d7c2bc0a9c9313e471c7861faebcbdcf2e 100644 GIT binary patch delta 41284 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 XA4mDcUGFw#&|?qr(!hDztS+0+ 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 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/scr/spell_utils.py b/tpdatasrc/tpgamefiles/scr/spell_utils.py index ca2a69612..f0272cdb6 100644 --- a/tpdatasrc/tpgamefiles/scr/spell_utils.py +++ b/tpdatasrc/tpgamefiles/scr/spell_utils.py @@ -988,9 +988,6 @@ class AuraSpellHandleModifier(SpellDismissConcentrationFunctions): #AuraSpellHandleModifier have at least 6 arguments: #spellId, duration, bonusValue, spellEventId, spellDc, empty # - #particlesId are expected as arg6 for the target particles - #and for the aoe effect as arg7 - # #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): @@ -1009,6 +1006,9 @@ 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 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: diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_enervating_shadow.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_enervating_shadow.py index 74f493b6d..f59887bab 100644 --- a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_enervating_shadow.py +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_enervating_shadow.py @@ -11,13 +11,6 @@ enervatingShadowSpell.AddSpellNoDuplicate() enervatingShadowSpell.AddDispelledByLight(-1,) -def tooltip(attachee,args, evt_obj): - duration = args.get_arg(1) - durationLabel = spellTime(duration) - conditionName = args.get_cond_name() - evt_obj.append(conditionName, durationLabel) - return 0 - ### Start Enervating Shadow Effect ### def saveAgainstEffect(attachee, args, evt_obj): @@ -41,10 +34,7 @@ def saveAgainstEffect(attachee, args, evt_obj): def applyStrengthPenalty(attachee, args, evt_obj): failedSave = args.get_arg(2) if failedSave: - bonusValue = -4 - bonusType = bonus_type_untyped - bonusLabel = args.get_cond_name() - evt_obj.bonus_list.add(bonusValue, bonusType, bonusLabel) + applyBonus(attachee, args, evt_obj) return 0 def applyImmunity(attachee, args, evt_obj): @@ -52,34 +42,41 @@ def applyImmunity(attachee, args, evt_obj): particlesId = args.get_arg(5) if failedSave: duration = 14400 # 1 day - attachee.condition_add_with_args("Enervating Shadow Immunity", 0, duration) + 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, ()) -enervatingShadowEffect.AddHook(ET_OnGetTooltip, EK_NONE, tooltip, ()) +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("Envervating Shadow"): + if evt_obj.is_modifier("Enervating Shadow"): evt_obj.return_val = 0 return 0 def tickdown(attachee, args, evt_obj): - duration = args.get_arg(1) + duration = args.get_arg(0) duration -= evt_obj.data1 - args.set_arg(1, duration) + args.set_arg(0, duration) if duration < 0: args.condition_remove() return 0 -enervatingShadowImmunity = PythonModifier("Enervating Shadow Immunity", 2) #empty, duration +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, ()) From 9711e3555661b800c164f49395cb58ff9b8498e4 Mon Sep 17 00:00:00 2001 From: doug1234 Date: Sat, 28 Oct 2023 17:33:10 -0400 Subject: [PATCH 146/146] Merge fix. --- TemplePlus/ui/ui_char_editor.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/TemplePlus/ui/ui_char_editor.cpp b/TemplePlus/ui/ui_char_editor.cpp index 85f920e07..d989beab3 100644 --- a/TemplePlus/ui/ui_char_editor.cpp +++ b/TemplePlus/ui/ui_char_editor.cpp @@ -3490,13 +3490,14 @@ 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; - if (spellSys.IsForbiddenSchool(handle, spSchool)) - return true; + if (spSchool == School_None) //Added for Invocations + return false; + if (spSchool == selPkt.forbiddenSchool1 + || spSchool == selPkt.forbiddenSchool2) + return true; + if (spellSys.IsForbiddenSchool(handle, spSchool)) + return true; + } return false; }