Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dragon Discipile WIP #619

Draft
wants to merge 44 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
54ec304
Dragon Disciple WIP
Sagenlicht Sep 16, 2021
0312673
Updated Dragon Disciple
Sagenlicht Sep 17, 2021
b9d12de
Update dragon_disciple.py
Sagenlicht Sep 17, 2021
6e6b68f
Merge branch 'master' into DragonDisciple
Sagenlicht Sep 20, 2021
783606e
Added Ability Boost
Sagenlicht Sep 20, 2021
0cb6e91
Fixed Heritage bug
Sagenlicht Sep 20, 2021
809df43
Fixed Cone Breath Weapon
Sagenlicht Sep 20, 2021
1ad5cfa
Further progress for the DD
Sagenlicht Sep 21, 2021
6e4d1e0
Finished help file for DD
Sagenlicht Sep 22, 2021
7fcad2c
DD: Dropped Blindsense, fixed fire smoke
Sagenlicht Sep 23, 2021
d02b5fb
Added Flying Toggle (Nonfunctional yet)
Sagenlicht Sep 30, 2021
e641ab5
Moved Flying to seperate condtion
Sagenlicht Oct 1, 2021
2ebb5a7
added Darley Wings Mesh as Wings for the DD
Sagenlicht Oct 14, 2021
f77c9dc
Merge branch 'master' into DragonDisciple
Sagenlicht Oct 26, 2021
d8ae0ec
Merge branch 'master' into DragonDisciple
Nov 21, 2021
7ec38ee
String fixes: DD requirements fit inside scroll box; feat descrition …
Nov 22, 2021
b085be2
Added PyObjHndl method anim_goal_throw_spell_w_cast_anim to properly …
Nov 22, 2021
9696b90
DD fixes Breath weapon
Nov 22, 2021
d1daf13
Merge branch 'DragonDisciple' of https://github.com/GrognardsFromHell…
Sagenlicht Nov 22, 2021
1aabeb1
Update to DD Draconic Heritage Handling
Sagenlicht Nov 23, 2021
2d2d8cb
First Draft of Bonus Spells Feature
Sagenlicht Nov 24, 2021
fbbfe61
Merge branch 'master' into DragonDisciple
Sagenlicht Nov 24, 2021
4099c50
Merge branch 'master' into DragonDisciple
Nov 24, 2021
67e6a9e
Merge branch 'DragonDisciple' of https://github.com/GrognardsFromHell…
Nov 24, 2021
a43fa6a
Forgot to merge the draconic_heritage feat to the DD
Sagenlicht Nov 25, 2021
8f9182e
Added new error codes
Sagenlicht Dec 6, 2021
1586499
Condition hashtable init replacement; added log message for when it o…
Dec 22, 2021
96c76ef
Merge branch 'DragonDisciple' of https://github.com/GrognardsFromHell…
Dec 22, 2021
b43a73d
reflex throw will now use SpellSaveThrow when used for spell actions,…
Dec 22, 2021
e21d766
Added get_caster_class method to python EventObjSpellsPerDay
Dec 22, 2021
05c1d8e
Renamed chargeAfterPicker for more accurate meaning
Dec 23, 2021
5fe70c7
Minor magic number cleanup from natural attacks review
Dec 24, 2021
370c30b
Changed Bonus Spells per Day
Sagenlicht Jan 18, 2022
422d1c4
Update dragon_disciple.py
Sagenlicht Jan 18, 2022
69a037a
Merge pull request #701 from GrognardsFromHell/bugfixes
DudeMcDude Sep 6, 2022
e590df5
Fixes animation script particle errors on map load
Sep 7, 2022
0a2315f
Merge pull request #702 from GrognardsFromHell/bugfixes
DudeMcDude Sep 7, 2022
fdb94bf
Minor wiki help errors
Sep 7, 2022
bb602d2
Merge branch 'bugfixes' into develop
Sep 9, 2022
b750dd0
Scribe scroll - automated infrastructure instead of the old manual pr…
Sep 9, 2022
9b6d579
Fixes crash issue when AI party member casts Dominate Monster (aka 'S…
Sep 10, 2022
9eefcb0
Fixes #682
Sep 10, 2022
d1b2858
Fixed error in targeting.py will_kos
Sep 10, 2022
c4ef9bd
Merge from develop
Sep 11, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions TemplePlus/python/python_integration_d20_action.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've changed get_cur_seq to return a reference rather than a copy. I vaguely recall someone needed this change, pinging @dolio @Sagenlicht @anatoliy-savchak @doug1234

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It wasn't me, though I do use get_cur_seq in quite a few python actions.

Copy link
Contributor

@DudeMcDude DudeMcDude Nov 22, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh I like your idea about the flying condition actually. You could also disable AoO when moving/charging with this condition I guess, which could be quite relevant. I don't know if it's possible to let the character levitate above its space for the time he/she flies but everything else seems actually quite reasonable.

Missing features are:

  • Claws and Bite attacks
  • Proper Facing for the Breath Weapon
  • Bonus Spells Slots (Ring of Wizardry Issue)

As you might recall I've recently added a hook for bonus spell slots; are you able to make use of that?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am sure I can :)

Thanks alot for the new anim_goal, can't wait to use them for a lot of different things :)

I did postpone my work on the DD due to some Breath Weapon issues, will resume with the DD tomorrow and will try to add the bonus spells.


m.def("get_current_tb_actor", []()->objHndl {
auto actor = tbSys.turnBasedGetCurrentActor();
Expand Down
19 changes: 19 additions & 0 deletions TemplePlus/python/python_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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 },
Expand Down
2 changes: 2 additions & 0 deletions tpdata/templeplus/lib/templeplus/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -3358,6 +3358,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
Expand Down
2 changes: 2 additions & 0 deletions tpdatasrc/tpgamefiles/mes/help/breath_weapon_feats_help.tab
Original file line number Diff line number Diff line change
@@ -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.
12 changes: 12 additions & 0 deletions tpdatasrc/tpgamefiles/mes/help/dragon_disciple_help.tab
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
TAG_DRAGON_DISCIPLE TAG_PRESTIGE_CLASSES Dragon Disciple The blood of dragons runs through the veins of many races. For some, this heritage manifests as a sorcerous bloodline and a predilection for magic. But a few embrace the dreams, recognizing their allure as a promise. These become dragon disciples, who use their magical power as a catalyst to ignite their dragon blood, realizing its fullest potential. Most Dragon Disciples are barbarian, fighters, or rangers who have dabbed as bards or sorcerers. Occasionally, a serious spellcaster explores the path to further a goal of finding out more about his draconic heritage. Hit Die: d12 Requirements: To qualify to become a Dragon Disciple, a character must fulfill all the following criteria. Race: Any non dragon (cannot be already a half-dragon). Skills: Knowledge(Arcana) 8 ranks (not implemented). Languages: Draconic (not implemented). Spellcasting: Ability to cast arcane spells without preparation. Special: The player chooses a dragon variety when taking the first level in this prestige class. Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_TABLES] Class Skills: ~Concentration(Con)~[TAG_CONCENTRATION], Craft(Int), ~Diplomacy(Cha)~[TAG_DIPLOMACY], Escape Artist(Dex), ~Gather Information(Cha)~[TAG_GATHER_INFORMATION], Knowledge(all skills), ~Listen(Wis)~[TAG_LISTEN], Profession(Wis), ~Search(Int)~[TAG_SEARCH], Speak Language(None), ~Spellcraft(Int)~[TAG_SPELLCRAFT], and ~Spot(Wis)~[TAG_SPOT]. Skill Points at Each Level: 2 + Int modifier Class Features: [CMD_CHILDREN]
TAG_CLASS_FEATURES_DRAGON_DISCIPLES_TABLES TAG_DRAGON_DISCIPLE Dragon Disciple Base Attack & Base Save Bonuses Level ~BAB~[TAG_LEVEL_BONUSES] ~Fort.~[TAG_FORTITUDE] ~Reflex~[TAG_REFLEX] ~Will~[TAG_WILL] 1 +0 +2 +0 +2 2 +1 +3 +0 +3 3 +2 +3 +1 +3 4 +3 +4 +1 +4 5 +3 +4 +1 +4 6 +4 +5 +2 +5 7 +5 +5 +2 +5 8 +6 +6 +2 +6 9 +6 +6 +3 +6 10 +7 +7 +3 +7
TAG_CLASS_FEATURES_DRAGON_DISCIPLES_SPELLS_PER_DAY TAG_DRAGON_DISCIPLE Dragon Disciple Bonus Spells Dragon disciples gain bonus spells as they gain levels in this prestige class, as if from having a high ability score at level 1, 2, 4, 5, 6, 8 and 9. A bonus spell can be added to any level of spells the disciple already has the ability to cast. If a character has more than one spellcasting class, he must decide to which class he adds each bonus spell as it is gained. Once a bonus spell has been applied, it cannot be shifted.
TAG_CLASS_FEATURES_DRAGON_DISCIPLES_GRANTED_PROFICIENCIES TAG_DRAGON_DISCIPLE Dragon Disciple Weapon and Armor Proficiency Dragon Disciples gain no weapon or armor proficiencies.
TAG_CLASS_FEATURES_DRAGON_DISCIPLES_HERITAGE TAG_DRAGON_DISCIPLE Dragon Disciple Heritage The player chooses a dragon heritage when taking the first level in this prestige class. This determines the kind of ~Breath Weapon~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON] and ~Element Immunity~[TAG_CLASS_FEATURES_DRAGON_DISCIPLES_DRAGON_APOTHEOSIS] the Disciple will get as he progresses in levels.
TAG_CLASS_FEATURES_DRAGON_DISCIPLES_NATURAL_ARMOR_INCREASE TAG_DRAGON_DISCIPLE Dragon Disciple Natural Armor Increase A dragon disciple gains an increase to the character's existing natural armor (if any). At 1st level +1, at 4th level +2, and at 7th level +3. As his skin thickens, a dragon disciple takes on more and more of his progenitor's physical aspect.
TAG_CLASS_FEATURES_DRAGON_DISCIPLES_ABILITY_BOOST TAG_DRAGON_DISCIPLE Dragon Disciple Ability Boost As a dragon disciple gains levels in this prestige class, his ability scores increase. Strength +2 on Level 2 and 4. Constitution +2 on Level 6. Intelligence +2 on Level 8. These increases stack and are gained as if through level advancement.
TAG_CLASS_FEATURES_DRAGON_DISCIPLES_CLAWS_AND_BITE TAG_DRAGON_DISCIPLE Dragon Disciple Claws and Bite At 2nd level, a dragon disciple gains claw and bite attacks if he does not already have them. Use the values below or the disciple’s base claw and bite damage values, whichever are greater. A dragon disciple is considered proficient with these attacks. When making a full attack, a dragon disciple uses his full base attack bonus with his bite attack but takes a -5 penalty on claw attacks. The Multiattack feat reduces this penalty to only -2. Size Bite Damage Claw Damage Small 1d4 1d3 Medium 1d6 1d4 Large 1d8 1d6
TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BREATH_WEAPON TAG_DRAGON_DISCIPLE Dragon Disciple Breath Weapon At 3rd level, a dragon disciple gains a minor breath weapon. The type and shape depend on the dragon variety whose heritage he enjoys (see below). Regardless of the ancestor, the breath weapon deals 2d8 points of damage of the appropriate energy type. At 7th level, the damage increases to 4d8, and when a disciple attains dragon apotheosis at 10th level it reaches its full power at 6d8. Regardless of its strength, the breath weapon can be used only once per day. Use all the rules for dragon breath weapons except as specified here. Dragon Heritage Breath Weapon Black Line of acid Blue Line of lightning Green Cone of acid Red Cone of fire White Cone of Cold Brass Line of Fire Bronze Line of Lightning Copper Line of acid Gold Cone of Fire Silver Cone of cold The DC of the breath weapon is 10 + class level + Con modifier. A line-shaped breath weapon is 5 feet high, 5 feet wide, and 60 feet long. A cone-shaped breath weapon is 30 feet long.
TAG_CLASS_FEATURES_DRAGON_DISCIPLES_BLINDSENSE TAG_DRAGON_DISCIPLE Dragon Disciple Blindsense At 5th level, the dragon disciple gains blindsense with a range of 30 feet. Using nonvisual senses the dragon disciple notices things it cannot see. He usually does not need to make Spot or Listen checks to notice and pinpoint the location of creatures within range of his blindsense ability, provided that he has line of effect to that creature. Any opponent the dragon disciple cannot see still has total concealment against him, and the dragon disciple still has the normal miss chance when attacking foes that have concealment. Visibility still affects the movement of a creature with blindsense. A creature with blindsense is still denied its Dexterity bonus to Armor Class against attacks from creatures it cannot see. At 10th level, the range of this ability increases to 60 feet. Not implemented in ToEE, has no real gameplay effect
TAG_CLASS_FEATURES_DRAGON_DISCIPLES_WINGS TAG_DRAGON_DISCIPLE Dragon Disciple Wings At 9th level, a dragon disciple grows a set of draconic wings. He may now fly at a speed equal to his normal land speed, with average maneuverability. Not implemented in ToEE as there is flight in ToEE!
TAG_CLASS_FEATURES_DRAGON_DISCIPLES_DRAGON_APOTHEOSIS TAG_DRAGON_DISCIPLE Dragon Disciple Dragon Apotheosis At 10th level, a dragon disciple takes on the half-dragon template. His breath weapon reaches full strength (6d8), and he gains +4 to Strength and +2 to Charisma. His natural armor bonus increases to +4, and he acquires low-light vision, 60-foot darkvision, immunity to sleep and paralysis effects, and immunity to the energy type used by his breath weapon. Note: Not implemented: low-light vision, darkvision, half-dragon template.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{3231} {Dragon Disciple Cone Breath}
{3232} {Dragon Disciple Line Breath}
3 changes: 1 addition & 2 deletions tpdatasrc/tpgamefiles/mes/stat_ext.mes
Original file line number Diff line number Diff line change
Expand Up @@ -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.}


