zx-kit 0.21.0 → 0.23.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 CHANGED
@@ -27,10 +27,11 @@ The goal is simple: **it should look and sound like a Spectrum, but run like a m
27
27
  - **Canvas renderer** — pixel-perfect scaled rendering, sprite flipping, text drawing, CRT scanline overlay, animated border flashing
28
28
  - **Tile map engine** — scrollable maps, O(1) id-index, smart seasonal background swapping, solid-tile collision queries
29
29
  - **Free-roaming sprites** — position, velocity, gravity, `flipX` caching, transparent or opaque background
30
- - **AABB collision resolution** — sprite vs. sprite overlap, sprite vs. tile map wall resolution with directional hit flags
30
+ - **Three-tier collision** — AABB overlap tests, generic rect-vs-tile wall resolution (any sprite size), and pixel-precise mask overlap with O(pixels) sorted-merge intersection — no allocations per frame
31
31
  - **Keyboard input** — configurable key-repeat, single-consume action flags, instant state reset on phase transitions
32
32
  - **ZX-style UI widgets** — progress bars with managed lifetime, boxes, frames, panel titles
33
33
  - **Typed save / load** — persistent saves via `localStorage` with schema versioning, migrations, slot enumeration, in-memory throttling, and discriminated Result types for every failure mode
34
+ - **Runtime locale switching** — type-safe string-pack selection via `pickLocale()`, so a game can switch language while running — unimaginable on the original Spectrum, natural in the browser
34
35
  - **Zero dependencies** — only Web platform APIs: `Canvas`, `Web Audio`, `KeyboardEvent`
35
36
  - **Tree-shakeable** — `sideEffects: false`, so unused modules are dropped from your production bundle
36
37
  - **TypeScript-first** — strict mode, full `.d.ts` declarations, no `any`
