diff --git a/assets/images/background-mm-01.png b/assets/images/background-mm-01.png index 2ec179b..5468b16 100644 Binary files a/assets/images/background-mm-01.png and b/assets/images/background-mm-01.png differ diff --git a/assets/images/background-mm-02.png b/assets/images/background-mm-02.png index befd6da..030b489 100644 Binary files a/assets/images/background-mm-02.png and b/assets/images/background-mm-02.png differ diff --git a/src/data/assetManifest.js b/src/data/assetManifest.js index b3deb1f..999fc26 100644 --- a/src/data/assetManifest.js +++ b/src/data/assetManifest.js @@ -131,13 +131,21 @@ export const MANIFEST = { sheet('jello-items', 'assets/images/jello-items.png', 132, 132), image('bg-puddingmonsters-menu', 'assets/images/background-jello.png'), ], - mahjong: MAHJONG_TILES, + mahjong: [ + ...MAHJONG_TILES, + // chinese soundtrack (see services/soundtrack.js) — lazy-loaded here so + // its audio only downloads once Mahjong is actually entered. + (scene) => musicFrom(scene, 'chinese-music'), + ], mahjongmatch: [ ...MAHJONG_TILES, // Carries its own title, so the layout-select screen draws no heading. image('bg-mahjongmatch-menu', 'assets/images/background-mahjongmatch.png'), // In-play backdrops — one is picked at random per game. ...['01', '02', '03'].map((n) => image(`bg-mm-${n}`, `assets/images/background-mm-${n}.png`)), + // chinese soundtrack (see services/soundtrack.js) — lazy-loaded here so + // its audio only downloads once Mahjong Match is actually entered. + (scene) => musicFrom(scene, 'chinese-music'), ], spireclimb: [ image('spireclimb-act1', 'assets/images/spireclimb-act1.png'), diff --git a/src/games/mahjong/MahjongGame.js b/src/games/mahjong/MahjongGame.js index 9a0e17a..30171c9 100644 --- a/src/games/mahjong/MahjongGame.js +++ b/src/games/mahjong/MahjongGame.js @@ -6,6 +6,7 @@ import { api } from '../../services/api.js'; import { createOpponentPortrait, createPlayerPortrait } from '../../ui/Portrait.js'; import { playSound, SFX } from '../../ui/Sounds.js'; import { MusicPlayer } from '../../ui/MusicPlayer.js'; +import { getGameSoundtrack } from '../../services/soundtrack.js'; import { TILES, SUIT_NAMES, WIND_NAMES, rankOf, isSuited, FAAN_TABLE, MIN_FAAN, PLAYER_COLOR_HEX, @@ -76,7 +77,10 @@ export default class MahjongGame extends Phaser.Scene { } create() { - try { new MusicPlayer(this, this.cache.json.get('music')?.tracks ?? []); } catch { /* optional */ } + try { + const { tracks, volume } = getGameSoundtrack(this); + if (tracks.length) new MusicPlayer(this, tracks, volume); + } catch { /* optional */ } this.add.rectangle(GAME_WIDTH / 2, GAME_HEIGHT / 2, GAME_WIDTH, GAME_HEIGHT, FELT).setDepth(DEPTH.bg); const names = [auth.user?.username ?? 'You']; diff --git a/src/games/mahjongmatch/MahjongMatchGame.js b/src/games/mahjongmatch/MahjongMatchGame.js index 0402e88..db2fab0 100644 --- a/src/games/mahjongmatch/MahjongMatchGame.js +++ b/src/games/mahjongmatch/MahjongMatchGame.js @@ -2,6 +2,7 @@ import * as Phaser from 'phaser'; import { GAME_WIDTH, GAME_HEIGHT, COLORS } from '../../config.js'; import { Button } from '../../ui/Button.js'; import { MusicPlayer } from '../../ui/MusicPlayer.js'; +import { getGameSoundtrack } from '../../services/soundtrack.js'; import { playSound, playSoundEx, SFX } from '../../ui/Sounds.js'; import { api } from '../../services/api.js'; import { @@ -81,8 +82,8 @@ export default class MahjongMatchGame extends Phaser.Scene { create() { try { - const music = this.cache.json.get('music'); - if (music?.tracks) new MusicPlayer(this, music.tracks); + const { tracks, volume } = getGameSoundtrack(this); + if (tracks.length) new MusicPlayer(this, tracks, volume); } catch (_) { /* optional */ } this.add.rectangle(GAME_WIDTH / 2, GAME_HEIGHT / 2, GAME_WIDTH, GAME_HEIGHT, FELT).setDepth(D.bg); diff --git a/src/scenes/PreloadScene.js b/src/scenes/PreloadScene.js index ff88159..a23baa0 100644 --- a/src/scenes/PreloadScene.js +++ b/src/scenes/PreloadScene.js @@ -47,6 +47,7 @@ export default class PreloadScene extends Phaser.Scene { this.load.json('arcadedark-music', 'data/arcadedark-music.json'); this.load.json('hacker-music', 'data/hacker-music.json'); this.load.json('adventure-music', 'data/adventure-music.json'); + this.load.json('chinese-music', 'data/chinese-music.json'); this.load.json('advancewars-artwork', 'data/advancewars-artwork.json'); this.load.json('tetrisattack-artwork', 'data/tetrisattack-artwork.json'); this.load.json('totalannihilation-artwork', 'data/totalannihilation-artwork.json'); diff --git a/src/services/soundtrack.js b/src/services/soundtrack.js index 4644772..555b576 100644 --- a/src/services/soundtrack.js +++ b/src/services/soundtrack.js @@ -29,7 +29,9 @@ export const GAME_SOUNDTRACK_OVERRIDES = { dotlink: 'hacker', '2048': 'hacker', swdbg: 'adventure', - spireclimb: 'adventure' + spireclimb: 'adventure', + mahjong: 'chinese', + mahjongmatch: 'chinese', }; // Resolve the track list (and optional volume override) a game scene's