This commit is contained in:
Simon Cambier 2025-12-28 14:09:34 +01:00
parent f03a90b9c3
commit 0641887af8
4 changed files with 1483 additions and 71 deletions

View File

@ -1,6 +1,8 @@
# TypeScript for Picotron
This is a template project to mix-and-match TypeScript and Lua for your Picotron projects.
This is an experimental template project to mix-and-match TypeScript and Lua for your Picotron projects.
Most of the _G.d.ts file has been AI-generated from the official documentation.
## Setup

423
_G.d.ts vendored
View File

@ -2,17 +2,38 @@
// Userdata types
type UserdataType = "u8" | "i16" | "i32" | "i64" | "f64";
type UserdataDim = "1d" | "2d";
// Userdata interface
interface Userdata<T extends UserdataType = UserdataType> {
interface Userdata<T = UserdataType, D = UserdataDim> {
// Dimension methods
width(): number;
height(): number | null;
/**
* Returns width, height, type, dimensionality
*/
attribs(): LuaMultiReturn<[number, number, T, number]>;
// Element access
get(x: number, n?: number): LuaMultiReturn<number[]>;
get(x: number, y: number, n?: number): LuaMultiReturn<number[]>;
// Element access — 1D
get(x: number): D extends "1d" ? number : LuaMultiReturn<number[]>;
get(x: number, n: number): D extends "1d" ? LuaMultiReturn<number[]> : number;
// Element access — 2D
// No n specified (defaults to 1, returns single number)
get(x: number, y: number): D extends "2d" ? number : LuaMultiReturn<number[]>;
// n = 0 (fast path, returns single number)
get(
x: number,
y: number,
n: 0
): D extends "2d" ? number : LuaMultiReturn<number[]>;
// n specified (returns multiple values)
get(
x: number,
y: number,
n: number
): D extends "2d" ? LuaMultiReturn<number[]> : number;
set(x: number, ...values: number[]): void;
set(x: number, y: number, ...values: number[]): void;
@ -202,7 +223,13 @@ interface Userdata<T extends UserdataType = UserdataType> {
convert(data_type: UserdataType, dest?: Userdata): Userdata;
// Interpolation
lerp(offset?: number, len?: number, el_stride?: number, num_lerps?: number, lerp_stride?: number): Userdata<T>;
lerp(
offset?: number,
len?: number,
el_stride?: number,
num_lerps?: number,
lerp_stride?: number
): Userdata<T>;
// Sorting (2d only)
sort(index?: number, descending?: boolean): void;
@ -212,8 +239,16 @@ interface Userdata<T extends UserdataType = UserdataType> {
poke(addr: number, offset?: number, elements?: number): void;
// Matrix/Vector operations (f64 only)
matmul(m: Userdata<"f64">, m_out?: Userdata<"f64">, batch_height?: number): Userdata<"f64">;
matmul3d(m: Userdata<"f64">, m_out?: Userdata<"f64">, batch_height?: number): Userdata<"f64">;
matmul(
m: Userdata<"f64">,
m_out?: Userdata<"f64">,
batch_height?: number
): Userdata<"f64">;
matmul3d(
m: Userdata<"f64">,
m_out?: Userdata<"f64">,
batch_height?: number
): Userdata<"f64">;
transpose(m_out?: Userdata<T> | true): Userdata<T>;
// Vector operations (f64 only)
@ -264,43 +299,179 @@ declare function fillp(pattern?: number): void;
declare function pget(x: number, y: number): number;
declare function pset(x: number, y: number, c?: number): void;
declare function cursor(x?: number, y?: number, c?: number): void;
declare function print(text?: any, x?: number, y?: number, color?: number): number;
declare function line(x1: number, y1: number, x2?: number, y2?: number, color?: number): void;
declare function print(
text?: any,
x?: number,
y?: number,
color?: number
): number;
declare function line(
x1: number,
y1: number,
x2?: number,
y2?: number,
color?: number
): void;
declare function line(userdata: Userdata): void;
declare function rect(x0: number, y0: number, x1: number, y1: number, c?: number): void;
declare function rect(
x0: number,
y0: number,
x1: number,
y1: number,
c?: number
): void;
declare function rect(userdata: Userdata): void;
declare function rectfill(x0: number, y0: number, x1: number, y1: number, c?: number): void;
declare function rectfill(
x0: number,
y0: number,
x1: number,
y1: number,
c?: number
): void;
declare function rectfill(userdata: Userdata): void;
declare function circ(x: number, y: number, r: number, c?: number): void;
declare function circfill(x: number, y: number, r: number, c?: number): void;
declare function circfill(userdata: Userdata): void;
declare function oval(x: number, y: number, rx: number, ry: number, c?: number): void;
declare function ovalfill(x: number, y: number, rx: number, ry: number, c?: number): void;
declare function rrect(x: number, y: number, width: number, height: number, radius?: number, c?: number): void;
declare function rrectfill(x: number, y: number, width: number, height: number, radius?: number, c?: number): void;
declare function fget(n: number, f?: number): number | boolean;
declare function oval(
x: number,
y: number,
rx: number,
ry: number,
c?: number
): void;
declare function ovalfill(
x: number,
y: number,
rx: number,
ry: number,
c?: number
): void;
declare function rrect(
x: number,
y: number,
width: number,
height: number,
radius?: number,
c?: number
): void;
declare function rrectfill(
x: number,
y: number,
width: number,
height: number,
radius?: number,
c?: number
): void;
declare function fget(n: number): number;
declare function fget(n: number, f: number): boolean;
declare function fset(n: number, f?: number, val?: boolean): void;
declare function get_spr(index: number): Userdata<"u8">;
declare function set_spr(index: number, ud: Userdata<"u8">): void;
declare function spr(sprite: number | Userdata, x: number, y: number, w?: number, h?: number, flip_x?: boolean, flip_y?: boolean): void;
declare function sspr(sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw?: number, dh?: number, flip_x?: boolean, flip_y?: boolean): void;
declare function spr(
sprite: number | Userdata,
x: number,
y: number,
flip_x?: boolean,
flip_y?: boolean
): void;
declare function sspr(
sx: number,
sy: number,
sw: number,
sh: number,
dx: number,
dy: number,
dw?: number,
dh?: number,
flip_x?: boolean,
flip_y?: boolean
): void;
// =====================
// Map API
// =====================
declare function map(cel_x?: number, cel_y?: number, sx?: number, sy?: number, cel_w?: number, cel_h?: number, layer?: number): void;
declare function map(src: Userdata<"i16">, cel_x?: number, cel_y?: number, sx?: number, sy?: number, cel_w?: number, cel_h?: number, layer?: number, tile_w?: number, tile_h?: number): void;
declare function map(
cel_x?: number,
cel_y?: number,
sx?: number,
sy?: number,
cel_w?: number,
cel_h?: number,
layer?: number
): void;
declare function map(
src: Userdata<"i16">,
cel_x?: number,
cel_y?: number,
sx?: number,
sy?: number,
cel_w?: number,
cel_h?: number,
layer?: number,
tile_w?: number,
tile_h?: number
): void;
declare function mget(cel_x: number, cel_y: number): number;
declare function mset(cel_x: number, cel_y: number, sprite_number: number): void;
declare function tline3d(src: number | Userdata<"u8"> | Userdata<"i16">, x0: number, y0: number, x1: number, y1: number, u0: number, v0: number, u1: number, v1: number, w0?: number, w1?: number, flags?: number): void;
declare function tline3d(x0: number, y0: number, x1: number, y1: number, u0: number, v0: number, u1: number, v1: number, w0?: number, w1?: number, flags?: number): void;
declare function mset(
cel_x: number,
cel_y: number,
sprite_number: number
): void;
declare function tline3d(
src: number | Userdata<"u8"> | Userdata<"i16">,
x0: number,
y0: number,
x1: number,
y1: number,
u0: number,
v0: number,
u1: number,
v1: number,
w0?: number,
w1?: number,
flags?: number
): void;
declare function tline3d(
x0: number,
y0: number,
x1: number,
y1: number,
u0: number,
v0: number,
u1: number,
v1: number,
w0?: number,
w1?: number,
flags?: number
): void;
// =====================
// Audio API
// =====================
declare function sfx(id: number, channel?: number, offset?: number, length?: number, mix_volume?: number): void;
declare function music(id?: number, fade_len?: number, channel_mask?: number, base_addr?: number, tick_offset?: number): void;
declare function note(pitch?: number, inst?: number, vol?: number, effect?: number, effect_p?: number, channel?: number, retrig?: boolean, panning?: number): void;
declare function sfx(
id: number,
channel?: number,
offset?: number,
length?: number,
mix_volume?: number
): void;
declare function music(
id?: number,
fade_len?: number,
channel_mask?: number,
base_addr?: number,
tick_offset?: number
): void;
declare function note(
pitch?: number,
inst?: number,
vol?: number,
effect?: number,
effect_p?: number,
channel?: number,
retrig?: boolean,
panning?: number
): void;
// =====================
// Input API
@ -311,17 +482,35 @@ declare function key(k?: string, raw?: boolean): boolean;
declare function keyp(k?: string, raw?: boolean): boolean;
declare function peektext(): boolean;
declare function readtext(clear?: boolean): string;
declare function mouse(): LuaMultiReturn<[number, number, number, number, number]>;
declare function mouselock(lock: boolean, event_sensitivity?: number, move_sensitivity?: number): LuaMultiReturn<[number, number]>;
declare function mouse(): LuaMultiReturn<
[number, number, number, number, number]
>;
declare function mouselock(
lock: boolean,
event_sensitivity?: number,
move_sensitivity?: number
): LuaMultiReturn<[number, number]>;
declare function input(prompt?: string, flags?: number): string | null;
// =====================
// String API
// =====================
declare function chr(...values: number[]): string;
declare function ord(str: string, index?: number, num_results?: number): number | LuaMultiReturn<number[]>;
declare function sub(str: string, pos0: number, pos1?: number | boolean): string;
declare function split(str: string, delimiter?: string | number, convert_numbers?: boolean): string[];
declare function ord(
str: string,
index?: number,
num_results?: number
): number | LuaMultiReturn<number[]>;
declare function sub(
str: string,
pos0: number,
pos1?: number | boolean
): string;
declare function split(
str: string,
delimiter?: string | number,
convert_numbers?: boolean
): string[];
declare function type(val: any): string;
declare function tostr(val: any, format?: string): string;
declare function tonum(str: string): number | null;
@ -337,7 +526,9 @@ declare function deli(t: any[], index: number): any;
declare function count(t: any[]): number;
declare function all(t: any[]): () => any | undefined;
declare function foreach(t: any[], fn: (item: any) => void): void;
declare function pairs(t: any): LuaMultiReturn<[(t: any, k?: any) => LuaMultiReturn<[any, any]>, any, any]>;
declare function pairs(
t: any
): LuaMultiReturn<[(t: any, k?: any) => LuaMultiReturn<[any, any]>, any, any]>;
declare function next(t: any, k?: any): LuaMultiReturn<[any, any]>;
// =====================
@ -352,7 +543,10 @@ declare function fetch(path: string): any;
// Files API
// =====================
declare function store(filename: string, obj: any, metadata?: any): void;
declare function fetch(filename: string, options?: any): LuaMultiReturn<[any, any]>;
declare function fetch(
filename: string,
options?: any
): LuaMultiReturn<[any, any]>;
declare function store_metadata(filename: string, metadata: any): void;
declare function fetch_metadata(filename: string): any;
declare function include(path: string): void;
@ -379,9 +573,18 @@ declare function stat(v: number, ...args: any[]): any;
declare function env(): any;
declare function time(): number;
declare function t(): number;
declare function date(format?: string, t?: string | number, delta?: number): string;
declare function date(
format?: string,
t?: string | number,
delta?: number
): string;
declare function exit(): void;
declare function printh(text: any, file_path?: string, overwrite?: boolean, terminal?: boolean): void;
declare function printh(
text: any,
file_path?: string,
overwrite?: boolean,
terminal?: boolean
): void;
declare function error(description?: string): void;
declare function assert(condition: any, message?: string): void;
declare function get_clipboard(): string;
@ -389,13 +592,23 @@ declare function set_clipboard(text: string): void;
declare function create_process(filename: string, ...args: any[]): number;
declare function pid(): number;
declare function signal(proc_id: number, signal: string): void;
declare function send_message(proc_id: number, msg: any, reply?: boolean | ((msg: any) => void)): any;
declare function on_event(event: string, func: (msg: any) => boolean | void): void;
declare function send_message(
proc_id: number,
msg: any,
reply?: boolean | ((msg: any) => void)
): any;
declare function on_event(
event: string,
func: (msg: any) => boolean | void
): void;
// =====================
// Memory API
// =====================
declare function peek(addr: number, count?: number): number | LuaMultiReturn<number[]>;
declare function peek(
addr: number,
count?: number
): number | LuaMultiReturn<number[]>;
declare function poke(addr: number, ...values: number[]): void;
declare function peek2(addr: number): number;
declare function poke2(addr: number, val: number): void;
@ -403,44 +616,108 @@ declare function peek4(addr: number): number;
declare function poke4(addr: number, val: number): void;
declare function peek8(addr: number): number;
declare function poke8(addr: number, val: number): void;
declare function memcpy(dest_addr: number, src_addr: number, count: number): void;
declare function memcpy(
dest_addr: number,
src_addr: number,
count: number
): void;
declare function memset(addr: number, value: number, count: number): void;
declare function reload(dest_addr: number, src_addr: number, count: number, filename?: string): void;
declare function reload(
dest_addr: number,
src_addr: number,
count: number,
filename?: string
): void;
declare function memmap(ud: Userdata, addr: number): void;
// =====================
// Userdata API
// =====================
declare function userdata(data_type: UserdataType, width: number, height?: number, data?: string): Userdata;
declare function userdata(gfx_string: string): Userdata<"u8">;
declare function vec(...values: number[]): Userdata<"f64">;
declare function get(u: Userdata | null | undefined, x: number, n?: number): LuaMultiReturn<number[]>;
declare function get(u: Userdata | null | undefined, x: number, y: number, n?: number): LuaMultiReturn<number[]>;
declare function set(u: Userdata | null | undefined, x: number, ...values: number[]): void;
declare function set(u: Userdata | null | undefined, x: number, y: number, ...values: number[]): void;
declare function blit(src?: Userdata, dest?: Userdata, src_x?: number, src_y?: number, dest_x?: number, dest_y?: number, width?: number, height?: number): void;
declare function matmul(m0: Userdata<"f64">, m1: Userdata<"f64">, m_out?: Userdata<"f64">, batch_height?: number): Userdata<"f64">;
declare function matmul3d(m0: Userdata<"f64">, m1: Userdata<"f64">, m_out?: Userdata<"f64">, batch_height?: number): Userdata<"f64">;
// 1D creation (width only) — allow specifying only D; T is inferred from first argument
declare function userdata<
D extends "1d" = "1d",
T extends UserdataType = UserdataType,
>(data_type: T, width: number, ...data: number[]): Userdata<T, D>;
// 2D creation (width + height) — allow specifying only D; T is inferred from first argument
declare function userdata<
D extends "2d" = "2d",
T extends UserdataType = UserdataType,
>(
data_type: T,
width: number,
height: number,
...data: number[]
): Userdata<T, D>;
// GFX string always yields 2D u8
declare function userdata(gfx_string: string): Userdata<"u8", "2d">;
// Vector helper produces 1D f64
declare function vec(...values: number[]): Userdata<"f64", "1d">;
declare function get(
u: Userdata | null | undefined,
x: number,
n?: number
): LuaMultiReturn<number[]>;
declare function get(
u: Userdata | null | undefined,
x: number,
y: number,
n?: number
): LuaMultiReturn<number[]>;
declare function set(
u: Userdata | null | undefined,
x: number,
...values: number[]
): void;
declare function set(
u: Userdata | null | undefined,
x: number,
y: number,
...values: number[]
): void;
declare function blit(
src?: Userdata,
dest?: Userdata,
src_x?: number,
src_y?: number,
dest_x?: number,
dest_y?: number,
width?: number,
height?: number
): void;
declare function matmul(
m0: Userdata<"f64">,
m1: Userdata<"f64">,
m_out?: Userdata<"f64">,
batch_height?: number
): Userdata<"f64">;
declare function matmul3d(
m0: Userdata<"f64">,
m1: Userdata<"f64">,
m_out?: Userdata<"f64">,
batch_height?: number
): Userdata<"f64">;
// =====================
// Window API
// =====================
declare function window(attributes?: Partial<{
width: number
height: number
title: string
pauseable: boolean
tabbled: boolean
has_frame: boolean
resizeable: boolean
wallpapier: boolean
autoclose: boolean
z: number
cursor: 0 | 1 | Userdata
squashable: boolean
background_updates: boolean
background_draws: boolean
}>): any;
declare function window(
attributes?: Partial<{
width: number;
height: number;
title: string;
pauseable: boolean;
tabbled: boolean;
has_frame: boolean;
resizeable: boolean;
wallpapier: boolean;
autoclose: boolean;
z: number;
cursor: 0 | 1 | Userdata;
squashable: boolean;
background_updates: boolean;
background_draws: boolean;
}>
): any;
declare function window(width: number, height: number): any;
declare function get_display(): Userdata<"u8">;
declare function set_draw_target(ud?: Userdata<"u8">): void;
@ -455,7 +732,12 @@ interface UndoStack {
undo(peek?: boolean): any;
redo(peek?: boolean): any;
}
declare function create_undo_stack(save: (item?: any) => any, load: (dat: any, item?: any) => void, pod_flags?: number, item?: any): UndoStack;
declare function create_undo_stack(
save: (item?: any) => any,
load: (dat: any, item?: any) => void,
pod_flags?: number,
item?: any
): UndoStack;
// =====================
// Sockets
@ -464,7 +746,12 @@ interface Socket {
read(): string | LuaMultiReturn<[null, string]>;
write(str: string): number | LuaMultiReturn<[null, string]>;
close(): void;
status(): "ready" | "listening" | "closed" | "closed by peer" | "disconnected";
status():
| "ready"
| "listening"
| "closed"
| "closed by peer"
| "disconnected";
accept(): Socket | null;
}
declare function socket(addr: string): Socket | null;

View File

@ -1,12 +1,21 @@
{
"scripts": {
"build": "tstl",
"dev": "tstl --watch"
"check": "tsc -noEmit -skipLibCheck && madge -c src/main.ts",
"build": "pnpm check && tstl",
"dev": "pnpm check && tstl --watch"
},
"devDependencies": {
"@typescript-to-lua/language-extensions": "^1.19.0",
"madge": "^8.0.0",
"prettier": "^3.7.0",
"typescript": "^5.9.3",
"typescript-to-lua": "^1.33.0"
},
"madge": {
"detectiveOptions": {
"ts": {
"skipTypeImports": true
}
}
}
}

File diff suppressed because it is too large Load Diff