Magellan: Workshop Erweiterte Befehle

Hier können nach Lust und Laune über alles außerhalb von Fantasya geschrieben werden.
Benutzeravatar
nemo
Heerführer
Beiträge: 232
Registriert: Mi 25. Feb 2015, 12:06

Magellan: Workshop Erweiterte Befehle

Beitrag von nemo » So 21. Feb 2016, 04:23

Moin!

Anfang des Jahres hat die Webseite dichtgemacht, die ich als Referenz für die erweiterten Befehle unter Magellan verwendet habe. Blöd genug, zumal die schon schwer genug zu finden war, mir das Leben in Fantasya aber um einiges erleichtert hat (netto 2000 selbstbestätigende Einheiten von ca. 2600).

Und da wir ja nun ein paar Neuzugänge haben (und ich selber bisher auch nur die Spitze des Eisbergs ankratzen konnte): Wie wäre es, wenn wir alle ein wenig Wissen zsammen schmeißen würden?

Selber beisteuern kann ich Allgemeines zur Anwendung, Syntax und einige Abfragen und Anweisungen. Sobald es um Spezielleres (und Sachen, die ich vor dem Shutdown nicht entdeckt und ausprobiert habe (nicht alles, was dort dokumentiert war, scheint bei Hamilcars FMagellan zu funktionieren...oder die Seite war überaltert ;) )) geht, bin ich selber ein Fass voller Fragen.

Daher die Anfrage an die Mitspieler: Besteht Bedarf an einer Einweisung dazu, wie man die Erweiterten Befehle (extended commands, Skripte) unter die Hufe bekommt? Wer würde etwas beisteuern wollen? Und an die Forenleitung: Würdet Ihr entsprechende Beiträge sammeln, sortieren und zentral unterbringen?


Gruß
nemo
I may go pop -- Excuse me!

Benutzeravatar
Thalian
Administrator
Beiträge: 595
Registriert: Mo 5. Jan 2015, 14:25
Kontaktdaten:

Re: Magellan: Workshop Erweiterte Befehle

Beitrag von Thalian » So 21. Feb 2016, 12:36

Hi nemo,
nemo hat geschrieben:Anfang des Jahres hat die Webseite dichtgemacht, die ich als Referenz für die erweiterten Befehle unter Magellan verwendet habe. Blöd genug, zumal die schon schwer genug zu finden war, mir das Leben in Fantasya aber um einiges erleichtert hat
schau doch mal, ob Du die Seite hier archiviert findest: https://archive.org/web/

Benutzeravatar
Araloth
Hauptmann
Beiträge: 53
Registriert: Di 10. Nov 2015, 11:53

Re: Magellan: Workshop Erweiterte Befehle

Beitrag von Araloth » So 21. Feb 2016, 12:52

Tach Nemo,

die Idee uns "Neue" an eurem Wissen teilhaben zu lassen, finde ich sehr positiv.
Ich wusste bis jetzt gar nicht, dass es die Möglichkeit gibt, mit Skripten zu arbeiten - daher bin ich natürlich sehr daran interessiert.
Bis jetzt (circa 120 Einheiten) komm ich noch ganz gut so zu Rande, man kann sich aber schon vorstellen, dass dies irgendwann mal ausufern könnte. ;)

Benutzeravatar
nemo
Heerführer
Beiträge: 232
Registriert: Mi 25. Feb 2015, 12:06

Re: Magellan: Workshop Erweiterte Befehle

Beitrag von nemo » So 21. Feb 2016, 14:23

@Thalian: Vielen Dank für den Hinweis!
magellan.log-out.net hat archiviert, sehr nützlich.

Für alle mal: Die Seite mit den Beispielbefehlen: https://web.archive.org/web/20080923073 ... les_de.php (ACHTUNG: Nicht alles da funktioniert bei FMagellan – Einige Items gibt es bei Fantasya nicht, anderes wird anders abgefragt. Mehr dazu im nächsten Beitrag.)

Leider war ich so dämlich, die vollständige Dokumentation voreilig aus meinen Lesezeichen zu löschen, die Suche wird länger dauern.

@Araloth: Ja, das wird sehr schnell sehr fummelig, wenn man gar keine Tools verwendet. Ich benutze Forlage und Skripte und kann eigentlich nur raten, so früh wie möglich damit anzufangen, zumindest verschiedenes durchzuprobieren – das erst später einzupflegen (bzw. sich da dann auch noch einzulernen) bedeutet einen Haufen Arbeit (der sich zwar lohnt, aber: Früh übt sich halt :D ).

