Files
ERitors-Scribe-Desktop/lib/models/Story.ts
natreex b4eafca3bc Add comprehensive models and script for handling inline scripts and structured data
- 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.
2025-11-16 19:56:14 -05:00

1117 lines
40 KiB
TypeScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 taime !")';
case 2:
return 'Dialogue indirect - Résumé par le narrateur (ex: Il dit quil maime)';
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 taime" 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';
}
}