nova64 0.2.1 → 0.2.2

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.
Files changed (2) hide show
  1. package/package.json +6 -2
  2. package/runtime/index.d.ts +606 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nova64",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Nova64 — Ultimate 3D Fantasy Console runtime for JavaScript games powered by Three.js",
5
5
  "keywords": [
6
6
  "fantasy-console",
@@ -22,8 +22,12 @@
22
22
  },
23
23
  "type": "module",
24
24
  "main": "./runtime/index.js",
25
+ "types": "./runtime/index.d.ts",
25
26
  "exports": {
26
- ".": "./runtime/index.js",
27
+ ".": {
28
+ "types": "./runtime/index.d.ts",
29
+ "default": "./runtime/index.js"
30
+ },
27
31
  "./runtime/*": "./runtime/*.js",
28
32
  "./runtime/api-3d/*": "./runtime/api-3d/*.js",
29
33
  "./runtime/ui/*": "./runtime/ui/*.js"
@@ -0,0 +1,606 @@
1
+ // Nova64 — Type declarations
2
+ // https://github.com/seacloud9/nova64
3
+
4
+ // ---------------------------------------------------------------------------
5
+ // Shared primitives
6
+ // ---------------------------------------------------------------------------
7
+
8
+ /** Hex colour integer, e.g. 0xff0000 for red. */
9
+ export type Color = number;
10
+
11
+ /** Mesh identifier returned by primitive-creation functions. */
12
+ export type MeshId = number;
13
+
14
+ /** Light identifier returned by createPointLight. */
15
+ export type LightId = number;
16
+
17
+ /** Instanced-mesh identifier returned by createInstancedMesh. */
18
+ export type InstancedMeshId = number;
19
+
20
+ /** LOD identifier returned by createLODMesh. */
21
+ export type LODId = number;
22
+
23
+ /** Panel object returned by createPanel. */
24
+ export interface Panel {
25
+ x: number;
26
+ y: number;
27
+ width: number;
28
+ height: number;
29
+ options: PanelOptions;
30
+ }
31
+
32
+ /** Button object returned by createButton. */
33
+ export interface Button {
34
+ x: number;
35
+ y: number;
36
+ width: number;
37
+ height: number;
38
+ text: string;
39
+ callback: () => void;
40
+ options: ButtonOptions;
41
+ hovered: boolean;
42
+ pressed: boolean;
43
+ }
44
+
45
+ export interface MousePosition {
46
+ x: number;
47
+ y: number;
48
+ }
49
+
50
+ // ---------------------------------------------------------------------------
51
+ // Material / primitive options
52
+ // ---------------------------------------------------------------------------
53
+
54
+ export interface MeshOptions {
55
+ /** @default 'standard' */
56
+ material?: 'standard' | 'holographic' | 'metallic' | 'emissive' | 'wireframe';
57
+ roughness?: number;
58
+ metalness?: number;
59
+ emissive?: Color;
60
+ emissiveIntensity?: number;
61
+ transparent?: boolean;
62
+ opacity?: number;
63
+ wireframe?: boolean;
64
+ flatShading?: boolean;
65
+ segments?: number;
66
+ size?: number;
67
+ height?: number;
68
+ width?: number;
69
+ }
70
+
71
+ export interface LODLevel {
72
+ shape?: 'cube' | 'sphere' | 'plane' | 'cylinder' | 'cone';
73
+ size?: number;
74
+ color?: Color;
75
+ distance: number;
76
+ options?: MeshOptions;
77
+ }
78
+
79
+ export interface PBRMaps {
80
+ normalMap?: THREE.Texture | null;
81
+ roughnessMap?: THREE.Texture | null;
82
+ metalnessMap?: THREE.Texture | null;
83
+ aoMap?: THREE.Texture | null;
84
+ }
85
+
86
+ // ---------------------------------------------------------------------------
87
+ // UI options
88
+ // ---------------------------------------------------------------------------
89
+
90
+ export interface PanelOptions {
91
+ color?: Color;
92
+ border?: Color;
93
+ borderWidth?: number;
94
+ alpha?: number;
95
+ radius?: number;
96
+ title?: string;
97
+ }
98
+
99
+ export interface ButtonOptions {
100
+ normalColor?: Color;
101
+ hoverColor?: Color;
102
+ pressedColor?: Color;
103
+ textColor?: Color;
104
+ borderColor?: Color;
105
+ borderWidth?: number;
106
+ radius?: number;
107
+ fontSize?: number;
108
+ }
109
+
110
+ export interface ProgressBarOptions {
111
+ backgroundColor?: Color;
112
+ fillColor?: Color;
113
+ borderColor?: Color;
114
+ showText?: boolean;
115
+ textColor?: Color;
116
+ radius?: number;
117
+ }
118
+
119
+ // ---------------------------------------------------------------------------
120
+ // Stats
121
+ // ---------------------------------------------------------------------------
122
+
123
+ export interface Stats3D {
124
+ meshCount: number;
125
+ lightCount: number;
126
+ instancedMeshCount: number;
127
+ lodCount: number;
128
+ }
129
+
130
+ // ---------------------------------------------------------------------------
131
+ // Logger
132
+ // ---------------------------------------------------------------------------
133
+
134
+ export interface LogRecord {
135
+ level: number;
136
+ message: string;
137
+ args: unknown[];
138
+ timestamp: number;
139
+ }
140
+
141
+ export declare const LogLevel: Readonly<{
142
+ DEBUG: 0;
143
+ INFO: 1;
144
+ WARN: 2;
145
+ ERROR: 3;
146
+ NONE: 4;
147
+ }>;
148
+
149
+ export declare class Logger {
150
+ level: number;
151
+ history: LogRecord[];
152
+ debug(message: string, ...args: unknown[]): void;
153
+ info(message: string, ...args: unknown[]): void;
154
+ warn(message: string, ...args: unknown[]): void;
155
+ error(message: string, ...args: unknown[]): void;
156
+ setLevel(level: number): void;
157
+ getHistory(): LogRecord[];
158
+ clearHistory(): void;
159
+ }
160
+
161
+ export declare const logger: Logger;
162
+
163
+ // ---------------------------------------------------------------------------
164
+ // 3D API
165
+ // ---------------------------------------------------------------------------
166
+
167
+ export interface ThreeDApiInstance {
168
+ // Primitives
169
+ createCube(
170
+ size?: number,
171
+ color?: Color,
172
+ position?: [number, number, number],
173
+ options?: MeshOptions
174
+ ): MeshId;
175
+ createSphere(
176
+ radius?: number,
177
+ color?: Color,
178
+ position?: [number, number, number],
179
+ segments?: number,
180
+ options?: MeshOptions
181
+ ): MeshId;
182
+ createCylinder(
183
+ radiusTop?: number,
184
+ radiusBottom?: number,
185
+ height?: number,
186
+ color?: Color,
187
+ position?: [number, number, number],
188
+ options?: MeshOptions
189
+ ): MeshId;
190
+ createPlane(
191
+ width?: number,
192
+ height?: number,
193
+ color?: Color,
194
+ position?: [number, number, number]
195
+ ): MeshId;
196
+ createAdvancedCube(
197
+ size?: number,
198
+ materialOptions?: MeshOptions,
199
+ position?: [number, number, number]
200
+ ): MeshId;
201
+ createAdvancedSphere(
202
+ radius?: number,
203
+ materialOptions?: MeshOptions,
204
+ position?: [number, number, number]
205
+ ): MeshId;
206
+ createTorus(
207
+ radius?: number,
208
+ tube?: number,
209
+ color?: Color,
210
+ position?: [number, number, number],
211
+ options?: MeshOptions
212
+ ): MeshId;
213
+ createCone(
214
+ radius?: number,
215
+ height?: number,
216
+ color?: Color,
217
+ position?: [number, number, number],
218
+ options?: MeshOptions
219
+ ): MeshId;
220
+ createCapsule(
221
+ radius?: number,
222
+ length?: number,
223
+ color?: Color,
224
+ position?: [number, number, number],
225
+ options?: MeshOptions
226
+ ): MeshId;
227
+
228
+ // Mesh management
229
+ destroyMesh(id: MeshId): void;
230
+ removeMesh(id: MeshId): void;
231
+ getMesh(id: MeshId): THREE.Mesh | undefined;
232
+
233
+ // Model loading
234
+ loadModel(
235
+ url: string,
236
+ position?: [number, number, number],
237
+ options?: MeshOptions
238
+ ): Promise<MeshId>;
239
+ playAnimation(
240
+ meshId: MeshId,
241
+ nameOrIndex?: string | number,
242
+ loop?: boolean,
243
+ timeScale?: number
244
+ ): void;
245
+ updateAnimations(dt: number): void;
246
+ loadTexture(url: string): Promise<THREE.Texture>;
247
+
248
+ // Transforms
249
+ setPosition(meshId: MeshId, x: number, y: number, z: number): void;
250
+ setRotation(meshId: MeshId, x: number, y: number, z: number): void;
251
+ setScale(meshId: MeshId, x: number, y: number, z: number): void;
252
+ getPosition(meshId: MeshId): { x: number; y: number; z: number } | null;
253
+ getRotation(meshId: MeshId): { x: number; y: number; z: number } | null;
254
+ rotateMesh(meshId: MeshId, dX: number, dY: number, dZ: number): void;
255
+ moveMesh(meshId: MeshId, x: number, y: number, z: number): void;
256
+
257
+ // Mesh helpers
258
+ setFlatShading(meshId: MeshId, enabled?: boolean): void;
259
+ setMeshVisible(meshId: MeshId, visible: boolean): void;
260
+ setMeshOpacity(meshId: MeshId, opacity: number): void;
261
+ setCastShadow(meshId: MeshId, cast: boolean): void;
262
+ setReceiveShadow(meshId: MeshId, receive: boolean): void;
263
+
264
+ // Camera
265
+ setCameraPosition(x: number, y: number, z: number): void;
266
+ setCameraTarget(x: number, y: number, z: number): void;
267
+ setCameraLookAt(direction: [number, number, number]): void;
268
+ setCameraFOV(fov: number): void;
269
+
270
+ // Atmosphere
271
+ setFog(color: Color, near?: number, far?: number): void;
272
+ clearFog(): void;
273
+ setLightDirection(x: number, y: number, z: number): void;
274
+ setLightColor(color: Color): void;
275
+ setAmbientLight(color: Color, intensity?: number): void;
276
+ setDirectionalLight(direction: [number, number, number], color?: Color, intensity?: number): void;
277
+
278
+ // Scene
279
+ clearScene(): void;
280
+ setupScene(opts?: { fog?: boolean; grid?: boolean; axes?: boolean }): void;
281
+
282
+ // Effects
283
+ enablePixelation(factor?: number): void;
284
+ enableDithering(enabled?: boolean): void;
285
+
286
+ // Dynamic lights
287
+ createPointLight(
288
+ color?: Color,
289
+ intensity?: number,
290
+ distance?: number,
291
+ x?: number,
292
+ y?: number,
293
+ z?: number
294
+ ): LightId;
295
+ setPointLightPosition(lightId: LightId, x: number, y: number, z: number): void;
296
+ setPointLightColor(lightId: LightId, color: Color): void;
297
+ removeLight(lightId: LightId): void;
298
+
299
+ // GPU instancing
300
+ createInstancedMesh(
301
+ shape?: 'cube' | 'sphere' | 'plane' | 'cylinder',
302
+ count?: number,
303
+ color?: Color,
304
+ options?: MeshOptions
305
+ ): InstancedMeshId;
306
+ setInstanceTransform(
307
+ instancedId: InstancedMeshId,
308
+ index: number,
309
+ x?: number,
310
+ y?: number,
311
+ z?: number,
312
+ rx?: number,
313
+ ry?: number,
314
+ rz?: number,
315
+ sx?: number,
316
+ sy?: number,
317
+ sz?: number
318
+ ): boolean;
319
+ setInstanceColor(instancedId: InstancedMeshId, index: number, color: Color): boolean;
320
+ finalizeInstances(instancedId: InstancedMeshId): boolean;
321
+ removeInstancedMesh(instancedId: InstancedMeshId): boolean;
322
+
323
+ // LOD system
324
+ createLODMesh(levels?: LODLevel[], position?: [number, number, number]): LODId;
325
+ setLODPosition(lodId: LODId, x: number, y: number, z: number): void;
326
+ removeLODMesh(lodId: LODId): boolean;
327
+ updateLODs(): void;
328
+
329
+ // Normal / PBR maps
330
+ loadNormalMap(url: string): Promise<THREE.Texture>;
331
+ setNormalMap(meshId: MeshId, texture: THREE.Texture): void;
332
+ setPBRMaps(meshId: MeshId, maps?: PBRMaps): void;
333
+
334
+ // Raycasting / stats
335
+ raycastFromCamera(x: number, y: number): THREE.Intersection | null;
336
+ get3DStats(): Stats3D;
337
+
338
+ // Direct Three.js access
339
+ getScene(): THREE.Scene;
340
+ getCamera(): THREE.PerspectiveCamera;
341
+ getRenderer(): THREE.WebGLRenderer;
342
+
343
+ exposeTo(target: object): void;
344
+ }
345
+
346
+ export declare function threeDApi(gpu: unknown): ThreeDApiInstance;
347
+
348
+ // ---------------------------------------------------------------------------
349
+ // UI API
350
+ // ---------------------------------------------------------------------------
351
+
352
+ export interface UIApiInstance {
353
+ // Font / text
354
+ setFont(fontName: string): void;
355
+ getFont(): string;
356
+ setTextAlign(align: CanvasTextAlign): void;
357
+ setTextBaseline(baseline: CanvasTextBaseline): void;
358
+ measureText(text: string, scale?: number): number;
359
+ drawText(text: string, x: number, y: number, color?: Color, scale?: number): void;
360
+ drawTextShadow(
361
+ text: string,
362
+ x: number,
363
+ y: number,
364
+ color?: Color,
365
+ shadowColor?: Color,
366
+ scale?: number
367
+ ): void;
368
+ drawTextOutline(
369
+ text: string,
370
+ x: number,
371
+ y: number,
372
+ color?: Color,
373
+ outlineColor?: Color,
374
+ scale?: number
375
+ ): void;
376
+
377
+ // Panels
378
+ createPanel(x: number, y: number, width: number, height: number, options?: PanelOptions): Panel;
379
+ drawPanel(panel: Panel): void;
380
+ drawAllPanels(): void;
381
+ removePanel(panel: Panel): void;
382
+ clearPanels(): void;
383
+
384
+ // Buttons
385
+ createButton(
386
+ x: number,
387
+ y: number,
388
+ width: number,
389
+ height: number,
390
+ text: string,
391
+ callback: () => void,
392
+ options?: ButtonOptions
393
+ ): Button;
394
+ updateButton(button: Button): void;
395
+ drawButton(button: Button): void;
396
+ updateAllButtons(): void;
397
+ drawAllButtons(): void;
398
+ removeButton(button: Button): void;
399
+ clearButtons(): void;
400
+
401
+ // Progress bar
402
+ drawProgressBar(
403
+ x: number,
404
+ y: number,
405
+ width: number,
406
+ height: number,
407
+ value: number,
408
+ maxValue: number,
409
+ options?: ProgressBarOptions
410
+ ): void;
411
+
412
+ // Shapes
413
+ drawRoundedRect(
414
+ x: number,
415
+ y: number,
416
+ width: number,
417
+ height: number,
418
+ radius: number,
419
+ color: Color,
420
+ filled?: boolean
421
+ ): void;
422
+ drawGradientRect(
423
+ x: number,
424
+ y: number,
425
+ width: number,
426
+ height: number,
427
+ color1: Color,
428
+ color2: Color,
429
+ vertical?: boolean
430
+ ): void;
431
+
432
+ // Layout
433
+ centerX(width: number, screenWidth?: number): number;
434
+ centerY(height: number, screenHeight?: number): number;
435
+ grid(
436
+ cols: number,
437
+ rows: number,
438
+ cellWidth: number,
439
+ cellHeight: number,
440
+ paddingX?: number,
441
+ paddingY?: number
442
+ ): Array<{ x: number; y: number; col: number; row: number }>;
443
+
444
+ // Mouse
445
+ setMousePosition(x: number, y: number): void;
446
+ setMouseButton(down: boolean): void;
447
+ getMousePosition(): MousePosition;
448
+ isMouseDown(): boolean;
449
+ isMousePressed(): boolean;
450
+
451
+ // Palettes
452
+ uiColors: Record<string, Color>;
453
+ uiFonts: Record<string, string>;
454
+
455
+ exposeTo(target: object): void;
456
+ }
457
+
458
+ export declare function uiApi(ctx2d: CanvasRenderingContext2D | null): UIApiInstance;
459
+
460
+ // ---------------------------------------------------------------------------
461
+ // Sub-module factory types (for tree-shaking imports)
462
+ // ---------------------------------------------------------------------------
463
+
464
+ export declare function materialsModule(ctx: object): object;
465
+ export declare function primitivesModule(ctx: object): object;
466
+ export declare function transformsModule(ctx: object): object;
467
+ export declare function cameraModule(ctx: object): object;
468
+ export declare function lightsModule(ctx: object): object;
469
+ export declare function modelsModule(ctx: object): object;
470
+ export declare function instancingModule(ctx: object): object;
471
+ export declare function pbrModule(ctx: object): object;
472
+ export declare function sceneModule(ctx: object): object;
473
+
474
+ export declare function uiTextModule(ctx: object): object;
475
+ export declare function uiPanelsModule(ctx: object): object;
476
+ export declare function uiButtonsModule(ctx: object): object;
477
+ export declare function uiWidgetsModule(ctx: object): object;
478
+
479
+ // ---------------------------------------------------------------------------
480
+ // Global cart API (injected into globalThis at runtime)
481
+ // Augment with: declare global { ... } in your cart's .d.ts if needed.
482
+ // ---------------------------------------------------------------------------
483
+
484
+ export interface Nova64CartGlobals {
485
+ // 3D
486
+ createCube: ThreeDApiInstance['createCube'];
487
+ createSphere: ThreeDApiInstance['createSphere'];
488
+ createCylinder: ThreeDApiInstance['createCylinder'];
489
+ createPlane: ThreeDApiInstance['createPlane'];
490
+ createTorus: ThreeDApiInstance['createTorus'];
491
+ createCone: ThreeDApiInstance['createCone'];
492
+ createCapsule: ThreeDApiInstance['createCapsule'];
493
+ createAdvancedCube: ThreeDApiInstance['createAdvancedCube'];
494
+ createAdvancedSphere: ThreeDApiInstance['createAdvancedSphere'];
495
+ destroyMesh: ThreeDApiInstance['destroyMesh'];
496
+ removeMesh: ThreeDApiInstance['removeMesh'];
497
+ getMesh: ThreeDApiInstance['getMesh'];
498
+ loadModel: ThreeDApiInstance['loadModel'];
499
+ playAnimation: ThreeDApiInstance['playAnimation'];
500
+ updateAnimations: ThreeDApiInstance['updateAnimations'];
501
+ loadTexture: ThreeDApiInstance['loadTexture'];
502
+ setPosition: ThreeDApiInstance['setPosition'];
503
+ setRotation: ThreeDApiInstance['setRotation'];
504
+ setScale: ThreeDApiInstance['setScale'];
505
+ getPosition: ThreeDApiInstance['getPosition'];
506
+ getRotation: ThreeDApiInstance['getRotation'];
507
+ rotateMesh: ThreeDApiInstance['rotateMesh'];
508
+ moveMesh: ThreeDApiInstance['moveMesh'];
509
+ setFlatShading: ThreeDApiInstance['setFlatShading'];
510
+ setMeshVisible: ThreeDApiInstance['setMeshVisible'];
511
+ setMeshOpacity: ThreeDApiInstance['setMeshOpacity'];
512
+ setCastShadow: ThreeDApiInstance['setCastShadow'];
513
+ setReceiveShadow: ThreeDApiInstance['setReceiveShadow'];
514
+ setCameraPosition: ThreeDApiInstance['setCameraPosition'];
515
+ setCameraTarget: ThreeDApiInstance['setCameraTarget'];
516
+ setCameraLookAt: ThreeDApiInstance['setCameraLookAt'];
517
+ setCameraFOV: ThreeDApiInstance['setCameraFOV'];
518
+ setFog: ThreeDApiInstance['setFog'];
519
+ clearFog: ThreeDApiInstance['clearFog'];
520
+ setLightDirection: ThreeDApiInstance['setLightDirection'];
521
+ setLightColor: ThreeDApiInstance['setLightColor'];
522
+ setAmbientLight: ThreeDApiInstance['setAmbientLight'];
523
+ setDirectionalLight: ThreeDApiInstance['setDirectionalLight'];
524
+ clearScene: ThreeDApiInstance['clearScene'];
525
+ enablePixelation: ThreeDApiInstance['enablePixelation'];
526
+ enableDithering: ThreeDApiInstance['enableDithering'];
527
+ createPointLight: ThreeDApiInstance['createPointLight'];
528
+ setPointLightPosition: ThreeDApiInstance['setPointLightPosition'];
529
+ setPointLightColor: ThreeDApiInstance['setPointLightColor'];
530
+ removeLight: ThreeDApiInstance['removeLight'];
531
+ createInstancedMesh: ThreeDApiInstance['createInstancedMesh'];
532
+ setInstanceTransform: ThreeDApiInstance['setInstanceTransform'];
533
+ setInstanceColor: ThreeDApiInstance['setInstanceColor'];
534
+ finalizeInstances: ThreeDApiInstance['finalizeInstances'];
535
+ removeInstancedMesh: ThreeDApiInstance['removeInstancedMesh'];
536
+ createLODMesh: ThreeDApiInstance['createLODMesh'];
537
+ setLODPosition: ThreeDApiInstance['setLODPosition'];
538
+ removeLODMesh: ThreeDApiInstance['removeLODMesh'];
539
+ updateLODs: ThreeDApiInstance['updateLODs'];
540
+ loadNormalMap: ThreeDApiInstance['loadNormalMap'];
541
+ setNormalMap: ThreeDApiInstance['setNormalMap'];
542
+ setPBRMaps: ThreeDApiInstance['setPBRMaps'];
543
+ raycastFromCamera: ThreeDApiInstance['raycastFromCamera'];
544
+ get3DStats: ThreeDApiInstance['get3DStats'];
545
+ getScene: ThreeDApiInstance['getScene'];
546
+ getCamera: ThreeDApiInstance['getCamera'];
547
+ getRenderer: ThreeDApiInstance['getRenderer'];
548
+
549
+ // UI
550
+ setFont: UIApiInstance['setFont'];
551
+ getFont: UIApiInstance['getFont'];
552
+ setTextAlign: UIApiInstance['setTextAlign'];
553
+ setTextBaseline: UIApiInstance['setTextBaseline'];
554
+ measureText: UIApiInstance['measureText'];
555
+ drawText: UIApiInstance['drawText'];
556
+ drawTextShadow: UIApiInstance['drawTextShadow'];
557
+ drawTextOutline: UIApiInstance['drawTextOutline'];
558
+ createPanel: UIApiInstance['createPanel'];
559
+ drawPanel: UIApiInstance['drawPanel'];
560
+ drawAllPanels: UIApiInstance['drawAllPanels'];
561
+ removePanel: UIApiInstance['removePanel'];
562
+ clearPanels: UIApiInstance['clearPanels'];
563
+ createButton: UIApiInstance['createButton'];
564
+ updateButton: UIApiInstance['updateButton'];
565
+ drawButton: UIApiInstance['drawButton'];
566
+ updateAllButtons: UIApiInstance['updateAllButtons'];
567
+ drawAllButtons: UIApiInstance['drawAllButtons'];
568
+ removeButton: UIApiInstance['removeButton'];
569
+ clearButtons: UIApiInstance['clearButtons'];
570
+ drawProgressBar: UIApiInstance['drawProgressBar'];
571
+ drawRoundedRect: UIApiInstance['drawRoundedRect'];
572
+ drawGradientRect: UIApiInstance['drawGradientRect'];
573
+ centerX: UIApiInstance['centerX'];
574
+ centerY: UIApiInstance['centerY'];
575
+ grid: UIApiInstance['grid'];
576
+ setMousePosition: UIApiInstance['setMousePosition'];
577
+ setMouseButton: UIApiInstance['setMouseButton'];
578
+ getMousePosition: UIApiInstance['getMousePosition'];
579
+ isMouseDown: UIApiInstance['isMouseDown'];
580
+ isMousePressed: UIApiInstance['isMousePressed'];
581
+ uiColors: UIApiInstance['uiColors'];
582
+ uiFonts: UIApiInstance['uiFonts'];
583
+
584
+ // Input (runtime/input.js)
585
+ key(code: string): boolean;
586
+ keyp(code: string): boolean;
587
+ btn(index: number): boolean;
588
+ btnp(index: number): boolean;
589
+
590
+ // 2D drawing (runtime/framebuffer.js / api-2d.js)
591
+ cls(color?: Color): void;
592
+ print(text: string, x: number, y: number, color?: Color, scale?: number): void;
593
+ printCentered(text: string, y: number, color?: Color, scale?: number): void;
594
+ line(x1: number, y1: number, x2: number, y2: number, color?: Color): void;
595
+ circle(x: number, y: number, r: number, color?: Color, filled?: boolean): void;
596
+ drawRect(x: number, y: number, w: number, h: number, color?: Color): void;
597
+ rgba8(r: number, g: number, b: number, a: number): Color;
598
+
599
+ // Storage (runtime/storage.js)
600
+ saveData(key: string, value: unknown): void;
601
+ loadData(key: string, fallback?: unknown): unknown;
602
+ deleteData(key: string): void;
603
+
604
+ // Audio (runtime/audio.js)
605
+ sfx(preset: string | { wave?: string; freq?: number; dur?: number; vol?: number }): void;
606
+ }