slop game oder so

This commit is contained in:
2026-09-24 17:57:54 +02:00
commit 4c997eee21
166 changed files with 14976 additions and 0 deletions
+227
View File
@@ -0,0 +1,227 @@
/**
* Alle Spieltexte an einem Ort (Deutsch).
*
* Tonfall: überzeichnete Propaganda einer frei erfundenen Regierung. Der Spott gilt
* Militarismus und Propaganda im Allgemeinen – keine realen Personen, Parteien,
* Länder oder Zitate. Namen und Begriffe sind bewusst eigenständig und stammen
* aus keinem anderen Spiel oder Film.
* @module content/texts
*/
export const TITLE = 'GLORY DEFENSE';
export const TAGLINE = 'Für Freiheit und Frieden!';
export const PRESIDENT = 'Präsident Maximilian Valor';
export const MENU = Object.freeze({
start: 'Mission starten',
highscores: 'Ehrentafel',
controls: 'Steuerung',
disclaimer: 'Disclaimer',
credits: 'Credits',
footer: 'Satire · Reine Fiktion · Alle Figuren sind frei erfunden',
hint: '↑ ↓ oder Maus zum Wählen · Enter zum Bestätigen',
touchNotice: 'Hinweis: Glory Defense wird mit Tastatur und Maus gespielt.',
});
export const DISCLAIMER = Object.freeze({
accept: 'Verstanden – zum Hauptmenü',
close: 'Schließen',
openPage: 'Als eigene Seite öffnen',
missingTemplate:
'Glory Defense ist Satire und reine Fiktion. Alle Figuren und Organisationen sind frei erfunden. ' +
'Ähnlichkeiten mit realen Personen sind nicht beabsichtigt. Das Spiel vertritt keine politische Position.',
});
/**
* Missionsbriefings; eines wird zufällig gewählt.
* @type {readonly {title: string, lines: readonly string[]}[]}
*/
export const BRIEFINGS = Object.freeze([
Object.freeze({
title: 'EINSATZBEFEHL NR. 7-G · STRENG ÖFFENTLICH',
lines: Object.freeze([
'Präsident Maximilian Valor, Hüter des ewigen Friedens!',
'Außerirdische Aggressoren bedrohen die Vereinigte Erde. Der Hohe Rat hat einstimmig beschlossen, dass Sie den Frieden persönlich verteidigen – mit allen Mitteln, die der Frieden erfordert.',
'Feindaufklärung: Die Schwärmer sind schnell, zahlreich und haben schlechte Manieren. Die Blechlegion ist langsam, gründlich und schießt aus der Ferne.',
'Ziel: Halten Sie so viele Angriffswellen wie möglich stand.',
'Das Ministerium für Zuversicht versichert: Die Lage ist unter Kontrolle. Sie war nie außer Kontrolle. Es gibt keine Lage.',
]),
}),
Object.freeze({
title: 'LAGEBESPRECHUNG · SIEG BEREITS BESCHLOSSEN',
lines: Object.freeze([
'Herr Präsident, die Feinde des Friedens sind gelandet.',
'Die Orbitalflotte steht bereit. Sie trifft stets präzise – wo sie einschlägt, war per Definition das Ziel.',
'Halten Sie Q gedrückt und geben Sie die Befehlscodes ein. Der Rest ist Geschichte. Genauer: Geschichtsschreibung.',
'Ziel: Überleben. Nebenziel: Überleben mit Stil.',
'Für Freiheit und Frieden! Und für die Einschaltquote.',
]),
}),
Object.freeze({
title: 'TAGESBEFEHL · NICHT ZUR DISKUSSION',
lines: Object.freeze([
'Bürgerinnen und Bürger schauen zu. Der Präsident kämpft an vorderster Front, denn die Front ist, wo der Präsident ist.',
'Die Schwärmer greifen in Rudeln an und umzingeln. Die Blechlegion hält Abstand und flankiert. Beide lehnen den Frieden ab. Wir bieten ihn trotzdem an – mit Nachdruck.',
'Ziel: Jede Welle abwehren. Munition knapp? Fürsorgepaket anfordern.',
'Das Ministerium für Zuversicht erinnert: Zweifel sind ab sofort meldepflichtig.',
]),
}),
]);
export const BRIEFING_CONTINUE = 'Leertaste oder Klick: Einsatz beginnen · Esc: zurück';
/** Propaganda-Durchsagen zwischen den Wellen. */
export const PROPAGANDA = Object.freeze([
'Bürgerinnen und Bürger! Jede abgewehrte Welle bringt uns dem ewigen Frieden näher. Die nächste auch.',
'Das Ministerium für Zuversicht meldet: Verluste sind statistisch nicht existent.',
'Frieden ist die kürzeste Pause zwischen zwei Siegen.',
'Erinnerung: Zweifel sind ab sofort meldepflichtig.',
'Der Präsident kämpft persönlich. Die Front ist, wo der Präsident ist.',
'Unsere Orbitalflotte trifft stets präzise. Wo sie trifft, war immer das Ziel.',
'Heute ist ein historischer Tag. Wie jeder Tag seit Beginn der Durchsagen.',
'Die Rationen werden um 20 % erhöht. Zuvor wurden sie um 40 % gesenkt. Ein Gewinn für alle!',
'Zuversicht ist Bürgerpflicht. Wer nicht zuversichtlich ist, wird es bald sein.',
'Wer Frieden will, muss ihn verteidigen. Wer ihn verteidigt, muss kämpfen. Wer kämpft, will Frieden. Logisch.',
'Das Wetter: heiter bis wolkig, mit vereinzelten Orbitalschlägen.',
'Die Schwärmer sind zahlreich. Wir sind zahlreicher – in unseren Herzen.',
'Kritik an der Kriegsführung schwächt die Moral. Moral ist kriegswichtig. Bitte weiterklatschen.',
'Fürsorgepakete sind ein Geschenk des Präsidenten. Bitte nicht darunter stehen.',
'Neue Umfrage: 100 % der Befragten sind zufrieden. Befragt wurde das Ministerium.',
'Der Feind hat keine Chance. Das wurde gestern beschlossen.',
]);
export const WAVE = Object.freeze({
incoming: (n) => `WELLE ${n}`,
preparing: 'VORBEREITUNG',
factionLine: Object.freeze({
swarm: 'Die Schwärmer greifen an!',
legion: 'Die Blechlegion rückt vor!',
mixed: 'Schwärmer und Blechlegion – gemeinsam gegen den Frieden!',
}),
cleared: (n) => `Welle ${n} abgewehrt!`,
bonus: (points) => `Wellenbonus +${points}`,
heal: (hp) => `Das Ministerium für Gesundheit spendiert ${hp} Lebenspunkte.`,
nextIn: (seconds) => `Nächste Welle in ${seconds}`,
remaining: (count) => `Feinde: ${count}`,
elite: Object.freeze({
brutmutter: 'ACHTUNG: Eine Brutmutter wurde gesichtet!',
walzmeister: 'ACHTUNG: Ein Walzmeister rollt heran!',
}),
});
export const ORBITAL_TEXT = Object.freeze({
holdHint: 'Q halten + Pfeiltasten/WASD',
panelTitle: 'ORBITAL-BEFEHLE · Q HALTEN',
requested: (name) => `${name} angefordert – Einschlag steht bevor!`,
notReady: (name, seconds) => `${name} lädt noch (${seconds} s)`,
invalid: 'Befehlscode ungültig',
selfHit: 'Kollateralschaden am Präsidenten – im Bericht als Heldentum vermerkt.',
supplyPickup: (heal) => `Fürsorgepaket erhalten: +${heal} Leben, Munition aufgefüllt.`,
turretOnline: 'Geschütz »Wachsamer Nachbar« ist einsatzbereit.',
});
export const PLAYER_TEXT = Object.freeze({
reloading: 'Nachladen …',
empty: 'Leer',
lowAmmo: (code) => `Munition knapp! Nachschub anfordern: Q + ${code}`,
outOfAmmo: 'Keine Munition – Dienstpistole gezogen.',
dodgeReady: 'Rolle',
});
export const GAME_OVER = Object.freeze({
title: 'DER PRÄSIDENT IST GEFALLEN',
subtitles: Object.freeze([
'Das Ministerium für Zuversicht meldet: planmäßiger Rückzug in die Unsterblichkeit.',
'Ein Denkmal wurde bereits in Auftrag gegeben. Es war schon vorher in Auftrag gegeben.',
'Offizielle Sprachregelung: Der Präsident ruht sich kurz aus. Sehr gründlich.',
'Die Nachrichten melden einen triumphalen Sieg. Details folgen nie.',
]),
stats: Object.freeze({
score: 'Punkte',
wave: 'Erreichte Welle',
kills: 'Abschüsse',
bestStreak: 'Längste Serie',
duration: 'Einsatzdauer',
}),
nameLabel: 'Name für die Ehrentafel',
nameHint: 'Höchstens 16 Zeichen. Wird öffentlich angezeigt.',
submit: 'Eintragen',
skip: 'Nicht eintragen',
retry: 'Erneut verteidigen',
menu: 'Hauptmenü',
submitting: 'Übermittle an das Archiv …',
saved: (rank) => `Eingetragen auf Platz ${rank}. Die Geschichtsbücher sind informiert.`,
offline: 'Das Archiv ist nicht erreichbar. Der Punktestand wird mündlich überliefert.',
noToken: 'Diese Runde konnte nicht beim Archiv angemeldet werden – ein Eintrag ist leider nicht möglich.',
});
export const HIGHSCORES = Object.freeze({
title: 'EHRENTAFEL DER VERTEIDIGER',
loading: 'Lade Ehrentafel …',
empty: 'Noch keine Einträge. Die Geschichte wartet auf Sie.',
error: 'Die Ehrentafel ist gerade nicht erreichbar.',
columns: Object.freeze({ rank: 'Rang', name: 'Name', score: 'Punkte', wave: 'Welle' }),
back: 'Zurück (Esc)',
});
export const PAUSE = Object.freeze({
title: 'EINSATZ PAUSIERT',
subtitle: 'Der Feind wartet höflich.',
resume: 'Weiter (Esc)',
quit: 'Mission abbrechen',
volumes: Object.freeze({ master: 'Gesamtlautstärke', music: 'Musik', sfx: 'Effekte' }),
confirmQuit: 'Mission wirklich abbrechen? Der Punktestand verfällt.',
});
export const CONTROLS = Object.freeze({
title: 'STEUERUNG',
rows: Object.freeze([
['W A S D', 'Bewegen (8 Richtungen)'],
['Maus', 'Zielen'],
['Linksklick', 'Schießen (gedrückt halten beim Karabiner)'],
['R', 'Nachladen'],
['1 · 2 · 3 / Mausrad', 'Waffe wechseln'],
['Leertaste', 'Ausweichrolle (kurz unverwundbar)'],
['Q halten + Pfeile/WASD', 'Orbital-Befehl eingeben (Ziel: Mauszeiger)'],
['Esc', 'Pause und Lautstärke'],
]),
orbitalTitle: 'ORBITAL-BEFEHLE',
back: 'Zurück (Esc)',
});
export const CREDITS = Object.freeze({
title: 'CREDITS',
sections: Object.freeze([
Object.freeze({
heading: 'Spiel',
lines: Object.freeze(['Glory Defense – ein satirischer 2D-Shooter', 'Idee, Code und Figuren: frei erfunden für dieses Projekt']),
}),
Object.freeze({
heading: 'Technik',
lines: Object.freeze(['Phaser 3 – © Phaser Studio Inc., MIT-Lizenz', 'Flask – © Pallets, BSD-3-Clause-Lizenz']),
}),
Object.freeze({
heading: 'Grafik und Ton',
lines: Object.freeze([
'Figuren, Emblem, Geschütz und Kapsel: eigene Vektorgrafiken (CC0)',
'Bodenkacheln aus „Top-down Shooter“ und Effekte aus „Particle Pack“ – Kenney (kenney.nl), CC0',
'Schriften: Systemschriften des Betriebssystems (nicht mitgeliefert)',
'Klänge aus „Sci-Fi Sounds“, „Impact Sounds“, „Interface Sounds“, „Music Jingles“ – Kenney (kenney.nl), CC0',
'Marschmusik: eigene Komposition, im Browser synthetisch erzeugt (CC0)',
]),
}),
Object.freeze({
heading: 'Hinweis',
lines: Object.freeze([
'Satire und reine Fiktion. Alle Figuren und Organisationen sind frei erfunden.',
'Keine Verbindung zu realen Personen, Parteien, Ländern oder anderen Spielen.',
]),
}),
]),
back: 'Zurück (Esc)',
});
export const ERRORS = Object.freeze({
phaserMissing: 'Die Spiel-Engine konnte nicht geladen werden. Bitte Seite neu laden.',
generic: 'Ein unerwarteter Fehler ist aufgetreten. Bitte Seite neu laden.',
});