zx-kit 0.2.2 → 0.3.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/LICENSE +21 -0
- package/README.md +43 -5
- package/dist/audio.d.ts +32 -1
- package/dist/audio.d.ts.map +1 -1
- package/dist/audio.js +47 -2
- package/dist/audio.js.map +1 -1
- package/dist/input.d.ts +13 -2
- package/dist/input.d.ts.map +1 -1
- package/dist/input.js +26 -2
- package/dist/input.js.map +1 -1
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +11 -14
- package/dist/renderer.js.map +1 -1
- package/package.json +4 -2
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 zrebec
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -195,7 +195,7 @@ Wraps the Web Audio API for authentic 1-bit square-wave sound. All audio goes th
|
|
|
195
195
|
|
|
196
196
|
#### `initAudio(volume?): void`
|
|
197
197
|
|
|
198
|
-
Creates the `AudioContext` and master gain. Idempotent — safe to call multiple times.
|
|
198
|
+
Creates the `AudioContext` and master gain. Idempotent — safe to call multiple times. `volume` is clamped to 0.0–1.0.
|
|
199
199
|
|
|
200
200
|
```ts
|
|
201
201
|
window.addEventListener('keydown', () => initAudio(), { once: true })
|
|
@@ -214,6 +214,33 @@ Returns the current context, or `null` before `initAudio()`.
|
|
|
214
214
|
|
|
215
215
|
Returns the master gain node. Connect custom oscillators here to respect global volume.
|
|
216
216
|
|
|
217
|
+
#### `getMasterVolume(): number`
|
|
218
|
+
|
|
219
|
+
Returns the current master volume (0.0–1.0), or `0` before `initAudio()`.
|
|
220
|
+
|
|
221
|
+
#### `setMasterVolume(volume): void`
|
|
222
|
+
|
|
223
|
+
Sets master volume. Clamped to 0.0–1.0. No-op before `initAudio()`.
|
|
224
|
+
|
|
225
|
+
```ts
|
|
226
|
+
setMasterVolume(0.5) // 50%
|
|
227
|
+
setMasterVolume(0) // mute
|
|
228
|
+
setMasterVolume(1) // full
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
#### `increaseVolume(): void` / `decreaseVolume(): void`
|
|
232
|
+
|
|
233
|
+
Adjusts master volume by ±0.1, clamped at 0.0–1.0.
|
|
234
|
+
|
|
235
|
+
```ts
|
|
236
|
+
// Volume keys
|
|
237
|
+
if (consumeAnyKey()) increaseVolume() // example: + key
|
|
238
|
+
decreaseVolume() // example: - key
|
|
239
|
+
|
|
240
|
+
// Current state
|
|
241
|
+
const vol = getMasterVolume() // e.g. 0.4 after one increaseVolume()
|
|
242
|
+
```
|
|
243
|
+
|
|
217
244
|
#### `Note` interface
|
|
218
245
|
|
|
219
246
|
```ts
|
|
@@ -271,11 +298,11 @@ type Direction = 'up' | 'down' | 'left' | 'right'
|
|
|
271
298
|
|
|
272
299
|
#### `initInput(repeatDelay?, repeatInterval?): void`
|
|
273
300
|
|
|
274
|
-
Attaches `keydown`/`keyup` listeners. Keys: arrows = movement, `F` = flag, `P` = pause, `Ctrl+Shift+B` = debug.
|
|
301
|
+
Attaches `keydown`/`keyup` listeners. Idempotent — timing params are always updated; listeners are only attached on the first call. Keys: arrows = movement, `F` = flag, `P` = pause, `Ctrl+Shift+B` = debug.
|
|
275
302
|
|
|
276
303
|
```ts
|
|
277
304
|
initInput() // 150ms delay, 80ms repeat
|
|
278
|
-
initInput(200, 60) // custom timing
|
|
305
|
+
initInput(200, 60) // custom timing; safe to call again to reconfigure
|
|
279
306
|
```
|
|
280
307
|
|
|
281
308
|
#### `tickMovement(dtMs): Direction | null`
|
|
@@ -306,6 +333,15 @@ Returns whether a key is currently held. Argument is `KeyboardEvent.key`.
|
|
|
306
333
|
if (isHeld('ArrowUp')) { ... }
|
|
307
334
|
```
|
|
308
335
|
|
|
336
|
+
#### `resetInput(): void`
|
|
337
|
+
|
|
338
|
+
Clears all pending key state immediately. Call on game phase transitions to prevent stale inputs carrying over.
|
|
339
|
+
|
|
340
|
+
```ts
|
|
341
|
+
appPhase = 'gameover'
|
|
342
|
+
resetInput() // discard any queued keypresses from the previous phase
|
|
343
|
+
```
|
|
344
|
+
|
|
309
345
|
---
|
|
310
346
|
|
|
311
347
|
## File structure
|
|
@@ -322,9 +358,11 @@ zx-kit/
|
|
|
322
358
|
│ ├── renderer.ts # setupCanvas, mirrorSprite, drawSprite, drawChar, drawText,
|
|
323
359
|
│ │ # drawTextCentered, flashBorder
|
|
324
360
|
│ ├── audio.ts # initAudio, resumeAudio, beep, playPattern, Note,
|
|
325
|
-
│ │ # getAudioContext, getMasterGain
|
|
361
|
+
│ │ # getAudioContext, getMasterGain,
|
|
362
|
+
│ │ # getMasterVolume, setMasterVolume,
|
|
363
|
+
│ │ # increaseVolume, decreaseVolume
|
|
326
364
|
│ └── input.ts # initInput, tickMovement, consumeFlag/Debug/Pause/AnyKey,
|
|
327
|
-
│ # isHeld, Direction
|
|
365
|
+
│ # isHeld, resetInput, Direction
|
|
328
366
|
└── dist/ # compiled output (generated by npm run build)
|
|
329
367
|
├── index.js / .d.ts
|
|
330
368
|
└── ...
|
package/dist/audio.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* multiple times (subsequent calls are no-ops).
|
|
4
4
|
* Must be called inside a user-gesture handler (click or keydown) due to browser autoplay policy.
|
|
5
5
|
*
|
|
6
|
-
* @param volume - Master gain value (0.0–1.0, default `0.3`)
|
|
6
|
+
* @param volume - Master gain value (0.0–1.0, default `0.3`). Clamped to valid range.
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
9
|
* window.addEventListener('keydown', () => initAudio(), { once: true })
|
|
@@ -36,6 +36,37 @@ export declare function getAudioContext(): AudioContext | null;
|
|
|
36
36
|
* osc.connect(getMasterGain()!)
|
|
37
37
|
*/
|
|
38
38
|
export declare function getMasterGain(): GainNode | null;
|
|
39
|
+
/**
|
|
40
|
+
* Returns the current master volume (0.0–1.0), or `0` before `initAudio()`.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* const vol = getMasterVolume() // e.g. 0.3
|
|
44
|
+
*/
|
|
45
|
+
export declare function getMasterVolume(): number;
|
|
46
|
+
/**
|
|
47
|
+
* Sets the master volume. Clamped to 0.0–1.0. No-op before `initAudio()`.
|
|
48
|
+
*
|
|
49
|
+
* @param volume - Target gain value (0.0–1.0)
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* setMasterVolume(0.5) // 50%
|
|
53
|
+
* setMasterVolume(0) // mute
|
|
54
|
+
*/
|
|
55
|
+
export declare function setMasterVolume(volume: number): void;
|
|
56
|
+
/**
|
|
57
|
+
* Increases master volume by 0.1, up to a maximum of 1.0.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* increaseVolume() // 0.3 → 0.4
|
|
61
|
+
*/
|
|
62
|
+
export declare function increaseVolume(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Decreases master volume by 0.1, down to a minimum of 0.0.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* decreaseVolume() // 0.3 → 0.2
|
|
68
|
+
*/
|
|
69
|
+
export declare function decreaseVolume(): void;
|
|
39
70
|
/** A single note in a melody pattern. Use `freq: 0` for a rest (silence). */
|
|
40
71
|
export interface Note {
|
|
41
72
|
freq: number;
|
package/dist/audio.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AASA;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,MAAM,SAAM,GAAG,IAAI,CAM5C;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI,QAAQ,GAAG,IAAI,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAGpD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,6EAA6E;AAC7E,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,UAAU,SAAI,GAAG,IAAI,CAS/D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAc9E"}
|
package/dist/audio.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
let ctx = null;
|
|
2
2
|
let masterGain = null;
|
|
3
|
+
const VOLUME_STEP = 0.1;
|
|
4
|
+
function clampVolume(v) {
|
|
5
|
+
return Math.max(0, Math.min(1, v));
|
|
6
|
+
}
|
|
3
7
|
/**
|
|
4
8
|
* Creates the shared `AudioContext` and master `GainNode`. Idempotent — safe to call
|
|
5
9
|
* multiple times (subsequent calls are no-ops).
|
|
6
10
|
* Must be called inside a user-gesture handler (click or keydown) due to browser autoplay policy.
|
|
7
11
|
*
|
|
8
|
-
* @param volume - Master gain value (0.0–1.0, default `0.3`)
|
|
12
|
+
* @param volume - Master gain value (0.0–1.0, default `0.3`). Clamped to valid range.
|
|
9
13
|
*
|
|
10
14
|
* @example
|
|
11
15
|
* window.addEventListener('keydown', () => initAudio(), { once: true })
|
|
@@ -15,7 +19,7 @@ export function initAudio(volume = 0.3) {
|
|
|
15
19
|
return;
|
|
16
20
|
ctx = new AudioContext();
|
|
17
21
|
masterGain = ctx.createGain();
|
|
18
|
-
masterGain.gain.value = volume;
|
|
22
|
+
masterGain.gain.value = clampVolume(volume);
|
|
19
23
|
masterGain.connect(ctx.destination);
|
|
20
24
|
}
|
|
21
25
|
/**
|
|
@@ -52,6 +56,47 @@ export function getAudioContext() {
|
|
|
52
56
|
export function getMasterGain() {
|
|
53
57
|
return masterGain;
|
|
54
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Returns the current master volume (0.0–1.0), or `0` before `initAudio()`.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* const vol = getMasterVolume() // e.g. 0.3
|
|
64
|
+
*/
|
|
65
|
+
export function getMasterVolume() {
|
|
66
|
+
return masterGain?.gain.value ?? 0;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Sets the master volume. Clamped to 0.0–1.0. No-op before `initAudio()`.
|
|
70
|
+
*
|
|
71
|
+
* @param volume - Target gain value (0.0–1.0)
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* setMasterVolume(0.5) // 50%
|
|
75
|
+
* setMasterVolume(0) // mute
|
|
76
|
+
*/
|
|
77
|
+
export function setMasterVolume(volume) {
|
|
78
|
+
if (!masterGain)
|
|
79
|
+
return;
|
|
80
|
+
masterGain.gain.value = clampVolume(volume);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Increases master volume by 0.1, up to a maximum of 1.0.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* increaseVolume() // 0.3 → 0.4
|
|
87
|
+
*/
|
|
88
|
+
export function increaseVolume() {
|
|
89
|
+
setMasterVolume(getMasterVolume() + VOLUME_STEP);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Decreases master volume by 0.1, down to a minimum of 0.0.
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* decreaseVolume() // 0.3 → 0.2
|
|
96
|
+
*/
|
|
97
|
+
export function decreaseVolume() {
|
|
98
|
+
setMasterVolume(getMasterVolume() - VOLUME_STEP);
|
|
99
|
+
}
|
|
55
100
|
/**
|
|
56
101
|
* Schedules a sequence of notes on the shared `AudioContext`.
|
|
57
102
|
* Silently exits if audio has not been initialised yet.
|
package/dist/audio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAAA,IAAI,GAAG,GAAwB,IAAI,CAAA;AACnC,IAAI,UAAU,GAAoB,IAAI,CAAA;AAEtC;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CAAC,MAAM,GAAG,GAAG;IACpC,IAAI,GAAG;QAAE,OAAM;IACf,GAAG,GAAG,IAAI,YAAY,EAAE,CAAA;IACxB,UAAU,GAAG,GAAG,CAAC,UAAU,EAAE,CAAA;IAC7B,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
|
package/dist/input.d.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
export type Direction = 'up' | 'down' | 'left' | 'right';
|
|
3
3
|
/**
|
|
4
4
|
* Attaches global `keydown`/`keyup` listeners and configures key-repeat timing.
|
|
5
|
-
*
|
|
5
|
+
* Idempotent — safe to call multiple times. Timing params are always updated;
|
|
6
|
+
* listeners are only attached on the first call.
|
|
6
7
|
* Arrow keys drive movement; `F`/`f` = flag; `P`/`p` = pause; `Ctrl+Shift+B` = debug toggle.
|
|
7
8
|
*
|
|
8
9
|
* @param repeatDelay - Milliseconds before auto-repeat starts after initial press (default `150`)
|
|
@@ -10,7 +11,7 @@ export type Direction = 'up' | 'down' | 'left' | 'right';
|
|
|
10
11
|
*
|
|
11
12
|
* @example
|
|
12
13
|
* initInput() // defaults: 150ms delay, 80ms repeat
|
|
13
|
-
* initInput(200, 60) // custom timing
|
|
14
|
+
* initInput(200, 60) // custom timing; safe to call again to reconfigure
|
|
14
15
|
*/
|
|
15
16
|
export declare function initInput(repeatDelay?: number, repeatInterval?: number): void;
|
|
16
17
|
/**
|
|
@@ -48,4 +49,14 @@ export declare function consumeAnyKey(): boolean;
|
|
|
48
49
|
* if (isHeld('ArrowUp')) { ... }
|
|
49
50
|
*/
|
|
50
51
|
export declare function isHeld(key: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Clears all pending key state immediately.
|
|
54
|
+
* Call when entering a new game phase (e.g. after game-over or menu transition)
|
|
55
|
+
* to prevent stale inputs from carrying over.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* appPhase = 'gameover'
|
|
59
|
+
* resetInput() // discard any queued keypresses from the previous phase
|
|
60
|
+
*/
|
|
61
|
+
export declare function resetInput(): void;
|
|
51
62
|
//# sourceMappingURL=input.d.ts.map
|
package/dist/input.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAoBxD;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,WAAW,SAAM,EAAE,cAAc,SAAK,GAAG,IAAI,CAoCtE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAe3D;AAED,sGAAsG;AACtG,wBAAgB,WAAW,IAAI,OAAO,CAA+D;AAErG,gGAAgG;AAChG,wBAAgB,YAAY,IAAI,OAAO,CAA8D;AAErG,kFAAkF;AAClF,wBAAgB,YAAY,IAAI,OAAO,CAA8D;AAErG;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAA6D;AAErG;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAyB;AAErE;;;;;;;;GAQG;AACH,wBAAgB,UAAU,IAAI,IAAI,CASjC"}
|
package/dist/input.js
CHANGED
|
@@ -12,9 +12,11 @@ let repeatPhase = 'idle';
|
|
|
12
12
|
let pendingImmediate = null;
|
|
13
13
|
let _repeatDelay = 150;
|
|
14
14
|
let _repeatInterval = 80;
|
|
15
|
+
let inputInitialized = false;
|
|
15
16
|
/**
|
|
16
17
|
* Attaches global `keydown`/`keyup` listeners and configures key-repeat timing.
|
|
17
|
-
*
|
|
18
|
+
* Idempotent — safe to call multiple times. Timing params are always updated;
|
|
19
|
+
* listeners are only attached on the first call.
|
|
18
20
|
* Arrow keys drive movement; `F`/`f` = flag; `P`/`p` = pause; `Ctrl+Shift+B` = debug toggle.
|
|
19
21
|
*
|
|
20
22
|
* @param repeatDelay - Milliseconds before auto-repeat starts after initial press (default `150`)
|
|
@@ -22,11 +24,14 @@ let _repeatInterval = 80;
|
|
|
22
24
|
*
|
|
23
25
|
* @example
|
|
24
26
|
* initInput() // defaults: 150ms delay, 80ms repeat
|
|
25
|
-
* initInput(200, 60) // custom timing
|
|
27
|
+
* initInput(200, 60) // custom timing; safe to call again to reconfigure
|
|
26
28
|
*/
|
|
27
29
|
export function initInput(repeatDelay = 150, repeatInterval = 80) {
|
|
28
30
|
_repeatDelay = repeatDelay;
|
|
29
31
|
_repeatInterval = repeatInterval;
|
|
32
|
+
if (inputInitialized)
|
|
33
|
+
return;
|
|
34
|
+
inputInitialized = true;
|
|
30
35
|
window.addEventListener('keydown', (e) => {
|
|
31
36
|
if (e.repeat)
|
|
32
37
|
return;
|
|
@@ -108,4 +113,23 @@ export function consumeAnyKey() { const v = pendingAnyKey; pendingAnyKey = false
|
|
|
108
113
|
* if (isHeld('ArrowUp')) { ... }
|
|
109
114
|
*/
|
|
110
115
|
export function isHeld(key) { return held.has(key); }
|
|
116
|
+
/**
|
|
117
|
+
* Clears all pending key state immediately.
|
|
118
|
+
* Call when entering a new game phase (e.g. after game-over or menu transition)
|
|
119
|
+
* to prevent stale inputs from carrying over.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* appPhase = 'gameover'
|
|
123
|
+
* resetInput() // discard any queued keypresses from the previous phase
|
|
124
|
+
*/
|
|
125
|
+
export function resetInput() {
|
|
126
|
+
held.clear();
|
|
127
|
+
pendingFlag = false;
|
|
128
|
+
pendingDebug = false;
|
|
129
|
+
pendingPause = false;
|
|
130
|
+
pendingAnyKey = false;
|
|
131
|
+
repeatDir = null;
|
|
132
|
+
repeatPhase = 'idle';
|
|
133
|
+
pendingImmediate = null;
|
|
134
|
+
}
|
|
111
135
|
//# sourceMappingURL=input.js.map
|
package/dist/input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAGA,MAAM,QAAQ,GAA8B;IAC1C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO;CACzE,CAAA;AAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;AAC9B,IAAI,WAAW,GAAG,KAAK,CAAA;AACvB,IAAI,YAAY,GAAG,KAAK,CAAA;AACxB,IAAI,YAAY,GAAG,KAAK,CAAA;AACxB,IAAI,aAAa,GAAG,KAAK,CAAA;AAEzB,IAAI,SAAS,GAAqB,IAAI,CAAA;AACtC,IAAI,WAAW,GAAG,CAAC,CAAA;AACnB,IAAI,WAAW,GAAgC,MAAM,CAAA;AACrD,IAAI,gBAAgB,GAAqB,IAAI,CAAA;AAC7C,IAAI,YAAY,GAAG,GAAG,CAAA;AACtB,IAAI,eAAe,GAAG,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"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"}
|
package/dist/renderer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,MAAM,EACb,KAAK,SAAM,EACX,MAAM,SAAM,GACX,wBAAwB,CAS1B;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,CAUxD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,UAAU,EAClB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GACzB,IAAI,CAKN;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAC1B,IAAI,CAON;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAC1B,IAAI,CAIN;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,EACZ,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAC1B,IAAI,CAGN;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAgB,GAC3B,IAAI,CAWN"}
|
package/dist/renderer.js
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { C, CELL } from './palette.js';
|
|
2
2
|
import { getCharRow } from './font.js';
|
|
3
|
+
function drawBitmap(ctx, getByte, x, y) {
|
|
4
|
+
for (let row = 0; row < 8; row++) {
|
|
5
|
+
const byte = getByte(row);
|
|
6
|
+
for (let bit = 0; bit < 8; bit++) {
|
|
7
|
+
if (byte & (0x80 >> bit))
|
|
8
|
+
ctx.fillRect(x + bit, y + row, 1, 1);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
3
12
|
/**
|
|
4
13
|
* Initialises a canvas element for pixel-perfect scaled rendering.
|
|
5
14
|
* Sets canvas dimensions, applies CSS size, disables image smoothing, applies `ctx.scale()`,
|
|
@@ -65,13 +74,7 @@ export function drawSprite(ctx, sprite, x, y, ink, paper) {
|
|
|
65
74
|
ctx.fillStyle = paper;
|
|
66
75
|
ctx.fillRect(x, y, CELL, CELL);
|
|
67
76
|
ctx.fillStyle = ink;
|
|
68
|
-
|
|
69
|
-
const byte = sprite[row];
|
|
70
|
-
for (let bit = 0; bit < 8; bit++) {
|
|
71
|
-
if (byte & (0x80 >> bit))
|
|
72
|
-
ctx.fillRect(x + bit, y + row, 1, 1);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
77
|
+
drawBitmap(ctx, row => sprite[row], x, y);
|
|
75
78
|
}
|
|
76
79
|
/**
|
|
77
80
|
* Draws a single ASCII character at game coordinates using the ROM font.
|
|
@@ -94,13 +97,7 @@ export function drawChar(ctx, code, x, y, ink, paper) {
|
|
|
94
97
|
ctx.fillRect(x, y, CELL, CELL);
|
|
95
98
|
}
|
|
96
99
|
ctx.fillStyle = ink;
|
|
97
|
-
|
|
98
|
-
const byte = getCharRow(code, row);
|
|
99
|
-
for (let bit = 0; bit < 8; bit++) {
|
|
100
|
-
if (byte & (0x80 >> bit))
|
|
101
|
-
ctx.fillRect(x + bit, y + row, 1, 1);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
100
|
+
drawBitmap(ctx, row => getCharRow(code, row), x, y);
|
|
104
101
|
}
|
|
105
102
|
/**
|
|
106
103
|
* Draws a string left-to-right starting at game coordinates `(x, y)`.
|
package/dist/renderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,WAAW,CACzB,MAAyB,EACzB,KAAa,EACb,KAAK,GAAG,GAAG,EACX,MAAM,GAAG,GAAG;IAEZ,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;IAC5B,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,KAAK,CAAA;IAC9B,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,KAAK,IAAI,CAAA;IACzC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,IAAI,CAAA;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE,CAAA;IACpC,GAAG,CAAC,qBAAqB,GAAG,KAAK,CAAA;IACjC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACvB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAe;IAC1C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACvC,CAAC;QACD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACZ,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,UAAU,CACxB,GAA6B,EAC7B,MAAkB,EAClB,CAAS,EAAE,CAAS,EACpB,GAAW,EAAE,KAAa;IAE1B,GAAG,CAAC,SAAS,GAAG,KAAK,CAAA;IACrB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAC9B,GAAG,CAAC,SAAS,GAAG,GAAG,CAAA;IACnB,
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zx-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Reusable ZX Spectrum primitives: font, palette, renderer, audio, input",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
"main": "./dist/index.js",
|
|
13
13
|
"types": "./dist/index.d.ts",
|
|
14
14
|
"files": [
|
|
15
|
-
"dist"
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
16
18
|
],
|
|
17
19
|
"scripts": {
|
|
18
20
|
"build": "tsc",
|