@kernel.chat/kbot 3.88.0 → 3.94.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,130 @@
1
+ /**
2
+ * rom-engine.ts — ROM-hack-inspired rendering engine
3
+ *
4
+ * Core rendering engine that brings SNES/GBA-era visual techniques to Canvas 2D:
5
+ * 1. Indexed color palette system (256 entries, packed RGBA uint32)
6
+ * 2. Palette cycling (Mark Ferrari technique — loop & pingpong modes)
7
+ * 3. HDMA-style per-scanline sky gradient (night/day/sunset/dawn)
8
+ * 4. Parallax layer system (4-5 layers per biome)
9
+ * 5. Frame budget tracking with adaptive quality
10
+ *
11
+ * References:
12
+ * - SNES PPU: H-Blank DMA (HDMA) for per-scanline register writes
13
+ * - Mark Ferrari / CanvasCycle: palette rotation as animation primitive
14
+ * - GBA ROM hacks: HBlank parallax, hardware blending, 15-bit palettes
15
+ */
16
+ export declare function packRGBA(r: number, g: number, b: number, a?: number): number;
17
+ export declare function unpackRGBA(packed: number): [number, number, number, number];
18
+ export interface RomPalette {
19
+ colors: Uint32Array;
20
+ base: Uint32Array;
21
+ }
22
+ export declare function createPalette(): RomPalette;
23
+ /** Reset palette to base colors */
24
+ export declare function resetPalette(palette: RomPalette): void;
25
+ export interface PaletteCycle {
26
+ start: number;
27
+ end: number;
28
+ speed: number;
29
+ direction: 1 | -1;
30
+ mode: 'loop' | 'pingpong';
31
+ accumulator: number;
32
+ pingpongDir: 1 | -1;
33
+ }
34
+ export declare function createDefaultCycles(): PaletteCycle[];
35
+ export declare function tickPaletteCycles(palette: RomPalette, cycles: PaletteCycle[], deltaMs: number): boolean;
36
+ export interface HdmaEntry {
37
+ r: number;
38
+ g: number;
39
+ b: number;
40
+ fogDensity: number;
41
+ scrollOffset: number;
42
+ }
43
+ export declare function buildHdmaTable(timeOfDay: string, _weather: string, height: number): HdmaEntry[];
44
+ export declare function renderHdmaSky(ctx: CanvasRenderingContext2D, hdma: HdmaEntry[], width: number): void;
45
+ export interface ParallaxLayer {
46
+ canvas: OffscreenCanvas | null;
47
+ imageData: ImageData | null;
48
+ scrollFactor: number;
49
+ yOffset: number;
50
+ opacity: number;
51
+ width: number;
52
+ height: number;
53
+ renderFn: ((ctx: CanvasRenderingContext2D, w: number, h: number) => void) | null;
54
+ }
55
+ export interface BiomeParallax {
56
+ layers: ParallaxLayer[];
57
+ biome: string;
58
+ }
59
+ export declare function buildBiomeParallax(biome: string, width: number, height: number): BiomeParallax;
60
+ export declare function renderParallax(ctx: CanvasRenderingContext2D, parallax: BiomeParallax, cameraX: number, _frame: number): void;
61
+ export interface FrameBudget {
62
+ timings: number[];
63
+ budget: number;
64
+ overBudget: boolean;
65
+ dropLevel: number;
66
+ }
67
+ export declare function createFrameBudget(budgetMs?: number): FrameBudget;
68
+ export declare function startFrameTiming(): number;
69
+ export declare function endFrameTiming(budget: FrameBudget, startTime: number): void;
70
+ export declare function shouldDropQuality(budget: FrameBudget): number;
71
+ export interface RomEngineState {
72
+ palette: RomPalette;
73
+ cycles: PaletteCycle[];
74
+ hdmaTable: HdmaEntry[];
75
+ parallax: BiomeParallax | null;
76
+ frameBudget: FrameBudget;
77
+ currentBiome: string;
78
+ currentTimeOfDay: string;
79
+ }
80
+ export declare function initRomEngine(biome?: string, timeOfDay?: string): RomEngineState;
81
+ export declare function tickRomEngine(state: RomEngineState, deltaMs: number): void;
82
+ export declare function renderRomBackground(ctx: CanvasRenderingContext2D, state: RomEngineState, cameraX: number, frame: number, width: number, height: number): void;
83
+ /**
84
+ * renderWaterSurface — Draws an animated water body using palette cycling colors.
85
+ *
86
+ * Draws horizontal strips where each strip uses a different palette index from
87
+ * the water range (32-47). As tickPaletteCycles rotates indices 32-39 and 40-47,
88
+ * the strips shift color — creating flowing water animation with ZERO new frames.
89
+ *
90
+ * The water surface includes sine-wave distortion for a ripple effect and
91
+ * highlight bands at the top for specular reflection.
92
+ */
93
+ export declare function renderWaterSurface(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, palette: RomPalette, frame: number): void;
94
+ /**
95
+ * renderLavaPool — Draws animated lava using palette cycling + dithering.
96
+ *
97
+ * Uses palette range 64-79 (lava). The dithered checkerboard pattern makes
98
+ * adjacent pixels use offset palette indices, so when the palette cycles in
99
+ * pingpong mode the lava appears to bubble and pulse.
100
+ */
101
+ export declare function renderLavaPool(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, palette: RomPalette, frame: number): void;
102
+ /**
103
+ * renderCycledSky — Draws animated sky using palette range 112-127 during
104
+ * sunset/dawn for color shifting. During day/night, renders a subtle gradient
105
+ * overlay using the sky palette.
106
+ *
107
+ * The sky palette has 16 entries from deep blue to light horizon. During
108
+ * sunset/dawn the cycling rotates these entries, creating a smooth color shift
109
+ * across the sky height.
110
+ */
111
+ export declare function renderCycledSky(ctx: CanvasRenderingContext2D, width: number, skyHeight: number, palette: RomPalette, timeOfDay: string): void;
112
+ /**
113
+ * renderFireColumn — Draws animated fire using palette range 144-159.
114
+ * Each column of the fire has a randomized height offset seeded by position,
115
+ * and the palette cycling creates the flickering animation.
116
+ */
117
+ export declare function renderFireColumn(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, palette: RomPalette, frame: number): void;
118
+ /**
119
+ * renderPaletteCycledElement — Master dispatcher. Draws a named element type
120
+ * at the given position using the palette-cycled colors.
121
+ *
122
+ * Element types: 'water', 'lava', 'fire', 'sky'
123
+ */
124
+ export declare function renderPaletteCycledElement(ctx: CanvasRenderingContext2D, element: 'water' | 'lava' | 'fire' | 'sky', x: number, y: number, width: number, height: number, palette: RomPalette, frame: number, timeOfDay?: string): void;
125
+ /**
126
+ * Render 6 test frames showing palette cycling for water, lava, fire, and sky.
127
+ * Each frame advances the palette cycles by 100ms, demonstrating the animation.
128
+ */
129
+ export declare function renderCycleTestFrames(outDir: string, prefix: string): Promise<string>;
130
+ //# sourceMappingURL=rom-engine.d.ts.map