Musiche nuove: «Sotto i nove bastioni» alla Fortezza e la sera del paese all'aperto; la musica si spegne quasi agli occhi del Regolo
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ApqNBvNbNCwXqR2RLo8QJh
This commit is contained in:
Binary file not shown.
Binary file not shown.
+5
-2
@@ -4,12 +4,15 @@
|
|||||||
|
|
||||||
// Il brano del momento: titolo, fine, oppure quello della scena (o quello comune del gioco). Sotto il cartello
|
// Il brano del momento: titolo, fine, oppure quello della scena (o quello comune del gioco). Sotto il cartello
|
||||||
// d'apertura nessuno: lì suona la sua musichetta, una volta sola (main.js).
|
// d'apertura nessuno: lì suona la sua musichetta, una volta sola (main.js).
|
||||||
export function trackFor(story, { screen, scene }) {
|
// Quale brano: quello della scena se ce l'ha; altrimenti, all'aperto, quello della fase del giorno (la sera ha il suo);
|
||||||
|
// altrimenti quello generale del paese.
|
||||||
|
export function trackFor(story, { screen, scene, phase }) {
|
||||||
const m = story.music ?? {};
|
const m = story.music ?? {};
|
||||||
if (screen === 'splash') return null;
|
if (screen === 'splash') return null;
|
||||||
if (screen === 'title' || screen === 'intro') return m.title ?? null;
|
if (screen === 'title' || screen === 'intro') return m.title ?? null;
|
||||||
if (screen === 'ending') return m.ending ?? m.game ?? null;
|
if (screen === 'ending') return m.ending ?? m.game ?? null;
|
||||||
return story.scenes[scene]?.music ?? m.game ?? null;
|
const sc = story.scenes[scene];
|
||||||
|
return sc?.music ?? (sc?.indoor ? null : phase?.music) ?? m.game ?? null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const FADE = 1.2;
|
const FADE = 1.2;
|
||||||
|
|||||||
+3
-2
@@ -547,8 +547,9 @@ function frame(now) {
|
|||||||
last = now;
|
last = now;
|
||||||
const screen = !$('title').hidden ? 'title' : !$('splash').hidden ? 'splash' : !$('intro').hidden || !$('rione').hidden ? 'intro' : !$('ending').hidden ? 'ending' : 'game';
|
const screen = !$('title').hidden ? 'title' : !$('splash').hidden ? 'splash' : !$('intro').hidden || !$('rione').hidden ? 'intro' : !$('ending').hidden ? 'ending' : 'game';
|
||||||
document.body.classList.toggle('full', screen === 'title' || screen === 'splash' || screen === 'intro' || !$('credits').hidden);
|
document.body.classList.toggle('full', screen === 'title' || screen === 'splash' || screen === 'intro' || !$('credits').hidden);
|
||||||
music.duck = voices.playing ? 0.45 : 1;
|
// Mentre si parla la musica si abbassa; quando compaiono gli occhi del Regolo quasi si spegne, per la sorpresa.
|
||||||
music.update(trackFor(story, { screen, scene: game?.state.scene }), dt);
|
music.duck = game?.state.flags.occhi_regolo ? 0.12 : voices.playing ? 0.45 : 1;
|
||||||
|
music.update(trackFor(story, { screen, scene: game?.state.scene, phase: game?.phase() }), dt);
|
||||||
// Un minuto senza toccare niente, a gioco fermo: pausa da sola.
|
// Un minuto senza toccare niente, a gioco fermo: pausa da sola.
|
||||||
if (running && now - idleSince > IDLE_PAUSE && !game.speech && !game.walking && !game.queue.length) openPause();
|
if (running && now - idleSince > IDLE_PAUSE && !game.speech && !game.walking && !game.queue.length) openPause();
|
||||||
// A gioco fermo (titolo, pausa, fine) la scena non cambia: un ultimo disegno e poi niente, per la batteria del
|
// A gioco fermo (titolo, pausa, fine) la scena non cambia: un ultimo disegno e poi niente, per la batteria del
|
||||||
|
|||||||
+2
-1
@@ -50,7 +50,7 @@ export const story = {
|
|||||||
phases: [
|
phases: [
|
||||||
{ id: 'pomeriggio' },
|
{ id: 'pomeriggio' },
|
||||||
{ id: 'tramonto', when: 'indizio_regolo', tint: 'rgba(255, 110, 40, 0.16)' },
|
{ id: 'tramonto', when: 'indizio_regolo', tint: 'rgba(255, 110, 40, 0.16)' },
|
||||||
{ id: 'sera', when: 'casetta_aperta', tint: 'rgba(24, 28, 90, 0.42)' },
|
{ id: 'sera', when: 'casetta_aperta', tint: 'rgba(24, 28, 90, 0.42)', music: 'assets/audio/sera.mp3' },
|
||||||
],
|
],
|
||||||
// Il taccuino (pulsante «Taccuino», tasto N): le tappe del capitolo in ordine. Una tappa è fatta quando la sua
|
// Il taccuino (pulsante «Taccuino», tasto N): le tappe del capitolo in ordine. Una tappa è fatta quando la sua
|
||||||
// condizione `done` è vera; la prima non fatta è l'obiettivo di adesso. Solo testo: non si sente a voce.
|
// condizione `done` è vera; la prima non fatta è l'obiettivo di adesso. Solo testo: non si sente a voce.
|
||||||
@@ -338,6 +338,7 @@ export const story = {
|
|||||||
name: 'Sotto le mura della Fortezza',
|
name: 'Sotto le mura della Fortezza',
|
||||||
map: [36, 6],
|
map: [36, 6],
|
||||||
background: 'assets/scenes/fortezza-esterno.png',
|
background: 'assets/scenes/fortezza-esterno.png',
|
||||||
|
music: 'assets/audio/fortezza.mp3', // «Sotto i nove bastioni» (Andrea con Suno, 25 ottobre)
|
||||||
// Nella fessura, con la torcia: il pulviscolo nel fascio di luce, e gli occhi gialli che sbattono.
|
// Nella fessura, con la torcia: il pulviscolo nel fascio di luce, e gli occhi gialli che sbattono.
|
||||||
effects: [
|
effects: [
|
||||||
{ type: 'dust', when: 'luce_fessura', area: [494, 278, 14, 22], count: 7 },
|
{ type: 'dust', when: 'luce_fessura', area: [494, 278, 14, 22], count: 7 },
|
||||||
|
|||||||
@@ -13,6 +13,11 @@ test('il brano giusto per titolo, fine e scena', () => {
|
|||||||
assert.equal(trackFor(s, { screen: 'game', scene: 'a' }), 'g.mp3');
|
assert.equal(trackFor(s, { screen: 'game', scene: 'a' }), 'g.mp3');
|
||||||
assert.equal(trackFor(s, { screen: 'game', scene: 'b' }), 'b.mp3');
|
assert.equal(trackFor(s, { screen: 'game', scene: 'b' }), 'b.mp3');
|
||||||
assert.equal(trackFor({ scenes: {} }, { screen: 'game', scene: 'x' }), null);
|
assert.equal(trackFor({ scenes: {} }, { screen: 'game', scene: 'x' }), null);
|
||||||
|
// La sera ha la sua musica all'aperto; la scena col suo brano e gli interni non cambiano.
|
||||||
|
const sera = { id: 'sera', music: 's.mp3' };
|
||||||
|
assert.equal(trackFor({ ...s, scenes: { ...s.scenes, i: { indoor: true } } }, { screen: 'game', scene: 'a', phase: sera }), 's.mp3');
|
||||||
|
assert.equal(trackFor(s, { screen: 'game', scene: 'b', phase: sera }), 'b.mp3');
|
||||||
|
assert.equal(trackFor({ ...s, scenes: { ...s.scenes, i: { indoor: true } } }, { screen: 'game', scene: 'i', phase: sera }), 'g.mp3');
|
||||||
});
|
});
|
||||||
|
|
||||||
test('volume e muto', () => {
|
test('volume e muto', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user