# Spielanleitung

Diese Datei ist die deutsche Fassung der Anleitung; die englische und die französische
liegen daneben. Das Spiel lädt die Fassung der gewählten Sprache und zeigt sie an — was
hier steht, steht dort.

## Worum es geht

Links liegt das Startbrett, rechts das Zielbrett. Beide zeigen dasselbe Brett mit
denselben Gers (Pfeilen), nur in verschiedenen Stellungen. Das rechte Bild ist aus dem
linken entstanden, indem jemand einen bestimmten Ger angeklickt hat.

Gesucht ist: **welcher Ger war das?**

Geklickt wird nur links. Rechts wird nur geschaut.

Der Name: **MobGer** — das puzzelige Gewimmel (mob) der Wurfspieße (ger). Ein Ger ist ein
Wurfspieß; er zeigt in eine Richtung und fliegt dorthin, sobald man ihn wirft.

## Was ein Klick auslöst

Ein Klick auf einen Ger bewegt nicht nur diesen einen. Er löst eine **Runde** aus:

1. Zuerst zieht der angeklickte Ger.
2. Dann zieht der Ger mit der nächsthöheren Nummer, dann der übernächste und so fort.
3. Nach der höchsten Nummer geht es bei der 1 weiter.
4. Die Runde endet, wenn jeder Ger genau einmal gezogen ist.

Ein Klick auf ein leeres Feld bewirkt nichts — weder eine Runde noch einen Fehlversuch.

## Wie ein einzelner Ger zieht

Ein Ger geht ein Feld weit in die Richtung, in die er zeigt.

- Ist das Feld **frei**, bleibt er dort liegen.
- Ist das Feld **besetzt**, gleitet er darüber hinweg weiter in derselben Richtung, bis er
  ein freies Feld findet. Der Ger, der im Weg lag, bleibt liegen.
- Sein eigenes Ausgangsfeld gilt dabei als frei — er kann also wieder dort landen.

Die Nummer am Ger ist seine Kennung. Sie wandert mit ihm und ändert sich nie.

## Farben und Nummern

Jeder Ger hat seine eigene Farbe, genommen vom Farbkreis: **Nummer 1 ist rot**, die
übrigen folgen im Kreis herum, in gleichen Winkelschritten. Bei zwölf Gers liegen also
30 Grad zwischen zwei Nachbarn.

Die Farbe ist eine Lesehilfe für die Reihenfolge — verbindlich ist immer die kleine
Nummer am Ger.

## Smileys

Der Schalter **Smileys auf den Gers** legt jedem Ger ein kleines Gesicht auf; er ist
voreingestellt an. Die Gesichter werden bei jedem neuen Spiel zufällig verteilt, und keine
zwei Gers eines Bretts tragen dasselbe. Ein Ger trägt links und rechts dasselbe Gesicht, auch während er zieht.

Das Gesicht ist etwas kleiner als der Pfeil und liegt über seinem **Ende**. Spitze,
Richtung und Nummer bleiben zu sehen; der Rand des Gesichts hat die Farbe des Gers. Die
Smileys sind nur Schmuck: sie ändern nichts an den Regeln und wirken sofort, ohne
„Neues Spiel".

## Die acht Richtungen

| Zeichen | Richtung |
|---|---|
| ↑ | Nord |
| ↗ | Nordost |
| → | Ost |
| ↘ | Südost |
| ↓ | Süd |
| ↙ | Südwest |
| ← | West |
| ↖ | Nordwest |

## Was an der Wand geschieht

Dafür gibt es den Schalter **Wand** mit zwei Stellungen.

**Reflexion.** Der Ger prallt ab. Die Richtungskomponente, die gegen die Wand zeigt,
kehrt sich um — in einer Ecke beide. Aus einem ↘ an der Unterkante wird ein ↗. Wichtig:
diese neue Richtung behält der Ger **für immer**, nicht nur für diesen einen Zug. Im
Spiel sieht man das Zeichen genau an der Wand umspringen.

