Compare commits

...

51 Commits

Author SHA1 Message Date
OMGeeky
38a3ad85c8 add description field to actor conditions 2024-12-27 10:12:48 +01:00
Nut.andor
1626a8340f Merge branch 'v0.6.19' 2023-09-10 19:32:25 +02:00
Nut.andor
5fe2dfe148 Merge branch 'pulls/1195352/4' into v0.6.19
Remove empty sprites from selection panel
2023-09-10 19:28:14 +02:00
Nut.andor
abc1e7c912 Ignore empty sprites in SpriteChooser 2023-09-10 19:23:30 +02:00
Nut.andor
317d6d4216 Let console open on start 2023-09-10 19:22:18 +02:00
Nut.andor
3628386019 Pull Request #4: Ignore empty sprites in SpriteChooser 2023-09-10 17:25:03 +02:00
OMGeeky
ada352a02c implement ignoring fully transparent sprites 2023-09-10 17:15:28 +02:00
OMGeeky
fc0d97aa2f reformat file & optimize usings 2023-09-10 16:11:02 +02:00
Nut.andor
7451f582ce bugfix sprite 2023-09-09 22:51:21 +02:00
Nut.andor
7b80bf5768 new png 2023-09-01 00:08:33 +02:00
Nut
ddd98c5a8f respawnspeed (originally spawnchance) renamed & added to UI
respawnspeed (originally spawnchance) renamed & added to UI
2023-08-31 23:55:14 +02:00
OMGeeky
0ef703d82e Merge remote-tracking branch 'omgeeky/spawnchance' into spawnchance 2023-08-31 23:50:15 +02:00
OMGeeky
2339a9307c respawnspeed (originally spawnchance) renamed & added to UI 2023-08-31 23:49:03 +02:00
Nut.andor
7dcdb90750 new version 2023-08-31 23:28:32 +02:00
OMGeeky
b638c31ebe update latest 2023-08-30 15:01:04 +02:00
OMGeeky
862f4b7366 respawnspeed (originally spawnchance) renamed & added to UI 2023-08-30 14:40:50 +02:00
Nut.andor
693de98212 Revert "v0.6.19"
This reverts commit 3f4bf58375.
2023-02-04 20:41:21 +01:00
Nut.andor
3f4bf58375 v0.6.19
png names
2023-02-04 03:09:18 +01:00
Nut.andor
7ae4d9d3f6 v0.6.18:
- https:
2022-09-03 23:16:48 +02:00
Nut.andor
0f20f0cd6d Sprites sorted
Missing sprites added (actorconditions, items, monster, effect)
monsters_warrior1 too much

monsters_arulir   makes ATCS crash??

and I omitted fatboy73 this time, because the png has so many holes that would be in ATCS at the beginning of NPCs
2022-02-05 03:53:59 +01:00
Nut.andor
481956cfa5 I probably didn't understand the concept of the nsi compiler, so instead of using relative or variable paths I only got it with a fix path 2022-01-30 00:24:39 +01:00
Nut.andor
7c282aae53 Missing sprites added (actorconditions, items, monster, effect)
and sorted
2022-01-29 02:16:38 +01:00
Nut.andor
1fd3e6253e Increased version number for the upcoming release 2022-01-28 23:50:07 +01:00
Gonk
70f61f0281 Prevent crash when creating a new replace area 2022-01-25 21:33:27 +01:00
Nut
2f82fd13a6 Merge pull request #2 from atsymboldot/worldmap-label-fix
Fix disappearing worldmap labels bug
2021-12-26 14:08:16 +01:00
Nut
f7e5785970 Merge pull request #1 from atsymboldot/master
Add spore immunity skill for Fungi Panic
2021-12-26 14:07:26 +01:00
Nut
084b23f641 helpful error message added 2021-12-26 14:02:14 +01:00
Nathan Watson
ff4d8a6b6c Fix disappearing worldmap labels bug
The "worldmap.labels" map is keyed by namedarea.id (corresponding to map.area), while the "mapLocations" map is keyed by map.id. This causes worldmap labels to be marked for removal when there's a namedarea.id that does not match any map.id, which happens to be true for all namedareas except crossglen and crossroads.

This logic is unnecessary anyway, because WorldMapView.pushToModel is only invoked by WorldmapSegment.pushToModel, which only triggers when maps are added or moved, but not deleted. Deletions are instead handled by WorldmapSegment.elementChanged. As such, it should never be the case that a label is removable in a pushToModel call.
2021-01-04 01:07:57 -08:00
Nathan Watson
45aff3d25b Add spore immunity skill for Fungi Panic 2020-10-11 13:49:22 -07:00
Nut
28a1d0b09e bosses 2020-10-04 22:09:43 +02:00
Gonk
b96568049f Added spritesheets 2020-08-09 20:23:22 +02:00
Gonk
e125b0339c Added the giant basilisk spritesheet. that also prevents errors during compression 2020-06-08 20:16:17 +02:00
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
27 changed files with 3239 additions and 3049 deletions

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jardesc>
<jar path="ATContentStudio/ATCS_v0.6.15.jar"/>
<jar path="ATContentStudio/ATCS_v0.6.19.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"/>
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
<selectedProjects/>

View File

