import type { StatModifierSet } from "../stats/statModifiers.js"; export type TalentRequirement = string | { nodeId: string; rank: number; }; export interface TalentNodeDef { id: string; branch?: string; maxRank: number; requires?: readonly TalentRequirement[]; requiresPointsInBranch?: number; modifiersPerRank?: StatModifierSet; grantsAbilities?: readonly string[]; } export type TalentAllocateReason = "unknown-node" | "max-rank" | "no-points" | "requires" | "branch-points"; export type TalentAllocateResult = { ok: true; } | { ok: false; reason: TalentAllocateReason; }; export interface ResolvedTalents { stats: StatModifierSet; abilities: readonly string[]; } export interface TalentSnapshot { points: number; ranks: Record; } export interface TalentTreeConfig { nodes: readonly TalentNodeDef[]; points?: number; } export interface TalentTree { rank(nodeId: string): number; pointsAvailable(): number; pointsSpent(): number; pointsInBranch(branch: string): number; grantPoints(amount: number): void; canAllocate(nodeId: string): TalentAllocateResult; allocate(nodeId: string): TalentAllocateResult; resolved(): ResolvedTalents; reset(): void; snapshot(): TalentSnapshot; hydrate(snapshot: TalentSnapshot): void; } export declare function createTalentTree(config: TalentTreeConfig): TalentTree;