**Teleport.** Das Brett ist gedacht als in alle acht Richtungen fortgesetzt. Wer rechts
hinausgeht, kommt links wieder herein, wer oben hinausgeht, unten. Die Richtung bleibt
dabei unverändert. Im Spiel sieht man den Ger an der einen Kante verschwinden und an der
anderen erscheinen.

**Woran man die Stellung erkennt.** Bei Reflexion ist das Brett grau, fest umrandet, und
die Felder haben eckige Kanten. Bei Teleport ist der Grund des Bretts weiß, ein
gestrichelter Rahmen läuft darum, und die Felder haben runde Ecken und einen bläulichen
Hintergrund. Das Aussehen gehört zum laufenden Spiel: wer den Schalter umstellt, sieht
den Wechsel erst mit dem nächsten „Neues Spiel".

## Gewonnen

Gewonnen ist, wenn das linke Brett dem rechten **vollständig** gleicht: jeder Ger auf
demselben Feld, mit derselben Nummer und derselben Richtung. Zwei Bilder, die nur
ähnlich aussehen, zählen nicht.

## Die Meldezeile über den Brettern

Über den Brettern steht, wie es um den Anlauf steht. Die Farbe sagt es schon aus der
Entfernung:

| Farbe | Bedeutung |
|---|---|
| blau | noch unterwegs, es sind weniger Klicks verbraucht als gesucht |
| rot, fett | die gesuchte Klickzahl ist erreicht oder überschritten, das Ziel aber nicht |
| grün | geschafft |

Die Zähler für Fehlversuche und verbrauchte Klicks stehen **unter** den Brettern.

## Die Lösungshilfe hinterlässt eine Spur

Wer während eines Anlaufs auch nur einmal „Lösung zeigen" drückt, bekommt das beim
Gewinn zu lesen — der Vermerk lässt sich nicht abschütteln, auch „Reset" löscht ihn
nicht. Erst „Neues Spiel" oder ein geladenes Spiel fängt sauber an.

Ohne Lösungshilfe:

> Geschafft — das Zielbild ist erreicht, nach 2 Klicks und 0 Fehlversuchen.

Mit Lösungshilfe:

> ⛔ Geschafft, aber mit Lösungshilfe — ☠ Cheater ⚠ — das Zielbild ist erreicht, nach
> 2 Klicks und 0 Fehlversuchen. 🚫

## Die Zähler und der Hinweis

**Fehlversuche.** Jeder Klick, der von der gesuchten Folge wegführt, zählt einen
Fehlversuch. Wer sich verirrt und später wieder auf eine Stellung der gesuchten Folge
zurückkommt, ist wieder auf Kurs — gezählt wird die **Stellung**, nicht die Klicknummer.

**Klicks bis zum Ziel.** Die Einstellung sagt, wie viele Klicks die gesuchte Folge lang
ist. Voreingestellt ist einer. Die Folge selbst lässt sich im Feld „Klickfolge" vorgeben —
siehe „Eine eigene Klickfolge vorgeben".

**Hinweis „bis hier korrekt".** Ab zwei Klicks lässt sich dieser Schalter umlegen. Dann
meldet die Statuszeile nach jedem Klick, ob die Folge bis hierher stimmt und der
wievielte Schritt erreicht ist. Ist der Schalter aus, sagt das Spiel nur, dass das Ziel
noch nicht erreicht ist — der Fehlversuchszähler läuft trotzdem mit.

Nach der angegebenen Klickzahl ist nicht Schluss: es darf weitergeklickt werden, und ein
Treffer wird auch später erkannt.

## Eine eigene Klickfolge vorgeben

Statt nur die Zahl der Klicks zu nennen, lässt sich im Feld **Klickfolge** die gesuchte
Folge selbst eintragen: die Nummern der Gers in Klickreihenfolge, durch Leerzeichen
getrennt, etwa `3 1 4`. Damit sind festgelegte Klickfolgen möglich — wer ein Rätsel für
andere stellt, bestimmt so, welche Gers in welcher Reihenfolge gesucht sind. Derselbe Ger
darf mehrmals vorkommen (`2 2`).

