Compare commits

..

26 Commits

Author SHA1 Message Date
Gonk
65456a110b Increased version number for the upcoming release 2020-05-01 20:37:07 +02:00
Gonk
a9bd84b9f2 Merged all changes from my fork. They are needed to work on AT v0.7.10 2020-05-01 20:30:17 +02:00
Gonk
1bab8dc42f Fix for ResourcesCompactor 2020-05-01 20:17:29 +02:00
Gonk
7863b73eda fixed missing png extension 2020-04-12 21:12:19 +02:00
Gonk
32e1b87e09 Corrected linking of spritesheets in tmx
- added or altered spritesheets are now linked with relative paths so that they can be committed to an ATCS project and don't have any unwanted path infomation included
- when exporting the project all links to spritesheets are now changed to ../drawable/FILENAME.PNG
2020-04-05 20:46:03 +02:00
Gonk
4b6be99d98 Changed damage modifier default value to 100% 2020-02-25 20:24:26 +01:00
Gonk
13847bb8cd Merge branch 'weapondamagemodifier' into jar20200220 2020-02-20 21:59:02 +01:00
Gonk
2d92a97689 Named the damage modifier according to the AT sources 2020-02-20 21:57:35 +01:00
Gonk
9c21c7cd02 Merge branch 'weapondamagemodifier' into jar20200121 2020-01-21 22:24:59 +01:00
Gonk
f4fd8ad5bb Merge branch 'wearremoverequirement' into jar20200121
# Conflicts:
#	src/com/gpl/rpg/atcontentstudio/model/gamedata/Requirement.java
#	src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java
#	src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java
2020-01-21 22:24:42 +01:00
Gonk
63acc5bf2c Merge branch 'factionscoreequals' into jar20200121 2020-01-21 22:22:13 +01:00
Gonk
4c51353e93 Merge branch 'pofileencoding' into jar20200121 2020-01-21 22:21:58 +01:00
Gonk
7bf6bbfcd1 Merge branch 'poleweapon' into jar20200121 2020-01-21 22:21:21 +01:00
Gonk
7d40d56430 The damage modifier can now be edited, also added "on hit received" columns to the items comparator 2019-12-26 21:05:39 +01:00
Gonk
d7e83575e3 wearRemove requirement
wear and wearRemove behave similar and wear now also requires the value property
2019-11-11 21:53:25 +01:00
Gonk
811870184b factionscoreEquals 2019-10-13 17:57:41 +02:00
Gonk
7297f47b67 read and write po files using utf 8 encoding
until now the system default was used, which is especially on windows not utf 8
2019-09-04 23:33:41 +02:00
Gonk
20877f7850 Changed the order for the pole weapon proficency 2019-07-11 21:21:10 +02:00
Gonk
b3c8879be1 added pole weapon proficiency 2019-07-08 22:27:23 +02:00
Zukero
ac68006a69 v0.6.15 released.
Includes a way to view which tileset a tile is from on a map. It is
shown in the tooltip from the "Testing" tab of the map editor.
2019-05-31 10:28:16 +02:00
Zukero
92e07e76d2 Added Gonk to the contributors. 2019-05-31 09:55:17 +02:00
Gonk
5a3315da1a Added random requirement and a null pointer fix for the droplist editor
- used in conversations and replace areas
- using the droplist chance editor
2019-05-12 11:45:48 +02:00
Zukero
e12c6bcc25 Overhaul of the droplist's drop chance editor, planning to use it for
the random requirement type' chance too.
2019-04-24 00:45:57 +02:00
Zukero
44c4e1f998 Merge pull request #9 from Chriz76/maprefresh 2019-04-23 20:52:44 +02:00
Gonk
450b0de02a Adjusted external map change detection
On some systems changes by tiled were not detected and therefore the refresh button was greyed. The reason might have been that tiled recreates the files instead of changing them.
2019-04-20 21:35:59 +02:00
Zukero
57702a3a4a Lib updated. 2018-11-28 15:14:08 +01:00
35 changed files with 419 additions and 174 deletions

View File

@@ -5,7 +5,7 @@
<classpathentry kind="src" path="hacked-libtiled"/> <classpathentry kind="src" path="hacked-libtiled"/>
<classpathentry kind="src" path="siphash-zackehh/src/main/java"/> <classpathentry kind="src" path="siphash-zackehh/src/main/java"/>
<classpathentry kind="src" path="minify"/> <classpathentry kind="src" path="minify"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_152"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="lib/jide-oss.jar"/> <classpathentry kind="lib" path="lib/jide-oss.jar"/>
<classpathentry kind="lib" path="lib/json_simple-1.1.jar"/> <classpathentry kind="lib" path="lib/json_simple-1.1.jar"/>
<classpathentry kind="lib" path="lib/junit-4.10.jar"/> <classpathentry kind="lib" path="lib/junit-4.10.jar"/>
@@ -14,19 +14,6 @@
<classpathentry kind="lib" path="lib/ui.jar"/> <classpathentry kind="lib" path="lib/ui.jar"/>
<classpathentry kind="lib" path="lib/bsh-2.0b4.jar"/> <classpathentry kind="lib" path="lib/bsh-2.0b4.jar"/>
<classpathentry kind="lib" path="lib/jsoup-1.10.2.jar" sourcepath="lib/jsoup-1.10.2-sources.jar"/> <classpathentry kind="lib" path="lib/jsoup-1.10.2.jar" sourcepath="lib/jsoup-1.10.2-sources.jar"/>
<classpathentry kind="lib" path="lib/AndorsTrainer_v0.1.4.jar"/> <classpathentry kind="lib" path="lib/AndorsTrainer_v0.1.5.jar"/>
<classpathentry kind="lib" path="lib/JGit/commons-codec-1.6.jar"/>
<classpathentry kind="lib" path="lib/JGit/commons-logging-1.1.3.jar"/>
<classpathentry kind="lib" path="lib/JGit/httpclient-4.3.6.jar"/>
<classpathentry kind="lib" path="lib/JGit/httpcore-4.3.3.jar"/>
<classpathentry kind="lib" path="lib/JGit/JavaEWAH-1.1.6.jar"/>
<classpathentry kind="lib" path="lib/JGit/jsch-0.1.54.jar"/>
<classpathentry kind="lib" path="lib/JGit/jzlib-1.0.7.jar"/>
<classpathentry kind="lib" path="lib/JGit/org.eclipse.jgit-4.9.0.201710071750-r.jar">
<attributes>
<attribute name="javadoc_location" value="jar:platform:/resource/ATContentStudio/lib/JGit/org.eclipse.jgit-4.9.0.201710071750-r-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry kind="lib" path="lib/JGit/slf4j-api-1.7.2.jar"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin"/>
</classpath> </classpath>

View File

@@ -1,12 +1,11 @@
eclipse.preferences.version=1 eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.source=1.6

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jardesc> <jardesc>
<jar path="ATContentStudio/ATCS_v0.6.14.jar"/> <jar path="ATContentStudio/ATCS_v0.6.16.jar"/>
<options buildIfNeeded="true" compress="true" descriptionLocation="/ATContentStudio/ATCS_JAR.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/> <options buildIfNeeded="true" compress="true" descriptionLocation="/ATContentStudio/ATCS_JAR.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
<storedRefactorings deprecationInfo="true" structuralOnly="false"/> <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
<selectedProjects/> <selectedProjects/>

View File

