feat(02-02): add fallback texts module with German greetings, forest comments, and letter intros

- 10 time-of-day keyed greetings (morgen/mittag/abend/any)
- 10 forest element discovery comments
- 13 letter introductions for levels 1-6 with finger mapping
- Helper functions for random selection and letter lookup

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-29 11:53:47 +02:00
co-authored by Claude Opus 4.6
parent 02a189b9f2
commit 24bcbd1bba
+178
View File
@@ -0,0 +1,178 @@
/**
* Static fallback content for when the Gemini API is unavailable.
* All texts are in simple German suitable for a 7-year-old.
* No performance praise. Max 25 words per text.
*/
export type TimeOfDay = "morgen" | "mittag" | "abend";
export interface FallbackGreeting {
text: string;
timeOfDay: TimeOfDay | "any";
}
export interface LetterIntro {
letter: string;
finger: string;
text: string;
}
// --- Fallback Greetings (10 entries) ---
export const fallbackGreetings: FallbackGreeting[] = [
// Morning (3)
{
text: "Guten Morgen! Der Wald hat auf dich gewartet.",
timeOfDay: "morgen",
},
{
text: "Frueh am Morgen ist der Wald am schoensten. Schoen, dass du da bist!",
timeOfDay: "morgen",
},
{
text: "Die Voegel singen schon. Ein neuer Tag im Zauberwald beginnt!",
timeOfDay: "morgen",
},
// Any time (4)
{
text: "Schoen, dass du wieder da bist! Der Wald freut sich.",
timeOfDay: "any",
},
{
text: "Willkommen zurueck! Lass uns den Wald ein bisschen wachsen lassen.",
timeOfDay: "any",
},
{
text: "Hallo! Ich glaube, heute entdecken wir etwas Neues im Wald.",
timeOfDay: "any",
},
{
text: "Da bist du ja! Komm, lass uns zusammen in den Wald schauen.",
timeOfDay: "any",
},
// Evening (3)
{
text: "Guten Abend! Der Wald leuchtet im Abendlicht ganz besonders.",
timeOfDay: "abend",
},
{
text: "Die Gluehwuermchen sind schon unterwegs. Schoen, dass du da bist!",
timeOfDay: "abend",
},
{
text: "Am Abend wird der Wald ganz still. Lass uns leise ueben.",
timeOfDay: "abend",
},
];
// --- Fallback Forest Comments (10 entries) ---
export const fallbackForestComments: string[] = [
"Oh schau mal! Ein neuer Bewohner ist in unseren Wald gezogen!",
"Der Wald waechst und waechst! Was wird wohl als naechstes erscheinen?",
"Siehst du das? Etwas Neues hat sich zwischen den Baeumen versteckt!",
"Unser Wald wird immer bunter. Was fuer eine Ueberraschung!",
"Ein neues Stueck Wald ist dazugekommen. Wie schoen das aussieht!",
"Hast du das gesehen? Der Wald hat sich veraendert!",
"Es raschelt im Unterholz. Etwas Neues ist da!",
"Die Waldlichtung hat Zuwachs bekommen. Kannst du es entdecken?",
"Jedes Mal passiert etwas Neues im Wald. Schau genau hin!",
"Der Zauberwald hat ein Geschenk fuer dich bereit. Schau mal!",
];
// --- Fallback Letter Introductions (13 entries, levels 1-6) ---
export const fallbackLetterIntros: LetterIntro[] = [
// Level 1: F, J, Space
{
letter: "f",
finger: "linker Zeigefinger",
text: "Das F ist da, wo dein linker Zeigefinger zu Hause ist. Spuerst du den kleinen Huegel?",
},
{
letter: "j",
finger: "rechter Zeigefinger",
text: "Das J hat einen kleinen Strich unten. Dein rechter Zeigefinger findet ihn sofort!",
},
{
letter: " ",
finger: "Daumen",
text: "Die grosse Leertaste ganz unten drueckst du mit dem Daumen. Einfach druecken!",
},
// Level 2: D, K
{
letter: "d",
finger: "linker Mittelfinger",
text: "Das D liegt direkt neben dem F. Dein Mittelfinger wohnt dort wie ein Vogel im Nest.",
},
{
letter: "k",
finger: "rechter Mittelfinger",
text: "Das K ist der Nachbar vom J. Dein rechter Mittelfinger huepft einfach hinueber.",
},
// Level 3: S, L
{
letter: "s",
finger: "linker Ringfinger",
text: "Das S ist wie eine Schlange. Dein Ringfinger gleitet sanft dorthin.",
},
{
letter: "l",
finger: "rechter Ringfinger",
text: "Das L klingt wie das Lied der Lerche. Dein rechter Ringfinger kennt den Weg.",
},
// Level 4: A, Oe
{
letter: "a",
finger: "linker kleiner Finger",
text: "Das A ist ganz am Rand. Dein kleiner Finger streckt sich wie ein Ast nach links.",
},
{
letter: "ö",
finger: "rechter kleiner Finger",
text: "Das Oe mit den zwei Punkten oben. Dein kleiner Finger rechts tippt es ganz leicht.",
},
// Level 5: G, H
{
letter: "g",
finger: "linker Zeigefinger",
text: "Das G liegt neben dem F zur Mitte hin. Dein Zeigefinger macht einen kleinen Ausflug.",
},
{
letter: "h",
finger: "rechter Zeigefinger",
text: "Das H ist der Nachbar vom J zur Mitte hin. Ein kurzer Sprung fuer deinen Zeigefinger!",
},
// Level 6: E, I
{
letter: "e",
finger: "linker Mittelfinger",
text: "Das E wohnt eine Reihe hoeher ueber dem D. Dein Mittelfinger klettert wie ein Eichhoernchen hoch.",
},
{
letter: "i",
finger: "rechter Mittelfinger",
text: "Das I sitzt ueber dem K. Dein rechter Mittelfinger springt hoch wie ein Igel huepft.",
},
];
// --- Helper functions ---
export function getRandomFallbackGreeting(timeOfDay: TimeOfDay): string {
const matching = fallbackGreetings.filter(
(g) => g.timeOfDay === timeOfDay || g.timeOfDay === "any",
);
const index = Math.floor(Math.random() * matching.length);
return matching[index].text;
}
export function getRandomFallbackForestComment(): string {
const index = Math.floor(Math.random() * fallbackForestComments.length);
return fallbackForestComments[index];
}
export function getFallbackLetterIntro(
letter: string,
): LetterIntro | undefined {
return fallbackLetterIntros.find((intro) => intro.letter === letter);
}