- Sobald das Feld etwas enthält, verschwindet **Klicks bis zum Ziel**: die Zahl der Klicks
  ist die Länge der Folge.
- Erlaubt sind die Nummern 1 bis zur Zahl der Gers, die das nächste Brett bekommt; sie
  folgt aus Breite, Höhe und Füllgrad (5 × 4 bei 60 Prozent: 12 Gers). Die Folge hat
  höchstens sechs Klicks.
- Steht eine Nummer darin, die größer oder kleiner ist als erlaubt — oder etwas, das keine
  ganze Zahl ist —, erscheint eine Warnung, und **„Neues Spiel" wird ausgeblendet**, bis
  die Folge passt. Das gilt auch, wenn erst eine kleinere Brettgröße die Folge ungültig
  macht.
- „Neues Spiel" würfelt dann ein Brett und spielt die Folge darauf: das Zielbild ist genau
  das Bild dieser Klicks. Führt die Folge auf dem gewürfelten Brett zum Startbild zurück,
  wird ein anderes Brett gewürfelt.
- Wie die anderen Einstellungen wirkt die Klickfolge erst mit „Neues Spiel". Ein
  importiertes Spiel leert das Feld, damit es die Lösung der Datei nicht verrät.

Das Feld zeigt die Folge weiter an, solange das Spiel läuft — wer das Rätsel für jemand
anderen stellt, leert es danach.

## Die Knöpfe

| Knopf | Wirkung |
|---|---|
| Neues Spiel | würfelt Start und Ziel neu und setzt den Fehlversuchszähler auf 0. Hervorgehoben, weil er aus jeder Sackgasse herausführt. Ausgeblendet, solange die Klickfolge eine unerlaubte Nummer enthält |
| Reset | stellt links die Ausgangsstellung wieder her; Zielbrett und Fehlversuche bleiben stehen |
| Lösung zeigen | umrandet den Ger, der als Nächstes zu klicken ist; steht das Brett abseits der Lösung, wird zuvor auf Anfang gestellt. **Wer ihn benutzt, bekommt es im Gewinnfeld gesagt** — siehe unten |
| Export | speichert das laufende Spiel als JSON-Datei |
| Import | lädt ein gespeichertes Spiel; eine Datei lässt sich auch mit der Maus ablegen |

## Die Einstellungen

| Einstellung | Bedeutung |
|---|---|
| Breite, Höhe | Größe des Bretts, 2 bis 20 Felder |
| Füllgrad | wie viele Felder besetzt sind, 30 bis 80 Prozent in Schritten von 5 |
| Wand | Reflexion oder Teleport |
| Klicks bis zum Ziel | Länge der gesuchten Folge, 1 bis 6 |
| Klickfolge | Nummern der Gers in Klickreihenfolge, durch Leerzeichen getrennt; ersetzt „Klicks bis zum Ziel", siehe oben |
| Hinweis | siehe oben, erst ab zwei Klicks bedienbar |
| Schrittdauer | wie lange ein Animationsschritt dauert — ein Feld weit gleiten oder ins Feld einsacken. Voreingestellt sind 240 Millisekunden; **0 heißt: keine Animation** |
| Smileys auf den Gers | ein eigenes Gesicht je Ger über dem Pfeilende, voreingestellt an, siehe oben |

Breite, Höhe, Füllgrad, Wand, Klickzahl und Klickfolge wirken erst mit dem nächsten „Neues
Spiel" — sonst liefe die Einstellung dem gerade gesuchten Ziel davon. Solange eine Änderung
noch nicht angekommen ist, färbt sich das Einstellungsfeld **orange**. Schrittdauer und
Smileys wirken sofort.

## Gespeicherte Spiele

Eine Exportdatei enthält die Ausgangsstellung, das Zielbild, die Klickfolge und die
Einstellungen. Sie lässt sich weitergeben; wer sie lädt, bekommt genau dieselbe Aufgabe.

Beim Laden liest das Spiel nur die Angaben, die es kennt, und übergeht alles andere
kommentarlos. Fehlt etwas Notwendiges, nennt die Meldung die Version der Datei, die
aktuelle Spielversion und jedes fehlende Feld mit Namen.

