zx-kit 0.31.2 → 0.32.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.
- package/README.md +11 -5
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/presentation.d.ts +75 -0
- package/dist/presentation.d.ts.map +1 -0
- package/dist/presentation.js +78 -0
- package/dist/presentation.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -42,9 +42,9 @@ zx-kit captures that aesthetic in TypeScript. You get the Spectrum's palette, RO
|
|
|
42
42
|
|
|
43
43
|
---
|
|
44
44
|
|
|
45
|
-
## Spectrum-inspired, not hardware-accurate
|
|
45
|
+
## Spectrum-inspired, not hardware-accurate by default
|
|
46
46
|
|
|
47
|
-
zx-kit is not a ZX Spectrum emulator
|
|
47
|
+
zx-kit is not a ZX Spectrum emulator, and the **default** renderer does not model the hardware attribute clash (where every 8×8 cell can hold only one ink/paper pair), the ULA timing, or the Z80 memory layout. The default path composites in full colour, so sprites keep their own colours and never bleed into the background.
|
|
48
48
|
|
|
49
49
|
What it does model is the **aesthetic discipline** of the Spectrum:
|
|
50
50
|
|
|
@@ -56,9 +56,15 @@ What it does model is the **aesthetic discipline** of the Spectrum:
|
|
|
56
56
|
- Beeper-style 1-bit SFX
|
|
57
57
|
- AY-3-8912-style three-channel chiptune audio
|
|
58
58
|
|
|
59
|
-
**
|
|
59
|
+
**Want the real thing?** Three opt-in rendering paths cover the spectrum from fantasy to faithful:
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
| Path | Module | Look |
|
|
62
|
+
|------|--------|------|
|
|
63
|
+
| **Fantasy** (default) | `renderer` | Full-colour compositing — sprites keep their colours, no bleed. Best for readability. |
|
|
64
|
+
| **Authentic clash** | `attrscreen` | 1-bit pixels + a 32×24 ink/paper grid: real per-cell colour bleed when a sprite and the background share an 8×8 cell. |
|
|
65
|
+
| **Anti-clash** | `monoscreen` | One ink/paper for the whole playfield — clash-proof monochrome action, with a colourful HUD around it. |
|
|
66
|
+
|
|
67
|
+
A white hero walking past a green plant stays white under the **default** renderer, bleeds the shared cell under **`attrscreen`**, and is a clean silhouette under **`monoscreen`** — your choice, per game or per in-game toggle.
|
|
62
68
|
|
|
63
69
|
---
|
|
64
70
|
|
|
@@ -227,7 +233,7 @@ Open `package.json` and replace it with the following. The two key additions are
|
|
|
227
233
|
"build": "vite build"
|
|
228
234
|
},
|
|
229
235
|
"dependencies": {
|
|
230
|
-
"zx-kit": "^0.
|
|
236
|
+
"zx-kit": "^0.31.1"
|
|
231
237
|
},
|
|
232
238
|
"devDependencies": {
|
|
233
239
|
"vite": "^6.0.0"
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module presentation
|
|
3
|
+
*
|
|
4
|
+
* Small **8-bit title / loading-screen helpers** — the iconic ZX "PRESS ANY KEY"
|
|
5
|
+
* blink, tape-loading border stripes, and a title menu. These are tiny, composable
|
|
6
|
+
* functions over the renderer + palette (in the spirit of {@link "renderer" | drawScanlines}
|
|
7
|
+
* and {@link "renderer" | drawText}), **not** a framework: a game wires its own title
|
|
8
|
+
* or loading screen from them.
|
|
9
|
+
*
|
|
10
|
+
* Everything draws in **game pixels** (rely on the `setupCanvas` scale), so these
|
|
11
|
+
* compose freely with `drawText`, sprites, and tiles.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* // A loading screen, composed from the pieces (no built-in "title screen"):
|
|
16
|
+
* drawTapeStripes(ctx, now, { side: 'border' })
|
|
17
|
+
* drawTextCentered(ctx, 'LOADING CHAOSBUNNY', 80, 32, C.B_WHITE)
|
|
18
|
+
* drawBlinkingText(ctx, 'PRESS ANY KEY', 96, 120, now, C.B_YELLOW)
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { type SpectrumColor } from './palette.js';
|
|
22
|
+
/**
|
|
23
|
+
* `true` for the lit half of each blink cycle — a pure, time-driven toggle (no
|
|
24
|
+
* state). Gate any flashing element with it.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* if (blinkVisible(now)) drawText(ctx, 'INSERT COIN', x, y, C.B_WHITE)
|
|
28
|
+
*/
|
|
29
|
+
export declare function blinkVisible(now: number, intervalMs?: number): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Draws `text` only on the visible half of the blink cycle — the classic flashing
|
|
32
|
+
* "PRESS ANY KEY" / "PRESS FIRE" prompt. Same args as {@link drawText} plus `now`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function drawBlinkingText(ctx: CanvasRenderingContext2D, text: string, x: number, y: number, now: number, ink?: SpectrumColor, paper?: SpectrumColor, intervalMs?: number): void;
|
|
35
|
+
/** Options for {@link drawTapeStripes}. */
|
|
36
|
+
export interface TapeStripesOptions {
|
|
37
|
+
/** Colours cycled down the screen. Default: the classic loader red / cyan. */
|
|
38
|
+
colors?: readonly SpectrumColor[];
|
|
39
|
+
/** Stripe thickness in game px (default `2`). */
|
|
40
|
+
stripeHeight?: number;
|
|
41
|
+
/** Scroll speed in px/second (default `24`) — animates the loading shimmer. */
|
|
42
|
+
speed?: number;
|
|
43
|
+
/** `'full'` stripes the whole screen; `'border'` stripes only a frame. Default `'full'`. */
|
|
44
|
+
side?: 'full' | 'border';
|
|
45
|
+
/** Border band thickness in px when `side: 'border'` (default `CELL`). */
|
|
46
|
+
band?: number;
|
|
47
|
+
/** Screen size in game px (default 256×192 — the ZX canvas). */
|
|
48
|
+
width?: number;
|
|
49
|
+
height?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Draws animated ZX **tape-loading stripes** — the shimmering coloured bands of a
|
|
53
|
+
* cassette load. `'full'` paints the whole screen; `'border'` paints only a frame
|
|
54
|
+
* (leaving the middle for your title art). Call before your title/logo each frame.
|
|
55
|
+
*/
|
|
56
|
+
export declare function drawTapeStripes(ctx: CanvasRenderingContext2D, now: number, options?: TapeStripesOptions): void;
|
|
57
|
+
/** Options for {@link drawMenuOptions}. */
|
|
58
|
+
export interface MenuOptionsConfig {
|
|
59
|
+
/** Ink for unselected options (default `C.WHITE`). */
|
|
60
|
+
ink?: SpectrumColor;
|
|
61
|
+
/** Ink for the selected option (default `C.B_YELLOW`). */
|
|
62
|
+
selectedInk?: SpectrumColor;
|
|
63
|
+
/** Optional paper behind each line. */
|
|
64
|
+
paper?: SpectrumColor;
|
|
65
|
+
/** Extra px between rows on top of the 8px line height (default `2`). */
|
|
66
|
+
gap?: number;
|
|
67
|
+
/** Marker before the selected option; others are padded to align (default `'> '`). */
|
|
68
|
+
prefix?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Draws a vertical **title menu** at `(x, y)`. The selected option is highlighted
|
|
72
|
+
* with `selectedInk` and the `prefix` marker; the rest are padded to stay aligned.
|
|
73
|
+
*/
|
|
74
|
+
export declare function drawMenuOptions(ctx: CanvasRenderingContext2D, options: readonly string[], selectedIndex: number, x: number, y: number, config?: MenuOptionsConfig): void;
|
|
75
|
+
//# sourceMappingURL=presentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAW,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAG1D;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,SAAM,GAAG,OAAO,CAEnE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,aAAyB,EAC9B,KAAK,CAAC,EAAE,aAAa,EACrB,UAAU,SAAM,GACf,IAAI,CAEN;AAED,2CAA2C;AAC3C,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAA;IACjC,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4FAA4F;IAC5F,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;IACxB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,wBAAwB,EAC7B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,kBAAuB,GAC/B,IAAI,CAwBN;AAED,2CAA2C;AAC3C,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,GAAG,CAAC,EAAE,aAAa,CAAA;IACnB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,aAAa,CAAA;IAC3B,uCAAuC;IACvC,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,yEAAyE;IACzE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,wBAAwB,EAC7B,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,aAAa,EAAE,MAAM,EACrB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EACpB,MAAM,GAAE,iBAAsB,GAC7B,IAAI,CAQN"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module presentation
|
|
3
|
+
*
|
|
4
|
+
* Small **8-bit title / loading-screen helpers** — the iconic ZX "PRESS ANY KEY"
|
|
5
|
+
* blink, tape-loading border stripes, and a title menu. These are tiny, composable
|
|
6
|
+
* functions over the renderer + palette (in the spirit of {@link "renderer" | drawScanlines}
|
|
7
|
+
* and {@link "renderer" | drawText}), **not** a framework: a game wires its own title
|
|
8
|
+
* or loading screen from them.
|
|
9
|
+
*
|
|
10
|
+
* Everything draws in **game pixels** (rely on the `setupCanvas` scale), so these
|
|
11
|
+
* compose freely with `drawText`, sprites, and tiles.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* // A loading screen, composed from the pieces (no built-in "title screen"):
|
|
16
|
+
* drawTapeStripes(ctx, now, { side: 'border' })
|
|
17
|
+
* drawTextCentered(ctx, 'LOADING CHAOSBUNNY', 80, 32, C.B_WHITE)
|
|
18
|
+
* drawBlinkingText(ctx, 'PRESS ANY KEY', 96, 120, now, C.B_YELLOW)
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { C, CELL } from './palette.js';
|
|
22
|
+
import { drawText } from './renderer.js';
|
|
23
|
+
/**
|
|
24
|
+
* `true` for the lit half of each blink cycle — a pure, time-driven toggle (no
|
|
25
|
+
* state). Gate any flashing element with it.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* if (blinkVisible(now)) drawText(ctx, 'INSERT COIN', x, y, C.B_WHITE)
|
|
29
|
+
*/
|
|
30
|
+
export function blinkVisible(now, intervalMs = 500) {
|
|
31
|
+
return Math.floor(now / intervalMs) % 2 === 0;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Draws `text` only on the visible half of the blink cycle — the classic flashing
|
|
35
|
+
* "PRESS ANY KEY" / "PRESS FIRE" prompt. Same args as {@link drawText} plus `now`.
|
|
36
|
+
*/
|
|
37
|
+
export function drawBlinkingText(ctx, text, x, y, now, ink = C.B_WHITE, paper, intervalMs = 500) {
|
|
38
|
+
if (blinkVisible(now, intervalMs))
|
|
39
|
+
drawText(ctx, text, x, y, ink, paper);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Draws animated ZX **tape-loading stripes** — the shimmering coloured bands of a
|
|
43
|
+
* cassette load. `'full'` paints the whole screen; `'border'` paints only a frame
|
|
44
|
+
* (leaving the middle for your title art). Call before your title/logo each frame.
|
|
45
|
+
*/
|
|
46
|
+
export function drawTapeStripes(ctx, now, options = {}) {
|
|
47
|
+
const { colors = [C.B_RED, C.B_CYAN], stripeHeight = 2, speed = 24, side = 'full', band = CELL, width = 256, height = 192, } = options;
|
|
48
|
+
const n = colors.length;
|
|
49
|
+
if (n === 0 || stripeHeight <= 0)
|
|
50
|
+
return;
|
|
51
|
+
const offset = Math.floor((now / 1000) * speed);
|
|
52
|
+
for (let y = 0; y < height; y += stripeHeight) {
|
|
53
|
+
const i = Math.floor((y - offset) / stripeHeight);
|
|
54
|
+
ctx.fillStyle = colors[((i % n) + n) % n];
|
|
55
|
+
const h = Math.min(stripeHeight, height - y);
|
|
56
|
+
if (side === 'full' || y < band || y >= height - band) {
|
|
57
|
+
ctx.fillRect(0, y, width, h); // full row (whole screen, or top/bottom band)
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
ctx.fillRect(0, y, band, h); // left band
|
|
61
|
+
ctx.fillRect(width - band, y, band, h); // right band
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Draws a vertical **title menu** at `(x, y)`. The selected option is highlighted
|
|
67
|
+
* with `selectedInk` and the `prefix` marker; the rest are padded to stay aligned.
|
|
68
|
+
*/
|
|
69
|
+
export function drawMenuOptions(ctx, options, selectedIndex, x, y, config = {}) {
|
|
70
|
+
const { ink = C.WHITE, selectedInk = C.B_YELLOW, paper, gap = 2, prefix = '> ' } = config;
|
|
71
|
+
const pad = ' '.repeat(prefix.length);
|
|
72
|
+
const lineH = CELL + gap;
|
|
73
|
+
for (let i = 0; i < options.length; i++) {
|
|
74
|
+
const selected = i === selectedIndex;
|
|
75
|
+
drawText(ctx, (selected ? prefix : pad) + options[i], x, y + i * lineH, selected ? selectedInk : ink, paper);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=presentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation.js","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"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"}
|