Expand Down
140 changes: 92 additions & 48 deletions tpdatasrc/tpgamefiles/rules/char_class/class023_dragon_disciple.py
Original file line number Diff line number Diff line change
@@ -1,98 +1,142 @@
from toee import *
import char_class_utils
import char_editor
from heritage_feat_utils import getDraconicHeritageColourString

###################################################

def GetConditionName():
return "Dragon Disciple"
return "Dragon Disciple"

def GetSpellCasterConditionName():
return "Dragon Disciple Spellcasting"
return "Dragon Disciple Spellcasting"

def GetCategory():
return "Core 3.5 Ed Prestige Classes"
return "Core 3.5 Ed Prestige Classes"

def GetClassDefinitionFlags():
return CDF_CoreClass
return CDF_CoreClass

def GetClassHelpTopic():
return "TAG_DRAGON_DISCIPLES"
return "TAG_DRAGON_DISCIPLES"

classEnum = stat_level_dragon_disciple

###################################################


class_feats = {
1: ("Dragon Disciple Natural Armor",),
2: ("Dragon Disciple Claws and Bite",),
3: ("Dragon Disciple Breath Weapon",),
9: ("Dragon Disciple Wings",),
10: ("Dragon Disciple Dragon Apotheosis",)
}

class_skills = (skill_alchemy, skill_concentration, skill_craft, skill_diplomacy, skill_escape_artist, skill_gather_information, skill_knowledge_all, skill_listen, skill_profession, skill_search, skill_spellcraft, skill_spot)

