228 lines
10 KiB
JavaScript
228 lines
10 KiB
JavaScript
/**
|
||
* 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.',
|
||
});
|