@4bitlabs/sci0 2.2.0 → 2.4.1
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 +24 -18
- package/dist/index.d.ts +1 -1
- package/dist/models/cursor.d.ts +0 -1
- package/dist/models/cursor.d.ts.map +1 -1
- package/dist/parsers/cursor.d.ts +7 -2
- package/dist/parsers/cursor.d.ts.map +1 -1
- package/dist/parsers/cursor.js +16 -10
- package/dist/parsers/cursor.js.map +1 -1
- package/dist/parsers/font.d.ts +5 -1
- package/dist/parsers/font.d.ts.map +1 -1
- package/dist/parsers/font.js +4 -4
- package/dist/parsers/font.js.map +1 -1
- package/dist/screen/render-pic.js +1 -1
- package/dist/screen/render-pic.js.map +1 -1
- package/dist/screen/render-result.d.ts +1 -0
- package/dist/screen/render-result.d.ts.map +1 -1
- package/dist/screen/screen-buffer.js +7 -7
- package/dist/screen/screen-buffer.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
# @4bitlabs/sci0 [![License][license]][npm] [![NPM Version][version]][npm] ![Size][size] [![NPM Downloads][dl]][npm]
|
|
2
|
+
|
|
3
|
+
[npm]: https://www.npmjs.com/package/@4bitlabs/sci0
|
|
4
|
+
[version]: https://img.shields.io/npm/v/%404bitlabs%2Fsci0
|
|
5
|
+
[license]: https://img.shields.io/npm/l/%404bitlabs%2Fsci0
|
|
6
|
+
[dl]: https://img.shields.io/npm/dy/%404bitlabs%2Fsci0
|
|
7
|
+
[size]: https://img.shields.io/bundlephobia/min/%404bitlabs/sci0
|
|
8
|
+
|
|
9
|
+
Library for parsing and rendering assets from [Sierra On-line's][sierra] [<abbr title="Sierra Creative Interpreter">SCI</abbr>-engine][sci0].
|
|
10
|
+
|
|
11
|
+
## Supported SCI0 resource types
|
|
12
|
+
|
|
13
|
+
| Type | Extract | Parse/Render | Write |
|
|
14
|
+
| ------ | :-----: | :----------: | :---: |
|
|
15
|
+
| View | ✅ | ✅ | ❌ |
|
|
16
|
+
| Pic | ✅ | ✅ | ❌ |
|
|
17
|
+
| Script | ✅ | ❌ | ❌ |
|
|
18
|
+
| Text | ✅ | ✅ | ❌ |
|
|
19
|
+
| Sound | ✅ | ❌ | ❌ |
|
|
20
|
+
| Memory | ✅ | ❌ | ❌ |
|
|
21
|
+
| Vocab | ✅ | ❌ | ❌ |
|
|
22
|
+
| Font | ✅ | ✅ | ❌ |
|
|
23
|
+
| Cursor | ✅ | ✅ | ❌ |
|
|
24
|
+
| Patch | ✅ | ❌ | ❌ |
|
|
4
25
|
|
|
5
26
|
## Parse `RESOURCE.MAP` file
|
|
6
27
|
|
|
@@ -70,20 +91,5 @@ const image = renderPixelData(visible, {
|
|
|
70
91
|
});
|
|
71
92
|
```
|
|
72
93
|
|
|
73
|
-
## Supported Resource Types
|
|
74
|
-
|
|
75
|
-
| ID | Type | Read | Write |
|
|
76
|
-
| :-: | ------ | :--: | :---: |
|
|
77
|
-
| `0` | View | ✅ | |
|
|
78
|
-
| `1` | Pic | ✅ | |
|
|
79
|
-
| `2` | Script | ❌ | |
|
|
80
|
-
| `3` | Text | ✅ | |
|
|
81
|
-
| `4` | Sound | ❌ | |
|
|
82
|
-
| `5` | Memory | ❌ | |
|
|
83
|
-
| `6` | Vocab | ❌ | |
|
|
84
|
-
| `7` | Font | ✅ | |
|
|
85
|
-
| `8` | Cursor | ✅ | |
|
|
86
|
-
| `9` | Patch | ❌ | |
|
|
87
|
-
|
|
88
94
|
[sierra]: https://en.wikipedia.org/wiki/Sierra_Entertainment
|
|
89
95
|
[sci0]: http://sciwiki.sierrahelp.com/index.php/Sierra_Creative_Interpreter
|
package/dist/index.d.ts
CHANGED
|
@@ -21,7 +21,7 @@ export declare const Cursor: {
|
|
|
21
21
|
};
|
|
22
22
|
/** @deprecated use parseFont() instead */
|
|
23
23
|
export declare const Font: {
|
|
24
|
-
parseFrom: (source: Uint8Array) => import("./models/font-face").FontFace;
|
|
24
|
+
parseFrom: (source: Uint8Array, options?: import("./parsers/font").ParseFontOptions) => import("./models/font-face").FontFace;
|
|
25
25
|
};
|
|
26
26
|
/** @deprecated use parseView() instead */
|
|
27
27
|
export declare const View: {
|
package/dist/models/cursor.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/models/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,MAAO,SAAQ,gBAAgB;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/models/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,MAAO,SAAQ,gBAAgB;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C"}
|
package/dist/parsers/cursor.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { type Cursor } from '../models/cursor';
|
|
2
|
-
type
|
|
2
|
+
type ColorMapping = {
|
|
3
|
+
black: number;
|
|
4
|
+
gray: number;
|
|
5
|
+
white: number;
|
|
6
|
+
keyColor: number;
|
|
7
|
+
};
|
|
3
8
|
export interface ParseCursorOptions {
|
|
4
|
-
mapping?:
|
|
9
|
+
mapping?: ColorMapping;
|
|
5
10
|
}
|
|
6
11
|
export declare const parseFrom: (source: Uint8Array, options?: ParseCursorOptions) => Cursor;
|
|
7
12
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/parsers/cursor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../src/parsers/cursor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AASF,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,eAAO,MAAM,SAAS,WACZ,UAAU,YACT,kBAAkB,KAC1B,MAsCF,CAAC"}
|
package/dist/parsers/cursor.js
CHANGED
|
@@ -2,18 +2,25 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseFrom = void 0;
|
|
4
4
|
const image_1 = require("@4bitlabs/image");
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
const DEFAULT_MAPPING = {
|
|
6
|
+
black: 0x00,
|
|
7
|
+
white: 0x0f,
|
|
8
|
+
gray: 0x07,
|
|
9
|
+
keyColor: 0x0d,
|
|
10
|
+
};
|
|
10
11
|
const parseFrom = (source, options = {}) => {
|
|
11
12
|
const { mapping = DEFAULT_MAPPING } = options;
|
|
13
|
+
const { keyColor } = mapping;
|
|
14
|
+
const colorLut = [
|
|
15
|
+
mapping.black,
|
|
16
|
+
mapping.white,
|
|
17
|
+
mapping.keyColor,
|
|
18
|
+
mapping.gray,
|
|
19
|
+
];
|
|
12
20
|
const view = new DataView(source.buffer, source.byteOffset, source.byteLength);
|
|
13
|
-
// Parse data;
|
|
14
21
|
const hotspot = [view.getUint16(0, true), view.getUint16(2, true)];
|
|
15
|
-
const img = (0, image_1.createIndexedPixelData)(16, 16);
|
|
16
|
-
const stride = 16
|
|
22
|
+
const img = (0, image_1.createIndexedPixelData)(16, 16, { keyColor });
|
|
23
|
+
const stride = 16;
|
|
17
24
|
for (let y = 0; y < 16; y++) {
|
|
18
25
|
for (let x = 0; x < 16; x++) {
|
|
19
26
|
const idx = 4 + y * 2;
|
|
@@ -22,12 +29,11 @@ const parseFrom = (source, options = {}) => {
|
|
|
22
29
|
const a = (tx >> (15 - x)) & 1;
|
|
23
30
|
const b = (clr >> (15 - x)) & 1;
|
|
24
31
|
const value = (a << 1) | b;
|
|
25
|
-
img.pixels[x
|
|
32
|
+
img.pixels[x + y * stride] = colorLut[value];
|
|
26
33
|
}
|
|
27
34
|
}
|
|
28
35
|
return {
|
|
29
36
|
...img,
|
|
30
|
-
keyColor: 0xff,
|
|
31
37
|
hotspot,
|
|
32
38
|
};
|
|
33
39
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/parsers/cursor.ts"],"names":[],"mappings":";;;AAAA,2CAAyD;
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/parsers/cursor.ts"],"names":[],"mappings":";;;AAAA,2CAAyD;AAUzD,MAAM,eAAe,GAAiB;IACpC,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,IAAI;CACf,CAAC;AAMK,MAAM,SAAS,GAAG,CACvB,MAAkB,EAClB,UAA8B,EAAE,EACxB,EAAE;IACV,MAAM,EAAE,OAAO,GAAG,eAAe,EAAE,GAAG,OAAO,CAAC;IAC9C,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,QAAQ,GAAG;QACf,OAAO,CAAC,KAAK;QACb,OAAO,CAAC,KAAK;QACb,OAAO,CAAC,QAAQ;QAChB,OAAO,CAAC,IAAI;KACb,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,QAAQ,CACvB,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,UAAU,CAClB,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAU,CAAC;IAE5E,MAAM,GAAG,GAAG,IAAA,8BAAsB,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtB,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;YAE3C,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3B,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,GAAG;QACN,OAAO;KACR,CAAC;AACJ,CAAC,CAAC;AAzCW,QAAA,SAAS,aAyCpB"}
|
package/dist/parsers/font.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import { FontFace } from '../models/font-face';
|
|
2
|
-
export
|
|
2
|
+
export interface ParseFontOptions {
|
|
3
|
+
color?: number;
|
|
4
|
+
keyColor?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare const parseFrom: (source: Uint8Array, options?: ParseFontOptions) => FontFace;
|
|
3
7
|
//# sourceMappingURL=font.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"font.d.ts","sourceRoot":"","sources":["../../src/parsers/font.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"font.d.ts","sourceRoot":"","sources":["../../src/parsers/font.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,SAAS,WACZ,UAAU,YACT,gBAAgB,KACxB,QAqCF,CAAC"}
|
package/dist/parsers/font.js
CHANGED
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.parseFrom = void 0;
|
|
4
4
|
const image_1 = require("@4bitlabs/image");
|
|
5
5
|
const repeat_1 = require("../utils/repeat");
|
|
6
|
-
const
|
|
7
|
-
const
|
|
6
|
+
const parseFrom = (source, options = {}) => {
|
|
7
|
+
const { color = 0x0f, keyColor = 0x00 } = options;
|
|
8
8
|
const headerView = new DataView(source.buffer, source.byteOffset, 6);
|
|
9
9
|
const count = headerView.getUint16(2, true);
|
|
10
10
|
const lineHeight = headerView.getUint16(4, true);
|
|
@@ -13,13 +13,13 @@ const parseFrom = (source) => {
|
|
|
13
13
|
const characters = pointers.map((offset) => {
|
|
14
14
|
const [width, height] = [source[offset], source[offset + 1]];
|
|
15
15
|
const widthBytes = (width + 7) >>> 3;
|
|
16
|
-
const image = (0, image_1.createIndexedPixelData)(width, height, { keyColor
|
|
16
|
+
const image = (0, image_1.createIndexedPixelData)(width, height, { keyColor });
|
|
17
17
|
for (let y = 0; y < height; y++) {
|
|
18
18
|
const yOffset = offset + 2 + y * widthBytes;
|
|
19
19
|
for (let x = 0; x < width; x++) {
|
|
20
20
|
const idx = yOffset + (x >>> 3);
|
|
21
21
|
const bit = (source[idx] >>> (7 - (x & 0b111))) & 1;
|
|
22
|
-
image.pixels[x
|
|
22
|
+
image.pixels[x + y * width] = bit ? color : keyColor;
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
return image;
|
package/dist/parsers/font.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"font.js","sourceRoot":"","sources":["../../src/parsers/font.ts"],"names":[],"mappings":";;;AAAA,2CAAgF;AAEhF,4CAAyC;
|
|
1
|
+
{"version":3,"file":"font.js","sourceRoot":"","sources":["../../src/parsers/font.ts"],"names":[],"mappings":";;;AAAA,2CAAgF;AAEhF,4CAAyC;AAOlC,MAAM,SAAS,GAAG,CACvB,MAAkB,EAClB,UAA4B,EAAE,EACpB,EAAE;IACZ,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAElD,MAAM,UAAU,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,IAAI,QAAQ,CAC/B,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,UAAU,GAAG,CAAC,EACrB,KAAK,GAAG,CAAC,CACV,CAAC;IACF,MAAM,QAAQ,GAAG,IAAA,eAAM,EAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAE3E,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAmB,CAAC,MAAM,EAAE,EAAE;QAC3D,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAE7D,MAAM,UAAU,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAErC,MAAM,KAAK,GAAG,IAAA,8BAAsB,EAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAElE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;YAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBAChC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACpD,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;YACvD,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,UAAU;QACV,UAAU;KACX,CAAC;AACJ,CAAC,CAAC;AAxCW,QAAA,SAAS,aAwCpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-pic.js","sourceRoot":"","sources":["../../src/screen/render-pic.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"render-pic.js","sourceRoot":"","sources":["../../src/screen/render-pic.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-result.d.ts","sourceRoot":"","sources":["../../src/screen/render-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"render-result.d.ts","sourceRoot":"","sources":["../../src/screen/render-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,gBAAgB,CAAC;CACzB"}
|
|
@@ -10,12 +10,13 @@ const createScreenBuffer = (forcePal, palettes) => {
|
|
|
10
10
|
const visible = (0, image_1.createIndexedPixelData)(bufferWidth, bufferHeight);
|
|
11
11
|
const priority = (0, image_1.createIndexedPixelData)(bufferWidth, bufferHeight);
|
|
12
12
|
const control = (0, image_1.createIndexedPixelData)(bufferWidth, bufferHeight);
|
|
13
|
+
const alpha = (0, image_1.createIndexedPixelData)(bufferWidth, bufferHeight);
|
|
13
14
|
visible.pixels.fill(0xff);
|
|
14
15
|
priority.pixels.fill(0x00);
|
|
15
16
|
control.pixels.fill(0x00);
|
|
16
17
|
const setPixel = (x, y, color) => {
|
|
17
18
|
const idx = bufferWidth * y + x;
|
|
18
|
-
visible.pixels[idx] = color;
|
|
19
|
+
visible.pixels[idx] = (color & 0b1111) | (color << 4);
|
|
19
20
|
};
|
|
20
21
|
const plot = (x, y, drawMode, drawCodes) => {
|
|
21
22
|
const idx = bufferWidth * y + x;
|
|
@@ -24,6 +25,7 @@ const createScreenBuffer = (forcePal, palettes) => {
|
|
|
24
25
|
const palette = palettes[pal];
|
|
25
26
|
const palIndex = drawCodes[0] % 40 >>> 0;
|
|
26
27
|
visible.pixels[idx] = palette[palIndex];
|
|
28
|
+
alpha.pixels[idx] = 255;
|
|
27
29
|
}
|
|
28
30
|
if ((drawMode & draw_command_1.DrawMode.Priority) === draw_command_1.DrawMode.Priority) {
|
|
29
31
|
priority.pixels[idx] = drawCodes[1];
|
|
@@ -34,13 +36,11 @@ const createScreenBuffer = (forcePal, palettes) => {
|
|
|
34
36
|
};
|
|
35
37
|
const isFillable = (x, y, drawMode) => {
|
|
36
38
|
const idx = x + y * bufferWidth;
|
|
37
|
-
/* TODO this also might not be 100% accurate.
|
|
38
|
-
* When the visual layer is enabled, it might explicitly be looking for any white (0xf) pixel, rather than
|
|
39
|
-
* an explicit [0xf,0xf] tuple.
|
|
40
|
-
*/
|
|
41
39
|
const isVisible = (drawMode & draw_command_1.DrawMode.Visual) === draw_command_1.DrawMode.Visual;
|
|
42
40
|
if (isVisible) {
|
|
43
|
-
|
|
41
|
+
const dither = (x & 1) ^ (y & 1);
|
|
42
|
+
const val = visible.pixels[idx];
|
|
43
|
+
return 0xf === (dither ? val & 0xf : val >>> 4);
|
|
44
44
|
}
|
|
45
45
|
/* TODO not sure if this is correct… but it looks *okay*-ish.
|
|
46
46
|
* SCI Companion seems to be able to recognize the difference between "never-touched" pixels and
|
|
@@ -53,7 +53,7 @@ const createScreenBuffer = (forcePal, palettes) => {
|
|
|
53
53
|
(isControl && control.pixels[idx] === 0x00));
|
|
54
54
|
};
|
|
55
55
|
return [
|
|
56
|
-
{ visible, priority, control },
|
|
56
|
+
{ visible, priority, control, alpha },
|
|
57
57
|
{
|
|
58
58
|
setPixel,
|
|
59
59
|
brush: (0, sci0_screen_impl_1.createBrush)(plot, [bufferWidth, bufferHeight]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen-buffer.js","sourceRoot":"","sources":["../../src/screen/screen-buffer.ts"],"names":[],"mappings":";;;AAAA,2CAAyD;AACzD,yDAA8E;AAE9E,yDAAkD;AAGlD,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,YAAY,GAAG,GAAG,CAAC;AAElB,MAAM,kBAAkB,GAAG,CAChC,QAAmC,EACnC,QAA0D,EAClC,EAAE;IAC1B,MAAM,OAAO,GAAG,IAAA,8BAAsB,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAA,8BAAsB,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,IAAA,8BAAsB,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"screen-buffer.js","sourceRoot":"","sources":["../../src/screen/screen-buffer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@4bitlabs/sci0",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"description": "Library for parsing and rendering assets from Sierra On-line's SCI-engine.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"license": "ISC",
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@4bitlabs/codecs": "^1.0.4",
|
|
28
|
-
"@4bitlabs/image": "^3.2
|
|
28
|
+
"@4bitlabs/image": "^3.3.2",
|
|
29
29
|
"@4bitlabs/numeric-deque": "^1.1.3",
|
|
30
30
|
"@4bitlabs/readers": "^2.0.4"
|
|
31
31
|
}
|