def IsEnabled():
return 1
return 1

def GetHitDieType():
return 12
return 12

def GetSkillPtsPerLevel():
return 2
return 2
def GetBabProgression():
return base_attack_bonus_type_martial
return base_attack_bonus_type_martial

def IsFortSaveFavored():
return 1
return 1

def IsRefSaveFavored():
return 0
return 0

def IsWillSaveFavored():
return 1
return 1
def GetSpellListType():
return spell_list_type_none # dragon disciples only advance bonus spells
return spell_list_type_none # dragon disciples only advance bonus spells

def IsClassSkill(skillEnum):
return char_class_utils.IsClassSkill(class_skills, skillEnum)
return char_class_utils.IsClassSkill(class_skills, skillEnum)

def IsClassFeat(featEnum):
return char_class_utils.IsClassFeat(class_feats, featEnum)
return char_class_utils.IsClassFeat(class_feats, featEnum)

def GetClassFeats():
return class_feats
return class_feats

def IsAlignmentCompatible( alignment):
return 1
return 1

def CanCastInnateArcane(obj): #todo: generalize
if obj.stat_level_get(stat_level_bard) > 0:
return 1
if obj.stat_level_get(stat_level_sorcerer) > 0:
return 1
return 0
def SpeaksDraconic( obj ):
return 1 # languages not implemented in ToEE
if obj.stat_level_get(stat_level_bard) > 0:
return 1
if obj.stat_level_get(stat_level_sorcerer) > 0:
return 1
return 0
def SpeaksDraconic(obj):
return 1 # languages not implemented in ToEE

