- Implement `remove-inline-scripts.js` to externalize Next.js inline scripts, enhancing CSP compliance. - Add models for `Book`, `Character`, `Story`, `Editor`, `System`, and `BookSerie` with relevant properties and utilities. - Include macOS entitlements plist for app development with advanced permissions. - Add utility functions to handle script hashing, cookie management, and content formatting.
1117 lines
40 KiB
TypeScript
Executable File
1117 lines
40 KiB
TypeScript
Executable File
import {ChapterListProps} from "./Chapter";
|
||
import {Act, Issue} from "@/lib/models/Book";
|
||
import {RadioBoxValue} from "@/components/form/RadioBox";
|
||
import {Dispatch, SetStateAction} from "react";
|
||
import {SelectBoxProps} from "@/shared/interface";
|
||
|
||
export interface StoryProps {
|
||
mainChapter: ChapterListProps[],
|
||
acts: Act[],
|
||
issues: Issue[]
|
||
}
|
||
|
||
export interface VerbalTimeProps {
|
||
actions: string;
|
||
descriptions: string;
|
||
dialogues: string;
|
||
thoughts: string;
|
||
summary: string;
|
||
}
|
||
|
||
export interface DialogueProps {
|
||
description: string;
|
||
example: string;
|
||
}
|
||
|
||
export interface GeneratedShortStory {
|
||
title: string;
|
||
short: string;
|
||
resume: string;
|
||
totalPrice: number;
|
||
totalTokens: number;
|
||
}
|
||
|
||
export const storyStates: RadioBoxValue[] = [
|
||
{label: 'Suite', value: 0},
|
||
{label: 'Début', value: 1},
|
||
{label: 'Fin', value: 2},
|
||
{label: 'Introduction', value: 3},
|
||
{label: 'Final', value: 4},
|
||
];
|
||
|
||
export const beginnerPredefinedType: SelectBoxProps[] = [
|
||
{
|
||
label: `Thème défini disponible.`,
|
||
value: '0',
|
||
},
|
||
{
|
||
label: `Féerique`,
|
||
value: '3',
|
||
},
|
||
{
|
||
label: 'Romance historique',
|
||
value: '10',
|
||
},
|
||
{
|
||
label: 'Conte de fées moderne',
|
||
value: '13',
|
||
},
|
||
{
|
||
label: 'Romance contemporaine',
|
||
value: '17',
|
||
},
|
||
{
|
||
label: 'Conte moral',
|
||
value: '20',
|
||
},
|
||
];
|
||
export const intermediatePredefinedType: SelectBoxProps[] = [
|
||
{
|
||
label: `Thème défini disponible.`,
|
||
value: '0',
|
||
},
|
||
{
|
||
label: `Histoire d'horreur jeune adulte`,
|
||
value: '1',
|
||
},
|
||
{
|
||
label: 'Féerique',
|
||
value: '3',
|
||
},
|
||
{
|
||
label: 'Romance dramatique',
|
||
value: '5',
|
||
},
|
||
{
|
||
label: 'Fantastique sombre',
|
||
value: '9',
|
||
},
|
||
{
|
||
label: 'Romance historique',
|
||
value: '10',
|
||
},
|
||
{
|
||
label: 'Science-fiction utopique',
|
||
value: '12',
|
||
},
|
||
{
|
||
label: 'Conte de fées moderne',
|
||
value: '13',
|
||
},
|
||
{
|
||
label: 'Drame familial',
|
||
value: '14',
|
||
},
|
||
{
|
||
label: 'Romance contemporaine',
|
||
value: '17',
|
||
},
|
||
{
|
||
label: 'Science-fiction post-apocalyptique',
|
||
value: '19',
|
||
},
|
||
{
|
||
label: 'Conte moral',
|
||
value: '20',
|
||
},
|
||
];
|
||
|
||
export const advancedPredefinedType: SelectBoxProps[] = [
|
||
{
|
||
label: `Thème défini disponible.`,
|
||
value: '0',
|
||
},
|
||
{
|
||
label: `Histoire d'horreur jeune adulte`,
|
||
value: '1',
|
||
},
|
||
{
|
||
label: `Horreur adulte`,
|
||
value: '2',
|
||
},
|
||
{
|
||
label: 'Féerique',
|
||
value: '3',
|
||
},
|
||
{
|
||
label: 'Science-fiction dystopique',
|
||
value: '4',
|
||
},
|
||
{
|
||
label: 'Romance dramatique',
|
||
value: '5',
|
||
},
|
||
{
|
||
label: 'Aventure épique',
|
||
value: '6',
|
||
},
|
||
{
|
||
label: 'Conte philosophique',
|
||
value: '7',
|
||
},
|
||
{
|
||
label: 'Thriller psychologique',
|
||
value: '8',
|
||
},
|
||
{
|
||
label: 'Fantastique sombre',
|
||
value: '9',
|
||
},
|
||
{
|
||
label: 'Romance historique',
|
||
value: '10',
|
||
},
|
||
{
|
||
label: 'Polar noir',
|
||
value: '11',
|
||
},
|
||
{
|
||
label: 'Science-fiction utopique',
|
||
value: '12',
|
||
},
|
||
{
|
||
label: 'Conte de fées moderne',
|
||
value: '13',
|
||
},
|
||
{
|
||
label: 'Drame familial',
|
||
value: '14',
|
||
},
|
||
{
|
||
label: 'Aventure maritime',
|
||
value: '15',
|
||
},
|
||
{
|
||
label: 'Fantaisie épique',
|
||
value: '16',
|
||
},
|
||
{
|
||
label: 'Romance contemporaine',
|
||
value: '17',
|
||
},
|
||
{
|
||
label: "Thriller d'espionnage",
|
||
value: '18',
|
||
},
|
||
{
|
||
label: 'Science-fiction post-apocalyptique',
|
||
value: '19',
|
||
},
|
||
{
|
||
label: 'Conte moral',
|
||
value: '20',
|
||
},
|
||
];
|
||
|
||
// Débutant (Level 1)
|
||
export const beginnerNarrativePersons: SelectBoxProps[] = [
|
||
{
|
||
label: 'Sélectionner un type narrative.',
|
||
value: '0',
|
||
},
|
||
{
|
||
label: 'Première personne (Je acteur) - Implication émotionnelle',
|
||
value: '1',
|
||
},
|
||
{
|
||
label: 'Troisième omnisciente - Narration divine, savoir total',
|
||
value: '3',
|
||
},
|
||
];
|
||
|
||
// Intermédiaire (Level 2)
|
||
export const intermediateNarrativePersons: SelectBoxProps[] = [
|
||
{
|
||
label: 'Sélectionner un type narrative.',
|
||
value: '0',
|
||
},
|
||
{
|
||
label: 'Première personne (Je acteur) - Implication émotionnelle',
|
||
value: '1',
|
||
},
|
||
{
|
||
label: 'Première personne (Je témoin) - Observation extérieure',
|
||
value: '2',
|
||
},
|
||
{
|
||
label: 'Troisième omnisciente - Narration divine, savoir total',
|
||
value: '3',
|
||
},
|
||
{
|
||
label: 'Troisième limitée - Focus sur 1 personnage',
|
||
value: '4',
|
||
},
|
||
];
|
||
|
||
// Avancé (Level 3)
|
||
export const advancedNarrativePersons: SelectBoxProps[] = [
|
||
{
|
||
label: 'Sélectionner un type narrative.',
|
||
value: '0',
|
||
},
|
||
{
|
||
label: 'Première personne (Je acteur) - Implication émotionnelle',
|
||
value: '1',
|
||
},
|
||
{
|
||
label: 'Première personne (Je témoin) - Observation extérieure',
|
||
value: '2',
|
||
},
|
||
{
|
||
label: 'Troisième omnisciente - Narration divine, savoir total',
|
||
value: '3',
|
||
},
|
||
{
|
||
label: 'Troisième limitée - Focus sur 1 personnage',
|
||
value: '4',
|
||
},
|
||
{
|
||
label: 'Deuxième personne (Tu) - Immersion/confrontation',
|
||
value: '5',
|
||
},
|
||
{
|
||
label: 'Nous collectif - Voix chorale, destin partagé',
|
||
value: '6',
|
||
},
|
||
];
|
||
|
||
export const langues: SelectBoxProps[] = [
|
||
{label: 'Sélectionner une langue.', value: '0'},
|
||
{label: 'Français Canada', value: '1'},
|
||
{label: 'Français France', value: '2'},
|
||
{label: 'Français Québécois', value: '3'},
|
||
{label: 'English Canada', value: '4'},
|
||
];
|
||
|
||
// Débutant (Level 1)
|
||
export const beginnerDialogueTypes: SelectBoxProps[] = [
|
||
{
|
||
label: 'Sélectionner un type de dialogue.',
|
||
value: '0',
|
||
},
|
||
{
|
||
label: 'Dialogue direct - Paroles exactes des personnages',
|
||
value: '1',
|
||
},
|
||
{
|
||
label: 'Dialogue indirect - Paroles résumées par le narrateur',
|
||
value: '2',
|
||
},
|
||
];
|
||
|
||
// Intermédiaire (Level 2)
|
||
export const intermediateDialogueTypes: SelectBoxProps[] = [
|
||
{
|
||
label: 'Sélectionner un type de dialogue.',
|
||
value: '0',
|
||
},
|
||
{
|
||
label: 'Dialogue direct - Paroles exactes des personnages',
|
||
value: '1',
|
||
},
|
||
{
|
||
label: 'Dialogue indirect - Paroles résumées par le narrateur',
|
||
value: '2',
|
||
},
|
||
{
|
||
label: 'Dialogue mixte - Mélange de dialogue direct et indirect',
|
||
value: '3',
|
||
},
|
||
];
|
||
|
||
// Avancé (Level 3)
|
||
export const advancedDialogueTypes: SelectBoxProps[] = [
|
||
{
|
||
label: 'Sélectionner un type de dialogue.',
|
||
value: '0',
|
||
},
|
||
{
|
||
label: 'Dialogue direct - Paroles exactes des personnages',
|
||
value: '1',
|
||
},
|
||
{
|
||
label: 'Dialogue indirect - Paroles résumées par le narrateur',
|
||
value: '2',
|
||
},
|
||
{
|
||
label: 'Dialogue mixte - Mélange de dialogue direct et indirect',
|
||
value: '3',
|
||
},
|
||
{
|
||
label: 'Monologue intérieur - Interaction avec soi-même',
|
||
value: '4',
|
||
},
|
||
];
|
||
|
||
export const verbalTime: SelectBoxProps[] = [
|
||
{
|
||
label: 'Sélectionner un temps verbal.',
|
||
value: '0',
|
||
},
|
||
{
|
||
label: 'Passé Simple',
|
||
value: '1',
|
||
},
|
||
{
|
||
label: 'Passé Immédiat → Témoignages, récits autobiographiques',
|
||
value: '2',
|
||
},
|
||
{label: 'Passé Profond → Flashbacks littéraires, tragédies', value: '3'},
|
||
{label: 'Présent Brut → Urgence, immersion totale', value: '4'},
|
||
{label: 'Présent Réflexif → Méditations philosophiques', value: '5'},
|
||
{label: 'Futur Projeté → Prophéties, plans stratégiques', value: '6'},
|
||
{
|
||
label: 'Futur Catastrophe → Dystopies, récits post-apocalyptiques',
|
||
value: '7',
|
||
},
|
||
{label: 'Imparfait Onirique → Rêves, souvenirs déformés', value: '8'},
|
||
{
|
||
label: 'Conditionnel Hypothétique → Uchronies, réalités alternatives',
|
||
value: '9',
|
||
},
|
||
{
|
||
label: 'Subjonctif Angoissé → Drames psychologiques, dilemmes',
|
||
value: '10',
|
||
},
|
||
{
|
||
label: 'Mélancolie Composée → Regrets, introspection nostalgique',
|
||
value: '11',
|
||
},
|
||
{label: 'Urgence Narrative → Urgences', value: '12'},
|
||
{label: 'Présent Émotionnel → Émotions intenses', value: '13'},
|
||
{
|
||
label: 'Présent Introspectif → Réflexions profondes',
|
||
value: '14',
|
||
},
|
||
{
|
||
label: 'Présent Historique → Histoires historiques',
|
||
value: '15',
|
||
},
|
||
{
|
||
label: 'Passé Réflexif → Récits introspectifs',
|
||
value: '16',
|
||
},
|
||
{
|
||
label: 'Futur Prophétique → Prophéties, visions apocalyptiques',
|
||
value: '17',
|
||
},
|
||
{
|
||
label: 'Conditionnel Visionnaire → Mondes parallèles',
|
||
value: '18',
|
||
},
|
||
{
|
||
label: 'Imparfait Poétique → Lyrisme, poésie narrative',
|
||
value: '19',
|
||
},
|
||
{
|
||
label: 'Second Person Narrative → Immersion totale',
|
||
value: '20',
|
||
},
|
||
];
|
||
|
||
export default class Story {
|
||
constructor() {
|
||
}
|
||
|
||
static getVerbesStyle(
|
||
verbalTimeValue: number,
|
||
level: number,
|
||
): VerbalTimeProps {
|
||
switch (verbalTimeValue) {
|
||
case 1: // Passé Simple
|
||
return {
|
||
actions: level === 1 ? 'Passé composé' : 'Passé simple',
|
||
descriptions: 'Imparfait',
|
||
dialogues: 'Passé composé',
|
||
thoughts: level === 3 ? 'Subjonctif imparfait' : 'Plus-que-parfait',
|
||
summary: '→ Narrations épurées, style classique',
|
||
};
|
||
|
||
case 2: // Passé Immédiat
|
||
return {
|
||
actions: 'Passé composé',
|
||
descriptions:
|
||
level === 1
|
||
? 'Imparfait'
|
||
: level === 2
|
||
? 'Imparfait + infinitifs'
|
||
: 'Conditionnel présent',
|
||
dialogues:
|
||
level === 1
|
||
? 'Présent'
|
||
: level === 2
|
||
? 'Présent + impératif'
|
||
: 'Impératif',
|
||
thoughts:
|
||
level === 1
|
||
? 'Futur proche'
|
||
: level === 2
|
||
? 'Conditionnel présent'
|
||
: 'Subjonctif présent',
|
||
summary: '→ Témoignages, récits autobiographiques',
|
||
};
|
||
|
||
case 3: // Passé Profond
|
||
return {
|
||
actions: level === 1 ? 'Plus-que-parfait' : 'Passé antérieur',
|
||
descriptions:
|
||
level === 1
|
||
? 'Imparfait'
|
||
: level === 2
|
||
? 'Plus-que-parfait'
|
||
: 'Conditionnel passé',
|
||
dialogues: level === 3 ? 'Passé antérieur' : 'Passé simple', // <--- CORRIGÉ
|
||
thoughts: level === 1 ? 'Plus-que-parfait' : 'Subjonctif imparfait',
|
||
summary: '→ Flashbacks littéraires, tragédies',
|
||
};
|
||
|
||
case 4: // Présent Brut
|
||
return {
|
||
actions:
|
||
level === 1
|
||
? 'Présent simple'
|
||
: level === 2
|
||
? 'Présent'
|
||
: 'Présent + participe présent',
|
||
descriptions:
|
||
level === 1
|
||
? 'Participe présent'
|
||
: level === 2
|
||
? 'Participe présent + infinitifs'
|
||
: 'Participes présents enchaînés',
|
||
dialogues:
|
||
level === 1
|
||
? 'Présent'
|
||
: level === 2
|
||
? 'Impératif'
|
||
: 'Impératif + infinitifs',
|
||
thoughts:
|
||
level === 1
|
||
? 'Futur proche'
|
||
: level === 2
|
||
? 'Futur simple'
|
||
: 'Futur antérieur',
|
||
summary: '→ Urgence, immersion totale',
|
||
};
|
||
|
||
case 5: // Présent Réflexif
|
||
return {
|
||
actions: 'Présent',
|
||
descriptions:
|
||
level === 1
|
||
? 'Gérondif'
|
||
: level === 2
|
||
? 'Gérondif + infinitifs'
|
||
: 'Gérondif + conditionnel',
|
||
dialogues:
|
||
level === 1
|
||
? 'Présent'
|
||
: level === 2
|
||
? 'Conditionnel présent'
|
||
: 'Infinitif',
|
||
thoughts: level === 1 ? 'Infinitif' : 'Infinitif passé',
|
||
summary: '→ Méditations philosophiques',
|
||
};
|
||
|
||
case 13: // Présent Émotionnel
|
||
return {
|
||
actions:
|
||
level === 1
|
||
? 'Présent simple'
|
||
: level === 2
|
||
? 'Présent + participe présent'
|
||
: 'Participes présents enchaînés',
|
||
descriptions:
|
||
level === 1
|
||
? 'Imparfait'
|
||
: level === 2
|
||
? 'Participe présent + adjectifs'
|
||
: 'Subjonctif présent',
|
||
dialogues:
|
||
level === 1
|
||
? 'Présent'
|
||
: level === 2
|
||
? 'Conditionnel présent'
|
||
: 'Subjonctif présent',
|
||
thoughts:
|
||
level === 1
|
||
? 'Infinitif'
|
||
: level === 2
|
||
? 'Infinitif passé'
|
||
: 'Subjonctif imparfait',
|
||
summary:
|
||
'→ Émotions intenses, introspections vives (romances, drames psychologiques)',
|
||
};
|
||
|
||
case 14: // Présent Introspectif
|
||
return {
|
||
actions: 'Présent',
|
||
descriptions:
|
||
level === 1
|
||
? 'Gérondif'
|
||
: level === 2
|
||
? 'Gérondif + infinitifs'
|
||
: 'Conditionnel présent',
|
||
dialogues:
|
||
level === 1 ? 'Présent' : level === 2 ? 'Impératif' : 'Infinitif',
|
||
thoughts:
|
||
level === 1
|
||
? 'Infinitif'
|
||
: level === 2
|
||
? 'Infinitif passé'
|
||
: 'Subjonctif imparfait',
|
||
summary:
|
||
'→ Réflexions profondes, analyse des émotions (nouvelles philosophiques, récits introspectifs)',
|
||
};
|
||
|
||
case 15: // Présent Historique
|
||
return {
|
||
actions:
|
||
level === 1
|
||
? 'Présent simple'
|
||
: level === 2
|
||
? 'Présent + passé simple'
|
||
: 'Présent + passé antérieur',
|
||
descriptions:
|
||
level === 1
|
||
? 'Imparfait'
|
||
: level === 2
|
||
? 'Passé composé'
|
||
: 'Conditionnel passé',
|
||
dialogues:
|
||
level === 1
|
||
? 'Présent'
|
||
: level === 2
|
||
? 'Passé simple'
|
||
: 'Futur antérieur',
|
||
thoughts:
|
||
level === 1
|
||
? 'Infinitif'
|
||
: level === 2
|
||
? 'Plus-que-parfait'
|
||
: 'Subjonctif imparfait',
|
||
summary:
|
||
'→ Histoires historiques avec une intensité immédiate (batailles, moments décisifs)',
|
||
};
|
||
|
||
case 6: // Futur Projeté
|
||
return {
|
||
actions: level === 1 ? 'Futur simple' : 'Futur antérieur',
|
||
descriptions:
|
||
level === 1
|
||
? 'Futur proche'
|
||
: level === 2
|
||
? 'Futur antérieur'
|
||
: 'Futur antérieur',
|
||
dialogues: level === 1 ? 'Futur simple' : 'Futur proche',
|
||
thoughts: level === 1 ? 'Futur proche' : 'Futur antérieur',
|
||
summary: '→ Prophéties, plans stratégiques',
|
||
};
|
||
|
||
case 7: // Futur Catastrophe
|
||
return {
|
||
actions: level === 1 ? 'Futur simple' : 'Futur antérieur',
|
||
descriptions:
|
||
level === 1
|
||
? 'Futur proche'
|
||
: level === 2
|
||
? 'Futur simple + conditionnel'
|
||
: 'Conditionnel passé',
|
||
dialogues:
|
||
level === 1
|
||
? 'Futur proche'
|
||
: level === 2
|
||
? 'Futur antérieur'
|
||
: 'Futur simple',
|
||
thoughts:
|
||
level === 1
|
||
? 'Futur simple'
|
||
: level === 2
|
||
? 'Conditionnel passé'
|
||
: 'Futur antérieur',
|
||
summary: '→ Dystopies, récits post-apocalyptiques',
|
||
};
|
||
|
||
case 8: // Imparfait Onirique
|
||
return {
|
||
actions: 'Imparfait',
|
||
descriptions:
|
||
level === 1
|
||
? 'Imparfait'
|
||
: level === 2
|
||
? 'Conditionnel présent'
|
||
: 'Conditionnel passé',
|
||
dialogues:
|
||
level === 1 ? 'Présent' : level === 2 ? 'Infinitif' : 'Infinitifs',
|
||
thoughts:
|
||
level === 1
|
||
? 'Subjonctif présent'
|
||
: level === 2
|
||
? 'Subjonctif imparfait'
|
||
: 'Subjonctif imparfait',
|
||
summary: '→ Rêves, souvenirs déformés',
|
||
};
|
||
|
||
case 9: // Conditionnel Hypothétique
|
||
return {
|
||
actions: 'Conditionnel présent',
|
||
descriptions: 'Conditionnel passé',
|
||
dialogues:
|
||
level === 1 ? 'Subjonctif imparfait' : 'Subjonctif imparfait', // <--- MÊME POUR TOUTES LES NIVEAUX
|
||
thoughts: level === 3 ? 'Subjonctif imparfait' : 'Plus-que-parfait', // <--- AJOUTÉ
|
||
summary: '→ Uchronies, réalités alternatives',
|
||
};
|
||
|
||
case 10: // Subjonctif Angoissé
|
||
return {
|
||
actions: level === 1 ? 'Subjonctif présent' : 'Subjonctif imparfait',
|
||
descriptions:
|
||
level === 1 ? 'Subjonctif présent' : 'Subjonctif imparfait',
|
||
dialogues: 'Impératif',
|
||
thoughts: level === 3 ? 'Subjonctif imparfait' : 'Conditionnel passé', // <--- AJOUTÉ
|
||
summary: '→ Drames psychologiques, dilemmes',
|
||
};
|
||
|
||
case 11: // Mélancolie Composée
|
||
return {
|
||
actions: 'Passé composé',
|
||
descriptions: 'Imparfait',
|
||
dialogues: 'Plus-que-parfait',
|
||
thoughts: 'Infinitif passé',
|
||
summary: '→ Regrets, introspection nostalgique',
|
||
};
|
||
|
||
case 12: // Urgence Narrative
|
||
return {
|
||
actions: 'Présent',
|
||
descriptions:
|
||
level === 1 ? 'Passé composé' : 'Passé composé + futur antérieur', // <--- AJOUTÉ
|
||
dialogues: level === 1 ? 'Futur proche' : 'Futur antérieur',
|
||
thoughts: 'Participe présent',
|
||
summary: '→ Crise en cours, compte à rebours',
|
||
};
|
||
|
||
case 16: // Passé Réflexif
|
||
return {
|
||
actions:
|
||
level === 1
|
||
? 'Passé composé'
|
||
: level === 2
|
||
? 'Imparfait + passé simple'
|
||
: 'Plus-que-parfait',
|
||
descriptions:
|
||
level === 1
|
||
? 'Imparfait'
|
||
: level === 2
|
||
? 'Participe passé'
|
||
: 'Conditionnel passé',
|
||
dialogues:
|
||
level === 1
|
||
? 'Présent'
|
||
: level === 2
|
||
? 'Imparfait'
|
||
: 'Subjonctif imparfait',
|
||
thoughts:
|
||
level === 1
|
||
? 'Infinitif'
|
||
: level === 2
|
||
? 'Infinitif passé'
|
||
: 'Subjonctif présent',
|
||
summary:
|
||
'→ Récits introspectifs, auto-analyse (autofictions, récits de croissance personnelle)',
|
||
};
|
||
|
||
case 17: // Futur Prophétique
|
||
return {
|
||
actions:
|
||
level === 1
|
||
? 'Futur simple'
|
||
: level === 2
|
||
? 'Futur antérieur'
|
||
: 'Conditionnel passé',
|
||
descriptions:
|
||
level === 1
|
||
? 'Futur proche'
|
||
: level === 2
|
||
? 'Futur antérieur'
|
||
: 'Conditionnel présent',
|
||
dialogues:
|
||
level === 1
|
||
? 'Futur simple'
|
||
: level === 2
|
||
? 'Futur antérieur'
|
||
: 'Subjonctif présent',
|
||
thoughts:
|
||
level === 1
|
||
? 'Infinitif'
|
||
: level === 2
|
||
? 'Futur antérieur'
|
||
: 'Conditionnel passé',
|
||
summary:
|
||
'→ Prophéties, visions apocalyptiques (récits mystiques, romans de science-fiction)',
|
||
};
|
||
|
||
case 18: // Conditionnel Visionnaire
|
||
return {
|
||
actions:
|
||
level === 1
|
||
? 'Conditionnel présent'
|
||
: level === 2
|
||
? 'Conditionnel passé'
|
||
: 'Subjonctif imparfait',
|
||
descriptions:
|
||
level === 1
|
||
? 'Conditionnel présent'
|
||
: level === 2
|
||
? 'Conditionnel passé'
|
||
: 'Subjonctif présent',
|
||
dialogues:
|
||
level === 1
|
||
? 'Conditionnel présent'
|
||
: level === 2
|
||
? 'Subjonctif imparfait'
|
||
: 'Impératif',
|
||
thoughts:
|
||
level === 1
|
||
? 'Infinitif'
|
||
: level === 2
|
||
? 'Infinitif passé'
|
||
: 'Subjonctif imparfait',
|
||
summary:
|
||
'→ Mondes parallèles, uchronies (romans alternatifs, récits de fantasy)',
|
||
};
|
||
|
||
case 19: // Imparfait Poétique
|
||
return {
|
||
actions:
|
||
level === 1
|
||
? 'Imparfait'
|
||
: level === 2
|
||
? 'Imparfait + participe présent'
|
||
: 'Participes présents enchaînés',
|
||
descriptions:
|
||
level === 1
|
||
? 'Imparfait'
|
||
: level === 2
|
||
? 'Participe présent + adjectifs'
|
||
: 'Subjonctif présent',
|
||
dialogues:
|
||
level === 1
|
||
? 'Présent'
|
||
: level === 2
|
||
? 'Imparfait'
|
||
: 'Subjonctif imparfait',
|
||
thoughts:
|
||
level === 1
|
||
? 'Infinitif'
|
||
: level === 2
|
||
? 'Infinitif passé'
|
||
: 'Subjonctif présent',
|
||
summary:
|
||
'→ Lyrisme, poésie narrative (récits oniriques, nouvelles littéraires)',
|
||
};
|
||
|
||
case 20: // Second Person Narrative
|
||
return {
|
||
actions:
|
||
level === 1
|
||
? 'Présent simple'
|
||
: level === 2
|
||
? 'Imparfait'
|
||
: 'Futur simple',
|
||
descriptions:
|
||
level === 1
|
||
? 'Imparfait'
|
||
: level === 2
|
||
? 'Participe présent'
|
||
: 'Conditionnel présent',
|
||
dialogues:
|
||
level === 1
|
||
? 'Présent'
|
||
: level === 2
|
||
? 'Imparfait'
|
||
: 'Futur proche',
|
||
thoughts:
|
||
level === 1
|
||
? 'Infinitif'
|
||
: level === 2
|
||
? 'Plus-que-parfait'
|
||
: 'Subjonctif présent',
|
||
summary:
|
||
'→ Immersion totale (récits interactifs, jeux de rôle, romans à choix multiples)',
|
||
};
|
||
|
||
default:
|
||
return {
|
||
actions: 'Passé simple',
|
||
descriptions: 'Imparfait',
|
||
dialogues: 'Passé composé',
|
||
thoughts: 'Plus-que-parfait',
|
||
summary: '→ Narrations épurées, style classique',
|
||
};
|
||
}
|
||
}
|
||
|
||
static presetStoryType(
|
||
presetType: string,
|
||
setTone: Dispatch<SetStateAction<string>>,
|
||
setAtmosphere: Dispatch<SetStateAction<string>>,
|
||
setVerbTense: Dispatch<SetStateAction<string>>,
|
||
setPerson: Dispatch<SetStateAction<string>>,
|
||
setDialogueType: Dispatch<SetStateAction<string>>,
|
||
setIsExplicit: Dispatch<SetStateAction<boolean>>,
|
||
): void {
|
||
switch (presetType) {
|
||
case '1':
|
||
setTone('Suspense angoissant, mystère troublant');
|
||
setAtmosphere('Tension oppressante, ombres menaçantes');
|
||
setVerbTense('3');
|
||
setPerson('1');
|
||
setDialogueType('3');
|
||
setIsExplicit(false);
|
||
break;
|
||
case '2':
|
||
setTone('Brutalité crue, terreur psychologique');
|
||
setAtmosphere('Claustrophobie, clair-obscur sinistre');
|
||
setVerbTense('10');
|
||
setPerson('4');
|
||
setDialogueType('4');
|
||
setIsExplicit(true);
|
||
break;
|
||
case '3':
|
||
setTone('Magie envoûtante, innocence poétique');
|
||
setAtmosphere('Forêt luminescente, brume enchantée');
|
||
setVerbTense('19');
|
||
setPerson('3');
|
||
setDialogueType('1');
|
||
setIsExplicit(false);
|
||
break;
|
||
case '4':
|
||
setTone('Froidure technologique, désespoir systémique');
|
||
setAtmosphere('Métal rouillé, lumières néon vacillantes');
|
||
setVerbTense('7');
|
||
setPerson('5');
|
||
setDialogueType('3');
|
||
setIsExplicit(false);
|
||
break;
|
||
case '5':
|
||
setTone('Passion tourmentée, mélancolie sensuelle');
|
||
setAtmosphere('Pluie fine, chambres aux rideaux lourds');
|
||
setVerbTense('13');
|
||
setPerson('1');
|
||
setDialogueType('1');
|
||
setIsExplicit(true);
|
||
break;
|
||
case '6':
|
||
setTone('Héroïsme grandiose, dangers exaltants');
|
||
setAtmosphere('Vastes paysages, ruines anciennes');
|
||
setVerbTense('4');
|
||
setPerson('6');
|
||
setDialogueType('3');
|
||
setIsExplicit(false);
|
||
break;
|
||
case '7':
|
||
setTone('Méditation existentielle, questions sans réponses');
|
||
setAtmosphere('Bibliothèque poussiéreuse, nuit silencieuse');
|
||
setVerbTense('5');
|
||
setPerson('5');
|
||
setDialogueType('4');
|
||
setIsExplicit(true);
|
||
break;
|
||
case '8':
|
||
setTone('Tension psychologique, suspense mental');
|
||
setAtmosphere('Isolation, paranoïa croissante');
|
||
setVerbTense('10');
|
||
setPerson('4');
|
||
setDialogueType('4');
|
||
setIsExplicit(true);
|
||
break;
|
||
case '9':
|
||
setTone('Mystère obscur, surnaturel inquiétant');
|
||
setAtmosphere('Forêts sombres, créatures cachées');
|
||
setVerbTense('3');
|
||
setPerson('1');
|
||
setDialogueType('3');
|
||
setIsExplicit(false);
|
||
break;
|
||
case '10':
|
||
setTone('Amour interdit, passion à travers les âges');
|
||
setAtmosphere('Châteaux majestueux, bals somptueux');
|
||
setVerbTense('1');
|
||
setPerson('3');
|
||
setDialogueType('1');
|
||
setIsExplicit(true);
|
||
break;
|
||
case '11':
|
||
setTone('Dure réalité, enquête sombre');
|
||
setAtmosphere('Rues sombres, ambiance de crime');
|
||
setVerbTense('16');
|
||
setPerson('5');
|
||
setDialogueType('4');
|
||
setIsExplicit(true);
|
||
break;
|
||
case '12':
|
||
setTone('Espoir futuriste, société idéale');
|
||
setAtmosphere('Villes lumineuses, technologie avancée');
|
||
setVerbTense('6');
|
||
setPerson('4');
|
||
setDialogueType('3');
|
||
setIsExplicit(false);
|
||
break;
|
||
case '13':
|
||
setTone('Magie contemporaine, réalisme enchanté');
|
||
setAtmosphere('Ville moderne, éléments féeriques');
|
||
setVerbTense('4');
|
||
setPerson('1');
|
||
setDialogueType('1');
|
||
setIsExplicit(true);
|
||
break;
|
||
case '14':
|
||
setTone('Conflits émotionnels, relations complexes');
|
||
setAtmosphere('Intérieur chaleureux, tensions sous-jacentes');
|
||
setVerbTense('13');
|
||
setPerson('1');
|
||
setDialogueType('1');
|
||
setIsExplicit(true);
|
||
break;
|
||
case '15':
|
||
setTone('Exploration audacieuse, dangers marins');
|
||
setAtmosphere('Océan infini, navires anciens');
|
||
setVerbTense('4');
|
||
setPerson('6');
|
||
setDialogueType('3');
|
||
setIsExplicit(false);
|
||
break;
|
||
case '16':
|
||
setTone('Quête héroïque, magie puissante');
|
||
setAtmosphere('Mondes imaginaires, créatures mythiques');
|
||
setVerbTense('19');
|
||
setPerson('3');
|
||
setDialogueType('1');
|
||
setIsExplicit(true);
|
||
break;
|
||
case '17':
|
||
setTone('Amour moderne, relations actuelles');
|
||
setAtmosphere('Ville animée, cafés cosy');
|
||
setVerbTense('13');
|
||
setPerson('1');
|
||
setDialogueType('1');
|
||
setIsExplicit(true);
|
||
break;
|
||
case '18':
|
||
setTone("Intrigue internationale, secrets d'État");
|
||
setAtmosphere('Villes étrangères, tensions diplomatiques');
|
||
setVerbTense('16');
|
||
setPerson('5');
|
||
setDialogueType('4');
|
||
setIsExplicit(true);
|
||
break;
|
||
case '19':
|
||
setTone('Survie désespérée, monde en ruines');
|
||
setAtmosphere('Paysages dévastés, ressources rares');
|
||
setVerbTense('7');
|
||
setPerson('4');
|
||
setDialogueType('3');
|
||
setIsExplicit(false);
|
||
break;
|
||
case '20':
|
||
setTone('Leçons de vie, valeurs profondes');
|
||
setAtmosphere('Village paisible, nature environnante');
|
||
setVerbTense('1');
|
||
setPerson('3');
|
||
setDialogueType('1');
|
||
setIsExplicit(true);
|
||
break;
|
||
}
|
||
}
|
||
|
||
static getNarrativePerson(value: number, level: number): string {
|
||
if (level === 1 /* Débutant */) {
|
||
// Options simples et courantes
|
||
switch (value) {
|
||
case 1:
|
||
return 'Première personne (Je acteur) - Parfait pour les débuts (ex: Je marchais)';
|
||
case 3:
|
||
return 'Troisième omnisciente - Narration globale (ex: Il marchait)';
|
||
default:
|
||
return 'Première personne';
|
||
}
|
||
} else if (level === 2 /* Intermédiaire */) {
|
||
// Ajoute des options plus complexes
|
||
switch (value) {
|
||
case 1:
|
||
return 'Première personne (Je acteur)';
|
||
case 2:
|
||
return 'Première personne (Je témoin) - Observateur (ex: Je le regardais marcher)';
|
||
case 3:
|
||
return 'Troisième omnisciente';
|
||
case 4:
|
||
return 'Troisième limitée - Focus sur un personnage (ex: Il marchait, ignorant le danger)';
|
||
default:
|
||
return 'Première personne';
|
||
}
|
||
} else if (level === 3 /* Avancé */) {
|
||
// Toutes les options, y compris "Deuxième personne" et "Nous collectif"
|
||
switch (value) {
|
||
case 1:
|
||
return 'Première personne (Je acteur)';
|
||
case 2:
|
||
return 'Première personne (Je témoin)';
|
||
case 3:
|
||
return 'Troisième omnisciente';
|
||
case 4:
|
||
return 'Troisième limitée';
|
||
case 5:
|
||
return 'Deuxième personne (Tu) - Immersion forte (ex: Tu marches vers la mort)';
|
||
case 6:
|
||
return 'Nous collectif - Voix chorale (ex: Nous marchions, unis par le destin)';
|
||
default:
|
||
return 'Troisième omnisciente';
|
||
}
|
||
}
|
||
return 'Première personne';
|
||
}
|
||
|
||
static getDialogueType(value: number, level: number): string {
|
||
// Restreindre les options selon le niveau
|
||
if (level === 1 /* Débutant */) {
|
||
// Options simples
|
||
switch (value) {
|
||
case 1:
|
||
return 'Dialogue direct - Paroles exactes (ex: "Je t’aime !")';
|
||
case 2:
|
||
return 'Dialogue indirect - Résumé par le narrateur (ex: Il dit qu’il m’aime)';
|
||
default:
|
||
return 'Dialogue direct';
|
||
}
|
||
} else if (level === 2 /* Intermédiaire */) {
|
||
// Ajoute "Dialogue mixte"
|
||
switch (value) {
|
||
case 1:
|
||
return 'Dialogue direct';
|
||
case 2:
|
||
return 'Dialogue indirect';
|
||
case 3:
|
||
return 'Dialogue mixte (ex: "Je t’aime" dit-il, puis explique ses sentiments)';
|
||
default:
|
||
return 'Dialogue direct';
|
||
}
|
||
} else if (level === 3 /* Avancé */) {
|
||
// Toutes les options, y compris "Monologue intérieur"
|
||
switch (value) {
|
||
case 1:
|
||
return 'Dialogue direct';
|
||
case 2:
|
||
return 'Dialogue indirect';
|
||
case 3:
|
||
return 'Dialogue mixte';
|
||
case 4:
|
||
return 'Monologue intérieur (ex: *Je ne peux pas le perdre...*)';
|
||
default:
|
||
return 'Dialogue direct';
|
||
}
|
||
}
|
||
return 'Dialogue direct';
|
||
}
|
||
}
|