Wer ich im nächsten Beitrag mal anfangen, die Grundlagen vorzustellen.

LG
nemo
I may go pop -- Excuse me!

Benutzeravatar
nemo
Heerführer
Beiträge: 232
Registriert: Mi 25. Feb 2015, 12:06

Magellan - Workshop Erweiterte Befehle #1

Beitrag von nemo » So 21. Feb 2016, 16:43

(Mit Screenhots)

Ganz ganz vorweg: Da ich keine Ahnung habe, wie die Kenntnisstände aussehen, gehe ich einfach von einem Minimum aus und erkläre alles, womit ich vor einem Jahr selber nichts anfangen konnte – da ich aber eben selber bloß Laie bin, kann ich nicht ausschließen, von den Hintergrundsachverhalten Dinge falsch verstanden zu haben, bei allem anderen Stütze ich mich auf das, was nach meiner Erfahrung funktioniert.

Und noch eine Anmerkung zur bei Magellan eingebauten "Hilfe" für das Thema: Bei mir jedenfalls ist die nichts weniger, als hilfreich, weil die entsprechenden Dokumente leer sind oder nicht mehr existieren.

Grundlagen

Die erweiterten Befehle (Skripte) sind eine von mehreren Möglichkeiten (neben Vorlage und Forlage), automatisch Befehle für Einheiten zu generieren, Routineaufgaben erledigen zu lassen oder längerfristig geplante Vorgänge am Laufen zu halten. Jedes Tool hat seine eigenen Vor- und Nachteile. Skripte werden programmiert, haben keine Ähnlichkeit mit der Anweisungssprache von Fantasya und erfordern ein zusätzliches Tab im Magellan-Desktop -- dafür macht es ihnen nichts aus, wenn man mal einen Zug verpasst hat und mit genug Kenntnissen kann man angeblich nahezu alles programmieren (inklusive einer künstlich-intelligent laufenden Partei auf Autopilot(?)).

Die Programmiersprache ist der Java-Ableger Beanshell, zu dem sich dort eine Dokumentation (auf Englisch) findet: http://www.beanshell.org/manual/contents.html

Technisches:
Die Erweiterten Befehle werden für Container gegeben und gespeichert. Die wichtigsten Container sind World, die Parteien, Regionen, Gebäude, Schiffe und Einheiten. (Verbessere mich jemand, wenn ich hier stuss erzähle)

Alles, was man unter erweiterte Befehle eingibt, wird in einem XML-Dokument gespeichert. Dieses finde man im FMagellan-Ordner in einem Unterordner namens "default" mit dem Dateinamen "extendedcommands". Ist ganz nützlich, wenn man großflächigere Löschungen anstehen und man nicht alles einzeln raussuchen will.
(allerdings sollte man dann vorher ein Backup machen.)
Noch viel Praktischer ist es allerdings, um mit den Fehlermeldungen abreiten zu können. Wenn diese nämlich Textkoordinaten (Position) angeben, ist das auf genau dieses Dokument bezogen.

Aufruf:
Um die erweiterten Befehle schreiben, verwenden und verändern zu können, braucht man das entsprechende Tab auf dem Magellan-Desktop. Dieses lässt sich öffnen über das Menü "Desktop-Erweiterte Befehle" oder über "Plugins-Erweiterte Befehle-Bibliothek bearbeiten"
Aufruf2.jpg
Aufruf2.jpg (88 KiB) 3307 mal betrachtet
Das dann irgendwo auf dem Desktop auftauchende Tab kann man per Drag and Drop am Kartenreiter an eine Stelle schieben, wo es einem passt (Ich hab es neben dem Detail-Reiter am rechten Rand, aber das ist reine Geschmackssache).

Das Interface
Der Arbeitsbereich unterteilt sich in den Kopf mit verschiedenen Buttons, den Hauptbereich mit den Unterreitern, in denen die Textfelder für die Skripte sich befinden, und den Fußbereich.
Interface.jpg
Interface.jpg (32.56 KiB) 3307 mal betrachtet
..Die Buttons:
..."Öffnen": Öffnet einen Unterreiter für den Container, der in der Übersicht gerade (blau) markiert ist.
..."Ausführen": Löscht den Text im geöffneten Textfeld. Ist ein Bug. Lasst die Finger von diesem Button.
..."Speichern": Speichert den Text in dem Textfeld, das man gerade im Fokus hat.
..."Alles speichern": Speichert den Text in allen Textfeldern, die gerade offen sind.

