ECheck V 3.5.0
ECheck ist ein Syntax-Checker für das PBeM Eressea. Er testet eine Zugdatei
auf Rechtschreibfehler und meldet Fehler.
Das Programm läuft auch auf dem Spiel-Server und verschickt für alle
eingehenden Züge das Testergebnis.
ECheck benötigt die Datei items.txt, in der alle Gegestände
aufgelistet sind. Ebenso wird die Datei zauber.txt gelesen, wenn sie
vorhanden ist. Sie enthält die Zauber. Das Format der Dateien ist in den
Dateien selbst erklärt.
Was ECheck kann
ECheck macht hauptsächlich eine "Rechtschreibprüfung", es werden also falsch
geschriebene Befehle und Talente angemerkt.
In der Zugvorlage des Servers stehen aber auch Informationen über Anzahl und
Silbervorrat der Einheiten drin. Dies versucht ECheck auch zu
berücksichtigen, wenn Silber für die Ernährung, das Rekrutieren von neuen
Personen, den Gebäudeunterhalt oder teure Talente benötigt wird.
Trotzdem kann ECheck dabei natürlich nicht (bzw. nur eher mangelhaft)
berücksichtigen, daß Einheiten Geld verdienen können oder gar Silber von
Einheiten anderer Parteien bekommen.
Ebenso kann ECheck aus der Zugvorlage entnehmen, ob eine Einheit auf einem
Schiff ist (in den [ ] im Kommentar steht sowas wie "s124", wenn die Einheit
auf Schiff 124 ist, bzw. "S124", wenn sie das Kommando über Schiff 124 hat),
ein Gebäude unterhalten muß (Markierung "U200" heißt, daß für ein Gebäude
200 Silber bezahlt werden muß, "U250+" sind 250 Silber und noch
etwas anderes, wie z.B. Holz bei der Schmiede) und Untote oder Illusionen sind
mit einem "I" markiert.
ECheck macht folgende Tests:
- Rechtschreibfehler
- hat die Einheit einen langen Befehl?
- Rekrutiert die TEMP-Einheit oder bekommt sie Personen?
- Ohne Option -l (Silberpool): bekommt die TEMP-Einheit genug
Geld zum Rekrutieren?
- Test auf Geld und Personen
- Einheiten mit dem Befehl ARBEITE bekommen automatisch
11 Silber pro Person angerechnet, Einheiten mit TREIBE STEUERN
EIN oder UNTERHALTE 20 Silber pro Person. Dadurch
wird deren Versorgung sichergestellt und auch ohne Silber-Reserven keine
Warnung ausgegeben. Trotzdem können natürlich Warnungen auftauchen, wenn
die Einheiten eigentlich mehr verdienen (und damit die Ernährung anderer
Einheiten sicherstellen), aber deren Silbervorrat vom Rundenanfang im Zug
verbraucht wird.
- Test, ob RESERVIERE xxx SILBER nicht mehr Silber anfordert, als
in der Region vorhanden.
Gibt die Einheit Silber weg, muß RESERVIERE vor den Befehlen
GIB und LIEFERE der Einheit stehen.
- Test, ob Einheiten, die gelehrt werden, auch lernen, und ob Lehrer nicht mehr
Personen lehren, als sie können.
- Einheiten, die Luxusgüter kaufen, bekommen den Grundpreis abgezogen.
Dies kann natürlich zu wenig sein, da nicht vorhersehbar ist, wieviele
Güter letztlich zu welchem Preis gekauft werden.
- Einheiten, die teure Talente (momentan Spionage, Magie, Alchemie, Taktik
und Kräuterkunde) lernen, bekommen die Lernkosten abgezogen, ebenso
werden die Kosten für Zauber abgezogen.
Unter Eressea sind die Lernkosten abhängig von den Talentpunkten der
Einheit. Man kann mittels LERNE MAGIE silberbetrag die
Lernkosten für ECheck angeben; dem Server ist die folgende Zahl
egal.
ECheck trennt Einnahmen und den Silbervorrat der Einheiten
und kann so Silbermangel erkennen, da alle Ausgaben außer der Ernährung
vor sämtlichen Einnahmen stattfinden.
- Einheiten, die ein Schiff verlassen und das Kommando innehatten,
übergeben es an die erste Einheit in der Zugvorlage, die auf dem Schiff
ist. Ebenso bekommen Einheiten, die als erste ein Schiff betreten, daß
Kommando darüber (was natürlich falsch sein kann, wenn das Schiff von
einer anderen Partei gesteuert wird).
Sicherer ist der Befehl GIB einheit KOMMANDO, der das Kommando
auch an fremde Einheiten übergeben kann. Außerdem kann man damit auch
das Kommando von Gebäuden übergeben und somit bei unterhaltspflichtigen
Gebäuden sicherstellen, daß das Silber von der richtigen Einheit
abgezogen wird.
- Einheiten mit NACH und FAHRE (und passendem
TRANSPORTIERE) werden getestet und deren Silber wechselt die
Region.
- Schiffsbewegung, also Einheiten, die auf einem Schiff sind, welches sich
bewegt, soweit möglich.
- Test, ob Lehrer- oder Schgüler-Einheiten nicht leer sind
- Test, ob Lehrer noch Plätze frei haben bzw. Schüler noch Lehrer
gebrauchen könnten. Dies ist erst ab Warning-Level 5 aktiviert.
Was ECheck nicht kann
ECheck hat nur wenige Daten über die Einheiten und die Partei. Daraus ergibt
sich, daß folgende Tests in der Regel nicht möglich sind:
- hat die Einheit genug Geld und Personen?
ECheck liest die Anzahl Personen einer Einheit und deren Silbervorrat aus
der Befehlsvorlage und berücksichtigt dies. Da alle Ausgaben vor Einnahmen
gemacht werden, ist dieser Test nur so lange sicher, wie nicht Silber von
anderen Parteien bekommen und verplant wird.
Der wirkliche Verdienst z.B. von UNTERHALTE kann nicht
berücksichtigt werden, weil ECheck keine Informationen hat, welches Talent
die Einheit hat und wieviel Silber zu verdienen ist. Dies führt vor allem
bei knapper Kalkulation ("von der Hand in den Mund") zu Warnungen wegen
Silbermangel.
Abhilfe schafft hier ein kleiner Trick: hinter UNTERHALTE und
TREIBE kann man einen Silberbetrag angeben. Dies wird von ECheck
und vom Server berücksichtigt.
Weiß man also z.B., daß man mit einer Einheit 6000 Silber durch
Steuereintreiben verdient, so schreibt man einfach TREIBE 6000 in
die Befehlsdatei, und schon stimmt es wieder.
- hat die Einheit das passende Talent und Gegenstände?
Bei MACHE und anderen Befehlen kann ECheck nicht wissen, ob die
Einheit überhaupt das passenden Talent hat und ihre Vorräte an Eisen, Holz,
Steinen usw. reichen.
- klappt die Bewegung?
ECheck weiß nichts von Pferden, Straßen und der Karte der Umgebung. Darum
kann ECheck bei NACH, ROUTE usw. nicht testen, ob die
Bewegung wie gewünscht klappen kann.
ECheck prüft unter Eressea bei ROUTE, ob diese zyklisch verläuft
und warnt, wenn eine Route mit PAUSE beginnt.
- genauere Tests zu Zaubern.
Bei Eressea werden die optionalen Parameter REGION x y und
STUFE n zwar syntaktisch überprüft, aber ECheck weiß nicht, welche
Zauber welche Parameter erlauben; hier obliegt es dem Spieler, entsprechend
vorsichtig zu handeln.
Dadurch, daß ECheck keine wirklichen Einheiten-Daten hat, kann es also zu
Fehlermeldungen kommen, die letztlich keine sind.
Der Silberpool-Modus (Option -l) ist nur bedingt anwendbar: Einheiten
auf Schiffen, die von einer anderen Partei gesteuert werden, werden nicht aus
der Region bewegt (weil deren Ziel nicht bekannt ist), ebenso passiert dies
z.B. bei magischer Bewegung oder Bewegung in besondere Richtungen.
Von Spenden (HELFE SILBER) und Silber-Übergaben (GIB xxx yyy
SILBER) anderer Parteien hat ECheck natürlich nicht die blasseste
Ahnung. Daher sind hier Warnungen vorprogrammiert.
Auch der DEFAULT-Befehl kann zu Effekten führen, die als Fehler
angemerkt werden, obwohl sie keine sind.
Einige der oben genannten Effekte lassen sich aber mit den Meta-Befehlen eingrenzen.
Aufruf
ECheck [-<Optionen>] Zugdatei
Optionen:
- -
-
Verwendet stdin anstelle einer Eingabedatei.
- -b
-
unterdrückt Warnungen und Fehler (brief)
- -q
-
unterdrückt sonstige Ausgaben (quiet)
- -rnnn
-
Legt Rekrutierungskosten auf nnn Silber fest
- -c
-
schreibt die Warnungen und Fehler in einer Compiler-ähnlichen Form
- -e
-
schreibt die geprüfte Datei auf stdout (echo), Fehler nach stderr
- -E
-
schreibt die geprüfte Datei auf stdout (echo), Fehler auch nach stdout
- -h
-
zeigt diese kleine Hilfe an (help)
- -s
-
verwendet stderr für Warnungen, Fehler etc., kein stdout
- -p
-
(zusammen mit -e) generiert eine "Piping-taugliche" Ausgabe: von
Gegenständen, Tränken und Kräutern wird nur der erste Teil des Namens
ausgegeben.
Dies ist für den DEFAULT-Befehl notwendig, wenn die Ausgabe von
ECheck als Eingabe eines weiteren ECheck-Laufes benutzt wird. Dies geht
nicht bei Zaubern, da dort das erste Wort nicht eindeutig ist!
- -n
-
zählt Zeilen mit NameMe-Kommentaren (;;) nicht mit
- -m
-
Empiria-Checking
Vorsicht Im Empiria-Modus akzeptiert ECheck trotzdem Umlaute! Dies
ist technisch nicht ohne erheblichen Aufwand zu ändern.
- -l
-
Silberpool-Modus: fehlendes Silber wird aus der Region geholt (nicht im
Empiria-Modus)
- -noship
- Keine Warnungen "Einheit will Schiff bewegen und hat
evlt. kein Kommando"
- -nolost
- Keine Warnungen "Einheit verliert Silber und evtl.
Gegenstände
- -noroute
- Keine Warnungen "ROUTE ist kein Kreis"
- -w[n]
-
Warnung der Stufe n (default: 4)
Die Warning-Levels:
- - es werden keine Warnungen ausgegeben
- - Syntaktische Fehler
- - fehlende Texte, Anzahl/Nummer fehlt, langer Befehl fehlt,
logische Fehler (LEHRE ohne LERNE usw.)
- - zu wenig Geld/Silber/Personen bei Einheiten, zu wenig Silber in
Regionen, kein Kommando usw.
- - "Vorsichtshalber"; Warnungen, bei denen auch ECheck nicht
sicher sein kann
- Lehrer/Schüler-Check
- -x
-
Normalerweise beginnt ECheck die Zeilenzählung am Anfang der Datei.
Benutzt man -x, so beginnt ECheck bei PARTEI.
- -Ppfad
-
Pfadangabe für die Dateien items.txt und zauber.txt.
Normalerweise sucht ECheck im aktuellen Verzeichnis. Endet der Pfad nicht
auf /, \ oder :, wird ein / angehängt.
- -vMainversion.Level
-
Da viele Spieler zum Teil völlig veraltete ECheck-Versionen benutzen,
wurde hier ein Mechanismus entwickelt, der die Spieler darauf
hinweist.
In der Zugvorlage des Servers wird immer die aktuelle ECheck-Version
benutzt.
Beispiele:
- echeck -r80 Zug
-
Testet die Datei Zug. Die Rekrutierungskosten sind auf 80
Silber festgelegt.
- echeck -c -e Zug >mailzug
-
Testet die Datei "Zug". Die Fehlermeldungen werden Compiler-ähnlich
ausgegeben, und die getestete Datei wird nach mailzug
geschrieben.
Umgebungsvariablen
ECheck liest direkt nach dem Start die Umgebungsvariable ECHECKOPTS,
in der alle Optionen angegeben werden können. Beispiel:
setenv ECHECKOPTS "-P/usr/local/echeck -l -r75"
Eingaben in der Zugdatei
Die meisten Optionen können auch in der Zugdatei angegeben werden. Dazu muß
vor dem ersten REGION der Zugdatei eine Kommentarzeile stehen,
die die Optionen enthält. Zur Erkennung muß diese Zeile mit dem Wort ECHECK
beginnen:
; ECHECK -r80 -w2
Gesperrt sind die Optionen -e, -E, -P, -s,
-h und -?.
Man kann außerdem direkt nach dieser Zeile eine "Version" der Züge angeben.
Diese Zeile wird komplett auf den Bildschirm ausgegeben und ist somit auch
in der Zugbestätigung vom Server:
; VERSION .....
oder
; ECHECK VERSION .....
In Eressea beendet das Ende der Zeile einen Befehl. Damit man längere
Befehlszeilen eingeben kann ohne daß z.B. das Mailprogramm falsch Umbrüche
einbaut, erkennt ECheck den Backslash \ als "Zeilenverlängerer".
Dies funktioniert auch im Empiria-Modus, doch nicht in Empiria selbst!
Ebenso erkennt ECheck nicht-eindeutige Abkürzungen nicht "korrekt" bzw. wie
der Empiria-Server. Es sei jedem Spieler empfohlen, seine Befehle nur eindeutig
abzukürzen, zumal ich BEN E "Lehrer" und G 76 7 J deutlich
schwieriger zu lesen finde als Benenne Einheit "Lehrer" und Gib
76 7 Juwelen...
Zu guter letzt gibt es einige "Meta-Kommandos" für ECheck. Diese Kommandos
werden hinter dem Kommentar-Befehl // oder einem ; am
Zeilenanfang gegeben.
- ECHECK NACH x y
- Hier kann man angeben, wohin eine Einheit z.B. auf einem Schiff einer
anderen Partei befördert wird. ECheck berücksichtigt dies.
- ECHECK ROUTE
- Hiermit wird das "noroute"-Flag gewechselt. Hat ECheck also
nicht-zyklische ROUTEn zuvor angemerkt, tut es das nach ECHECK
ROUTE nicht mehr. Ein weiteres ECHECK ROUTE schaltet
die Warnungen dann wieder an.
- ECHECK KOMMANDO [nummer]
- Die Einheit bekommt das Kommando über das Schiff, auf dem sie ist oder
Schiff nummer. Dadurch unterbleibt die "hat kein
Kommando"-Warnung.
- ECHECK EMPTY
- Der Einheit wird alles Silber genommen. Dadurch unterbleibt die
"verliert Silber"-Warnung, wenn die Einheit alle Personen abgibt.
- ECHECK silberbetrag
- Der Region der Einheit wird der entsprechende Betrag als zum
Silbervorrat addiert. So kann man z.B. für Botschafter, die von einer
anderen Partei mit HELFE SILBER ernährt werden, die Warnung
vermeiden.
- ECHECK LOHN silberbetrag
- Hiermit kann man festlegen, wieviel Silber in einer Region mit
ARBEITE verdient werden kann. Die Zugvorlage des Servers
enthält dies automatisch. Dieses Meta-Kommando muß zwischen
REGION und dem ersten EINHEIT stehen.
- ECHECK NOWARN
- schaltet direkte Warnungen für die kommende Zeile ab. "Indiirekte
Warnungen" wie z.B. zu wenig Silber, Lehrer/Schüler-Check werden
hiervon nich beeinflußt.
Ein "Testergebnis"
Folgende Befehle werden z.B. eingeschickt. Ich habe die Fehler darin einmal
mit einem Kommentar versehen.
PARTEI 123 "EinsZweiDrei"
; ECHECK -l -w4 -r100
REGION 9,10 ; Ger Mani
EINHEIT 9234; Herr Müller [1,0$]
Unterhalte
Gib 4800 1 Person
EINHEIT 7530; Frau Müller und Sohn [2,60$]
Lerne Unterhaltung
EINHEIT 1886; Alfred E. Neumann [1,0$]
Unterhalte
EINHEIT 1359; Ein Bauer [1,0$]
Lere 1234 5678 Temp 77 ; Tippfehler: LEHRE
Betrete Burg 444
EINHEIT 5045; Handelsvertreter [1,110$]
Lerne Uterhaltung ; Tippfehler: UNTERHALTUNG
Gib 3651 1000 Silber ; Soviel Silber hat die Einheit nicht
Betrete Burg 444
REGION 6,10 ; Schubidu
EINHEIT 4306; Wanderer [1,110$]
Nach Westen
REGION 1,10 ; Irgendwo
EINHEIT 3219; Kräuterfrau [1,0$] ; Einheit hat kein Silber
Mache Kräuter
EINHEIT 9347; Bote [1,$30] ; Einheit hat genug Silber für beide,
Nach Süedosten ; doch sie verläßt die Region
NAECHSTER
So sähe die Rückmeldung des Serves aus:
ECHECK (Version 3.3.0, Apr 12 2000), Zug-Checker für Eressea - Freeware!
Verarbeite Datei `name@email.de,0'.
Der Dateiname ist die eMail-Adresse des Absenders, die Zahl hinter dem Komma
gibt an, wieviele Züge von der Adresse schon eingetroffen sind.
Rekrutierungskosten auf 100 Silber gesetzt, Warning Level 4.
Silberpool aktiviert.
Fehler in Zeile 17: Befehl nicht erkannt.
`Lere 1234 5678 Temp 77'
Warnung zur Zeile 16: Einheit 1359 hat keinen langen Befehl bekommen.
`EINHEIT 1359; Ein Bauer [1,0$]'
Dies ist ein Folgefehler. Der falsche Befehl Lere, der natürlich
Lehre sein sollte, ist so kein langer Befehl. Darum diese Meldung.
Fehler in Zeile 20: Talent nicht erkannt.
`Lerne Uterhaltung'
Hier stimmt zwar das Talent nicht, aber der Befehl Lerne ist richtig
geschrieben und wird als langer Befehl vermerkt.
Warnung zur Zeile 21: Einheit 5045 hat evtl. zu wenig Silber.
`Gib 3651 1000 Silber'
Man beachte das evtl.. Es könnte ja sein, daß die Einheit von einer
anderen Partei Silber bekommt (wobei auch das schiefgehen könnte, wenn diese
fremde Einheit später als die eigene Einheit drankommt...). Bekommt die
Einheit von einer anderen Partei z.B. 800 Silber, kann man dies mit dem
Meta-Befehl ; ECHECK: 800 "vermerken".
Warnung zur Zeile 30: Das Silber in Irgendwo (1,10) reicht evtl. nicht zum
Leben; es fehlen 10 Silber.
Auch hier evtl., denn eine fremde Partei könnte auch hier mit Silber
aushelfen oder man verdient selber mehr Geld, als ECheck annimmt.
ECheck versucht nach bestem Wissen, die Einheiten auf Schiffen zu bewegen.
Dies geht natürlich nur, wenn eine eigene Einheit das Schiff bewegt.
Einheiten, die auf fremden Schiffen sind, bleiben für ECheck an Ort und
Stelle, so auch deren Silber.
Man kann aber mit dem Meta-Befehl
; ECHECK NACH x y dafür sorgen, daß die Einheit
in die Region x,y verschoben wird und so ECheck ggf. genug Silber in der
Region vorfindet.
Warnung zur Zeile 19: Einheit 5045 hat -900 Silber
Dies ist eine weitere Meldung zum
Gib 36512 1000 Silber. Die Einheit hat
110 Silber, davon braucht sie 10 Silber zur Ernährung, kann also
100 Silber weggeben. Es fehlen also besagte 900 Silber.
Es wurden Befehle für 1 Partei und 7 Einheiten gelesen.
Es wurden 2 Fehler und 4 Warnungen entdeckt.
Meldet ECheck eine Region als Region (also kein Name), so ist keine
Einheit dort vertreten, reist aber dorthin (NACH-Befehl). Da ECheck
die Namen der Region aus der Zugvorlage liest, kennt es den Namen der Region
darum nicht.
Sonstiges
Wer Fehler in ECheck findet, schicke mir bitte eine
Mail
mit Versionsnummer und die Befehlsdatei (zumindest die Ausschnitte, die den
Fehler hervorriefen) oder einer möglichst genauen Beschreibung, wo der Fehler
auftrat.
ECheck sollte auf allen Systemen ohne Probleme zu compilieren sein.
Beispielaufruf mit dem gcc:
gcc -s -O2 -o echeck echeck.c
Probleme mit Umlauten können ggf. durch -DUMLAUTE umgangen werden, da
dann eigene Routinen benutzt werden.
ECheck kann hier per Download oder
eMail-Versand in verschiedenen Formaten bekommen werden.