So ganz verstehen tue ich Ralfs Idee nicht.
In den Eressea Befehlen sollen Kommentare stehen, die die ExtCmds dann parst und entsprechend auswertet und daraus dann richtige Eressea Befehle. Korrekt?
Dann ist das eigentlich an meiner Idee der ExtCmds vorbeigedacht. Für mich ist ExtCmds kein Parser für eine BELIEBIGE Einheit, der dann die in der Einheit stehenden Kommandos verarbeitet, sondern genau anders herum. Die ExtCmds produzieren in Abhängigkeit zu einer BESTIMMTEN Einheit die entsprechenden Befehle. Dabei extrahiert ExtCmds mit Hilfe der Magellan API Informationen, die es braucht, um den Befehl zu generieren (mögliche Kapazitäten, Handelsvolumen, Silber, Gegenstände) und erstellt dann einen dazu passenden Befehl.
Wenn man sich die Struktur der XML Datei anschaut, kann man das auch deutlich erkennen. Es gibt immer einen Knoten (Einheit, Region, Schiff, Burg) und daran dann einen Script. Die Bibliothek - die unabhängig von den Befehlen für eine Einheit, Region, ... arbeitet dient nur dazu, sich wiederholende Funktionen/Befehle zu kapseln und so Code-Dopplung zu vermeiden.
ExtCmds ist von der Idee anders aufgestellt als Vorlage. Vorlage verwendet Kommentare aus der Einheit, um sinnvolle Befehle zu erstellen - ganz einfach aus der Notwendigkeit heraus, dass Vorlage gar nicht weiß, was da so drum herum ist (glaube ich). ExtCmds tut dies auf Basis der Umgebungsinformationen von Magellan.
Kommt das verständlich rüber?
Insofern sehe ich nicht, dass es notwendig ist, einen Parser zu bauen, um an einer Einheit klar zu machen, was es wann tun soll - das kann man direkt kodieren.
Um das Beispiel ECU+ beobachteRegion() aufzugreifen, so setze ich das wie folgt um. Erst mal in Worten, dann als Code:
- ich setze an der Einheit, die die Region beobachten soll, eine Funktion
- dann schreibe ich eine Funktion in die Bibliothek
- diese Funktion nimmt die Einheit, prüft, ob sie Silber besitzt und Unterhaltung gelernt hat. Wenn dem so ist, lernt sie Wahrnehmung. Wenn Sie kein Silber besitzt, unterhält sie solange, bis sie wieder 10 Silber besitzt und dann gehts wieder mit Wahrnehmung weiter.
Im Code ist dann wie folgt:
Code:
import magellan.library.*;
import magellan.library.rules.*;
kundschafter(Unit unit, String talent) {
if (!unit.isOrdersConfirmed()) {
if (helper.getItemCount(unit, "Silber") >= 10) {
helper.setOrder(unit, "; --- diese Woche wird gelernt ---");
if (helper.getLevel(unit, "Unterhaltung") < 1) {
helper.addOrder(unit, "LERNEN Unterhaltung");
} else {
helper.addOrder(unit, "LERNEN "+talent);
}
} else {
helper.setOrder(unit, "; --- muss diese Woche unterhalten ---");
if (helper.getLevel(unit, "Unterhaltung") < 1) {
helper.addOrder(unit, "ARBEITEN");
} else {
helper.addOrder(unit, "UNTERHALTEN");
}
}
unit.setOrdersConfirmed(true);
}
}
An der Einheit, die kundschaften soll, setze ich dann nur
Code:
kundschafter(unit,"Wahrnehmung");
Und das letzte ist alles, was ich in die ExtCmds der einzelnen Kundschaftereinheiten reinwerfe. Die Funktion erzeugt dann die Befehle für die Einheit. ExtCmds ist dafür gedacht, Routineaufgaben abzunehmen, also Routen. Handel, Unterhalt zu automatisieren, evtl. Lernen-Lehren zu automatisieren, etc. Aber das war es auch schon. Das System ist dank der Magellan API viel mächtiger - aber mehr brauche ich nicht.
Ich komme damit recht gut klar und kann damit einzelnen Einheiten ausblenden. Wenn man gewarnt werden will, kann man z.B. Schilder in der Woche erstellen lassen, die in Magellan in der Karte angezeigt werden. Das kann man in der Funktion an geeigneter Stelle recht einfach machen.
Code:
...
Sign sign = new Sign("ACHTUNG: Problem...");
unit.getRegion().addSign(sign);
Das alles ist letztlich Java - oder zumindest Java-ähnlich. Das ist eine durchaus legitime weitverbreitete Programmiersprache. Wenn "ich" jetzt anfange, einen Parser zu bauen, der in ExtCmds die Kommentare ausliest, dann muss dafür auch erstmal wieder halbwegs eine EBNF geschrieben werden, dass muss jemand verstehen und dokumentieren. Ähnlich wie bei Vorlage sind einige nicht bereit, sich das anzutun.
Das einzige was ich an ExtCmds im Moment noch verändern will, ist das Verhalten mit den Tabs. Wie Ralf schon sagte, ist das noch suboptimal.
bye
Thoralf