Wie man eine Spielstellung von Hand schreibt, steht im zweiten Anleitungsfeld
„Spielstellung als JSON-Datei schreiben".

# Spielstellung als JSON-Datei schreiben

Diese Anleitung zeigt Schritt für Schritt, wie man eine eigene Aufgabe von Hand aufsetzt.
Sie wendet sich an Spieler, die sich Rätsel ausdenken und weitergeben wollen. Die
vollständige Feldliste mit allen Wertebereichen steht in der Formatreferenz
`dateiformat_1.1.de.md`; hier geht es um den Weg dorthin.

## Das Gerüst

Eine Spieldatei ist eine Textdatei mit der Endung `.json`. Sie hat immer diesen Aufbau:

```
{
  "format": "mobger.arrows",
  "version": "1.1",
  "settings": { ... },
  "start":  { "arrows": [ ... ] },
  "target": { "arrows": [ ... ] },
  "solution": [ ... ]
}
```

Die ersten beiden Zeilen sind Pflicht und immer gleich. `format` sagt, dass die Datei zu
diesem Spiel gehört, `version` nennt die Fassung des Dateiformats.

## Schritt 1: das Brett festlegen

```
"settings": {
  "width": 3,
  "height": 2,
  "wallMode": "reflect",
  "clickCount": 1
}
```

- `width` und `height` sind Spalten und Zeilen, mindestens 2, höchstens 20.
- `wallMode` ist `"reflect"` oder `"teleport"`.
- `clickCount` ist die Zahl der Klicks, die zum Ziel führen.

Freiwillig sind `fillRatio` (nur für das Würfeln neuer Spiele wichtig) und
`showPathHint` sowie seit Format 1.1 `showFaces` (Smileys, Vorgabe `true`).

## Schritt 2: die Gers setzen

Ein Feld wird durch zwei Zahlen benannt: `x` zählt die Spalten **von links**, `y` die
Zeilen **von oben**, beide beginnen bei 0. Auf einem Brett 3 × 2 sieht das so aus:

| | x = 0 | x = 1 | x = 2 |
|---|---|---|---|
| **y = 0** | oben links | oben Mitte | oben rechts |
| **y = 1** | unten links | unten Mitte | unten rechts |

Jeder Ger ist ein kleines Objekt aus vier Angaben:

```
{ "n": 1, "x": 0, "y": 0, "dir": "E" }
```

- `n` ist die Nummer und zugleich die Kennung. Die Nummern müssen **lückenlos** bei 1
  beginnen: bei drei Gers also 1, 2, 3 — nicht 1, 2, 4.
- `x`, `y` ist das Feld. **Kein Feld darf doppelt besetzt sein.**
- `dir` ist eine der acht Richtungen, groß geschrieben:

| Code | Richtung | Zeichen |
|---|---|---|
| `N` | Nord | ↑ |
| `NE` | Nordost | ↗ |
| `E` | Ost | → |
| `SE` | Südost | ↘ |
| `S` | Süd | ↓ |
| `SW` | Südwest | ↙ |
| `W` | West | ← |
| `NW` | Nordwest | ↖ |

Alle Gers zusammen bilden die Startstellung:

```
"start": {
  "arrows": [
    { "n": 1, "x": 0, "y": 0, "dir": "E" },
    { "n": 2, "x": 0, "y": 1, "dir": "E" },
    { "n": 3, "x": 2, "y": 0, "dir": "SW" }
  ]
}
```

## Schritt 3: das Ziel — oder die Lösung

Jetzt gibt es zwei Wege, und man braucht **nur einen** davon.

**Der bequeme Weg: nur die Klickfolge angeben.**

```
"solution": [1]
```

Das Spiel rechnet das Zielbild selbst aus, indem es die Folge auf der Startstellung
abspielt. Die Zahlen sind Ger-Nummern in Klickreihenfolge, und die Liste muss so lang
sein wie `clickCount`.

**Der genaue Weg: das Zielbild ausschreiben.**

