Flexweave
Building an RPG Combat Runtime

2. Attach Data and Tags

Add faction data, structured tags, and deterministic enemy selection.

Attached data gives objects runtime meaning. Tags give abilities and effects structured labels that stores can query.

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum Faction {
    Player,
    Enemy,
}

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
enum CombatTag {
    Ability,
    Slash,
    Effect,
    Damage,
    Buff,
    Cooldown,
}

A tag is a grouped path, not a flat string:

use flexweave::{Tag, TagSet};

let slash = Tag::new([CombatTag::Ability, CombatTag::Slash]);
let damage = Tag::new([CombatTag::Effect, CombatTag::Damage]);

let tags = TagSet::new([slash, damage]);

Target selection stays caller-owned. Flexweave only preserves object iteration order:

let targets = flexweave::query::collect_where(&objects, |candidate| {
    candidate != player
        && factions.get(candidate).is_some_and(|faction| *faction == Faction::Enemy)
});

The result is deterministic because collect_where walks live object ids in store order.

Next: Add Attributes.