diff --git a/assets/characters/arcu.json b/assets/characters/arcu.json new file mode 100644 index 0000000..dc6a74a --- /dev/null +++ b/assets/characters/arcu.json @@ -0,0 +1,70 @@ +{ + "image": "arcu.png", + "height": 120, + "frames": { + "stand": { + "x": 0, + "y": 0, + "w": 42, + "h": 120, + "ax": 20.9, + "ay": 120 + }, + "blink": { + "x": 44, + "y": 0, + "w": 42, + "h": 120, + "ax": 20.3, + "ay": 120 + }, + "talk": { + "x": 88, + "y": 0, + "w": 42, + "h": 120, + "ax": 20.9, + "ay": 120 + }, + "explain": { + "x": 132, + "y": 0, + "w": 66, + "h": 120, + "ax": 24.3, + "ay": 120 + }, + "laugh": { + "x": 200, + "y": 0, + "w": 46, + "h": 121, + "ax": 17.8, + "ay": 121 + }, + "point": { + "x": 248, + "y": 0, + "w": 65, + "h": 121, + "ax": 24.9, + "ay": 121 + }, + "shrug": { + "x": 315, + "y": 0, + "w": 78, + "h": 121, + "ax": 36.9, + "ay": 121 + }, + "arms_crossed": { + "x": 395, + "y": 0, + "w": 43, + "h": 121, + "ax": 19.4, + "ay": 121 + } + } +} diff --git a/assets/characters/arcu.png b/assets/characters/arcu.png new file mode 100644 index 0000000..2869ba8 Binary files /dev/null and b/assets/characters/arcu.png differ diff --git a/assets/characters/barondeduke.json b/assets/characters/barondeduke.json new file mode 100644 index 0000000..42f41e9 --- /dev/null +++ b/assets/characters/barondeduke.json @@ -0,0 +1,70 @@ +{ + "image": "barondeduke.png", + "height": 120, + "frames": { + "stand": { + "x": 0, + "y": 0, + "w": 47, + "h": 120, + "ax": 21.7, + "ay": 120 + }, + "blink": { + "x": 49, + "y": 0, + "w": 47, + "h": 120, + "ax": 21.5, + "ay": 120 + }, + "talk": { + "x": 98, + "y": 0, + "w": 48, + "h": 120, + "ax": 21.8, + "ay": 120 + }, + "explain": { + "x": 148, + "y": 0, + "w": 61, + "h": 120, + "ax": 23.9, + "ay": 120 + }, + "laugh": { + "x": 211, + "y": 0, + "w": 53, + "h": 117, + "ax": 26.6, + "ay": 117 + }, + "cards": { + "x": 266, + "y": 0, + "w": 56, + "h": 118, + "ax": 24.1, + "ay": 118 + }, + "shrug": { + "x": 324, + "y": 0, + "w": 73, + "h": 117, + "ax": 35.7, + "ay": 117 + }, + "facepalm": { + "x": 399, + "y": 0, + "w": 53, + "h": 117, + "ax": 27.3, + "ay": 117 + } + } +} diff --git a/assets/characters/barondeduke.png b/assets/characters/barondeduke.png new file mode 100644 index 0000000..c1a9ee6 Binary files /dev/null and b/assets/characters/barondeduke.png differ diff --git a/assets/characters/tozzino.json b/assets/characters/tozzino.json new file mode 100644 index 0000000..10dd45b --- /dev/null +++ b/assets/characters/tozzino.json @@ -0,0 +1,70 @@ +{ + "image": "tozzino.png", + "height": 120, + "frames": { + "stand": { + "x": 0, + "y": 0, + "w": 40, + "h": 120, + "ax": 20.6, + "ay": 120 + }, + "blink": { + "x": 42, + "y": 0, + "w": 41, + "h": 120, + "ax": 20.5, + "ay": 120 + }, + "talk": { + "x": 85, + "y": 0, + "w": 41, + "h": 120, + "ax": 20.6, + "ay": 120 + }, + "explain": { + "x": 128, + "y": 0, + "w": 65, + "h": 120, + "ax": 24.4, + "ay": 120 + }, + "laugh": { + "x": 195, + "y": 0, + "w": 40, + "h": 120, + "ax": 20.1, + "ay": 120 + }, + "watch": { + "x": 237, + "y": 0, + "w": 51, + "h": 119, + "ax": 25.5, + "ay": 119 + }, + "look_far": { + "x": 290, + "y": 0, + "w": 56, + "h": 120, + "ax": 27.9, + "ay": 120 + }, + "bounce": { + "x": 348, + "y": 0, + "w": 67, + "h": 117, + "ax": 21.1, + "ay": 117 + } + } +} diff --git a/assets/characters/tozzino.png b/assets/characters/tozzino.png new file mode 100644 index 0000000..82026d8 Binary files /dev/null and b/assets/characters/tozzino.png differ diff --git a/assets/voices/andrea-0bd1b0f32e.mp3 b/assets/voices/andrea-0bd1b0f32e.mp3 new file mode 100644 index 0000000..0fecdd8 Binary files /dev/null and b/assets/voices/andrea-0bd1b0f32e.mp3 differ diff --git a/assets/voices/andrea-1b59141c98.mp3 b/assets/voices/andrea-1b59141c98.mp3 new file mode 100644 index 0000000..9ba7b5d Binary files /dev/null and b/assets/voices/andrea-1b59141c98.mp3 differ diff --git a/assets/voices/andrea-1fe1ee6236.mp3 b/assets/voices/andrea-1fe1ee6236.mp3 new file mode 100644 index 0000000..55d8f6a Binary files /dev/null and b/assets/voices/andrea-1fe1ee6236.mp3 differ diff --git a/assets/voices/andrea-3c32888a15.mp3 b/assets/voices/andrea-3c32888a15.mp3 new file mode 100644 index 0000000..e6158e4 Binary files /dev/null and b/assets/voices/andrea-3c32888a15.mp3 differ diff --git a/assets/voices/andrea-435306c242.mp3 b/assets/voices/andrea-435306c242.mp3 new file mode 100644 index 0000000..21df1b2 Binary files /dev/null and b/assets/voices/andrea-435306c242.mp3 differ diff --git a/assets/voices/andrea-70f150bdec.mp3 b/assets/voices/andrea-70f150bdec.mp3 new file mode 100644 index 0000000..48fdbeb Binary files /dev/null and b/assets/voices/andrea-70f150bdec.mp3 differ diff --git a/assets/voices/andrea-8ddab2d024.mp3 b/assets/voices/andrea-8ddab2d024.mp3 new file mode 100644 index 0000000..e7cfe43 Binary files /dev/null and b/assets/voices/andrea-8ddab2d024.mp3 differ diff --git a/assets/voices/andrea-aaeb40d873.mp3 b/assets/voices/andrea-aaeb40d873.mp3 new file mode 100644 index 0000000..2006671 Binary files /dev/null and b/assets/voices/andrea-aaeb40d873.mp3 differ diff --git a/assets/voices/andrea-f83ef038f8.mp3 b/assets/voices/andrea-f83ef038f8.mp3 new file mode 100644 index 0000000..a3ceeaa Binary files /dev/null and b/assets/voices/andrea-f83ef038f8.mp3 differ diff --git a/assets/voices/arcu-64735a5925.mp3 b/assets/voices/arcu-64735a5925.mp3 new file mode 100644 index 0000000..d1146a8 Binary files /dev/null and b/assets/voices/arcu-64735a5925.mp3 differ diff --git a/assets/voices/barondeduke-238f525535.mp3 b/assets/voices/barondeduke-238f525535.mp3 new file mode 100644 index 0000000..9a3e019 Binary files /dev/null and b/assets/voices/barondeduke-238f525535.mp3 differ diff --git a/assets/voices/barondeduke-3ea60b7083.mp3 b/assets/voices/barondeduke-3ea60b7083.mp3 new file mode 100644 index 0000000..1b93d59 Binary files /dev/null and b/assets/voices/barondeduke-3ea60b7083.mp3 differ diff --git a/assets/voices/barondeduke-5542a06624.mp3 b/assets/voices/barondeduke-5542a06624.mp3 new file mode 100644 index 0000000..d8526be Binary files /dev/null and b/assets/voices/barondeduke-5542a06624.mp3 differ diff --git a/assets/voices/barondeduke-944c3e57dc.mp3 b/assets/voices/barondeduke-944c3e57dc.mp3 new file mode 100644 index 0000000..b07ca31 Binary files /dev/null and b/assets/voices/barondeduke-944c3e57dc.mp3 differ diff --git a/assets/voices/index.json b/assets/voices/index.json index 327f5fc..44d8eca 100644 --- a/assets/voices/index.json +++ b/assets/voices/index.json @@ -623,6 +623,38 @@ "file": "andrea-e47b3cebb5.mp3", "sec": 4.87 }, + "andrea|Il BaronDeDuke, col cappello da cowboy. Ha l'aria di uno che aspetta qualcuno, e che spera non lo veda nessuno.": { + "file": "andrea-0bd1b0f32e.mp3", + "sec": 8.7 + }, + "andrea|Baron! Che ci fai qui?": { + "file": "andrea-1b59141c98.mp3", + "sec": 2.59 + }, + "barondeduke|Aspetto uno che mi deve riportare le mutande.": { + "file": "barondeduke-3ea60b7083.mp3", + "sec": 4.12 + }, + "andrea|Le... mutande?": { + "file": "andrea-f83ef038f8.mp3", + "sec": 3.94 + }, + "barondeduke|Le ho perse a poker, ieri sera.": { + "file": "barondeduke-5542a06624.mp3", + "sec": 1.65 + }, + "barondeduke|In mano avevo full. E ho detto: «Male male si divide».": { + "file": "barondeduke-944c3e57dc.mp3", + "sec": 5.03 + }, + "andrea|E invece?": { + "file": "andrea-435306c242.mp3", + "sec": 0.67 + }, + "barondeduke|L'altro aveva colore.": { + "file": "barondeduke-238f525535.mp3", + "sec": 1.65 + }, "andrea|La tribuna bianca e rossa. La domenica qui c'è più tifo che al Palio. Quasi.": { "file": "andrea-a50071085e.mp3", "sec": 6.84 @@ -767,6 +799,18 @@ "file": "andrea-bb70dea2a6.mp3", "sec": 2.15 }, + "andrea|L'Arcu, il mio amico di sempre. Davanti al circolino, come se ci fosse nato.": { + "file": "andrea-8ddab2d024.mp3", + "sec": 5.79 + }, + "andrea|Arcu! Ma che è sempre là, Borgo?": { + "file": "andrea-aaeb40d873.mp3", + "sec": 3.42 + }, + "arcu|E chi lo sposta???": { + "file": "arcu-64735a5925.mp3", + "sec": 0.97 + }, "andrea|Il ponte vecchio, coi suoi due archi. Chissà quante piene ha visto passare: io al primo temporale cerco riparo.": { "file": "andrea-01ec1d03ec.mp3", "sec": 7.67 @@ -935,6 +979,30 @@ "file": "andrea-f5d55187e8.mp3", "sec": 5.11 }, + "andrea|Il Tozzino, vestito di bianco da capo a piedi, con la racchetta. Guarda l'orologio ogni dieci secondi.": { + "file": "andrea-3c32888a15.mp3", + "sec": 8.1 + }, + "andrea|Tozzino! Che fai lì davanti al cancello?": { + "file": "andrea-1fe1ee6236.mp3", + "sec": 3.1 + }, + "tozzino|Aspetto Federer. Oggi si fa una partita.": { + "file": "tozzino-a069d2c5e2.mp3", + "sec": 2.85 + }, + "andrea|Federer? Roger Federer?": { + "file": "andrea-70f150bdec.mp3", + "sec": 2.67 + }, + "tozzino|E chi sennò? Ha chiamato ora: è imbottigliato in Bolognese.": { + "file": "tozzino-5072201408.mp3", + "sec": 4.3 + }, + "tozzino|Se non arriva, la vinco a tavolino.": { + "file": "tozzino-c1736e2d62.mp3", + "sec": 1.42 + }, "andrea|La Carza. A maggio c'è poca acqua: d'estate si scendeva a fare le dighe coi sassi.": { "file": "andrea-91be1de49b.mp3", "sec": 6.99 diff --git a/assets/voices/tozzino-5072201408.mp3 b/assets/voices/tozzino-5072201408.mp3 new file mode 100644 index 0000000..b2b9764 Binary files /dev/null and b/assets/voices/tozzino-5072201408.mp3 differ diff --git a/assets/voices/tozzino-a069d2c5e2.mp3 b/assets/voices/tozzino-a069d2c5e2.mp3 new file mode 100644 index 0000000..401c092 Binary files /dev/null and b/assets/voices/tozzino-a069d2c5e2.mp3 differ diff --git a/assets/voices/tozzino-c1736e2d62.mp3 b/assets/voices/tozzino-c1736e2d62.mp3 new file mode 100644 index 0000000..7f2004a Binary files /dev/null and b/assets/voices/tozzino-c1736e2d62.mp3 differ diff --git a/src/story/story.js b/src/story/story.js index 3a5f450..7a88fc2 100644 --- a/src/story/story.js +++ b/src/story/story.js @@ -112,6 +112,9 @@ export const story = { leone: { name: 'Il leone', color: '#f0a070' }, san_pietro: { name: 'San Pietro', color: '#e8e0c8' }, tosca: { name: 'La Tosca', color: '#ffb0d0' }, + arcu: { name: 'L\'Arcu', color: '#7fb2ff', sprite: 'assets/characters/arcu.json' }, + tozzino: { name: 'Il Tozzino', color: '#c8f5b0', sprite: 'assets/characters/tozzino.json' }, + barondeduke: { name: 'Il BaronDeDuke', color: '#e0c090', sprite: 'assets/characters/barondeduke.json' }, }, items: { squama: { @@ -974,6 +977,9 @@ export const story = { walk: [[0, 360], [0, 330], [300, 262], [430, 222], [600, 210], [640, 212], [640, 360]], depth: [[210, 0.4], [360, 1.15]], entry: [100, 340], + // Il BaronDeDuke nella discesa verso la polisportiva: aspetta chi gli riporta le mutande perse a poker. + speakers: { barondeduke: [230, 243] }, + people: [{ who: 'barondeduke', at: [230, 300], facing: -1, idle: 'stand', talk: ['talk', 'explain'], blink: 'blink', every: 4.6 }], hotspots: [ { id: 'campo', name: 'campo secondario', box: [140, 160, 240, 60], at: [330, 254], face: 'up', @@ -1007,6 +1013,21 @@ export const story = { { id: 'al_principale', name: 'indietro, verso il campo principale', box: [0, 330, 640, 30], at: [100, 354], exit: { scene: 'polisportiva_principale', at: [620, 330], face: 'left' }, }, + { + id: 'barondeduke', name: 'il BaronDeDuke', box: [212, 245, 36, 55], at: [190, 316], face: 'right', default: 'talk', + actions: { + look: [{ say: 'Il BaronDeDuke, col cappello da cowboy. Ha l\'aria di uno che aspetta qualcuno, e che spera non lo veda nessuno.' }], + talk: [ + { say: 'Baron! Che ci fai qui?' }, + { say: 'Aspetto uno che mi deve riportare le mutande.', who: 'barondeduke' }, + { say: 'Le... mutande?' }, + { say: 'Le ho perse a poker, ieri sera.', who: 'barondeduke', pose: 'facepalm' }, + { say: 'In mano avevo full. E ho detto: «Male male si divide».', who: 'barondeduke', pose: 'cards' }, + { say: 'E invece?' }, + { say: 'L\'altro aveva colore.', who: 'barondeduke', pose: 'shrug' }, + ], + }, + }, ], }, polisportiva_principale: { @@ -1248,6 +1269,9 @@ export const story = { walk: [[0, 360], [0, 335], [60, 300], [400, 280], [640, 250], [640, 360]], depth: [[250, 1.0], [360, 1.5]], entry: [320, 330], + // L'Arcu davanti al circolino, accanto alla fontanella (sprite di Codex, 25 ottobre). + speakers: { arcu: [418, 214] }, + people: [{ who: 'arcu', at: [418, 292], facing: -1, idle: 'stand', talk: ['talk', 'explain'], blink: 'blink', every: 4.2 }], hotspots: [ { id: 'circolo', name: 'il circolino', box: [100, 0, 380, 205], at: [300, 290], face: 'up', @@ -1293,6 +1317,13 @@ export const story = { look: [{ say: 'La strada va avanti verso Tagliaferro.' }], }, }, + { + id: 'arcu', name: 'l\'Arcu', box: [400, 216, 38, 76], at: [362, 300], face: 'right', default: 'talk', + actions: { + look: [{ say: 'L\'Arcu, il mio amico di sempre. Davanti al circolino, come se ci fosse nato.' }], + talk: [{ say: 'Arcu! Ma che è sempre là, Borgo?' }, { say: 'E chi lo sposta???', who: 'arcu', pose: 'shrug' }], + }, + }, ], }, campomigliaio_ponte: { @@ -1557,6 +1588,9 @@ export const story = { walk: [[60, 360], [250, 262], [300, 218], [350, 218], [420, 262], [600, 360]], depth: [[218, 0.55], [360, 1.65]], entry: [300, 350], + // Il Tozzino davanti al cancello del tennis, in tenuta, che aspetta Federer. + speakers: { tozzino: [440, 222] }, + people: [{ who: 'tozzino', at: [440, 300], facing: -1, idle: 'stand', talk: ['talk', 'explain'], blink: 'blink', every: 3.9 }], hotspots: [ { id: 'muro', name: 'casa dell\'ing. Tozzi', box: [0, 120, 200, 140], at: [190, 300], face: 'left', @@ -1576,6 +1610,19 @@ export const story = { { id: 'alla_pieve', name: 'su verso la Pieve', box: [0, 330, 640, 30], at: [300, 354], exit: { scene: 'pieve', at: [95, 250], face: 'right' }, }, + { + id: 'tozzino', name: 'il Tozzino', box: [422, 224, 36, 76], at: [392, 312], face: 'right', default: 'talk', + actions: { + look: [{ say: 'Il Tozzino, vestito di bianco da capo a piedi, con la racchetta. Guarda l\'orologio ogni dieci secondi.' }], + talk: [ + { say: 'Tozzino! Che fai lì davanti al cancello?' }, + { say: 'Aspetto Federer. Oggi si fa una partita.', who: 'tozzino', pose: 'explain' }, + { say: 'Federer? Roger Federer?' }, + { say: 'E chi sennò? Ha chiamato ora: è imbottigliato in Bolognese.', who: 'tozzino', pose: 'watch' }, + { say: 'Se non arriva, la vinco a tavolino.', who: 'tozzino', pose: 'look_far' }, + ], + }, + }, ], }, ponticino: { diff --git a/tests/story.test.mjs b/tests/story.test.mjs index ff9d6e5..9d2520d 100644 --- a/tests/story.test.mjs +++ b/tests/story.test.mjs @@ -470,3 +470,14 @@ test('i quattro rioni: ognuno ha la sua riga nell\'introduzione, e le battute su assert.doesNotMatch(look('pieve', 'piazza', 'colonna'), /noi rossi/); assert.match(look(null, 'pieve', 'chiesa'), /quelli in bianco/, 'un salvataggio di prima dei rioni funziona'); }); + +test('gli amici in giro: l\'Arcu al circolino, il Tozzino al cancello del tennis, il BaronDeDuke alla polisportiva', () => { + const g = new Game(story); + settle(g); + const talk = (scene, who) => { g.go(scene); settle(g); g.act('talk', who); return settle(g).map(s => `${s.who ?? 'andrea'}: ${s.text}`); }; + assert.deepEqual(talk('campomigliaio_circolo', 'arcu'), ['andrea: Arcu! Ma che è sempre là, Borgo?', 'arcu: E chi lo sposta???']); + assert.ok(talk('carza', 'tozzino').includes('tozzino: E chi sennò? Ha chiamato ora: è imbottigliato in Bolognese.')); + const baron = talk('polisportiva', 'barondeduke'); + assert.ok(baron.includes('barondeduke: In mano avevo full. E ho detto: «Male male si divide».')); + assert.equal(baron.at(-1), 'barondeduke: L\'altro aveva colore.'); +}); diff --git a/tools/voci.json b/tools/voci.json index bff5b5b..97d2def 100644 --- a/tools/voci.json +++ b/tools/voci.json @@ -6,5 +6,8 @@ "castello": { "speaker": "Damien Black", "filtro": "asetrate=24000*0.9,aresample=24000,atempo=0.95,aecho=0.8:0.7:90|180:0.25|0.15" }, "leone": { "speaker": "Baldur Sanjin", "filtro": "asetrate=24000*0.84,aresample=24000,atempo=1.08" }, "san_pietro": { "speaker": "Wulf Carlevaro", "filtro": "asetrate=24000*0.92,aresample=24000,atempo=0.95,aecho=0.8:0.6:60:0.2" }, - "tosca": { "speaker": "Gitta Nikolina" } + "tosca": { "speaker": "Gitta Nikolina" }, + "arcu": { "speaker": "Luis Moray" }, + "tozzino": { "speaker": "Dionisio Schuyler" }, + "barondeduke": { "speaker": "Craig Gutsy" } }