@@ -539,7 +540,7 @@ requestAnimationFrame(loop)
539
540
  | [`ui.ts`](#uits--ui-widgets) | Boxes, frames, panel titles, progress bars + instrumentation widgets (dotted grids, segmented bars, fluid tanks, dials, text compass) |
540
541
  | [`input.ts`](#inputts--keyboard-input) | Movement with key-repeat, action flags, state reset |
541
542
  | [`sprite.ts`](#spritets--free-roaming-sprites) | Sprites: position, velocity, gravity, flip, render |
542
- | [`collision.ts`](#collisionts--aabb-collision) | AABB overlap tests, tile-map wall resolution |
543
+ | [`collision.ts`](#collisionts--collision-detection) | AABB overlap + rect-based tile resolution, pixel-precise mask overlap and tile checks |
543
544
  | [`animation.ts`](#animationts--frame-timer--tween) | Frame-timer for sprite strips, position tween between two points |
544
545
  | [`camera.ts`](#camerats--scrolling-camera) | Viewport that follows a target with lerp + deadzone, world-bounds clamping |
545
546
  | [`scene.ts`](#scenets--scene-manager) | Stack-based scene manager with onEnter/onExit/onPause/onResume hooks |
@@ -547,6 +548,7 @@ requestAnimationFrame(loop)
547
548
  | [`tilemap.ts`](#tilemapts--tile-map-engine) | Scrollable maps, solid tiles, O(1) id-index, background swap |
548
549
  | [`palette.ts`](#palettets--color-constants) | 15 Spectrum colors, `SpectrumColor` type, `CELL`, `SCALE` |
549
550
  | [`font.ts`](#fontts--rom-bitmap-font) | 96-character ROM font, raw bitmap access |
551
+ | [`i18n.ts`](#i18nts--runtime-locale-selection) | Type-safe runtime locale selection for translated string packs |
550
552
 
551
553
  ---
552
554
 
@@ -902,6 +904,36 @@ curveDisplay(ctx) // default strength
902
904
  curveDisplay(ctx, 256, 208, 6) // stronger warp
903
905
  ```
904
906
 
907
+ ### `createBitmapFromRows(rows): Bitmap`
908
+
909
+ Builds an arbitrary-size `Bitmap` from readable pixel-art rows instead of
910
+ hand-packed bytes. This is useful for sprites larger than 8x8 where hex arrays
911
+ become hard to review.
912
+
913
+ - `X` or `#` = solid pixel
914
+ - `.` or space = transparent pixel
915
+ - every row must have the same width
916
+ - width must be a positive multiple of 8
917
+
918
+ ```ts
919
+ const TRUCK = createBitmapFromRows([
920
+ '....XXXXXXXX....',
921
+ '..XXXXXXXXXXXX..',
922
+ '.XXXX......XXXX.',
923
+ 'XXXXXXXXXXXXXXXX',
924
+ 'XX..XXXXXXXX..XX',
925
+ 'XX............XX',
926
+ '..XXX......XXX..',
927
+ '................',
928
+ ])
929
+
930
+ drawBitmap(ctx, TRUCK, x, y, C.B_WHITE)
931
+ ```
932
+
933
+ The returned object is the same `Bitmap` shape produced by `createBitmap()`, so
934
+ it works with `drawBitmap`, `drawBitmapAttrs`, `mirrorBitmap`, and collision
935
+ helpers such as `bitmapPixelMask`.
936
+
905
937
  ---
906
938
 
907
939
  ## `audio.ts` — Beeper Audio
@@ -1412,9 +1444,17 @@ renderSprite(ctx, player)
1412
1444
 
1413
1445
  ---
1414
1446
 
1415
- ## `collision.ts` — AABB Collision
1447
+ ## `collision.ts` — Collision Detection
1448
+
1449
+ Three tiers of collision detection, from broad-phase to pixel-precise:
1450
+
1451
+ | Tier | Functions | Use case |
1452
+ |------|-----------|----------|
1453
+ | **AABB** | `rectsOverlap`, `spritesOverlap`, `spriteRect`, `bitmapRect` | Fast broad-phase hit tests |
1454
+ | **Rect-vs-tile** | `isSolidAt`, `resolveRectX`, `resolveRectY`, `resolveX`, `resolveY` | Wall resolution for any sprite size |
1455
+ | **Pixel-precise** | `bitmapPixelMask`, `masksOverlap`, `pixelSolidCount` | Exact opaque-pixel overlap tests |
1416
1456
 
1417
- Axis-aligned bounding box overlap tests and sprite-vs-tile-map wall resolution.
1457
+ Pick the tier that matches your accuracy need. AABB is O(1) and correct for most cases. Pixel-precise costs O(opaque pixels) but eliminates false positives for non-rectangular sprites.
1418
1458
 
1419
1459
  ### `Rect` interface
1420
1460
 
@@ -1422,19 +1462,36 @@ Axis-aligned bounding box overlap tests and sprite-vs-tile-map wall resolution.
1422
1462
  interface Rect { x: number; y: number; w: number; h: number }
1423
1463
  ```
1424
1464
 
1425
- ### `spriteRect(sprite): Rect`
1465
+ An axis-aligned bounding rectangle in game pixels.
1466
+
1467
+ ---
1468
+
1469
+ ### AABB overlap tests
1470
+
1471
+ #### `spriteRect(sprite): Rect`
1426
1472
 
1427
1473
  Returns the `CELL × CELL` bounding box of a sprite at its current position.
1428
1474
 
1429
- ### `rectsOverlap(a, b): boolean`
1475
+ #### `bitmapRect(bitmap, x, y): Rect`
1430
1476
 
1431
- Returns `true` when two rectangles share at least one pixel. Touching edges return `false`.
1477
+ Returns the bounding box for any `Bitmap` at `(x, y)`. Correct for bitmaps of any size 16×24, 32×32, 96×128 — not just `CELL × CELL`.
1478
+
1479
+ ```ts
1480
+ const heroRect = bitmapRect(HERO_BMP, hero.x, hero.y)
1481
+ const enemyRect = bitmapRect(ENEMY_BMP, enemy.x, enemy.y)
1482
+ if (rectsOverlap(heroRect, enemyRect)) damage(hero)
1483
+ ```
1484
+
1485
+ #### `rectsOverlap(a, b): boolean`
1486
+
1487
+ Returns `true` when two rectangles share at least one pixel. Touching edges (zero-area overlap) return `false`.
1432
1488
 
1433
1489
  ```ts
1434
1490
  rectsOverlap(spriteRect(bullet), spriteRect(enemy)) // hit test
1491
+ rectsOverlap(bitmapRect(HERO_BMP, hx, hy), bitmapRect(SWORD_BMP, sx, sy))
1435
1492
  ```
1436
1493
 
1437
- ### `spritesOverlap(a, b): boolean`
1494
+ #### `spritesOverlap(a, b): boolean`
1438
1495
 
1439
1496
  Shorthand: `rectsOverlap(spriteRect(a), spriteRect(b))`.
1440
1497
 
@@ -1443,13 +1500,46 @@ if (spritesOverlap(player, coin)) collectCoin()
1443
1500
  if (enemies.some(e => spritesOverlap(player, e))) loseLife()
1444
1501
  ```
1445
1502
 
1446
- ### `isSolidAt(map, px, py): boolean`
1503
+ ---
1504
+
1505
+ ### Rect-vs-tile resolution
1506
+
1507
+ #### `isSolidAt(map, px, py): boolean`
1508
+
1509
+ Tests whether the game-pixel `(px, py)` falls inside a solid tile. Out-of-bounds pixels return `true` (implicit solid boundary). Converts to tile coords via `Math.floor(px / CELL)`.
1510
+
1511
+ ```ts
1512
+ if (isSolidAt(map, player.x, player.y + CELL)) { player.vy = 0 } // on floor
1513
+ ```
1514
+
1515
+ #### `resolveRectX(rect, map, newX): { x, hitLeft, hitRight }`
1516
+
1517
+ Generic horizontal resolver for any axis-aligned rectangle. Checks every tile row the rectangle spans — so a 16×24 hero correctly detects walls in the middle rows, not just the top and bottom corners.
1518
+
1519
+ Returns the clamped x and collision flags. On collision, the rectangle is placed flush against the wall.
1520
+
1521
+ ```ts
1522
+ const rect = bitmapRect(HERO_BMP, hero.x, hero.y)
1523
+ const r = resolveRectX(rect, map, hero.x + dx)
1524
+ hero.x = r.x
1525
+ if (r.hitLeft || r.hitRight) hero.vx = 0
1526
+ ```
1527
+
1528
+ #### `resolveRectY(rect, map, newY): { y, hitTop, hitBottom }`
1447
1529
 
1448
- Tests whether the game-pixel `(px, py)` falls inside a solid tile. Out-of-bounds pixels return `true` (implicit solid boundary).
1530
+ Generic vertical resolver for any axis-aligned rectangle. Checks every tile column the rectangle spans — so a wide wagon detects the floor across its full footprint.
1449
1531
 
1450
- ### `resolveX(sprite, map, newX): { x, hitLeft, hitRight }`
1532
+ ```ts
1533
+ const rect = bitmapRect(HERO_BMP, hero.x, hero.y)
1534
+ const r = resolveRectY(rect, map, hero.y + dy)
1535
+ hero.y = r.y
1536
+ if (r.hitBottom) { hero.vy = 0; onGround = true }
1537
+ if (r.hitTop) { hero.vy = 0 }
1538
+ ```
1451
1539
 
1452
- Resolves a proposed horizontal move against solid tiles. Returns the clamped position and directional hit flags. No collision → returns `newX` unchanged.
1540
+ #### `resolveX(sprite, map, newX): { x, hitLeft, hitRight }`
1541
+
1542
+ Resolves a proposed horizontal move for an 8×8 sprite. Thin wrapper over `resolveRectX` — preserved for the common CELL-sized sprite case.
1453
1543
 
1454
1544
  ```ts
1455
1545
  const { x, hitLeft, hitRight } = resolveX(player, map, player.x)
@@ -1457,9 +1547,9 @@ player.x = x
1457
1547
  if (hitLeft || hitRight) player.vx = 0
1458
1548
  ```
1459
1549
 
1460
- ### `resolveY(sprite, map, newY): { y, hitTop, hitBottom }`
1550
+ #### `resolveY(sprite, map, newY): { y, hitTop, hitBottom }`
1461
1551
 
1462
- Resolves a proposed vertical move against solid tiles.
1552
+ Resolves a proposed vertical move for an 8×8 sprite. Thin wrapper over `resolveRectY`.
1463
1553
 
1464
1554
  - `hitBottom` — landed on a floor (use for jump ground detection)
1465
1555
  - `hitTop` — bumped a ceiling
@@ -1473,6 +1563,116 @@ if (hitTop) { player.vy = 0 }
1473
1563
 
1474
1564
  ---
1475
1565
 
1566
+ ### Pixel-precise collision
1567
+
1568
+ AABB and rect-vs-tile use the full bounding box. This is almost always correct — but it fails for non-rectangular sprites in edge cases: a circular character standing on a ledge, a diamond-shaped projectile grazing a corner, a tall hero with narrow feet that shouldn't trigger floor detection when hanging over a gap.
1569
+
1570
+ Pixel-precise collision solves this by working with the actual opaque pixels of a bitmap, not its enclosing rectangle.
1571
+
1572
+ ```
1573
+ AABB (16px wide): ████████████████ → fires when any part of the box overlaps
1574
+ a tile, even if the sprite itself clears it
1575
+ pixelSolidCount: ···██····██···· → only the real foot pixels are checked —
1576
+ Dizzy hanging over a platform edge doesn't
1577
+ feel magically glued to empty air
1578
+ ```
1579
+
1580
+ #### `PixelMask` interface
1581
+
1582
+ ```ts
1583
+ interface PixelMask {
1584
+ readonly width: number
1585
+ readonly height: number
1586
+ readonly rows: readonly (readonly number[])[] // per-row sorted opaque column indices
1587
+ readonly totalPixels: number
1588
+ }
1589
+ ```
1590
+
1591
+ Pre-computed per-row opaque pixel data for a `Bitmap`. Build once with `bitmapPixelMask`; reuse every frame. Each `rows[r]` is a sorted array of column indices where that row has a set bit. Empty rows have zero-length arrays — never `undefined`.
1592
+
1593
+ ```
1594
+ // Example: 16×16 circular sprite
1595
+ mask.rows[0] → [6, 7, 8, 9] // narrow top
1596
+ mask.rows[7] → [0, 1, 2, ..., 15] // full-width middle
1597
+ mask.rows[11] → [3, 4, 10, 11] // only feet
1598
+ mask.rows[14] → [] // below feet, empty
1599
+ ```
1600
+
1601
+ The immutability guarantee matters: the mask is derived from immutable `Bitmap` data. Pre-compute once and store alongside the bitmap definition.
1602
+
1603
+ #### `bitmapPixelMask(bitmap): PixelMask`
1604
+
1605
+ Extracts a pixel mask from a `Bitmap`. Reads each row's bit data (bit 7 = leftmost pixel) and collects column indices of set (opaque) pixels into sorted arrays. Counts `totalPixels` for overlap severity calculations.
1606
+
1607
+ ```ts
1608
+ // Pre-compute at module load time — not inside the game loop
1609
+ const HERO_MASK = bitmapPixelMask(HERO_BMP)
1610
+ const ENEMY_MASK = bitmapPixelMask(ENEMY_BMP)
1611
+ const BULLET_MASK = bitmapPixelMask(BULLET_BMP)
1612
+ ```
1613
+
1614
+ **Bitmap width must be a multiple of 8.** Bitmaps with width `w` require `w * height / 8` bytes of data — standard `createBitmap` enforces this.
1615
+
1616
+ #### `masksOverlap(a, ax, ay, b, bx, by): number`
1617
+
1618
+ Counts opaque pixels of mask `a` at `(ax, ay)` that overlap with opaque pixels of mask `b` at `(bx, by)`.
1619
+
1620
+ Returns **0** when there is no pixel-level overlap. Any value **> 0** is a pixel-perfect collision. The count itself carries semantic meaning: use it for overlap severity — damage scaling, knock-back strength, or as a threshold to ignore grazing touches.
1621
+
1622
+ Uses sorted-merge intersection per row: O(opaque pixels), no allocations per call. Safe to call every frame for multiple pairs.
1623
+
1624
+ ```ts
1625
+ // Simple hit test
1626
+ if (masksOverlap(BULLET_MASK, bullet.x, bullet.y, ENEMY_MASK, enemy.x, enemy.y) > 0) {
1627
+ destroyEnemy()
1628
+ }
1629
+
1630
+ // Severity — require a real overlap, not just a 1-pixel graze
1631
+ const overlap = masksOverlap(SWORD_MASK, sx, sy, HERO_MASK, hx, hy)
1632
+ if (overlap >= 3) {
1633
+ takeDamage(Math.round(overlap / SWORD_MASK.totalPixels * 10))
1634
+ }
1635
+ ```
1636
+
1637
+ Masks of different sizes work without any special handling — the overlap window is clipped to the intersection region automatically.
1638
+
1639
+ #### `pixelSolidCount(mask, mx, my, map): number`
1640
+
1641
+ Counts opaque pixels of a mask at `(mx, my)` that sit on solid tiles in a `TileMap`. Pixel-precise replacement for AABB-based ground / wall checks.
1642
+
1643
+ Solves the "character standing on a platform edge" problem: a round sprite with narrow feet can hang over the edge — only the real foot pixels are checked against the tile map, not the full bounding box.
1644
+
1645
+ ```ts
1646
+ const HERO_MASK = bitmapPixelMask(HERO_BMP)
1647
+
1648
+ // Check if standing — test 1 px below current foot position
1649
+ const standing = pixelSolidCount(HERO_MASK, hero.x, hero.y + 1, map) > 0
1650
+
1651
+ // Check wall to the right — test 1 px past right edge
1652
+ const wallRight = pixelSolidCount(HERO_MASK, hero.x + 1, hero.y, map) > 0
1653
+
1654
+ // How many foot pixels are actually on solid ground? Use as grip factor
1655
+ const groundContact = pixelSolidCount(HERO_MASK, hero.x, hero.y + 1, map)
1656
+ ```
1657
+
1658
+ When `groundContact` is 0, a circle-shaped hero hanging over a tile edge won't trigger `hitBottom` in `resolveRectY` — the pixel-check and AABB-check intentionally disagree, and you pick which one to trust for each gameplay mechanic.
1659
+
1660
+ ---
1661
+
1662
+ ### Choosing the right tier
1663
+
1664
+ | Situation | Recommended tier |
1665
+ |-----------|-----------------|
1666
+ | Player touches any part of a coin | `spritesOverlap` — AABB is exact when both sprites are `CELL × CELL` |
1667
+ | Large hero (16×24) walks into a wall | `resolveRectX` / `resolveRectY` — checks all tile rows the sprite spans |
1668
+ | Round sprite on a platform edge | `pixelSolidCount` — only real foot pixels count |
1669
+ | Bullet vs. irregular boss sprite | `masksOverlap` — pixel-precise, returns overlap count for damage |
1670
+ | Off-road detection for a truck with a bumpy silhouette | `pixelSolidCount` / custom mask loop — checks each opaque pixel against road boundary |
1671
+
1672
+ For a step-by-step walkthrough of both tiers — including how to combine AABB and pixel-precise in one loop and how to handle non-tile boundaries — see **[docs/collision.md](docs/collision.md)**.
1673
+
1674
+ ---
1675
+
1476
1676
  ## `animation.ts` — Frame Timer & Tween
1477
1677
 
1478
1678
  Two small primitives for time-based animation:
@@ -2026,6 +2226,57 @@ for (let row = 0; row < 8; row++) {
2026
2226
 
2027
2227
  ---
2028
2228
 
2229
+ ## `i18n.ts` — Runtime Locale Selection
2230
+
2231
+ A tiny helper for choosing a translated string pack at runtime. The original ZX Spectrum could not realistically swap whole languages while a game was running; zx-kit keeps the Spectrum presentation, but lets browser games offer modern language switching without a framework or dependency.
2232
+
2233
+ ### `pickLocale(defaultLocale, locales, code): T`
2234
+
2235
+ Selects a locale object by language code and falls back to the default locale when the code is missing, empty, or unknown. Matching is case-insensitive.
2236
+
2237
+ ```ts
2238
+ import { pickLocale } from 'zx-kit'
2239
+ import * as en from './strings'
2240
+ import * as sk from './strings.sk'
2241
+ import * as ru from './strings.ru'
2242
+
2243
+ let languageCode = localStorage.getItem('language') // e.g. 'sk'
2244
+ let L = pickLocale(en, { sk, ru }, languageCode)
2245
+
2246
+ drawText(ctx, L.STR_PRESS_START, 32, 88, C.B_WHITE, C.BLACK)
2247
+
2248
+ function setLanguage(code: string): void {
2249
+ languageCode = code
2250
+ localStorage.setItem('language', code)
2251
+ L = pickLocale(en, { sk, ru }, languageCode)
2252
+ }
2253
+ ```
2254
+
2255
+ Every locale must have the same shape as the default locale. Because `pickLocale` is generic over that shape, missing keys and wrong function signatures are caught by TypeScript:
2256
+
2257
+ ```ts
2258
+ // strings.ts
2259
+ export const STR_PRESS_START = 'PRESS START'
2260
+ export const STR_DEPTH = (m: number) => `D:${m}M`
2261
+
2262
+ // strings.sk.ts
2263
+ export const STR_PRESS_START = 'STLAC START'
2264
+ export const STR_DEPTH = (m: number) => `H:${m}M`
2265
+ ```
2266
+
2267
+ Selection rules:
2268
+
2269
+ | Code | Result |
2270
+ |------|--------|
2271
+ | `null`, `undefined`, `''` | `defaultLocale` |
2272
+ | `'sk'`, `'SK'`, `'Sk'` | `locales.sk` |
2273
+ | unknown code | `defaultLocale` |
2274
+ | `'en'` when `en` is not in `locales` | `defaultLocale` |
2275
+
2276
+ The default language does not need its own `strings.en.ts` file. Keep the source language at `strings.ts`, put only additional translations in the locale map, and call `pickLocale` again whenever the player changes language.
2277
+
2278
+ ---
2279
+
2029
2280
  ## Architecture
2030
2281
 
2031
2282
  ### Module structure
@@ -2039,9 +2290,8 @@ zx-kit/
2039
2290
  │ ├── index.ts # barrel — re-exports everything
2040
2291
  │ ├── palette.ts # SCALE, CELL, C, SpectrumColor
2041
2292
  │ ├── font.ts # FONT, getCharRow
2042
- │ ├── renderer.ts # setupCanvas, mirrorSprite, drawSprite, drawChar,
2043
- │ │ # drawText, drawTextCentered, flashBorder,
2044
- │ │ # drawScanlines, curveDisplay
2293
+ │ ├── renderer.ts # canvas setup, 8×8 sprites, arbitrary-size Bitmap,
2294
+ │ │ # AttrMap colour attributes, text, scanlines, border flash
2045
2295
  │ ├── audio.ts # initAudio, resumeAudio, beep, playPattern,
2046
2296
  │ │ # getAudioContext, getMasterGain,
2047
2297
  │ │ # getMasterVolume, setMasterVolume,
@@ -2052,13 +2302,16 @@ zx-kit/
2052
2302
  │ │ # consumePause, consumeDebug, consumeAnyKey,
2053
2303
  │ │ # isHeld, resetInput, Direction
2054
2304
  │ ├── ui.ts # drawBox, drawFrame, drawPanelTitle,
2055
- │ │ # drawProgressBar, tickUI, renderUI, resetUI,
2056
- │ │ # BorderOptions, DrawProgressBarOptions
2305
+ │ │ # instrumentation widgets, progress bars
2057
2306
  │ ├── tilemap.ts # createTileMap, Tile, Viewport, TileMap
2058
2307
  │ ├── sprite.ts # createSprite, moveSprite, applyGravity,
2059
2308
  │ │ # renderSprite, Sprite
2060
- └── collision.ts # spriteRect, rectsOverlap, spritesOverlap,
2061
- # isSolidAt, resolveX, resolveY, Rect
2309
+ ├── collision.ts # AABB, rect-vs-tile, pixel-precise masks
2310
+ ├── animation.ts # frame timers, tweens, blinkers
2311
+ │ ├── camera.ts # scrolling viewport, lerp, deadzone, bounds
2312
+ │ ├── scene.ts # stack-based scene manager
2313
+ │ ├── save.ts # typed localStorage save/load with migrations
2314
+ │ └── i18n.ts # pickLocale runtime locale selection
2062
2315
  └── dist/ # compiled output (npm run build)
2063
2316
  ├── index.js
2064
2317
  ├── index.d.ts
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Pixel-perfect collision — visual ground truth test.
3
+ *
4
+ * Two bitmaps: 8×8 px each, but only a 2×2 px region is lit
5
+ * (rows 0–1, cols 0–1). The effective sprite shape is 2×2 — a size that
6
+ * is intentionally NOT a multiple of the ZX tile size (8 px).
7
+ *
8
+ * col: 01234567
9
+ * row 0: ██...... (0xC0)
10
+ * row 1: ██...... (0xC0)
11
+ * rows 2–7: empty
12
+ *
13
+ * Ground truth: a brute-force Set-of-pixel-coords intersection.
14
+ * Both sprites are projected to absolute (x,y) coordinates, all lit pixels
15
+ * are collected into a flat Set, and any shared coordinate counts as overlap.
16
+ * No formulas, no assumptions — just "which pixels are painted and do any
17
+ * coordinates match?"
18
+ *
19
+ * Every assertion compares masksOverlap against this ground truth, sweeping
20
+ * sprite B toward sprite A one pixel at a time in all four directions and
21
+ * diagonally. A separate block shows that AABB (8×8 bounding-box) fires
22
+ * 6 pixels earlier than pixel-perfect — the gap the ground truth exposes.
23
+ */
24
+ export {};
25
+ //# sourceMappingURL=collision.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collision.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/collision.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Pixel-perfect collision — visual ground truth test.
3
+ *
4
+ * Two bitmaps: 8×8 px each, but only a 2×2 px region is lit
5
+ * (rows 0–1, cols 0–1). The effective sprite shape is 2×2 — a size that
6
+ * is intentionally NOT a multiple of the ZX tile size (8 px).
7
+ *
8
+ * col: 01234567
9
+ * row 0: ██...... (0xC0)
10
+ * row 1: ██...... (0xC0)
11
+ * rows 2–7: empty
12
+ *
13
+ * Ground truth: a brute-force Set-of-pixel-coords intersection.
14
+ * Both sprites are projected to absolute (x,y) coordinates, all lit pixels
15
+ * are collected into a flat Set, and any shared coordinate counts as overlap.
16
+ * No formulas, no assumptions — just "which pixels are painted and do any
17
+ * coordinates match?"
18
+ *
19
+ * Every assertion compares masksOverlap against this ground truth, sweeping
20
+ * sprite B toward sprite A one pixel at a time in all four directions and
21
+ * diagonally. A separate block shows that AABB (8×8 bounding-box) fires
22
+ * 6 pixels earlier than pixel-perfect — the gap the ground truth exposes.
23
+ */
24
+ import { describe, it, expect } from 'vitest';
25
+ import { bitmapPixelMask, masksOverlap, rectsOverlap } from '../collision.js';
26
+ import { createBitmap } from '../renderer.js';
27
+ // ── Fixture ───────────────────────────────────────────────────────────────────
28
+ // width=8 (minimum for Bitmap: 1 byte per row). height=8.
29
+ // Lit region: rows 0–1, cols 0–1. All other bytes 0x00.
30
+ const BMP = createBitmap(new Uint8Array([
31
+ 0xC0, // row 0: bits 7,6 set → cols 0,1
32
+ 0xC0, // row 1: bits 7,6 set → cols 0,1
33
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // rows 2–7: empty
34
+ ]), 8, 8);
35
+ const MASK = bitmapPixelMask(BMP);
36
+ // ── Brute-force ground truth ──────────────────────────────────────────────────
37
+ // Project every lit pixel of a mask to world (x,y). Put them in a Set.
38
+ // Check if any pixel of B appears in the Set of A. Completely explicit —
39
+ // no clever algorithm, just coordinate comparison.
40
+ function litPixels(mask, ox, oy) {
41
+ const s = new Set();
42
+ for (let row = 0; row < mask.height; row++) {
43
+ for (const col of mask.rows[row]) {
44
+ s.add(`${ox + col},${oy + row}`);
45
+ }
46
+ }
47
+ return s;
48
+ }
49
+ function bruteForce(maskA, ax, ay, maskB, bx, by) {
50
+ const setA = litPixels(maskA, ax, ay);
51
+ for (let row = 0; row < maskB.height; row++) {
52
+ for (const col of maskB.rows[row]) {
53
+ if (setA.has(`${bx + col},${by + row}`))
54
+ return true;
55
+ }
56
+ }
57
+ return false;
58
+ }
59
+ // ─────────────────────────────────────────────────────────────────────────────
60
+ describe('masksOverlap — 2×2 lit region, visual ground truth', () => {
61
+ // ── Sanity-check the mask ─────────────────────────────────────────────────
62
+ describe('mask shape', () => {
63
+ it('has exactly 4 lit pixels (the 2×2 region)', () => {
64
+ expect(MASK.totalPixels).toBe(4);
65
+ });
66
+ it('rows 0–1 contain columns [0, 1]; rows 2–7 are empty', () => {
67
+ expect(MASK.rows[0]).toEqual([0, 1]);
68
+ expect(MASK.rows[1]).toEqual([0, 1]);
69
+ for (let r = 2; r < MASK.height; r++) {
70
+ expect(MASK.rows[r]).toEqual([]);
71
+ }
72
+ });
73
+ });
74
+ // ── Horizontal sweep ──────────────────────────────────────────────────────
75
+ // A is fixed at (20,20). B sweeps from right (x=30) to left (x=17), same y.
76
+ // A's lit pixels: x∈[20,21], y∈[20,21].
77
+ // First contact: bx=21 — B column 0 (x=21) meets A column 1 (x=21).
78
+ // AABB first contact: bx=27 — 8×8 boxes share one column. Gap = 6 px.
79
+ describe('horizontal sweep: B approaches A from the right', () => {
80
+ const AX = 20, AY = 20;
81
+ it('masksOverlap matches brute-force at every pixel step', () => {
82
+ for (let bx = AX + 10; bx >= AX - 3; bx--) {
83
+ const expected = bruteForce(MASK, AX, AY, MASK, bx, AY);
84
+ const actual = masksOverlap(MASK, AX, AY, MASK, bx, AY) > 0;
85
+ if (actual !== expected) {
86
+ throw new Error(`bx=${bx}: masksOverlap=${actual} but brute-force says ${expected}`);
87
+ }
88
+ }
89
+ });
90
+ it('no collision at bx = AX+2 — 1-pixel gap between lit edges', () => {
91
+ // A's rightmost lit column is AX+1=21. B's leftmost at bx=AX+2=22. Gap 1 px.
92
+ expect(masksOverlap(MASK, AX, AY, MASK, AX + 2, AY)).toBe(0);
93
+ expect(bruteForce(MASK, AX, AY, MASK, AX + 2, AY)).toBe(false);
94
+ });
95
+ it('collision fires at bx = AX+1 — lit edges share column AX+1', () => {
96
+ expect(masksOverlap(MASK, AX, AY, MASK, AX + 1, AY)).toBeGreaterThan(0);
97
+ expect(bruteForce(MASK, AX, AY, MASK, AX + 1, AY)).toBe(true);
98
+ });
99
+ it('AABB (8×8 box) fires 6 pixels before pixel-perfect', () => {
100
+ const boxA = { x: AX, y: AY, w: 8, h: 8 };
101
+ // AABB says: first overlap at bx=AX+7 (right edge of A box = left edge of B box)
102
+ expect(rectsOverlap(boxA, { x: AX + 8, y: AY, w: 8, h: 8 })).toBe(false);
103
+ expect(rectsOverlap(boxA, { x: AX + 7, y: AY, w: 8, h: 8 })).toBe(true);
104
+ // Pixel-perfect: no lit pixels near each other at bx=AX+7 — false positive
105
+ expect(masksOverlap(MASK, AX, AY, MASK, AX + 7, AY)).toBe(0);
106
+ expect(bruteForce(MASK, AX, AY, MASK, AX + 7, AY)).toBe(false);
107
+ });
108
+ });
109
+ // ── Vertical sweep ────────────────────────────────────────────────────────
110
+ // A fixed at (20,20). B sweeps from below (y=30) upward (y=17), same x.
111
+ // First contact: by=21 — B row 0 (y=21) meets A row 1 (y=21).
112
+ // AABB first contact: by=27. Gap = 6 px.
113
+ describe('vertical sweep: B approaches A from below', () => {
114
+ const AX = 20, AY = 20;
115
+ it('masksOverlap matches brute-force at every pixel step', () => {
116
+ for (let by = AY + 10; by >= AY - 3; by--) {
117
+ const expected = bruteForce(MASK, AX, AY, MASK, AX, by);
118
+ const actual = masksOverlap(MASK, AX, AY, MASK, AX, by) > 0;
119
+ if (actual !== expected) {
120
+ throw new Error(`by=${by}: masksOverlap=${actual} but brute-force says ${expected}`);
121
+ }
122
+ }
123
+ });
124
+ it('no collision at by = AY+2 — 1-pixel gap between lit rows', () => {
125
+ expect(masksOverlap(MASK, AX, AY, MASK, AX, AY + 2)).toBe(0);
126
+ expect(bruteForce(MASK, AX, AY, MASK, AX, AY + 2)).toBe(false);
127
+ });
128
+ it('collision fires at by = AY+1 — lit rows share row AY+1', () => {
129
+ expect(masksOverlap(MASK, AX, AY, MASK, AX, AY + 1)).toBeGreaterThan(0);
130
+ expect(bruteForce(MASK, AX, AY, MASK, AX, AY + 1)).toBe(true);
131
+ });
132
+ it('AABB fires 6 pixels before pixel-perfect', () => {
133
+ const boxA = { x: AX, y: AY, w: 8, h: 8 };
134
+ expect(rectsOverlap(boxA, { x: AX, y: AY + 8, w: 8, h: 8 })).toBe(false);
135
+ expect(rectsOverlap(boxA, { x: AX, y: AY + 7, w: 8, h: 8 })).toBe(true);
136
+ expect(masksOverlap(MASK, AX, AY, MASK, AX, AY + 7)).toBe(0);
137
+ expect(bruteForce(MASK, AX, AY, MASK, AX, AY + 7)).toBe(false);
138
+ });
139
+ });
140
+ // ── Diagonal sweep ────────────────────────────────────────────────────────
141
+ // A fixed at (20,20). B sweeps along the main diagonal: bx=by=AX+d, d=10→-3.
142
+ // First contact: d=1 — corner pixel (AX+1, AY+1) is shared by both sprites.
143
+ // At d=2: B's nearest pixel is (AX+2, AY+2) — corner of A is (AX+1, AY+1). Gap.
144
+ describe('diagonal sweep: B approaches A from bottom-right', () => {
145
+ const AX = 20, AY = 20;
146
+ it('masksOverlap matches brute-force at every diagonal step', () => {
147
+ for (let d = 10; d >= -3; d--) {
148
+ const bx = AX + d, by = AY + d;
149
+ const expected = bruteForce(MASK, AX, AY, MASK, bx, by);
150
+ const actual = masksOverlap(MASK, AX, AY, MASK, bx, by) > 0;
151
+ if (actual !== expected) {
152
+ throw new Error(`d=${d} (bx=${bx}, by=${by}): masksOverlap=${actual} but brute-force says ${expected}`);
153
+ }
154
+ }
155
+ });
156
+ it('no collision at d=2 — corner pixels are 1 diagonal step apart', () => {
157
+ expect(masksOverlap(MASK, AX, AY, MASK, AX + 2, AY + 2)).toBe(0);
158
+ expect(bruteForce(MASK, AX, AY, MASK, AX + 2, AY + 2)).toBe(false);
159
+ });
160
+ it('collision fires at d=1 — single corner pixel (AX+1, AY+1) coincides', () => {
161
+ expect(masksOverlap(MASK, AX, AY, MASK, AX + 1, AY + 1)).toBeGreaterThan(0);
162
+ expect(bruteForce(MASK, AX, AY, MASK, AX + 1, AY + 1)).toBe(true);
163
+ });
164
+ });
165
+ // ── Overlap count ─────────────────────────────────────────────────────────
166
+ // masksOverlap returns a count, not just a boolean. Verify it grows as the
167
+ // sprites move deeper into each other.
168
+ describe('overlap pixel count increases with penetration depth', () => {
169
+ const AX = 20, AY = 20;
170
+ it('1 overlapping pixel at first horizontal contact (bx = AX+1)', () => {
171
+ // Only column AX+1 is shared (both rows): 2 pixels
172
+ expect(masksOverlap(MASK, AX, AY, MASK, AX + 1, AY)).toBe(2);
173
+ });
174
+ it('4 overlapping pixels when fully aligned (bx = AX)', () => {
175
+ // Complete overlap of the 2×2 regions
176
+ expect(masksOverlap(MASK, AX, AY, MASK, AX, AY)).toBe(4);
177
+ });
178
+ it('single corner pixel at diagonal first contact (d=1)', () => {
179
+ // Only (AX+1, AY+1) is shared
180
+ expect(masksOverlap(MASK, AX, AY, MASK, AX + 1, AY + 1)).toBe(1);
181
+ });
182
+ });
183
+ // ── Symmetry ──────────────────────────────────────────────────────────────
184
+ // masksOverlap(A, B) must equal masksOverlap(B, A) — no directional bias.
185
+ describe('symmetry: collision count is order-independent', () => {
186
+ it('A→B count equals B→A count for all horizontal positions', () => {
187
+ const AX = 20, AY = 20;
188
+ for (let bx = AX + 5; bx >= AX - 3; bx--) {
189
+ const ab = masksOverlap(MASK, AX, AY, MASK, bx, AY);
190
+ const ba = masksOverlap(MASK, bx, AY, MASK, AX, AY);
191
+ if (ab !== ba) {
192
+ throw new Error(`Asymmetry at bx=${bx}: A→B=${ab}, B→A=${ba}`);
193
+ }
194
+ }
195
+ });
196
+ });
197
+ });
198
+ //# sourceMappingURL=collision.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collision.test.js","sourceRoot":"","sources":["../../src/__tests__/collision.test.ts"],"names":[],"mappings":"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"}
@@ -85,6 +85,88 @@ export declare function resolveRectY(rect: Rect, map: TileMap, newY: number): {
85
85
  hitTop: boolean;
86
86
  hitBottom: boolean;
87
87
  };
88
+ /**
89
+ * Pre-computed per-row opaque pixel data for a {@link Bitmap}.
90
+ * Build once with {@link bitmapPixelMask}, reuse every frame.
91
+ *
92
+ * Each row is a sorted array of column indices where the bitmap has a set bit.
93
+ * Empty rows have zero-length arrays — never `undefined`.
94
+ *
95
+ * @example
96
+ * ```
97
+ * // 16×16 circular sprite:
98
+ * mask.rows[0] → [6, 7, 8, 9] // narrow top
99
+ * mask.rows[7] → [0, 1, 2, ..., 15] // full-width middle
100
+ * mask.rows[11] → [3, 4, 10, 11] // only feet
101
+ * mask.rows[14] → [] // below feet, empty
102
+ * ```
103
+ */
104
+ export interface PixelMask {
105
+ readonly width: number;
106
+ readonly height: number;
107
+ readonly rows: readonly (readonly number[])[];
108
+ readonly totalPixels: number;
109
+ }
110
+ /**
111
+ * Extract a pixel mask from a {@link Bitmap}.
112
+ * Reads each row's bit data (bit 7 = leftmost pixel) and collects column
113
+ * indices of set (opaque) pixels into sorted arrays.
114
+ *
115
+ * Pre-compute once per sprite definition — the result is immutable and
116
+ * derived from immutable bitmap data.
117
+ *
118
+ * @example
119
+ * ```ts
120
+ * const HERO_MASK = bitmapPixelMask(HERO_BMP)
121
+ * // Now use with masksOverlap() or pixelSolidCount()
122
+ * ```
123
+ */
124
+ export declare function bitmapPixelMask(bitmap: Bitmap): PixelMask;
125
+ /**
126
+ * Count opaque pixels of mask `a` at `(ax, ay)` that overlap with
127
+ * opaque pixels of mask `b` at `(bx, by)`.
128
+ *
129
+ * Returns 0 when no overlap. Any value > 0 means pixel-perfect collision.
130
+ * The count itself is useful for overlap severity — e.g. damage scaling.
131
+ *
132
+ * Uses sorted-merge intersection per row — O(pixels) total, no allocations.
133
+ *
134
+ * @example
135
+ * ```ts
136
+ * const BULLET = bitmapPixelMask(BULLET_BMP)
137
+ * const ENEMY = bitmapPixelMask(ENEMY_BMP)
138
+ *
139
+ * if (masksOverlap(BULLET, bx, by, ENEMY, ex, ey) > 0) {
140
+ * destroyEnemy()
141
+ * }
142
+ * ```
143
+ */
144
+ export declare function masksOverlap(a: PixelMask, ax: number, ay: number, b: PixelMask, bx: number, by: number): number;
145
+ /**
146
+ * Count opaque pixels of a mask at `(mx, my)` that sit on solid tiles
147
+ * in a {@link TileMap}. Pixel-precise replacement for AABB-based checks.
148
+ *
149
+ * Solves the "character standing on a platform edge" problem: a round
150
+ * sprite with narrow feet can hang over the edge — only real foot pixels
151
+ * are checked, not the full bounding box.
152
+ *
153
+ * ```
154
+ * AABB (16px wide): ████████████████ → full-width overlap check
155
+ * pixelSolidCount: ···██····██···· → only feet matter
156
+ * ```
157
+ *
158
+ * @example
159
+ * ```ts
160
+ * const HERO_MASK = bitmapPixelMask(HERO_BMP)
161
+ *
162
+ * // Check if standing: test 1px below current position
163
+ * const standing = pixelSolidCount(HERO_MASK, hero.x, hero.y + 1, map) > 0
164
+ *
165
+ * // Check wall to the right
166
+ * const wallRight = pixelSolidCount(HERO_MASK, hero.x + 1, hero.y, map) > 0
167
+ * ```
168
+ */
169
+ export declare function pixelSolidCount(mask: PixelMask, mx: number, my: number, map: TileMap): number;
88
170
  /**
89
171
  * Resolves a proposed horizontal movement for an 8×8 sprite against solid tiles.
90
172
  * Thin wrapper over {@link resolveRectX} preserved for backward compatibility.
@@ -1 +1 @@
1
- {"version":3,"file":"collision.d.ts","sourceRoot":"","sources":["../src/collision.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAE3C;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAKtD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAErE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvE;AAwBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAuBpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAuBpD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAEpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAEpD"}
1
+ {"version":3,"file":"collision.d.ts","sourceRoot":"","sources":["../src/collision.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAE3C;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAKtD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAErE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvE;AAwBD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAuBpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAuBpD;AAID;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAA;IAC7C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAiBzD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAC1B,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EACpC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GACnC,MAAM,CAsBR;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EACtB,GAAG,EAAE,OAAO,GACX,MAAM,CAUR;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAEpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,GACX;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAEpD"}
package/dist/collision.js CHANGED
@@ -144,6 +144,123 @@ export function resolveRectY(rect, map, newY) {
144
144
  }
145
145
  return { y, hitTop, hitBottom };
146
146
  }
147
+ /**
148
+ * Extract a pixel mask from a {@link Bitmap}.
149
+ * Reads each row's bit data (bit 7 = leftmost pixel) and collects column
150
+ * indices of set (opaque) pixels into sorted arrays.
151
+ *
152
+ * Pre-compute once per sprite definition — the result is immutable and
153
+ * derived from immutable bitmap data.
154
+ *
155
+ * @example
156
+ * ```ts
157
+ * const HERO_MASK = bitmapPixelMask(HERO_BMP)
158
+ * // Now use with masksOverlap() or pixelSolidCount()
159
+ * ```
160
+ */
161
+ export function bitmapPixelMask(bitmap) {
162
+ const bytesPerRow = bitmap.width / 8;
163
+ const rows = [];
164
+ let total = 0;
165
+ for (let row = 0; row < bitmap.height; row++) {
166
+ const cols = [];
167
+ for (let col = 0; col < bitmap.width; col++) {
168
+ const byteIdx = row * bytesPerRow + Math.floor(col / 8);
169
+ const bitIdx = 7 - (col % 8);
170
+ if (bitmap.data[byteIdx] & (1 << bitIdx))
171
+ cols.push(col);
172
+ }
173
+ rows.push(cols);
174
+ total += cols.length;
175
+ }
176
+ return { width: bitmap.width, height: bitmap.height, rows, totalPixels: total };
177
+ }
178
+ /**
179
+ * Count opaque pixels of mask `a` at `(ax, ay)` that overlap with
180
+ * opaque pixels of mask `b` at `(bx, by)`.
181
+ *
182
+ * Returns 0 when no overlap. Any value > 0 means pixel-perfect collision.
183
+ * The count itself is useful for overlap severity — e.g. damage scaling.
184
+ *
185
+ * Uses sorted-merge intersection per row — O(pixels) total, no allocations.
186
+ *
187
+ * @example
188
+ * ```ts
189
+ * const BULLET = bitmapPixelMask(BULLET_BMP)
190
+ * const ENEMY = bitmapPixelMask(ENEMY_BMP)
191
+ *
192
+ * if (masksOverlap(BULLET, bx, by, ENEMY, ex, ey) > 0) {
193
+ * destroyEnemy()
194
+ * }
195
+ * ```
196
+ */
197
+ export function masksOverlap(a, ax, ay, b, bx, by) {
198
+ const top = Math.max(ay, by);
199
+ const bot = Math.min(ay + a.height, by + b.height);
200
+ if (top >= bot)
201
+ return 0;
202
+ if (ax >= bx + b.width || ax + a.width <= bx)
203
+ return 0;
204
+ let count = 0;
205
+ for (let y = top; y < bot; y++) {
206
+ const rowA = a.rows[y - ay];
207
+ const rowB = b.rows[y - by];
208
+ if (rowA.length === 0 || rowB.length === 0)
209
+ continue;
210
+ let i = 0, j = 0;
211
+ while (i < rowA.length && j < rowB.length) {
212
+ const ca = rowA[i] + ax;
213
+ const cb = rowB[j] + bx;
214
+ if (ca === cb) {
215
+ count++;
216
+ i++;
217
+ j++;
218
+ }
219
+ else if (ca < cb)
220
+ i++;
221
+ else
222
+ j++;
223
+ }
224
+ }
225
+ return count;
226
+ }
227
+ /**
228
+ * Count opaque pixels of a mask at `(mx, my)` that sit on solid tiles
229
+ * in a {@link TileMap}. Pixel-precise replacement for AABB-based checks.
230
+ *
231
+ * Solves the "character standing on a platform edge" problem: a round
232
+ * sprite with narrow feet can hang over the edge — only real foot pixels
233
+ * are checked, not the full bounding box.
234
+ *
235
+ * ```
236
+ * AABB (16px wide): ████████████████ → full-width overlap check
237
+ * pixelSolidCount: ···██····██···· → only feet matter
238
+ * ```
239
+ *
240
+ * @example
241
+ * ```ts
242
+ * const HERO_MASK = bitmapPixelMask(HERO_BMP)
243
+ *
244
+ * // Check if standing: test 1px below current position
245
+ * const standing = pixelSolidCount(HERO_MASK, hero.x, hero.y + 1, map) > 0
246
+ *
247
+ * // Check wall to the right
248
+ * const wallRight = pixelSolidCount(HERO_MASK, hero.x + 1, hero.y, map) > 0
249
+ * ```
250
+ */
251
+ export function pixelSolidCount(mask, mx, my, map) {
252
+ let count = 0;
253
+ for (let row = 0; row < mask.height; row++) {
254
+ const worldY = my + row;
255
+ const tileY = Math.floor(worldY / CELL);
256
+ for (const col of mask.rows[row]) {
257
+ if (map.isSolid(Math.floor((mx + col) / CELL), tileY))
258
+ count++;
259
+ }
260
+ }
261
+ return count;
262
+ }
263
+ // ─── AABB sprite wrappers (backward-compatible) ─────────────────────────────
147
264
  /**
148
265
  * Resolves a proposed horizontal movement for an 8×8 sprite against solid tiles.
149
266
  * Thin wrapper over {@link resolveRectX} preserved for backward compatibility.
@@ -1 +1 @@
1
- {"version":3,"file":"collision.js","sourceRoot":"","sources":["../src/collision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAenC;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAA;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,CAAO,EAAE,CAAO;IAC3C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACf,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACf,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACf,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,CAAS;IACjD,OAAO,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;AACnD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,CAAS,EAAE,CAAS;IAC7D,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;AACpD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY,EAAE,EAAU,EAAE,EAAU;IAC5D,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;AAClE,CAAC;AAED,gFAAgF;AAEhF,SAAS,uBAAuB,CAAC,GAAY,EAAE,KAAa,EAAE,EAAU,EAAE,EAAU;IAClF,mFAAmF;IACnF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;IACrC,KAAK,IAAI,EAAE,GAAG,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC;QAC3C,IAAI,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;IACnD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,yBAAyB,CAAC,GAAY,EAAE,KAAa,EAAE,EAAU,EAAE,EAAU;IACpF,sFAAsF;IACtF,MAAM,QAAQ,GAAI,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;IACvC,KAAK,IAAI,EAAE,GAAG,QAAQ,EAAE,EAAE,IAAI,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;QAC9C,IAAI,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;IACnD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAU,EACV,GAAY,EACZ,IAAY;IAEZ,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IACjB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,CAAC,GAAG,IAAI,CAAA;IACZ,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,QAAQ,GAAG,KAAK,CAAA;IAEpB,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;QAClB,IAAI,uBAAuB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YAC/B,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;YACzC,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,uBAAuB,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,CAAC,CAAA;YACzD,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAA;YAC/C,QAAQ,GAAG,IAAI,CAAA;QACjB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;AACjC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAU,EACV,GAAY,EACZ,IAAY;IAEZ,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IACjB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,CAAC,GAAG,IAAI,CAAA;IACZ,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,SAAS,GAAG,KAAK,CAAA;IAErB,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;QAClB,IAAI,yBAAyB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;YAC/B,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;YACzC,MAAM,GAAG,IAAI,CAAA;QACf,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACpC,IAAI,yBAAyB,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;YACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,UAAU,CAAC,CAAA;YAC1D,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAA;YAC/C,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AACjC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,QAAQ,CACtB,MAAc,EACd,GAAY,EACZ,IAAY;IAEZ,OAAO,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;AACpD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CACtB,MAAc,EACd,GAAY,EACZ,IAAY;IAEZ,OAAO,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;AACpD,CAAC"}
1
+ {"version":3,"file":"collision.js","sourceRoot":"","sources":["../src/collision.ts"],"names":[],"mappings":"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"}
@@ -160,6 +160,27 @@ export interface Bitmap {
160
160
  * ]), 16, 24)
161
161
  */
162
162
  export declare function createBitmap(data: Uint8Array, width: number, height: number): Bitmap;
163
+ /**
164
+ * Constructs a {@link Bitmap} from readable pixel rows.
165
+ *
166
+ * Each string represents one bitmap row. `#` and `X` are treated as solid pixels;
167
+ * `.` and space are treated as transparent pixels. All rows must have identical
168
+ * width, and that width must be a positive multiple of 8 so the result is byte-aligned
169
+ * for the normal {@link createBitmap} / {@link drawBitmap} pipeline.
170
+ *
171
+ * @example
172
+ * const PLAYER = createBitmapFromRows([
173
+ * '...XX...',
174
+ * '..XXXX..',
175
+ * '.XXXXXX.',
176
+ * 'XXXXXXXX',
177
+ * 'XXXXXXXX',
178
+ * '.XXXXXX.',
179
+ * '..X..X..',
180
+ * '.XX..XX.',
181
+ * ])
182
+ */
183
+ export declare function createBitmapFromRows(rows: readonly string[]): Bitmap;
163
184
  /**
164
185
  * Draws a {@link Bitmap} of arbitrary width and height at game coordinates `(x, y)`.
165
186
  * If `paper` is provided, fills the full bounding rectangle first; otherwise leaves the
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
package/dist/renderer.js CHANGED
@@ -222,6 +222,59 @@ export function createBitmap(data, width, height) {
222
222
  }
223
223
  return { data, width, height };
224
224
  }
225
+ /**
226
+ * Constructs a {@link Bitmap} from readable pixel rows.
227
+ *
228
+ * Each string represents one bitmap row. `#` and `X` are treated as solid pixels;
229
+ * `.` and space are treated as transparent pixels. All rows must have identical
230
+ * width, and that width must be a positive multiple of 8 so the result is byte-aligned
231
+ * for the normal {@link createBitmap} / {@link drawBitmap} pipeline.
232
+ *
233
+ * @example
234
+ * const PLAYER = createBitmapFromRows([
235
+ * '...XX...',
236
+ * '..XXXX..',
237
+ * '.XXXXXX.',
238
+ * 'XXXXXXXX',
239
+ * 'XXXXXXXX',
240
+ * '.XXXXXX.',
241
+ * '..X..X..',
242
+ * '.XX..XX.',
243
+ * ])
244
+ */
245
+ export function createBitmapFromRows(rows) {
246
+ if (rows.length === 0) {
247
+ throw new Error('createBitmapFromRows: rows must not be empty');
248
+ }
249
+ const height = rows.length;
250
+ const width = rows[0].length;
251
+ if (width === 0) {
252
+ throw new Error('createBitmapFromRows: row width must be positive');
253
+ }
254
+ if (width % 8 !== 0) {
255
+ throw new Error(`createBitmapFromRows: row width must be a positive multiple of 8, got ${width}`);
256
+ }
257
+ const bytesPerRow = width / 8;
258
+ const data = new Uint8Array(bytesPerRow * height);
259
+ for (let row = 0; row < height; row++) {
260
+ const line = rows[row];
261
+ if (line.length !== width) {
262
+ throw new Error(`createBitmapFromRows: row ${row} length mismatch — expected ${width}, got ${line.length}`);
263
+ }
264
+ for (let col = 0; col < width; col++) {
265
+ const ch = line[col];
266
+ if (ch === '.' || ch === ' ')
267
+ continue;
268
+ if (ch !== '#' && ch !== 'X') {
269
+ throw new Error(`createBitmapFromRows: invalid pixel '${ch}' at row ${row}, col ${col}; ` +
270
+ 'use #/X for solid and ./space for transparent');
271
+ }
272
+ const byteIdx = row * bytesPerRow + Math.floor(col / 8);
273
+ data[byteIdx] |= 0x80 >> (col % 8);
274
+ }
275
+ }
276
+ return createBitmap(data, width, height);
277
+ }
225
278
  /**
226
279
  * Draws a {@link Bitmap} of arbitrary width and height at game coordinates `(x, y)`.
227
280
  * If `paper` is provided, fills the full bounding rectangle first; otherwise leaves the
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,IAAI,EAAsB,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,SAAS,YAAY,CACnB,GAA6B,EAC7B,OAAgC,EAChC,CAAS,EACT,CAAS;IAET,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QACzB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;YACjC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;gBAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;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,CAAC,CAAA;IACnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,2EAA2E;YAC3E,8EAA8E,CAC/E,CAAA;IACH,CAAC;IACD,GAAG,CAAC,qBAAqB,GAAG,KAAK,CAAA;IACjC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACvB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,YAAY,CAAC,MAAyB,EAAE,SAAS,GAAG,CAAC;IACnE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;IAC7C,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAA;QAC9B,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAA;QAC3B,OAAM;IACR,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAA;IACrD,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;AACnG,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,GAAkB,EAAE,KAAoB;IAExC,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,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAC7C,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,QAAQ,CACtB,GAA6B,EAC7B,IAAY,EACZ,CAAS,EAAE,CAAS,EACpB,GAAkB,EAAE,KAAqB;IAEzC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,GAAG,CAAC,SAAS,GAAG,KAAK,CAAA;QACrB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAChC,CAAC;IACD,GAAG,CAAC,SAAS,GAAG,GAAG,CAAA;IACnB,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AACvD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,QAAQ,CACtB,GAA6B,EAC7B,IAAY,EACZ,CAAS,EAAE,CAAS,EACpB,GAAkB,EAAE,KAAqB;IAEzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAChE,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAA6B,EAC7B,IAAY,EACZ,CAAS,EACT,IAAY,EACZ,GAAkB,EAAE,KAAqB;IAEzC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAA;IACrD,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;AACvC,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAC3B,GAA6B,EAC7B,KAAK,GAAG,IAAI;IAEZ,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;IACpC,GAAG,CAAC,IAAI,EAAE,CAAA;IACV,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAClC,GAAG,CAAC,SAAS,GAAG,cAAc,KAAK,GAAG,CAAA;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IAC9B,CAAC;IACD,GAAG,CAAC,OAAO,EAAE,CAAA;AACf,CAAC;AA0BD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,IAAgB,EAAE,KAAa,EAAE,MAAc;IAC1E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,6DAA6D,KAAK,EAAE,CAAC,CAAA;IACvF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,wDAAwD,MAAM,EAAE,CAAC,CAAA;IACnF,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAA;IACrC,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,iDAAiD,QAAQ,cAAc,KAAK,IAAI,MAAM,SAAS,IAAI,CAAC,MAAM,EAAE,CAC7G,CAAA;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AAChC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CACxB,GAA6B,EAC7B,MAAc,EACd,CAAS,EAAE,CAAS,EACpB,GAAkB,EAClB,KAAqB;IAErB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IACtC,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,CAAA;IAE7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,GAAG,CAAC,SAAS,GAAG,KAAK,CAAA;QACrB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC;IACD,GAAG,CAAC,SAAS,GAAG,GAAG,CAAA;IACnB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,GAAG,GAAG,WAAW,CAAA;QACnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,CAAA;YACtC,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,CAAA;YAC3B,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;gBACjC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;oBAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAA;IACnC,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,CAAA;IAC7B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAEvC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,GAAG,GAAG,WAAW,CAAA;QACnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,CAAA;YACzC,IAAI,CAAC,GAAG,CAAC,CAAA;YACT,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;gBACjC,IAAI,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;oBAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;YACjD,CAAC;YACD,GAAG,CAAC,SAAS,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAA;QAClD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACrC,CAAC;AA6BD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,IAAY,EACZ,IAAqB,EACrB,MAAwC;IAExC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,uDAAuD,IAAI,EAAE,CAAC,CAAA;IAChF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,uDAAuD,IAAI,EAAE,CAAC,CAAA;IAChF,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAA;IAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,kDAAkD,QAAQ,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,CACrG,CAAA;IACH,CAAC;IAED,IAAI,SAAsC,CAAA;IAC1C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,SAAS,GAAG,SAAS,CAAA;IACvB,CAAC;SAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtC,SAAS,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC9C,CAAC;SAAM,CAAC;QACN,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,oDAAoD,QAAQ,QAAQ,IAAI,IAAI,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,CACzG,CAAA;QACH,CAAC;QACD,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AAChD,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAC7B,GAA6B,EAC7B,MAAc,EACd,KAAc,EACd,CAAS,EAAE,CAAS;IAEpB,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CACb,oCAAoC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO;YACxG,uBAAuB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CACvD,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAA;IAEpC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;QACtD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;YACtD,MAAM,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC,IAAI,GAAG,OAAO,CAAA;YAC9C,MAAM,GAAG,GAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAE9D,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,CAAA;YAC7B,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,CAAA;YAE7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,GAAG,CAAC,SAAS,GAAG,KAAK,CAAA;gBACrB,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAClC,CAAC;YAED,GAAG,CAAC,SAAS,GAAG,GAAG,CAAA;YACnB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,CAAC,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,WAAW,GAAG,OAAO,CAAA;gBAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACjC,IAAI,CAAC,IAAI;oBAAE,SAAQ;gBACnB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC;oBACjC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;wBAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,GAAG,EAAE,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;gBACxE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IAC1C,MAAM,OAAO,GAAK,IAAI,KAAK,CAAgB,IAAI,CAAC,MAAM,CAAC,CAAA;IACvD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAgB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAE9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAA;YAC3B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;YACxC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAA;YAC9B,IAAI,SAAS;gBAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAO,CAAC,MAAM,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AACzD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,IAAI,WAAW,GAAkB,IAAI,CAAA;AAErC,MAAM,UAAU,WAAW,CACzB,KAAoB,EACpB,KAAa,EACb,UAAkB,EAClB,aAA4B,CAAC,CAAC,KAAK;IAEnC,kFAAkF;IAClF,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,oBAAoB,CAAC,WAAW,CAAC,CAAA;QACjC,WAAW,GAAG,IAAI,CAAA;IACpB,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAA;IAE5B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,GAAG,GAAG,KAAK,CAAA;QAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,CAAA;QAE1C,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;YACpB,6DAA6D;YAC7D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,UAAU,CAAA;YAChD,WAAW,GAAG,IAAI,CAAA;YAClB,OAAM;QACR,CAAC;QAED,2EAA2E;QAC3E,yDAAyD;QACzD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAA;QAC1E,CAAC;QAED,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAC3C,CAAC,CAAA;IAED,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;AAC3C,CAAC"}
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.21.0",
3
+ "version": "0.23.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/zrebec/zx-kit.git"