* Preload game assets
()
| 1509 | * Preload game assets |
| 1510 | */ |
| 1511 | static preload () { |
| 1512 | // Check if asset preloading is enabled. Preloading will not be done in |
| 1513 | // electron or cordova since the assets are expected to be available |
| 1514 | // locally. |
| 1515 | const preloadEnabled = this.setting ('Preload') && !Platform.desktopApp && !Platform.cordova && location.protocol.indexOf ('file') < 0; |
| 1516 | |
| 1517 | if (!preloadEnabled) { |
| 1518 | return Promise.resolve (); |
| 1519 | } |
| 1520 | |
| 1521 | const promises: Promise<void>[] = []; |
| 1522 | |
| 1523 | this.trigger('willPreloadAssets'); |
| 1524 | |
| 1525 | const assetsPath = this.setting('AssetsPath'); |
| 1526 | |
| 1527 | // Check if Preload action has a 'default' block configured |
| 1528 | const preloadAction = this.action('Preload') as typeof PreloadAction | undefined; |
| 1529 | const blocks = preloadAction?.blocks?.(); |
| 1530 | const defaultBlock = blocks?.['default']; |
| 1531 | |
| 1532 | if (defaultBlock && preloadAction) { |
| 1533 | // Use the registry-based preloading for the 'default' block |
| 1534 | for (const [category, assets] of Object.entries(defaultBlock)) { |
| 1535 | // Handle characters separately (nested structure) |
| 1536 | if (category === 'characters' && typeof assets === 'object' && !Array.isArray(assets)) { |
| 1537 | for (const [charId, sprites] of Object.entries(assets as Record<string, string[]>)) { |
| 1538 | const character = this.character(charId); |
| 1539 | if (!character) continue; |
| 1540 | |
| 1541 | let directory = character.directory ? `${character.directory}/` : ''; |
| 1542 | directory = `${assetsPath.root}/${assetsPath.characters}/${directory}`; |
| 1543 | |
| 1544 | for (const spriteName of sprites) { |
| 1545 | const spriteFile = character.sprites?.[spriteName]; |
| 1546 | if (!spriteFile || typeof spriteFile !== 'string') continue; |
| 1547 | |
| 1548 | const url = `${directory}${spriteFile}`; |
| 1549 | promises.push( |
| 1550 | Preload.image(url).then((img) => { |
| 1551 | this.imageCache(`characters/${charId}/${spriteName}`, img); |
| 1552 | this.trigger('assetLoaded', { name: spriteName, type: 'image', category: 'characters' }); |
| 1553 | }) |
| 1554 | ); |
| 1555 | this.trigger('assetQueued'); |
| 1556 | } |
| 1557 | } |
| 1558 | continue; |
| 1559 | } |
| 1560 | |
| 1561 | if (!Array.isArray(assets)) continue; |
| 1562 | |
| 1563 | // Use the Preload action's registry to determine how to load this category |
| 1564 | const loaderType = preloadAction.getLoaderType(category); |
| 1565 | if (!loaderType) { |
| 1566 | console.warn(`Preload: No loader registered for category "${category}" in default block`); |
| 1567 | continue; |
| 1568 | } |
no test coverage detected