import { type AttackMeta } from "./attackTags.js"; export type DefenseKind = "parry" | "block" | "dodge"; export interface DefensiveWindowConfig { kind: DefenseKind; startupMs?: number; activeMs: number; recoveryMs?: number; iframes?: { fromMs: number; toMs: number; }; } export type DefenseOutcome = "parry" | "block" | "iframe" | "hit"; /** * Result of resolving an incoming hit against a defensive window: `outcome` is the graded defense * (`"parry"`/`"block"`/`"iframe"`/`"hit"`) and `perfect` is true when the input landed inside the * tight just-frame at the window's start rather than its wider active span. */ export interface DefenseResolution { outcome: DefenseOutcome; perfect: boolean; } export declare function windowActiveAt(config: DefensiveWindowConfig, elapsedMs: number): boolean; export declare function iframeActiveAt(config: DefensiveWindowConfig, elapsedMs: number): boolean; export declare function totalWindowMs(config: DefensiveWindowConfig): number; export interface ResolveDefenseInput { config: DefensiveWindowConfig; elapsedMs: number; attack: AttackMeta; } export declare function resolveDefense(input: ResolveDefenseInput): DefenseResolution; export interface DefensiveWindow { open(nowMs: number): void; close(): void; isOpen(nowMs: number): boolean; evaluate(nowMs: number, attack: AttackMeta): DefenseResolution; isInvulnerable(nowMs: number): boolean; } /** * Open a timed defensive window — block, parry, or i-frames — and test incoming hits against it. * * @capability parry-window time a block/parry/i-frame defensive window against incoming hits */ export declare function createDefensiveWindow(config: DefensiveWindowConfig): DefensiveWindow;