Skip to content

Commit

Permalink
Merge pull request #68 from extremeCrazyCoder/master
Browse files Browse the repository at this point in the history
Div Bugfixes
  • Loading branch information
Torridity committed Dec 16, 2019
2 parents e99bf36 + df0f146 commit b46e925
Show file tree
Hide file tree
Showing 24 changed files with 132 additions and 320 deletions.
2 changes: 1 addition & 1 deletion Core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<parent>
<groupId>de.tor.dswb</groupId>
<artifactId>dsworkbench</artifactId>
<version>3.71</version>
<version>3.72</version>
</parent>

<modelVersion>4.0.0</modelVersion>
Expand Down
5 changes: 4 additions & 1 deletion Core/src/main/java/de/tor/tribes/control/GenericManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,9 @@ public void loadElements(String pFile) {
logger.debug("Failed loading data", ex);
checkValues();
}
if(!valid) {
revalidate(true);
}
}

public void saveElements(String pFile) {
Expand All @@ -490,7 +493,7 @@ public void saveElements(String pFile) {
public abstract Element getExportData(final List<String> pGroupsToExport);

/**
* @return number of imported Elements<br>negativ (-x-1) if failed
* @return number of imported Elements<br>negative (-x-1) if failed
*/
public abstract int importData(Element pElm, String pExtension);
}
99 changes: 73 additions & 26 deletions Core/src/main/java/de/tor/tribes/io/TroopAmountElement.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ public class TroopAmountElement {
private String dynamicAmount = "";
//buffer to speed up
private boolean fixed = false;

private boolean testRun = false;

public TroopAmountElement(UnitHolder pUnit, int pAmount) {
this(pUnit, Integer.toString(pAmount));
Expand All @@ -61,14 +63,15 @@ public final void setDynamicAmount(String pAmount) {
//Try if we can parse this
Object val;
try {
val = parse(pAmount, 0, 0);
testRun = false;
val = parse(pAmount, null, 0);
} catch (Exception e) {
logger.debug("Parser Crashed ", e);
throw new IllegalArgumentException("Parser returned error ", e);
}
if (val instanceof String) {
logger.debug("Can't parse Amount " + (String) val);
throw new IllegalArgumentException("Unable to parse Math");
throw new IllegalArgumentException("Unable to parse first remaining dynamic variable will be most likely the problem: " + val);
}
//ok we can parse look if its fixed
String pAmountLower = pAmount.toLowerCase();
Expand All @@ -78,7 +81,9 @@ public final void setDynamicAmount(String pAmount) {
fixed = false;
dynamicAmount = pAmount;
} else {
val = parse(pAmount, -1, -1);
testRun = true;
val = parse(pAmount, null, -1);
testRun = false;
if (val instanceof Double) {
fixed = true;
dynamicAmount = Integer.toString(((Double) val).intValue());
Expand All @@ -95,17 +100,20 @@ public int getTroopsAmount(Village pVillage) {
logger.error("Tried to read fixed troops from Dynamic amount");
throw new IllegalArgumentException("Tried to read fixed troops from Dynamic amount");
}
int availableAmount = getAvailable(pVillage);
TroopAmountFixed availableAmounts = getAvailable(pVillage);
int availableAmount = (availableAmounts != null)?(availableAmounts.getAmountForUnit(unit)):(0);

int fakeMinAmount = 0;
if(pVillage != null) {
//amount nedds to rounded down so we can simply use int Calculation
fakeMinAmount = pVillage.getPoints() * ServerSettings.getSingleton().getFakeLimitPercent() / 100;
if(fakeMinAmount == 0) fakeMinAmount = 1; //there is at least 1 one needed even on servers without Fake Limit
}

Object val = parse(dynamicAmount, availableAmount, fakeMinAmount);
testRun = false;
Object val = parse(dynamicAmount, availableAmounts, fakeMinAmount);
if (val instanceof String) {
logger.error("cant get Amount " + availableAmount + "/" + dynamicAmount);
logger.error("cant get Amount ({})/{}", (availableAmounts != null)?(availableAmounts.toProperty()):("null"), dynamicAmount);
throw new RuntimeException("cant get Amount");
} else if (val instanceof Double) {
int wanted = ((Double) val).intValue();
Expand Down Expand Up @@ -187,7 +195,7 @@ public String toBase64() {
* @return returns a double if able to parse returns a String if unable to
* parse
*/
Object parse(String math, int pDynValue, int pFakeValue) {
Object parse(String math, TroopAmountFixed pDynValue, int pFakeValue) {
if (math.length() == 0) {
return (double) 0;
}
Expand Down Expand Up @@ -248,9 +256,9 @@ Object parse(String math, int pDynValue, int pFakeValue) {
* @return returns a double if able to parse returns a String if unable to
* parse
*/
private final String[] mathChars = {"+", "-", "*", "/", "%", "^", "<", ">", "="};
private final String[] mathChars = {"+", "-", "*", "/", "%", "^", "<=", ">=", "=<", "=>", "<>", "><", "<", ">", "="};

private Object innerParse(String noBrackets, int pDynValue, int pFakeValue, int level) {
private Object innerParse(String noBrackets, TroopAmountFixed pDynValue, int pFakeValue, int level) {
if (noBrackets.length() == 0) {
return (double) 0;
}
Expand Down Expand Up @@ -337,45 +345,79 @@ private Object innerParse(String noBrackets, int pDynValue, int pFakeValue, int
case "=":
dAll = (dAll == dInner) ? (1.0) : (0.0);
break;
case ">=":
case "=>":
dAll = (dAll >= dInner) ? (1.0) : (0.0);
break;
case "<=":
case "=<":
dAll = (dAll <= dInner) ? (1.0) : (0.0);
break;
case "<>":
case "><":
dAll = (dAll != dInner) ? (1.0) : (0.0);
break;
}
result = dAll;
}
}
currentIndex = next + 1;
currentIndex = next + mathChars[level].length();
}

return result;
return (result != null)?(result):((double) 0);
}

private final String[] elementPostChars = {"%"};
private final String[] elementPreChars = {"_"};
private final String[] elementPreChars = {"_", "!"};

private Object elementParse(String element, int pDynValue, int pFakeValue) {
private Object elementParse(String element, TroopAmountFixed pDynValue, int pFakeValue) {
if (element.length() == 0) {
return (double) 0;
}
//3.Level of parsing

if (element.equalsIgnoreCase(ALL_TROOPS)) {
//element is all Troops placeholder
if (pDynValue >= 0) {
return (double) pDynValue;
} else {
if (testRun) {
//no dynamic Value given
return element;
}
else if (pDynValue != null) {
return (double) pDynValue.getAmountForUnit(unit);
} else {
return 0;
}
}
if (element.length() > ALL_TROOPS.length() + 1 &&
element.substring(0, ALL_TROOPS.length()+1).equalsIgnoreCase(ALL_TROOPS + "_")) {
//element could be placeholder of "external" all Troops placeholder (for another unit)
String name = element.substring((ALL_TROOPS + "_").length());
for(UnitHolder otherUnit: DataHolder.getSingleton().getUnits()) {
if(name.equalsIgnoreCase(otherUnit.getPlainName()) ||
name.equalsIgnoreCase(otherUnit.getName())) {
if (testRun) {
//no dynamic Value given
return element;
}
else if (pDynValue != null) {
return (double) pDynValue.getAmountForUnit(otherUnit);
} else {
return 0;
}
}
}
}
if (element.equalsIgnoreCase(RND_VALUE)) {
//element is random placeholder
return (double) Math.random();
}
if (element.equalsIgnoreCase(FAKE_VALUE)) {
//element is fake placeholder
if (pFakeValue >= 0) {
return (double) pFakeValue;
} else {
if (testRun) {
//no dynamic Value given
return element;
} else {
return (double) pFakeValue;
}
}

Expand All @@ -392,11 +434,14 @@ private Object elementParse(String element, int pDynValue, int pFakeValue) {
//able to parse
switch (elementPostChar) {
case "%":
if (pDynValue >= 0) {
return (double) pDynValue * dVal / 100;
} else {
if (testRun) {
return val.toString() + elementPostChar;
}
else if (pDynValue != null) {
return (double) pDynValue.getAmountForUnit(unit) * dVal / 100;
} else {
return 0;
}
}
}
}
Expand All @@ -414,6 +459,8 @@ private Object elementParse(String element, int pDynValue, int pFakeValue) {
switch (elementPreChar) {
case "_":
return (double) dVal * -1;
case "!":
return (dVal == 0) ? (1.0) : (0.0);
}
}
}
Expand Down Expand Up @@ -476,10 +523,10 @@ private int findNextOperator(String input, int parsingLevel, int startIndex, boo
return next;
}

private int getAvailable(Village pVillage) {
private TroopAmountFixed getAvailable(Village pVillage) {
if (pVillage == null) {
//don't care
return 0;
return null;
} else {
VillageTroopsHolder own = TroopsManager.getSingleton().getTroopsForVillage(pVillage, TroopsManager.TROOP_TYPE.OWN);
if (own == null) {
Expand All @@ -488,9 +535,9 @@ private int getAvailable(Village pVillage) {
logger.debug("No troop information found for village '" + pVillage + "'");
}
//just use 0 for all Units
return 0;
return null;
}
return own.getTroops().getAmountForUnit(unit);
return own.getTroops();
}
}
}
20 changes: 13 additions & 7 deletions Core/src/main/java/de/tor/tribes/types/ext/Tribe.java
Original file line number Diff line number Diff line change
Expand Up @@ -238,18 +238,24 @@ public void setRankDeff(int rankDef) {
}

public Color getMarkerColor() {
Marker m = MarkerManager.getSingleton().getMarker(this);
if (m != null) {
return m.getMarkerColor();
}

if (this.equals(Barbarians.getSingleton())) {
return Color.LIGHT_GRAY;
Marker mTribe = MarkerManager.getSingleton().getMarker(this);
if (mTribe != null) {
return mTribe.getMarkerColor();
}

if (getId() == GlobalOptions.getSelectedProfile().getTribe().getId()) {
return Color.YELLOW;
}

Marker mAlly = MarkerManager.getSingleton().getMarker(getAlly());
if(mAlly != null) {
return mAlly.getMarkerColor();
}

if (this.equals(Barbarians.getSingleton())) {
return Color.LIGHT_GRAY;
}

Color DEFAULT = null;
switch(GlobalOptions.getProperties().getInt("default.mark")) {
case 1:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1446,7 +1446,7 @@ private void copyBBToExternalClipboardEvent() {
showInfo("Keine Befehle ausgewählt");
return;
}
int answer = JOptionPaneHelper.showQuestionThreeChoicesBox(this, "Welcher BB-Codes Typ soll verwendet werden?\n(Erweiterte BB-Codes sind nur für das Forum und die Notizen geeignet)", "Erweiterter BB-Code", "IGM", "Normal", "Erweitert");
int answer = JOptionPaneHelper.showQuestionThreeChoicesBox(this, "Welcher BB-Codes Typ soll verwendet werden?\n(Erweiterte BB-Codes sind nur für das Forum und die Notizen geeignet)", "Erweiterter BB-Code", "Normal", "IGM", "Erweitert");

StringBuilder buffer = new StringBuilder();
switch (answer) {
Expand All @@ -1473,6 +1473,7 @@ private void copyBBToExternalClipboardEvent() {
buffer.append(" mit DS Workbench ");
buffer.append(Constants.VERSION).append(Constants.VERSION_ADDITION + "[/size]\n");
break;
case JOptionPane.NO_OPTION:
default:
//Normal
buffer.append("[u]Geplante Befehle[/u]\n\n");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -475,8 +475,7 @@ private void renderMarkerField(Village v, int row, int col, int pFieldWidth, int
boolean showBarbarian = GlobalOptions.getProperties().getBoolean("show.barbarian");
Village currentUserVillage = DSWorkbenchMainFrame.getSingleton().getCurrentUserVillage();

if (v != null && !(v.getTribe().equals(Barbarians.getSingleton()) && !showBarbarian) //&& !(MarkerManager.getSingleton().getMarker(v) == null && !v.getTribe().getName().equals(GlobalOptions.getSelectedProfile().getTribeName()))
) {
if (v != null && (!v.getTribe().equals(Barbarians.getSingleton()) || showBarbarian)) {
v.setVisibleOnMap(true);
tribeId = v.getTribeID();
copyRect = renderedMarkerBounds.get(tribeId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ private void renderMarkerField(Village v, int row, int col, int pFieldWidth, int
int xcnt = 1;
int ycnt = 2;
int cnt = 0;
for (Tag tag : TagManager.getSingleton().getTags(v)) {
for (Tag tag : villageTags) {
// <editor-fold defaultstate="collapsed" desc="Draw tag if active">
if (tag.isShowOnMap()) {
boolean isDrawable = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@ private void setSelectedCataTarget() {
}

private void setSelectedFarmGroup() {
DSWorkbenchFarmManager.SelectedFarmGroup = (String) jFarmGroup.getSelectedItem();
if(jFarmGroup.getSelectedItem() != null)
DSWorkbenchFarmManager.SelectedFarmGroup = (String) jFarmGroup.getSelectedItem();
}

public static String getSelectedCataTarget() {
Expand Down Expand Up @@ -2254,7 +2255,8 @@ public void restoreCustomProperties(Configuration pConfig) {
}

try {
DSWorkbenchFarmManager.SelectedFarmGroup = pConfig.getString(getPropertyPrefix() + ".farm.group");
if(pConfig.getString(getPropertyPrefix() + ".farm.group") != null)
DSWorkbenchFarmManager.SelectedFarmGroup = pConfig.getString(getPropertyPrefix() + ".farm.group");
} catch (Exception ignored) {
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@
<Component class="javax.swing.JTextPane" name="jTextPane1">
<Properties>
<Property name="contentType" type="java.lang.String" value="text/html" noResource="true"/>
<Property name="text" type="java.lang.String" value="&lt;html&gt;Standardangriffe sind voreingestellte Angriffe mit einer festgelegten Truppenzahl, die an vielen Stellen in DS Workbench verwendet werden k&amp;ouml;nnen. &#xa;So dienen sie z.B. dazu, die Angriffe eines Angriffsplans im Versammlungsplatz zu &amp;ouml;ffnen und die Truppen direkt einzuf&amp;uuml;gen. &#xa;Dazu m&#xfc;ssen die Truppeninformationen aus dem Spielaccount nach DS Workbench importiert werden.&#xa;Mehr dazu erf&amp;auml;hrst du in der Programmhilfe, die du mit F1 &amp;ouml;ffnest.&#xa;In den Standardangriffen k&amp;ouml;nnen verschiedene Konstanten und mathematische Rechenoperationen benutzt werden :&#xa;&lt;UL&gt;&lt;LI&gt;&lt;B&gt;+ - * /&lt;/B&gt; Die Mathematischen grundrechenoperatoren&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;^&lt;/B&gt; um eine Zahl zu Potenzieren&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;%&lt;/B&gt; der Modulo-Operator&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;alle&lt;/B&gt; entspricht der Anzahl an Truppen dieses Typs, die gerade im Dorf vorhanden sind&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;X%&lt;/B&gt; um einen prozentualen Anteil aller Truppen einzuf&#xfc;gen (z.B: &apos;50%&apos;) &#xa;&lt;LI&gt;&lt;B&gt;rnd&lt;/B&gt; eine Zufallszahl von 0 bis 1 (um z.B. bei 50% der Fakes einen spy mitzuschicken)&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;fake&lt;/B&gt; Die mindestanzahl an &lt;B&gt;BH Pl&#xe4;tzen&lt;/B&gt; die bei einem Fake abgeschickt werden m&#xfc;ssen&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;&amp;gt; &amp;lt; =&lt;/B&gt; Vergleichsoperatoren (1 bei ja / 0 bei nein)&lt;/LI&gt;&#xa;&lt;/UL&gt;&#xa;Das Ergebnis wird abgerundet bevor die Truppen losgeschickt werden.&#xa; &lt;/html&gt;"/>
<Property name="text" type="java.lang.String" value="&lt;html&gt;Standardangriffe sind voreingestellte Angriffe mit einer festgelegten Truppenzahl, die an vielen Stellen in DS Workbench verwendet werden k&amp;ouml;nnen. &#xa;So dienen sie z.B. dazu, die Angriffe eines Angriffsplans im Versammlungsplatz zu &amp;ouml;ffnen und die Truppen direkt einzuf&amp;uuml;gen. &#xa;Dazu m&#xfc;ssen die Truppeninformationen aus dem Spielaccount nach DS Workbench importiert werden.&#xa;Mehr dazu erf&amp;auml;hrst du in der Programmhilfe, die du mit F1 &amp;ouml;ffnest.&#xa;In den Standardangriffen k&amp;ouml;nnen verschiedene Konstanten und mathematische Rechenoperationen benutzt werden :&#xa;&lt;UL&gt;&lt;LI&gt;&lt;B&gt;+ - * /&lt;/B&gt; Die Mathematischen grundrechenoperatoren&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;^&lt;/B&gt; um eine Zahl zu Potenzieren&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;%&lt;/B&gt; der Modulo-Operator&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;alle&lt;/B&gt; entspricht der Anzahl an Truppen dieses Typs, die gerade im Dorf vorhanden sind&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;X%&lt;/B&gt; um einen prozentualen Anteil aller Truppen einzuf&#xfc;gen (z.B: &apos;50%&apos;) &#xa;&lt;LI&gt;&lt;B&gt;rnd&lt;/B&gt; eine Zufallszahl von 0 bis 1 (um z.B. bei 50% der Fakes einen spy mitzuschicken)&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;fake&lt;/B&gt; Die mindestanzahl an &lt;B&gt;BH Pl&#xe4;tzen&lt;/B&gt; die bei einem Fake abgeschickt werden m&#xfc;ssen&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;&amp;gt; &amp;lt; = &amp;lt;&amp;gt; &amp;gt;= &amp;lt;=&lt;/B&gt; Vergleichsoperatoren (1 bei ja / 0 bei nein)&lt;/LI&gt;&#xa;&lt;LI&gt;&lt;B&gt;alle_{einheitenname}&lt;/B&gt; entspricht der Anzahl an Truppen eines beliebigen Typs die gerade im Dorf vorhanden sind. &lt;br&gt;&#xa;M&#xf6;gliche Namen (sofern auf der Welt vorhanden) spear, sword, axe, archer, spy, light, marche, heavy, ram, catapult, knigh, snob, militia &lt;br&gt;&#xa;Die deutschen Namen der entsprechenden Truppen sollten genauso funktionieren&lt;/LI&gt;&#xa;&lt;/UL&gt;&#xa;Das Ergebnis wird abgerundet bevor die Truppen losgeschickt werden.&#xa; &lt;/html&gt;"/>
</Properties>
</Component>
</SubComponents>
Expand Down
Loading

0 comments on commit b46e925

Please sign in to comment.