@novely/core 0.40.0-next → 0.40.0-next.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/dist/index.d.ts CHANGED
@@ -327,6 +327,7 @@ type CharactersData<$Characters extends Record<string, Character<Lang>>> = {
327
327
  emotions: Array<keyof $Characters[Character]['emotions']>;
328
328
  };
329
329
  };
330
+ type AssetsPreloading = 'lazy' | 'blocking' | 'automatic';
330
331
  interface NovelyInit<$Language extends Lang, $Characters extends Record<string, Character<NoInfer<$Language>>>, $State extends State, $Data extends Data, $Actions extends Record<string, (...args: any[]) => ValidAction>> {
331
332
  /**
332
333
  * An object containing the characters in the game.
@@ -503,7 +504,7 @@ interface NovelyInit<$Language extends Lang, $Characters extends Record<string,
503
504
  /**
504
505
  * @default "lazy"
505
506
  */
506
- preloadAssets?: 'lazy' | 'blocking' | 'automatic';
507
+ preloadAssets?: AssetsPreloading;
507
508
  /**
508
509
  * Fetching function
509
510
  */
@@ -655,26 +655,31 @@ var Novely = (() => {
655
655
  return "";
656
656
  }
657
657
  };
658
- var getResourseType = memoize(async (url, request) => {
659
- if (!isCSSImage(url)) {
658
+ var getResourseType = memoize(
659
+ async ({ url, request }) => {
660
+ if (!isCSSImage(url)) {
661
+ return "other";
662
+ }
663
+ const extension = getUrlFileExtension(url);
664
+ if (HOWLER_SUPPORTED_FILE_FORMATS.has(extension)) {
665
+ return "audio";
666
+ }
667
+ if (SUPPORTED_IMAGE_FILE_FORMATS.has(extension)) {
668
+ return "image";
669
+ }
670
+ const contentType = await fetchContentType(url, request);
671
+ if (contentType.includes("audio")) {
672
+ return "audio";
673
+ }
674
+ if (contentType.includes("image")) {
675
+ return "image";
676
+ }
660
677
  return "other";
678
+ },
679
+ {
680
+ getCacheKey: ({ url }) => url
661
681
  }
662
- const extension = getUrlFileExtension(url);
663
- if (HOWLER_SUPPORTED_FILE_FORMATS.has(extension)) {
664
- return "audio";
665
- }
666
- if (SUPPORTED_IMAGE_FILE_FORMATS.has(extension)) {
667
- return "image";
668
- }
669
- const contentType = await fetchContentType(url, request);
670
- if (contentType.includes("audio")) {
671
- return "audio";
672
- }
673
- if (contentType.includes("image")) {
674
- return "image";
675
- }
676
- return "other";
677
- });
682
+ );
678
683
  var capitalize = (str2) => {
679
684
  return str2[0].toUpperCase() + str2.slice(1);
680
685
  };
@@ -854,6 +859,17 @@ var Novely = (() => {
854
859
  var toArray = (target) => {
855
860
  return Array.isArray(target) ? target : [target];
856
861
  };
862
+ var getLanguageFromStore = (store2) => {
863
+ return store2.get().meta[0];
864
+ };
865
+ var getVolumeFromStore = (store2) => {
866
+ const { meta } = store2.get();
867
+ return {
868
+ music: meta[2],
869
+ sound: meta[3],
870
+ voice: meta[4]
871
+ };
872
+ };
857
873
 
858
874
  // ../../node_modules/.pnpm/es-toolkit@1.16.0/node_modules/es-toolkit/dist/compat/predicate/isObjectLike.mjs
859
875
  function isObjectLike(value) {
@@ -1207,6 +1223,11 @@ var Novely = (() => {
1207
1223
  }
1208
1224
 
1209
1225
  // src/preloading.ts
1226
+ var ACTION_NAME_TO_VOLUME_MAP = {
1227
+ "playMusic": "music",
1228
+ "playSound": "sound",
1229
+ "voice": "voice"
1230
+ };
1210
1231
  var enqueueAssetForPreloading = (asset2) => {
1211
1232
  if (!PRELOADED_ASSETS.has(asset2)) {
1212
1233
  ASSETS_TO_PRELOAD.add(asset2);
@@ -1215,7 +1236,10 @@ var Novely = (() => {
1215
1236
  var handleAssetsPreloading = async ({ request, limiter, preloadAudioBlocking, preloadImageBlocking }) => {
1216
1237
  const list = mapSet(ASSETS_TO_PRELOAD, (asset2) => {
1217
1238
  return limiter(async () => {
1218
- const type = await getResourseType(request, asset2);
1239
+ const type = await getResourseType({
1240
+ url: asset2,
1241
+ request
1242
+ });
1219
1243
  switch (type) {
1220
1244
  case "audio": {
1221
1245
  await preloadAudioBlocking(asset2);
@@ -1233,7 +1257,7 @@ var Novely = (() => {
1233
1257
  await Promise.allSettled(list);
1234
1258
  ASSETS_TO_PRELOAD.clear();
1235
1259
  };
1236
- var huntAssets = ({ characters, action, props, handle }) => {
1260
+ var huntAssets = ({ volume, lang, mode, characters, action, props, handle }) => {
1237
1261
  if (action === "showBackground") {
1238
1262
  if (isString(props[0])) {
1239
1263
  handle(handleAudioAsset(props[0]));
@@ -1242,13 +1266,39 @@ var Novely = (() => {
1242
1266
  for (const value of Object.values(props[0])) {
1243
1267
  if (isImageAsset(value)) {
1244
1268
  handle(value);
1269
+ } else if (isAsset(value)) {
1270
+ const unwrapped = handleImageAsset(value);
1271
+ if (isImageAsset(unwrapped)) {
1272
+ handle(unwrapped);
1273
+ }
1245
1274
  }
1246
1275
  }
1247
1276
  }
1248
1277
  return;
1249
1278
  }
1279
+ const getVolumeFor = (action2) => {
1280
+ if (action2 in ACTION_NAME_TO_VOLUME_MAP) {
1281
+ return volume[ACTION_NAME_TO_VOLUME_MAP[action2]];
1282
+ }
1283
+ return 0;
1284
+ };
1250
1285
  if (isAudioAction(action) && isString(props[0])) {
1251
- handle(handleAudioAsset(props[0]));
1286
+ if (getVolumeFor(action) > 0) {
1287
+ handle(handleAudioAsset(props[0]));
1288
+ }
1289
+ return;
1290
+ }
1291
+ if (action === "voice" && typeof props[0] === "object") {
1292
+ if (getVolumeFor("voice") == 0) {
1293
+ return;
1294
+ }
1295
+ for (const [language, value] of Object.entries(props[0])) {
1296
+ if (mode === "blocking") {
1297
+ value && handle(handleAudioAsset(value));
1298
+ } else if (language === lang) {
1299
+ value && handle(handleAudioAsset(value));
1300
+ }
1301
+ }
1252
1302
  return;
1253
1303
  }
1254
1304
  if (action === "showCharacter" && isString(props[0]) && isString(props[1])) {
@@ -1340,7 +1390,15 @@ var Novely = (() => {
1340
1390
  }
1341
1391
  return (...props) => {
1342
1392
  if (preloadAssets === "blocking") {
1343
- huntAssets({ characters, action: action2, props, handle: enqueueAssetForPreloading });
1393
+ huntAssets({
1394
+ action: action2,
1395
+ props,
1396
+ mode: preloadAssets,
1397
+ characters,
1398
+ lang: getLanguageFromStore(storageData),
1399
+ volume: getVolumeFromStore(storageData),
1400
+ handle: enqueueAssetForPreloading
1401
+ });
1344
1402
  }
1345
1403
  return [action2, ...props];
1346
1404
  };
@@ -1603,7 +1661,15 @@ var Novely = (() => {
1603
1661
  if (isAudioAction(action2)) return;
1604
1662
  if (action2 === "vibrate") return;
1605
1663
  if (action2 === "end") return;
1606
- huntAssets({ characters, action: action2, props, handle: assets.push.bind(assets) });
1664
+ huntAssets({
1665
+ action: action2,
1666
+ props,
1667
+ mode: preloadAssets,
1668
+ characters,
1669
+ lang: getLanguageFromStore(storageData),
1670
+ volume: getVolumeFromStore(storageData),
1671
+ handle: assets.push.bind(assets)
1672
+ });
1607
1673
  return match(action2, props, {
1608
1674
  ctx,
1609
1675
  data: data2
@@ -1644,7 +1710,10 @@ var Novely = (() => {
1644
1710
  getCustomActionHolder(ctx, fn).cleanup();
1645
1711
  };
1646
1712
  const getResourseTypeForRenderer = (url) => {
1647
- return getResourseType(url, request);
1713
+ return getResourseType({
1714
+ url,
1715
+ request
1716
+ });
1648
1717
  };
1649
1718
  const getCharacterColor = (c) => {
1650
1719
  return c in characters ? characters[c].color : "#000000";
@@ -1713,7 +1782,15 @@ var Novely = (() => {
1713
1782
  refer
1714
1783
  });
1715
1784
  for (const [action3, ...props2] of collection) {
1716
- huntAssets({ characters, action: action3, props: props2, handle: enqueueAssetForPreloading });
1785
+ huntAssets({
1786
+ action: action3,
1787
+ props: props2,
1788
+ mode: preloadAssets,
1789
+ characters,
1790
+ lang: getLanguageFromStore(storageData),
1791
+ volume: getVolumeFromStore(storageData),
1792
+ handle: enqueueAssetForPreloading
1793
+ });
1717
1794
  }
1718
1795
  handleAssetsPreloading({
1719
1796
  ...renderer.misc,
@@ -1832,7 +1909,7 @@ var Novely = (() => {
1832
1909
  function({ ctx, push }, [fn]) {
1833
1910
  const { restoring, goingBack, preview: preview2 } = ctx.meta;
1834
1911
  const result = fn({
1835
- lang: storageData.get().meta[0],
1912
+ lang: getLanguageFromStore(storageData),
1836
1913
  goingBack,
1837
1914
  restoring,
1838
1915
  preview: preview2,
@@ -1851,7 +1928,7 @@ var Novely = (() => {
1851
1928
  }
1852
1929
  const transformedChoices = choices.map(([content, action2, visible]) => {
1853
1930
  const shown = !visible || visible({
1854
- lang: storageData.get().meta[0],
1931
+ lang: getLanguageFromStore(storageData),
1855
1932
  state: getStateAtCtx(ctx)
1856
1933
  });
1857
1934
  if (DEV && action2.length === 0 && !shown) {
@@ -1938,7 +2015,7 @@ var Novely = (() => {
1938
2015
  ctx.clearBlockingActions(void 0);
1939
2016
  }
1940
2017
  const state = getStateFunction(ctx);
1941
- const lang = storageData.get().meta[0];
2018
+ const lang = getLanguageFromStore(storageData);
1942
2019
  const result = handleCustomAction(ctx, fn, {
1943
2020
  ...ctx.custom(fn),
1944
2021
  state,