So baust du ein neues Level¶
Ein Level ist eine Textdatei in src/levels/. Die Karte wird mit Zeichen «gemalt» – jedes Zeichen ist ein Feld
(16 × 16 Pixel). Am einfachsten kopierst du eine bestehende Datei (z. B. see.js) und änderst sie.
Nach jeder Änderung prüft npm run pruefen, ob alles erreichbar ist.
1. Karte malen¶
karte: [
'MMMMMMMMMMMM',
'M....a.....M',
'M..B....F..M',
'M....@.....M',
'MMMMM1MMMMMM',
],
Böden¶
| Zeichen | Bedeutung | Zeichen | Bedeutung |
|---|---|---|---|
. |
Gras | , |
Blumenwiese |
: |
Pflasterweg | _ |
Acker |
# |
Steinboden | \| |
roter Teppich |
- |
Holzboden | = |
Brücke (begehbar) |
" |
Schnee | ; |
Höhlenboden |
~ |
Wasser (fest) | X |
Schlucht (fest) |
M |
Fels / Berg (fest) | Ö |
Höhlenwand (fest) |
W |
Steinmauer (fest) | R |
Mauer mit Rune |
G |
Mauer mit Banner | O |
Trittstein im Wasser (begehbar) |
[ |
Strickleiter (begehbar) | @ |
Hier startet der Grosse Zwerg |
Dinge zum Holen (Quellen)¶
| Zeichen | Ding | gibt |
|---|---|---|
B |
Brunnen | Wasser |
] |
Höhlenquelle | Wasser |
S+ |
Marktstand (2 Felder) | Essen |
F |
Obstbaum | Äpfel |
Q |
Bücherregal | Bücher |
C |
Steinhaufen | Steine |
` |
Bretterstapel | Bretter |
/ |
Seilkiste | Seil |
D |
Beerenbusch | Beeren |
N |
Heuhaufen | Heu |
( |
Feuerschale | Fackel |
) |
Höhlenpilze | Pilze |
Ä / Ë / Ï |
Blumenbeet rot / gelb / blau | Blumen in dieser Farbe |
Gebäude und Deko¶
| Zeichen | Bedeutung | Zeichen | Bedeutung |
|---|---|---|---|
H++ / +++ |
Zwergenhaus (3 × 2) | U++ / +++ |
Stall (3 × 2) |
>+ / ++ |
Burgturm (2 × 2) | { + + |
Schloss (7 × 4) |
V+ |
Mineneingang | Y |
Ahnen-Statue |
Ü+ |
Thron | I |
Säule |
T |
Tanne | < |
Laubbaum |
* |
Busch | ^ |
Felsbrocken |
J |
Zaun | Z |
Rosen |
! |
Laterne (leuchtet) | L |
Feuerschale (Deko) |
E / A |
Esse / Amboss | K / $ |
Fass / Kiste |
% / & |
Holzstapel / Heuballen | ? |
Wegweiser (anklickbar, jedes Mal ein lustiges Ziel – Texte in src/texte/de.js unter WEGWEISER) |
P |
Pilze (Deko) | } |
Kristall (leuchtet) |
0 |
Auslöse-Feld für ein Ereignis | a–z |
Figur (siehe unten) |
1–9 |
Tür / Ausgang |
Grosse Dinge stehen mit ihrem Zeichen oben links, die restlichen Felder bekommen ein +.
Neue Zeichen lassen sich in src/levels/legende.js erfinden.
2. Figuren beschreiben¶
Jeder Kleinbuchstabe auf der Karte bekommt einen Eintrag unter figuren:
figuren: {
a: {
name: 'Onkel Gimli',
aussehen: 'gimli', // Name aus src/grafik/figuren-liste.js
stimme: { hoehe: 0.7 }, // Tonhöhe beim Plappern: 0.5 = tief, 2 = hoch
wunsch: 'wasser', // essen, wasser, buch, frucht, stein, brett, seil, beeren, heu, fackel, pilze
neckt: 'Hoho, du Riese!', // (freiwillig) nur beim ersten Mal
sagt: 'Holst du mir bitte Wasser?',
danke: 'Danke, mein Freund!',
danach: 'Du bist ein echter Held.',
},
},
wunsch: 'mut' | Wird erfüllt, sobald man mit der Figur redet (Herz in der Blase) |
| wunsch: 'reden' + gespraech: [...] | Ein Gespräch als Drehbuch (siehe unten), danach erfüllt |
| wuensche: [{ wunsch, sagt, danke }, …] | Mehrere Wünsche nacheinander (wie bei Füürio) |
| anzahl: 3 | Braucht 3 Stück (Blase zeigt «1/3») |
| wunsch: 'huehner', anzahl: 3, ausreisser: [[x, y], …] | Hühner einfangen: Hühner laufen an diesen Stellen herum. Beim ersten Hinlaufen flattern sie davon, beim zweiten Mal hüpfen sie zurück zur Figur (weiter: 'Noch {rest}!') |
| wunsch: 'suchen', verstecke: [[x, y], …] | Versteckis: Die Figur versteckt sich hinter einem dieser Dinge (Busch, Fass, Tanne …). Das richtige raschelt und kichert. Texte: zaehlen, leer: [...], gefunden |
| selberSuchen: true, falsch: '…' (in einem Wunsch) | Selber suchen (z. B. Farben): Der Pfeil zeigt die richtige Quelle erst, wenn man einmal das Falsche gebracht hat. falsch wird dann gesagt |
| geschenk: 'fackel' | Gibt nach dem Helfen etwas mit |
| versteckt: true | Erst unsichtbar, erscheint durch ein Ereignis (zeige) |
| licht: 70, lichtNachErfuellt: true | Leuchtet (in dunklen Karten), optional erst nach dem Helfen |
| sprecher: 'held' | Der Grosse Zwerg spricht die Texte selbst |
| aussehen: 'drache', zustand: 'froh' | Füürio (belegt 3 × 2 Felder) |
| aussehen: 'pony' | Das Pony |
Das Aussehen steht in src/grafik/figuren-liste.js, z. B.
gimli: { typ: 'zwerg', haar: 'rot', bart: 'gabel', kleid: 'gruen', kopf: 'hoernerhelm', kopfFarbe: 'stahl', umhang: 'blau' },
zwerg, zwergin, kind, koenigin, bote
- bart: lang, gabel, zoepfe, kurz, keiner
- kopf: nasenhelm, hoernerhelm, federhelm, kapuze, stirnband, krone, glatze
- Farben (haar, kleid, kopfFarbe, schuerze, umhang): rot, braun, kastanie, grau, weiss, schwarz, blond,
stahl, gold, kupfer, blau, gruen, moos, lila, weinrot, orange, rosa, gelb, leder, beige
- Alle Figuren ansehen: galerie.html im Entwicklungsmodus öffnen.
3. Bauaufgaben (Trittsteine, Brücke, Strickleiter …)¶
Eine Bauaufgabe ist eine Figur ohne Aussehen, mit einem Schild. Jede Lieferung verwandelt Felder der Karte:
a: {
name: 'Brücke',
baustelle: { zu: '=', baue: [[[14, 10], [15, 10]], [[16, 10], [17, 10]], [[18, 10], [19, 10]]] },
sprecher: 'held',
wunsch: 'brett',
anzahl: 3,
sagt: 'Mit Brettern vom Holzstapel baue ich eine Brücke.',
weiter: 'Klong! Noch {rest} Bretter!',
danke: 'Die Brücke ist fertig!',
},
baue enthält pro Lieferung die Felder [x, y], die zu dem Zeichen zu werden (x = Spalte, y = Zeile, ab 0 gezählt).
4. Türen verbinden¶
ausgaenge: {
1: { karte: 'dorf', ziel: 1 }, // Tür 1 führt zur Tür 1 im Dorf
2: { karte: 'wald', ziel: 1, weiter: true, aussehen: 'weg' }, // offener Weg ohne Tür-Bild
},
weiter: true sagt dem Pfeil, dass es hier im Kapitel weitergeht. aussehen kann 'weg' (kein Bild),
'hoehleneingang' oder 'schlosstor' sein; ohne Angabe wird in Mauern eine Holztür gezeichnet.
5. Ereignisse (Drehbücher)¶
ereignisse: {
beimBetreten: [ { sage: ['held', 'Hier ist es aber dunkel!'] } ], // beim ersten Betreten
wennFertig: [ { splash: { titel: 'Geschafft!', bild: 'herz' } } ], // wenn alle Wünsche der Karte erfüllt sind
ausloeser: [ { fackel: false }, { augen: { figur: 'd' } } ], // wenn man auf ein Feld "0" tritt
},
{ sage: ['held' \| 'a' \| 'k', 'Text'] } | Jemand spricht (Buchstabe der Figur) |
| { splash: { titel, text, bild, farbe } } | Grosse Einblendung mit Konfetti |
| { entscheidung: { frage, knopf } } | Grosser Herz-Knopf, der gedrückt werden will |
| { zeige: 'd' } / { verstecke: 'd' } | Figur erscheint / verschwindet |
| { figurKommt: { aussehen, name, buchstabe, von: [x, y], nach: [x, y] } } | Eine Figur läuft ins Bild |
| { jubel: ['a', 'b'] } | Figuren jubeln (mit Konfetti) |
| { licht: 0.5 } / { heldLicht: 40 } / { fackel: false } | Dunkelheit, Lichtkreis, Fackel aus |
| { augen: { figur: 'd' } } | Zwei leuchtende Augen im Dunkeln |
| { zustand: ['d', 'froh'] } | Füürio schaut froh |
| { gib: 'fackel' } | Der Grosse Zwerg bekommt etwas |
| { warte: 800 }, { ton: 'fanfare' }, { musik: 'fest' }, { wackeln: 400 } | Pause, Ton, Musik, Wackeln |
| { kapitelEnde: true } / { kapitelWechsel: 5, szene: 'Flug' } / { szene: 'Abspann' } | Weiter im Spiel |
6. Stimmung der Karte¶
name: 'Der dunkle Wald', // erscheint als Banner beim ersten Betreten
musik: 'wald', // dorf, bibliothek, schloss, reise, wald, hoehle, flug, fest, titel
dunkel: 0.82, // 0 = hell, 1 = ganz dunkel
heldLicht: 58, // Lichtkreis um den Grossen Zwerg
hintergrund: '#0e140e',
leben: {
falter: 6, voegel: true, wolken: true, schnee: true,
huehner: [[10, 5], [12, 6]], gluehwuermchen: [[5, 10], [9, 8]], dampf: [[13, 3]],
},
7. Level anmelden¶
In src/levels/index.js die Datei importieren, bei KARTEN eintragen und beim passenden Kapitel unter karten.
Ein Kapitel ist geschafft, wenn alle Wünsche auf allen seinen Karten erfüllt sind; dann läuft sein wennFertig.
Coole Momente mit Splash stehen unter meilensteine ({ herzen: 1 }, { wunsch: 'frucht' }, { figuren: ['see:a'] }).
8. Neue Mission für die Ehrengarde (Kapitel 6)¶
Nach dem Abspann wählt man Missionen am Missionsbrett. So kommt eine neue dazu:
1. Karte anlegen wie src/levels/damm.js – mit Figuren, Wünschen, Bauaufgaben. Am Ende von ereignisse.wennFertig
steht { missionFertig: 'meine-id' }: Dann geht es nach Hause, und die Belohnung wird gezeigt.
Praktisch dafür: { verwandle: { von: 'Ç', zu: '.' } } wandelt alle Kacheln mit einem Zeichen um (z. B. Wasser weg).
2. In src/levels/index.js bei KARTEN und bei KAPITEL[6].karten eintragen.
3. In src/levels/missionen.js unter MISSIONEN eintragen: titel, text (wird vorgelesen), bild, karte,
belohnung: { haus: 2 } (nächste Ausbaustufe, siehe HAUS) oder belohnung: { kleid: 'name' } (siehe KLEIDER).
Eine Flug-Mission geht mit szene: 'Flug', daten: { mission: 'id' } (siehe POST in src/scenes/Flug.js).
4. Neue Kleider: in KLEIDER Farben aus RAMPEN angeben (z. B. { tunika: 'gruen', helm: 'gold' }).
Neue Ausbaustufe: Bild zuhauseN in src/grafik/welt-grafik.js malen und bei HAUS eintragen.
5. KAPITEL=6 node tests/durchlauf.mjs spielt alle Missionen automatisch durch.
9. Ausprobieren¶
npm run pruefen– findet Tippfehler und unerreichbare Figurennpm run devund im Browser?kapitel=3anhängen, um direkt ins Kapitel zu springenKAPITEL=3 node tests/durchlauf.mjs– spielt das Kapitel automatisch durch