@@ -47,6 +47,9 @@ import java.util.Vector;
import java.util.zip.DeflaterOutputStream; import java.util.zip.DeflaterOutputStream;
import java.util.zip.GZIPOutputStream; import java.util.zip.GZIPOutputStream;
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
import tiled.core.AnimatedTile; import tiled.core.AnimatedTile;
import tiled.core.Map; import tiled.core.Map;
import tiled.core.MapLayer; import tiled.core.MapLayer;
@@ -238,7 +241,15 @@ public class TMXMapWriter
} else { } else {
w.startElement("tileset"); w.startElement("tileset");
w.writeAttribute("firstgid", getFirstGidForTileset(set)); w.writeAttribute("firstgid", getFirstGidForTileset(set));
w.writeAttribute("source", getRelativePath(wp, source)); if (set.sheet != null && set.sheet.parent.getDataType() == Type.source) {
String fileName = set.getName();
if (fileName.length() > 3 && !(fileName.substring(fileName.length() - 4).equalsIgnoreCase(".png"))) {
fileName += ".png";
}
w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + fileName).replace("\\", "/"));
} else {
w.writeAttribute("source", getRelativePath(wp, source));
}
if (set.getBaseDir() != null) { if (set.getBaseDir() != null) {
w.writeAttribute("basedir", set.getBaseDir()); w.writeAttribute("basedir", set.getBaseDir());
} }
@@ -279,7 +290,15 @@ public class TMXMapWriter
if (tileBitmapFile != null) { if (tileBitmapFile != null) {
w.startElement("image"); w.startElement("image");
w.writeAttribute("source", getRelativePath(wp, tileBitmapFile)); if (set.sheet != null && set.sheet.parent.getDataType() == Type.source) {
String fileName = set.getName();
if (fileName.length() > 3 && !(fileName.substring(fileName.length() - 4).equalsIgnoreCase(".png"))) {
fileName += ".png";
}
w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + fileName).replace("\\", "/"));
} else {
w.writeAttribute("source", getRelativePath(wp, tileBitmapFile));
}
if (set.sheetDimensions != null) { if (set.sheetDimensions != null) {
w.writeAttribute("width", set.sheetDimensions.width); w.writeAttribute("width", set.sheetDimensions.width);
w.writeAttribute("height", set.sheetDimensions.height); w.writeAttribute("height", set.sheetDimensions.height);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
v0.6.14 v0.6.16

View File

@@ -1,7 +1,7 @@
!include MUI2.nsh !include MUI2.nsh
!define VERSION "0.6.14" !define VERSION "0.6.16"
!define TRAINER_VERSION "0.1.4" !define TRAINER_VERSION "0.1.5"
!define JAVA_BIN "javaw" !define JAVA_BIN "javaw"
Name "Andor's Trail Content Studio v${VERSION}" Name "Andor's Trail Content Studio v${VERSION}"

View File

@@ -32,17 +32,6 @@ import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener; import javax.swing.event.HyperlinkListener;
import javax.swing.plaf.FontUIResource; import javax.swing.plaf.FontUIResource;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.attributes.AttributesNodeProvider;
import org.eclipse.jgit.internal.storage.file.FileRepository;
import org.eclipse.jgit.lib.ObjectDatabase;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefDatabase;
import org.eclipse.jgit.lib.ReflogReader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import prefuse.data.expression.parser.ExpressionParser; import prefuse.data.expression.parser.ExpressionParser;
import com.gpl.rpg.atcontentstudio.model.Workspace; import com.gpl.rpg.atcontentstudio.model.Workspace;
@@ -54,7 +43,7 @@ import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector;
public class ATContentStudio { public class ATContentStudio {
public static final String APP_NAME = "Andor's Trail Content Studio"; public static final String APP_NAME = "Andor's Trail Content Studio";
public static final String APP_VERSION = "v0.6.14"; public static final String APP_VERSION = "v0.6.16";
public static final String CHECK_UPDATE_URL = "https://andorstrail.com/static/ATCS_latest"; public static final String CHECK_UPDATE_URL = "https://andorstrail.com/static/ATCS_latest";
public static final String DOWNLOAD_URL = "https://andorstrail.com/viewtopic.php?f=6&t=4806"; public static final String DOWNLOAD_URL = "https://andorstrail.com/viewtopic.php?f=6&t=4806";
@@ -84,19 +73,6 @@ public class ATContentStudio {
} }
} }
// try {
// Git git = new Git(new FileRepository("/home/xxx/git_repos/andors-trail/.git/"));
// List<Ref> branches = git.branchList().call();
// for (Ref branch : branches) {
// System.out.println(branch.getName());
// }
// } catch (IOException e1) {
// e1.printStackTrace();
// } catch (GitAPIException e1) {
// e1.printStackTrace();
// }
ConfigCache.init(); ConfigCache.init();
try { try {

View File

@@ -11,6 +11,10 @@ import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
import java.io.StringReader; import java.io.StringReader;
import java.io.StringWriter; import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Enumeration; import java.util.Enumeration;
@@ -74,6 +78,8 @@ import com.gpl.rpg.atcontentstudio.utils.FileUtils;
public class Project implements ProjectTreeNode, Serializable { public class Project implements ProjectTreeNode, Serializable {
private static final long serialVersionUID = 4807454973303366758L; private static final long serialVersionUID = 4807454973303366758L;
private static final String drawablePath = TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE.replace("\\", "/");
//Every instance field that is not transient will be saved in this file. //Every instance field that is not transient will be saved in this file.
public static final String SETTINGS_FILE = ".project"; public static final String SETTINGS_FILE = ".project";
@@ -1079,10 +1085,16 @@ public class Project implements ProjectTreeNode, Serializable {
public void run() { public void run() {
Notification.addInfo("Exporting project \""+name+"\" as "+target.getAbsolutePath()); Notification.addInfo("Exporting project \""+name+"\" as "+target.getAbsolutePath());
File tmpDir = exportProjectToTmpDir(); File tmpDir;
try {
tmpDir = exportProjectToTmpDir();
FileUtils.writeToZip(tmpDir, target);
FileUtils.deleteDir(tmpDir);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileUtils.writeToZip(tmpDir, target);
FileUtils.deleteDir(tmpDir);
Notification.addSuccess("Project \""+name+"\" exported as "+target.getAbsolutePath()); Notification.addSuccess("Project \""+name+"\" exported as "+target.getAbsolutePath());
} }
@@ -1096,10 +1108,16 @@ public class Project implements ProjectTreeNode, Serializable {
public void run() { public void run() {
Notification.addInfo("Exporting project \""+name+"\" into "+target.getAbsolutePath()); Notification.addInfo("Exporting project \""+name+"\" into "+target.getAbsolutePath());
File tmpDir = exportProjectToTmpDir(); File tmpDir;
try {
tmpDir = exportProjectToTmpDir();
FileUtils.copyOver(tmpDir, target);
FileUtils.deleteDir(tmpDir);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileUtils.copyOver(tmpDir, target);
FileUtils.deleteDir(tmpDir);
Notification.addSuccess("Project \""+name+"\" exported into "+target.getAbsolutePath()); Notification.addSuccess("Project \""+name+"\" exported into "+target.getAbsolutePath());
} }
@@ -1107,7 +1125,7 @@ public class Project implements ProjectTreeNode, Serializable {
}); });
} }
public File exportProjectToTmpDir() { public File exportProjectToTmpDir() throws IOException {
File tmpDir = new File(baseFolder, "tmp"); File tmpDir = new File(baseFolder, "tmp");
FileUtils.deleteDir(tmpDir); FileUtils.deleteDir(tmpDir);
tmpDir.mkdir(); tmpDir.mkdir();
@@ -1139,12 +1157,12 @@ public class Project implements ProjectTreeNode, Serializable {
writtenFiles = new LinkedList<String>(); writtenFiles = new LinkedList<String>();
for (File createdMapFile : createdContent.gameMaps.mapFolder.listFiles()) { for (File createdMapFile : createdContent.gameMaps.mapFolder.listFiles()) {
if (createdMapFile.getName().equalsIgnoreCase("worldmap.xml")) continue; if (createdMapFile.getName().equalsIgnoreCase("worldmap.xml")) continue;
FileUtils.copyFile(createdMapFile, new File(tmpMapDir, createdMapFile.getName())); copyTmxConverted(createdMapFile.toPath(), Paths.get(tmpMapDir.getAbsolutePath(), createdMapFile.getName()));
writtenFiles.add(createdMapFile.getName()); writtenFiles.add(createdMapFile.getName());
} }
for (File alteredMapFile : alteredContent.gameMaps.mapFolder.listFiles()) { for (File alteredMapFile : alteredContent.gameMaps.mapFolder.listFiles()) {
if (alteredMapFile.getName().equalsIgnoreCase("worldmap.xml")) continue; if (alteredMapFile.getName().equalsIgnoreCase("worldmap.xml")) continue;
FileUtils.copyFile(alteredMapFile, new File(tmpMapDir, alteredMapFile.getName())); copyTmxConverted(alteredMapFile.toPath(), Paths.get(tmpMapDir.getAbsolutePath(), alteredMapFile.getName()));
writtenFiles.add(alteredMapFile.getName()); writtenFiles.add(alteredMapFile.getName());
} }
writtenFilesPerDataType.put(TMXMap.class, writtenFiles); writtenFilesPerDataType.put(TMXMap.class, writtenFiles);
@@ -1177,6 +1195,16 @@ public class Project implements ProjectTreeNode, Serializable {
return tmpDir; return tmpDir;
} }
private void copyTmxConverted(Path from, Path to) throws IOException {
String xml = new String(Files.readAllBytes(from), StandardCharsets.UTF_8);
xml = xml.replace("../../altered/spritesheets/", drawablePath);
xml = xml.replace("../../created/spritesheets/", drawablePath);
xml = xml.replace("../spritesheets/", drawablePath);
xml = xml.replace("../spritesheets/", drawablePath);
Files.write(to, xml.getBytes(StandardCharsets.UTF_8));
}
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public List<String> writeDataDeltaForDataType(GameDataCategory<? extends JSONElement> created, GameDataCategory<? extends JSONElement> altered, GameDataCategory<? extends JSONElement> source, Class<? extends JSONElement> gdeClass, File targetFolder) { public List<String> writeDataDeltaForDataType(GameDataCategory<? extends JSONElement> created, GameDataCategory<? extends JSONElement> altered, GameDataCategory<? extends JSONElement> source, Class<? extends JSONElement> gdeClass, File targetFolder) {
List<String> filenamesToWrite = new LinkedList<String>(); List<String> filenamesToWrite = new LinkedList<String>();

View File

@@ -36,7 +36,7 @@ public class Droplist extends JSONElement {
public static class DroppedItem { public static class DroppedItem {
//Available from parsed state; //Available from parsed state;
public String item_id = null; public String item_id = null;
public Double chance = null; public String chance = null;
public Integer quantity_min = null; public Integer quantity_min = null;
public Integer quantity_max = null; public Integer quantity_max = null;
@@ -114,7 +114,8 @@ public class Droplist extends JSONElement {
Map droppedItemJson = (Map)droppedItemJsonObj; Map droppedItemJson = (Map)droppedItemJsonObj;
DroppedItem droppedItem = new DroppedItem(); DroppedItem droppedItem = new DroppedItem();
droppedItem.item_id = (String) droppedItemJson.get("itemID"); droppedItem.item_id = (String) droppedItemJson.get("itemID");
if (droppedItemJson.get("chance") != null) droppedItem.chance = JSONElement.parseChance(droppedItemJson.get("chance").toString()); //if (droppedItemJson.get("chance") != null) droppedItem.chance = JSONElement.parseChance(droppedItemJson.get("chance").toString());
droppedItem.chance = (String) droppedItemJson.get("chance");
Map droppedItemQtyJson = (Map) droppedItemJson.get("quantity"); Map droppedItemQtyJson = (Map) droppedItemJson.get("quantity");
if (droppedItemQtyJson != null) { if (droppedItemQtyJson != null) {
droppedItem.quantity_min = JSONElement.getInteger((Number) droppedItemQtyJson.get("min")); droppedItem.quantity_min = JSONElement.getInteger((Number) droppedItemQtyJson.get("min"));
@@ -217,7 +218,8 @@ public class Droplist extends JSONElement {
} else if (droppedItem.item_id != null) { } else if (droppedItem.item_id != null) {
droppedItemJson.put("itemID", droppedItem.item_id); droppedItemJson.put("itemID", droppedItem.item_id);
} }
if (droppedItem.chance != null) droppedItemJson.put("chance", JSONElement.printJsonChance(droppedItem.chance)); //if (droppedItem.chance != null) droppedItemJson.put("chance", JSONElement.printJsonChance(droppedItem.chance));
if (droppedItem.chance != null) droppedItemJson.put("chance", droppedItem.chance);
if (droppedItem.quantity_min != null || droppedItem.quantity_max != null) { if (droppedItem.quantity_min != null || droppedItem.quantity_max != null) {
Map quantityJson = new LinkedHashMap(); Map quantityJson = new LinkedHashMap();
droppedItemJson.put("quantity", quantityJson); droppedItemJson.put("quantity", quantityJson);

View File

@@ -83,6 +83,7 @@ public class Item extends JSONElement {
public Integer increase_block_chance = null; public Integer increase_block_chance = null;
public Integer increase_damage_resistance = null; public Integer increase_damage_resistance = null;
public Double critical_multiplier = null; public Double critical_multiplier = null;
public Integer damage_modifier = null;
} }
public static class ConditionEffect { public static class ConditionEffect {
@@ -202,6 +203,7 @@ public class Item extends JSONElement {
//TODO correct game data, to unify format. //TODO correct game data, to unify format.
// this.equip_effect.critical_multiplier = JSONElement.getDouble((Number) equipEffect.get("setCriticalMultiplier")); // this.equip_effect.critical_multiplier = JSONElement.getDouble((Number) equipEffect.get("setCriticalMultiplier"));
if (equipEffect.get("setCriticalMultiplier") != null) this.equip_effect.critical_multiplier = JSONElement.getDouble(Double.parseDouble(equipEffect.get("setCriticalMultiplier").toString())); if (equipEffect.get("setCriticalMultiplier") != null) this.equip_effect.critical_multiplier = JSONElement.getDouble(Double.parseDouble(equipEffect.get("setCriticalMultiplier").toString()));
this.equip_effect.damage_modifier = JSONElement.getInteger((Number) equipEffect.get("setNonWeaponDamageModifier"));
List conditionsJson = (List) equipEffect.get("addedConditions"); List conditionsJson = (List) equipEffect.get("addedConditions");
if (conditionsJson != null && !conditionsJson.isEmpty()) { if (conditionsJson != null && !conditionsJson.isEmpty()) {
@@ -216,6 +218,7 @@ public class Item extends JSONElement {
} }
} }
Map hitEffect = (Map) itemJson.get("hitEffect"); Map hitEffect = (Map) itemJson.get("hitEffect");
if (hitEffect != null) { if (hitEffect != null) {
this.hit_effect = new HitEffect(); this.hit_effect = new HitEffect();
@@ -426,6 +429,7 @@ public class Item extends JSONElement {
clone.has_manual_price = this.has_manual_price; clone.has_manual_price = this.has_manual_price;
if (this.equip_effect != null) { if (this.equip_effect != null) {
clone.equip_effect = new EquipEffect(); clone.equip_effect = new EquipEffect();
clone.equip_effect.damage_modifier = this.equip_effect.damage_modifier;
clone.equip_effect.critical_multiplier = this.equip_effect.critical_multiplier; clone.equip_effect.critical_multiplier = this.equip_effect.critical_multiplier;
clone.equip_effect.damage_boost_max = this.equip_effect.damage_boost_max; clone.equip_effect.damage_boost_max = this.equip_effect.damage_boost_max;
clone.equip_effect.damage_boost_min = this.equip_effect.damage_boost_min; clone.equip_effect.damage_boost_min = this.equip_effect.damage_boost_min;
@@ -642,6 +646,7 @@ public class Item extends JSONElement {
if (this.equip_effect.increase_block_chance != null) equipEffectJson.put("increaseBlockChance", this.equip_effect.increase_block_chance); if (this.equip_effect.increase_block_chance != null) equipEffectJson.put("increaseBlockChance", this.equip_effect.increase_block_chance);
if (this.equip_effect.increase_damage_resistance != null) equipEffectJson.put("increaseDamageResistance", this.equip_effect.increase_damage_resistance); if (this.equip_effect.increase_damage_resistance != null) equipEffectJson.put("increaseDamageResistance", this.equip_effect.increase_damage_resistance);
if (this.equip_effect.critical_multiplier != null) equipEffectJson.put("setCriticalMultiplier", this.equip_effect.critical_multiplier); if (this.equip_effect.critical_multiplier != null) equipEffectJson.put("setCriticalMultiplier", this.equip_effect.critical_multiplier);
if (this.equip_effect.damage_modifier != null) equipEffectJson.put("setNonWeaponDamageModifier", this.equip_effect.damage_modifier);
if (this.equip_effect.conditions != null) { if (this.equip_effect.conditions != null) {
List conditionsJson = new ArrayList(); List conditionsJson = new ArrayList();
equipEffectJson.put("addedConditions", conditionsJson); equipEffectJson.put("addedConditions", conditionsJson);

View File

@@ -26,10 +26,13 @@ public class Requirement extends JSONElement {
countedItemTypes.add(RequirementType.inventoryRemove); countedItemTypes.add(RequirementType.inventoryRemove);
countedItemTypes.add(RequirementType.inventoryKeep); countedItemTypes.add(RequirementType.inventoryKeep);
countedItemTypes.add(RequirementType.usedItem); countedItemTypes.add(RequirementType.usedItem);
countedItemTypes.add(RequirementType.wear);
countedItemTypes.add(RequirementType.wearRemove);
COMPATIBLE_TYPES.put(RequirementType.inventoryRemove, countedItemTypes); COMPATIBLE_TYPES.put(RequirementType.inventoryRemove, countedItemTypes);
COMPATIBLE_TYPES.put(RequirementType.inventoryKeep, countedItemTypes); COMPATIBLE_TYPES.put(RequirementType.inventoryKeep, countedItemTypes);
COMPATIBLE_TYPES.put(RequirementType.usedItem, countedItemTypes); COMPATIBLE_TYPES.put(RequirementType.usedItem, countedItemTypes);
COMPATIBLE_TYPES.put(RequirementType.wear, countedItemTypes);
COMPATIBLE_TYPES.put(RequirementType.wearRemove, countedItemTypes);
} }
//Available from parsed state //Available from parsed state
@@ -54,7 +57,10 @@ public class Requirement extends JSONElement {
spentGold, spentGold,
consumedBonemeals, consumedBonemeals,
hasActorCondition, hasActorCondition,
factionScore factionScore,
random,
factionScoreEquals,
wearRemove
} }
public enum SkillID { public enum SkillID {
@@ -90,6 +96,7 @@ public class Requirement extends JSONElement {
,weaponProficiencyAxe ,weaponProficiencyAxe
,weaponProficiencyBlunt ,weaponProficiencyBlunt
,weaponProficiencyUnarmed ,weaponProficiencyUnarmed
,weaponProficiencyPole
,armorProficiencyShield ,armorProficiencyShield
,armorProficiencyUnarmored ,armorProficiencyUnarmored
,armorProficiencyLight ,armorProficiencyLight
@@ -104,9 +111,21 @@ public class Requirement extends JSONElement {
@Override @Override
public String getDesc() { public String getDesc() {
String obj_id = "";
if (required_obj_id != null)
{
obj_id = required_obj_id;
if (type != null && type == RequirementType.random){
obj_id = " Chance " + obj_id + (required_obj_id.contains("/") ? "" : "%");
}
else {
obj_id += ":";
}
}
return ((negated != null && negated) ? "NOT " : "") return ((negated != null && negated) ? "NOT " : "")
+(type == null ? "" : type.toString()+":") +(type == null ? "" : type.toString()+":")
+(required_obj_id == null ? "" : required_obj_id+":") +obj_id
+(required_value == null ? "" : required_value.toString()); +(required_value == null ? "" : required_value.toString());
} }
@@ -153,6 +172,7 @@ public class Requirement extends JSONElement {
case inventoryRemove: case inventoryRemove:
case usedItem: case usedItem:
case wear: case wear:
case wearRemove:
this.required_obj = proj.getItem(required_obj_id); this.required_obj = proj.getItem(required_obj_id);
break; break;
case killedMonster: case killedMonster:
@@ -173,6 +193,8 @@ public class Requirement extends JSONElement {
case spentGold: case spentGold:
case timerElapsed: case timerElapsed:
case factionScore: case factionScore:
case factionScoreEquals:
case random:
break; break;
} }
if (this.required_obj != null) this.required_obj.addBacklink((GameDataElement) this.parent); if (this.required_obj != null) this.required_obj.addBacklink((GameDataElement) this.parent);
@@ -225,6 +247,12 @@ public class Requirement extends JSONElement {
required_obj_id = null; required_obj_id = null;
required_value = null; required_value = null;
} }
if(destType==RequirementType.random)
{
required_obj_id = "50/100";
}
type = destType; type = destType;
} }

View File

@@ -258,7 +258,7 @@ public class TMXMap extends GameDataElement {
if (getDataType() == GameSource.Type.source) { if (getDataType() == GameSource.Type.source) {
writer.writeMap(tmxMap, baos, tmxFile.getAbsolutePath()); writer.writeMap(tmxMap, baos, tmxFile.getAbsolutePath());
} else { } else {
writer.writeMap(tmxMap, baos, getProject().baseContent.gameMaps.mapFolder.getAbsolutePath()+File.separator+"placeholder.tmx"); writer.writeMap(tmxMap, baos, ((TMXMapSet)this.parent).mapFolder.getAbsolutePath()+File.separator+"placeholder.tmx");
} }
} catch (Exception e) { } catch (Exception e) {
Notification.addError("Error while converting map "+getDesc()+" to XML: "+e.getMessage()); Notification.addError("Error while converting map "+getDesc()+" to XML: "+e.getMessage());

View File

@@ -100,7 +100,7 @@ public class TMXMapSet implements ProjectTreeNode {
while(getProject().open) { while(getProject().open) {
try { try {
watchService = FileSystems.getDefault().newWatchService(); watchService = FileSystems.getDefault().newWatchService();
/*WatchKey watchKey = */folderPath.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY); /*WatchKey watchKey = */folderPath.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE);
WatchKey wk; WatchKey wk;
validService: while(getProject().open) { validService: while(getProject().open) {
wk = watchService.poll(10, TimeUnit.SECONDS); wk = watchService.poll(10, TimeUnit.SECONDS);

View File

@@ -1,9 +1,12 @@
package com.gpl.rpg.atcontentstudio.model.tools.i18n; package com.gpl.rpg.atcontentstudio.model.tools.i18n;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer; import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@@ -17,7 +20,7 @@ public class PoPotWriter {
public static void writePoFile(Map<String, List<String>> stringsResources, Map<String, String> translations, File destination) { public static void writePoFile(Map<String, List<String>> stringsResources, Map<String, String> translations, File destination) {
try { try {
FileWriter fw = new FileWriter(destination); Writer fw = new OutputStreamWriter(new FileOutputStream(destination), StandardCharsets.UTF_8);
if (translations.get("") != null) { if (translations.get("") != null) {
fw.write(translations.get("")); fw.write(translations.get(""));
writeEndOfEntry(fw); writeEndOfEntry(fw);

View File

@@ -26,7 +26,9 @@ public class AboutEditor extends Editor {
private static final long serialVersionUID = 6230549148222457139L; private static final long serialVersionUID = 6230549148222457139L;
public static final String WELCOME_STRING = public static final String WELCOME_STRING =
"<html><body>" + "<html><head>" +
"<meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html; charset=UTF-8\\\" />" +
"</head><body>" +
"<table><tr valign=\"top\">" + "<table><tr valign=\"top\">" +
"<td><img src=\""+ATContentStudio.class.getResource("/com/gpl/rpg/atcontentstudio/img/atcs_border_banner.png")+"\"/></td>" + "<td><img src=\""+ATContentStudio.class.getResource("/com/gpl/rpg/atcontentstudio/img/atcs_border_banner.png")+"\"/></td>" +
"<td><font size=+1>Welcome to "+ATContentStudio.APP_NAME+" "+ATContentStudio.APP_VERSION+"</font><br/>" + "<td><font size=+1>Welcome to "+ATContentStudio.APP_NAME+" "+ATContentStudio.APP_VERSION+"</font><br/>" +
@@ -51,7 +53,8 @@ public class AboutEditor extends Editor {
"<br/>" + "<br/>" +
"Contributors: <br/>" + "Contributors: <br/>" +
"Quentin Delvallet<br/>" + "Quentin Delvallet<br/>" +
"<EFBFBD>i<EFBFBD>kin<br/>" + "Žižkin<br/>" +
"Gonk<br/>" +
"<br/>" + "<br/>" +
"This project uses the following libraries:<br/>" + "This project uses the following libraries:<br/>" +
"<a href=\"http://code.google.com/p/json-simple/\">JSON.simple</a> by Yidong Fang & Chris Nokleberg.<br/>" + "<a href=\"http://code.google.com/p/json-simple/\">JSON.simple</a> by Yidong Fang & Chris Nokleberg.<br/>" +
@@ -79,7 +82,7 @@ public class AboutEditor extends Editor {
"<a href=\"https://jsoup.org/\">jsoup</a> by Jonathan Hedley<br/>" + "<a href=\"https://jsoup.org/\">jsoup</a> by Jonathan Hedley<br/>" +
"License: <a href=\"https://jsoup.org/license\">MIT License</a><br/>" + "License: <a href=\"https://jsoup.org/license\">MIT License</a><br/>" +
"<br/>" + "<br/>" +
"A slightly modified version of <a href=\"https://launchpad.net/po-parser\">General PO Parser</a> by Bal<61>zs T<>th<br/>" + "A slightly modified version of <a href=\"https://launchpad.net/po-parser\">General PO Parser</a> by Bal<61>zs T<>th<br/>" +
"License: <a href=\"http://www.gnu.org/licenses/gpl-3.0.html\">GPL v3</a><br/>" + "License: <a href=\"http://www.gnu.org/licenses/gpl-3.0.html\">GPL v3</a><br/>" +
"<br/>" + "<br/>" +
"A slightly modified version of <a href=\"www.whoischarles.com\">Minify.java</a> by Charles Bihis<br/>" + "A slightly modified version of <a href=\"www.whoischarles.com\">Minify.java</a> by Charles Bihis<br/>" +

View File

@@ -348,6 +348,138 @@ public abstract class Editor extends JPanel implements ProjectElementListener {
return spinner; return spinner;
} }
private static final String percent = "%";
private static final String ratio = "x/y";
public static JComponent addChanceField(JPanel pane, String label, String initialValue, String defaultValue, boolean editable, final FieldUpdateListener listener) {
int defaultChance = 1;
int defaultMaxChance = 100;
if (defaultValue != null) {
if (defaultValue.contains("/")) {
int c = defaultValue.indexOf('/');
try { defaultChance = Integer.parseInt(defaultValue.substring(0, c)); } catch (NumberFormatException nfe) {};
try { defaultMaxChance = Integer.parseInt(defaultValue.substring(c+1)); } catch (NumberFormatException nfe) {};
} else {
try { defaultChance = Integer.parseInt(defaultValue); } catch (NumberFormatException nfe) {};
}
}
boolean currentFormIsRatio = true;
int chance = defaultChance;
int maxChance = defaultMaxChance;
if (initialValue != null) {
if (initialValue.contains("/")) {
int c = initialValue.indexOf('/');
try { chance = Integer.parseInt(initialValue.substring(0, c)); } catch (NumberFormatException nfe) {};
try { maxChance = Integer.parseInt(initialValue.substring(c+1)); } catch (NumberFormatException nfe) {};
} else {
try {
chance = Integer.parseInt(initialValue);
currentFormIsRatio = false;
} catch (NumberFormatException nfe) {};
}
}
final JPanel tfPane = new JPanel();
tfPane.setLayout(new JideBoxLayout(tfPane, JideBoxLayout.LINE_AXIS, 6));
JLabel tfLabel = new JLabel(label);
tfPane.add(tfLabel, JideBoxLayout.FIX);
final JComboBox<String> entryTypeBox = new JComboBox<String>(new String[] {percent, ratio});
if (currentFormIsRatio) {
entryTypeBox.setSelectedItem(ratio);
} else {
entryTypeBox.setSelectedItem(percent);
}
entryTypeBox.setEnabled(editable);
tfPane.add(entryTypeBox, JideBoxLayout.FIX);
/////////////////////////////////////////////////////////////////////////////////////////////////// make sure "chance" is between 1 and 100. If lower than 1 get 1. If higher than 100, get chance/maxChance * 100... Then do the same with defaultChance, in case no value exist.
final SpinnerNumberModel percentModel = new SpinnerNumberModel(initialValue != null ? ((chance > 1 ? chance : 1) < 100 ? chance : (chance * 100 / maxChance)) : ((defaultChance > 1 ? defaultChance : 1) < 100 ? defaultChance : (defaultChance * 100 / defaultMaxChance)) , 1, 100, 1);
final SpinnerNumberModel ratioChanceModel = new SpinnerNumberModel(initialValue != null ? chance : defaultChance, 1, Integer.MAX_VALUE, 1);
final JSpinner chanceSpinner = new JSpinner(currentFormIsRatio ? ratioChanceModel : percentModel);
if (!currentFormIsRatio) ((JSpinner.DefaultEditor)chanceSpinner.getEditor()).getTextField().setHorizontalAlignment(JTextField.LEFT);
chanceSpinner.setEnabled(editable);
((DefaultFormatter)((NumberEditor)chanceSpinner.getEditor()).getTextField().getFormatter()).setCommitsOnValidEdit(true);
tfPane.add(chanceSpinner, JideBoxLayout.FLEXIBLE);
final JLabel ratioLabel = new JLabel("/");
tfPane.add(ratioLabel, JideBoxLayout.FIX);
final JSpinner maxChanceSpinner = new JSpinner(new SpinnerNumberModel(initialValue != null ? maxChance : defaultMaxChance, 1, Integer.MAX_VALUE, 1));
((JSpinner.DefaultEditor)maxChanceSpinner.getEditor()).getTextField().setHorizontalAlignment(JTextField.LEFT);
maxChanceSpinner.setEnabled(editable);
((DefaultFormatter)((NumberEditor)maxChanceSpinner.getEditor()).getTextField().getFormatter()).setCommitsOnValidEdit(true);
tfPane.add(maxChanceSpinner, JideBoxLayout.FLEXIBLE);
if (!currentFormIsRatio) {
ratioLabel.setVisible(false);
maxChanceSpinner.setVisible(false);
tfPane.revalidate();
tfPane.repaint();
}
final JButton nullify = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon()));
tfPane.add(nullify, JideBoxLayout.FIX);
nullify.setEnabled(editable);
pane.add(tfPane, JideBoxLayout.FIX);
entryTypeBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (entryTypeBox.getSelectedItem() == percent) {
int chance = ((Integer)chanceSpinner.getValue());
int maxChance = ((Integer)maxChanceSpinner.getValue());
chance *= 100;
chance /= maxChance;
chance = Math.max(0, Math.min(100, chance));
chanceSpinner.setModel(percentModel);
chanceSpinner.setValue(chance);
((JSpinner.DefaultEditor)chanceSpinner.getEditor()).getTextField().setHorizontalAlignment(JTextField.LEFT);
ratioLabel.setVisible(false);
maxChanceSpinner.setVisible(false);
tfPane.revalidate();
tfPane.repaint();
listener.valueChanged(chanceSpinner, chanceSpinner.getValue().toString());
} else if (entryTypeBox.getSelectedItem() == ratio) {
int chance = ((Integer)chanceSpinner.getValue());
chanceSpinner.setModel(ratioChanceModel);
chanceSpinner.setValue(chance);
maxChanceSpinner.setValue(100);
ratioLabel.setVisible(true);
maxChanceSpinner.setVisible(true);
tfPane.revalidate();
tfPane.repaint();
listener.valueChanged(chanceSpinner, chanceSpinner.getValue().toString() + "/" + maxChanceSpinner.getValue().toString());
}
}
});
chanceSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
if (entryTypeBox.getSelectedItem() == percent) {
listener.valueChanged(chanceSpinner, chanceSpinner.getValue().toString());
} else if (entryTypeBox.getSelectedItem() == ratio) {
listener.valueChanged(chanceSpinner, chanceSpinner.getValue().toString() + "/" + maxChanceSpinner.getValue().toString());
}
}
});
maxChanceSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
listener.valueChanged(chanceSpinner, chanceSpinner.getValue().toString() + "/" + maxChanceSpinner.getValue().toString());
}
});
nullify.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
chanceSpinner.setValue(1);
listener.valueChanged(chanceSpinner, null);
}
});
return chanceSpinner;
}
// public static JSpinner addDoubleField(JPanel pane, String label, Double initialValue, boolean editable) { // public static JSpinner addDoubleField(JPanel pane, String label, Double initialValue, boolean editable) {
// return addDoubleField(pane, label, initialValue, editable, nullListener); // return addDoubleField(pane, label, initialValue, editable, nullListener);
// } // }

View File

@@ -123,7 +123,7 @@ public class DialogueEditor extends JSONElementEditor {
private MyComboBox requirementObj; private MyComboBox requirementObj;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private JComboBox requirementSkill; private JComboBox requirementSkill;
private JTextField requirementObjId; private JComponent requirementObjId;
private JComponent requirementValue; private JComponent requirementValue;
private BooleanBasedCheckBox requirementNegated; private BooleanBasedCheckBox requirementNegated;
@@ -722,6 +722,11 @@ public class DialogueEditor extends JSONElementEditor {
requirementObjId = null; requirementObjId = null;
requirementValue = addIntegerField(pane, "Quantity: ", requirement.required_value, false, writable, listener); requirementValue = addIntegerField(pane, "Quantity: ", requirement.required_value, false, writable, listener);
break; break;
case random:
requirementObj = null;
requirementObjId = addChanceField(pane, "Chance: ", requirement.required_obj_id, "50/100", writable, listener);
requirementValue = null;
break;
case hasActorCondition: case hasActorCondition:
requirementObj = addActorConditionBox(pane, project, "Actor Condition: ", (ActorCondition) requirement.required_obj, writable, listener); requirementObj = addActorConditionBox(pane, project, "Actor Condition: ", (ActorCondition) requirement.required_obj, writable, listener);
requirementObjId = null; requirementObjId = null;
@@ -730,6 +735,8 @@ public class DialogueEditor extends JSONElementEditor {
case inventoryKeep: case inventoryKeep:
case inventoryRemove: case inventoryRemove:
case usedItem: case usedItem:
case wear:
case wearRemove:
requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener); requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener);
requirementObjId = null; requirementObjId = null;
requirementValue = addIntegerField(pane, "Quantity: ", requirement.required_value, false, writable, listener); requirementValue = addIntegerField(pane, "Quantity: ", requirement.required_value, false, writable, listener);
@@ -765,10 +772,10 @@ public class DialogueEditor extends JSONElementEditor {
requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener); requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Minimum score: ", requirement.required_value, true, writable, listener); requirementValue = addIntegerField(pane, "Minimum score: ", requirement.required_value, true, writable, listener);
break; break;
case wear: case factionScoreEquals:
requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener); requirementObj = null;
requirementObjId = null; requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener);
requirementValue = null; requirementValue = addIntegerField(pane, "Exact value: ", requirement.required_value, true, writable, listener);
break; break;
} }
requirementNegated = addBooleanBasedCheckBox(pane, "Negate this requirement.", requirement.negated, writable, listener); requirementNegated = addBooleanBasedCheckBox(pane, "Negate this requirement.", requirement.negated, writable, listener);
@@ -1169,7 +1176,7 @@ public class DialogueEditor extends JSONElementEditor {
label.setIcon(new ImageIcon(DefaultIcons.getBonemealIcon())); label.setIcon(new ImageIcon(DefaultIcons.getBonemealIcon()));
} else if (req.type == Requirement.RequirementType.timerElapsed) { } else if (req.type == Requirement.RequirementType.timerElapsed) {
label.setIcon(new ImageIcon(DefaultIcons.getTimerIcon())); label.setIcon(new ImageIcon(DefaultIcons.getTimerIcon()));
} else if (req.type == Requirement.RequirementType.factionScore) { } else if (req.type == Requirement.RequirementType.factionScore || req.type == Requirement.RequirementType.factionScoreEquals) {
label.setIcon(new ImageIcon(DefaultIcons.getAlignmentIcon())); label.setIcon(new ImageIcon(DefaultIcons.getAlignmentIcon()));
} }
if (req.type == null) { if (req.type == null) {

View File

@@ -50,7 +50,7 @@ public class DroplistEditor extends JSONElementEditor {
private DroppedItemsListModel droppedItemsListModel; private DroppedItemsListModel droppedItemsListModel;
private JSpinner qtyMinField; private JSpinner qtyMinField;
private JSpinner qtyMaxField; private JSpinner qtyMaxField;
private JSpinner chanceField; private JComponent chanceField;
public DroplistEditor(Droplist droplist) { public DroplistEditor(Droplist droplist) {
super(droplist, droplist.getDesc(), droplist.getIcon()); super(droplist, droplist.getDesc(), droplist.getIcon());
@@ -142,7 +142,7 @@ public class DroplistEditor extends JSONElementEditor {
itemCombo = addItemBox(pane, proj, "Item: ", di.item, writable, listener); itemCombo = addItemBox(pane, proj, "Item: ", di.item, writable, listener);
qtyMinField = addIntegerField(pane, "Quantity min: ", di.quantity_min, false, writable, listener); qtyMinField = addIntegerField(pane, "Quantity min: ", di.quantity_min, false, writable, listener);
qtyMaxField = addIntegerField(pane, "Quantity max: ", di.quantity_max, false, writable, listener); qtyMaxField = addIntegerField(pane, "Quantity max: ", di.quantity_max, false, writable, listener);
chanceField = addDoubleField(pane, "Chance: ", di.chance, writable, listener); chanceField = addChanceField(pane, "Chance: ", di.chance, "100", writable, listener);//addDoubleField(pane, "Chance: ", di.chance, writable, listener);
} }
pane.revalidate(); pane.revalidate();
pane.repaint(); pane.repaint();
@@ -221,9 +221,9 @@ public class DroplistEditor extends JSONElementEditor {
Droplist.DroppedItem di = (Droplist.DroppedItem)value; Droplist.DroppedItem di = (Droplist.DroppedItem)value;
if (di.item != null) { if (di.item != null) {
label.setIcon(new ImageIcon(di.item.getIcon())); label.setIcon(new ImageIcon(di.item.getIcon()));
label.setText(di.chance+"% to get "+di.quantity_min+"-"+di.quantity_max+" "+di.item.getDesc()); label.setText(di.chance+(di.chance != null && di.chance.contains("/") ? "" : "%")+" to get "+di.quantity_min+"-"+di.quantity_max+" "+di.item.getDesc());
} else if (!isNull(di)) { } else if (!isNull(di)) {
label.setText(di.chance+"% to get "+di.quantity_min+"-"+di.quantity_max+" "+di.item_id); label.setText(di.chance+(di.chance != null && di.chance.contains("/") ? "" : "%")+" to get "+di.quantity_min+"-"+di.quantity_max+" "+di.item_id);
} else { } else {
label.setText("New, undefined, dropped item."); label.setText("New, undefined, dropped item.");
} }
@@ -283,7 +283,7 @@ public class DroplistEditor extends JSONElementEditor {
selectedItem.quantity_max = (Integer) value; selectedItem.quantity_max = (Integer) value;
droppedItemsListModel.itemChanged(selectedItem); droppedItemsListModel.itemChanged(selectedItem);
} else if (source == chanceField) { } else if (source == chanceField) {
selectedItem.chance = (Double) value; selectedItem.chance = (String) value;
droppedItemsListModel.itemChanged(selectedItem); droppedItemsListModel.itemChanged(selectedItem);
} }

View File

@@ -82,6 +82,7 @@ public class ItemEditor extends JSONElementEditor {
private JSpinner equipBoostBC; private JSpinner equipBoostBC;
private JSpinner equipBoostCS; private JSpinner equipBoostCS;
private JSpinner equipSetCM; private JSpinner equipSetCM;
private JSpinner equipSetDM;
private JSpinner equipBoostDR; private JSpinner equipBoostDR;
private JSpinner equipIncMoveCost; private JSpinner equipIncMoveCost;
private JSpinner equipIncUseCost; private JSpinner equipIncUseCost;
@@ -217,6 +218,7 @@ public class ItemEditor extends JSONElementEditor {
} }
equipDmgMin = addIntegerField(equipEffectPane, "Attack Damage min: ", equipEffect.damage_boost_min, true, item.writable, listener); equipDmgMin = addIntegerField(equipEffectPane, "Attack Damage min: ", equipEffect.damage_boost_min, true, item.writable, listener);
equipDmgMax = addIntegerField(equipEffectPane, "Attack Damage max: ", equipEffect.damage_boost_max, true, item.writable, listener); equipDmgMax = addIntegerField(equipEffectPane, "Attack Damage max: ", equipEffect.damage_boost_max, true, item.writable, listener);
equipSetDM = addIntegerField(equipEffectPane, "Damage modifier %: ", equipEffect.damage_modifier, 100, false, item.writable, listener);
equipBoostHP = addIntegerField(equipEffectPane, "Boost max HP: ", equipEffect.max_hp_boost, true, item.writable, listener); equipBoostHP = addIntegerField(equipEffectPane, "Boost max HP: ", equipEffect.max_hp_boost, true, item.writable, listener);
equipBoostAP = addIntegerField(equipEffectPane, "Boost max AP: ", equipEffect.max_ap_boost, true, item.writable, listener); equipBoostAP = addIntegerField(equipEffectPane, "Boost max AP: ", equipEffect.max_ap_boost, true, item.writable, listener);
equipBoostAC = addIntegerField(equipEffectPane, "Boost attack chance: ", equipEffect.increase_attack_chance, true, item.writable, listener); equipBoostAC = addIntegerField(equipEffectPane, "Boost attack chance: ", equipEffect.increase_attack_chance, true, item.writable, listener);
@@ -1431,6 +1433,7 @@ public class ItemEditor extends JSONElementEditor {
public static boolean isNull(Item.EquipEffect effect) { public static boolean isNull(Item.EquipEffect effect) {
if (effect.conditions != null) return false; if (effect.conditions != null) return false;
if (effect.critical_multiplier != null) return false; if (effect.critical_multiplier != null) return false;
if (effect.damage_modifier != null) return false;
if (effect.damage_boost_max != null) return false; if (effect.damage_boost_max != null) return false;
if (effect.damage_boost_min != null) return false; if (effect.damage_boost_min != null) return false;
if (effect.increase_attack_chance != null) return false; if (effect.increase_attack_chance != null) return false;
@@ -1619,6 +1622,10 @@ public class ItemEditor extends JSONElementEditor {
equipEffect.critical_multiplier = (Double) value; equipEffect.critical_multiplier = (Double) value;
updatePrice = true; updatePrice = true;
updateEquip = true; updateEquip = true;
} else if (source == equipSetDM) {
equipEffect.damage_modifier = (Integer) value;
updatePrice = true;
updateEquip = true;
} else if (source == equipBoostDR) { } else if (source == equipBoostDR) {
equipEffect.increase_damage_resistance = (Integer) value; equipEffect.increase_damage_resistance = (Integer) value;
updatePrice = true; updatePrice = true;

View File

@@ -173,7 +173,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
private JPanel requirementParamsPane; private JPanel requirementParamsPane;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private JComboBox requirementObj; private JComboBox requirementObj;
private JTextField requirementObjId; private JComponent requirementObjId;
private JComponent requirementValue; private JComponent requirementValue;
private BooleanBasedCheckBox requirementNegated; private BooleanBasedCheckBox requirementNegated;
@@ -675,6 +675,11 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
requirementObjId = null; requirementObjId = null;
requirementValue = addIntegerField(pane, "Quantity: ", requirement.required_value, false, writable, listener); requirementValue = addIntegerField(pane, "Quantity: ", requirement.required_value, false, writable, listener);
break; break;
case random:
requirementObj = null;
requirementObjId = addChanceField(pane, "Chance: ", requirement.required_obj_id, "50/100", writable, listener);
requirementValue = null;
break;
case hasActorCondition: case hasActorCondition:
requirementObj = addActorConditionBox(pane, project, "Actor Condition: ", (ActorCondition) requirement.required_obj, writable, listener); requirementObj = addActorConditionBox(pane, project, "Actor Condition: ", (ActorCondition) requirement.required_obj, writable, listener);
requirementObjId = null; requirementObjId = null;
@@ -683,6 +688,8 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
case inventoryKeep: case inventoryKeep:
case inventoryRemove: case inventoryRemove:
case usedItem: case usedItem:
case wear:
case wearRemove:
requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener); requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener);
requirementObjId = null; requirementObjId = null;
requirementValue = addIntegerField(pane, "Quantity: ", requirement.required_value, false, writable, listener); requirementValue = addIntegerField(pane, "Quantity: ", requirement.required_value, false, writable, listener);
@@ -717,10 +724,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener); requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Minimum score: ", requirement.required_value, true, writable, listener); requirementValue = addIntegerField(pane, "Minimum score: ", requirement.required_value, true, writable, listener);
break; break;
case wear: case factionScoreEquals:
requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener); requirementObj = null;
requirementObjId = null; requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener);
requirementValue = null; requirementValue = addIntegerField(pane, "Exact value: ", requirement.required_value, true, writable, listener);
break; break;
} }
} }
@@ -2318,11 +2325,14 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
if (!activeReplacements.containsKey(area)) { if (!activeReplacements.containsKey(area)) {
activeReplacements.put(area, true); activeReplacements.put(area, true);
} }
for (ReplaceArea.Replacement repl : area.replacements) {
if (replacementsForLayer.get(repl.sourceLayer) == null) { if(area.replacements != null) {
replacementsForLayer.put(repl.sourceLayer, new ArrayList<ReplaceArea>()); for (ReplaceArea.Replacement repl : area.replacements) {
} if (replacementsForLayer.get(repl.sourceLayer) == null) {
replacementsForLayer.get(repl.sourceLayer).add(area); replacementsForLayer.put(repl.sourceLayer, new ArrayList<ReplaceArea>());
}
replacementsForLayer.get(repl.sourceLayer).add(area);
}
} }
} }
} }
@@ -2455,10 +2465,10 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
return false; return false;
} }
JLabel noTileGround = new JLabel(new ImageIcon(DefaultIcons.getNullifyImage().getScaledInstance(32, 32, Image.SCALE_DEFAULT))); JLabel noTileGround = new JLabel("None", new ImageIcon(DefaultIcons.getNullifyImage().getScaledInstance(32, 32, Image.SCALE_DEFAULT)), SwingConstants.LEFT);
JLabel noTileObjects = new JLabel(new ImageIcon(DefaultIcons.getNullifyImage().getScaledInstance(32, 32, Image.SCALE_DEFAULT))); JLabel noTileObjects = new JLabel("None", new ImageIcon(DefaultIcons.getNullifyImage().getScaledInstance(32, 32, Image.SCALE_DEFAULT)), SwingConstants.LEFT);
JLabel noTileAbove = new JLabel(new ImageIcon(DefaultIcons.getNullifyImage().getScaledInstance(32, 32, Image.SCALE_DEFAULT))); JLabel noTileAbove = new JLabel("None", new ImageIcon(DefaultIcons.getNullifyImage().getScaledInstance(32, 32, Image.SCALE_DEFAULT)), SwingConstants.LEFT);
JLabel noTileTop = new JLabel(new ImageIcon(DefaultIcons.getNullifyImage().getScaledInstance(32, 32, Image.SCALE_DEFAULT))); JLabel noTileTop = new JLabel("None", new ImageIcon(DefaultIcons.getNullifyImage().getScaledInstance(32, 32, Image.SCALE_DEFAULT)), SwingConstants.LEFT);
{ {
noTileGround.setPreferredSize(new Dimension(32, 32)); noTileGround.setPreferredSize(new Dimension(32, 32));
noTileObjects.setPreferredSize(new Dimension(32, 32)); noTileObjects.setPreferredSize(new Dimension(32, 32));
@@ -2483,16 +2493,19 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
JPanel content = new JPanel(); JPanel content = new JPanel();
content.setLayout(new JideBoxLayout(content, JideBoxLayout.PAGE_AXIS)); content.setLayout(new JideBoxLayout(content, JideBoxLayout.PAGE_AXIS));
if (tooltippedTile != null) { if (tooltippedTile != null) {
Image tile; tiled.core.Tile tile;
Image tileImage;
JLabel label; JLabel label;
if (top != null && top.getTileAt(tooltippedTile.x, tooltippedTile.y) != null) { if (top != null && top.getTileAt(tooltippedTile.x, tooltippedTile.y) != null) {
tile = top.getTileAt(tooltippedTile.x, tooltippedTile.y).getImage(); tile = top.getTileAt(tooltippedTile.x, tooltippedTile.y);
tileImage = tile.getImage();
} else { } else {
tile = null; tile = null;
tileImage = null;
} }
if (tile != null) { if (tileImage != null) {
label = new JLabel(new ImageIcon(tile)); label = new JLabel(tile.getTileSet().getName(), new ImageIcon(tileImage), SwingConstants.LEFT);
label.setPreferredSize(new Dimension(32,32)); label.setPreferredSize(new Dimension(32,32));
content.add(label, JideBoxLayout.FIX); content.add(label, JideBoxLayout.FIX);
//Fix when (if?) Top is advertised publicly. //Fix when (if?) Top is advertised publicly.
@@ -2501,12 +2514,14 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
if (above != null && above.getTileAt(tooltippedTile.x, tooltippedTile.y) != null) { if (above != null && above.getTileAt(tooltippedTile.x, tooltippedTile.y) != null) {
tile = above.getTileAt(tooltippedTile.x, tooltippedTile.y).getImage(); tile = above.getTileAt(tooltippedTile.x, tooltippedTile.y);
tileImage = tile.getImage();
} else { } else {
tile = null; tile = null;
tileImage = null;
} }
if (tile != null) { if (tileImage != null) {
label = new JLabel(new ImageIcon(tile)); label = new JLabel(tile.getTileSet().getName(), new ImageIcon(tileImage), SwingConstants.LEFT);
label.setPreferredSize(new Dimension(32,32)); label.setPreferredSize(new Dimension(32,32));
content.add(label, JideBoxLayout.FIX); content.add(label, JideBoxLayout.FIX);
} else { } else {
@@ -2514,12 +2529,14 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
if (objects != null && objects.getTileAt(tooltippedTile.x, tooltippedTile.y) != null) { if (objects != null && objects.getTileAt(tooltippedTile.x, tooltippedTile.y) != null) {
tile = objects.getTileAt(tooltippedTile.x, tooltippedTile.y).getImage(); tile = objects.getTileAt(tooltippedTile.x, tooltippedTile.y);
tileImage = tile.getImage();
} else { } else {
tile = null; tile = null;
tileImage = null;
} }
if (tile != null) { if (tileImage != null) {
label = new JLabel(new ImageIcon(tile)); label = new JLabel(tile.getTileSet().getName(), new ImageIcon(tileImage), SwingConstants.LEFT);
label.setPreferredSize(new Dimension(32,32)); label.setPreferredSize(new Dimension(32,32));
content.add(label, JideBoxLayout.FIX); content.add(label, JideBoxLayout.FIX);
} else { } else {
@@ -2527,12 +2544,14 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
} }
if (ground != null && ground.getTileAt(tooltippedTile.x, tooltippedTile.y) != null) { if (ground != null && ground.getTileAt(tooltippedTile.x, tooltippedTile.y) != null) {
tile = ground.getTileAt(tooltippedTile.x, tooltippedTile.y).getImage(); tile = ground.getTileAt(tooltippedTile.x, tooltippedTile.y);
tileImage = tile.getImage();
} else { } else {
tile = null; tile = null;
tileImage = null;
} }
if (tile != null) { if (tileImage != null) {
label = new JLabel(new ImageIcon(tile)); label = new JLabel(tile.getTileSet().getName(), new ImageIcon(tileImage), SwingConstants.LEFT);
label.setPreferredSize(new Dimension(32,32)); label.setPreferredSize(new Dimension(32,32));
content.add(label, JideBoxLayout.FIX); content.add(label, JideBoxLayout.FIX);
} else { } else {

View File

@@ -37,7 +37,7 @@ public class ItemsTableView extends ElementTableView {
@Override @Override
public int getColumnCount() { public int getColumnCount() {
return 33; return 43;
} }
@Override @Override
@@ -62,20 +62,30 @@ public class ItemsTableView extends ElementTableView {
case 16: return "On kill - AP min"; case 16: return "On kill - AP min";
case 17: return "On kill - AP max"; case 17: return "On kill - AP max";
case 18: return "On kill - # conditions"; case 18: return "On kill - # conditions";
case 19: return "AD min"; case 19: return "On hit recv - HP min";
case 20: return "AD max"; case 20: return "On hit recv - HP max";
case 21: return "Max HP"; case 21: return "On hit recv - AP min";
case 22: return "Max AP"; case 22: return "On hit recv - AP max";
case 23: return "Attack cost"; case 23: return "On hit recv - # conditions";
case 24: return "AC"; case 24: return "On hit recv - Tgt HP min";
case 25: return "BC"; case 25: return "On hit recv - Tgt HP max";
case 26: return "DR"; case 26: return "On hit recv - Tgt AP min";
case 27: return "CS"; case 27: return "On hit recv - Tgt AP max";
case 28: return "CM"; case 28: return "AD min";
case 29: return "Move cost"; case 29: return "AD max";
case 30: return "Use cost"; case 30: return "Damage modifier %";
case 31: return "Reequip cost"; case 31: return "Max HP";
case 32: return "# conditions"; case 32: return "Max AP";
case 33: return "Attack cost";
case 34: return "AC";
case 35: return "BC";
case 36: return "DR";
case 37: return "CS";
case 38: return "CM";
case 39: return "Move cost";
case 40: return "Use cost";
case 41: return "Reequip cost";
case 42: return "# conditions";
} }
return null; return null;
} }
@@ -103,20 +113,30 @@ public class ItemsTableView extends ElementTableView {
case 16: return Integer.class;//"On kill - AP min"; case 16: return Integer.class;//"On kill - AP min";
case 17: return Integer.class;//"On kill - AP max"; case 17: return Integer.class;//"On kill - AP max";
case 18: return Integer.class;//"On kill - # conditions"; case 18: return Integer.class;//"On kill - # conditions";
case 19: return Integer.class;//"AD min"; case 19: return Integer.class;//"On hit recv - HP min";
case 20: return Integer.class;//"AD max"; case 20: return Integer.class;//"On hit recv - HP max";
case 21: return Integer.class;//"Max HP"; case 21: return Integer.class;//"On hit recv - AP min";
case 22: return Integer.class;//"Max AP"; case 22: return Integer.class;//"On hit recv - AP max";
case 23: return Integer.class;//"Attack cost"; case 23: return Integer.class;//"On hit recv - # conditions";
case 24: return Integer.class;//"AC"; case 24: return Integer.class;//"On hit recv - Tgt HP min";
case 25: return Integer.class;//"BC"; case 25: return Integer.class;//"On hit recv - Tgt HP max";
case 26: return Integer.class;//"DR"; case 26: return Integer.class;//"On hit recv - Tgt AP min";
case 27: return Integer.class;//"CS"; case 27: return Integer.class;//"On hit recv - Tgt AP max";
case 28: return Double.class;//"CM"; case 28: return Integer.class;//"AD min";
case 29: return Integer.class;//"Move cost"; case 29: return Integer.class;//"AD max";
case 30: return Integer.class;//"Use cost"; case 30: return Integer.class;//"Damage modifier";
case 31: return Integer.class;//"Reequip cost"; case 31: return Integer.class;//"Max HP";
case 32: return Integer.class;//"# conditions"; case 32: return Integer.class;//"Max AP";
case 33: return Integer.class;//"Attack cost";
case 34: return Integer.class;//"AC";
case 35: return Integer.class;//"BC";
case 36: return Integer.class;//"DR";
case 37: return Integer.class;//"CS";
case 38: return Double.class;//"CM";
case 39: return Integer.class;//"Move cost";
case 40: return Integer.class;//"Use cost";
case 41: return Integer.class;//"Reequip cost";
case 42: return Integer.class;//"# conditions";
} }
return null; return null;
} }
@@ -177,20 +197,30 @@ public class ItemsTableView extends ElementTableView {
case 16: return (!canUse && item.kill_effect != null) ? item.kill_effect.ap_boost_min : null;//"On kill - AP min"; case 16: return (!canUse && item.kill_effect != null) ? item.kill_effect.ap_boost_min : null;//"On kill - AP min";
case 17: return (!canUse && item.kill_effect != null) ? item.kill_effect.ap_boost_max : null;//"On kill - AP max"; case 17: return (!canUse && item.kill_effect != null) ? item.kill_effect.ap_boost_max : null;//"On kill - AP max";
case 18: return (!canUse && item.kill_effect != null && item.kill_effect.conditions_source != null) ? item.kill_effect.conditions_source.size() : null;//"On kill - # conditions"; case 18: return (!canUse && item.kill_effect != null && item.kill_effect.conditions_source != null) ? item.kill_effect.conditions_source.size() : null;//"On kill - # conditions";
case 19: return (canEquip && item.equip_effect != null) ? item.equip_effect.damage_boost_min : null;//"AD min"; case 19: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.hp_boost_min : null;//"On hit recv - HP min";
case 20: return (canEquip && item.equip_effect != null) ? item.equip_effect.damage_boost_max : null;//"AD max"; case 20: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.hp_boost_max : null;//"On hit recv - HP max";
case 21: return (canEquip && item.equip_effect != null) ? item.equip_effect.max_hp_boost : null;//"Max HP"; case 21: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.ap_boost_min : null;//"On hit recv - AP min";
case 22: return (canEquip && item.equip_effect != null) ? item.equip_effect.max_ap_boost : null;//"Max AP"; case 22: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.ap_boost_max : null;//"On hit recv - AP max";
case 23: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_attack_cost : null;//"Attack cost"; case 23: return (!canUse && item.hit_received_effect != null && item.hit_received_effect.conditions_source != null) ? item.hit_received_effect.conditions_source.size() : null;//"On hit recv - # conditions";
case 24: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_attack_chance : null;//"AC"; case 24: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.hp_boost_min : null;//"On hit recv - Tgt HP min";
case 25: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_block_chance : null;//"BC"; case 25: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.hp_boost_max : null;//"On hit recv - Tgt HP max";
case 26: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_damage_resistance : null;//"DR"; case 26: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.ap_boost_min : null;//"On hit recv - Tgt AP min";
case 27: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_critical_skill : null;//"CS"; case 27: return (!canUse && item.hit_received_effect != null) ? item.hit_received_effect.ap_boost_max : null;//"On hit recv - Tgt AP max";
case 28: return (canEquip && item.equip_effect != null) ? item.equip_effect.critical_multiplier : null;//"CM"; case 28: return (canEquip && item.equip_effect != null) ? item.equip_effect.damage_boost_min : null;//"AD min";
case 29: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_move_cost : null;//"Move cost"; case 29: return (canEquip && item.equip_effect != null) ? item.equip_effect.damage_boost_max : null;//"AD max";
case 30: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_use_item_cost : null;//"Use cost"; case 30: return (canEquip && item.equip_effect != null) ? item.equip_effect.damage_modifier : null;//"Damage modifier";
case 31: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_reequip_cost : null;//"Reequip cost"; case 31: return (canEquip && item.equip_effect != null) ? item.equip_effect.max_hp_boost : null;//"Max HP";
case 32: return (canEquip && item.equip_effect != null && item.equip_effect.conditions != null) ? item.equip_effect.conditions.size() : null;//"# conditions"; case 32: return (canEquip && item.equip_effect != null) ? item.equip_effect.max_ap_boost : null;//"Max AP";
case 33: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_attack_cost : null;//"Attack cost";
case 34: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_attack_chance : null;//"AC";
case 35: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_block_chance : null;//"BC";
case 36: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_damage_resistance : null;//"DR";
case 37: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_critical_skill : null;//"CS";
case 38: return (canEquip && item.equip_effect != null) ? item.equip_effect.critical_multiplier : null;//"CM";
case 39: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_move_cost : null;//"Move cost";
case 40: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_use_item_cost : null;//"Use cost";
case 41: return (canEquip && item.equip_effect != null) ? item.equip_effect.increase_reequip_cost : null;//"Reequip cost";
case 42: return (canEquip && item.equip_effect != null && item.equip_effect.conditions != null) ? item.equip_effect.conditions.size() : null;//"# conditions";
} }
return null; return null;
} }

View File

@@ -12,6 +12,8 @@ import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Vector; import java.util.Vector;
public class POParser public class POParser
@@ -60,11 +62,9 @@ public class POParser
POFile result = null; POFile result = null;
try try
{ {
FileReader fr = new FileReader(file); BufferedReader br = Files.newBufferedReader(file.toPath(), StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(fr);
result = parse(br); result = parse(br);
br.close(); br.close();
fr.close();
} }
catch (java.io.FileNotFoundException e) catch (java.io.FileNotFoundException e)
{ {