import type { VfxKind } from "../game/events.js"; /** * A named visual flavor for a one-shot `combat.vfx` burst: the archetype (`kind`), * a `0xRRGGBB` tint, and optional default `durationMs`/`radius`. Purely presentation — * a preset never touches damage, range, or any authoritative value; it just answers * "what does this attack look like" so a game does not hand-roll colors and archetypes. */ export interface VfxPreset { kind: VfxKind; /** `0xRRGGBB` tint. */ color: number; /** Overrides the shell's per-`kind` default lifetime when set. */ durationMs?: number; /** Default effect radius for `nova`/aura flavors. */ radius?: number; } /** * Ready-made visual flavors for the things players actually shoot, swing, and cast — * so `ctx.scene.entity.vfx({ preset: "arrow", from, to })` renders a visible bolt with * zero tuning, and `"lightning"`, `"web"`, `"slash"`, `"shield"`, `"heal"`, `"explosion"` * likewise just work. Each entry only picks a `kind` (`projectile | beam | nova | glow | * spark`), a color, and a lifetime; it is visual vocabulary (like named CSS colors), not a * gameplay archetype — combat numbers stay in the caller's own effect/ability data. Any * field passed to `vfx()` overrides the preset, and unknown names fall back to `spark` so a * flavor typo still shows *something* rather than nothing. * * @capability vfx-presets render a named attack visual (arrow, fireball, lightning, web, slash, shield, heal, explosion) in one call */ export declare const vfxPresets: { readonly arrow: { readonly kind: "projectile"; readonly color: 14207392; }; readonly bolt: { readonly kind: "projectile"; readonly color: 16777215; }; readonly fireball: { readonly kind: "projectile"; readonly color: 16738842; readonly durationMs: 460; }; readonly firebolt: { readonly kind: "projectile"; readonly color: 16742954; }; readonly frostbolt: { readonly kind: "projectile"; readonly color: 9360127; }; readonly ice: { readonly kind: "projectile"; readonly color: 9360127; }; readonly poison: { readonly kind: "projectile"; readonly color: 8841322; }; readonly shadowbolt: { readonly kind: "projectile"; readonly color: 10116592; }; readonly arcane: { readonly kind: "projectile"; readonly color: 14256895; }; readonly magicMissile: { readonly kind: "projectile"; readonly color: 14256895; }; readonly holybolt: { readonly kind: "projectile"; readonly color: 16771488; }; readonly rock: { readonly kind: "projectile"; readonly color: 11049606; }; readonly bullet: { readonly kind: "projectile"; readonly color: 16773808; readonly durationMs: 140; }; readonly lightning: { readonly kind: "beam"; readonly color: 12576511; readonly durationMs: 200; }; readonly laser: { readonly kind: "beam"; readonly color: 16731469; }; readonly beam: { readonly kind: "beam"; readonly color: 9360127; }; readonly web: { readonly kind: "beam"; readonly color: 15790320; readonly durationMs: 320; }; readonly chain: { readonly kind: "beam"; readonly color: 16771488; }; readonly slash: { readonly kind: "spark"; readonly color: 14078148; }; readonly sword: { readonly kind: "spark"; readonly color: 14078148; }; readonly melee: { readonly kind: "spark"; readonly color: 14078148; }; readonly spark: { readonly kind: "spark"; readonly color: 16773808; }; readonly hit: { readonly kind: "spark"; readonly color: 16765562; }; readonly explosion: { readonly kind: "nova"; readonly color: 16747066; readonly radius: 3; }; readonly blast: { readonly kind: "nova"; readonly color: 16747066; readonly radius: 3; }; readonly shockwave: { readonly kind: "nova"; readonly color: 12576511; readonly radius: 3; }; readonly frostNova: { readonly kind: "nova"; readonly color: 9360127; readonly radius: 3; }; readonly heal: { readonly kind: "glow"; readonly color: 8841322; }; readonly buff: { readonly kind: "glow"; readonly color: 16771488; }; readonly shield: { readonly kind: "glow"; readonly color: 9360127; }; readonly cast: { readonly kind: "glow"; readonly color: 14256895; }; }; /** A named key into {@link vfxPresets} (`"arrow" | "fireball" | "lightning" | "web" | "slash" | "shield" | "heal" | ...`). */ export type VfxPresetName = keyof typeof vfxPresets; /** The fallback flavor used when a `vfx()` call names an unknown preset — so a typo still shows a spark instead of nothing. */ export declare const DEFAULT_VFX_PRESET: VfxPresetName; /** * Resolve a named visual flavor into a concrete `{ kind, color, durationMs?, radius? }`, * with any provided `overrides` winning field by field. An unknown name resolves to * {@link DEFAULT_VFX_PRESET} rather than throwing, so a flavor typo degrades to a visible * spark. Used by `ctx.scene.entity.vfx({ preset })`; call it directly when you need the raw * numbers (e.g. to seed a retained `vfxInstance` from the same vocabulary). * * @capability vfx-preset-resolve turn a named attack flavor into concrete vfx kind/color/duration with per-field overrides */ export declare function resolveVfxPreset(name: string | undefined, overrides?: Partial): VfxPreset;