```
"target": {
  "arrows": [
    { "n": 1, "x": 1, "y": 0, "dir": "E" },
    { "n": 2, "x": 1, "y": 1, "dir": "E" },
    { "n": 3, "x": 0, "y": 0, "dir": "NW" }
  ]
}
```

Dann sucht das Spiel die Klickfolge selbst. Findet es keine, läuft das Spiel trotzdem —
nur ohne Hinweis und ohne Fehlerzählung, und es sagt das an.

Am sichersten ist es, **beides** zu schreiben: dann prüft der Import, ob die Klickfolge
wirklich zum angegebenen Bild führt, und meldet es, wenn nicht.

## Ein vollständiges Beispiel

Das ist die Datei `Beispiel/startzustand_3x2_v1.json`, von Hand gerechnet:

```
{
  "format": "mobger.arrows",
  "version": "1.1",
  "settings": {
    "width": 3, "height": 2, "fillRatio": 0.5,
    "wallMode": "reflect", "clickCount": 1, "showPathHint": false,
    "showFaces": true
  },
  "start": { "arrows": [
    { "n": 1, "x": 0, "y": 0, "dir": "E" },
    { "n": 2, "x": 0, "y": 1, "dir": "E" },
    { "n": 3, "x": 2, "y": 0, "dir": "SW" }
  ] },
  "target": { "arrows": [
    { "n": 1, "x": 1, "y": 0, "dir": "E" },
    { "n": 2, "x": 1, "y": 1, "dir": "E" },
    { "n": 3, "x": 0, "y": 0, "dir": "NW" }
  ] },
  "solution": [1]
}
```

Was beim Klick auf Ger 1 geschieht:

1. Ger 1 zieht von `(0,0)` nach Osten auf das freie Feld `(1,0)`.
2. Ger 2 zieht von `(0,1)` nach Osten auf das freie Feld `(1,1)`.
3. Ger 3 will von `(2,0)` nach Südwesten. `(1,1)` ist inzwischen von Ger 2 besetzt, also
   gleitet er weiter. Der nächste Schritt ginge unten aus dem Brett heraus, die Wand
   kippt ihn deshalb dauerhaft auf Nordwest, und er landet auf `(0,0)` — dem Feld, das
   Ger 1 gerade verlassen hat.

## Eigene Angaben mitschreiben

Das Spiel liest **nur** die Schlüssel, die es kennt, und übergeht jeden anderen
kommentarlos. Eine Datei darf also gefahrlos eigene Angaben führen:

```
"_hinweis": "Aufgabe fuer den Spieleabend",
"autor": "wer auch immer",
"schwierigkeit": 3
```

Beim Import erscheinen sie in der Meldung unter „Unbekannt (übergangen)". Das ist ein
Hinweis, kein Fehler.

## Wenn etwas nicht stimmt

Fehlt eine Pflichtangabe, wird die Datei **nicht halb** geladen. Stattdessen nennt die
Meldung die Version der Datei, die aktuelle Spielversion und jede Lücke mit ihrem Pfad:

```
Import abgebrochen.
  Datei-Version: 0.9   Aktuelle Spielversion: 1.1
  Fehlend: settings.wallMode, start.arrows[2].dir
  Unbekannt (übergangen): settings.gravity
```

Der Index in eckigen Klammern ist die **Position in der Liste und zählt ab 0**:
`start.arrows[2]` ist der dritte Eintrag, nicht der Ger mit der Nummer 2.

Die häufigsten Stolpersteine:

- Ein Komma zu viel vor einer schließenden Klammer — das ist in JSON verboten.
- Richtungen klein geschrieben (`"e"` statt `"E"`).
- Zwei Gers auf demselben Feld.
- Eine Lücke in den Nummern.
- Ein Feld außerhalb des Bretts, etwa `x: 3` auf einem Brett der Breite 3 (erlaubt sind
  dort 0, 1 und 2).

Zum Ausprobieren liegt in `Beispiel/fehlerhaft_version_0_9.json` eine absichtlich
fehlerhafte Datei, die genau diese Meldung erzeugt.
