feat(epic-4): chemins narratifs, easter eggs, challenge et contact

Epic 4: Chemins Narratifs, Challenge & Contact

Stories implementees:
- 4.1: Composant ChoiceCards pour choix narratifs binaires
- 4.2: Sequence d'intro narrative avec Le Bug
- 4.3: Chemins narratifs differencies avec useNarrativePath
- 4.4: Table easter_eggs et systeme de detection (API + composable)
- 4.5: Easter eggs UI (popup, notification, collection)
- 4.6: Page challenge avec puzzle de code
- 4.7: Page revelation "Monde de Code"
- 4.8: Page contact avec formulaire et stats

Fichiers crees:
- Frontend: ChoiceCards, IntroSequence, ZoneEndChoice, EasterEggPopup,
  CodePuzzle, ChallengeSuccess, CodeWorld, et pages intro/challenge/revelation
- API: EasterEggController, Model, Migration, Seeder

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-08 13:35:12 +01:00
parent 64b1a33d10
commit 7e87a341a2
38 changed files with 3037 additions and 96 deletions

View File

@@ -23,6 +23,18 @@ class NarratorTextSeeder extends Seeder
['context' => 'intro', 'text_key' => 'narrator.intro.dev.1', 'variant' => 1, 'hero_type' => 'dev'],
['context' => 'intro', 'text_key' => 'narrator.intro.dev.2', 'variant' => 2, 'hero_type' => 'dev'],
// INTRO SEQUENCE 1 - Recruteur
['context' => 'intro_sequence_1', 'text_key' => 'narrator.intro_seq.1.recruteur', 'variant' => 1, 'hero_type' => 'recruteur'],
// INTRO SEQUENCE 1 - Client/Dev
['context' => 'intro_sequence_1', 'text_key' => 'narrator.intro_seq.1.casual', 'variant' => 1, 'hero_type' => 'client'],
['context' => 'intro_sequence_1', 'text_key' => 'narrator.intro_seq.1.casual', 'variant' => 1, 'hero_type' => 'dev'],
// INTRO SEQUENCE 2 - Tous
['context' => 'intro_sequence_2', 'text_key' => 'narrator.intro_seq.2', 'variant' => 1, 'hero_type' => null],
// INTRO SEQUENCE 3 - Tous
['context' => 'intro_sequence_3', 'text_key' => 'narrator.intro_seq.3', 'variant' => 1, 'hero_type' => null],
// TRANSITIONS
['context' => 'transition_projects', 'text_key' => 'narrator.transition.projects.1', 'variant' => 1, 'hero_type' => null],
['context' => 'transition_projects', 'text_key' => 'narrator.transition.projects.2', 'variant' => 2, 'hero_type' => null],
@@ -214,6 +226,31 @@ class NarratorTextSeeder extends Seeder
'fr' => "Tiens, un visage familier ! Content de te revoir, voyageur.",
'en' => "Well, a familiar face! Good to see you again, traveler.",
],
// Intro Sequence 1 - Recruteur
[
'key' => 'narrator.intro_seq.1.recruteur',
'fr' => "Bienvenue dans mon domaine, voyageur... Je suis Le Bug, et je vais vous guider dans cette aventure.",
'en' => "Welcome to my domain, traveler... I am The Bug, and I will guide you through this adventure.",
],
// Intro Sequence 1 - Casual
[
'key' => 'narrator.intro_seq.1.casual',
'fr' => "Hey ! Bienvenue chez moi. Je suis Le Bug, ton guide pour cette aventure.",
'en' => "Hey! Welcome to my place. I'm The Bug, your guide for this adventure.",
],
// Intro Sequence 2
[
'key' => 'narrator.intro_seq.2',
'fr' => "Il y a quelqu'un ici que tu cherches... Un développeur mystérieux qui a créé tout ce que tu vois autour de toi.",
'en' => "There's someone here you're looking for... A mysterious developer who created everything you see around you.",
],
// Intro Sequence 3
[
'key' => 'narrator.intro_seq.3',
'fr' => "Pour le trouver, tu devras explorer ce monde. Chaque zone cache une partie de son histoire. Es-tu prêt ?",
'en' => "To find them, you'll have to explore this world. Each zone hides a part of their story. Are you ready?",
],
];
foreach ($translations as $t) {