AbilityTreeNode

Trait AbilityTreeNode 

Source
pub trait AbilityTreeNode {
    // Required methods
    fn node_id(&self) -> usize;
    fn children(&self) -> ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE>;
    fn display(&self, out: &mut TreeFormatter<'_>) -> Result<()>;
    fn node_tag(&self) -> &'static str;

    // Provided methods
    fn data(&self) -> ArrayVec<u8, MAX_NODE_DATA_SIZE>  { ... }
    fn node_description(&self) -> String { ... }
}
Expand description

Trait to reunite all the types of the ability trees to a single “node” type.

The ability tree is using hard types, to preserve strong semantics in the tree. This allow the abilities to be clearly defined, and prohibits invalid trees from even existing. However, we then loose generality of the nodes.

The goal of this trait is to keep these generalities: All nodes of the trees implement the AbilityTreeNode trait, and can be interpreted as a generic node. This gives abstract access to its id, its children, and its optionnal data.

The only kinds of nodes that are allowed as tree nodes are:

  • Plain structs, that can have data and / or children:
struct SomeNode {
    child_1: SomeChildNode1,
    child_2: SomeChildNode2,
    data: f32,
}

These nodes are the ones that can have multiple children and data, and can be empty to be marker nodes, or end of variants.

  • Enums, where each variant is unnamed with a single field:
enum SomeOtherNode {
    Variant1(SomeVariant1),
    Variant2(SomeVariant2),
}

These nodes regroups kinds of nodes together, but do not provide any data, and will always have a single child (although the child kind can vary).

It is possible to create an enum whith no fields. These basically act like a single field with a struct with no fields, but we allow them to avoid bloating the code with unecessary nodes. For example:

enum YetAnotherNode {
    EmptyVariant,
    VariantWithData(Data),
}

Here, this is a shortcut for having a EmptyVariant(EmptyVariantData) where the data would be an empty struct.

Required Methods§

Source

fn node_id(&self) -> usize

Get the node id.

This identifier is unique to the kind of node it is, allowing to rebuild the node kind from it. This allows to create a mapping for all node kinds to other objects.

Source

fn children(&self) -> ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE>

Get all of the nodes children, as abstract ability tree node.

This allows to recursively descend the ability tree over abstract nodes types.

Source

fn display(&self, out: &mut TreeFormatter<'_>) -> Result<()>

Display the ability tree in a human readable manner into the given output.

This is mostly for debug purpuses, and it is not recommanded to use this in production.

Source

fn node_tag(&self) -> &'static str

The node tag is a simple one word string that indicates what kind of node it is.

It is primarly used for display and debug purpuses.

Provided Methods§

Source

fn data(&self) -> ArrayVec<u8, MAX_NODE_DATA_SIZE>

Get the node data, if any.

Some nodes may carry arbitrary data that are not children, like numbers or booleans. This function allow to retrieve them, although for now an array of bytes may not be the best pick.

Source

fn node_description(&self) -> String

The node name is more advanced version of the tag, and can allocate memory to dynamically changed based on the nodes internals.

It is primarly used for display and debug purpuses.

By default, this is the same as the node tag. Nodes that need to provide a more interesting description can override this.

Implementors§

Source§

impl AbilityTreeNode for Ability

Source§

impl AbilityTreeNode for AbilityKind

Source§

impl AbilityTreeNode for ExpandedKeywordAbility

Source§

impl AbilityTreeNode for ContinuousEffectKind

Source§

impl AbilityTreeNode for ObjectAbilitiesModification

Source§

impl AbilityTreeNode for ObjectCharacteristicModification

Source§

impl AbilityTreeNode for PowerToughnessModifiers

Source§

impl AbilityTreeNode for CostModification

Source§

impl AbilityTreeNode for StaticAbilityKind

Source§

impl AbilityTreeNode for Condition

Source§

impl AbilityTreeNode for Conditional

Source§

impl AbilityTreeNode for NumberOfResolutions

Source§

impl AbilityTreeNode for Cost

Source§

impl AbilityTreeNode for CreatureAction

Source§

impl AbilityTreeNode for Event

Source§

impl AbilityTreeNode for PlayerAction

Source§

impl AbilityTreeNode for EventReplacement

Source§

impl AbilityTreeNode for EventSourceReference

Source§

impl AbilityTreeNode for EventSource

Source§

impl AbilityTreeNode for CounterKind

Source§

impl AbilityTreeNode for CreatedTokenKind

Source§

impl AbilityTreeNode for ExileFollowUp

Source§

impl AbilityTreeNode for Imperative

Source§

impl AbilityTreeNode for RemovableCounterKind

Source§

impl AbilityTreeNode for Number

Source§

impl AbilityTreeNode for CountSpecifier

Source§

impl AbilityTreeNode for ObjectKind

Source§

impl AbilityTreeNode for ObjectReference

Source§

impl AbilityTreeNode for ObjectSpecifier

Source§

impl AbilityTreeNode for ObjectSpecifiers

Source§

impl AbilityTreeNode for PlayerSpecifier

Source§

impl AbilityTreeNode for Statement

Source§

impl AbilityTreeNode for Mana

Source§

impl AbilityTreeNode for NamedToken

Source§

impl AbilityTreeNode for Order

Source§

impl AbilityTreeNode for OwnerSpecifier

Source§

impl AbilityTreeNode for BackwardDuration

Source§

impl AbilityTreeNode for ForwardDuration

Source§

impl AbilityTreeNode for Instant

Source§

impl AbilityTreeNode for OwnableZone

Source§

impl AbilityTreeNode for ZoneReference

Source§

impl AbilityTreeNode for ActivatedAbility

Source§

impl AbilityTreeNode for EnchantKeywordAbility

Source§

impl AbilityTreeNode for StandaloneKeywordAbility

Source§

impl AbilityTreeNode for WardKeywordAbility

Source§

impl AbilityTreeNode for SpellAbility

Source§

impl AbilityTreeNode for AlternativeCastingPermissions

Source§

impl AbilityTreeNode for ObjectGainAbility

Source§

impl AbilityTreeNode for PowerToughnessModifiersMinusMinus

Source§

impl AbilityTreeNode for PowerToughnessModifiersMinusPlus

Source§

impl AbilityTreeNode for PowerToughnessModifiersPlusMinus

Source§

impl AbilityTreeNode for PowerToughnessModifiersPlusPlus

Source§

impl AbilityTreeNode for PowerToughnessModifiersSet

Source§

impl AbilityTreeNode for ContinuousEffect

Source§

impl AbilityTreeNode for ContinuousEffectModifyObject

Source§

impl AbilityTreeNode for ContinuousEffectReplacementEvent

Source§

impl AbilityTreeNode for CostModificationCostLess

Source§

impl AbilityTreeNode for CostModificationCostMore

Source§

impl AbilityTreeNode for CostModificationCostSet

Source§

impl AbilityTreeNode for CostModificationEffect

Source§

impl AbilityTreeNode for StaticAbility

Source§

impl AbilityTreeNode for AbilityWordAbility

Source§

impl AbilityTreeNode for KeywordAbility

Source§

impl AbilityTreeNode for TriggerCondition

Source§

impl AbilityTreeNode for TriggeredAbility

Source§

impl AbilityTreeNode for TokenLayout

Source§

impl AbilityTreeNode for Colors

Source§

impl AbilityTreeNode for ConditionEventOccured

Source§

impl AbilityTreeNode for ConditionObjectMatchSpecifiers

Source§

impl AbilityTreeNode for ConditionThisIsYourTurn

Source§

impl AbilityTreeNode for ConditionalIf

Source§

impl AbilityTreeNode for ConditionalUnless

Source§

impl AbilityTreeNode for CounterOnPermanentReplacement

Source§

impl AbilityTreeNode for TokenCreationReplacement

Source§

impl AbilityTreeNode for EffectEventSource

Source§

impl AbilityTreeNode for PlayerEventSource

Source§

impl AbilityTreeNode for CreateTokensEvent

Source§

impl AbilityTreeNode for CreatureActionEvent

Source§

impl AbilityTreeNode for CreatureAttacksAction

Source§

impl AbilityTreeNode for CreatureDealsCombatDamageAction

Source§

impl AbilityTreeNode for CreatureDiesAction

Source§

impl AbilityTreeNode for EntersTheBattlefieldEvent

Source§

impl AbilityTreeNode for LifeGainedEvent

Source§

impl AbilityTreeNode for PlayerActionEvent

Source§

impl AbilityTreeNode for PlayerAttacksAction

Source§

impl AbilityTreeNode for PlayerCastsSpellEvent

Source§

impl AbilityTreeNode for PutCounterOnPermanentEvent

Source§

impl AbilityTreeNode for ChooseImperative

Source§

impl AbilityTreeNode for CounterOnPermanent

Source§

impl AbilityTreeNode for CreateTokenImperative

Source§

impl AbilityTreeNode for DamagesDealt

Source§

impl AbilityTreeNode for DealsDamageImperative

Source§

impl AbilityTreeNode for DestroyImperative

Source§

impl AbilityTreeNode for DiscardImperative

Source§

impl AbilityTreeNode for DrawImperative

Source§

impl AbilityTreeNode for ExileFollowUpReturn

Source§

impl AbilityTreeNode for ExileImperative

Source§

impl AbilityTreeNode for GainLifeImperative

Source§

impl AbilityTreeNode for GenerateContinuousEffectImperative

Source§

impl AbilityTreeNode for ImperativeList

Source§

impl AbilityTreeNode for PutCountersImperative

Source§

impl AbilityTreeNode for RemovableCounterOnPermanent

Source§

impl AbilityTreeNode for RemoveCountersImperative

Source§

impl AbilityTreeNode for ReturnImperative

Source§

impl AbilityTreeNode for SacrificeImperative

Source§

impl AbilityTreeNode for TokenCreation

Source§

impl AbilityTreeNode for FixedNumber

Source§

impl AbilityTreeNode for OrMoreNumber

Source§

impl AbilityTreeNode for UpToNumber

Source§

impl AbilityTreeNode for XNumber

Source§

impl AbilityTreeNode for AnotherObjectSpecifier

Source§

impl AbilityTreeNode for boseiju::ability_tree::object::ArtifactSubtype

Source§

impl AbilityTreeNode for boseiju::ability_tree::object::BattleSubtype

Source§

impl AbilityTreeNode for CardObjectKind

Source§

impl AbilityTreeNode for CardType

Source§

impl AbilityTreeNode for CastSpecifier

Source§

impl AbilityTreeNode for ControlSpecifier

Source§

impl AbilityTreeNode for boseiju::ability_tree::object::CreatureSubtype

Source§

impl AbilityTreeNode for boseiju::ability_tree::object::EnchantmentSubtype

Source§

impl AbilityTreeNode for boseiju::ability_tree::object::LandSubtype

Source§

impl AbilityTreeNode for NotPreviouslySelectedObjectSpecifier

Source§

impl AbilityTreeNode for ObjectAttachedTo

Source§

impl AbilityTreeNode for PermanentObjectKind

Source§

impl AbilityTreeNode for boseiju::ability_tree::object::PlaneswalkerSubtype

Source§

impl AbilityTreeNode for PreviouslyMentionnedObject

Source§

impl AbilityTreeNode for SelfReferencingObject

Source§

impl AbilityTreeNode for SpecifiedObject

Source§

impl AbilityTreeNode for SpecifierAndList

Source§

impl AbilityTreeNode for SpecifierOrList

Source§

impl AbilityTreeNode for SpecifierOrOfAndList

Source§

impl AbilityTreeNode for SpellObjectKind

Source§

impl AbilityTreeNode for SpellSubtype

Source§

impl AbilityTreeNode for Supertype

Source§

impl AbilityTreeNode for PlayerSpecifierObjectController

Source§

impl AbilityTreeNode for PlayerSpecifierObjectOwner

Source§

impl AbilityTreeNode for MayAbility

Source§

impl AbilityTreeNode for ReplacableImperatives

Source§

impl AbilityTreeNode for AbilityTree

Source§

impl AbilityTreeNode for AbilityWord

Source§

impl AbilityTreeNode for Color

Source§

impl AbilityTreeNode for Counter

Source§

impl AbilityTreeNode for ManaCost

Source§

impl AbilityTreeNode for boseiju::ability_tree::type_line::ArtifactSubtype

Source§

impl AbilityTreeNode for boseiju::ability_tree::type_line::BattleSubtype

Source§

impl AbilityTreeNode for ConspiracySubtype

Source§

impl AbilityTreeNode for boseiju::ability_tree::type_line::CreatureSubtype

Source§

impl AbilityTreeNode for DungeonSubtype

Source§

impl AbilityTreeNode for EmblemSubtype

Source§

impl AbilityTreeNode for boseiju::ability_tree::type_line::EnchantmentSubtype

Source§

impl AbilityTreeNode for HeroSubtype

Source§

impl AbilityTreeNode for InstantSubtype

Source§

impl AbilityTreeNode for KindredSubtype

Source§

impl AbilityTreeNode for boseiju::ability_tree::type_line::LandSubtype

Source§

impl AbilityTreeNode for PhenomenonSubtype

Source§

impl AbilityTreeNode for PlaneSubtype

Source§

impl AbilityTreeNode for boseiju::ability_tree::type_line::PlaneswalkerSubtype

Source§

impl AbilityTreeNode for SchemeSubtype

Source§

impl AbilityTreeNode for SorcerySubtype

Source§

impl AbilityTreeNode for TypeLine

Source§

impl AbilityTreeNode for VanguardSubtype

Source§

impl AbilityTreeNode for OwnedZone