@lewismoten/gamemaker-sandbox-engine 3.1.0 → 3.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/CHANGELOG.md +42 -0
- package/NOTICE.md +58 -753
- package/README.md +94 -10
- package/dist/assets/{music.worklet-NqOeNo6T.js → music.worklet-aD2x7RRM.js} +23 -21
- package/dist/audio/cmfLoad.js +10 -0
- package/dist/audio/cmfPlayer.js +201 -0
- package/dist/audio/context.js +75 -0
- package/dist/audio/engine.js +173 -0
- package/dist/audio/mix.js +40 -0
- package/dist/audio/opl.js +245 -0
- package/dist/audio/output.js +40 -0
- package/dist/core/gameFiles.js +89 -0
- package/dist/engine/character.js +187 -0
- package/dist/engine/funcKeys.js +164 -0
- package/dist/engine/game.js +133 -0
- package/dist/engine/keys.js +68 -0
- package/dist/engine/machine.js +192 -0
- package/dist/engine/menus.js +135 -0
- package/dist/engine/monsters.js +259 -0
- package/dist/engine/playGain.js +10 -0
- package/dist/engine/playerLook.js +48 -0
- package/dist/engine/recorder.js +127 -0
- package/dist/engine/render.js +45 -0
- package/dist/engine/scene.js +324 -0
- package/dist/engine/scroll.js +79 -0
- package/dist/engine/showGraphic.js +107 -0
- package/dist/engine/slowPc.js +98 -0
- package/dist/engine/slowPcMusic.js +46 -0
- package/dist/engine/touch.js +61 -0
- package/dist/engine/world.js +205 -0
- package/dist/formats/binary.js +120 -0
- package/dist/formats/blocks.js +103 -0
- package/dist/formats/character.js +83 -0
- package/dist/formats/cmf.js +37 -0
- package/dist/formats/cmfEdit.js +154 -0
- package/dist/formats/cmfPreview.js +89 -0
- package/dist/formats/cmfSong.js +190 -0
- package/dist/formats/fli.js +340 -0
- package/dist/formats/fliFrames.js +34 -0
- package/dist/formats/fliLimits.js +54 -0
- package/dist/formats/game.js +198 -0
- package/dist/formats/gif.js +125 -0
- package/dist/formats/gifProgressive.js +99 -0
- package/dist/formats/graphicScripts.js +44 -0
- package/dist/formats/highscore.js +30 -0
- package/dist/formats/jpeg.js +359 -0
- package/dist/formats/map.js +38 -0
- package/dist/formats/monster.js +69 -0
- package/dist/formats/palette.js +58 -0
- package/dist/formats/recording.js +17 -0
- package/dist/formats/sound.js +44 -0
- package/dist/formats/voc.js +303 -0
- package/dist/gfx/colorVision.js +45 -0
- package/dist/gfx/cp437Glyphs.js +337 -0
- package/dist/gfx/font8x8.js +10 -0
- package/dist/gfx/screen.js +151 -0
- package/dist/index.js +15 -0
- package/dist/input/chords.js +46 -0
- package/dist/input/deskMouse.js +24 -0
- package/dist/input/keyboard.js +82 -0
- package/dist/input/scancodes.js +143 -0
- package/dist/player/fileExtensions.js +118 -0
- package/dist/player/patchRules.js +129 -0
- package/dist/player/patchTable.js +1753 -0
- package/dist/text/cp437.js +44 -0
- package/dist/types/audio/cmfPlayer.d.ts +1 -1
- package/dist/types/audio/engine.d.ts +21 -0
- package/dist/types/audio/mix.d.ts +14 -0
- package/dist/types/audio/music.worklet.d.ts +8 -0
- package/dist/types/engine/character.d.ts +3 -3
- package/dist/types/engine/funcKeys.d.ts +8 -6
- package/dist/types/engine/game.d.ts +9 -4
- package/dist/types/engine/keys.d.ts +2 -2
- package/dist/types/engine/machine.d.ts +8 -4
- package/dist/types/engine/menus.d.ts +4 -4
- package/dist/types/engine/monsters.d.ts +1 -1
- package/dist/types/engine/playerLook.d.ts +20 -2
- package/dist/types/engine/recorder.d.ts +8 -1
- package/dist/types/engine/render.d.ts +2 -2
- package/dist/types/engine/scene.d.ts +41 -9
- package/dist/types/engine/scroll.d.ts +9 -1
- package/dist/types/engine/showGraphic.d.ts +2 -2
- package/dist/types/engine/slowPc.d.ts +64 -2
- package/dist/types/engine/slowPcMusic.d.ts +18 -0
- package/dist/types/engine/touch.d.ts +2 -2
- package/dist/types/engine/world.d.ts +28 -6
- package/dist/types/formats/cmfEdit.d.ts +53 -0
- package/dist/types/formats/cmfPreview.d.ts +19 -0
- package/dist/types/formats/cmfSong.d.ts +74 -0
- package/dist/types/formats/fli.d.ts +11 -0
- package/dist/types/formats/fliFrames.d.ts +18 -0
- package/dist/types/formats/fliLimits.d.ts +13 -0
- package/dist/types/formats/game.d.ts +7 -0
- package/dist/types/formats/gif.d.ts +1 -1
- package/dist/types/formats/gifProgressive.d.ts +46 -0
- package/dist/types/formats/jpeg.d.ts +20 -0
- package/dist/types/gfx/colorVision.d.ts +26 -0
- package/dist/types/gfx/screen.d.ts +4 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/input/keyboard.d.ts +1 -1
- package/dist/types/{dosPlayer → player}/patchRules.d.ts +1 -1
- package/dist/types/{dosPlayer → player}/patchTable.d.ts +8 -5
- package/dist/types/text/cp437.d.ts +6 -0
- package/package.json +322 -9
- package/dist/engine.js +0 -5436
- package/dist/types/engine/package.d.ts +0 -4
- /package/dist/types/{project → core}/gameFiles.d.ts +0 -0
- /package/dist/types/{dosPlayer → player}/fileExtensions.d.ts +0 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { PALETTE_SIZE as G, vga8 as v } from "./palette.js";
|
|
2
|
+
function M(n) {
|
|
3
|
+
return n[0] === 71 && n[1] === 73 && n[2] === 70;
|
|
4
|
+
}
|
|
5
|
+
function B(n) {
|
|
6
|
+
if (!M(n)) throw new Error("Not a GIF file");
|
|
7
|
+
let t = 6;
|
|
8
|
+
const o = () => {
|
|
9
|
+
const r = n[t] | n[t + 1] << 8;
|
|
10
|
+
return t += 2, r;
|
|
11
|
+
};
|
|
12
|
+
o(), o();
|
|
13
|
+
let i = n[t++];
|
|
14
|
+
t += 2;
|
|
15
|
+
const c = new Uint8Array(G), e = (r) => {
|
|
16
|
+
c.fill(0);
|
|
17
|
+
for (let h = 0; h < r; h++)
|
|
18
|
+
c[h * 3] = (n[t++] ?? 0) >> 2, c[h * 3 + 1] = (n[t++] ?? 0) >> 2, c[h * 3 + 2] = (n[t++] ?? 0) >> 2;
|
|
19
|
+
};
|
|
20
|
+
for (i & 128 && e(2 << (i & 7)); ; ) {
|
|
21
|
+
const r = n[t++];
|
|
22
|
+
if (r === 33) {
|
|
23
|
+
for (t++; t < n.length && n[t] !== 0; ) t += n[t] + 1;
|
|
24
|
+
t++;
|
|
25
|
+
} else {
|
|
26
|
+
if (r === 44) break;
|
|
27
|
+
throw new Error("GIF has no image");
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
t += 4;
|
|
31
|
+
const u = o(), l = o();
|
|
32
|
+
i = n[t++];
|
|
33
|
+
const p = (i & 64) !== 0;
|
|
34
|
+
i & 128 && e(2 << (i & 7));
|
|
35
|
+
const w = n[t++], d = [];
|
|
36
|
+
for (; t < n.length; ) {
|
|
37
|
+
const r = n[t++];
|
|
38
|
+
if (!r) break;
|
|
39
|
+
for (let h = 0; h < r && t < n.length; h++) d.push(n[t++]);
|
|
40
|
+
}
|
|
41
|
+
const s = m(Uint8Array.from(d), w, u * l), f = new Uint8Array(u * l);
|
|
42
|
+
if (!p) f.set(s.subarray(0, f.length));
|
|
43
|
+
else {
|
|
44
|
+
let r = 0;
|
|
45
|
+
for (const [h, A] of [
|
|
46
|
+
[0, 8],
|
|
47
|
+
[4, 8],
|
|
48
|
+
[2, 4],
|
|
49
|
+
[1, 2]
|
|
50
|
+
])
|
|
51
|
+
for (let U = h; U < l; U += A)
|
|
52
|
+
f.set(s.subarray(r, r + u), U * u), r += u;
|
|
53
|
+
}
|
|
54
|
+
return { width: u, height: l, pixels: f, palette: c };
|
|
55
|
+
}
|
|
56
|
+
function m(n, t, o, i) {
|
|
57
|
+
const c = new Uint8Array(o), e = 1 << t, u = e + 1, l = new Int16Array(4096), p = new Uint8Array(4096), w = new Uint8Array(4096), d = new Uint8Array(4097);
|
|
58
|
+
let s = t + 1, f = e + 2, r = -1, h = 0, A = 0, U = 0, E = 0;
|
|
59
|
+
for (let a = 0; a < e; a++)
|
|
60
|
+
l[a] = -1, p[a] = a, w[a] = a;
|
|
61
|
+
for (; E < o; ) {
|
|
62
|
+
for (; A < s; ) {
|
|
63
|
+
if (U >= n.length)
|
|
64
|
+
return i && (i.count = E), c;
|
|
65
|
+
h |= n[U++] << A, A += 8;
|
|
66
|
+
}
|
|
67
|
+
const a = h & (1 << s) - 1;
|
|
68
|
+
if (h >>>= s, A -= s, a === e) {
|
|
69
|
+
s = t + 1, f = e + 2, r = -1;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (a === u) break;
|
|
73
|
+
let g = a, k = 0;
|
|
74
|
+
for (r >= 0 && a >= f && (d[k++] = w[r], g = r); g >= e && k < 4096; )
|
|
75
|
+
d[k++] = p[g], g = l[g];
|
|
76
|
+
d[k++] = g;
|
|
77
|
+
const I = g;
|
|
78
|
+
for (; k > 0 && E < o; ) c[E++] = d[--k];
|
|
79
|
+
r >= 0 && f < 4096 && (l[f] = r, p[f] = I, w[f] = w[r], f++, f === 1 << s && s < 12 && s++), r < 0 && (w[a] = a), r = a;
|
|
80
|
+
}
|
|
81
|
+
return i && (i.count = E), c;
|
|
82
|
+
}
|
|
83
|
+
function F(n) {
|
|
84
|
+
const t = [], o = (e) => t.push(e & 255, e >> 8 & 255);
|
|
85
|
+
t.push(71, 73, 70, 56, 55, 97), o(n.width), o(n.height), t.push(247, 0, 0);
|
|
86
|
+
for (let e = 0; e < G; e++) t.push(v(n.palette[e]));
|
|
87
|
+
t.push(44), o(0), o(0), o(n.width), o(n.height), t.push(0);
|
|
88
|
+
const i = 8;
|
|
89
|
+
t.push(i);
|
|
90
|
+
const c = x(n.pixels, i);
|
|
91
|
+
for (let e = 0; e < c.length; e += 255) {
|
|
92
|
+
const u = Math.min(255, c.length - e);
|
|
93
|
+
t.push(u);
|
|
94
|
+
for (let l = 0; l < u; l++) t.push(c[e + l]);
|
|
95
|
+
}
|
|
96
|
+
return t.push(0, 59), Uint8Array.from(t);
|
|
97
|
+
}
|
|
98
|
+
function x(n, t) {
|
|
99
|
+
const o = 1 << t, i = o + 1, c = [];
|
|
100
|
+
let e = t + 1, u = i + 1, l = 0, p = 0;
|
|
101
|
+
const w = (f) => {
|
|
102
|
+
for (l |= f << p, p += e; p >= 8; )
|
|
103
|
+
c.push(l & 255), l >>>= 8, p -= 8;
|
|
104
|
+
};
|
|
105
|
+
let d = /* @__PURE__ */ new Map();
|
|
106
|
+
if (w(o), n.length === 0)
|
|
107
|
+
return w(i), p && c.push(l & 255), Uint8Array.from(c);
|
|
108
|
+
let s = n[0];
|
|
109
|
+
for (let f = 1; f < n.length; f++) {
|
|
110
|
+
const r = n[f], h = s << 8 | r, A = d.get(h);
|
|
111
|
+
if (A !== void 0) {
|
|
112
|
+
s = A;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
w(s), u < 4096 ? (d.set(h, u++), u > 1 << e && e < 12 && e++) : (w(o), d = /* @__PURE__ */ new Map(), e = t + 1, u = i + 1), s = r;
|
|
116
|
+
}
|
|
117
|
+
return w(s), w(i), p && c.push(l & 255), Uint8Array.from(c);
|
|
118
|
+
}
|
|
119
|
+
export {
|
|
120
|
+
B as decodeGif,
|
|
121
|
+
F as encodeGif,
|
|
122
|
+
M as isGif,
|
|
123
|
+
m as lzwDecode,
|
|
124
|
+
x as lzwEncode
|
|
125
|
+
};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { lzwDecode as A, lzwEncode as E } from "./gif.js";
|
|
2
|
+
import { vga8 as M, PALETTE_SIZE as S } from "./palette.js";
|
|
3
|
+
const g = [
|
|
4
|
+
// [first row, step, rows it stands in for]
|
|
5
|
+
[0, 8, 8],
|
|
6
|
+
[4, 8, 4],
|
|
7
|
+
[2, 4, 2],
|
|
8
|
+
[1, 2, 1]
|
|
9
|
+
];
|
|
10
|
+
function v(t, e) {
|
|
11
|
+
if (!e) return Array.from({ length: t }, (o, i) => ({ y: i, span: 1 }));
|
|
12
|
+
const r = [];
|
|
13
|
+
for (const [o, i, l] of g) for (let a = o; a < t; a += i) r.push({ y: a, span: l });
|
|
14
|
+
return r;
|
|
15
|
+
}
|
|
16
|
+
function k(t) {
|
|
17
|
+
if (t.length < 13 || t[0] !== 71 || t[1] !== 73 || t[2] !== 70) return;
|
|
18
|
+
let e = 10, r = t[e++];
|
|
19
|
+
e++;
|
|
20
|
+
const o = t[e++], i = new Uint8Array(S);
|
|
21
|
+
let l = 0;
|
|
22
|
+
const a = (u) => {
|
|
23
|
+
if (l = 2 << (u & 7), e + l * 3 > t.length) return !1;
|
|
24
|
+
i.fill(0);
|
|
25
|
+
for (let f = 0; f < l * 3; f++) i[f] = t[e++] >> 2;
|
|
26
|
+
return !0;
|
|
27
|
+
};
|
|
28
|
+
if (r & 128 && !a(r)) return;
|
|
29
|
+
for (; ; ) {
|
|
30
|
+
if (e >= t.length) return;
|
|
31
|
+
const u = t[e++];
|
|
32
|
+
if (u === 44) break;
|
|
33
|
+
if (u !== 33) return;
|
|
34
|
+
for (e++; e < t.length && t[e] !== 0; ) e += t[e] + 1;
|
|
35
|
+
e++;
|
|
36
|
+
}
|
|
37
|
+
if (e + 10 > t.length) return;
|
|
38
|
+
e += 4;
|
|
39
|
+
const c = t[e] | t[e + 1] << 8, n = t[e + 2] | t[e + 3] << 8;
|
|
40
|
+
if (e += 4, r = t[e++], r & 128 && !a(r)) return;
|
|
41
|
+
const s = t[e++], h = new Uint8Array(Math.max(0, t.length - e));
|
|
42
|
+
let p = 0, d = !1;
|
|
43
|
+
for (; e < t.length; ) {
|
|
44
|
+
const u = t[e++];
|
|
45
|
+
if (!u) {
|
|
46
|
+
d = !0;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
const f = Math.min(u, t.length - e);
|
|
50
|
+
h.set(t.subarray(e, e + f), p), p += f, e += f;
|
|
51
|
+
}
|
|
52
|
+
const w = { count: 0 }, x = A(h.subarray(0, p), s, c * n, w);
|
|
53
|
+
return {
|
|
54
|
+
width: c,
|
|
55
|
+
height: n,
|
|
56
|
+
palette: i,
|
|
57
|
+
colors: l,
|
|
58
|
+
interlaced: (r & 64) !== 0,
|
|
59
|
+
stored: x,
|
|
60
|
+
received: w.count,
|
|
61
|
+
complete: d || w.count >= c * n,
|
|
62
|
+
aspect: o ? (o + 15) / 64 : 1
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function z(t, e = 0) {
|
|
66
|
+
const { width: r, height: o, stored: i } = t, l = new Uint8Array(r * o).fill(e), a = v(o, t.interlaced);
|
|
67
|
+
for (let c = 0; c < a.length; c++) {
|
|
68
|
+
const n = c * r;
|
|
69
|
+
if (n >= t.received) break;
|
|
70
|
+
const s = Math.min(r, t.received - n), { y: h, span: p } = a[c];
|
|
71
|
+
for (let d = h; d < Math.min(o, h + p); d++) l.set(i.subarray(n, n + s), d * r);
|
|
72
|
+
}
|
|
73
|
+
return l;
|
|
74
|
+
}
|
|
75
|
+
function P(t, e = {}) {
|
|
76
|
+
let r = 1;
|
|
77
|
+
for (; 1 << r < (e.colors ?? 256); ) r++;
|
|
78
|
+
const o = [], i = (n) => o.push(n & 255, n >> 8 & 255);
|
|
79
|
+
o.push(71, 73, 70, 56, 57, 97), i(t.width), i(t.height), o.push(128 | r - 1 << 4 | r - 1, 0, e.aspect ?? 0);
|
|
80
|
+
for (let n = 0; n < 3 << r; n++) o.push(M(t.palette[n] ?? 0));
|
|
81
|
+
o.push(44), i(0), i(0), i(t.width), i(t.height), o.push(e.interlaced ? 64 : 0);
|
|
82
|
+
let l = t.pixels;
|
|
83
|
+
e.interlaced && (l = new Uint8Array(t.pixels.length), v(t.height, !0).forEach(({ y: n }, s) => l.set(t.pixels.subarray(n * t.width, (n + 1) * t.width), s * t.width)));
|
|
84
|
+
const a = Math.max(2, r);
|
|
85
|
+
o.push(a);
|
|
86
|
+
const c = E(l, a);
|
|
87
|
+
for (let n = 0; n < c.length; n += 255) {
|
|
88
|
+
const s = Math.min(255, c.length - n);
|
|
89
|
+
o.push(s);
|
|
90
|
+
for (let h = 0; h < s; h++) o.push(c[n + h]);
|
|
91
|
+
}
|
|
92
|
+
return o.push(0, 59), Uint8Array.from(o);
|
|
93
|
+
}
|
|
94
|
+
export {
|
|
95
|
+
k as decodePartialGif,
|
|
96
|
+
P as encodeGif89,
|
|
97
|
+
z as partialPixels,
|
|
98
|
+
v as storedRows
|
|
99
|
+
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Reader as c, latin1Text as o, textBytes as a } from "./binary.js";
|
|
2
|
+
function p(n) {
|
|
3
|
+
const e = new c(n), t = e.i16(), s = e.i16(), i = o(n.subarray(4, 43)).split(/[\r\n\0]/)[0].trim();
|
|
4
|
+
return { x: t, y: s, gif: i };
|
|
5
|
+
}
|
|
6
|
+
function u(n) {
|
|
7
|
+
const e = a(n.gif), t = new Uint8Array(4 + e.length);
|
|
8
|
+
return t[0] = n.x & 255, t[1] = n.x >> 8 & 255, t[2] = n.y & 255, t[3] = n.y >> 8 & 255, t.set(e, 4), t;
|
|
9
|
+
}
|
|
10
|
+
function f(n) {
|
|
11
|
+
const e = [];
|
|
12
|
+
for (const t of o(n).split(`
|
|
13
|
+
`)) {
|
|
14
|
+
const s = t.replace(/[\r\x1a]/g, ""), r = /^([^ ]{0,15})[^ ]* *(.*)$/.exec(s);
|
|
15
|
+
if (!r || !r[1]) continue;
|
|
16
|
+
const i = r[2].trim();
|
|
17
|
+
e.push({ name: r[1].toLowerCase(), pause: i ? parseInt(i, 10) || 0 : void 0 });
|
|
18
|
+
}
|
|
19
|
+
return e;
|
|
20
|
+
}
|
|
21
|
+
function x(n) {
|
|
22
|
+
return a(n.map((e) => e.pause === void 0 ? e.name : `${e.name} ${e.pause}`).join(`\r
|
|
23
|
+
`) + `\r
|
|
24
|
+
`);
|
|
25
|
+
}
|
|
26
|
+
function m(n) {
|
|
27
|
+
const e = o(n).replace(/\x1a.*$/s, "").replace(/\r\n/g, `
|
|
28
|
+
`), t = [];
|
|
29
|
+
for (let s = 0; s < e.length; ) {
|
|
30
|
+
let r = s;
|
|
31
|
+
for (; r < e.length && r - s < 31 && e[r++] !== `
|
|
32
|
+
`; )
|
|
33
|
+
;
|
|
34
|
+
t.push(e.slice(s, r).replace(/\n$/, "")), s = r;
|
|
35
|
+
}
|
|
36
|
+
return t;
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
p as parseBackdrop,
|
|
40
|
+
f as parseSlideList,
|
|
41
|
+
u as serializeBackdrop,
|
|
42
|
+
x as serializeSlideList,
|
|
43
|
+
m as textLines
|
|
44
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Reader as c, Writer as s } from "./binary.js";
|
|
2
|
+
const o = 10;
|
|
3
|
+
function l(n) {
|
|
4
|
+
const r = new c(n);
|
|
5
|
+
return Array.from({ length: o }, () => ({ score: r.i32(), name: r.cstr(30) }));
|
|
6
|
+
}
|
|
7
|
+
function u(n) {
|
|
8
|
+
const r = new s(o * 34);
|
|
9
|
+
for (let e = 0; e < o; e++) {
|
|
10
|
+
const t = n[e] ?? { score: 0, name: "" };
|
|
11
|
+
r.i32(t.score).cstr(t.name, 30);
|
|
12
|
+
}
|
|
13
|
+
return r.toBytes();
|
|
14
|
+
}
|
|
15
|
+
function a(n, r) {
|
|
16
|
+
for (let e = 0; e < o; e++) if (r > (n[e]?.score ?? 0)) return e;
|
|
17
|
+
return -1;
|
|
18
|
+
}
|
|
19
|
+
function f(n, r, e) {
|
|
20
|
+
const t = n.slice(0, o);
|
|
21
|
+
for (; t.length < o; ) t.push({ score: 0, name: "" });
|
|
22
|
+
return t.splice(r, 0, e), t.slice(0, o);
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
o as HIGH_SCORES,
|
|
26
|
+
f as insertHighScore,
|
|
27
|
+
l as parseHighScores,
|
|
28
|
+
a as placeFor,
|
|
29
|
+
u as serializeHighScores
|
|
30
|
+
};
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
const S = Int32Array.from([
|
|
2
|
+
0,
|
|
3
|
+
1,
|
|
4
|
+
8,
|
|
5
|
+
16,
|
|
6
|
+
9,
|
|
7
|
+
2,
|
|
8
|
+
3,
|
|
9
|
+
10,
|
|
10
|
+
17,
|
|
11
|
+
24,
|
|
12
|
+
32,
|
|
13
|
+
25,
|
|
14
|
+
18,
|
|
15
|
+
11,
|
|
16
|
+
4,
|
|
17
|
+
5,
|
|
18
|
+
12,
|
|
19
|
+
19,
|
|
20
|
+
26,
|
|
21
|
+
33,
|
|
22
|
+
40,
|
|
23
|
+
48,
|
|
24
|
+
41,
|
|
25
|
+
34,
|
|
26
|
+
27,
|
|
27
|
+
20,
|
|
28
|
+
13,
|
|
29
|
+
6,
|
|
30
|
+
7,
|
|
31
|
+
14,
|
|
32
|
+
21,
|
|
33
|
+
28,
|
|
34
|
+
35,
|
|
35
|
+
42,
|
|
36
|
+
49,
|
|
37
|
+
56,
|
|
38
|
+
57,
|
|
39
|
+
50,
|
|
40
|
+
43,
|
|
41
|
+
36,
|
|
42
|
+
29,
|
|
43
|
+
22,
|
|
44
|
+
15,
|
|
45
|
+
23,
|
|
46
|
+
30,
|
|
47
|
+
37,
|
|
48
|
+
44,
|
|
49
|
+
51,
|
|
50
|
+
58,
|
|
51
|
+
59,
|
|
52
|
+
52,
|
|
53
|
+
45,
|
|
54
|
+
38,
|
|
55
|
+
31,
|
|
56
|
+
39,
|
|
57
|
+
46,
|
|
58
|
+
53,
|
|
59
|
+
60,
|
|
60
|
+
61,
|
|
61
|
+
54,
|
|
62
|
+
47,
|
|
63
|
+
55,
|
|
64
|
+
62,
|
|
65
|
+
63
|
|
66
|
+
]);
|
|
67
|
+
class R extends Error {
|
|
68
|
+
}
|
|
69
|
+
function O(n, I) {
|
|
70
|
+
const k = new Int32Array(18).fill(-1), r = new Int32Array(17), o = new Int32Array(17);
|
|
71
|
+
let g = 0, p = 0;
|
|
72
|
+
for (let h = 1; h <= 16; h++)
|
|
73
|
+
r[h] = p, o[h] = g, g += n[h - 1], p += n[h - 1], k[h] = n[h - 1] ? g - 1 : -1, g <<= 1;
|
|
74
|
+
return k[17] = 2147483647, { maxcode: k, valptr: r, mincode: o, vals: I };
|
|
75
|
+
}
|
|
76
|
+
function Z(n) {
|
|
77
|
+
return n[0] === 255 && n[1] === 216;
|
|
78
|
+
}
|
|
79
|
+
function Q(n) {
|
|
80
|
+
if (!Z(n)) return;
|
|
81
|
+
const I = [], k = [], r = [];
|
|
82
|
+
let o = [], g = 0, p = 0, h = !1, q = 0, l = 1, y = 1, v = 0, M = 0, F = 1, U = 0, C = !1, x = 2;
|
|
83
|
+
const L = (f) => n[f] << 8 | n[f + 1];
|
|
84
|
+
e: for (; x + 1 < n.length; ) {
|
|
85
|
+
if (n[x] !== 255) {
|
|
86
|
+
x++;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const f = n[x + 1];
|
|
90
|
+
if (f === 255) {
|
|
91
|
+
x++;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (f === 217) {
|
|
95
|
+
C = !0;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
if (f >= 208 && f <= 215) {
|
|
99
|
+
x += 2;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (x + 4 > n.length) break;
|
|
103
|
+
const w = L(x + 2), c = x + 4, A = x + 2 + w;
|
|
104
|
+
if (f !== 218 && A > n.length) break;
|
|
105
|
+
switch (f) {
|
|
106
|
+
case 224:
|
|
107
|
+
if (n[c] === 74 && n[c + 1] === 70 && n[c + 7] === 0) {
|
|
108
|
+
const a = L(c + 8), e = L(c + 10);
|
|
109
|
+
a && e && (F = a / e);
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
case 219:
|
|
113
|
+
for (let a = c; a < A; ) {
|
|
114
|
+
const e = n[a] >> 4, t = n[a] & 15;
|
|
115
|
+
a++;
|
|
116
|
+
const s = new Int32Array(64);
|
|
117
|
+
for (let i = 0; i < 64; i++)
|
|
118
|
+
s[S[i]] = e ? L(a) : n[a], a += e ? 2 : 1;
|
|
119
|
+
I[t] = s;
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
case 192:
|
|
123
|
+
case 193:
|
|
124
|
+
case 194: {
|
|
125
|
+
h = f === 194, p = L(c + 1), g = L(c + 3);
|
|
126
|
+
const a = n[c + 5];
|
|
127
|
+
o = [];
|
|
128
|
+
for (let e = 0; e < a; e++) {
|
|
129
|
+
const t = c + 6 + e * 3;
|
|
130
|
+
o.push({
|
|
131
|
+
id: n[t],
|
|
132
|
+
h: n[t + 1] >> 4,
|
|
133
|
+
v: n[t + 1] & 15,
|
|
134
|
+
tq: n[t + 2],
|
|
135
|
+
blocksPerLine: 0,
|
|
136
|
+
blocksPerColumn: 0,
|
|
137
|
+
stride: 0,
|
|
138
|
+
coeffs: new Int16Array(0),
|
|
139
|
+
ready: new Uint8Array(0),
|
|
140
|
+
pred: 0
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
l = Math.max(...o.map((e) => e.h)), y = Math.max(...o.map((e) => e.v)), v = Math.ceil(g / (8 * l)), M = Math.ceil(p / (8 * y));
|
|
144
|
+
for (const e of o)
|
|
145
|
+
e.blocksPerLine = Math.ceil(Math.ceil(g * e.h / l) / 8), e.blocksPerColumn = Math.ceil(Math.ceil(p * e.v / y) / 8), e.stride = v * e.h, e.coeffs = new Int16Array(M * e.v * e.stride * 64), e.ready = new Uint8Array(e.coeffs.length / 64);
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
case 196:
|
|
149
|
+
for (let a = c; a < A; ) {
|
|
150
|
+
const e = n[a] >> 4, t = n[a] & 15, s = n.subarray(a + 1, a + 17), i = s.reduce((P, m) => P + m, 0), b = O(s, n.slice(a + 17, a + 17 + i));
|
|
151
|
+
(e ? r : k)[t] = b, a += 17 + i;
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
case 221:
|
|
155
|
+
q = L(c);
|
|
156
|
+
break;
|
|
157
|
+
case 218: {
|
|
158
|
+
if (A > n.length || !o.length) break e;
|
|
159
|
+
const a = n[c], e = [];
|
|
160
|
+
for (let d = 0; d < a; d++) {
|
|
161
|
+
const z = o.find((T) => T.id === n[c + 1 + d * 2]);
|
|
162
|
+
z.dc = k[n[c + 2 + d * 2] >> 4], z.ac = r[n[c + 2 + d * 2] & 15], e.push(z);
|
|
163
|
+
}
|
|
164
|
+
const t = c + 1 + a * 2, s = n[t], i = n[t + 1], b = n[t + 2] >> 4, P = n[t + 2] & 15, m = B(n, A, e, { progressive: h, ss: s, se: i, ah: b, al: P, restart: q, mcusPerLine: v, mcusPerColumn: M });
|
|
165
|
+
if (!m.done) break e;
|
|
166
|
+
U++, x = m.pos;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
x = A;
|
|
171
|
+
}
|
|
172
|
+
if (!o.length || !g || !p) return;
|
|
173
|
+
const E = new Uint8Array(g * p), u = o[0];
|
|
174
|
+
for (let f = 0; f < p; f++)
|
|
175
|
+
for (let w = 0; w < g; w++) {
|
|
176
|
+
const c = Math.floor(w * u.h / l / 8), A = Math.floor(f * u.v / y / 8);
|
|
177
|
+
E[f * g + w] = u.ready[A * u.stride + c];
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
width: g,
|
|
181
|
+
height: p,
|
|
182
|
+
channels: o.length === 1 ? 1 : 3,
|
|
183
|
+
pixels: D(o, I, g, p, l, y),
|
|
184
|
+
shown: E,
|
|
185
|
+
progressive: h,
|
|
186
|
+
scans: U,
|
|
187
|
+
complete: C,
|
|
188
|
+
aspect: F
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function B(n, I, k, r) {
|
|
192
|
+
let o = I, g = 0, p = 0, h = 0;
|
|
193
|
+
const q = () => {
|
|
194
|
+
if (!p) {
|
|
195
|
+
if (o >= n.length) throw new R();
|
|
196
|
+
const e = n[o];
|
|
197
|
+
if (e === 255) {
|
|
198
|
+
if (o + 1 >= n.length) throw new R();
|
|
199
|
+
if (n[o + 1] !== 0) throw new R();
|
|
200
|
+
o += 2;
|
|
201
|
+
} else o++;
|
|
202
|
+
g = e, p = 8;
|
|
203
|
+
}
|
|
204
|
+
return p--, g >> p & 1;
|
|
205
|
+
}, l = (e) => {
|
|
206
|
+
let t = 0;
|
|
207
|
+
for (; e--; ) t = t << 1 | q();
|
|
208
|
+
return t;
|
|
209
|
+
}, y = (e) => {
|
|
210
|
+
if (!e) return 0;
|
|
211
|
+
const t = l(e);
|
|
212
|
+
return t < 1 << e - 1 ? t - (1 << e) + 1 : t;
|
|
213
|
+
}, v = (e) => {
|
|
214
|
+
let t = 0;
|
|
215
|
+
for (let s = 1; s <= 16; s++)
|
|
216
|
+
if (t = t << 1 | q(), t <= e.maxcode[s]) return e.vals[e.valptr[s] + t - e.mincode[s]];
|
|
217
|
+
throw new R();
|
|
218
|
+
}, M = (e, t) => {
|
|
219
|
+
const s = v(e.dc);
|
|
220
|
+
e.pred += y(s), e.coeffs[t] = e.pred;
|
|
221
|
+
for (let i = 1; i < 64; ) {
|
|
222
|
+
const b = v(e.ac), P = b >> 4, m = b & 15;
|
|
223
|
+
if (!m) {
|
|
224
|
+
if (P < 15) break;
|
|
225
|
+
i += 16;
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
if (i += P, i > 63) break;
|
|
229
|
+
e.coeffs[t + S[i]] = y(m), i++;
|
|
230
|
+
}
|
|
231
|
+
}, F = (e, t) => {
|
|
232
|
+
const s = v(e.dc);
|
|
233
|
+
e.pred += y(s) * (1 << r.al), e.coeffs[t] = e.pred;
|
|
234
|
+
}, U = (e, t) => {
|
|
235
|
+
q() && (e.coeffs[t] |= 1 << r.al);
|
|
236
|
+
}, C = (e, t) => {
|
|
237
|
+
if (h > 0) {
|
|
238
|
+
h--;
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
for (let s = r.ss; s <= r.se; ) {
|
|
242
|
+
const i = v(e.ac), b = i >> 4, P = i & 15;
|
|
243
|
+
if (!P) {
|
|
244
|
+
if (b < 15) {
|
|
245
|
+
h = (1 << b) - 1 + l(b);
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
s += 16;
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (s += b, s > 63) break;
|
|
252
|
+
e.coeffs[t + S[s]] = y(P) * (1 << r.al), s++;
|
|
253
|
+
}
|
|
254
|
+
}, x = (e, t) => {
|
|
255
|
+
const s = 1 << r.al, i = -1 << r.al, b = e.coeffs, P = (d) => {
|
|
256
|
+
q() && (b[d] & s) === 0 && (b[d] += b[d] >= 0 ? s : i);
|
|
257
|
+
};
|
|
258
|
+
let m = r.ss;
|
|
259
|
+
if (h === 0)
|
|
260
|
+
for (; m <= r.se; m++) {
|
|
261
|
+
const d = v(e.ac);
|
|
262
|
+
let z = d >> 4;
|
|
263
|
+
const T = d & 15;
|
|
264
|
+
let G = 0;
|
|
265
|
+
if (T) G = q() ? s : i;
|
|
266
|
+
else if (z !== 15) {
|
|
267
|
+
h = 1 << z, z && (h += l(z));
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
for (; m <= r.se; m++) {
|
|
271
|
+
const J = t + S[m];
|
|
272
|
+
if (b[J] !== 0) P(J);
|
|
273
|
+
else if (--z < 0) break;
|
|
274
|
+
}
|
|
275
|
+
G && m <= r.se && (b[t + S[m]] = G);
|
|
276
|
+
}
|
|
277
|
+
if (h > 0) {
|
|
278
|
+
for (; m <= r.se; m++) {
|
|
279
|
+
const d = t + S[m];
|
|
280
|
+
b[d] !== 0 && P(d);
|
|
281
|
+
}
|
|
282
|
+
h--;
|
|
283
|
+
}
|
|
284
|
+
}, L = r.progressive ? r.ss === 0 ? r.ah ? U : F : r.ah ? x : C : M;
|
|
285
|
+
for (const e of k) e.pred = 0;
|
|
286
|
+
const E = k.length === 1, u = k[0], f = E ? u.blocksPerLine * u.blocksPerColumn : r.mcusPerLine * r.mcusPerColumn;
|
|
287
|
+
let w = 0;
|
|
288
|
+
const c = [], A = new Int16Array(64 * (E ? 1 : k.reduce((e, t) => e + t.h * t.v, 0))), a = (e, t) => {
|
|
289
|
+
A.set(e.coeffs.subarray(t, t + 64), c.length * 64), c.push({ c: e, o: t }), L(e, t);
|
|
290
|
+
};
|
|
291
|
+
try {
|
|
292
|
+
for (; w < f; ) {
|
|
293
|
+
const e = r.restart ? Math.min(r.restart, f - w) : f - w;
|
|
294
|
+
for (let t = 0; t < e; t++, w++) {
|
|
295
|
+
if (E) {
|
|
296
|
+
const s = Math.floor(w / u.blocksPerLine), i = w % u.blocksPerLine;
|
|
297
|
+
a(u, (s * u.stride + i) * 64);
|
|
298
|
+
} else {
|
|
299
|
+
const s = Math.floor(w / r.mcusPerLine), i = w % r.mcusPerLine;
|
|
300
|
+
for (const b of k) for (let P = 0; P < b.v; P++) for (let m = 0; m < b.h; m++) a(b, ((s * b.v + P) * b.stride + i * b.h + m) * 64);
|
|
301
|
+
}
|
|
302
|
+
if (!r.progressive || r.ss === 0 && r.ah === 0) for (const { c: s, o: i } of c) s.ready[i / 64] = 1;
|
|
303
|
+
c.length = 0;
|
|
304
|
+
}
|
|
305
|
+
if (w >= f) break;
|
|
306
|
+
p = 0, h = 0;
|
|
307
|
+
for (const t of k) t.pred = 0;
|
|
308
|
+
if (o + 1 >= n.length) throw new R();
|
|
309
|
+
n[o] === 255 && n[o + 1] >= 208 && n[o + 1] <= 215 && (o += 2);
|
|
310
|
+
}
|
|
311
|
+
} catch (e) {
|
|
312
|
+
if (!(e instanceof R)) throw e;
|
|
313
|
+
return c.forEach(({ c: t, o: s }, i) => t.coeffs.set(A.subarray(i * 64, (i + 1) * 64), s)), { done: !1, pos: o };
|
|
314
|
+
}
|
|
315
|
+
for (; o + 1 < n.length && !(n[o] === 255 && n[o + 1] !== 0 && (n[o + 1] < 208 || n[o + 1] > 215)); ) o++;
|
|
316
|
+
return { done: o + 1 < n.length, pos: o };
|
|
317
|
+
}
|
|
318
|
+
const H = new Float32Array(64);
|
|
319
|
+
for (let n = 0; n < 8; n++) for (let I = 0; I < 8; I++) H[n * 8 + I] = (I ? 1 : Math.SQRT1_2) * 0.5 * Math.cos((2 * n + 1) * I * Math.PI / 16);
|
|
320
|
+
function D(n, I, k, r, o, g) {
|
|
321
|
+
const p = n.map((l) => {
|
|
322
|
+
const y = l.stride * 8, v = l.coeffs.length / 64 / l.stride, M = new Uint8Array(y * v * 8), F = I[l.tq] ?? new Int32Array(64).fill(1), U = new Float32Array(64), C = new Float32Array(64);
|
|
323
|
+
for (let x = 0; x < v; x++)
|
|
324
|
+
for (let L = 0; L < l.stride; L++) {
|
|
325
|
+
const E = (x * l.stride + L) * 64;
|
|
326
|
+
for (let u = 0; u < 64; u++) U[u] = l.coeffs[E + u] * F[u];
|
|
327
|
+
for (let u = 0; u < 8; u++)
|
|
328
|
+
for (let f = 0; f < 8; f++) {
|
|
329
|
+
let w = 0;
|
|
330
|
+
for (let c = 0; c < 8; c++) w += H[f * 8 + c] * U[u * 8 + c];
|
|
331
|
+
C[u * 8 + f] = w;
|
|
332
|
+
}
|
|
333
|
+
for (let u = 0; u < 8; u++)
|
|
334
|
+
for (let f = 0; f < 8; f++) {
|
|
335
|
+
let w = 0;
|
|
336
|
+
for (let A = 0; A < 8; A++) w += H[f * 8 + A] * C[A * 8 + u];
|
|
337
|
+
const c = Math.round(w + 128);
|
|
338
|
+
M[(x * 8 + f) * y + L * 8 + u] = c < 0 ? 0 : c > 255 ? 255 : c;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return { plane: M, w: y, sx: l.h / o, sy: l.v / g };
|
|
342
|
+
});
|
|
343
|
+
if (n.length === 1) {
|
|
344
|
+
const { plane: l, w: y } = p[0], v = new Uint8Array(k * r);
|
|
345
|
+
for (let M = 0; M < r; M++) v.set(l.subarray(M * y, M * y + k), M * k);
|
|
346
|
+
return v;
|
|
347
|
+
}
|
|
348
|
+
const h = new Uint8Array(k * r * 3), q = (l) => l < 0 ? 0 : l > 255 ? 255 : Math.round(l);
|
|
349
|
+
for (let l = 0; l < r; l++)
|
|
350
|
+
for (let y = 0; y < k; y++) {
|
|
351
|
+
const [v, M, F] = p.map((C) => C.plane[Math.floor(l * C.sy) * C.w + Math.floor(y * C.sx)] ?? 128), U = (l * k + y) * 3;
|
|
352
|
+
h[U] = q(v + 1.402 * (F - 128)), h[U + 1] = q(v - 0.344136 * (M - 128) - 0.714136 * (F - 128)), h[U + 2] = q(v + 1.772 * (M - 128));
|
|
353
|
+
}
|
|
354
|
+
return h;
|
|
355
|
+
}
|
|
356
|
+
export {
|
|
357
|
+
Q as decodePartialJpeg,
|
|
358
|
+
Z as isJpeg
|
|
359
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { Reader as m, Writer as f } from "./binary.js";
|
|
2
|
+
const e = 100, a = 100, u = 200, s = e * a;
|
|
3
|
+
function l(t) {
|
|
4
|
+
const r = new m(t), n = new Uint8Array(s), c = new Uint8Array(s);
|
|
5
|
+
for (let o = 0; o < s; o++)
|
|
6
|
+
n[o] = r.u8(), c[o] = r.u8();
|
|
7
|
+
const i = [];
|
|
8
|
+
for (let o = 0; o < u; o++)
|
|
9
|
+
i.push({ monnum: r.u8(), status: r.i16(), xtra: r.u8(), curx: r.i16(), cury: r.i16(), extra: r.i16() });
|
|
10
|
+
return { blocks: n, mons: c, monsters: i };
|
|
11
|
+
}
|
|
12
|
+
function y(t) {
|
|
13
|
+
const r = new f(s * 2 + u * 10);
|
|
14
|
+
for (let n = 0; n < s; n++) r.u8(t.blocks[n]).u8(t.mons[n]);
|
|
15
|
+
for (const n of t.monsters) r.u8(n.monnum).i16(n.status).u8(n.xtra).i16(n.curx).i16(n.cury).i16(n.extra);
|
|
16
|
+
return r.toBytes();
|
|
17
|
+
}
|
|
18
|
+
function M() {
|
|
19
|
+
return {
|
|
20
|
+
blocks: new Uint8Array(s),
|
|
21
|
+
mons: new Uint8Array(s).fill(u),
|
|
22
|
+
monsters: Array.from({ length: u }, () => ({ monnum: 64, status: 0, xtra: 0, curx: 0, cury: 0, extra: 0 }))
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function w(t) {
|
|
26
|
+
t.mons.fill(u), t.monsters.forEach((r, n) => {
|
|
27
|
+
r.monnum < 64 && r.curx >= 0 && r.curx < e && r.cury >= 0 && r.cury < a && (t.mons[r.cury * e + r.curx] = n);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
u as LASTMM,
|
|
32
|
+
e as MLEN,
|
|
33
|
+
a as MWID,
|
|
34
|
+
M as newMap,
|
|
35
|
+
l as parseMap,
|
|
36
|
+
w as reindexMonsters,
|
|
37
|
+
y as serializeMap
|
|
38
|
+
};
|