..Der Hauptbereich: Ist eigentlich selbsterklärend: In verschiedenen Unterreitern werden die Skripte der verschiedenen Container dargestellt und können bearbeitet werden.

..Der Fubereich:
..."Priorität": Hier lässt sich grob die Reihenfolge einstellen, in der die erweiterten Befehle bei der Ausführung abgearbeitet werden. Container mit höherer Priorität werden vor Containern mit niedrigerer Priorität abgearbeitet. Das kann zB nützlich sein, wenn man erreichen will, dass Partei- oder Regionsweit kurze Befehle hinzugefügt werden.
..."Element": Gibt an, welcher Container gerade offen ist.
..."Position": Gibt an, wo im gerade offenen Textfeld der Cursor sich befindet. Bedingt hilfreich (die Fehlermeldungen benutzen leider ein anderes Koordinatensystem)

Ausführung
Bei der Ausführung der Skripte gibt es zwei Möglichkeiten: Man kann alles ausführen lassen, oder nur die für einen einzelnen Contaier.

Um nur die Skripte eines einzelnen Containers auszuführen, muss dieser in der Übersicht markiert sein. Dann rechtklick, Contextmenü "Erweiterte Befehle-Führe alle Befehle für <n> aus".
Einzelausfuehrung.jpg
Einzelausfuehrung.jpg (189.84 KiB) 3307 mal betrachtet
Die Bibliothek
HIer werden die Funktionen gespeichert, also die Skripte, die dann von den Containern aufgerufen werden können (sodass man nicht für wiederkehrende Aufgaben 200 mal den selben Dreißigzeilentextblock durchkopieren muss (Fehlermultiplikation!), sondern bloß eine Zeile – und eventuelle Skriptfehler zentral beheben kann.
Auf jeden Fall muss (?) folgendes in der Bibliothek stehen, damit überhaupt etwas an den erweiterten Befehlen Funktioniert:

Code: Alles auswählen

import magellan.client.*;
import magellan.client.extern.*;
import magellan.library.*;
import magellan.library.rules.*;
import magellan.plugin.extendedcommands.*;
Die Allgemeine Form der Funktionen ist:
("<" und ">" schließen bloß Platzhalter ein und gehören nicht wirklich zum Code (außer als mathematische Vergleichsoperatoren))

<name>(<Klasse> <variable1>, <Klasse> <variable2>, <etc.>) {
<Befehle> }

In den Containern aufgerunfen werden sie mit

<name>(<variable1>, <variable2>, <etc.>);

Ein erstes Beispiel mit Erläuterungen

Eine Funktion, die in der Bibliothek stehen würde ist etwa:

Code: Alles auswählen

lernen(Unit unit, String skill, int ziel, String nextOrder)
{
if (helper.getLevel(unit,""+skill+"") < ziel)
 {unit.setOrdersConfirmed(true);}
else
 {
 helper.setOrder(unit,"; +++Skript kann raus+++");
 helper.addOrder(unit,""+nextOrder+"");
 unit.setOrdersConfirmed(false);
 }
helper.addOrder(unit,"; extdcmd: lernen: "+skill+" "+ziel+"");
}
(Ja, normalerweise setzt man die geschweiften Klammern anders, aber so ist es für mich übersichtlicher.)
Was tut das Skript: Es überprüft, ob ein Talentwert unter einem bestimmten Wert liegt und bestätigt die Einheit, wenn dies der Fall ist. Weder sagt es der Einheit, was sie zu tun hat (das mache ich per Hand oder überlasse es Forlage), noch ordnet es Lehrer und Schüler einander zu. Der Sinn ist, sich mit einer Einheit nicht beschäftigen zu müssen, bis sie das kann, was sie können soll.

Um das Skript anzuwenden, ist die Einheit zu öffnen, die es ausführen soll, und dann zum Beispiel mit

lernen(unit, "Magie", 22, "GIB Bauern 100 PERSONEN");

aufzurufen.
Der Reihe nach:
"lernen": der Name der Funktion. Schreibe ich immer vorne klein. Keine Ahnung, ob das notwendig ist.

"(Unit unit, String skill, int ziel, String nextOrder)": Die Variablen-Deklaration; Immer in Klammern, immer ohne Leerzeichen davor, imer gefolgt von geschweifter Klammer (die anzeigt, dass der Befehlsteil losgeht – entsprechend wird die Funktion auch mit einer geschweiften Klammer geschlossen).

"Unit unit": Unit ist eine Klasse (darum groß gechrieben", unit der Name der Variable. Die deklariere ich grundsätzlich immer als erstes. Wieder, ohne zu wissen, ob das wirklich notwendig ist, aber es funktioniert (die Variable selbst kann man natürlich nennen, wie man will).

"String skill": String ist die Klasse Zeichenfolge und eher eine Notlösung, weil ich nicht weiß, ob es eine Klasse für die Talente gibt. Funktioniert jedenfalls, solange man beim Aufruf an die Anführungszeichen denkt. Und das Talent richtig schreibt. (Beim Aufruf zB "Uunterhaltung" zu übergeben, würde zu keiner Fehlermeldung führen, sondern einfach nur dazu führen, dass Uunterhaltung, statt Unterhaltung überprüft wird.)

"int ziel": Klasse ist Integer, also ganze Zahlen. Gibt an, bei welchem Talentwert von "skill" die Einheit unbestätigt sein soll.

"String nextOrder": Wenn man schon weiß, was die Einheit tun soll, wenn sie mit lernen fertig ist. Wenn nicht, kann man beim Aufruf einfach "" an der Stelle setzen (die Stelle ganz leer zu lasen, würde zu einem Fehler führen).

helper.getLevel(unit,""+skill+""): unit und skill sind die Variablen. Die Anführungszeichen kommen so zu stande: .getLevel() erwartet einen String, man könnte also auch helper.getLevel(unit,"Unterhaltung") schreiben und alles wäre gut, wenn die Einheit auf Unterhaltung geprüft werden soll. Da das Skript aber für alle Talente gehen soll, wird die Variable eingefügt, wofür "++" als Rahmung notwendig ist.

unit.setOrdersConfirmed(true); : Das ist der eigentliche Befehl, nämlich, dass die Einheit bestätigt werden soll, und zwar unter der Bedingung dass der Talentwert von skill kleiner als ziel ist. Die Bedingung hinter dem if ist immer in Klammern, der Befehlsblock immer in geschweiften Klammern und jede Befehlszeile wird mit Semikolon beendet.

else: also dann, wenn der Talentwert von skill nicht kleiner als ziel (also gleich oder größer) ist.

helper.setOrder(unit,"; +++Skript kann raus+++");
helper.addOrder(unit,""+nextOrder+"");
unit.setOrdersConfirmed(false);

HIer ist ein wichtiger Unterschied zu beachten: setOrder(unit,""+befehl+"") löscht alle Befehle der Einheit und schreibt eine neue Befehlszeile, addOrder(unit,""+befehl+"") hingegen behält den Befehlsblock der Einheit bei und fügt lediglich eine Zeile an. In beiden Fällen kann es sich um einen Fantasya-Befehl oder auch um einen Kommentar handeln, mit // und ; im Befehlsstring kommt das Programm problemlos klar.

unit.setOrdersConfirmed(false) ist das Gegenstück zu unit.setOrdersConfirmed(true). Warum habe ich das extra eingebaut: Weil nicht auszuschließen ist, dass die Einheit durch irgendein anderes Skript doch schon bestätigt ist und in dem Fall wird sie dann eben wieder auf unbestätigt gesetzt, ansonsten passiert nichts.

Und zuletzt noch zu den Ressourcen
In den Beispielbefehlen von log-out.net ist an einer Stelle von

unit.getRegion().getHorses()

die Rede. Dies wird nicht funktionieren. Weil bei FMagellan sämtliche Tiere, Bäume, Eisen, Steine und Gold unter

helper.getResourceAmount(""+resource+"")

subsummiert ist, und zwar mit den deutschen Bezeichnungen. Funktioniert also mit: Pferd, Kamel, Elefant, Alpaka, Zotte, Mastodon, Holz, Eisen, Stein, Gold. (die je für "+resource+" einzusetzen sind)

Für Regionssilber hingegen fukntioniert

unit,getRegion().getSilver()

, spuckt dann aber das Altsilber aus, also die Menge, die ohne den voraussichtlichen Verdienst der Bauern in der aktuellen Runde vorhanden ist.

Die anzahl der bauern erreicht man mit
unit. getRegion().getPeasants()

Die anzahl der rekruten mit
unit. getRegion().getPeasants() / 20
Zuletzt geändert von nemo am Do 31. Mär 2016, 18:59, insgesamt 3-mal geändert.
I may go pop -- Excuse me!

Benutzeravatar
Kombinat
Oberst
Beiträge: 140
Registriert: Mo 26. Jan 2015, 21:48

Re: Magellan: Workshop Erweiterte Befehle

Beitrag von Kombinat » Sa 27. Feb 2016, 15:50

Super Sache. Ich nutze aktuell ja Forlage, bzw. Vorlage (bei Eressea) , da wäre das aus Optimierungsgründen gar nicht schlecht wenn ich mir das mal angucken würde, was ich auch machen werde, danke für die Mühe :)

Tsaria
Hauptmann
Beiträge: 50
Registriert: Mi 16. Mär 2016, 11:11
Wohnort: Kassel

Re: Magellan: Workshop Erweiterte Befehle

Beitrag von Tsaria » Di 22. Mär 2016, 15:21

Kurze Frage, gibt es irgendwo eine Liste der fields und methods von extended cmds?

Und nachdem ich mich durch den sourcecode gegruschelt habe, hier ein erstes Ergebnis Forlage meets extended commands:

Code: Alles auswählen

String metaPrefix = "/" + "/ #";

for (Region region : world.regions().values()) {
	for (Unit unit : region.units()) {		
		for (String befehl : unit.getOrders()){
			if (befehl.startsWith(metaPrefix)) {
				metaBefehlsListe = new ArrayList();
				if (befehl.contains("#immer")) {
					befehl = befehl.substring(befehl.indexOf("#immer ")+7);
					while (befehl.contains(":")) {
						metaBefehlsListe.add(befehl.substring(0, befehl.indexOf(":")).trim());
						befehl = befehl.substring(befehl.indexOf(":")+1);
					}
					metaBefehlsListe.add(befehl.trim());
				}
				unit.addOrders(metaBefehlsListe);
			}
		}
	}
}
Dieses kurze Stück code dupliziert die Funktionalität des #immer Metabefehls von Forlage. Mir wäre da eure Rückmeldung recht, ob es Interesse daran gibt, bevor ich weitermache.

Meine Idee dahinter ist es, die wundervolle Arbeit von Georg in extended commands zu übertragen, so das ihre Funktionalität komplett aus Magellan nutzbar ist, ohne vorher erst Forlage aufrufen zu müssen. So nach und nach will ich darauf basierend eine Funktionsbibliothek anlegen, die die Vorteile der diversen Verbesserungen miteinander integriert. Was denkt ihr?
Zuletzt geändert von Tsaria am Mi 23. Mär 2016, 21:12, insgesamt 2-mal geändert.

Benutzeravatar
Thalian
Administrator
Beiträge: 595
Registriert: Mo 5. Jan 2015, 14:25
Kontaktdaten:

Re: Magellan: Workshop Erweiterte Befehle

Beitrag von Thalian » Mi 23. Mär 2016, 21:03

Wenn das mit anderen Forlagebefehlen funktioniert, würde ich das vielleicht sogar nutzen, weil dann alles in Magellan abläuft. Ich probiere die erweiterten Befehle jetzt auch mal aus.

Tsaria
Hauptmann
Beiträge: 50
Registriert: Mi 16. Mär 2016, 11:11
Wohnort: Kassel

Re: Magellan: Workshop Erweiterte Befehle

Beitrag von Tsaria » Do 24. Mär 2016, 09:36

Werd mich über die Osterferien an die restlichen machen.

Benutzeravatar
nemo
Heerführer
Beiträge: 232
Registriert: Mi 25. Feb 2015, 12:06

Re: Magellan: Workshop Erweiterte Befehle

Beitrag von nemo » Do 24. Mär 2016, 10:56

Hi,
interessiert mich, das Projekt.
Ich nutze zur Zeit Forlage und Skripte...und, nunja, Forlage produziert manchmal komische Ergebnisse, das ersetzen zu können, wäre also sehr hilfreich.

Allerdings bin ich von Haus aus kein Techniker und "programmiere" sehr amateurhaft (man lernt halt, was man braucht und findet) :D
Wird sich dann an konkreten Fragen zeigen müssen, wie hilfreich ich sein kann.
Danke schonmal für getOrders(), das mit der Nummer dahinter funktioniert bei mir (auf FMagellan) leider nicht, aber es sieht sehr nützlich aus.

Wo hast Du den sourcecode eigtl. gefunden?

...ich hab mich noch an den E3-PArser erinnert...jede Menge Beispiel-Code, wenn man gerne seziert.
https://wiki.eressea.de/index.php/E3CommandParser

Frohe Ostern
Zuletzt geändert von nemo am Do 24. Mär 2016, 11:03, insgesamt 1-mal geändert.
I may go pop -- Excuse me!

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast