🎤📝 ENGLISH VOICES + SUBTITLE SYSTEM!

 VOICE FILES UPDATED:
- All 21 voice paths changed to English (_en_ versions)
- Kai: en-US-GuyNeural
- Ana: en-US-JennyNeural
- Gronk: en-GB-RyanNeural (Deep UK)

 SUBTITLE SYSTEM ADDED:
- showSubtitle() function (bottom center, 100px from bottom)
- playVoice() now accepts subtitle text
- Auto fade in/out (500ms/300ms)
- Cyan glow effect
- Word wrap support
- Depth 950 (below VHS, above Polaroid)

 STYLING:
- Font: Courier New, 20px
- Color: White with black stroke (3px)
- Shadow: Cyan glow with blur
- Duration: 2.8s (synced with 3s shots)

NEXT: Add English subtitle text to all 20 playVoice() calls!
This commit is contained in:
2026-01-10 14:19:59 +01:00
parent 53c0530ce6
commit 0efadb9448

View File

@@ -47,32 +47,32 @@ class IntroScene extends Phaser.Scene {
// 🎵 AMBIENT MUSIC
this.loadAudioSafe('noir_ambience', 'assets/audio/ambient/noir_ambience.mp3');
// 🎤 KAI VOICES (12 total)
this.loadAudioSafe('kai_01', 'assets/audio/voiceover/kai_01_beginning.mp3');
this.loadAudioSafe('kai_02', 'assets/audio/voiceover/kai_02_father.mp3');
this.loadAudioSafe('kai_03', 'assets/audio/voiceover/kai_03_whole.mp3');
this.loadAudioSafe('kai_04', 'assets/audio/voiceover/kai_04_virus.mp3');
this.loadAudioSafe('kai_05', 'assets/audio/voiceover/kai_05_zombies.mp3');
this.loadAudioSafe('kai_06', 'assets/audio/voiceover/kai_06_alone.mp3');
this.loadAudioSafe('kai_07', 'assets/audio/voiceover/kai_07_years.mp3');
this.loadAudioSafe('kai_08', 'assets/audio/voiceover/kai_08_memory.mp3');
this.loadAudioSafe('kai_09', 'assets/audio/voiceover/kai_09_fog.mp3');
this.loadAudioSafe('kai_10', 'assets/audio/voiceover/kai_10_wake.mp3');
this.loadAudioSafe('kai_11', 'assets/audio/voiceover/kai_11_find.mp3');
this.loadAudioSafe('kai_12', 'assets/audio/voiceover/kai_12_lifetime.mp3');
// 🎤 KAI VOICES (12 total - ENGLISH)
this.loadAudioSafe('kai_01', 'assets/audio/voiceover/kai_en_01.mp3');
this.loadAudioSafe('kai_02', 'assets/audio/voiceover/kai_en_02.mp3');
this.loadAudioSafe('kai_03', 'assets/audio/voiceover/kai_en_03.mp3');
this.loadAudioSafe('kai_04', 'assets/audio/voiceover/kai_en_04.mp3');
this.loadAudioSafe('kai_05', 'assets/audio/voiceover/kai_en_05.mp3');
this.loadAudioSafe('kai_06', 'assets/audio/voiceover/kai_en_06.mp3');
this.loadAudioSafe('kai_07', 'assets/audio/voiceover/kai_en_07.mp3');
this.loadAudioSafe('kai_08', 'assets/audio/voiceover/kai_en_08.mp3');
this.loadAudioSafe('kai_09', 'assets/audio/voiceover/kai_en_09.mp3');
this.loadAudioSafe('kai_10', 'assets/audio/voiceover/kai_en_10.mp3');
this.loadAudioSafe('kai_11', 'assets/audio/voiceover/kai_en_11.mp3');
this.loadAudioSafe('kai_12', 'assets/audio/voiceover/kai_en_12.mp3');
// 🎤 ANA VOICES (8 total)
this.loadAudioSafe('ana_01', 'assets/audio/voiceover/ana_01_ride.mp3');
this.loadAudioSafe('ana_02', 'assets/audio/voiceover/ana_02_immortal.mp3');
this.loadAudioSafe('ana_03', 'assets/audio/voiceover/ana_03_whole.mp3');
this.loadAudioSafe('ana_04', 'assets/audio/voiceover/ana_04_changed.mp3');
this.loadAudioSafe('ana_05', 'assets/audio/voiceover/ana_05_parents.mp3');
this.loadAudioSafe('ana_06', 'assets/audio/voiceover/ana_06_scream.mp3');
this.loadAudioSafe('ana_07', 'assets/audio/voiceover/ana_07_truth.mp3');
this.loadAudioSafe('ana_08', 'assets/audio/voiceover/ana_08_two.mp3');
// 🎤 ANA VOICES (8 total - ENGLISH)
this.loadAudioSafe('ana_01', 'assets/audio/voiceover/ana_en_01.mp3');
this.loadAudioSafe('ana_02', 'assets/audio/voiceover/ana_en_02.mp3');
this.loadAudioSafe('ana_03', 'assets/audio/voiceover/ana_en_03.mp3');
this.loadAudioSafe('ana_04', 'assets/audio/voiceover/ana_en_04.mp3');
this.loadAudioSafe('ana_05', 'assets/audio/voiceover/ana_en_05.mp3');
this.loadAudioSafe('ana_06', 'assets/audio/voiceover/ana_en_06.mp3');
this.loadAudioSafe('ana_07', 'assets/audio/voiceover/ana_en_07.mp3');
this.loadAudioSafe('ana_08', 'assets/audio/voiceover/ana_en_08.mp3');
// 🎤 GRONK VOICE
this.loadAudioSafe('gronk_01', 'assets/audio/voiceover/gronk_01_wake.mp3');
// 🎤 GRONK VOICE (ENGLISH - Deep UK)
this.loadAudioSafe('gronk_01', 'assets/audio/voiceover/gronk_en_01.mp3');
}
loadAudioSafe(key, path) {
@@ -216,7 +216,7 @@ class IntroScene extends Phaser.Scene {
});
}
playVoice(key) {
playVoice(key, subtitleText) {
try {
if (this.cache.audio.exists(key)) {
if (this.currentVoice) this.currentVoice.stop();
@@ -226,6 +226,70 @@ class IntroScene extends Phaser.Scene {
} catch (e) {
console.warn(`⚠️ Voice ${key} not available`);
}
// Show subtitle at bottom
if (subtitleText) {
this.showSubtitle(subtitleText, 2800); // 2.8s duration (slightly less than 3s shot)
}
}
showSubtitle(text, duration = 3000) {
// Remove previous subtitle
if (this.currentText) {
this.currentText.destroy();
}
const width = this.cameras.main.width;
const height = this.cameras.main.height;
// Create subtitle at bottom
this.currentText = this.add.text(
width / 2,
height - 100, // 100px from bottom
text,
{
fontFamily: 'Courier New',
fontSize: '20px',
fill: '#ffffff',
stroke: '#000000',
strokeThickness: 3,
shadow: {
offsetX: 2,
offsetY: 2,
color: '#00ffff',
blur: 8,
stroke: false,
fill: true
},
align: 'center',
wordWrap: { width: width - 100 }
}
);
this.currentText.setOrigin(0.5);
this.currentText.setAlpha(0);
this.currentText.setDepth(950); // Below VHS but above Polaroid
// Fade in
this.tweens.add({
targets: this.currentText,
alpha: 1,
duration: 500,
ease: 'Power2.easeOut'
});
// Fade out before end
this.time.delayedCall(duration - 300, () => {
if (this.currentText) {
this.tweens.add({
targets: this.currentText,
alpha: 0,
duration: 300,
onComplete: () => {
if (this.currentText) this.currentText.destroy();
}
});
}
});
}
// ═══════════════════════════════════════════════════════════