@@ -913,7 +913,8 @@ public class TMXMapReader
private class MapEntityResolver implements EntityResolver
{
public InputSource resolveEntity(String publicId, String systemId) {
if (systemId.equals("http://mapeditor.org/dtd/1.0/map.dtd")) {
if (systemId.equals("http://mapeditor.org/dtd/1.0/map.dtd") ||
systemId.equals("https://mapeditor.org/dtd/1.0/map.dtd")) {
return new InputSource(TMXMapReader.class.getResourceAsStream(
"resources/map.dtd"));
}

View File

@@ -47,6 +47,9 @@ import java.util.Vector;
import java.util.zip.DeflaterOutputStream;
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.Map;
import tiled.core.MapLayer;
@@ -150,7 +153,7 @@ public class TMXMapWriter
}
private void writeMap(Map map, XMLWriter w, String wp) throws IOException {
w.writeDocType("map", null, "http://mapeditor.org/dtd/1.0/map.dtd");
w.writeDocType("map", null, "https://mapeditor.org/dtd/1.0/map.dtd");
w.startElement("map");
w.writeAttribute("version", "1.0");
@@ -238,7 +241,15 @@ public class TMXMapWriter
} else {
w.startElement("tileset");
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) {
w.writeAttribute("basedir", set.getBaseDir());
}
@@ -279,7 +290,15 @@ public class TMXMapWriter
if (tileBitmapFile != null) {
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) {
w.writeAttribute("width", set.sheetDimensions.width);
w.writeAttribute("height", set.sheetDimensions.height);

View File

@@ -1 +1 @@
v0.6.15
v0.6.19

View File

@@ -1,8 +1,8 @@
!include MUI2.nsh
!define VERSION "0.6.15"
!define VERSION "0.6.19"
!define TRAINER_VERSION "0.1.5"
!define JAVA_BIN "javaw"
!define JAVA_BIN "java"
Name "Andor's Trail Content Studio v${VERSION}"
OutFile "ATCS_v${VERSION}_Setup.exe"
@@ -83,16 +83,16 @@ Section install
FileClose $9
SetOutPath "$INSTDIR\lib\"
file "jide-oss.jar"
file "ui.jar"
file "AndorsTrainer_v${TRAINER_VERSION}.jar"
file "junit-4.10.jar"
file "json_simple-1.1.jar"
file "ATCS_v${VERSION}.jar"
file "rsyntaxtextarea.jar"
file "prefuse.jar"
file "bsh-2.0b4.jar"
file "jsoup-1.10.2.jar"
file "C:\AT\ATCS_source\lib\jide-oss.jar"
file "C:\AT\ATCS_source\lib\ui.jar"
file "C:\AT\ATCS_source\lib\AndorsTrainer_v${TRAINER_VERSION}.jar"
file "C:\AT\ATCS_source\lib\junit-4.10.jar"
file "C:\AT\ATCS_source\lib\json_simple-1.1.jar"
file "C:\AT\temp\ATCS_v0.6.19\ATCS_v${VERSION}.jar"
file "C:\AT\ATCS_source\lib\rsyntaxtextarea.jar"
file "C:\AT\ATCS_source\lib\prefuse.jar"
file "C:\AT\ATCS_source\lib\bsh-2.0b4.jar"
file "C:\AT\ATCS_source\lib\jsoup-1.10.2.jar"
SetOutPath $INSTDIR
@@ -172,4 +172,4 @@ Function GetJRE
JreFound:
Pop $R1
Exch $R0
FunctionEnd
FunctionEnd

View File

@@ -1,64 +1,89 @@
atcs.spritesheet.actorconditions_1.category=actorcondition
atcs.spritesheet.actorconditions_2.category=actorcondition
atcs.spritesheet.actorconditions_japozero.category=actorcondition
atcs.spritesheet.actorconditions_omi1.category=actorcondition
atcs.spritesheet.actorconditions_omi2.category=actorcondition
atcs.spritesheet.effect_blood3.animate=true
atcs.spritesheet.effect_blood4.animate=true
atcs.spritesheet.effect_bluetentacle.animate=true
atcs.spritesheet.effect_heal2.animate=true
atcs.spritesheet.effect_miss1.animate=true
atcs.spritesheet.effect_poison1.animate=true
atcs.spritesheet.effect_tometik1.animate=true
atcs.spritesheet.effect_tometik2.animate=true
atcs.spritesheet.items_armours.category=item
atcs.spritesheet.items_armours_2.category=item
atcs.spritesheet.items_armours_3.category=item
atcs.spritesheet.items_weapons.category=item
atcs.spritesheet.items_weapons_2.category=item
atcs.spritesheet.items_weapons_3.category=item
atcs.spritesheet.items_jewelry.category=item
atcs.spritesheet.items_rings_1.category=item
atcs.spritesheet.items_necklaces_1.category=item
atcs.spritesheet.items_consumables.category=item
atcs.spritesheet.items_japozero.category=item
atcs.spritesheet.items_books.category=item
atcs.spritesheet.items_consumables.category=item
atcs.spritesheet.items_consumables_omi1.category=item
atcs.spritesheet.items_feygard1.category=item
atcs.spritesheet.items_g03_package_omi1.category=item
atcs.spritesheet.items_japozero.category=item
atcs.spritesheet.items_jewelry.category=item
atcs.spritesheet.items_misc.category=item
atcs.spritesheet.items_misc_2.category=item
atcs.spritesheet.items_misc_3.category=item
atcs.spritesheet.items_misc_4.category=item
atcs.spritesheet.items_misc_5.category=item
atcs.spritesheet.items_misc_6.category=item
atcs.spritesheet.items_necklaces_1.category=item
atcs.spritesheet.items_omgeeky.category=item
atcs.spritesheet.items_omi2.category=item
atcs.spritesheet.items_phoenix01.category=item
atcs.spritesheet.items_reterski_1.category=item
atcs.spritesheet.items_rijackson_1.category=item
atcs.spritesheet.items_rings_1.category=item
atcs.spritesheet.items_tometik1.category=item
atcs.spritesheet.items_tometik2.category=item
atcs.spritesheet.items_tometik3.category=item
atcs.spritesheet.items_weapons.category=item
atcs.spritesheet.items_weapons_2.category=item
atcs.spritesheet.items_weapons_3.category=item
atcs.spritesheet.monsters_armor1.category=monster
atcs.spritesheet.monsters_arulirs.category=monster
atcs.spritesheet.monsters_dogs.category=monster
atcs.spritesheet.monsters_eye1.category=monster
atcs.spritesheet.monsters_eye2.category=monster
atcs.spritesheet.monsters_eye3.category=monster
atcs.spritesheet.monsters_eye4.category=monster
atcs.spritesheet.monsters_fatboy73.category=monster
atcs.spritesheet.monsters_ghost1.category=monster
atcs.spritesheet.monsters_hydra1.category=monster
atcs.spritesheet.monsters_hydra1.sizex=64
atcs.spritesheet.monsters_hydra1.sizey=64
atcs.spritesheet.monsters_gisons.category=monster
atcs.spritesheet.monsters_guynmart.category=monster
atcs.spritesheet.monsters_insects.category=monster
atcs.spritesheet.monsters_karvis1.category=monster
atcs.spritesheet.monsters_karvis2.category=monster
atcs.spritesheet.monsters_ld1.category=monster
atcs.spritesheet.monsters_ld2.category=monster
atcs.spritesheet.monsters_liches.category=monster
atcs.spritesheet.monsters_mage.category=monster
atcs.spritesheet.monsters_mage2.category=monster
atcs.spritesheet.monsters_maksiu1.category=monster
atcs.spritesheet.monsters_man1.category=monster
atcs.spritesheet.monsters_men.category=monster
atcs.spritesheet.monsters_men2.category=monster
atcs.spritesheet.monsters_misc.category=monster
atcs.spritesheet.monsters_omi1.category=monster
atcs.spritesheet.monsters_omi1_b.category=monster
atcs.spritesheet.monsters_omi2.category=monster
atcs.spritesheet.monsters_phoenix01.category=monster
atcs.spritesheet.monsters_rats.category=monster
atcs.spritesheet.monsters_rogue1.category=monster
atcs.spritesheet.monsters_skeleton1.category=monster
atcs.spritesheet.monsters_skeleton2.category=monster
atcs.spritesheet.monsters_snakes.category=monster
atcs.spritesheet.monsters_warrior1.category=monster
atcs.spritesheet.monsters_wraiths.category=monster
atcs.spritesheet.monsters_zombie1.category=monster
atcs.spritesheet.monsters_zombie2.category=monster
atcs.spritesheet.monsters_karvis1.category=monster
atcs.spritesheet.monsters_karvis2.category=monster
atcs.spritesheet.monsters_redshrike1.category=monster
atcs.spritesheet.monsters_rltiles1.category=monster
atcs.spritesheet.monsters_rltiles2.category=monster
atcs.spritesheet.monsters_rltiles3.category=monster
atcs.spritesheet.monsters_rltiles4.category=monster
atcs.spritesheet.monsters_redshrike1.category=monster
atcs.spritesheet.monsters_ld1.category=monster
atcs.spritesheet.monsters_ld2.category=monster
atcs.spritesheet.monsters_rogue1.category=monster
atcs.spritesheet.monsters_skeleton1.category=monster
atcs.spritesheet.monsters_skeleton2.category=monster
atcs.spritesheet.monsters_snakes.category=monster
atcs.spritesheet.monsters_tometik1.category=monster
atcs.spritesheet.monsters_tometik2.category=monster
atcs.spritesheet.monsters_tometik3.category=monster
@@ -69,20 +94,27 @@ atcs.spritesheet.monsters_tometik7.category=monster
atcs.spritesheet.monsters_tometik8.category=monster
atcs.spritesheet.monsters_tometik9.category=monster
atcs.spritesheet.monsters_tometik10.category=monster
atcs.spritesheet.monsters_warrior1.category=monster
atcs.spritesheet.monsters_unknown.category=monster
atcs.spritesheet.monsters_wraiths.category=monster
atcs.spritesheet.monsters_zombie1.category=monster
atcs.spritesheet.monsters_zombie2.category=monster
atcs.spritesheet.monsters_bosses_2x2.category=monster
atcs.spritesheet.monsters_bosses_2x2.sizex=64
atcs.spritesheet.monsters_bosses_2x2.sizey=64
atcs.spritesheet.monsters_cyclops.category=monster
atcs.spritesheet.monsters_cyclops.sizex=64
atcs.spritesheet.monsters_cyclops.sizey=96
atcs.spritesheet.monsters_demon1.category=monster
atcs.spritesheet.monsters_demon1.sizex=64
atcs.spritesheet.monsters_demon1.sizey=64
atcs.spritesheet.monsters_demon2.category=monster
atcs.spritesheet.monsters_demon2.sizex=64
atcs.spritesheet.monsters_demon2.sizey=64
atcs.spritesheet.monsters_cyclops.category=monster
atcs.spritesheet.monsters_cyclops.sizex=64
atcs.spritesheet.monsters_cyclops.sizey=96
atcs.spritesheet.effect_blood3.animate=true
atcs.spritesheet.effect_blood4.animate=true
atcs.spritesheet.effect_bluetentacle.animate=true
atcs.spritesheet.effect_heal2.animate=true
atcs.spritesheet.effect_poison1.animate=true
atcs.spritesheet.effect_tometik1.animate=true
atcs.spritesheet.effect_tometik2.animate=true
atcs.spritesheet.monsters_guynmart.category=monster
atcs.spritesheet.monsters_giantbasilisk.category=monster
atcs.spritesheet.monsters_giantbasilisk.sizex=64
atcs.spritesheet.monsters_giantbasilisk.sizey=64
atcs.spritesheet.monsters_hydra1.category=monster
atcs.spritesheet.monsters_hydra1.sizex=64
atcs.spritesheet.monsters_hydra1.sizey=64

View File

@@ -1,227 +1,227 @@
package com.gpl.rpg.atcontentstudio;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.plaf.FontUIResource;
import prefuse.data.expression.parser.ExpressionParser;
import com.gpl.rpg.atcontentstudio.model.Workspace;
import com.gpl.rpg.atcontentstudio.ui.StudioFrame;
import com.gpl.rpg.atcontentstudio.ui.WorkerDialog;
import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector;
public class ATContentStudio {
public static final String APP_NAME = "Andor's Trail Content Studio";
public static final String APP_VERSION = "v0.6.15";
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 FONT_SCALE_ENV_VAR_NAME = "FONT_SCALE";
public static boolean STARTED = false;
public static float SCALING=1.0f;
public static StudioFrame frame = null;
//Need to keep a strong reference to it, to avoid garbage collection that'll reset these loggers.
public static final List<Logger> configuredLoggers = new LinkedList<Logger>();
/**
* @param args
*/
public static void main(String[] args) {
String fontScaling = System.getProperty(FONT_SCALE_ENV_VAR_NAME);
Float fontScale = null;
if (fontScaling != null) {
try {
fontScale = Float.parseFloat(fontScaling);
SCALING=fontScale;
} catch (NumberFormatException e) {
System.err.println("Failed to parse font scaling parameter. Using default.");
e.printStackTrace();
}
}
ConfigCache.init();
try {
String laf = ConfigCache.getFavoriteLaFClassName();
if (laf == null) laf = UIManager.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel(laf);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
scaleUIFont();
//Need to keep a strong reference to it, to avoid garbage collection that'll reset this setting.
Logger l = Logger.getLogger(ExpressionParser.class.getName());
l.setLevel(Level.OFF);
configuredLoggers.add(l);
final WorkspaceSelector wsSelect = new WorkspaceSelector();
wsSelect.pack();
Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize();
Dimension wdim = wsSelect.getSize();
wsSelect.setLocation((sdim.width - wdim.width)/2, (sdim.height - wdim.height)/2);
wsSelect.setVisible(true);
wsSelect.addWindowListener(new WindowAdapter() {
@Override
public synchronized void windowClosed(WindowEvent e) {
if (wsSelect.selected != null && !STARTED) {
ATContentStudio.STARTED = true;
final File workspaceRoot = new File(wsSelect.selected);
WorkerDialog.showTaskMessage("Loading your workspace...", null, new Runnable(){
public void run() {
Workspace.setActive(workspaceRoot);
if (Workspace.activeWorkspace.settings.useInternet.getCurrentValue() && Workspace.activeWorkspace.settings.checkUpdates.getCurrentValue()) {
new Thread() {
public void run() {checkUpdate();}
}.start();
}
frame = new StudioFrame(APP_NAME+" "+APP_VERSION);
frame.setVisible(true);
frame.setDefaultCloseOperation(StudioFrame.DO_NOTHING_ON_CLOSE);
};
});
for (File f : ConfigCache.getKnownWorkspaces()) {
if (workspaceRoot.equals(f)) {
if (!workspaceRoot.equals(ConfigCache.getLatestWorkspace())) {
ConfigCache.setLatestWorkspace(f);
}
return;
}
}
ConfigCache.addWorkspace(workspaceRoot);
ConfigCache.setLatestWorkspace(workspaceRoot);
}
}
});
}
private static void checkUpdate() {
BufferedReader in = null;
try {
URL url = new URL(CHECK_UPDATE_URL);
in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine, lastLine = null;
while ((inputLine = in.readLine()) != null) {lastLine = inputLine;}
if (lastLine != null && !lastLine.equals(APP_VERSION)) {
// for copying style
JLabel label = new JLabel();
Font font = label.getFont();
Color color = label.getBackground();
// create some css from the label's font
StringBuffer style = new StringBuffer("font-family:" + font.getFamily() + ";");
style.append("font-weight:" + (font.isBold() ? "bold" : "normal") + ";");
style.append("font-size:" + font.getSize() + "pt;");
style.append("background-color: rgb("+color.getRed()+","+color.getGreen()+","+color.getBlue()+");");
JEditorPane ep = new JEditorPane("text/html", "<html><body style=\"" + style + "\">"
+ "You are not running the latest ATCS version.<br/>"
+ "You can get the latest version ("+lastLine+") by clicking the link below.<br/>"
+ "<a href=\""+DOWNLOAD_URL+"\">"+DOWNLOAD_URL+"</a><br/>"
+ "<br/>"
+ "</body></html>");
ep.setEditable(false);
ep.setBorder(null);
ep.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
try {
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
Desktop.getDesktop().browse(e.getURL().toURI());
}
} catch (IOException e1) {
e1.printStackTrace();
} catch (URISyntaxException e1) {
e1.printStackTrace();
}
}
});
JOptionPane.showMessageDialog(null, ep, "Update available", JOptionPane.INFORMATION_MESSAGE);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void scaleUIFont() {
if (SCALING != 1.0f) {
System.out.println("Scaling fonts to "+SCALING);
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
Map<Object, Object> newDefaults = new HashMap<Object, Object>();
for (Enumeration<Object> e = defaults.keys(); e.hasMoreElements();) {
Object key = e.nextElement();
Object value = defaults.get(key);
if (value instanceof Font) {
Font font = (Font) value;
int newSize = (int)(font.getSize() * SCALING);
if (value instanceof FontUIResource) {
newDefaults.put(key, new FontUIResource(font.getName(), font.getStyle(), newSize));
} else {
newDefaults.put(key, new Font(font.getName(), font.getStyle(), newSize));
}
}
}
for (Object key : newDefaults.keySet()) {
defaults.put(key, newDefaults.get(key));
}
}
}
}
package com.gpl.rpg.atcontentstudio;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
import javax.swing.plaf.FontUIResource;
import prefuse.data.expression.parser.ExpressionParser;
import com.gpl.rpg.atcontentstudio.model.Workspace;
import com.gpl.rpg.atcontentstudio.ui.StudioFrame;
import com.gpl.rpg.atcontentstudio.ui.WorkerDialog;
import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector;
public class ATContentStudio {
public static final String APP_NAME = "Andor's Trail Content Studio";
public static final String APP_VERSION = "v0.6.19";
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 FONT_SCALE_ENV_VAR_NAME = "FONT_SCALE";
public static boolean STARTED = false;
public static float SCALING=1.0f;
public static StudioFrame frame = null;
//Need to keep a strong reference to it, to avoid garbage collection that'll reset these loggers.
public static final List<Logger> configuredLoggers = new LinkedList<Logger>();
/**
* @param args
*/
public static void main(String[] args) {
String fontScaling = System.getProperty(FONT_SCALE_ENV_VAR_NAME);
Float fontScale = null;
if (fontScaling != null) {
try {
fontScale = Float.parseFloat(fontScaling);
SCALING=fontScale;
} catch (NumberFormatException e) {
System.err.println("Failed to parse font scaling parameter. Using default.");
e.printStackTrace();
}
}
ConfigCache.init();
try {
String laf = ConfigCache.getFavoriteLaFClassName();
if (laf == null) laf = UIManager.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel(laf);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
scaleUIFont();
//Need to keep a strong reference to it, to avoid garbage collection that'll reset this setting.
Logger l = Logger.getLogger(ExpressionParser.class.getName());
l.setLevel(Level.OFF);
configuredLoggers.add(l);
final WorkspaceSelector wsSelect = new WorkspaceSelector();
wsSelect.pack();
Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize();
Dimension wdim = wsSelect.getSize();
wsSelect.setLocation((sdim.width - wdim.width)/2, (sdim.height - wdim.height)/2);
wsSelect.setVisible(true);
wsSelect.addWindowListener(new WindowAdapter() {
@Override
public synchronized void windowClosed(WindowEvent e) {
if (wsSelect.selected != null && !STARTED) {
ATContentStudio.STARTED = true;
final File workspaceRoot = new File(wsSelect.selected);
WorkerDialog.showTaskMessage("Loading your workspace...", null, new Runnable(){
public void run() {
Workspace.setActive(workspaceRoot);
if (Workspace.activeWorkspace.settings.useInternet.getCurrentValue() && Workspace.activeWorkspace.settings.checkUpdates.getCurrentValue()) {
new Thread() {
public void run() {checkUpdate();}
}.start();
}
frame = new StudioFrame(APP_NAME+" "+APP_VERSION);
frame.setVisible(true);
frame.setDefaultCloseOperation(StudioFrame.DO_NOTHING_ON_CLOSE);
};
});
for (File f : ConfigCache.getKnownWorkspaces()) {
if (workspaceRoot.equals(f)) {
if (!workspaceRoot.equals(ConfigCache.getLatestWorkspace())) {
ConfigCache.setLatestWorkspace(f);
}
return;
}
}
ConfigCache.addWorkspace(workspaceRoot);
ConfigCache.setLatestWorkspace(workspaceRoot);
}
}
});
}
private static void checkUpdate() {
BufferedReader in = null;
try {
URL url = new URL(CHECK_UPDATE_URL);
in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine, lastLine = null;
while ((inputLine = in.readLine()) != null) {lastLine = inputLine;}
if (lastLine != null && !lastLine.equals(APP_VERSION)) {
// for copying style
JLabel label = new JLabel();
Font font = label.getFont();
Color color = label.getBackground();
// create some css from the label's font
StringBuffer style = new StringBuffer("font-family:" + font.getFamily() + ";");
style.append("font-weight:" + (font.isBold() ? "bold" : "normal") + ";");
style.append("font-size:" + font.getSize() + "pt;");
style.append("background-color: rgb("+color.getRed()+","+color.getGreen()+","+color.getBlue()+");");
JEditorPane ep = new JEditorPane("text/html", "<html><body style=\"" + style + "\">"
+ "You are not running the latest ATCS version.<br/>"
+ "You can get the latest version ("+lastLine+") by clicking the link below.<br/>"
+ "<a href=\""+DOWNLOAD_URL+"\">"+DOWNLOAD_URL+"</a><br/>"
+ "<br/>"
+ "</body></html>");
ep.setEditable(false);
ep.setBorder(null);
ep.addHyperlinkListener(new HyperlinkListener() {
@Override
public void hyperlinkUpdate(HyperlinkEvent e) {
try {
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
Desktop.getDesktop().browse(e.getURL().toURI());
}
} catch (IOException e1) {
e1.printStackTrace();
} catch (URISyntaxException e1) {
e1.printStackTrace();
}
}
});
JOptionPane.showMessageDialog(null, ep, "Update available", JOptionPane.INFORMATION_MESSAGE);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null) in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void scaleUIFont() {
if (SCALING != 1.0f) {
System.out.println("Scaling fonts to "+SCALING);
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
Map<Object, Object> newDefaults = new HashMap<Object, Object>();
for (Enumeration<Object> e = defaults.keys(); e.hasMoreElements();) {
Object key = e.nextElement();
Object value = defaults.get(key);
if (value instanceof Font) {
Font font = (Font) value;
int newSize = (int)(font.getSize() * SCALING);
if (value instanceof FontUIResource) {
newDefaults.put(key, new FontUIResource(font.getName(), font.getStyle(), newSize));
} else {
newDefaults.put(key, new Font(font.getName(), font.getStyle(), newSize));
}
}
}
for (Object key : newDefaults.keySet()) {
defaults.put(key, newDefaults.get(key));
}
}
}
}

View File

@@ -11,6 +11,10 @@ import java.io.IOException;
import java.io.Serializable;
import java.io.StringReader;
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.Collections;
import java.util.Enumeration;
@@ -74,7 +78,9 @@ import com.gpl.rpg.atcontentstudio.utils.FileUtils;
public class Project implements ProjectTreeNode, Serializable {
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.
public static final String SETTINGS_FILE = ".project";
@@ -1079,10 +1085,16 @@ public class Project implements ProjectTreeNode, Serializable {
public void run() {
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());
}
@@ -1096,10 +1108,16 @@ public class Project implements ProjectTreeNode, Serializable {
public void run() {
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());
}
@@ -1107,7 +1125,7 @@ public class Project implements ProjectTreeNode, Serializable {
});
}
public File exportProjectToTmpDir() {
public File exportProjectToTmpDir() throws IOException {
File tmpDir = new File(baseFolder, "tmp");
FileUtils.deleteDir(tmpDir);
tmpDir.mkdir();
@@ -1139,12 +1157,12 @@ public class Project implements ProjectTreeNode, Serializable {
writtenFiles = new LinkedList<String>();
for (File createdMapFile : createdContent.gameMaps.mapFolder.listFiles()) {
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());
}
for (File alteredMapFile : alteredContent.gameMaps.mapFolder.listFiles()) {
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());
}
writtenFilesPerDataType.put(TMXMap.class, writtenFiles);
@@ -1177,6 +1195,16 @@ public class Project implements ProjectTreeNode, Serializable {
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")
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>();

View File

@@ -29,7 +29,8 @@ public class ActorCondition extends JSONElement {
//public String id; inherited.
public String icon_id;
public String display_name;
public String description;
// Available from parsed state
public ACCategory category = null;
public Integer positive = null;
@@ -157,6 +158,7 @@ public class ActorCondition extends JSONElement {
@Override
public void parse(Map aCondJson) {
if (aCondJson.get("description") != null) this.description = (String) aCondJson.get("description");
if (aCondJson.get("category") != null) this.category = ACCategory.valueOf((String) aCondJson.get("category"));
this.positive = JSONElement.getInteger((Number) aCondJson.get("isPositive"));
Map abilityEffect = (Map) aCondJson.get("abilityEffect");
@@ -266,6 +268,7 @@ public class ActorCondition extends JSONElement {
clone.state = this.state;
clone.id = this.id;
clone.display_name = this.display_name;
clone.description = this.description;
clone.icon_id = this.icon_id;
clone.category = this.category;
clone.positive = this.positive;
@@ -294,6 +297,7 @@ public class ActorCondition extends JSONElement {
jsonAC.put("id", this.id);
if (this.icon_id != null) jsonAC.put("iconID", this.icon_id);
if (this.display_name != null) jsonAC.put("name", this.display_name);
if (this.description != null) jsonAC.put("description", this.description);
if (this.category != null) jsonAC.put("category", this.category.toString());
if (this.positive != null && this.positive == 1) jsonAC.put("isPositive", this.positive);
if (this.stacking != null && this.stacking == 1) jsonAC.put("isStacking", this.stacking);

View File

@@ -83,6 +83,7 @@ public class Item extends JSONElement {
public Integer increase_block_chance = null;
public Integer increase_damage_resistance = null;
public Double critical_multiplier = null;
public Integer damage_modifier = null;
}
public static class ConditionEffect {
@@ -202,7 +203,8 @@ public class Item extends JSONElement {
//TODO correct game data, to unify format.
// 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()));
this.equip_effect.damage_modifier = JSONElement.getInteger((Number) equipEffect.get("setNonWeaponDamageModifier"));
List conditionsJson = (List) equipEffect.get("addedConditions");
if (conditionsJson != null && !conditionsJson.isEmpty()) {
this.equip_effect.conditions = new ArrayList<Item.ConditionEffect>();
@@ -216,6 +218,7 @@ public class Item extends JSONElement {
}
}
Map hitEffect = (Map) itemJson.get("hitEffect");
if (hitEffect != null) {
this.hit_effect = new HitEffect();
@@ -426,6 +429,7 @@ public class Item extends JSONElement {
clone.has_manual_price = this.has_manual_price;
if (this.equip_effect != null) {
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.damage_boost_max = this.equip_effect.damage_boost_max;
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_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.damage_modifier != null) equipEffectJson.put("setNonWeaponDamageModifier", this.equip_effect.damage_modifier);
if (this.equip_effect.conditions != null) {
List conditionsJson = new ArrayList();
equipEffectJson.put("addedConditions", conditionsJson);

View File

@@ -38,11 +38,16 @@ public abstract class JSONElement extends GameDataElement {
for (Object obj : gameDataElements) {
Map jsonObj = (Map)obj;
String id = (String) jsonObj.get("id");
try {
if (id != null && id.equals(this.id )) {
this.parse(jsonObj);
this.state = State.parsed;
break;
}
}
catch(Exception e){
System.out.println("Error in ID: " + id);
}
}
} catch (FileNotFoundException e) {
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
@@ -53,6 +58,10 @@ public abstract class JSONElement extends GameDataElement {
} catch (ParseException e) {
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
e.printStackTrace();
} catch (IllegalArgumentException e) {
System.out.println(id);
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
e.printStackTrace();
} finally {
if (reader != null)
try {

View File

@@ -26,10 +26,13 @@ public class Requirement extends JSONElement {
countedItemTypes.add(RequirementType.inventoryRemove);
countedItemTypes.add(RequirementType.inventoryKeep);
countedItemTypes.add(RequirementType.usedItem);
countedItemTypes.add(RequirementType.wear);
countedItemTypes.add(RequirementType.wearRemove);
COMPATIBLE_TYPES.put(RequirementType.inventoryRemove, countedItemTypes);
COMPATIBLE_TYPES.put(RequirementType.inventoryKeep, countedItemTypes);
COMPATIBLE_TYPES.put(RequirementType.usedItem, countedItemTypes);
COMPATIBLE_TYPES.put(RequirementType.wear, countedItemTypes);
COMPATIBLE_TYPES.put(RequirementType.wearRemove, countedItemTypes);
}
//Available from parsed state
@@ -55,7 +58,9 @@ public class Requirement extends JSONElement {
consumedBonemeals,
hasActorCondition,
factionScore,
random
random,
factionScoreEquals,
wearRemove
}
public enum SkillID {
@@ -80,6 +85,7 @@ public class Requirement extends JSONElement {
,resistancePhysical // lowers chance to get negative active conditions by monsters (Physical Capacity like Minor fatigue)
,resistanceBlood // lowers chance to get negative active conditions by monsters (Blood Disorder like Weak Poison)
,shadowBless
,sporeImmunity
,crit1 // lowers atk ability
,crit2 // lowers def ability ,rejuvenation // Reduces magnitudes of conditions
,rejuvenation // Reduces magnitudes of conditions
@@ -91,6 +97,7 @@ public class Requirement extends JSONElement {
,weaponProficiencyAxe
,weaponProficiencyBlunt
,weaponProficiencyUnarmed
,weaponProficiencyPole
,armorProficiencyShield
,armorProficiencyUnarmored
,armorProficiencyLight
@@ -166,6 +173,7 @@ public class Requirement extends JSONElement {
case inventoryRemove:
case usedItem:
case wear:
case wearRemove:
this.required_obj = proj.getItem(required_obj_id);
break;
case killedMonster:
@@ -186,6 +194,7 @@ public class Requirement extends JSONElement {
case spentGold:
case timerElapsed:
case factionScore:
case factionScoreEquals:
case random:
break;
}

View File

@@ -95,7 +95,9 @@ public class ReplaceArea extends MapObject {
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
tmxObject.setName(requirement.required_obj_id+":"+((requirement.required_value == null) ? "" : Integer.toString(requirement.required_value)));
} else {
tmxObject.getProperties().setProperty("requireType", requirement.type.toString());
if (requirement.type != null) {
tmxObject.getProperties().setProperty("requireType", requirement.type.toString());
}
if (requirement.required_obj != null) {
tmxObject.getProperties().setProperty("requireId", requirement.required_obj.id);
} else if (requirement.required_obj_id != null) {

View File

@@ -11,7 +11,7 @@ import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
public class SpawnArea extends MapObject {
public int quantity = 1;
public int spawnchance = 10;
public int respawnSpeed = 10;
public boolean active = true;
public boolean ignoreAreas = false;
public String spawngroup_id;
@@ -21,8 +21,8 @@ public class SpawnArea extends MapObject {
if (obj.getProperties().getProperty("quantity") != null) {
this.quantity = Integer.parseInt(obj.getProperties().getProperty("quantity"));
}
if (obj.getProperties().getProperty("spawnchance") != null) {
this.spawnchance = Integer.parseInt(obj.getProperties().getProperty("spawnchance"));
if (obj.getProperties().getProperty("respawnspeed") != null) {
this.respawnSpeed = Integer.parseInt(obj.getProperties().getProperty("respawnspeed"));
}
if (obj.getProperties().getProperty("active") != null) {
this.active = Boolean.parseBoolean(obj.getProperties().getProperty("active"));
@@ -82,8 +82,8 @@ public class SpawnArea extends MapObject {
if (quantity != 1) {
tmxObject.getProperties().setProperty("quantity", Integer.toString(quantity));
}
if (spawnchance != 10) {
tmxObject.getProperties().setProperty("spawnchance", Integer.toString(spawnchance));
if (respawnSpeed != 10) {
tmxObject.getProperties().setProperty("respawnspeed", Integer.toString(respawnSpeed));
}
if (!this.active) {
tmxObject.getProperties().setProperty("active", Boolean.toString(active));
@@ -92,5 +92,4 @@ public class SpawnArea extends MapObject {
tmxObject.getProperties().setProperty("ignoreAreas", Boolean.toString(ignoreAreas));
}
}
}

View File

@@ -258,7 +258,7 @@ public class TMXMap extends GameDataElement {
if (getDataType() == GameSource.Type.source) {
writer.writeMap(tmxMap, baos, tmxFile.getAbsolutePath());
} 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) {
Notification.addError("Error while converting map "+getDesc()+" to XML: "+e.getMessage());

View File

@@ -1,9 +1,12 @@
package com.gpl.rpg.atcontentstudio.model.tools.i18n;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.LinkedList;
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) {
try {
FileWriter fw = new FileWriter(destination);
Writer fw = new OutputStreamWriter(new FileOutputStream(destination), StandardCharsets.UTF_8);
if (translations.get("") != null) {
fw.write(translations.get(""));
writeEndOfEntry(fw);

View File

@@ -28,6 +28,7 @@ public class PotGenerator {
for (ActorCondition ac : gsrc.gameData.actorConditions) {
pushString(stringsResources, resourcesStrings, ac.display_name, getPotContextComment(ac));
pushString(stringsResources, resourcesStrings, ac.description, getPotContextComment(ac)+":description");
}
for (Dialogue d : gsrc.gameData.dialogues ) {

View File

@@ -37,17 +37,17 @@ public class AboutEditor extends Editor {
"<b>Right click on the left area or use the \"File\" menu to create a project.</b><br/>" +
"<br/>" +
"Play <a href=\"https://play.google.com/store/apps/details?id=com.gpl.rpg.AndorsTrail\">Andor's Trail</a> for free on your Android device.<br/>" +
"Visit <a href=\"http://andorstrail.com/\">the official forum</a> to give or receive help.<br/>" +
"Visit <a href=\"https://andorstrail.com/\">the official forum</a> to give or receive help.<br/>" +
"Open the project's <a href=\"https://github.com/Zukero/andors-trail/\">GitHub project page</a> to check out the game's source code.<br/>" +
"<br/>" +
"For content creation help, make sure to use the following resources:<br/>" +
"<a href=\"http://andorstrail.com/viewtopic.php?f=6&t=4560\">The contribution guide on the forums</a><br/>" +
"<a href=\"http://andorstrail.com/wiki/doku.php?id=andors_trail_wiki:developer_section\">The developer section of the Andor's Trail wiki</a><br/>" +
"<a href=\"https://andorstrail.com/viewtopic.php?f=6&t=4560\">The contribution guide on the forums</a><br/>" +
"<a href=\"https://andorstrail.com/wiki/doku.php?id=andors_trail_wiki:developer_section\">The developer section of the Andor's Trail wiki</a><br/>" +
"<a href=\"https://docs.google.com/document/d/1BwWD1tLgPcmA2bwudrVnOc6f2dkPLFCjWdn7tXlIp5g\">The design outline document on Google Drive/Docs</a><br/>" +
"<br/>" +
"<font size=+1>Credits:</font><br/>" +
"<br/>" +
"Author: <a href=\"http://andorstrail.com/memberlist.php?mode=viewprofile&u=2875\">Zukero</a><br/>" +
"Author: <a href=\"https://andorstrail.com/memberlist.php?mode=viewprofile&u=2875\">Zukero</a><br/>" +
"Licence: <a href=\"http://www.gnu.org/licenses/gpl-3.0.html\">GPL v3</a><br/>" +
"Sources are included in this package and on <a href=\"https://github.com/Zukero/ATCS\">GitHub</a>.<br/>" +
"<br/>" +

View File

@@ -30,6 +30,7 @@ public class ActorConditionEditor extends JSONElementEditor {
private JButton acIcon;
private JTextField idField;
private JTextField nameField;
private JTextField descriptionField;
@SuppressWarnings("rawtypes")
private JComboBox categoryBox;
private IntegerBasedCheckBox positiveBox;
@@ -81,6 +82,7 @@ public class ActorConditionEditor extends JSONElementEditor {
idField = addTextField(pane, "Internal ID: ", ac.id, ac.writable, listener);
nameField = addTranslatableTextField(pane, "Display name: ", ac.display_name, ac.writable, listener);
descriptionField = addTranslatableTextField(pane, "Description: ", ac.description, ac.writable, listener);
categoryBox = addEnumValueBox(pane, "Category: ", ActorCondition.ACCategory.values(), ac.category, ac.writable, listener);
positiveBox = addIntegerBasedCheckBox(pane, "Positive", ac.positive, ac.writable, listener);
stackingBox = addIntegerBasedCheckBox(pane, "Stacking", ac.stacking, ac.writable, listener);
@@ -172,6 +174,10 @@ public class ActorConditionEditor extends JSONElementEditor {
ActorConditionEditor.this.name = aCond.getDesc();
aCond.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(ActorConditionEditor.this);
}else if (source == descriptionField) {
aCond.description = (String) value;
aCond.childrenChanged(new ArrayList<ProjectTreeNode>());
ATContentStudio.frame.editorChanged(ActorConditionEditor.this);
} else if (source == acIcon) {
aCond.icon_id = (String) value;
aCond.childrenChanged(new ArrayList<ProjectTreeNode>());

View File

@@ -735,6 +735,8 @@ public class DialogueEditor extends JSONElementEditor {
case inventoryKeep:
case inventoryRemove:
case usedItem:
case wear:
case wearRemove:
requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener);
requirementObjId = null;
requirementValue = addIntegerField(pane, "Quantity: ", requirement.required_value, false, writable, listener);
@@ -770,10 +772,10 @@ public class DialogueEditor extends JSONElementEditor {
requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Minimum score: ", requirement.required_value, true, writable, listener);
break;
case wear:
requirementObj = addItemBox(pane, project, "Item: ", (Item) requirement.required_obj, writable, listener);
requirementObjId = null;
requirementValue = null;
case factionScoreEquals:
requirementObj = null;
requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Exact value: ", requirement.required_value, true, writable, listener);
break;
}
requirementNegated = addBooleanBasedCheckBox(pane, "Negate this requirement.", requirement.negated, writable, listener);
@@ -1174,7 +1176,7 @@ public class DialogueEditor extends JSONElementEditor {
label.setIcon(new ImageIcon(DefaultIcons.getBonemealIcon()));
} else if (req.type == Requirement.RequirementType.timerElapsed) {
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()));
}
if (req.type == null) {

View File

@@ -82,6 +82,7 @@ public class ItemEditor extends JSONElementEditor {
private JSpinner equipBoostBC;
private JSpinner equipBoostCS;
private JSpinner equipSetCM;
private JSpinner equipSetDM;
private JSpinner equipBoostDR;
private JSpinner equipIncMoveCost;
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);
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);
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);
@@ -1431,6 +1433,7 @@ public class ItemEditor extends JSONElementEditor {
public static boolean isNull(Item.EquipEffect effect) {
if (effect.conditions != 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_min != 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;
updatePrice = true;
updateEquip = true;
} else if (source == equipSetDM) {
equipEffect.damage_modifier = (Integer) value;
updatePrice = true;
updateEquip = true;
} else if (source == equipBoostDR) {
equipEffect.increase_damage_resistance = (Integer) value;
updatePrice = true;

File diff suppressed because it is too large Load Diff

View File

@@ -521,16 +521,6 @@ public class WorldMapView extends JComponent implements Scrollable {
}
worldmap.getProject().getMap(id).addBacklink(worldmap);
}
List<String> toRemove = new ArrayList<String>();
for (String s : worldmap.labels.keySet()) {
if (!mapLocations.containsKey(s)) {
toRemove.add(s);
}
}
for (String s : toRemove) {
worldmap.labels.remove(s);
}
}
}

View File

@@ -1,43 +1,34 @@
package com.gpl.rpg.atcontentstudio.ui.sprites;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToggleButton;
import javax.swing.ScrollPaneConstants;
import javax.swing.*;
import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.Project;
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet.Category;
import com.gpl.rpg.atcontentstudio.utils.SpriteUtils;
public class SpriteChooser extends JDialog {
private static final long serialVersionUID = -6018113265015159521L;
private static final int STD_WIDTH = 32;
private static final int STD_HEIGHT = 32;
private static final int MAX_PER_ROW = 10;
public static Map<Project, Map<Spritesheet.Category, SpriteChooser>> cache = new LinkedHashMap<Project, Map<Spritesheet.Category,SpriteChooser>>();
public static Map<Project, Map<Spritesheet.Category, List<Spritesheet>>> cacheValidator = new LinkedHashMap<Project, Map<Category,List<Spritesheet>>>();
public static Map<Project, Map<Spritesheet.Category, SpriteChooser>> cache = new LinkedHashMap<Project, Map<Spritesheet.Category, SpriteChooser>>();
public static Map<Project, Map<Spritesheet.Category, List<Spritesheet>>> cacheValidator = new LinkedHashMap<Project, Map<Category, List<Spritesheet>>>();
public static SpriteChooser getChooser(Project proj, Spritesheet.Category category) {
if (cache.get(proj) == null) {
cache.put(proj, new LinkedHashMap<Spritesheet.Category, SpriteChooser>());
@@ -46,13 +37,13 @@ public class SpriteChooser extends JDialog {
cache.get(proj).put(category, new SpriteChooser(proj, category));
} else {
List<Spritesheet> spritesheets = new ArrayList<Spritesheet>();
for (int i=0; i<proj.getSpritesheetCount(); i++) {
for (int i = 0; i < proj.getSpritesheetCount(); i++) {
Spritesheet sheet = proj.getSpritesheet(i);
if (sheet.category == category) {
spritesheets.add(sheet);
}
}
if ( !spritesheets.equals(cacheValidator.get(proj).get(category)) ) {
if (!spritesheets.equals(cacheValidator.get(proj).get(category))) {
cache.get(proj).put(category, new SpriteChooser(proj, category));
}
}
@@ -65,20 +56,20 @@ public class SpriteChooser extends JDialog {
wanted.pack();
return wanted;
}
private ButtonGroup group;
// private IconButton selectedOne = null;
// private JButton ok;
// private JButton cancel;
public String selectedIconId = null;
public SpriteChooser(Project proj, Category category) {
super(ATContentStudio.frame);
setTitle("Select a sprite");
setModalityType(ModalityType.APPLICATION_MODAL);
List<Spritesheet> spritesheets = new ArrayList<Spritesheet>();
for (int i=0; i<proj.getSpritesheetCount(); i++) {
for (int i = 0; i < proj.getSpritesheetCount(); i++) {
Spritesheet sheet = proj.getSpritesheet(i);
if (sheet.category == category) {
spritesheets.add(sheet);
@@ -88,8 +79,8 @@ public class SpriteChooser extends JDialog {
cacheValidator.put(proj, new LinkedHashMap<Spritesheet.Category, List<Spritesheet>>());
}
cacheValidator.get(proj).put(category, spritesheets);
JPanel pane = new JPanel();
pane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
@@ -101,16 +92,20 @@ public class SpriteChooser extends JDialog {
c.gridheight = 1;
c.anchor = GridBagConstraints.NORTHWEST;
c.fill = GridBagConstraints.BOTH;
List<Point> reservedSlots = new ArrayList<Point>();
Point nextFreeSlot = new Point(0, 0);
int i;
Image img;
BufferedImage img;
group = new ButtonGroup();
//For every sprite find a free space in panel:
for (Spritesheet sheet : spritesheets) {
i = 0;
while ((img = sheet.getImage(i)) != null) {
i = -1;
while ((img = sheet.getImage(++i)) != null) {
if (SpriteUtils.checkIsImageEmpty(img)) {
continue;
}
IconButton button = new IconButton(img, sheet.id, i);
group.add(button);
if (sheet.spriteWidth == STD_WIDTH && sheet.spriteHeight == STD_HEIGHT) {
@@ -120,7 +115,7 @@ public class SpriteChooser extends JDialog {
c.gridx = 0;
c.gridy++;
}
nextFreeSlot.setLocation(c.gridx, c.gridy);
nextFreeSlot.setLocation(c.gridx, c.gridy);
} else {
c.gridwidth = (sheet.spriteWidth / STD_WIDTH) + (sheet.spriteWidth % STD_WIDTH == 0 ? 0 : 1);
c.gridheight = (sheet.spriteHeight / STD_HEIGHT) + (sheet.spriteHeight % STD_HEIGHT == 0 ? 0 : 1);
@@ -131,14 +126,20 @@ public class SpriteChooser extends JDialog {
for (int y = c.gridy; y < c.gridy + c.gridwidth; y++) {
if (reservedSlots.contains(new Point(x, y))) {
slotOk = false;
break;
}
}
if (!slotOk) {
break;
}
}
if (slotOk && c.gridx + c.gridwidth > MAX_PER_ROW) {
if (c.gridx + c.gridwidth > MAX_PER_ROW) {
c.gridx = 0;
c.gridy++;
slotOk = false;
}
} else if (!slotOk) {
c.gridx++;
}
}
pane.add(button, c);
for (int x = c.gridx; x < c.gridx + c.gridwidth; x++) {
@@ -157,15 +158,14 @@ public class SpriteChooser extends JDialog {
c.gridx = 0;
c.gridy++;
}
nextFreeSlot.setLocation(c.gridx, c.gridy);
nextFreeSlot.setLocation(c.gridx, c.gridy);
}
i++;
}
}
// ok = new JButton("Ok");
// cancel = new JButton("Cancel");
c.gridx = 0;
boolean emptyLine = false;
while (!emptyLine) {
@@ -178,7 +178,7 @@ public class SpriteChooser extends JDialog {
}
}
}
// JPanel buttonPane = new JPanel();
// buttonPane.add(cancel, BorderLayout.WEST);
// buttonPane.add(ok, BorderLayout.EAST);
@@ -190,7 +190,7 @@ public class SpriteChooser extends JDialog {
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
wrapper.add(scroller, BorderLayout.CENTER);
// wrapper.add(buttonPane, BorderLayout.SOUTH);
// ok.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
@@ -200,7 +200,7 @@ public class SpriteChooser extends JDialog {
// if (listener != null) listener.iconSelected(selectedIconId);
// }
// });
// cancel.addActionListener(new ActionListener() {
// @Override
// public void actionPerformed(ActionEvent e) {
@@ -210,21 +210,21 @@ public class SpriteChooser extends JDialog {
// if (listener != null) listener.iconSelected(null);
// }
// });
setContentPane(wrapper);
}
private SpriteChooser.SelectionListener listener = null;
public void setSelectionListener(SpriteChooser.SelectionListener l) {
listener = l;
}
public class IconButton extends JToggleButton {
private static final long serialVersionUID = 7559407153561178455L;
public String sheetId;
public int spriteIndex;
@@ -232,12 +232,12 @@ public class SpriteChooser extends JDialog {
super(new ImageIcon(img));
this.sheetId = sheetId;
this.spriteIndex = spriteIndex;
setToolTipText(sheetId+":"+spriteIndex);
setToolTipText(sheetId + ":" + spriteIndex);
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (IconButton.this.isSelected()) {
selectedIconId = IconButton.this.sheetId+":"+IconButton.this.spriteIndex;
selectedIconId = IconButton.this.sheetId + ":" + IconButton.this.spriteIndex;
SpriteChooser.this.setVisible(false);
SpriteChooser.this.dispose();
if (listener != null) listener.iconSelected(selectedIconId);
@@ -246,9 +246,9 @@ public class SpriteChooser extends JDialog {
});
}
}
public static interface SelectionListener {
public void iconSelected(String selected);
}
}

View File

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

View File

@@ -0,0 +1,34 @@
package com.gpl.rpg.atcontentstudio.utils;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
public final class SpriteUtils {
/**
* Check if the image is empty (transparent )
*
* @param img The image to check
* @return true if the image is empty
*/
public static boolean checkIsImageEmpty(BufferedImage img) {
int width = img.getWidth(null);
int height = img.getHeight(null);
WritableRaster raster = img.getAlphaRaster();
if (raster == null) {
return false;
}
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
//get pixel alpha value
int alpha = raster.getSample(x, y, 0);
//if alpha is not 0 then the pixel is not transparent
if (alpha != 0) {
return false;
}
}
}
//no non-transparent pixel found
return true;
}
}

View File

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