jaml-ui 0.32.2 → 1.0.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.
@@ -5,7 +5,7 @@ export declare function useSeedAnalyzer(motely: MotelyApi | null, seed: string |
5
5
  seed: string;
6
6
  score: number;
7
7
  tallies: Int32Array;
8
- analysis?: import('motely-wasm/motely/analysis').MotelySeedAnalysis;
8
+ analysis?: import('motely-wasm').MotelySeedAnalysis;
9
9
  }> | null;
10
10
  loading: boolean;
11
11
  error: string | null;
@@ -1,4 +1,4 @@
1
- import { MotelyDeck, MotelyStake } from 'motely-wasm/motely/enums';
1
+ import { MotelyDeck, MotelyStake } from 'motely-wasm';
2
2
  export type DeckType = MotelyDeck;
3
3
  export type StakeType = MotelyStake;
4
4
  /**
package/dist/motely.js CHANGED
@@ -2,126 +2,141 @@
2
2
  import { n as e } from "./chunks/assets-Bb6wV80_.js";
3
3
  import { d as t, h as n, r, t as i } from "./chunks/spriteMapper-CajFGgUU.js";
4
4
  import { n as a, r as o, t as s } from "./chunks/motelyItemFormats-CNrFzcCI.js";
5
- import { useCallback as c, useEffect as l, useState as u } from "react";
6
- import d, { Motely as f, Motely as p } from "motely-wasm";
7
- import { IFileMounter as m, PermissionMode as h } from "motely-wasm/bootsharp/file-system";
5
+ import { useCallback as c, useEffect as ee, useState as l } from "react";
6
+ import u, { Motely as d, Motely as f, MotelyItemEdition as p, MotelyItemEnhancement as m, MotelyItemSeal as h, MotelyStandardcardRank as g, MotelyStandardcardSuit as _ } from "motely-wasm";
7
+ import { IFileMounter as te, PermissionMode as v } from "motely-wasm/bootsharp/file-system";
8
8
  //#region src/decode/motelyItemDecoder.ts
9
- var ee = {
9
+ var y = {
10
10
  Standardcard: "playing",
11
11
  SpectralCard: "spectral",
12
12
  TarotCard: "tarot",
13
13
  PlanetCard: "planet",
14
14
  Joker: "joker",
15
15
  Invalid: "unknown"
16
- }, g = [
17
- "2",
18
- "3",
19
- "4",
20
- "5",
21
- "6",
22
- "7",
23
- "8",
24
- "9",
25
- "10",
26
- "Jack",
27
- "Queen",
28
- "King",
29
- "Ace"
30
- ], _ = [
31
- "Clubs",
32
- "Diamonds",
33
- "Hearts",
34
- "Spades"
35
- ], v = [
36
- "Base",
37
- "Foil",
38
- "Holographic",
39
- "Polychrome",
40
- "Negative"
41
- ], y = [
42
- "None",
43
- "Gold",
44
- "Red",
45
- "Blue",
46
- "Purple"
47
- ];
48
- function b(e) {
16
+ }, b = {
17
+ [p.None]: "Base",
18
+ [p.Foil]: "Foil",
19
+ [p.Holographic]: "Holographic",
20
+ [p.Polychrome]: "Polychrome",
21
+ [p.Negative]: "Negative"
22
+ }, ne = {
23
+ [h.None]: "None",
24
+ [h.Gold]: "Gold",
25
+ [h.Red]: "Red",
26
+ [h.Blue]: "Blue",
27
+ [h.Purple]: "Purple"
28
+ }, x = {
29
+ [m.None]: "None",
30
+ [m.Bonus]: "Bonus",
31
+ [m.Mult]: "Mult",
32
+ [m.Wild]: "Wild",
33
+ [m.Glass]: "Glass",
34
+ [m.Steel]: "Steel",
35
+ [m.Stone]: "Stone",
36
+ [m.Gold]: "Gold",
37
+ [m.Lucky]: "Lucky"
38
+ }, S = {
39
+ [g.Two]: "2",
40
+ [g.Three]: "3",
41
+ [g.Four]: "4",
42
+ [g.Five]: "5",
43
+ [g.Six]: "6",
44
+ [g.Seven]: "7",
45
+ [g.Eight]: "8",
46
+ [g.Nine]: "9",
47
+ [g.Ten]: "10",
48
+ [g.Jack]: "Jack",
49
+ [g.Queen]: "Queen",
50
+ [g.King]: "King",
51
+ [g.Ace]: "Ace"
52
+ }, C = {
53
+ [_.Clubs]: "Clubs",
54
+ [_.Diamonds]: "Diamonds",
55
+ [_.Hearts]: "Hearts",
56
+ [_.Spades]: "Spades"
57
+ };
58
+ function w(e) {
49
59
  return s[e];
50
60
  }
51
- function x(e) {
61
+ function T(e) {
52
62
  return e.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2");
53
63
  }
54
- function S(e) {
64
+ function E(e) {
55
65
  return e == null ? null : typeof e == "number" ? Number.isFinite(e) ? e : null : e.value ?? e.type ?? null;
56
66
  }
57
- function C(e) {
58
- let t = S(e);
67
+ function D(e) {
68
+ let t = E(e);
59
69
  return t === null ? null : t & 65535;
60
70
  }
61
- function w(e) {
62
- let t = C(e);
63
- return t === null ? "Unknown" : b(t)?.enumName ?? `item#${t}`;
71
+ function O(e) {
72
+ let t = D(e);
73
+ return t === null ? "Unknown" : w(t)?.enumName ?? `item#${t}`;
64
74
  }
65
- function T(e) {
66
- let t = b(e)?.category;
67
- return t ? ee[t] ?? "unknown" : "unknown";
75
+ function k(e) {
76
+ let t = w(e)?.category;
77
+ return t ? y[t] ?? "unknown" : "unknown";
68
78
  }
69
- function E(e) {
70
- let t = C(e);
71
- return t === null ? "unknown" : T(t);
79
+ function A(e) {
80
+ let t = D(e);
81
+ return t === null ? "unknown" : k(t);
72
82
  }
73
- function te(e) {
74
- let t = C(e);
75
- return t === null ? "Unknown" : b(t)?.displayName ?? x(w(e));
83
+ function re(e) {
84
+ let t = D(e);
85
+ return t === null ? "Unknown" : w(t)?.displayName ?? T(O(e));
76
86
  }
77
- function D(e) {
87
+ function j(e, t) {
88
+ let n = E(e);
89
+ return n === null ? !1 : (n & 1 << t) != 0;
90
+ }
91
+ function M(e) {
78
92
  if (e == null) return null;
79
- let t = typeof e == "number" ? e : e.edition;
80
- if (t == null) return null;
81
- let n = v[t];
82
- return !n || n === "Base" ? null : n;
93
+ let t = typeof e == "number" ? f.decodeItemEdition(e) : e.edition;
94
+ return t == null || t === p.None ? null : b[t];
83
95
  }
84
- function O(e) {
96
+ function N(e) {
85
97
  if (e == null) return null;
86
- let t = typeof e == "number" ? null : e.seal;
87
- if (t == null) return null;
88
- let n = y[t];
89
- return !n || n === "None" ? null : n;
98
+ let t = typeof e == "number" ? f.decodeItemSeal(e) : e.seal;
99
+ return t == null || t === h.None ? null : ne[t];
90
100
  }
91
- function k(e) {
92
- return e == null || typeof e == "number" || e.enhancement, null;
101
+ function P(e) {
102
+ if (e == null) return null;
103
+ let t = typeof e == "number" ? f.decodeItemEnhancement(e) : e.enhancement;
104
+ return t == null || t === m.None ? null : x[t] ?? null;
93
105
  }
94
- function A(e) {
95
- if (e == null || E(e) !== "playing") return null;
96
- let t = typeof e == "number" ? C(e) : e.rank;
97
- return t == null ? null : typeof e == "number" ? g[t & 15] ?? null : g[t] ?? null;
106
+ function F(e) {
107
+ if (e == null || A(e) !== "playing") return null;
108
+ let t = typeof e == "number" ? f.decodeStandardcardRank(e) : e.rank;
109
+ return t == null ? null : S[t] ?? null;
98
110
  }
99
- function j(e) {
100
- if (e == null || E(e) !== "playing") return null;
101
- let t = typeof e == "number" ? C(e) : e.suit;
102
- return t == null ? null : typeof e == "number" ? _[t >> 4 & 15] ?? null : _[t] ?? null;
111
+ function I(e) {
112
+ if (e == null || A(e) !== "playing") return null;
113
+ let t = typeof e == "number" ? f.decodeStandardcardSuit(e) : e.suit;
114
+ return t == null ? null : C[t] ?? null;
103
115
  }
104
- function ne(e) {
105
- return w(e);
116
+ function ie(e) {
117
+ return O(e);
106
118
  }
107
- function M(e) {
108
- let t = C(e);
119
+ function L(e) {
120
+ let t = D(e);
109
121
  if (t === null) return null;
110
- let n = b(t), r = n?.enumName ?? `Unknown_${t}`, i = T(t);
122
+ let n = w(t), r = n?.enumName ?? `Unknown_${t}`, i = k(t);
111
123
  return {
112
124
  itemType: t,
113
125
  enumKey: r,
114
- displayName: n?.displayName ?? x(r),
126
+ displayName: n?.displayName ?? T(r),
115
127
  category: i,
116
- edition: D(e),
117
- seal: O(e),
118
- enhancement: k(e),
119
- rank: A(e),
120
- suit: j(e)
128
+ edition: M(e),
129
+ seal: N(e),
130
+ enhancement: P(e),
131
+ rank: F(e),
132
+ suit: I(e),
133
+ isEternal: typeof e == "number" ? f.isEternal(e) : j(e, 30),
134
+ isPerishable: typeof e == "number" ? f.isPerishable(e) : j(e, 31),
135
+ isRental: typeof e == "number" ? f.isRental(e) : j(e, 29)
121
136
  };
122
137
  }
123
- function re(e, t) {
124
- let n = M(e);
138
+ function R(e, t) {
139
+ let n = L(e);
125
140
  return n ? {
126
141
  type: n.category === "joker" ? "joker" : n.category === "playing" ? "playing" : "consumable",
127
142
  card: {
@@ -131,18 +146,21 @@ function re(e, t) {
131
146
  enhancements: n.enhancement ? [n.enhancement] : void 0,
132
147
  rank: n.rank ?? void 0,
133
148
  suit: n.suit ?? void 0,
149
+ isEternal: n.isEternal,
150
+ isPerishable: n.isPerishable,
151
+ isRental: n.isRental,
134
152
  scale: t
135
153
  }
136
154
  } : null;
137
155
  }
138
- function N() {}
139
- function P() {
156
+ function z() {}
157
+ function B() {
140
158
  return 0;
141
159
  }
142
160
  //#endregion
143
161
  //#region src/decode/motelySprite.ts
144
- function F(a) {
145
- let o = M(a);
162
+ function V(a) {
163
+ let o = L(a);
146
164
  if (!o) return null;
147
165
  if (o.category === "playing" && o.rank && o.suit) {
148
166
  let r = t[o.rank], i = n[o.suit];
@@ -169,7 +187,7 @@ function F(a) {
169
187
  category: o.category
170
188
  } : null;
171
189
  }
172
- function I(a, o = "unknown") {
190
+ function H(a, o = "unknown") {
173
191
  if (o === "playing") {
174
192
  let r = /^(.*?)\s+of\s+(.*?)$/i.exec(a);
175
193
  if (r) {
@@ -200,39 +218,39 @@ function I(a, o = "unknown") {
200
218
  }
201
219
  //#endregion
202
220
  //#region src/motelyDisplay.ts
203
- var L = p;
204
- function R(e, t) {
221
+ var U = f;
222
+ function W(e, t) {
205
223
  let n = e[String(t)];
206
224
  return typeof n == "string" && n.length > 0 ? n : null;
207
225
  }
208
- function z(e) {
209
- return R(L.MotelyBossBlind, e & 255) ?? `boss#${e}`;
226
+ function G(e) {
227
+ return W(U.MotelyBossBlind, e & 255) ?? `boss#${e}`;
210
228
  }
211
- function B(e) {
229
+ function K(e) {
212
230
  return e;
213
231
  }
214
- function V(e) {
215
- return R(L.MotelyVoucher, e) ?? `voucher#${e}`;
232
+ function q(e) {
233
+ return W(U.MotelyVoucher, e) ?? `voucher#${e}`;
216
234
  }
217
- function H(e) {
235
+ function J(e) {
218
236
  return e;
219
237
  }
220
- function U(e) {
221
- return R(L.MotelyTag, e) ?? `tag#${e}`;
238
+ function ae(e) {
239
+ return W(U.MotelyTag, e) ?? `tag#${e}`;
222
240
  }
223
- function W(e) {
241
+ function oe(e) {
224
242
  return e;
225
243
  }
226
- function G(e) {
227
- return R(L.MotelyBoosterPack, e) ?? `pack#${e}`;
244
+ function se(e) {
245
+ return W(U.MotelyBoosterPack, e) ?? `pack#${e}`;
228
246
  }
229
- function K(e) {
247
+ function ce(e) {
230
248
  return `${e} Pack`;
231
249
  }
232
- function q(e) {
250
+ function le(e) {
233
251
  return e;
234
252
  }
235
- function J(e) {
253
+ function ue(e) {
236
254
  return s[e & 65535]?.displayName ?? `item#${e}`;
237
255
  }
238
256
  //#endregion
@@ -241,7 +259,7 @@ var Y = null, X = null, Z = null;
241
259
  function Q() {
242
260
  return Z || (Z = (async () => {
243
261
  try {
244
- Y = await import("@rewaffle/bootsharp-file-system"), Y.init(m);
262
+ Y = await import("@rewaffle/bootsharp-file-system"), Y.init(te);
245
263
  } catch (e) {
246
264
  X = e;
247
265
  }
@@ -250,17 +268,17 @@ function Q() {
250
268
  function $(e) {
251
269
  return e instanceof Error ? e.message : String(e);
252
270
  }
253
- function ie() {
254
- let [e, t] = u("idle"), [n, r] = u(null), [i, a] = u([]), [s, d] = u(null);
255
- l(() => {
271
+ function de() {
272
+ let [e, t] = l("idle"), [n, r] = l(null), [i, a] = l([]), [s, u] = l(null);
273
+ ee(() => {
256
274
  let e = !1;
257
275
  return Q().then(() => {
258
- e || Y === null && (t("unsupported"), d($(X ?? "Bootsharp FileSystem package is not available.")));
276
+ e || Y === null && (t("unsupported"), u($(X ?? "Bootsharp FileSystem package is not available.")));
259
277
  }), () => {
260
278
  e = !0;
261
279
  };
262
280
  }, []);
263
- let f = Y !== null, m = c(() => {
281
+ let d = Y !== null, p = c(() => {
264
282
  n && a((e) => [...e]);
265
283
  }, [n]);
266
284
  return {
@@ -270,40 +288,40 @@ function ie() {
270
288
  error: s,
271
289
  mount: c(async () => {
272
290
  if (await Q(), Y === null) {
273
- t("unsupported"), d($(X ?? "Bootsharp FileSystem package is not available."));
291
+ t("unsupported"), u($(X ?? "Bootsharp FileSystem package is not available."));
274
292
  return;
275
293
  }
276
- t("mounting"), d(null);
294
+ t("mounting"), u(null);
277
295
  try {
278
296
  await o();
279
- let e = await p.pickRoot({
280
- mode: h.ReadWrite,
297
+ let e = await f.pickRoot({
298
+ mode: v.ReadWrite,
281
299
  id: "jaml-library"
282
300
  });
283
301
  if (!e) {
284
302
  t("idle");
285
303
  return;
286
304
  }
287
- r(await p.mountRoot(e, { mode: h.ReadWrite })), a([]), t("ready");
305
+ r(await f.mountRoot(e, { mode: v.ReadWrite })), a([]), t("ready");
288
306
  } catch (e) {
289
- t("error"), d($(e));
307
+ t("error"), u($(e));
290
308
  }
291
309
  }, []),
292
310
  unmount: c(async () => {
293
- n && (await o(), await p.unmountRoot(n), r(null), a([]), t(f ? "idle" : "unsupported"));
294
- }, [f, n]),
311
+ n && (await o(), await f.unmountRoot(n), r(null), a([]), t(d ? "idle" : "unsupported"));
312
+ }, [d, n]),
295
313
  loadFile: c(async (e) => {
296
314
  if (!n) throw Error("JAML library is not mounted.");
297
- return await o(), await p.readTextFile(n, e);
315
+ return await o(), await f.readTextFile(n, e);
298
316
  }, [n]),
299
317
  saveFile: c(async (e, t) => {
300
318
  if (!n) throw Error("JAML library is not mounted.");
301
- await o(), await p.writeTextFile(n, e, t), a((t) => (t.includes(e) ? t : [...t, e]).sort((e, t) => e.localeCompare(t)));
319
+ await o(), await f.writeTextFile(n, e, t), a((t) => (t.includes(e) ? t : [...t, e]).sort((e, t) => e.localeCompare(t)));
302
320
  }, [n]),
303
- refresh: m
321
+ refresh: p
304
322
  };
305
323
  }
306
324
  //#endregion
307
- export { a as MOTELY_BIN_PATH, f as Motely, d as bootsharp, M as decodeMotelyItem, ne as decodeMotelyItemName, re as decodeMotelyItemToJamlCard, o as ensureMotelyReady, I as getMotelySpriteByName, G as motelyBoosterPackDisplayName, K as motelyBoosterPackDisplayNameFromKey, z as motelyBossDisplayName, B as motelyBossDisplayNameFromKey, P as motelyItemCacheSize, T as motelyItemCategory, te as motelyItemDisplayName, q as motelyItemDisplayNameFromKey, J as motelyItemDisplayNameFromValue, D as motelyItemEditionName, k as motelyItemEnhancementName, E as motelyItemRenderCategory, O as motelyItemSealName, F as motelyItemToSprite, w as motelyItemTypeName, A as motelyStandardcardRankName, j as motelyStandardcardSuitName, U as motelyTagDisplayName, W as motelyTagDisplayNameFromKey, V as motelyVoucherDisplayName, H as motelyVoucherDisplayNameFromKey, C as resolveMotelyItemType, ie as useJamlLibrary, N as warmMotelyItemCache };
325
+ export { a as MOTELY_BIN_PATH, d as Motely, u as bootsharp, L as decodeMotelyItem, ie as decodeMotelyItemName, R as decodeMotelyItemToJamlCard, o as ensureMotelyReady, H as getMotelySpriteByName, se as motelyBoosterPackDisplayName, ce as motelyBoosterPackDisplayNameFromKey, G as motelyBossDisplayName, K as motelyBossDisplayNameFromKey, B as motelyItemCacheSize, k as motelyItemCategory, re as motelyItemDisplayName, le as motelyItemDisplayNameFromKey, ue as motelyItemDisplayNameFromValue, M as motelyItemEditionName, P as motelyItemEnhancementName, A as motelyItemRenderCategory, N as motelyItemSealName, V as motelyItemToSprite, O as motelyItemTypeName, F as motelyStandardcardRankName, I as motelyStandardcardSuitName, ae as motelyTagDisplayName, oe as motelyTagDisplayNameFromKey, q as motelyVoucherDisplayName, J as motelyVoucherDisplayNameFromKey, D as resolveMotelyItemType, de as useJamlLibrary, z as warmMotelyItemCache };
308
326
 
309
327
  //# sourceMappingURL=motely.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"motely.js","names":[],"sources":["../src/decode/motelyItemDecoder.ts","../src/decode/motelySprite.ts","../src/motelyDisplay.ts","../src/hooks/useJamlLibrary.ts"],"sourcesContent":["import { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./motelyItemFormats.js\";\n\ntype MotelyItemCategoryName = \"Standardcard\" | \"SpectralCard\" | \"TarotCard\" | \"PlanetCard\" | \"Joker\" | \"Invalid\";\n\nconst CATEGORY_MAP: Record<MotelyItemCategoryName, MotelyRenderableCategory> = {\n Standardcard: \"playing\",\n SpectralCard: \"spectral\",\n TarotCard: \"tarot\",\n PlanetCard: \"planet\",\n Joker: \"joker\",\n Invalid: \"unknown\",\n};\n\nconst RANKS = [\"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"Jack\", \"Queen\", \"King\", \"Ace\"] as const;\nconst SUITS = [\"Clubs\", \"Diamonds\", \"Hearts\", \"Spades\"] as const;\nconst EDITIONS = [\"Base\", \"Foil\", \"Holographic\", \"Polychrome\", \"Negative\"] as const;\nconst SEALS = [\"None\", \"Gold\", \"Red\", \"Blue\", \"Purple\"] as const;\n\ntype RankName = (typeof RANKS)[number];\ntype SuitName = (typeof SUITS)[number];\n\nexport type CardCategory = \"joker\" | \"consumable\" | \"playing\" | \"spectral\" | \"tarot\" | \"planet\";\nexport type MotelyRenderableCategory = CardCategory | \"unknown\";\n\nexport type MotelyItemInput = number | MotelyRuntimeItem | null | undefined;\n\nexport interface MotelyRuntimeItem {\n type?: number;\n value?: number;\n edition?: number;\n seal?: number;\n enhancement?: number;\n suit?: number;\n rank?: number;\n}\n\nexport interface DecodedMotelyItem {\n itemType: number;\n enumKey: string;\n displayName: string;\n category: MotelyRenderableCategory;\n edition: \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\" | null;\n seal: \"Gold\" | \"Red\" | \"Blue\" | \"Purple\" | null;\n enhancement: string | null;\n rank: string | null;\n suit: \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null;\n}\n\nexport interface MotelyJamlCard {\n type: \"joker\" | \"consumable\" | \"playing\";\n card: {\n name: string;\n edition?: \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\";\n seal?: string;\n enhancements?: string[];\n rank?: string;\n suit?: string;\n scale?: number;\n };\n}\n\nfunction itemFormat(itemType: number) {\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE];\n}\n\nfunction spaceSplit(value: string): string {\n return value.replace(/([a-z])([A-Z])/g, \"$1 $2\").replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\");\n}\n\nfunction resolvePackedValue(input: MotelyItemInput): number | null {\n if (input == null) return null;\n if (typeof input === \"number\") return Number.isFinite(input) ? input : null;\n return input.value ?? input.type ?? null;\n}\n\nexport function resolveMotelyItemType(input: MotelyItemInput): number | null {\n const val = resolvePackedValue(input);\n return val !== null ? val & 0xffff : null;\n}\n\nexport function motelyItemTypeName(input: MotelyItemInput): string {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"Unknown\";\n return itemFormat(itemType)?.enumName ?? `item#${itemType}`;\n}\n\nexport function motelyItemCategory(itemType: number): MotelyRenderableCategory {\n const category = itemFormat(itemType)?.category as MotelyItemCategoryName | undefined;\n return category ? CATEGORY_MAP[category] ?? \"unknown\" : \"unknown\";\n}\n\nexport function motelyItemRenderCategory(input: MotelyItemInput): MotelyRenderableCategory {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"unknown\";\n return motelyItemCategory(itemType);\n}\n\nexport function motelyItemDisplayName(input: MotelyItemInput): string {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"Unknown\";\n return itemFormat(itemType)?.displayName ?? spaceSplit(motelyItemTypeName(input));\n}\n\nexport function motelyItemEditionName(input: MotelyItemInput): \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\" | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? input : input.edition;\n if (val == null) return null;\n const key = EDITIONS[val as keyof typeof EDITIONS];\n if (!key || key === \"Base\") return null;\n return key as \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\";\n}\n\nexport function motelyItemSealName(input: MotelyItemInput): \"Gold\" | \"Red\" | \"Blue\" | \"Purple\" | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? null : input.seal;\n if (val == null) return null;\n const key = SEALS[val as keyof typeof SEALS];\n if (!key || key === \"None\") return null;\n return key as \"Gold\" | \"Red\" | \"Blue\" | \"Purple\";\n}\n\nexport function motelyItemEnhancementName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? null : input.enhancement;\n if (val == null) return null;\n // Enhancements are not part of the current motely-wasm JS contract.\n return null;\n}\n\nexport function motelyStandardcardRankName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? resolveMotelyItemType(input) : input.rank;\n if (val == null) return null;\n if (typeof input === \"number\") return RANKS[val & 0xf] ?? null;\n return RANKS[val] as RankName | undefined ?? null;\n}\n\nexport function motelyStandardcardSuitName(input: MotelyItemInput): \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? resolveMotelyItemType(input) : input.suit;\n if (val == null) return null;\n if (typeof input === \"number\") return SUITS[(val >> 4) & 0xf] ?? null;\n return SUITS[val] as SuitName | undefined ?? null;\n}\n\nexport function decodeMotelyItemName(input: MotelyItemInput): string {\n return motelyItemTypeName(input);\n}\n\nexport function decodeMotelyItem(input: MotelyItemInput): DecodedMotelyItem | null {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return null;\n\n const format = itemFormat(itemType);\n const enumKeyStr = format?.enumName ?? `Unknown_${itemType}`;\n const category = motelyItemCategory(itemType);\n const displayName = format?.displayName ?? spaceSplit(enumKeyStr);\n\n return {\n itemType,\n enumKey: enumKeyStr,\n displayName,\n category,\n edition: motelyItemEditionName(input),\n seal: motelyItemSealName(input),\n enhancement: motelyItemEnhancementName(input),\n rank: motelyStandardcardRankName(input),\n suit: motelyStandardcardSuitName(input),\n };\n}\n\nexport function decodeMotelyItemToJamlCard(input: MotelyItemInput, scale?: number): MotelyJamlCard | null {\n const decoded = decodeMotelyItem(input);\n if (!decoded) return null;\n\n const type: \"joker\" | \"consumable\" | \"playing\" =\n decoded.category === \"joker\" ? \"joker\"\n : decoded.category === \"playing\" ? \"playing\"\n : \"consumable\";\n\n return {\n type,\n card: {\n name: decoded.displayName,\n edition: decoded.edition ?? undefined,\n seal: decoded.seal ?? undefined,\n enhancements: decoded.enhancement ? [decoded.enhancement] : undefined,\n rank: decoded.rank ?? undefined,\n suit: decoded.suit ?? undefined,\n scale,\n },\n };\n}\n\nexport function warmMotelyItemCache(): void { /* no-op */ }\nexport function motelyItemCacheSize(): number { return 0; }\n","import { decodeMotelyItem, type MotelyRenderableCategory } from \"./motelyItemDecoder.js\";\nimport { getSpriteData, SHEET_META } from \"../sprites/spriteMapper.js\";\nimport { RANK_MAP, SUIT_MAP } from \"../sprites/spriteData.js\";\nimport { resolveJamlAssetUrl } from \"../assets.js\";\n\nexport interface MotelySpriteData {\n atlasPath: string;\n gridCol: number;\n gridRow: number;\n gridCols: number;\n gridRows: number;\n displayName: string;\n category: MotelyRenderableCategory;\n}\n\n/**\n * Given a raw motely-wasm item value (which may be a bitpacked integer or raw MotelyItemType),\n * resolves it to a sprite atlas path and grid coordinates for rendering.\n */\nexport function motelyItemToSprite(rawValue: number): MotelySpriteData | null {\n const decoded = decodeMotelyItem(rawValue);\n if (!decoded) return null;\n\n if (decoded.category === \"playing\" && decoded.rank && decoded.suit) {\n const col = RANK_MAP[decoded.rank];\n const row = SUIT_MAP[decoded.suit];\n if (col !== undefined && row !== undefined) {\n return {\n atlasPath: resolveJamlAssetUrl('deck'),\n gridCol: col,\n gridRow: row,\n gridCols: 13,\n gridRows: 4,\n displayName: decoded.displayName,\n category: \"playing\"\n };\n }\n }\n\n const sprite = getSpriteData(decoded.displayName);\n if (!sprite) return null;\n\n const meta = SHEET_META[sprite.type];\n if (!meta) return null;\n\n return {\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\n gridCol: sprite.pos.x,\n gridRow: sprite.pos.y,\n gridCols: meta.cols,\n gridRows: meta.rows,\n displayName: decoded.displayName,\n category: decoded.category\n };\n}\n\n/**\n * Resolves a sprite by name and category without needing a Motely integer.\n */\nexport function getMotelySpriteByName(name: string, category: MotelyRenderableCategory = \"unknown\"): MotelySpriteData | null {\n if (category === \"playing\") {\n // Attempt to parse \"Rank of Suit\"\n const match = /^(.*?)\\s+of\\s+(.*?)$/i.exec(name);\n if (match) {\n const rank = match[1];\n const suit = match[2];\n const col = RANK_MAP[rank];\n const row = SUIT_MAP[suit];\n if (col !== undefined && row !== undefined) {\n return {\n atlasPath: resolveJamlAssetUrl('deck'),\n gridCol: col,\n gridRow: row,\n gridCols: 13,\n gridRows: 4,\n displayName: name,\n category: \"playing\"\n };\n }\n }\n }\n\n const sprite = getSpriteData(name);\n if (!sprite) return null;\n\n const meta = SHEET_META[sprite.type];\n if (!meta) return null;\n\n return {\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\n gridCol: sprite.pos.x,\n gridRow: sprite.pos.y,\n gridCols: meta.cols,\n gridRows: meta.rows,\n displayName: name,\n category\n };\n}\n","import { Motely } from \"motely-wasm\";\nimport { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./decode/motelyItemFormats.js\";\n\ntype RuntimeEnum = Record<string, string | number>;\ntype MotelyRuntimeEnums = typeof Motely & Record<string, RuntimeEnum>;\n\nconst MotelyEnums = Motely as MotelyRuntimeEnums;\n\nfunction runtimeEnumKey(\n enumObject: Record<string, unknown>,\n value: number,\n): string | null {\n const key = enumObject[String(value)];\n return typeof key === \"string\" && key.length > 0 ? key : null;\n}\n\nexport function motelyBossDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyBossBlind, value & 0xff);\n return key ?? `boss#${value}`;\n}\n\nexport function motelyBossDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyVoucherDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyVoucher, value);\n return key ?? `voucher#${value}`;\n}\n\nexport function motelyVoucherDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyTagDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyTag, value);\n return key ?? `tag#${value}`;\n}\n\nexport function motelyTagDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyBoosterPackDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyBoosterPack, value);\n return key ?? `pack#${value}`;\n}\n\nexport function motelyBoosterPackDisplayNameFromKey(key: string): string {\n return `${key} Pack`;\n}\n\nexport function motelyItemDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyItemDisplayNameFromValue(value: number): string {\n const itemType = value & 0xffff;\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE]?.displayName ?? `item#${value}`;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Motely } from \"motely-wasm\";\nimport { ensureMotelyReady } from \"../lib/motely/runtime.js\";\nimport { IFileMounter, PermissionMode } from \"motely-wasm/bootsharp/file-system\";\n\ntype FileSystemPackage = typeof import(\"@rewaffle/bootsharp-file-system\");\n\nlet fileSystemPackage: FileSystemPackage | null = null;\nlet fileSystemInitError: unknown = null;\nlet fileSystemInitPromise: Promise<void> | null = null;\n\nfunction initFileSystem(): Promise<void> {\n if (fileSystemInitPromise) return fileSystemInitPromise;\n fileSystemInitPromise = (async () => {\n try {\n fileSystemPackage = await import(\"@rewaffle/bootsharp-file-system\");\n fileSystemPackage.init(IFileMounter);\n } catch (error) {\n fileSystemInitError = error;\n }\n })();\n return fileSystemInitPromise;\n}\n\nexport type JamlLibraryStatus = \"idle\" | \"unsupported\" | \"mounting\" | \"ready\" | \"error\";\n\nexport interface UseJamlLibraryState {\n status: JamlLibraryStatus;\n rootId: string | null;\n files: string[];\n error: string | null;\n mount: () => Promise<void>;\n unmount: () => Promise<void>;\n loadFile: (uri: string) => Promise<string>;\n saveFile: (uri: string, content: string) => Promise<void>;\n refresh: () => void;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n\nexport function useJamlLibrary(): UseJamlLibraryState {\n const [status, setStatus] = useState<JamlLibraryStatus>(\"idle\");\n const [rootId, setRootId] = useState<string | null>(null);\n const [files, setFiles] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n initFileSystem().then(() => {\n if (cancelled) return;\n if (fileSystemPackage === null) {\n setStatus(\"unsupported\");\n setError(errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"));\n }\n });\n return () => { cancelled = true; };\n }, []);\n\n const isFileSystemReady = fileSystemPackage !== null;\n\n const refresh = useCallback(() => {\n if (!rootId) return;\n setFiles((prev) => [...prev]);\n }, [rootId]);\n\n const mount = useCallback(async () => {\n await initFileSystem();\n if (fileSystemPackage === null) {\n setStatus(\"unsupported\");\n setError(errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"));\n return;\n }\n\n setStatus(\"mounting\");\n setError(null);\n\n try {\n await ensureMotelyReady();\n const pickedRoot = await Motely.pickRoot({ mode: PermissionMode.ReadWrite, id: \"jaml-library\" });\n if (!pickedRoot) {\n setStatus(\"idle\");\n return;\n }\n\n const mountedRoot = await Motely.mountRoot(pickedRoot, { mode: PermissionMode.ReadWrite });\n setRootId(mountedRoot);\n setFiles([]);\n setStatus(\"ready\");\n } catch (err) {\n setStatus(\"error\");\n setError(errorMessage(err));\n }\n }, []);\n\n const unmount = useCallback(async () => {\n if (!rootId) return;\n await ensureMotelyReady();\n await Motely.unmountRoot(rootId);\n setRootId(null);\n setFiles([]);\n setStatus(isFileSystemReady ? \"idle\" : \"unsupported\");\n }, [isFileSystemReady, rootId]);\n\n const loadFile = useCallback(async (uri: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n return await Motely.readTextFile(rootId, uri);\n }, [rootId]);\n\n const saveFile = useCallback(async (uri: string, content: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n await Motely.writeTextFile(rootId, uri, content);\n setFiles((prev) => (prev.includes(uri) ? prev : [...prev, uri]).sort((a, b) => a.localeCompare(b)));\n }, [rootId]);\n\n return { status, rootId, files, error, mount, unmount, loadFile, saveFile, refresh };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"motely.js","names":[],"sources":["../src/decode/motelyItemDecoder.ts","../src/decode/motelySprite.ts","../src/motelyDisplay.ts","../src/hooks/useJamlLibrary.ts"],"sourcesContent":["import { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./motelyItemFormats.js\";\nimport {\n MotelyItemEdition,\n MotelyItemSeal,\n MotelyItemEnhancement,\n MotelyStandardcardRank,\n MotelyStandardcardSuit,\n} from \"motely-wasm\";\n\ntype MotelyItemCategoryName = \"Standardcard\" | \"SpectralCard\" | \"TarotCard\" | \"PlanetCard\" | \"Joker\" | \"Invalid\";\n\nconst CATEGORY_MAP: Record<MotelyItemCategoryName, MotelyRenderableCategory> = {\n Standardcard: \"playing\",\n SpectralCard: \"spectral\",\n TarotCard: \"tarot\",\n PlanetCard: \"planet\",\n Joker: \"joker\",\n Invalid: \"unknown\",\n};\n\nconst EDITIONS: Record<MotelyItemEdition, string> = {\n [MotelyItemEdition.None]: \"Base\",\n [MotelyItemEdition.Foil]: \"Foil\",\n [MotelyItemEdition.Holographic]: \"Holographic\",\n [MotelyItemEdition.Polychrome]: \"Polychrome\",\n [MotelyItemEdition.Negative]: \"Negative\",\n};\n\nconst SEALS: Record<MotelyItemSeal, string> = {\n [MotelyItemSeal.None]: \"None\",\n [MotelyItemSeal.Gold]: \"Gold\",\n [MotelyItemSeal.Red]: \"Red\",\n [MotelyItemSeal.Blue]: \"Blue\",\n [MotelyItemSeal.Purple]: \"Purple\",\n};\n\nconst ENHANCEMENTS: Record<MotelyItemEnhancement, string> = {\n [MotelyItemEnhancement.None]: \"None\",\n [MotelyItemEnhancement.Bonus]: \"Bonus\",\n [MotelyItemEnhancement.Mult]: \"Mult\",\n [MotelyItemEnhancement.Wild]: \"Wild\",\n [MotelyItemEnhancement.Glass]: \"Glass\",\n [MotelyItemEnhancement.Steel]: \"Steel\",\n [MotelyItemEnhancement.Stone]: \"Stone\",\n [MotelyItemEnhancement.Gold]: \"Gold\",\n [MotelyItemEnhancement.Lucky]: \"Lucky\",\n};\n\nconst RANKS: Record<MotelyStandardcardRank, string> = {\n [MotelyStandardcardRank.Two]: \"2\",\n [MotelyStandardcardRank.Three]: \"3\",\n [MotelyStandardcardRank.Four]: \"4\",\n [MotelyStandardcardRank.Five]: \"5\",\n [MotelyStandardcardRank.Six]: \"6\",\n [MotelyStandardcardRank.Seven]: \"7\",\n [MotelyStandardcardRank.Eight]: \"8\",\n [MotelyStandardcardRank.Nine]: \"9\",\n [MotelyStandardcardRank.Ten]: \"10\",\n [MotelyStandardcardRank.Jack]: \"Jack\",\n [MotelyStandardcardRank.Queen]: \"Queen\",\n [MotelyStandardcardRank.King]: \"King\",\n [MotelyStandardcardRank.Ace]: \"Ace\",\n};\n\nconst SUITS: Record<MotelyStandardcardSuit, \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\"> = {\n [MotelyStandardcardSuit.Clubs]: \"Clubs\",\n [MotelyStandardcardSuit.Diamonds]: \"Diamonds\",\n [MotelyStandardcardSuit.Hearts]: \"Hearts\",\n [MotelyStandardcardSuit.Spades]: \"Spades\",\n};\n\n\nexport type CardCategory = \"joker\" | \"consumable\" | \"playing\" | \"spectral\" | \"tarot\" | \"planet\";\nexport type MotelyRenderableCategory = CardCategory | \"unknown\";\n\nexport type MotelyItemInput = number | MotelyRuntimeItem | null | undefined;\n\nexport interface MotelyRuntimeItem {\n type?: number;\n value?: number;\n edition?: number;\n seal?: number;\n enhancement?: number;\n suit?: number;\n rank?: number;\n}\n\nexport interface DecodedMotelyItem {\n itemType: number;\n enumKey: string;\n displayName: string;\n category: MotelyRenderableCategory;\n edition: \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\" | null;\n seal: \"Gold\" | \"Red\" | \"Blue\" | \"Purple\" | null;\n enhancement: string | null;\n rank: string | null;\n suit: \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null;\n isEternal: boolean;\n isPerishable: boolean;\n isRental: boolean;\n}\n\n\nexport interface MotelyJamlCard {\n type: \"joker\" | \"consumable\" | \"playing\";\n card: {\n name: string;\n edition?: \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\";\n seal?: string;\n enhancements?: string[];\n rank?: string;\n suit?: string;\n isEternal?: boolean;\n isPerishable?: boolean;\n isRental?: boolean;\n scale?: number;\n };\n}\n\nfunction itemFormat(itemType: number) {\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE];\n}\n\nfunction spaceSplit(value: string): string {\n return value.replace(/([a-z])([A-Z])/g, \"$1 $2\").replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\");\n}\n\nfunction resolvePackedValue(input: MotelyItemInput): number | null {\n if (input == null) return null;\n if (typeof input === \"number\") return Number.isFinite(input) ? input : null;\n return input.value ?? input.type ?? null;\n}\n\nexport function resolveMotelyItemType(input: MotelyItemInput): number | null {\n const val = resolvePackedValue(input);\n return val !== null ? val & 0xffff : null;\n}\n\nexport function motelyItemTypeName(input: MotelyItemInput): string {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"Unknown\";\n return itemFormat(itemType)?.enumName ?? `item#${itemType}`;\n}\n\nexport function motelyItemCategory(itemType: number): MotelyRenderableCategory {\n const category = itemFormat(itemType)?.category as MotelyItemCategoryName | undefined;\n return category ? CATEGORY_MAP[category] ?? \"unknown\" : \"unknown\";\n}\n\nexport function motelyItemRenderCategory(input: MotelyItemInput): MotelyRenderableCategory {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"unknown\";\n return motelyItemCategory(itemType);\n}\n\nexport function motelyItemDisplayName(input: MotelyItemInput): string {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return \"Unknown\";\n return itemFormat(itemType)?.displayName ?? spaceSplit(motelyItemTypeName(input));\n}\n\nimport { Motely } from \"motely-wasm\";\n\nfunction isStickerSet(input: MotelyItemInput, bitOffset: number): boolean {\n const val = resolvePackedValue(input);\n if (val === null) return false;\n return (val & (1 << bitOffset)) !== 0;\n}\n\nexport function motelyItemEditionName(input: MotelyItemInput): \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\" | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? Motely.decodeItemEdition(input) : input.edition;\n if (val == null || val === MotelyItemEdition.None) return null;\n return EDITIONS[val] as \"Foil\" | \"Holographic\" | \"Polychrome\" | \"Negative\";\n}\n\nexport function motelyItemSealName(input: MotelyItemInput): \"Gold\" | \"Red\" | \"Blue\" | \"Purple\" | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? Motely.decodeItemSeal(input) : input.seal;\n if (val == null || val === MotelyItemSeal.None) return null;\n return SEALS[val] as \"Gold\" | \"Red\" | \"Blue\" | \"Purple\";\n}\n\nexport function motelyItemEnhancementName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n const val = typeof input === \"number\" ? Motely.decodeItemEnhancement(input) : input.enhancement;\n if (val == null || val === MotelyItemEnhancement.None) return null;\n return ENHANCEMENTS[val] ?? null;\n}\n\n\nexport function motelyStandardcardRankName(input: MotelyItemInput): string | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? Motely.decodeStandardcardRank(input) : input.rank;\n if (val == null) return null;\n return RANKS[val] ?? null;\n}\n\nexport function motelyStandardcardSuitName(input: MotelyItemInput): \"Clubs\" | \"Diamonds\" | \"Hearts\" | \"Spades\" | null {\n if (input == null) return null;\n if (motelyItemRenderCategory(input) !== \"playing\") return null;\n const val = typeof input === \"number\" ? Motely.decodeStandardcardSuit(input) : input.suit;\n if (val == null) return null;\n return SUITS[val] ?? null;\n}\n\nexport function decodeMotelyItemName(input: MotelyItemInput): string {\n return motelyItemTypeName(input);\n}\n\nexport function decodeMotelyItem(input: MotelyItemInput): DecodedMotelyItem | null {\n const itemType = resolveMotelyItemType(input);\n if (itemType === null) return null;\n\n const format = itemFormat(itemType);\n const enumKeyStr = format?.enumName ?? `Unknown_${itemType}`;\n const category = motelyItemCategory(itemType);\n const displayName = format?.displayName ?? spaceSplit(enumKeyStr);\n\n return {\n itemType,\n enumKey: enumKeyStr,\n displayName,\n category,\n edition: motelyItemEditionName(input),\n seal: motelyItemSealName(input),\n enhancement: motelyItemEnhancementName(input),\n rank: motelyStandardcardRankName(input),\n suit: motelyStandardcardSuitName(input),\n isEternal: typeof input === \"number\" ? Motely.isEternal(input) : isStickerSet(input, 30),\n isPerishable: typeof input === \"number\" ? Motely.isPerishable(input) : isStickerSet(input, 31),\n isRental: typeof input === \"number\" ? Motely.isRental(input) : isStickerSet(input, 29),\n };\n}\n\nexport function decodeMotelyItemToJamlCard(input: MotelyItemInput, scale?: number): MotelyJamlCard | null {\n const decoded = decodeMotelyItem(input);\n if (!decoded) return null;\n\n const type: \"joker\" | \"consumable\" | \"playing\" =\n decoded.category === \"joker\" ? \"joker\"\n : decoded.category === \"playing\" ? \"playing\"\n : \"consumable\";\n\n return {\n type,\n card: {\n name: decoded.displayName,\n edition: decoded.edition ?? undefined,\n seal: decoded.seal ?? undefined,\n enhancements: decoded.enhancement ? [decoded.enhancement] : undefined,\n rank: decoded.rank ?? undefined,\n suit: decoded.suit ?? undefined,\n isEternal: decoded.isEternal,\n isPerishable: decoded.isPerishable,\n isRental: decoded.isRental,\n scale,\n },\n };\n}\n\nexport function warmMotelyItemCache(): void { /* no-op */ }\nexport function motelyItemCacheSize(): number { return 0; }\n","import { decodeMotelyItem, type MotelyRenderableCategory } from \"./motelyItemDecoder.js\";\nimport { getSpriteData, SHEET_META } from \"../sprites/spriteMapper.js\";\nimport { RANK_MAP, SUIT_MAP } from \"../sprites/spriteData.js\";\nimport { resolveJamlAssetUrl } from \"../assets.js\";\n\nexport interface MotelySpriteData {\n atlasPath: string;\n gridCol: number;\n gridRow: number;\n gridCols: number;\n gridRows: number;\n displayName: string;\n category: MotelyRenderableCategory;\n}\n\n/**\n * Given a raw motely-wasm item value (which may be a bitpacked integer or raw MotelyItemType),\n * resolves it to a sprite atlas path and grid coordinates for rendering.\n */\nexport function motelyItemToSprite(rawValue: number): MotelySpriteData | null {\n const decoded = decodeMotelyItem(rawValue);\n if (!decoded) return null;\n\n if (decoded.category === \"playing\" && decoded.rank && decoded.suit) {\n const col = RANK_MAP[decoded.rank];\n const row = SUIT_MAP[decoded.suit];\n if (col !== undefined && row !== undefined) {\n return {\n atlasPath: resolveJamlAssetUrl('deck'),\n gridCol: col,\n gridRow: row,\n gridCols: 13,\n gridRows: 4,\n displayName: decoded.displayName,\n category: \"playing\"\n };\n }\n }\n\n const sprite = getSpriteData(decoded.displayName);\n if (!sprite) return null;\n\n const meta = SHEET_META[sprite.type];\n if (!meta) return null;\n\n return {\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\n gridCol: sprite.pos.x,\n gridRow: sprite.pos.y,\n gridCols: meta.cols,\n gridRows: meta.rows,\n displayName: decoded.displayName,\n category: decoded.category\n };\n}\n\n/**\n * Resolves a sprite by name and category without needing a Motely integer.\n */\nexport function getMotelySpriteByName(name: string, category: MotelyRenderableCategory = \"unknown\"): MotelySpriteData | null {\n if (category === \"playing\") {\n // Attempt to parse \"Rank of Suit\"\n const match = /^(.*?)\\s+of\\s+(.*?)$/i.exec(name);\n if (match) {\n const rank = match[1];\n const suit = match[2];\n const col = RANK_MAP[rank];\n const row = SUIT_MAP[suit];\n if (col !== undefined && row !== undefined) {\n return {\n atlasPath: resolveJamlAssetUrl('deck'),\n gridCol: col,\n gridRow: row,\n gridCols: 13,\n gridRows: 4,\n displayName: name,\n category: \"playing\"\n };\n }\n }\n }\n\n const sprite = getSpriteData(name);\n if (!sprite) return null;\n\n const meta = SHEET_META[sprite.type];\n if (!meta) return null;\n\n return {\n atlasPath: resolveJamlAssetUrl(meta.assetKey),\n gridCol: sprite.pos.x,\n gridRow: sprite.pos.y,\n gridCols: meta.cols,\n gridRows: meta.rows,\n displayName: name,\n category\n };\n}\n","import { Motely } from \"motely-wasm\";\nimport { MOTELY_ITEM_FORMATS_BY_VALUE } from \"./decode/motelyItemFormats.js\";\n\ntype RuntimeEnum = Record<string, string | number>;\ntype MotelyRuntimeEnums = typeof Motely & Record<string, RuntimeEnum>;\n\nconst MotelyEnums = Motely as MotelyRuntimeEnums;\n\nfunction runtimeEnumKey(\n enumObject: Record<string, unknown>,\n value: number,\n): string | null {\n const key = enumObject[String(value)];\n return typeof key === \"string\" && key.length > 0 ? key : null;\n}\n\nexport function motelyBossDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyBossBlind, value & 0xff);\n return key ?? `boss#${value}`;\n}\n\nexport function motelyBossDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyVoucherDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyVoucher, value);\n return key ?? `voucher#${value}`;\n}\n\nexport function motelyVoucherDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyTagDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyTag, value);\n return key ?? `tag#${value}`;\n}\n\nexport function motelyTagDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyBoosterPackDisplayName(value: number): string {\n const key = runtimeEnumKey(MotelyEnums.MotelyBoosterPack, value);\n return key ?? `pack#${value}`;\n}\n\nexport function motelyBoosterPackDisplayNameFromKey(key: string): string {\n return `${key} Pack`;\n}\n\nexport function motelyItemDisplayNameFromKey(key: string): string {\n return key;\n}\n\nexport function motelyItemDisplayNameFromValue(value: number): string {\n const itemType = value & 0xffff;\n return MOTELY_ITEM_FORMATS_BY_VALUE[itemType as keyof typeof MOTELY_ITEM_FORMATS_BY_VALUE]?.displayName ?? `item#${value}`;\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { Motely } from \"motely-wasm\";\nimport { ensureMotelyReady } from \"../lib/motely/runtime.js\";\nimport { IFileMounter, PermissionMode } from \"motely-wasm/bootsharp/file-system\";\n\ntype FileSystemPackage = typeof import(\"@rewaffle/bootsharp-file-system\");\n\nlet fileSystemPackage: FileSystemPackage | null = null;\nlet fileSystemInitError: unknown = null;\nlet fileSystemInitPromise: Promise<void> | null = null;\n\nfunction initFileSystem(): Promise<void> {\n if (fileSystemInitPromise) return fileSystemInitPromise;\n fileSystemInitPromise = (async () => {\n try {\n fileSystemPackage = await import(\"@rewaffle/bootsharp-file-system\");\n fileSystemPackage.init(IFileMounter);\n } catch (error) {\n fileSystemInitError = error;\n }\n })();\n return fileSystemInitPromise;\n}\n\nexport type JamlLibraryStatus = \"idle\" | \"unsupported\" | \"mounting\" | \"ready\" | \"error\";\n\nexport interface UseJamlLibraryState {\n status: JamlLibraryStatus;\n rootId: string | null;\n files: string[];\n error: string | null;\n mount: () => Promise<void>;\n unmount: () => Promise<void>;\n loadFile: (uri: string) => Promise<string>;\n saveFile: (uri: string, content: string) => Promise<void>;\n refresh: () => void;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n\nexport function useJamlLibrary(): UseJamlLibraryState {\n const [status, setStatus] = useState<JamlLibraryStatus>(\"idle\");\n const [rootId, setRootId] = useState<string | null>(null);\n const [files, setFiles] = useState<string[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n initFileSystem().then(() => {\n if (cancelled) return;\n if (fileSystemPackage === null) {\n setStatus(\"unsupported\");\n setError(errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"));\n }\n });\n return () => { cancelled = true; };\n }, []);\n\n const isFileSystemReady = fileSystemPackage !== null;\n\n const refresh = useCallback(() => {\n if (!rootId) return;\n setFiles((prev) => [...prev]);\n }, [rootId]);\n\n const mount = useCallback(async () => {\n await initFileSystem();\n if (fileSystemPackage === null) {\n setStatus(\"unsupported\");\n setError(errorMessage(fileSystemInitError ?? \"Bootsharp FileSystem package is not available.\"));\n return;\n }\n\n setStatus(\"mounting\");\n setError(null);\n\n try {\n await ensureMotelyReady();\n const pickedRoot = await Motely.pickRoot({ mode: PermissionMode.ReadWrite, id: \"jaml-library\" });\n if (!pickedRoot) {\n setStatus(\"idle\");\n return;\n }\n\n const mountedRoot = await Motely.mountRoot(pickedRoot, { mode: PermissionMode.ReadWrite });\n setRootId(mountedRoot);\n setFiles([]);\n setStatus(\"ready\");\n } catch (err) {\n setStatus(\"error\");\n setError(errorMessage(err));\n }\n }, []);\n\n const unmount = useCallback(async () => {\n if (!rootId) return;\n await ensureMotelyReady();\n await Motely.unmountRoot(rootId);\n setRootId(null);\n setFiles([]);\n setStatus(isFileSystemReady ? \"idle\" : \"unsupported\");\n }, [isFileSystemReady, rootId]);\n\n const loadFile = useCallback(async (uri: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n return await Motely.readTextFile(rootId, uri);\n }, [rootId]);\n\n const saveFile = useCallback(async (uri: string, content: string) => {\n if (!rootId) throw new Error(\"JAML library is not mounted.\");\n await ensureMotelyReady();\n await Motely.writeTextFile(rootId, uri, content);\n setFiles((prev) => (prev.includes(uri) ? prev : [...prev, uri]).sort((a, b) => a.localeCompare(b)));\n }, [rootId]);\n\n return { status, rootId, files, error, mount, unmount, loadFile, saveFile, refresh };\n}\n"],"mappings":"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"}