From ebd3e9cee6ec4e382dcd878fc2b2de119521fefc Mon Sep 17 00:00:00 2001 From: David Kotnik Date: Sat, 10 Jan 2026 15:00:28 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=AC=F0=9F=94=A5=20COMPLETE=20INTRO=20R?= =?UTF-8?q?EDESIGN=20-=2060s=20PERFECTION!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✅ MASSIVE CHANGES: - Faster shots (2.5s instead of 3s) - Better voice sync (100ms delay) - NEW sequence order - NO aging timeline (removed spoiler!) - Amnesia-focused ending ✅ NEW PHASE 1 (0-15s): HAPPY MEMORIES 1. Kai + Dad longboard (0-2.5s) 2. Barbershop both (2.5-5s) 3. Birthday 'HERE WE WERE STILL HAPPY' (5-7.5s) 4. Family portrait (7.5-10s) 5. Twins holding hands (10-12.5s) 6. Kai's bedroom (12.5-15s) ✅ PHASE 2 (15-30s): VIRUS 7. Virus (15-17.5s) 8. Chaos (17.5-20s) 9. Zombies (20-22.5s) 10. Parents ghosts (22.5-25s) 11. Ana taken (25-30s) ✅ PHASE 3 (30-60s): AMNESIA & ANA MEMORY 12. Black screen - 'I have no memory' (30-35s) 13. Kai alone - 'They say I'm 14' (35-40s) 14. Ana memory - 'Last thing I saw' (40-50s) 15. Gronk arrival (50-55s) 16. Ana photo + determination (55-60s) ✅ REMOVED (Spoiler alert!): - Kai aging timeline (young→adult→elder) - Multiple Kai appearances - Aging dialogue ✅ KEPT: - Crossfade transitions - Polaroid frames - VHS effects - Subtitles RESULT: 60s can SEZUL players! 🎆💜 --- src/scenes/IntroScene.js | 175 +++++++++++++++++---------------------- 1 file changed, 78 insertions(+), 97 deletions(-) diff --git a/src/scenes/IntroScene.js b/src/scenes/IntroScene.js index 8d631f3d7..1c3b557e2 100644 --- a/src/scenes/IntroScene.js +++ b/src/scenes/IntroScene.js @@ -293,31 +293,35 @@ class IntroScene extends Phaser.Scene { } // ═══════════════════════════════════════════════════════════ - // PHASE 1: HAPPY CHILDHOOD (0-15s) + // PHASE 1: HAPPY MEMORIES (0-15s) - REDESIGNED! // ═══════════════════════════════════════════════════════════ playPhase1HappyChildhood() { - console.log('🎬 Phase 1: Happy Childhood (0-15s)'); + console.log('🎬 Phase 1: Happy Memories (0-15s) - NEW SEQUENCE'); this.currentPhase = 1; - // Shot 1 (0-3s): Family Portrait + Kai voice - this.showShot('intro_family_portrait', 0, 3000, { warm: true }); - this.time.delayedCall(200, () => this.playVoice('kai_01', "It all started with family. With colors. With hope.")); + // Shot 1 (0-2.5s): Kai + Dad Longboard + this.showShot('intro_otac_longboard', 0, 2500, { warm: true }); + this.time.delayedCall(100, () => this.playVoice('kai_01', "Dad and I. Before everything changed.")); - // Shot 2 (3-6s): Otac Longboard + Kai voice - this.showShot('intro_otac_longboard', 3000, 6000, { warm: true }); - this.time.delayedCall(3200, () => this.playVoice('kai_02', "Dad taught me that life isn't a straight line...")); + // Shot 2 (2.5-5s): Barbershop - Him (dreads) + Her (coloring) + this.showShot('intro_ana_barbershop', 2500, 5000, { warm: true }); + this.time.delayedCall(2600, () => this.playVoice('ana_01', "Getting ready. We always did things together.")); - // Shot 3 (6-9s): Kai Dreads + Ana voice - this.showShot('intro_kai_dreads', 6000, 9000, { warm: true }); - this.time.delayedCall(6200, () => this.playVoice('ana_01', "...but a wild ride with those you love.")); + // Shot 3 (5-7.5s): Birthday Cake - "HERE WE WERE STILL HAPPY" + this.showShot('intro_birthday_cake', 5000, 7500, { warm: true }); + this.time.delayedCall(5100, () => this.playVoice('kai_02', "Here we were still happy. Still a family.")); - // Shot 4 (9-12s): Ana Barbershop + Ana voice - this.showShot('intro_ana_barbershop', 9000, 12000, { warm: true }); - this.time.delayedCall(9200, () => this.playVoice('ana_02', "We were unstoppable. We were immortal.")); + // Shot 4 (7.5-10s): Family Portrait + this.showShot('intro_family_portrait', 7500, 10000, { warm: true }); + this.time.delayedCall(7600, () => this.playVoice('ana_02', "All of us. Together. Perfect.")); - // Shot 5 (12-15s): Birthday Cake + Both voices - this.showShot('intro_birthday_cake', 12000, 15000, { warm: true }); - this.time.delayedCall(12200, () => this.playVoice('kai_03', "We were... whole.")); + // Shot 5 (10-12.5s): Kai + Ana Holding Hands as Kids + this.showShot('intro_twins_childhood', 10000, 12500, { warm: true }); + this.time.delayedCall(10100, () => this.playVoice('kai_03', "We were always two. Inseparable.")); + + // Shot 6 (12.5-15s): Kai's Bedroom + this.showShot('intro_bedroom', 12500, 15000, { warm: true }); + this.time.delayedCall(12600, () => this.playVoice('ana_03', "Our room. Our sanctuary.")); // Transition to Phase 2 this.time.delayedCall(15000, () => this.playPhase2TheVirus()); @@ -330,110 +334,85 @@ class IntroScene extends Phaser.Scene { console.log('🎬 Phase 2: The Virus (15-30s)'); this.currentPhase = 2; - // Shot 6 (15-18s): Virus + Kai voice - this.showShot('intro_virus', 15000, 18000, { toxic: true, glitch: true }); - this.time.delayedCall(15200, () => this.playVoice('kai_04', "Then came X-Noir. The virus. Death in nanobytes.")); + // Shot 7 (15-17.5s): Virus + this.showShot('intro_virus', 15000, 17500, { toxic: true, glitch: true }); + this.time.delayedCall(15100, () => this.playVoice('kai_04', "Then came X-Noir. The virus.")); - // Shot 7 (18-21s): Chaos + Ana voice - this.showShot('intro_chaos', 18000, 21000, { red: true, glitch: true }); - this.time.delayedCall(18200, () => this.playVoice('ana_04', "Everyone changed. The streets burned.")); - this.cameras.main.shake(3000, 0.005); + // Shot 8 (17.5-20s): Chaos + this.showShot('intro_chaos', 17500, 20000, { red: true, glitch: true }); + this.time.delayedCall(17600, () => this.playVoice('ana_04', "Everyone changed. Streets burned.")); + this.cameras.main.shake(2500, 0.005); - // Shot 8 (21-24s): Zombies + Kai voice - this.showShot('intro_zombies', 21000, 24000, { red: true, strobe: true }); - this.time.delayedCall(21200, () => this.playVoice('kai_05', "Neighbors, friends... they all became zombies.")); + // Shot 9 (20-22.5s): Zombies + this.showShot('intro_zombies', 20000, 22500, { red: true, strobe: true }); + this.time.delayedCall(20100, () => this.playVoice('kai_05', "Friends became zombies.")); - // Shot 9 (24-27s): Parents Ghosts + Ana voice - this.showShot('intro_parents_ghosts', 24000, 27000, { fadeIn: true }); - this.time.delayedCall(24200, () => this.playVoice('ana_05', "Our parents fought. Our parents... left us.")); + // Shot 10 (22.5-25s): Parents Ghosts + this.showShot('intro_parents_ghosts', 22500, 25000, { fadeIn: true }); + this.time.delayedCall(22600, () => this.playVoice('ana_05', "Our parents fought... and lost.")); - // Shot 10 (27-30s): Ana Taken + Ana SCREAM - this.showShot('intro_ana_taken', 27000, 30000, { red: true, blur: true }); - this.time.delayedCall(27200, () => this.playVoice('ana_06', "KAI! DON'T FORGET ME!")); + // Shot 11 (25-30s): Ana Taken + this.showShot('intro_ana_taken', 25000, 30000, { red: true }); + this.time.delayedCall(25100, () => this.playVoice('ana_06', "KAI! DON'T FORGET ME!")); // Transition to Phase 3 this.time.delayedCall(30000, () => this.playPhase3TheAmnesia()); } // ═══════════════════════════════════════════════════════════ - // PHASE 3: THE AMNESIA (30-45s) + // PHASE 3: AMNESIA & ANA MEMORY (30-60s) - NO AGING SPOILERS! // ═══════════════════════════════════════════════════════════ playPhase3TheAmnesia() { - console.log('🎬 Phase 3: The Amnesia (30-45s)'); + console.log('🎬 Phase 3: Amnesia & Ana Memory (30-60s)'); this.currentPhase = 3; - // Shot 11 (30-33s): Kai Alone + Kai voice - this.showShot('intro_kai_alone', 30000, 33000, { fadeIn: true }); - this.time.delayedCall(30200, () => this.playVoice('kai_06', "I was left alone. In darkness. With a hole in my head.")); + // Shot 12 (30-35s): BLACK SCREEN - "I have no memory" + const width = this.cameras.main.width; + const height = this.cameras.main.height; - // Shot 12 (33-36s): Kai Young + Kai voice - this.showShot('intro_kai_young', 33000, 36000, { fadeIn: true }); - this.time.delayedCall(33200, () => this.playVoice('kai_07', "Years passed. My face changed...")); + const blackScreen = this.add.rectangle(width / 2, height / 2, width, height, 0x000000); + blackScreen.setAlpha(0); + blackScreen.setDepth(50); - // Shot 13 (36-39s): Kai Adult + Kai voice - this.showShot('intro_kai_adult', 36000, 39000, { fadeIn: true }); - this.time.delayedCall(36200, () => this.playVoice('kai_08', "...my beard grew... but my memories?")); + this.tweens.add({ + targets: blackScreen, + alpha: 1, + duration: 1000 + }); - // Shot 14 (39-42s): Kai Elder + Kai voice - this.showShot('intro_kai_elder', 39000, 42000, { fadeIn: true }); - this.time.delayedCall(39200, () => this.playVoice('kai_09', "All memory was fog. Except for one face.")); - - // Shot 15 (42-45s): Ana Memory + Ana voice (echo) - this.showShot('intro_ana_memory', 42000, 45000, { fadeIn: true }); - this.time.delayedCall(42200, () => this.playVoice('ana_07', "Ana... Sister... Twin... The truth.")); - - // Transition to Phase 4 - this.time.delayedCall(45000, () => this.playPhase4TheAwakening()); - } - - // ═══════════════════════════════════════════════════════════ - // PHASE 4: THE AWAKENING (45-60s) - // ═══════════════════════════════════════════════════════════ - playPhase4TheAwakening() { - console.log('🎬 Phase 4: The Awakening (45-60s)'); - this.currentPhase = 4; - - // Shot 16 (45-48s): Bedroom + Kai voice - this.showShot('intro_bedroom', 45000, 48000, { fadeIn: true }); - this.time.delayedCall(45200, () => this.playVoice('kai_10', "And now... I wake up. Again. Every single day.")); - - // Shot 17 (48-51s): Gronk + Gronk voice - this.showShot('intro_gronk', 48000, 51000, { fadeIn: true }); - this.time.delayedCall(48200, () => this.playVoice('gronk_01', "Finally awake, old man. Your mission awaits.")); - - // Shot 18 (51-54s): Ana Memory Reprise + Kai voice - this.showShot('intro_ana_memory', 51000, 54000, { fadeIn: true }); - this.time.delayedCall(51200, () => this.playVoice('kai_11', "I must find her.")); - - // Shot 19 (54-57s): Twins Childhood + Ana voice - this.showShot('intro_twins_childhood', 54000, 57000, { warm: true, fadeIn: true }); - this.time.delayedCall(54200, () => this.playVoice('ana_08', "We were always two...")); - - // Shot 20 (57-60s): Fade to Black + Kai FINAL - this.time.delayedCall(57000, () => { - this.playVoice('kai_12', "...even if it takes my entire life."); - - // Fade to black - const blackScreen = this.add.rectangle( - this.cameras.main.width / 2, - this.cameras.main.height / 2, - this.cameras.main.width, - this.cameras.main.height, - 0x000000 - ); - blackScreen.setAlpha(0); - blackScreen.setDepth(1000); + this.time.delayedCall(30500, () => this.playVoice('kai_06', "I have no memory. Everything is... gone.")); + this.time.delayedCall(33000, () => this.playVoice('kai_07', "They say I'm fourteen. But I don't remember... anything.")); + // Shot 13 (35-40s): Kai Alone in Basement + this.time.delayedCall(35000, () => { this.tweens.add({ targets: blackScreen, - alpha: 1, - duration: 3000 + alpha: 0, + duration: 1000, + onComplete: () => blackScreen.destroy() }); }); - // Transition to GameScene + this.showShot('intro_kai_alone', 35000, 40000, { fadeIn: true }); + this.time.delayedCall(35500, () => this.playVoice('kai_08', "Alone. In darkness. With only... this.")); + + // Shot 14 (40-50s): Ana Memory - LAST TIME THEY SAW EACH OTHER + this.showShot('intro_ana_memory', 40000, 50000, { fadeIn: true }); + this.time.delayedCall(40500, () => this.playVoice('ana_07', "Her face. The only thing I remember.")); + this.time.delayedCall(43500, () => this.playVoice('kai_09', "Ana. My sister. My twin. The last thing I saw... before everything went dark.")); + + // Shot 15 (50-55s): Gronk Arrival + this.showShot('intro_gronk', 50000, 55000, { fadeIn: true }); + this.time.delayedCall(50500, () => this.playVoice('gronk_01', "Finally awake, old man. Your mission awaits.")); + + // Shot 16 (55-60s): Ana Photo + FINAL DETERMINATION + this.showShot('intro_ana_memory', 55000, 60000, { fadeIn: true }); + this.time.delayedCall(55500, () => this.playVoice('kai_11', "I must find her.")); + this.time.delayedCall(57500, () => this.playVoice('kai_12', "...even if it takes my entire life.")); + + // Transition to Main Menu this.time.delayedCall(60000, () => { - console.log('🎬 IntroScene: EPIC COMPLETE! Starting game...'); + console.log('🎬 IntroScene: EPIC COMPLETE! Starting menu...'); if (this.ambientAudio) this.ambientAudio.stop(); this.cameras.main.fadeOut(1000, 0, 0, 0); this.cameras.main.once('camerafadeoutcomplete', () => { @@ -442,6 +421,8 @@ class IntroScene extends Phaser.Scene { }); } + // Phase 4 removed - integrated into Phase 3! + showShot(imageKey, startTime, endTime, options = {}) { const width = this.cameras.main.width; const height = this.cameras.main.height;