Die Dokumentation von Forlage findet ihr hier.
Aktuelle Version: #auslastung, #magbest, #immer, #next, #mal, #rotate, #forst und #herde.
An roten Funktionen habe ich kompatibilitätsbeeinträchtigende Änderungen vornehmen müssen.
Code: Alles auswählen
import magellan.client.*;
import magellan.client.extern.*;
import magellan.library.*;
import magellan.library.rules.*;
import magellan.plugin.extendedcommands.*;
import java.util.ArrayList;
import java.util.regex.*;
// mOrdersauswertung
String regex = "(?<mPrefix>// #)(?<mOrder>[A-Za-z_]{3,10})\\u0020?(?<mCounter>[\\d]{0,4})\\u0020(?<mCounter2>[\\d]{0,4})\\u0020?(?<mSubOrders>.*$)?";
Pattern p = Pattern.compile(regex);
Matcher m;
int eff = 100;
for (Region region : world.regions().values()) {
for (Unit unit : region.units()) {
int index = 0;
for (String subOrder : unit.getOrders()) {
m = p.matcher(subOrder);
if (m.find()) {
String mPrefix = m.group("mPrefix");
String mOrder = m.group("mOrder");
int mCounter = 0;
if (!(m.group("mCounter").isEmpty()))
mCounter = Integer.parseInt(m.group("mCounter"));
String mSubOrders = m.group("mSubOrders");
ArrayList mOrdersListe = new ArrayList();
switch (mOrder) {
case "auslastung":
eff = mCounter;
break;
case "magbest":
if (!unit.isOrdersConfirmed()) {
unit.setOrdersConfirmed(true);
}
case "immer":
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so.trim());
} else {
mOrdersListe.add(mSubOrders.trim());
}
break;
case "next":
mCounter--;
unit.removeOrderAt(index);
if (mCounter > 0) {
mOrdersListe.add(mPrefix + mOrder + " " + mCounter + " " + mSubOrders);
} else {
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so);
} else {
mOrdersListe.add(mSubOrders);
}
}
break;
case "mal":
mCounter--;
unit.removeOrderAt(index);
if (mCounter > 0) {
mOrdersListe.add(mPrefix + mOrder + " " + mCounter + " " + mSubOrders);
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so);
} else {
mOrdersListe.add(mSubOrders);
}
}
break;
case "rotate":
mCounter++;
String[] mso = mSubOrders.split(":");
int numRotate = mso.length;
if (mCounter > numRotate)
mCounter = 1;
unit.removeOrderAt(index);
mOrdersListe.add(mPrefix + mOrder + " " + mCounter + " " + mSubOrders);
int i = 1;
for (String so : mso) {
if (i == mCounter)
mOrdersListe.add(so);
i++;
}
break;
case "forst":
int rTrees = unit.getRegion()
.getResource(region.data.getRules().getItemType(StringID.create("Holz")))
.getAmount();
int mCounter2 = -1;
if (!(m.group("mCounter2").isEmpty()))
mCounter2 = Integer.parseInt(m.group("mCounter2"));
int uCapWood = helper.getLevel(unit, "Holzfällen") * unit.getPersons();
int fellTrees = 0;
if (mCounter2 > 0) {
if (rTrees > mCounter2) {
if ((mCounter2 - mCounter) > uCapWood) {
fellTrees = uCapWood;
} else {
fellTrees = mCounter2 - mCounter;
}
}
} else {
if (rTrees > mCounter) {
fellTrees = rTrees - mCounter;
}
}
if (fellTrees > 0) {
mOrdersListe.add("MACHE " + fellTrees + " Holz");
} else {
mOrdersListe.add(mSubOrders);
}
break;
case "herde":
String mAnimSO;
String mAnim;
int uCapAnimal = helper.getLevel(unit, "Pferdedressur") * unit.getPersons();
int herdAnimals = 0;
for (String so : mSubOrders.split(":")) {
String animRegex = "(?i)(?<mAnim>pferd|kamel|elefant|zotte|alpaka|mastodon)\\u0020(?<mAnimC1>[\\d]{1,4})\\u0020(?<mAnimC2>[\\d]{1,4})?\\u0020?(?<mAnimSO>.*$)?";
Pattern animP = Pattern.compile(animRegex);
Matcher animM;
animM = animP.matcher(so);
if (animM.find()) {
mAnim = animM.group("mAnim");
int rHerd = unit.getRegion().getResource(region.data.getRules().getItemType(StringID.create(mAnim))).getAmount();
int mAnimC1 = Integer.parseInt(animM.group("mAnimC1"));
int mAnimC2 = (animM.group("mAnimC2") != null) ? Integer.parseInt(animM.group("mAnimC2")) : mAnimC1;
if (rHerd > mAnimC2) {
String s = mAnim.toLowerCase();
int eFactor = (s.contains("elefant") || s.contains("mastodon")) ? 2 : 1;
herdAnimals = Math.min((int)(uCapAnimal/eFactor), rHerd - mAnimC2);
break;
}
}
}
if (herdAnimals > 0) {
mOrdersListe.add("MACHE " + herdAnimals + " " + mAnim);
} else {
mOrdersListe.add(mAnimSO);
}
break;
default:
}
unit.addOrders(mOrdersListe);
}
index++;
}
}
}
#auslastung
Dieser neue Befehl erlaubt euch eine Variable zu setzen, die beeinflußt bei wieviel mindest % Effizienz eure #forst und #herde Metabefehl arbeiten. #auslastung 90 z.B. würde bewirken, das eine 10er Holzfällereinheit mit Holzfällen 2 nur dann arbeitet, wenn sie mindestens 10*2*90% = 18 Holz machen kann.
WIP: Momentan nicht in Funktion. Wird vermutlich noch heftig überarbeitet.
#rotate
sieht bei mir nicht so:
Code: Alles auswählen
// #rotate1 MACHE Holz
// #rotate2 MACHE Speer
// #rotate3 TREIBE
Code: Alles auswählen
// #rotate0 MACHE Holz : MACHE Speer :TREIBE
Will man mehrere Befehle pro Zug ausführen, muß man 2 #rotate benutzen. Z.B.:
Code: Alles auswählen
// #rotate0 MACHE Holz : MACHE Speer :TREIBE
// #rotate0 : : GIB xyz 1 Speer
#forst
berücksichtigt bisher kein Sägewerk, da ich die passende Funktion noch nicht ausgegraben habe.
#herde
Trenner ist : statt |. Hintergrund ist eine von mir beabsichtigte Vereinheitlichung (forlage verwendet überall : um Unterbefehle zu trennen. Wer | verwenden will... einfach das Zeichen im Split austauschen. Ja ich weiß das | hier als "oder" Sinn macht... Wie gesagt, es ist ein Zeichen zu ändern, wenn ihr alle sagt "wir wollen |" dann änder ich es.
SUMMA
Ihr müsst also eure Forlage Befehle evtl. anpassen, und die vollständige Kompatibilität ist leider auch pfutsch. :/ Ich mach das auch nicht gern, aber ohne lokale Speicherung geht vor allem der #rotate nicht anders :/.
Großer Vorteil allerdings: Diese Version kommt eben komplett ohne lokal gespeicherte Daten aus, sprich wenn ihr mal an einem anderen Rechner sitzt, oder euer Magellan wrecked, zieht ihr alle nötigen Infos aus den comments im CR.[/spoiler]