def KnowledgeArcanaCheck( obj ):
# if (obj.skill_ranks_get(skill_knowledge_arcana) < 8): #knowledge skill not implemented in ToEE
# return 0
if obj.stat_level_get(stat_level) < 5: # a replacement for checking knowledge arcana
return 0
return 1

def ObjMeetsPrereqs( obj ):
return 0 # WIP

if not KnowledgeArcanaCheck(obj):
return 0
if (not obj.has_feat(feat_cleave) ):
return 0
if (not obj.has_feat(feat_power_attack) ):
return 0
if (not CanCastInnateArcane(obj)):
return 0
# if (not obj.has_feat(feat_improved_sunder) ): # sunder not yet implemented
# return 0
#if (not obj.d20_query('EVIL_OUTSIDER_CONTACTED')):
# return 0
return 1
# if (obj.skill_ranks_get(skill_knowledge_arcana) < 8): #knowledge skill not implemented in ToEE
# return 0
if obj.stat_level_get(stat_level) < 5: # a replacement for checking knowledge arcana
return 0
return 1

def DragonRaceCheck(obj):
#Can't check if character is half-dragon; it does not exist in ToEE
if obj.is_category_type(mc_type_dragon):
return 1
return 0

def ObjMeetsPrereqs(obj):
if not KnowledgeArcanaCheck(obj):
return 0
elif not CanCastInnateArcane(obj):
return 0
elif not SpeaksDraconic(obj):
return 0
#elif DragonRaceCheck:
# return 0
return 1


