diff --git a/dungeonsheets/classes/druid.py b/dungeonsheets/classes/druid.py index dc4faa1..adec6fc 100644 --- a/dungeonsheets/classes/druid.py +++ b/dungeonsheets/classes/druid.py @@ -34,7 +34,7 @@ class MoonCircle(SubClass): haunt the deepest parts of the wilderness, where they might go for weeks on end before crossing paths with another humanoid creature, let alone another druid. - + Changeable as the moon, a druid of this circle might prowl as a great cat one night, soar over the treetops as an eagle the next day, and crash through the undergrowth in bear form to drive off a trespassing @@ -99,6 +99,33 @@ class ShepherdCircle(SubClass): features_by_level[14] = [features.FaithfulSummons] +#GGTR +class SporesCircle(SubClass): + """Druids of the Circle of Spores find beauty in decay. They see within + mold and other fungi the ability to transform lifeless material into + abundant, ableit somewhat strange, life. + + These druids believe that life and death are parts of a grand cycle, with + one leading to the other and then back again. Death isn't the end of life, + but instead a change of state that sees life shift into a new form. + + Druids of this circle have a complex relationship with the undead. Unlike + most other druids, they see nothing inherently wrong with undeath, which + they consider to be a companion to life and death. But these druids believe + that the natural cycle is heathiest when each segment of it is vibrant and + changing. Undead that seek to replace all life with undeath, or that try to + avoid passing to a final rest, violate the cycle and must be thwarted. + """ + + name = "Circle of Spores" + circle = "spores" + features_by_level = defaultdict(list) + features_by_level[2] = [features.CircleSpells, features.HaloOfSpores, features.SymbioticEntity] + features_by_level[6] = [features.FungalInfestation] + features_by_level[10] = [features.SpreadingSpores] + features_by_level[14] = [features.FungalBody] + + class Druid(CharClass): name = 'Druid' _wild_shapes = () @@ -129,7 +156,7 @@ class Druid(CharClass): features_by_level[18] = [features.TimelessBody, features.BeastSpells] features_by_level[20] = [features.Archdruid] subclasses_available = (LandCircle, MoonCircle, DreamsCircle, - ShepherdCircle) + ShepherdCircle, SporesCircle) spellcasting_ability = 'wisdom' spell_slots_by_level = { 1: (2, 2, 0, 0, 0, 0, 0, 0, 0, 0), @@ -181,7 +208,7 @@ class Druid(CharClass): def all_wild_shapes(self): """Return all wild shapes, regardless of validity.""" return self._wild_shapes - + @property def wild_shapes(self): """Return a list of valid wild shapes for this Druid.""" @@ -191,7 +218,7 @@ class Druid(CharClass): if self.can_assume_shape(shape): valid_shapes.append(shape) return valid_shapes - + @wild_shapes.setter def wild_shapes(self, new_shapes): actual_shapes = [] @@ -211,23 +238,23 @@ class Druid(CharClass): actual_shapes.append(new_shape) # Save the updated list for later self._wild_shapes = actual_shapes - + def can_assume_shape(self, shape: monsters.Monster)-> bool: """Determine if a given shape meets the requirements for transforming. - + See Pg 66 of player's handbook. - + Parameters ========== shape A monster that the Druid wishes to transform into. - + Returns ======= can_assume True if the monster meets the C/R, swim and flying speed restrictions. - + """ # Determine acceptable states based on druid level if self.level < 2: @@ -258,11 +285,11 @@ class Druid(CharClass): valid_fly = (max_fly is None or shape.fly_speed <= max_fly) can_assume = shape.is_beast and valid_cr and valid_swim and valid_fly return can_assume - + @property def spells(self): return tuple(S() for S in self.spells_prepared) - + @spells.setter def spells(self, val): if len(val) > 0: diff --git a/dungeonsheets/features/druid.py b/dungeonsheets/features/druid.py index dcf4942..4a21d7d 100644 --- a/dungeonsheets/features/druid.py +++ b/dungeonsheets/features/druid.py @@ -13,7 +13,7 @@ class WildShape(Feature): flying or swimming speed. 2nd Level: Max CR 1/4, No Flying/Swimming (ex: Wolf) - + 4th Level: Max CR 1/2, No Flying (ex: Crocodile) 8th Level: Max CR 1 (ex: Giant Eagle) @@ -92,7 +92,7 @@ class BeastSpells(Feature): name = "Beast Spells" source = "Druid" - + class Archdruid(Feature): """At 20th level, you can use your Wild Shape an unlimited number of times. @@ -167,7 +167,7 @@ class _CircleSpells(Feature): self.spells_known.extend(sps) self.spells_prepared.extend(sps) super().__init__(owner=owner) - + class ArcticSpells(_CircleSpells): """Your mystical connection to the land infuses you with the ability to cast @@ -281,6 +281,22 @@ class UnderdarkSpells(_CircleSpells): 9: [spells.Cloudkill, spells.InsectPlague]} +class SporesSpells(_CircleSpells): + """Your symbiotic link do fungus and your ability to tap into the cycle of + life and death grants you access to certain spells. + + These spells are included in your Spell Sheet. + + """ + + _name = 'Spores' + _spells = {2: [spells.ChillTouch], + 3: [spells.Blindnessdeafness, spells.GentleRepose], + 5: [spells.AnimateDead, spells.GaseousForm], + 7: [spells.Blight, spells.Confusion], + 9: [spells.Cloudkill, spells.Contagion]} + + class CircleSpells(FeatureSelector, _CircleSpells): """ Select a land where you became a druid in feature_choices in your .py file: @@ -300,7 +316,9 @@ class CircleSpells(FeatureSelector, _CircleSpells): swamp underdark - + + spores + """ options = {'arctic': ArcticSpells, 'coast': CoastSpells, @@ -309,9 +327,10 @@ class CircleSpells(FeatureSelector, _CircleSpells): 'grassland': GrasslandSpells, 'mountain': MountainSpells, 'swamp': SwampSpells, - 'underdark': UnderdarkSpells} + 'underdark': UnderdarkSpells, + 'spores': SporesSpells} name = "Circle Spells (Select One)" - source = "Druid (Circle of the Land)" + source = "Druid (Circle of the Land/Spores)" class LandsStride(Feature): @@ -439,7 +458,7 @@ class HearthOfMoonlightAndShadow(Feature): you can invoke the shadowy power of the Gleaming Court to help guard your respite. At the start of the rest, you touch a point in space, and an invisible, 30-foot—radius sphere of magic appears, centered on that - point. Total cover blocks the sphere. + point. Total cover blocks the sphere. While within the sphere, you and your allies gain a +5 bonus to Dexterity (Stealth) and Wisdom (Perception) checks, and any light from open flames in @@ -456,7 +475,7 @@ class HiddenPaths(Feature): fey use to traverse space in the blink of an eye. As a bonus action on your turn, you can teleport up to 60 feet to an unoccupied space you can see. - + Alternatively, you can use your action to teleport one willing creature you touch up to 30 feet to an unoccupied space you can see. You can use this feature a number of times equal to your Wisdom modifier (minimum of once), @@ -466,7 +485,7 @@ class HiddenPaths(Feature): name = "Hidden Paths" source = "Druid (Circle of the Moon)" - + class WalkerInDreams(Feature): """At 14th level, the magic of the Feywild grants you the ability to travel mentally or physically through dreamlands. When you finish a short rest, @@ -544,7 +563,7 @@ class MightySummoner(Feature): """Starting at 6th level, beasts and fey that you conjure are more resilient than normal. Any beast or fey summoned or created by a spell that you cast gains the. following benefits: - + -- The creature appears with more hit points than normal: 2 extra hit points per Hit Die it has. @@ -585,3 +604,91 @@ class FaithfulSummons(Feature): source = "Druid (Circle of the Shepherd)" +#Circle of Spores +class HaloOfSpores(Feature): + """Starting at 2nd level, you are surrounded by invisible, necrotic spores + that are harmless until you unleash them on a creature nearby. When a + creature you can see moves into a space within 10 feet of you or starts its + turn there, you can use your reaction to deal 1d4 necrotic damage to that + creature unless it succeeds on a Constitution saving throw against your + spell save DC. The necrotic damage increases to 1d6 at 6th level, 1d8 at + 10th level, and 1d10 at 14th level + + """ + name = "Halo of Spores" + source = "Druid (Cirlce of Spores)" + + +class SymbioticEntity(Feature): + """At 2nd level, you gain the ability to channel magic into your spores. As + an action, you can expend a use of your Wild Shape feature to awaken those + spores, rather than transforming into a beast form, and you gain 4 + temporary hit points for each level you have in this class. While this + feature is active, you gain the following benefits: + + -- When you deal your Halo of Spores damage, roll the damage die a second + time and add it to the total. + + -- Your melee weapon attacks deal an extra 1d6 poison damage to any target + they hit. + + These benefits last for 10 minutes, until you lose all these temporary hit + points, or until you use your Wild Shape again. + + """ + name = "Symbiotic Entity" + source = "Druid (Circle of Spores)" + + +class FungalInfestation(Feature): + """At 6th level, your spores gain the ability to infest a corpse and + animate it. If a beast or a humanoid that ist Small or Medium dies within + 10 feet of you, you can use your reaction to animate it, causing it to + stand up immediately with 1 hit point. The creature uses the zombie stat + block in the _Monster Manual_. It remains animate for 1 hour, after which + time it collapses and dies. + + In combat, the zombie's turn comes immediately after yours. It obeys your + mental commands, and the only action it can take is the Attack action, + making one melee attack. + + You can use this feature a number of times equal to your Wisdom modifier + (minimum of once), and you regain all expended uses of it when you finish a + long rest. + + """ + name = "Fungal Infestation" + source = "Druid (Circle of Spores)" + + +class SpreadingSpores(Feature): + """At 10th level, you gain the ability to seed an area with deadly spores. + As a bonus action while your Symbiotic Entity feature is active, you can + hurl spores up to 30 feet away, where they swirl in a 10-foot cube for 1 + minute. The spores disappear early if you use this feature again, if you + dismiss them as a bonus action, or if your Symbiotic Entity feature is no + longer active. + + Whenever a creature moves into the cube or starts its turn there, that + creature takes your Halo of Spores damage, unless the creature succeeds on + a Constitution saving throw against your spell save DC. A creature can take + this damage nbo mre than once per turn. + + While the cube of sproes persists, you can't use your Halo of Spores + reaction. + + """ + name = "Spreading Spores" + source = "Druid (Circle of Spores)" + + +class FungalBody(Feature): + """At 14th level, the fungal spores in your body alter you: you can't be + blinded, deafened, frightened, or poisoned, and any critical hit against + you counts as a normal hit instead, unless you're incapacitated. + + """ + name = "Fungal Body" + source = "Druid (Circle of Spores)" + +