# Levelup
def alreadyHasDraconicHeritage(obj):
hasDraconicHeritageFeat = False
for heritage in range(heritage_draconic_black, heritage_draconic_white + 1):
colourString = getDraconicHeritageColourString(heritage)
if char_editor.has_feat("Draconic Heritage {}".format(colourString)):
hasDraconicHeritageFeat = True
break
return True if hasDraconicHeritageFeat else False

def IsSelectingFeatsOnLevelup(obj):
newLvl = char_editor.stat_level_get(classEnum)
if newLvl == 1:
if alreadyHasDraconicHeritage(obj):
return 0
elif newLvl not in [2, 4, 5, 6, 8, 9]:
return 0
return 1

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)
featInfo.feat_status_flags |= 4 # always pickable
bonFeatInfo.append(featInfo)
char_editor.set_bonus_feats(bonFeatInfo)
return

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from toee import *
import tpactions
import tpdp


def GetActionName():
return "Dragon Disciple Breath Attack"


def GetActionDefinitionFlags():
return D20ADF_MagicEffectTargeting | D20ADF_QueryForAoO | D20ADF_TriggersCombat


def GetTargetingClassification():
return D20TC_CastSpell


def GetActionCostType():
return D20ACT_Standard_Action


def AddToSequence(d20action, action_seq, tb_status):
if d20action.performer.d20_query(Q_Prone):
d20aGetup = d20action
d20aGetup.action_type = tpdp.D20ActionType.StandUp
action_seq.add_action(d20aGetup)
action_seq.add_action(d20action)
return AEC_OK
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 0.txt
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 1.txt
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 2.txt
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions tpdatasrc/tpgamefiles/rules/feats/bonus spell bard 3.txt
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 0.txt
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 1.txt
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 2.txt
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions tpdatasrc/tpgamefiles/rules/feats/bonus spell sorcerer 3.txt
Original file line number Diff line number Diff line change
@@ -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
6 changes: 6 additions & 0 deletions tpdatasrc/tpgamefiles/rules/feats/bonus spell wizard 0.txt
Original file line number Diff line number Diff line change
@@ -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
Loading