mirror of
https://github.com/OMGeeky/ATCS.git
synced 2025-12-26 23:57:25 +01:00
Compare commits
134 Commits
v0.6.21-pr
...
v0.6.23-pr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
120ed02a69 | ||
|
|
f308580deb | ||
|
|
fd41013ade | ||
|
|
114e09597e | ||
|
|
3ceee2e9e6 | ||
|
|
83cc57515d | ||
|
|
06d4131582 | ||
|
|
60205d54de | ||
|
|
f6fbb0f5a3 | ||
|
|
af48341439 | ||
|
|
7b7218ad4e | ||
|
|
1ddf1c5051 | ||
|
|
f9a9ab97de | ||
|
|
b37d32b5c2 | ||
|
|
3c5ed1d6f6 | ||
|
|
32ff1b57fa | ||
|
|
090584dbcc | ||
|
|
e858e436c6 | ||
|
|
4b2aa77cb6 | ||
|
|
24e1e526ce | ||
|
|
861c4c3bb1 | ||
|
|
c18fcfc667 | ||
|
|
9b1ac0d3e1 | ||
|
|
782d436681 | ||
|
|
397d1ded8c | ||
|
|
aef6429dbc | ||
|
|
c43b8464a2 | ||
|
|
7929ffe2a7 | ||
|
|
a3ffecfd23 | ||
|
|
1cbcd5b661 | ||
|
|
0eddd25292 | ||
|
|
1c83eedd80 | ||
|
|
6c296868c0 | ||
|
|
8f5452b487 | ||
|
|
f9f1caafc6 | ||
|
|
c0e24b4cf5 | ||
|
|
cd36813050 | ||
|
|
358d855eec | ||
|
|
281e314815 | ||
|
|
3f19ca959b | ||
|
|
6b74ad5cbe | ||
|
|
93e44a2b50 | ||
|
|
652da07cc8 | ||
|
|
2dbe881dd7 | ||
|
|
b7e9bf0582 | ||
|
|
6dcd8599b3 | ||
|
|
62ed795fed | ||
|
|
ec04b810d9 | ||
|
|
18b92a3921 | ||
|
|
127ed76006 | ||
|
|
56242e85f2 | ||
|
|
de2b47821b | ||
|
|
7eb60117c4 | ||
|
|
0c69438a33 | ||
|
|
380bb1de17 | ||
|
|
9ae9914dde | ||
|
|
c78fcde633 | ||
|
|
270c613f66 | ||
|
|
ebafae7503 | ||
|
|
572c658b43 | ||
|
|
5031fa3c72 | ||
|
|
7f0b55a71c | ||
|
|
ab91d330bd | ||
|
|
27a86ee654 | ||
|
|
ad15063dcc | ||
|
|
2ea425dda6 | ||
|
|
f22052525c | ||
|
|
63e381a804 | ||
|
|
488dd92893 | ||
|
|
f04f062723 | ||
|
|
e91f770975 | ||
|
|
7018703ba6 | ||
|
|
93f0a902ba | ||
|
|
1ca2b9068e | ||
|
|
a7f214a1cb | ||
|
|
b2c05037e5 | ||
|
|
517a798b6f | ||
|
|
e9fecee876 | ||
|
|
967bbf918b | ||
|
|
5ce84dc1b1 | ||
|
|
0a18309bfe | ||
|
|
edc4634cbe | ||
|
|
1e25eabb50 | ||
|
|
1c7de2b97f | ||
|
|
e40fe058dd | ||
|
|
919e65187f | ||
|
|
7b780462ea | ||
|
|
00147c2708 | ||
|
|
70cc945010 | ||
|
|
21005f1ba6 | ||
|
|
b5a6aa6706 | ||
|
|
3cc6eb9edb | ||
|
|
d166e49f4d | ||
|
|
d1568cd2ed | ||
|
|
685ce223da | ||
|
|
18cb73385f | ||
|
|
90359bf285 | ||
|
|
bb187621b7 | ||
|
|
a4b431efdd | ||
|
|
cffbf973e1 | ||
|
|
979a7bc43f | ||
|
|
6b049d3b7b | ||
|
|
edd0160c9d | ||
|
|
fdcc4fab55 | ||
|
|
d030e11019 | ||
|
|
333100b19b | ||
|
|
cfb906736d | ||
|
|
cf8c0497bc | ||
|
|
355bb2bc54 | ||
|
|
e1e85d7a90 | ||
|
|
9ed9393b16 | ||
|
|
8c42b498b0 | ||
|
|
8561415574 | ||
|
|
185f168b19 | ||
|
|
70055be6d2 | ||
|
|
286d95d83d | ||
|
|
04b704daf0 | ||
|
|
3f1f988808 | ||
|
|
e232c33339 | ||
|
|
4239beb825 | ||
|
|
eb6377a983 | ||
|
|
2fb16c9213 | ||
|
|
6741100a4f | ||
|
|
dbff7fb571 | ||
|
|
dfb3e31a7a | ||
|
|
022c9ad229 | ||
|
|
38a3d4082b | ||
|
|
cd78ee3ad0 | ||
|
|
7b30cc6355 | ||
|
|
9a6c5ecf6e | ||
|
|
ed81c2382f | ||
|
|
ed2ad56b76 | ||
|
|
becf45f249 | ||
|
|
c950324cd9 |
6
.gitattributes
vendored
Normal file
6
.gitattributes
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
* text=auto
|
||||
|
||||
# Force bash scripts to always use LF line endings so that if a repo is accessed
|
||||
# in Unix via a file share from Windows, the scripts will work.
|
||||
*.sh text eol=lf
|
||||
38
.github/workflows/release.yml
vendored
38
.github/workflows/release.yml
vendored
@@ -16,8 +16,9 @@ jobs:
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Reading version from file:"
|
||||
cat packaging/ATCS_latest
|
||||
VERSION=$(cat packaging/ATCS_latest)
|
||||
cat res/ATCS_latest
|
||||
echo ""
|
||||
VERSION=$(tr -d '[:space:]' < "res/ATCS_latest")
|
||||
echo "Processed version: $VERSION"
|
||||
echo "VERSION=$VERSION" >> $GITHUB_ENV
|
||||
echo "Environment variable set to: $VERSION"
|
||||
@@ -26,15 +27,7 @@ jobs:
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'adopt'
|
||||
|
||||
- name: Install NSIS
|
||||
uses: joncloud/makensis-action@v4
|
||||
env:
|
||||
VERSION: ${{ env.VERSION }}
|
||||
with:
|
||||
script-file: packaging/Windows/ATCS_Installer.nsi
|
||||
arguments: /DVERSION="${{ env.VERSION }}"
|
||||
distribution: 'temurin'
|
||||
|
||||
- name: Build JAR
|
||||
shell: bash
|
||||
@@ -47,22 +40,17 @@ jobs:
|
||||
ls -la common/ATCS.jar
|
||||
ls -la ATCS_${{ env.VERSION }}.zip
|
||||
|
||||
- name: Upload ZIP to Release
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Install NSIS
|
||||
uses: joncloud/makensis-action@v4
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./packaging/ATCS_${{ env.VERSION }}.zip
|
||||
asset_name: ATCS_${{ env.VERSION }}.zip
|
||||
asset_content_type: application/zip
|
||||
script-file: packaging/Windows/ATCS_Installer.nsi
|
||||
arguments: /DVERSION="${{ env.VERSION }}"
|
||||
|
||||
- name: Upload Installer to Release
|
||||
uses: actions/upload-release-asset@v1
|
||||
- name: Upload Release Assets
|
||||
uses: softprops/action-gh-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: ./packaging/ATCS_${{ env.VERSION }}_Setup.exe
|
||||
asset_name: ATCS_${{ env.VERSION }}_Setup.exe
|
||||
asset_content_type: application/octet-stream
|
||||
files: |
|
||||
./packaging/ATCS_${{ env.VERSION }}.zip
|
||||
./packaging/ATCS_${{ env.VERSION }}_Setup.exe
|
||||
|
||||
1
.idea/artifacts/ATContentStudio_jar.xml
generated
1
.idea/artifacts/ATContentStudio_jar.xml
generated
@@ -10,7 +10,6 @@
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jsoup-1.10.2.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/json_simple-1.1.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/ui.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/AndorsTrainer_v0.1.5.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/jide-oss.jar" path-in-jar="/" />
|
||||
</element>
|
||||
</root>
|
||||
|
||||
19
.idea/codeStyles/Project.xml
generated
Normal file
19
.idea/codeStyles/Project.xml
generated
Normal file
@@ -0,0 +1,19 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<code_scheme name="Project" version="173">
|
||||
<JavaCodeStyleSettings>
|
||||
<option name="JD_P_AT_EMPTY_LINES" value="false" />
|
||||
</JavaCodeStyleSettings>
|
||||
<codeStyleSettings language="JAVA">
|
||||
<option name="RIGHT_MARGIN" value="200" />
|
||||
<option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
|
||||
<option name="CALL_PARAMETERS_WRAP" value="1" />
|
||||
<option name="BINARY_OPERATION_WRAP" value="5" />
|
||||
<option name="SOFT_MARGINS" value="120" />
|
||||
</codeStyleSettings>
|
||||
<codeStyleSettings language="JSON">
|
||||
<indentOptions>
|
||||
<option name="INDENT_SIZE" value="4" />
|
||||
</indentOptions>
|
||||
</codeStyleSettings>
|
||||
</code_scheme>
|
||||
</component>
|
||||
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
5
.idea/codeStyles/codeStyleConfig.xml
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
<component name="ProjectCodeStyleConfiguration">
|
||||
<state>
|
||||
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
|
||||
</state>
|
||||
</component>
|
||||
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" default="true" />
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="temurin-11" project-jdk-type="JavaSDK" />
|
||||
</project>
|
||||
@@ -61,6 +61,8 @@ if not exist %2\%1\.gitignore (
|
||||
|
||||
echo .workspace > .gitignore
|
||||
echo .project >> .gitignore
|
||||
echo .workspace.json >> .gitignore
|
||||
echo .project.json >> .gitignore
|
||||
echo altered/drawable >> .gitignore
|
||||
echo altered/drawable/* >> .gitignore
|
||||
echo created/drawable >> .gitignore
|
||||
|
||||
@@ -43,7 +43,7 @@ public class MapObject implements Cloneable
|
||||
{
|
||||
private Properties properties = new Properties();
|
||||
private ObjectGroup objectGroup;
|
||||
private Rectangle bounds = new Rectangle();
|
||||
private Rectangle bounds;
|
||||
private String name = "Object";
|
||||
private String type = "";
|
||||
private String imageSource = "";
|
||||
|
||||
@@ -57,7 +57,7 @@ public class Sprite
|
||||
|
||||
private String name = null;
|
||||
private int id = -1;
|
||||
private int flags = KEY_LOOP;
|
||||
private int flags;
|
||||
private float frameRate = 1.0f; //one fps
|
||||
private Tile[] frames;
|
||||
|
||||
|
||||
@@ -98,7 +98,11 @@ public class TileSet implements Iterable<Tile>
|
||||
|
||||
File f = new File(imgFilename);
|
||||
|
||||
BufferedImage image = ImageIO.read(f.getCanonicalFile());
|
||||
BufferedImage image;
|
||||
try {
|
||||
image = ImageIO.read(f.getCanonicalFile());
|
||||
} catch (IOException e) { throw new IOException("Failed to load " + imgFilename);
|
||||
}
|
||||
if (image == null) {
|
||||
throw new IOException("Failed to load " + imgFilename);
|
||||
}
|
||||
|
||||
@@ -588,7 +588,7 @@ public class TMXMapWriter
|
||||
}
|
||||
|
||||
// Iterate while parents are the same
|
||||
int shared = 0;
|
||||
int shared;
|
||||
int maxShared = Math.min(fromParents.size(), toParents.size());
|
||||
for (shared = 0; shared < maxShared; shared++) {
|
||||
String fromParent = fromParents.get(shared);
|
||||
|
||||
Binary file not shown.
2
packaging/Linux/.gitignore
vendored
2
packaging/Linux/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
/ATCS_v*.zip
|
||||
/ATCS_v*.zip.rename
|
||||
@@ -1,20 +0,0 @@
|
||||
@echo off
|
||||
|
||||
set "ATCS_DIR=%~dp0"
|
||||
set "MAX_MEM=512M"
|
||||
set "CP=%ATCS_DIR%lib\*"
|
||||
set "JAVA=javaw.exe"
|
||||
set "JAVA_OPTS=-DFONT_SCALE=1.0 -Dswing.aatext=true"
|
||||
set "ENV_FILE=%ATCS_DIR%ATCS.env.bat"
|
||||
set "MAIN_CLASS=com.gpl.rpg.atcontentstudio.ATContentStudio"
|
||||
|
||||
if exist "%ENV_FILE%" (
|
||||
call "%ENV_FILE%"
|
||||
) else (
|
||||
echo REM set "MAX_MEM=%MAX_MEM%">"%ENV_FILE%"
|
||||
echo REM set "JAVA=%JAVA%">>"%ENV_FILE%"
|
||||
echo REM set "JAVA_OPTS=%JAVA_OPTS%">>"%ENV_FILE%"
|
||||
echo.>>"%ENV_FILE%"
|
||||
)
|
||||
|
||||
start "" "%JAVA%" %JAVA_OPTS% -Xmx%MAX_MEM% -cp "%CP%" %MAIN_CLASS%
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB |
@@ -1,22 +0,0 @@
|
||||
#!/bin/bash
|
||||
ATCS_DIR=$(dirname $(readlink -f "$0" || greadlink -f "$0" || stat -f "$0"))
|
||||
MAX_MEM=512M
|
||||
CP=$(find ${ATCS_DIR}/lib/ -name '*.jar' | paste -sd: -)
|
||||
JAVA=java
|
||||
JAVA_OPTS='-DFONT_SCALE=1.0 -Dswing.aatext=true'
|
||||
ENV_FILE=${ATCS_DIR}/ATCS.env
|
||||
MAIN_CLASS=com.gpl.rpg.atcontentstudio.ATContentStudio
|
||||
|
||||
if [ -f ${ENV_FILE} ]
|
||||
then
|
||||
source ${ENV_FILE}
|
||||
else
|
||||
echo "#MAX_MEM=${MAX_MEM}" > ${ENV_FILE}
|
||||
echo "#JAVA=${JAVA}" >> ${ENV_FILE}
|
||||
echo "#JAVA_OPTS=${JAVA_OPTS}" >> ${ENV_FILE}
|
||||
echo "" >> ${ENV_FILE}
|
||||
fi
|
||||
|
||||
export ENV_FILE
|
||||
|
||||
$JAVA ${JAVA_OPTS} -Xmx${MAX_MEM} -cp ${CP} ${MAIN_CLASS}
|
||||
1
packaging/Linux/ATCS/lib/.gitignore
vendored
1
packaging/Linux/ATCS/lib/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
/*.jar
|
||||
@@ -1,21 +1,26 @@
|
||||
#!/bin/bash
|
||||
ATCS_DIR=$(dirname $(readlink -f "$0" || greadlink -f "$0" || stat -f "$0"))
|
||||
ATCS_DIR="$(dirname "$(readlink -f "$0" || greadlink -f "$0" || stat -f "$0")")"
|
||||
echo "ATCS_DIR: '${ATCS_DIR}'"
|
||||
|
||||
MAX_MEM=512M
|
||||
|
||||
JAVA=java
|
||||
MAX_MEM="512M"
|
||||
JAVA="java"
|
||||
JAVA_OPTS='-DFONT_SCALE=1.0 -Dswing.aatext=true'
|
||||
ENV_FILE=${ATCS_DIR}/ATCS.env
|
||||
|
||||
if [ -f ${ENV_FILE} ]; then
|
||||
source ${ENV_FILE}
|
||||
ENV_FILE="${ATCS_DIR}/ATCS.env"
|
||||
|
||||
if [ -f "${ENV_FILE}" ]; then
|
||||
source "${ENV_FILE}"
|
||||
else
|
||||
echo "#MAX_MEM=${MAX_MEM}" >${ENV_FILE}
|
||||
echo "#JAVA=${JAVA}" >>${ENV_FILE}
|
||||
echo "#JAVA_OPTS=${JAVA_OPTS}" >>${ENV_FILE}
|
||||
echo "" >>${ENV_FILE}
|
||||
{
|
||||
echo "#MAX_MEM=\"${MAX_MEM}\""
|
||||
echo "#JAVA=\"${JAVA}\""
|
||||
echo "#JAVA_OPTS=\"${JAVA_OPTS}\""
|
||||
echo ""
|
||||
}>"${ENV_FILE}"
|
||||
fi
|
||||
|
||||
export ENV_FILE
|
||||
|
||||
$JAVA ${JAVA_OPTS} -Xmx${MAX_MEM} -jar ${ATCS_DIR}/ATCS.jar
|
||||
# shellcheck disable=SC2086
|
||||
# (spellchecker is disabled for this line, because we want it to be split into multiple arguments)
|
||||
$JAVA ${JAVA_OPTS} -Xmx${MAX_MEM} -jar "${ATCS_DIR}/ATCS.jar"
|
||||
|
||||
@@ -18,7 +18,7 @@ ATCS_SOURCE_DIR=$(dirname "${PACKAGING_DIR}")
|
||||
TEMP_DIR="${PACKAGING_DIR}/tmp"
|
||||
JAR_LOCATION="${PACKAGING_DIR}/ATCS.jar" # Output JAR location as per script
|
||||
MANIFEST_LOCATION="${PACKAGING_DIR}/Manifest.txt"
|
||||
VERSION_FILE="${PACKAGING_DIR}/ATCS_latest"
|
||||
VERSION_FILE="${ATCS_SOURCE_DIR}/res/ATCS_latest"
|
||||
SOURCE_BASE_DIR="${ATCS_SOURCE_DIR}/src" # Base directory for standard source code
|
||||
LIB_BASE_DIR="${ATCS_SOURCE_DIR}/lib" # Base directory for libraries
|
||||
|
||||
@@ -29,9 +29,8 @@ EXTRA_SOURCE_DIRS=(
|
||||
"siphash-zackehh/src/main/java"
|
||||
)
|
||||
|
||||
# --- Libraries to include (from IntelliJ artifact definition) ---
|
||||
# --- Libraries to include ---
|
||||
LIBRARIES=(
|
||||
"AndorsTrainer_v0.1.5.jar"
|
||||
"bsh-2.0b4.jar"
|
||||
"jide-oss.jar"
|
||||
"json_simple-1.1.jar"
|
||||
@@ -44,7 +43,7 @@ LIBRARIES=(
|
||||
|
||||
# --- Get version ---
|
||||
echo "Getting version"
|
||||
VERSION=$(cat "${VERSION_FILE}")
|
||||
VERSION=$(tr -d '[:space:]' < "${VERSION_FILE}")
|
||||
echo "Got version ${VERSION}"
|
||||
|
||||
# --- Prepare temporary directory ---
|
||||
@@ -62,7 +61,7 @@ done
|
||||
|
||||
# --- Set ClassPath ---
|
||||
echo "Getting source files"
|
||||
# Find all java files in source directories and compile them
|
||||
# Find all java files in source directories
|
||||
SOURCE_FILES=$(find "${SOURCE_BASE_DIR}" "${EXTRA_SOURCE_DIRS[@]/#/${ATCS_SOURCE_DIR}/}" -name "*.java" -print)
|
||||
#echo "SourceFiles: ${SOURCE_FILES}"
|
||||
echo ""
|
||||
@@ -70,6 +69,8 @@ echo ""
|
||||
# --- Build Java classes ---
|
||||
echo 'Building java classes'
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
# (we need word splitting here to pass multiple files)
|
||||
javac -cp "${TEMP_DIR}" -d "${TEMP_DIR}" ${SOURCE_FILES}
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Compilation failed. Please check errors above."
|
||||
@@ -84,6 +85,7 @@ mkdir -p "${TEMP_DIR}/com/gpl/rpg/atcontentstudio/img"
|
||||
mkdir -p "${TEMP_DIR}/tiled/io/resources/"
|
||||
cp -r "${ATCS_SOURCE_DIR}"/src/com/gpl/rpg/atcontentstudio/img/* "${TEMP_DIR}/com/gpl/rpg/atcontentstudio/img/" # some icons
|
||||
cp -r "${ATCS_SOURCE_DIR}"/hacked-libtiled/tiled/io/resources/* "${TEMP_DIR}/tiled/io/resources/" # dtd file for tmx maps
|
||||
cp "${VERSION_FILE}" "${TEMP_DIR}/" # Copy version file
|
||||
|
||||
# --- Create JAR file ---
|
||||
echo ""
|
||||
@@ -114,7 +116,10 @@ else
|
||||
# Use zip command on Linux
|
||||
zip -r "ATCS_${VERSION}.zip" common/* # archive the 'common' folder which now contains the JAR and libs
|
||||
fi
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Archive creation failed."
|
||||
exit 1
|
||||
fi
|
||||
echo "Created archive at ${PACKAGING_DIR}/ATCS_${VERSION}.zip"
|
||||
cd "${PACKAGING_DIR}" || exit
|
||||
|
||||
echo "Script finished."
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
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 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;
|
||||
import prefuse.data.expression.parser.ExpressionParser;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.HyperlinkEvent;
|
||||
import javax.swing.event.HyperlinkListener;
|
||||
import javax.swing.plaf.FontUIResource;
|
||||
import java.awt.*;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.io.BufferedReader;
|
||||
@@ -14,221 +20,222 @@ import java.io.InputStreamReader;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.net.http.HttpTimeoutException;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
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.21";
|
||||
public static final String APP_NAME = "Andor's Trail Content Studio";
|
||||
public static final String APP_VERSION = readVersionFromFile();
|
||||
|
||||
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 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 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;
|
||||
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>();
|
||||
// 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();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
String fontScaling = System.getProperty(FONT_SCALE_ENV_VAR_NAME);
|
||||
Float fontScale;
|
||||
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();
|
||||
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();
|
||||
}
|
||||
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();
|
||||
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);
|
||||
// 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);
|
||||
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);
|
||||
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)) {
|
||||
private static void checkUpdate() {
|
||||
BufferedReader in = null;
|
||||
try {
|
||||
URL url = new URL(CHECK_UPDATE_URL);
|
||||
in = new BufferedReader(new InputStreamReader(url.openStream()));
|
||||
|
||||
// for copying style
|
||||
JLabel label = new JLabel();
|
||||
Font font = label.getFont();
|
||||
Color color = label.getBackground();
|
||||
String inputLine, lastLine = null;
|
||||
while ((inputLine = in.readLine()) != null) {
|
||||
lastLine = inputLine;
|
||||
}
|
||||
if (lastLine != null && !lastLine.equals(APP_VERSION)) {
|
||||
|
||||
// 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()
|
||||
+ ");");
|
||||
// for copying style
|
||||
JLabel label = new JLabel();
|
||||
Font font = label.getFont();
|
||||
Color color = label.getBackground();
|
||||
|
||||
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>");
|
||||
// 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()
|
||||
+ ");");
|
||||
|
||||
ep.setEditable(false);
|
||||
ep.setBorder(null);
|
||||
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.addHyperlinkListener(new HyperlinkListener() {
|
||||
ep.setEditable(false);
|
||||
ep.setBorder(null);
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
});
|
||||
ep.addHyperlinkListener(new HyperlinkListener() {
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@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();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
JOptionPane.showMessageDialog(null, ep, "Update available", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
} catch (HttpTimeoutException e) {
|
||||
System.out.println("Could not connect to url to check for updates (timeout): " + CHECK_UPDATE_URL);
|
||||
} catch (IOException e) {
|
||||
if (e.getMessage() != null && e.getMessage().startsWith("Server returned HTTP response code:")) {
|
||||
System.out.println("Could not fetch current version from server to check for updates (non-success-status): " + e.getMessage());
|
||||
} else {
|
||||
System.out.println("Could not check for updates: '" + CHECK_UPDATE_URL + "' - " + e.getMessage());
|
||||
}
|
||||
} 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String readVersionFromFile() {
|
||||
try (BufferedReader reader = new BufferedReader(new InputStreamReader(
|
||||
Objects.requireNonNull(ATContentStudio.class.getResourceAsStream("/ATCS_latest"))))) {
|
||||
return reader.readLine();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,103 +1,104 @@
|
||||
package com.gpl.rpg.atcontentstudio;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.io.SettingsSave;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.io.SettingsSave;
|
||||
|
||||
public class ConfigCache implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 4584324644282843961L;
|
||||
|
||||
private static final File CONFIG_CACHE_STORAGE;
|
||||
|
||||
private static ConfigCache instance = null;
|
||||
private static final long serialVersionUID = 4584324644282843961L;
|
||||
|
||||
private static final File CONFIG_CACHE_STORAGE;
|
||||
|
||||
private static ConfigCache instance = null;
|
||||
|
||||
|
||||
static {
|
||||
if (System.getenv("APPDATA") != null) {
|
||||
CONFIG_CACHE_STORAGE = new File(System.getenv("APPDATA")+File.separator+ATContentStudio.APP_NAME+File.separator+"configCache" );
|
||||
} else {
|
||||
CONFIG_CACHE_STORAGE = new File(System.getenv("HOME")+File.separator+"."+ATContentStudio.APP_NAME+File.separator+"configCache" );
|
||||
}
|
||||
CONFIG_CACHE_STORAGE.getParentFile().mkdirs();
|
||||
if (CONFIG_CACHE_STORAGE.exists()) {
|
||||
ConfigCache.instance = (ConfigCache) SettingsSave.loadInstance(CONFIG_CACHE_STORAGE, "Configuration cache");
|
||||
if (ConfigCache.instance == null) {
|
||||
ConfigCache.instance = new ConfigCache();
|
||||
}
|
||||
} else {
|
||||
ConfigCache.instance = new ConfigCache();
|
||||
}
|
||||
}
|
||||
static {
|
||||
if (System.getenv("APPDATA") != null) {
|
||||
CONFIG_CACHE_STORAGE = new File(System.getenv("APPDATA") + File.separator + ATContentStudio.APP_NAME + File.separator + "configCache");
|
||||
} else {
|
||||
CONFIG_CACHE_STORAGE = new File(System.getenv("HOME") + File.separator + "." + ATContentStudio.APP_NAME + File.separator + "configCache");
|
||||
}
|
||||
CONFIG_CACHE_STORAGE.getParentFile().mkdirs();
|
||||
if (CONFIG_CACHE_STORAGE.exists()) {
|
||||
ConfigCache.instance = (ConfigCache) SettingsSave.loadInstance(CONFIG_CACHE_STORAGE, "Configuration cache");
|
||||
if (ConfigCache.instance == null) {
|
||||
ConfigCache.instance = new ConfigCache();
|
||||
}
|
||||
} else {
|
||||
ConfigCache.instance = new ConfigCache();
|
||||
}
|
||||
}
|
||||
|
||||
private void save() {
|
||||
SettingsSave.saveInstance(instance, ConfigCache.CONFIG_CACHE_STORAGE, "Configuration cache");
|
||||
}
|
||||
private void save() {
|
||||
SettingsSave.saveInstance(instance, ConfigCache.CONFIG_CACHE_STORAGE, "Configuration cache");
|
||||
}
|
||||
|
||||
|
||||
private List<File> knownWorkspaces = new ArrayList<File>();
|
||||
private File latestWorkspace = null;
|
||||
private String favoriteLaFClassName = null;
|
||||
private boolean[] notifConfig = new boolean[]{true, true, true, true};
|
||||
private List<File> knownWorkspaces = new ArrayList<File>();
|
||||
private File latestWorkspace = null;
|
||||
private String favoriteLaFClassName = null;
|
||||
private boolean[] notifConfig = new boolean[]{true, true, true, true};
|
||||
|
||||
|
||||
public static List<File> getKnownWorkspaces() {
|
||||
return instance.knownWorkspaces;
|
||||
}
|
||||
|
||||
public static void addWorkspace(File w) {
|
||||
instance.knownWorkspaces.add(w);
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static void removeWorkspace(File w) {
|
||||
instance.knownWorkspaces.remove(w);
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static File getLatestWorkspace() {
|
||||
return instance.latestWorkspace;
|
||||
}
|
||||
|
||||
public static void setLatestWorkspace(File latestWorkspace) {
|
||||
instance.latestWorkspace = latestWorkspace;
|
||||
instance.save();
|
||||
}
|
||||
public static List<File> getKnownWorkspaces() {
|
||||
return instance.knownWorkspaces;
|
||||
}
|
||||
|
||||
public static String getFavoriteLaFClassName() {
|
||||
return instance.favoriteLaFClassName;
|
||||
}
|
||||
|
||||
public static void setFavoriteLaFClassName(String favoriteLaFClassName) {
|
||||
instance.favoriteLaFClassName = favoriteLaFClassName;
|
||||
instance.save();
|
||||
}
|
||||
public static void addWorkspace(File w) {
|
||||
instance.knownWorkspaces.add(w);
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static void putNotifViewConfig(boolean[] view) {
|
||||
for (int i=instance.notifConfig.length; i<0; --i) {
|
||||
instance.notifConfig[i] = view[i];
|
||||
}
|
||||
instance.save();
|
||||
}
|
||||
public static void removeWorkspace(File w) {
|
||||
instance.knownWorkspaces.remove(w);
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static boolean[] getNotifViewConfig() {
|
||||
if (instance == null || instance.notifConfig == null) {
|
||||
//Not yet initialized. All flags on to help corner out init issues.
|
||||
return new boolean[]{true, true, true, true};
|
||||
}
|
||||
return instance.notifConfig;
|
||||
}
|
||||
public static File getLatestWorkspace() {
|
||||
return instance.latestWorkspace;
|
||||
}
|
||||
|
||||
public static void init() {}
|
||||
public static void setLatestWorkspace(File latestWorkspace) {
|
||||
instance.latestWorkspace = latestWorkspace;
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
instance.knownWorkspaces.clear();
|
||||
setFavoriteLaFClassName(null);
|
||||
instance.notifConfig = new boolean[]{true, true, true, true};
|
||||
instance.save();
|
||||
}
|
||||
public static String getFavoriteLaFClassName() {
|
||||
return instance.favoriteLaFClassName;
|
||||
}
|
||||
|
||||
public static void setFavoriteLaFClassName(String favoriteLaFClassName) {
|
||||
instance.favoriteLaFClassName = favoriteLaFClassName;
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static void putNotifViewConfig(boolean[] view) {
|
||||
for (int i = instance.notifConfig.length; i < 0; --i) {
|
||||
instance.notifConfig[i] = view[i];
|
||||
}
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static boolean[] getNotifViewConfig() {
|
||||
if (instance == null || instance.notifConfig == null) {
|
||||
//Not yet initialized. All flags on to help corner out init issues.
|
||||
return new boolean[]{true, true, true, true};
|
||||
}
|
||||
return instance.notifConfig;
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
instance.knownWorkspaces.clear();
|
||||
setFavoriteLaFClassName(null);
|
||||
instance.notifConfig = new boolean[]{true, true, true, true};
|
||||
instance.save();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -6,87 +6,87 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
public class Notification {
|
||||
|
||||
public static List<Notification> notifs = new ArrayList<Notification>();
|
||||
private static List<NotificationListener> listeners = new CopyOnWriteArrayList<NotificationListener>();
|
||||
public static boolean showS = true, showI = true, showW = true, showE = true;
|
||||
|
||||
static {
|
||||
boolean[] config = ConfigCache.getNotifViewConfig();
|
||||
showS = config[0];
|
||||
showI = config[1];
|
||||
showW = config[2];
|
||||
showE = config[3];
|
||||
}
|
||||
|
||||
public static enum Type {
|
||||
SUCCESS,
|
||||
INFO,
|
||||
WARN,
|
||||
ERROR
|
||||
}
|
||||
|
||||
public Type type;
|
||||
public String text;
|
||||
|
||||
public Notification(Type type, String text) {
|
||||
this.type = type;
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "["+type.toString()+"] "+text;
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
int i = notifs.size();
|
||||
notifs.clear();
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onListCleared(i);
|
||||
}
|
||||
}
|
||||
public static List<Notification> notifs = new ArrayList<Notification>();
|
||||
private static List<NotificationListener> listeners = new CopyOnWriteArrayList<NotificationListener>();
|
||||
public static boolean showS, showI, showW, showE;
|
||||
|
||||
static {
|
||||
boolean[] config = ConfigCache.getNotifViewConfig();
|
||||
showS = config[0];
|
||||
showI = config[1];
|
||||
showW = config[2];
|
||||
showE = config[3];
|
||||
}
|
||||
|
||||
public static enum Type {
|
||||
SUCCESS,
|
||||
INFO,
|
||||
WARN,
|
||||
ERROR
|
||||
}
|
||||
|
||||
public Type type;
|
||||
public String text;
|
||||
|
||||
public Notification(Type type, String text) {
|
||||
this.type = type;
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "[" + type.toString() + "] " + text;
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
int i = notifs.size();
|
||||
notifs.clear();
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onListCleared(i);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addSuccess(String text) {
|
||||
if (!showS) return;
|
||||
Notification n = new Notification(Notification.Type.SUCCESS, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addInfo(String text) {
|
||||
if (!showI) return;
|
||||
Notification n = new Notification(Notification.Type.INFO, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addWarn(String text) {
|
||||
if (!showW) return;
|
||||
Notification n = new Notification(Notification.Type.WARN, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addError(String text) {
|
||||
if (!showE) return;
|
||||
Notification n = new Notification(Notification.Type.ERROR, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addNotificationListener(NotificationListener l) {
|
||||
listeners.add(l);
|
||||
}
|
||||
|
||||
public static void removeNotificationListener(NotificationListener l) {
|
||||
listeners.remove(l);
|
||||
}
|
||||
|
||||
public static void addSuccess(String text) {
|
||||
if (!showS) return;
|
||||
Notification n = new Notification(Notification.Type.SUCCESS, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addInfo(String text) {
|
||||
if (!showI) return;
|
||||
Notification n = new Notification(Notification.Type.INFO, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addWarn(String text) {
|
||||
if (!showW) return;
|
||||
Notification n = new Notification(Notification.Type.WARN, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addError(String text) {
|
||||
if (!showE) return;
|
||||
Notification n = new Notification(Notification.Type.ERROR, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addNotificationListener(NotificationListener l) {
|
||||
listeners.add(l);
|
||||
}
|
||||
|
||||
public static void removeNotificationListener(NotificationListener l) {
|
||||
listeners.remove(l);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,7 +2,8 @@ package com.gpl.rpg.atcontentstudio;
|
||||
|
||||
public interface NotificationListener {
|
||||
|
||||
public void onNewNotification(Notification n);
|
||||
public void onListCleared(int i);
|
||||
|
||||
public void onNewNotification(Notification n);
|
||||
|
||||
public void onListCleared(int i);
|
||||
|
||||
}
|
||||
@@ -4,50 +4,50 @@ import java.io.StringWriter;
|
||||
|
||||
public class JsonPrettyWriter extends StringWriter {
|
||||
|
||||
private int indentLevel = 0;
|
||||
private String indentText = " ";
|
||||
|
||||
public JsonPrettyWriter() {
|
||||
super();
|
||||
}
|
||||
|
||||
public JsonPrettyWriter(String indent) {
|
||||
super();
|
||||
this.indentText = indent;
|
||||
}
|
||||
private int indentLevel = 0;
|
||||
private String indentText = " ";
|
||||
|
||||
@Override
|
||||
public void write(int c) {
|
||||
if (((char) c) == '[' || ((char) c) == '{') {
|
||||
super.write(c);
|
||||
super.write('\n');
|
||||
indentLevel++;
|
||||
writeIndentation();
|
||||
} else if (((char) c) == ',') {
|
||||
super.write(c);
|
||||
super.write('\n');
|
||||
writeIndentation();
|
||||
} else if (((char) c) == ']' || ((char) c) == '}') {
|
||||
super.write('\n');
|
||||
indentLevel--;
|
||||
writeIndentation();
|
||||
super.write(c);
|
||||
} else {
|
||||
super.write(c);
|
||||
}
|
||||
public JsonPrettyWriter() {
|
||||
super();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Horrible hack to remove the horrible escaping of slashes in json-simple....
|
||||
@Override
|
||||
public void write(String str) {
|
||||
super.write(str.replaceAll("\\\\/", "/"));
|
||||
}
|
||||
public JsonPrettyWriter(String indent) {
|
||||
super();
|
||||
this.indentText = indent;
|
||||
}
|
||||
|
||||
private void writeIndentation() {
|
||||
for (int i = 0; i < indentLevel; i++) {
|
||||
super.write(indentText);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void write(int c) {
|
||||
if (((char) c) == '[' || ((char) c) == '{') {
|
||||
super.write(c);
|
||||
super.write('\n');
|
||||
indentLevel++;
|
||||
writeIndentation();
|
||||
} else if (((char) c) == ',') {
|
||||
super.write(c);
|
||||
super.write('\n');
|
||||
writeIndentation();
|
||||
} else if (((char) c) == ']' || ((char) c) == '}') {
|
||||
super.write('\n');
|
||||
indentLevel--;
|
||||
writeIndentation();
|
||||
super.write(c);
|
||||
} else {
|
||||
super.write(c);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Horrible hack to remove the horrible escaping of slashes in json-simple....
|
||||
@Override
|
||||
public void write(String str) {
|
||||
super.write(str.replaceAll("\\\\/", "/"));
|
||||
}
|
||||
|
||||
private void writeIndentation() {
|
||||
for (int i = 0; i < indentLevel; i++) {
|
||||
super.write(indentText);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
8
src/com/gpl/rpg/atcontentstudio/io/JsonSerializable.java
Normal file
8
src/com/gpl/rpg/atcontentstudio/io/JsonSerializable.java
Normal file
@@ -0,0 +1,8 @@
|
||||
package com.gpl.rpg.atcontentstudio.io;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public interface JsonSerializable {
|
||||
Map toMap();
|
||||
void fromMap(Map map);
|
||||
}
|
||||
@@ -1,76 +1,70 @@
|
||||
package com.gpl.rpg.atcontentstudio.io;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
public class SettingsSave {
|
||||
|
||||
public static void saveInstance(Object obj, File f, String type) {
|
||||
try {
|
||||
FileOutputStream fos = new FileOutputStream(f);
|
||||
try {
|
||||
ObjectOutputStream oos = new ObjectOutputStream(fos);
|
||||
oos.writeObject(obj);
|
||||
oos.flush();
|
||||
oos.close();
|
||||
Notification.addSuccess(type+" successfully saved.");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" saving error: "+e.getMessage());
|
||||
} finally {
|
||||
try {
|
||||
fos.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" saving error: "+e.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" saving error: "+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static Object loadInstance(File f, String type) {
|
||||
FileInputStream fis;
|
||||
Object result = null;
|
||||
try {
|
||||
fis = new FileInputStream(f);
|
||||
ObjectInputStream ois;
|
||||
try {
|
||||
ois = new ObjectInputStream(fis);
|
||||
try {
|
||||
result = ois.readObject();
|
||||
Notification.addSuccess(type+" successfully loaded.");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" loading error: "+e.getMessage());
|
||||
} finally {
|
||||
ois.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" loading error: "+e.getMessage());
|
||||
} finally {
|
||||
try {
|
||||
fis.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" loading error: "+e.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" loading error: "+e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void saveInstance(Object obj, File f, String type) {
|
||||
try {
|
||||
FileOutputStream fos = new FileOutputStream(f);
|
||||
try {
|
||||
ObjectOutputStream oos = new ObjectOutputStream(fos);
|
||||
oos.writeObject(obj);
|
||||
oos.flush();
|
||||
oos.close();
|
||||
Notification.addSuccess(type + " successfully saved.");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " saving error: " + e.getMessage());
|
||||
} finally {
|
||||
try {
|
||||
fos.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " saving error: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " saving error: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static Object loadInstance(File f, String type) {
|
||||
FileInputStream fis;
|
||||
Object result = null;
|
||||
try {
|
||||
fis = new FileInputStream(f);
|
||||
ObjectInputStream ois;
|
||||
try {
|
||||
ois = new ObjectInputStream(fis);
|
||||
try {
|
||||
result = ois.readObject();
|
||||
Notification.addSuccess(type + " successfully loaded.");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " loading error: " + e.getMessage());
|
||||
} finally {
|
||||
ois.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " loading error: " + e.getMessage());
|
||||
} finally {
|
||||
try {
|
||||
fis.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " loading error: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " loading error: " + e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,124 +1,135 @@
|
||||
package com.gpl.rpg.atcontentstudio.model;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
public class ClosedProject implements ProjectTreeNode {
|
||||
|
||||
String name;
|
||||
Workspace parent;
|
||||
|
||||
public ClosedProject(Workspace w, String name) {
|
||||
this.parent = w;
|
||||
this.name = name;
|
||||
}
|
||||
String name;
|
||||
Workspace parent;
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
public ClosedProject(Workspace w, String name) {
|
||||
this.parent = w;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return name+" [closed]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return name + " [closed]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,193 +1,237 @@
|
||||
package com.gpl.rpg.atcontentstudio.model;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.bookmarks.BookmarkEntry;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public abstract class GameDataElement implements ProjectTreeNode, Serializable {
|
||||
|
||||
private static final long serialVersionUID = 2028934451226743389L;
|
||||
|
||||
public static enum State {
|
||||
init, // We know the object exists, and have its key/ID.
|
||||
parsed, // We know the object's properties, but related objects are referenced by ID only.
|
||||
linked, // We know the object fully, and all links to related objects point to objects in the parsed state at least.
|
||||
created, // This is an object we are creating
|
||||
modified, // Whether altered or created, this item has been modified since creation from scratch or from JSON.
|
||||
saved // Whether altered or created, this item has been saved since last modification.
|
||||
}
|
||||
|
||||
public State state = State.init;
|
||||
|
||||
//Available from state init.
|
||||
public ProjectTreeNode parent;
|
||||
|
||||
public boolean writable = false;
|
||||
|
||||
public BookmarkEntry bookmark = null;
|
||||
|
||||
//List of objects whose transition to "linked" state made them point to this instance.
|
||||
private Map<GameDataElement, Integer> backlinks = new ConcurrentHashMap<GameDataElement, Integer>();
|
||||
private static final long serialVersionUID = 2028934451226743389L;
|
||||
|
||||
public String id = null;
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
public static enum State {
|
||||
init, // We know the object exists, and have its key/ID.
|
||||
parsed, // We know the object's properties, but related objects are referenced by ID only.
|
||||
linked, // We know the object fully, and all links to related objects point to objects in the parsed state at least.
|
||||
created, // This is an object we are creating
|
||||
modified, // Whether altered or created, this item has been modified since creation from scratch or from JSON.
|
||||
saved // Whether altered or created, this item has been saved since last modification.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
public State state = State.init;
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
@Override
|
||||
public abstract String getDesc();
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "GameDataElements";
|
||||
}
|
||||
|
||||
public abstract void parse();
|
||||
public abstract void link();
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent == null ? null : parent.getProject();
|
||||
}
|
||||
|
||||
|
||||
public Image getIcon() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {return null;}
|
||||
@Override
|
||||
public Image getOpenIcon() {return null;}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return getIcon();
|
||||
}
|
||||
|
||||
|
||||
public abstract GameDataElement clone();
|
||||
|
||||
public abstract void elementChanged(GameDataElement oldOne, GameDataElement newOne);
|
||||
//Available from state init.
|
||||
public ProjectTreeNode parent;
|
||||
|
||||
|
||||
@Override
|
||||
public GameSource.Type getDataType() {
|
||||
if (parent == null) {
|
||||
System.out.println("blerf.");
|
||||
}
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
|
||||
public List<BacklinksListener> backlinkListeners = new ArrayList<GameDataElement.BacklinksListener>();
|
||||
|
||||
public void addBacklinkListener(BacklinksListener l) {
|
||||
backlinkListeners.add(l);
|
||||
}
|
||||
public boolean writable = false;
|
||||
|
||||
public void removeBacklinkListener(BacklinksListener l) {
|
||||
backlinkListeners.remove(l);
|
||||
}
|
||||
|
||||
public void addBacklink(GameDataElement gde) {
|
||||
if (!backlinks.containsKey(gde)) {
|
||||
backlinks.put(gde, 1);
|
||||
for (BacklinksListener l : backlinkListeners) {
|
||||
l.backlinkAdded(gde);
|
||||
}
|
||||
} else {
|
||||
backlinks.put(gde, backlinks.get(gde) + 1);
|
||||
}
|
||||
}
|
||||
public BookmarkEntry bookmark = null;
|
||||
|
||||
public void removeBacklink(GameDataElement gde) {
|
||||
if (backlinks.get(gde) == null) return;
|
||||
backlinks.put(gde, backlinks.get(gde) - 1);
|
||||
if (backlinks.get(gde) == 0) {
|
||||
backlinks.remove(gde);
|
||||
for (BacklinksListener l : backlinkListeners) {
|
||||
l.backlinkRemoved(gde);
|
||||
}
|
||||
}
|
||||
}
|
||||
//List of objects whose transition to "linked" state made them point to this instance.
|
||||
private Map<GameDataElement, Integer> backlinks = new ConcurrentHashMap<GameDataElement, Integer>();
|
||||
|
||||
public Set<GameDataElement> getBacklinks() {
|
||||
return backlinks.keySet();
|
||||
}
|
||||
|
||||
public static interface BacklinksListener {
|
||||
public void backlinkAdded(GameDataElement gde);
|
||||
public void backlinkRemoved(GameDataElement gde);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean needsSaving() {
|
||||
return this.state == State.modified || this.state == State.created;
|
||||
}
|
||||
|
||||
public abstract String getProjectFilename();
|
||||
|
||||
public abstract void save();
|
||||
|
||||
public abstract List<SaveEvent> attemptSave();
|
||||
|
||||
public String id = null;
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public abstract String getDesc();
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "GameDataElements";
|
||||
}
|
||||
|
||||
public abstract void parse();
|
||||
|
||||
public abstract void link();
|
||||
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent == null ? null : parent.getProject();
|
||||
}
|
||||
|
||||
|
||||
public Image getIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return getIcon();
|
||||
}
|
||||
|
||||
|
||||
public abstract GameDataElement clone();
|
||||
|
||||
public abstract void elementChanged(GameDataElement oldOne, GameDataElement newOne);
|
||||
|
||||
|
||||
@Override
|
||||
public GameSource.Type getDataType() {
|
||||
if (parent == null) {
|
||||
System.out.println("blerf.");
|
||||
}
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
|
||||
public List<BacklinksListener> backlinkListeners = new ArrayList<GameDataElement.BacklinksListener>();
|
||||
|
||||
public void addBacklinkListener(BacklinksListener l) {
|
||||
backlinkListeners.add(l);
|
||||
}
|
||||
|
||||
public void removeBacklinkListener(BacklinksListener l) {
|
||||
backlinkListeners.remove(l);
|
||||
}
|
||||
|
||||
public void addBacklink(GameDataElement gde) {
|
||||
if (!backlinks.containsKey(gde)) {
|
||||
backlinks.put(gde, 1);
|
||||
for (BacklinksListener l : backlinkListeners) {
|
||||
l.backlinkAdded(gde);
|
||||
}
|
||||
} else {
|
||||
backlinks.put(gde, backlinks.get(gde) + 1);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeBacklink(GameDataElement gde) {
|
||||
if (backlinks.get(gde) == null) return;
|
||||
backlinks.put(gde, backlinks.get(gde) - 1);
|
||||
if (backlinks.get(gde) == 0) {
|
||||
backlinks.remove(gde);
|
||||
for (BacklinksListener l : backlinkListeners) {
|
||||
l.backlinkRemoved(gde);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Set<GameDataElement> getBacklinks() {
|
||||
return backlinks.keySet();
|
||||
}
|
||||
|
||||
public static interface BacklinksListener {
|
||||
public void backlinkAdded(GameDataElement gde);
|
||||
|
||||
public void backlinkRemoved(GameDataElement gde);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean needsSaving() {
|
||||
return this.state == State.modified || this.state == State.created;
|
||||
}
|
||||
|
||||
public abstract String getProjectFilename();
|
||||
|
||||
public abstract void save();
|
||||
|
||||
public abstract List<SaveEvent> attemptSave();
|
||||
|
||||
/**
|
||||
* Checks if the current state indicates that parsing/linking should be skipped.
|
||||
*
|
||||
* @return true if the operation should be skipped, false otherwise
|
||||
*/
|
||||
protected boolean shouldSkipParseOrLink() {
|
||||
if (shouldSkipParse()) return true;
|
||||
if (this.state == State.linked) {
|
||||
//Already linked.
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean shouldSkipParse() {
|
||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
||||
//This type of state is unrelated to parsing/linking.
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures the element is parsed if needed based on its current state.
|
||||
*/
|
||||
protected void ensureParseIfNeeded() {
|
||||
if (this.state == State.init) {
|
||||
//Not parsed yet.
|
||||
this.parse();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,28 +1,6 @@
|
||||
package com.gpl.rpg.atcontentstudio.model;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.io.JsonSerializable;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project.ResourceSet;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
|
||||
@@ -32,263 +10,317 @@ import com.gpl.rpg.atcontentstudio.model.sprites.SpriteSheetSet;
|
||||
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
|
||||
import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
public class GameSource implements ProjectTreeNode, Serializable {
|
||||
import javax.swing.tree.TreeNode;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import java.awt.*;
|
||||
import java.io.*;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
private static final long serialVersionUID = -1512979360971918158L;
|
||||
|
||||
public static final String DEFAULT_REL_PATH_FOR_GAME_RESOURCE = "res"+File.separator+"values"+File.separator+"loadresources.xml";
|
||||
public static final String DEFAULT_REL_PATH_FOR_DEBUG_RESOURCE = "res"+File.separator+"values"+File.separator+"loadresources_debug.xml";
|
||||
|
||||
public transient GameDataSet gameData;
|
||||
public transient TMXMapSet gameMaps;
|
||||
public transient SpriteSheetSet gameSprites;
|
||||
public transient Worldmap worldmap;
|
||||
public transient WriterModeDataSet writerModeDataSet;
|
||||
private transient SavedSlotCollection v;
|
||||
|
||||
public static enum Type {
|
||||
source,
|
||||
referenced,
|
||||
altered,
|
||||
created
|
||||
}
|
||||
|
||||
public File baseFolder;
|
||||
public Type type;
|
||||
|
||||
public transient Project parent = null;
|
||||
|
||||
public transient Map<String, List<String>> referencedSourceFiles = null;
|
||||
|
||||
public GameSource(File folder, Project parent) {
|
||||
this.parent = parent;
|
||||
this.baseFolder = folder;
|
||||
this.type = Type.source;
|
||||
initData();
|
||||
}
|
||||
|
||||
public GameSource(Project parent, Type type) {
|
||||
this.parent = parent;
|
||||
this.baseFolder = new File(parent.baseFolder, type.toString());
|
||||
this.type = type;
|
||||
initData();
|
||||
}
|
||||
|
||||
public void refreshTransients(Project p) {
|
||||
parent = p;
|
||||
initData();
|
||||
}
|
||||
public class GameSource implements ProjectTreeNode, Serializable, JsonSerializable {
|
||||
|
||||
public void initData() {
|
||||
if (type == Type.source) {
|
||||
if (parent.sourceSetToUse == ResourceSet.gameData || parent.sourceSetToUse == ResourceSet.debugData) {
|
||||
referencedSourceFiles = new LinkedHashMap<String, List<String>>();
|
||||
readResourceList();
|
||||
}
|
||||
}
|
||||
if (type == Type.created) {
|
||||
this.writerModeDataSet = new WriterModeDataSet(this);
|
||||
}
|
||||
this.gameData = new GameDataSet(this);
|
||||
this.gameMaps = new TMXMapSet(this);
|
||||
this.gameSprites = new SpriteSheetSet(this);
|
||||
this.worldmap = new Worldmap(this);
|
||||
v = new SavedSlotCollection();
|
||||
v.add(gameData);
|
||||
v.add(gameMaps);
|
||||
v.add(gameSprites);
|
||||
v.add(worldmap);
|
||||
if (type == Type.created) {
|
||||
v.add(writerModeDataSet);
|
||||
}
|
||||
}
|
||||
|
||||
public void readResourceList() {
|
||||
File xmlFile = null;
|
||||
if (parent.sourceSetToUse == ResourceSet.gameData) {
|
||||
xmlFile = new File(baseFolder, DEFAULT_REL_PATH_FOR_GAME_RESOURCE);
|
||||
} else if (parent.sourceSetToUse == ResourceSet.debugData) {
|
||||
xmlFile = new File(baseFolder, DEFAULT_REL_PATH_FOR_DEBUG_RESOURCE);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!xmlFile.exists()) return;
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
Document doc;
|
||||
try {
|
||||
factory.setIgnoringComments(true);
|
||||
factory.setIgnoringElementContentWhitespace(true);
|
||||
factory.setExpandEntityReferences(false);
|
||||
DocumentBuilder builder = factory.newDocumentBuilder();
|
||||
InputSource insrc = new InputSource(new FileInputStream(xmlFile));
|
||||
private static final long serialVersionUID = -1512979360971918158L;
|
||||
|
||||
public static final String DEFAULT_REL_PATH_FOR_GAME_RESOURCE = "res" + File.separator + "values" + File.separator + "loadresources.xml";
|
||||
public static final String DEFAULT_REL_PATH_FOR_DEBUG_RESOURCE = "res" + File.separator + "values" + File.separator + "loadresources_debug.xml";
|
||||
|
||||
public transient GameDataSet gameData;
|
||||
public transient TMXMapSet gameMaps;
|
||||
public transient SpriteSheetSet gameSprites;
|
||||
public transient Worldmap worldmap;
|
||||
public transient WriterModeDataSet writerModeDataSet;
|
||||
private transient SavedSlotCollection v;
|
||||
|
||||
|
||||
@Override
|
||||
public Map toMap() {
|
||||
Map map = new HashMap();
|
||||
map.put("type", type.toString());
|
||||
map.put("baseFolder", baseFolder.getPath());
|
||||
return map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fromMap(Map map) {
|
||||
if(map==null)return;
|
||||
type = Enum.valueOf(Type.class, (String)map.get("type"));
|
||||
baseFolder = new File((String) map.get("baseFolder"));
|
||||
}
|
||||
|
||||
public static enum Type {
|
||||
source,
|
||||
referenced,
|
||||
altered,
|
||||
created
|
||||
}
|
||||
|
||||
public File baseFolder;
|
||||
public Type type;
|
||||
|
||||
public transient Project parent;
|
||||
|
||||
public transient Map<String, List<String>> referencedSourceFiles = null;
|
||||
|
||||
public GameSource(Map json, Project parent) {
|
||||
fromMap(json);
|
||||
refreshTransients(parent);
|
||||
}
|
||||
public GameSource(File folder, Project parent) {
|
||||
this.parent = parent;
|
||||
this.baseFolder = folder;
|
||||
this.type = Type.source;
|
||||
initData();
|
||||
}
|
||||
|
||||
public GameSource(Project parent, Type type) {
|
||||
this.parent = parent;
|
||||
this.baseFolder = new File(parent.baseFolder, type.toString());
|
||||
this.type = type;
|
||||
initData();
|
||||
}
|
||||
|
||||
public void refreshTransients(Project p) {
|
||||
parent = p;
|
||||
initData();
|
||||
}
|
||||
|
||||
public void initData() {
|
||||
if (type == Type.source) {
|
||||
if (parent.sourceSetToUse == ResourceSet.gameData || parent.sourceSetToUse == ResourceSet.debugData) {
|
||||
referencedSourceFiles = new LinkedHashMap<String, List<String>>();
|
||||
readResourceList();
|
||||
}
|
||||
}
|
||||
if (type == Type.created) {
|
||||
this.writerModeDataSet = new WriterModeDataSet(this);
|
||||
}
|
||||
this.gameData = new GameDataSet(this);
|
||||
this.gameMaps = new TMXMapSet(this);
|
||||
this.gameSprites = new SpriteSheetSet(this);
|
||||
this.worldmap = new Worldmap(this);
|
||||
v = new SavedSlotCollection();
|
||||
v.add(gameData);
|
||||
v.add(gameMaps);
|
||||
v.add(gameSprites);
|
||||
v.add(worldmap);
|
||||
if (type == Type.created) {
|
||||
v.add(writerModeDataSet);
|
||||
}
|
||||
}
|
||||
|
||||
public void readResourceList() {
|
||||
File xmlFile;
|
||||
if (parent.sourceSetToUse == ResourceSet.gameData) {
|
||||
xmlFile = new File(baseFolder, DEFAULT_REL_PATH_FOR_GAME_RESOURCE);
|
||||
} else if (parent.sourceSetToUse == ResourceSet.debugData) {
|
||||
xmlFile = new File(baseFolder, DEFAULT_REL_PATH_FOR_DEBUG_RESOURCE);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!xmlFile.exists()) return;
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
Document doc;
|
||||
try {
|
||||
factory.setIgnoringComments(true);
|
||||
factory.setIgnoringElementContentWhitespace(true);
|
||||
factory.setExpandEntityReferences(false);
|
||||
DocumentBuilder builder = factory.newDocumentBuilder();
|
||||
InputSource insrc = new InputSource(new FileInputStream(xmlFile));
|
||||
// insrc.setSystemId("http://worldmap/");
|
||||
insrc.setEncoding("UTF-8");
|
||||
doc = builder.parse(insrc);
|
||||
|
||||
Element root = (Element) doc.getElementsByTagName("resources").item(0);
|
||||
if (root != null) {
|
||||
NodeList arraysList = root.getElementsByTagName("array");
|
||||
if (arraysList != null) {
|
||||
for (int i = 0; i < arraysList.getLength(); i++) {
|
||||
Element arrayNode = (Element) arraysList.item(i);
|
||||
String name = arrayNode.getAttribute("name");
|
||||
List<String> arrayContents = new ArrayList<String>();
|
||||
NodeList arrayItems = arrayNode.getElementsByTagName("item");
|
||||
if (arrayItems != null) {
|
||||
for (int j = 0; j < arrayItems.getLength(); j++) {
|
||||
arrayContents.add(((Element)arrayItems.item(j)).getTextContent());
|
||||
}
|
||||
referencedSourceFiles.put(name, arrayContents);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SAXException e) {
|
||||
e.printStackTrace();
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ParserConfigurationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return v.getNonEmptyElements();
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return v.getNonEmptyElementAt(arg0);
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return v.getNonEmptySize();
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||
node.notifyCreated();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
switch(type) {
|
||||
case altered: return (needsSaving() ? "*" : "")+"Altered data";
|
||||
case created: return (needsSaving() ? "*" : "")+"Created data";
|
||||
case referenced: return (needsSaving() ? "*" : "")+"Referenced data";
|
||||
case source: return (needsSaving() ? "*" : "")+"AT Source"; //The fact that it is from "source" is already mentionned by its parent.
|
||||
default: return (needsSaving() ? "*" : "")+"Game data";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent == null ? null : parent.getProject();
|
||||
}
|
||||
insrc.setEncoding("UTF-8");
|
||||
doc = builder.parse(insrc);
|
||||
|
||||
public Image getIcon(String iconId) {
|
||||
String[] data = iconId.split(":");
|
||||
for (Spritesheet sheet : gameSprites.spritesheets) {
|
||||
if (sheet.id.equals(data[0])) {
|
||||
return sheet.getIcon(Integer.parseInt(data[1]));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Image getImage(String iconId) {
|
||||
String[] data = iconId.split(":");
|
||||
for (Spritesheet sheet : gameSprites.spritesheets) {
|
||||
if (sheet.id.equals(data[0])) {
|
||||
return sheet.getImage(Integer.parseInt(data[1]));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Element root = (Element) doc.getElementsByTagName("resources").item(0);
|
||||
if (root != null) {
|
||||
NodeList arraysList = root.getElementsByTagName("array");
|
||||
if (arraysList != null) {
|
||||
for (int i = 0; i < arraysList.getLength(); i++) {
|
||||
Element arrayNode = (Element) arraysList.item(i);
|
||||
String name = arrayNode.getAttribute("name");
|
||||
List<String> arrayContents = new ArrayList<String>();
|
||||
NodeList arrayItems = arrayNode.getElementsByTagName("item");
|
||||
if (arrayItems != null) {
|
||||
for (int j = 0; j < arrayItems.getLength(); j++) {
|
||||
arrayContents.add(((Element) arrayItems.item(j)).getTextContent());
|
||||
}
|
||||
referencedSourceFiles.put(name, arrayContents);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SAXException e) {
|
||||
e.printStackTrace();
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (ParserConfigurationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getATClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getATClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getATOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return v.getNonEmptyElements();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return v.isEmpty();
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public WorldmapSegment getWorldmapSegment(String id) {
|
||||
return worldmap.getWorldmapSegment(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return v.getNonEmptyElementAt(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return v.getNonEmptySize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||
node.notifyCreated();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
switch (type) {
|
||||
case altered:
|
||||
return (needsSaving() ? "*" : "") + "Altered data";
|
||||
case created:
|
||||
return (needsSaving() ? "*" : "") + "Created data";
|
||||
case referenced:
|
||||
return (needsSaving() ? "*" : "") + "Referenced data";
|
||||
case source:
|
||||
return (needsSaving() ? "*" : "") + "AT Source"; //The fact that it is from "source" is already mentionned by its parent.
|
||||
default:
|
||||
return (needsSaving() ? "*" : "") + "Game data";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent == null ? null : parent.getProject();
|
||||
}
|
||||
|
||||
public Image getIcon(String iconId) {
|
||||
String[] data = iconId.split(":");
|
||||
for (Spritesheet sheet : gameSprites.spritesheets) {
|
||||
if (sheet.id.equals(data[0])) {
|
||||
return sheet.getIcon(Integer.parseInt(data[1]));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Image getImage(String iconId) {
|
||||
String[] data = iconId.split(":");
|
||||
for (Spritesheet sheet : gameSprites.spritesheets) {
|
||||
if (sheet.id.equals(data[0])) {
|
||||
return sheet.getImage(Integer.parseInt(data[1]));
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getATClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getATClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getATOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return v.isEmpty();
|
||||
}
|
||||
|
||||
public WorldmapSegment getWorldmapSegment(String id) {
|
||||
return worldmap.getWorldmapSegment(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,53 @@
|
||||
package com.gpl.rpg.atcontentstudio.model;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import com.gpl.rpg.atcontentstudio.io.JsonSerializable;
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class Preferences implements Serializable {
|
||||
public class Preferences implements Serializable, JsonSerializable {
|
||||
|
||||
private static final long serialVersionUID = 2455802658424031276L;
|
||||
|
||||
public Dimension windowSize = null;
|
||||
public Map<String, Integer> splittersPositions = new HashMap<String, Integer>();
|
||||
|
||||
public Preferences() {
|
||||
private static final long serialVersionUID = 2455802658424031276L;
|
||||
|
||||
}
|
||||
|
||||
public Dimension windowSize = null;
|
||||
public Map<String, Integer> splittersPositions = new HashMap<>();
|
||||
|
||||
public Preferences() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map toMap() {
|
||||
Map map = new HashMap();
|
||||
|
||||
if(windowSize!= null){
|
||||
Map windowSizeMap = new HashMap<>();
|
||||
windowSizeMap.put("width", windowSize.width);
|
||||
windowSizeMap.put("height", windowSize.height);
|
||||
map.put("windowSize", windowSizeMap);
|
||||
}
|
||||
|
||||
map.put("splittersPositions", splittersPositions);
|
||||
return map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fromMap(Map map) {
|
||||
if(map == null) return;
|
||||
|
||||
Map windowSize1 = (Map) map.get("windowSize");
|
||||
if(windowSize1 != null){
|
||||
windowSize = new Dimension(((Number) windowSize1.get("width")).intValue(), ((Number) windowSize1.get("height")).intValue());
|
||||
}
|
||||
|
||||
Map<String, Number> splitters = (Map<String, Number>) map.get("splittersPositions");
|
||||
Map<String, Integer> splittersInt = new HashMap<>(splitters.size());
|
||||
for (Map.Entry<String, Number> entry : splitters. entrySet()){
|
||||
splittersInt.put(entry.getKey(), entry.getValue().intValue());
|
||||
}
|
||||
splittersPositions = splittersInt;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,10 +2,10 @@ package com.gpl.rpg.atcontentstudio.model;
|
||||
|
||||
public interface ProjectElementListener {
|
||||
|
||||
public void elementAdded(GameDataElement added, int index);
|
||||
|
||||
public void elementRemoved(GameDataElement removed, int index);
|
||||
|
||||
public Class<? extends GameDataElement> getDataType();
|
||||
|
||||
public void elementAdded(GameDataElement added, int index);
|
||||
|
||||
public void elementRemoved(GameDataElement removed, int index);
|
||||
|
||||
public Class<? extends GameDataElement> getDataType();
|
||||
|
||||
}
|
||||
|
||||
@@ -1,59 +1,64 @@
|
||||
package com.gpl.rpg.atcontentstudio.model;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.util.List;
|
||||
|
||||
public interface ProjectTreeNode extends TreeNode {
|
||||
|
||||
public void childrenAdded(List<ProjectTreeNode> path);
|
||||
public void childrenChanged(List<ProjectTreeNode> path);
|
||||
public void childrenRemoved(List<ProjectTreeNode> path);
|
||||
public void notifyCreated();
|
||||
|
||||
public String getDesc();
|
||||
|
||||
/**
|
||||
* Unnecessary for anything not below a Project. Can return null.
|
||||
* @return the parent Project or null.
|
||||
*/
|
||||
public Project getProject();
|
||||
|
||||
public void childrenAdded(List<ProjectTreeNode> path);
|
||||
|
||||
/**
|
||||
* Unnecessary for anything not below a GameDataSet. Can return null.
|
||||
* @return the parent GameDataSet or null.
|
||||
*/
|
||||
public GameDataSet getDataSet();
|
||||
|
||||
public Image getIcon();
|
||||
/**
|
||||
*
|
||||
* @return The icon depicting this node when it is an open folder. Can be null for leaves.
|
||||
*/
|
||||
public Image getOpenIcon();
|
||||
/**
|
||||
*
|
||||
* @return The icon depicting this node when it is a closed folder. Can be null for leaves.
|
||||
*/
|
||||
public Image getClosedIcon();
|
||||
/**
|
||||
*
|
||||
* @return The icon depicting this node when it is a leaf. Should return the closed one for empty folders.
|
||||
*/
|
||||
public Image getLeafIcon();
|
||||
|
||||
/**
|
||||
* Unnecessary for anything not below a GameSource. Can return null.
|
||||
* @return the parent GameSource or null.
|
||||
*/
|
||||
public GameSource.Type getDataType();
|
||||
|
||||
public boolean isEmpty();
|
||||
|
||||
public boolean needsSaving();
|
||||
public void childrenChanged(List<ProjectTreeNode> path);
|
||||
|
||||
public void childrenRemoved(List<ProjectTreeNode> path);
|
||||
|
||||
public void notifyCreated();
|
||||
|
||||
public String getDesc();
|
||||
|
||||
/**
|
||||
* Unnecessary for anything not below a Project. Can return null.
|
||||
*
|
||||
* @return the parent Project or null.
|
||||
*/
|
||||
public Project getProject();
|
||||
|
||||
|
||||
/**
|
||||
* Unnecessary for anything not below a GameDataSet. Can return null.
|
||||
*
|
||||
* @return the parent GameDataSet or null.
|
||||
*/
|
||||
public GameDataSet getDataSet();
|
||||
|
||||
public Image getIcon();
|
||||
|
||||
/**
|
||||
* @return The icon depicting this node when it is an open folder. Can be null for leaves.
|
||||
*/
|
||||
public Image getOpenIcon();
|
||||
|
||||
/**
|
||||
* @return The icon depicting this node when it is a closed folder. Can be null for leaves.
|
||||
*/
|
||||
public Image getClosedIcon();
|
||||
|
||||
/**
|
||||
* @return The icon depicting this node when it is a leaf. Should return the closed one for empty folders.
|
||||
*/
|
||||
public Image getLeafIcon();
|
||||
|
||||
/**
|
||||
* Unnecessary for anything not below a GameSource. Can return null.
|
||||
*
|
||||
* @return the parent GameSource or null.
|
||||
*/
|
||||
public GameSource.Type getDataType();
|
||||
|
||||
public boolean isEmpty();
|
||||
|
||||
public boolean needsSaving();
|
||||
|
||||
}
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
package com.gpl.rpg.atcontentstudio.model;
|
||||
|
||||
public class SaveEvent {
|
||||
|
||||
public enum Type {
|
||||
moveToAltered,
|
||||
moveToCreated,
|
||||
alsoSave
|
||||
}
|
||||
|
||||
public Type type;
|
||||
public GameDataElement target;
|
||||
|
||||
public boolean error = false;
|
||||
public String errorText;
|
||||
|
||||
public SaveEvent(SaveEvent.Type type, GameDataElement target) {
|
||||
this.type = type;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
public SaveEvent(SaveEvent.Type type, GameDataElement target, boolean error, String errorText) {
|
||||
this.type = type;
|
||||
this.target = target;
|
||||
this.error = error;
|
||||
this.errorText = errorText;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof SaveEvent)) return false;
|
||||
else return (((SaveEvent)obj).type == this.type) && (((SaveEvent)obj).target == this.target);
|
||||
}
|
||||
|
||||
public enum Type {
|
||||
moveToAltered,
|
||||
moveToCreated,
|
||||
alsoSave
|
||||
}
|
||||
|
||||
public Type type;
|
||||
public GameDataElement target;
|
||||
|
||||
public boolean error = false;
|
||||
public String errorText;
|
||||
|
||||
public SaveEvent(SaveEvent.Type type, GameDataElement target) {
|
||||
this.type = type;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
public SaveEvent(SaveEvent.Type type, GameDataElement target, boolean error, String errorText) {
|
||||
this.type = type;
|
||||
this.target = target;
|
||||
this.error = error;
|
||||
this.errorText = errorText;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof SaveEvent)) return false;
|
||||
else return (((SaveEvent) obj).type == this.type) && (((SaveEvent) obj).target == this.target);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,67 +5,67 @@ import java.util.Vector;
|
||||
|
||||
public class SavedSlotCollection {
|
||||
|
||||
Vector<ProjectTreeNode> contents = new Vector<ProjectTreeNode>();
|
||||
|
||||
public void add(ProjectTreeNode node) {
|
||||
contents.add(node);
|
||||
}
|
||||
|
||||
public int getNonEmptySize() {
|
||||
Vector<ProjectTreeNode> contents = new Vector<ProjectTreeNode>();
|
||||
|
||||
public void add(ProjectTreeNode node) {
|
||||
contents.add(node);
|
||||
}
|
||||
|
||||
public int getNonEmptySize() {
|
||||
// return contents.size();
|
||||
int size = 0;
|
||||
for (ProjectTreeNode node : contents) {
|
||||
if (!node.isEmpty()) size++;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
public Enumeration<ProjectTreeNode> getNonEmptyElements() {
|
||||
int size = 0;
|
||||
for (ProjectTreeNode node : contents) {
|
||||
if (!node.isEmpty()) size++;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
public Enumeration<ProjectTreeNode> getNonEmptyElements() {
|
||||
// return contents.elements();
|
||||
Vector<ProjectTreeNode> v = new Vector<ProjectTreeNode>();
|
||||
for (ProjectTreeNode node : contents) {
|
||||
if (!node.isEmpty()) v.add(node);
|
||||
}
|
||||
return v.elements();
|
||||
}
|
||||
|
||||
public ProjectTreeNode getNonEmptyElementAt(int index) {
|
||||
Vector<ProjectTreeNode> v = new Vector<ProjectTreeNode>();
|
||||
for (ProjectTreeNode node : contents) {
|
||||
if (!node.isEmpty()) v.add(node);
|
||||
}
|
||||
return v.elements();
|
||||
}
|
||||
|
||||
public ProjectTreeNode getNonEmptyElementAt(int index) {
|
||||
// return contents.get(index);
|
||||
int i = 0;
|
||||
while (i < contents.size()) {
|
||||
if (!contents.get(i).isEmpty()) index--;
|
||||
if (index == -1) return contents.get(i);
|
||||
i++;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
int i = 0;
|
||||
while (i < contents.size()) {
|
||||
if (!contents.get(i).isEmpty()) index--;
|
||||
if (index == -1) return contents.get(i);
|
||||
i++;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public int getNonEmptyIndexOf(ProjectTreeNode node) {
|
||||
|
||||
public int getNonEmptyIndexOf(ProjectTreeNode node) {
|
||||
// return contents.indexOf(node);
|
||||
int index = contents.indexOf(node);
|
||||
int trueIndex = index;
|
||||
for (int i = 0; i < trueIndex; i++) {
|
||||
if (contents.get(i).isEmpty()) index--;
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
int index = contents.indexOf(node);
|
||||
int trueIndex = index;
|
||||
for (int i = 0; i < trueIndex; i++) {
|
||||
if (contents.get(i).isEmpty()) index--;
|
||||
}
|
||||
return index;
|
||||
}
|
||||
|
||||
public Vector<ProjectTreeNode> getNonEmptyIterable() {
|
||||
|
||||
public Vector<ProjectTreeNode> getNonEmptyIterable() {
|
||||
// return contents;
|
||||
Vector<ProjectTreeNode> v = new Vector<ProjectTreeNode>();
|
||||
for (ProjectTreeNode node : contents) {
|
||||
if (!node.isEmpty()) v.add(node);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
Vector<ProjectTreeNode> v = new Vector<ProjectTreeNode>();
|
||||
for (ProjectTreeNode node : contents) {
|
||||
if (!node.isEmpty()) v.add(node);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
// return contents.isEmpty();
|
||||
for (ProjectTreeNode node : contents) {
|
||||
if (!node.isEmpty()) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
for (ProjectTreeNode node : contents) {
|
||||
if (!node.isEmpty()) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,369 +1,423 @@
|
||||
package com.gpl.rpg.atcontentstudio.model;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
import java.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import javax.swing.tree.TreePath;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.ATContentStudio;
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.io.JsonSerializable;
|
||||
import com.gpl.rpg.atcontentstudio.io.SettingsSave;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.ProjectsTree.ProjectsTreeModel;
|
||||
import com.gpl.rpg.atcontentstudio.ui.WorkerDialog;
|
||||
import com.gpl.rpg.atcontentstudio.utils.FileUtils;
|
||||
import org.jsoup.SerializationException;
|
||||
|
||||
public class Workspace implements ProjectTreeNode, Serializable {
|
||||
import javax.swing.tree.TreeNode;
|
||||
import javax.swing.tree.TreePath;
|
||||
import java.awt.*;
|
||||
import java.io.*;
|
||||
import java.nio.file.Files;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
private static final long serialVersionUID = 7938633033601384956L;
|
||||
public class Workspace implements ProjectTreeNode, Serializable, JsonSerializable {
|
||||
|
||||
public static final String WS_SETTINGS_FILE = ".workspace";
|
||||
private static final long serialVersionUID = 7938633033601384956L;
|
||||
|
||||
public static Workspace activeWorkspace;
|
||||
public static final String WS_SETTINGS_FILE = ".workspace";
|
||||
public static final String WS_SETTINGS_FILE_JSON = ".workspace.json";
|
||||
|
||||
public Preferences preferences = new Preferences();
|
||||
public File baseFolder;
|
||||
public File settingsFile;
|
||||
public transient WorkspaceSettings settings;
|
||||
public transient List<ProjectTreeNode> projects = new ArrayList<ProjectTreeNode>();
|
||||
public Set<String> projectsName = new HashSet<String>();
|
||||
public Map<String, Boolean> projectsOpenByName = new HashMap<String, Boolean>();
|
||||
public Set<File> knownMapSourcesFolders = new HashSet<File>();
|
||||
public static Workspace activeWorkspace;
|
||||
|
||||
public transient ProjectsTreeModel projectsTreeModel = null;
|
||||
public Preferences preferences = new Preferences();
|
||||
public File baseFolder;
|
||||
public File settingsFile;
|
||||
public transient WorkspaceSettings settings;
|
||||
public transient List<ProjectTreeNode> projects = new ArrayList<ProjectTreeNode>();
|
||||
public Set<String> projectsName = new HashSet<String>();
|
||||
public Map<String, Boolean> projectsOpenByName = new HashMap<String, Boolean>();
|
||||
public Set<File> knownMapSourcesFolders = new HashSet<File>();
|
||||
|
||||
public Workspace(File workspaceRoot) {
|
||||
baseFolder = workspaceRoot;
|
||||
if (!workspaceRoot.exists()) {
|
||||
try {
|
||||
workspaceRoot.mkdir();
|
||||
} catch (SecurityException e) {
|
||||
Notification.addError("Error creating workspace directory: "
|
||||
+ e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
settings = new WorkspaceSettings(this);
|
||||
settingsFile = new File(workspaceRoot, WS_SETTINGS_FILE);
|
||||
if (!settingsFile.exists()) {
|
||||
try {
|
||||
settingsFile.createNewFile();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error creating workspace datafile: "
|
||||
+ e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
Notification.addSuccess("New workspace created: "
|
||||
+ workspaceRoot.getAbsolutePath());
|
||||
save();
|
||||
}
|
||||
public transient ProjectsTreeModel projectsTreeModel = null;
|
||||
|
||||
public static void setActive(File workspaceRoot) {
|
||||
Workspace w = null;
|
||||
File f = new File(workspaceRoot, WS_SETTINGS_FILE);
|
||||
if (!workspaceRoot.exists() || !f.exists()) {
|
||||
w = new Workspace(workspaceRoot);
|
||||
} else {
|
||||
w = (Workspace) SettingsSave.loadInstance(f, "Workspace");
|
||||
if (w == null) {
|
||||
w = new Workspace(workspaceRoot);
|
||||
} else {
|
||||
w.refreshTransients();
|
||||
}
|
||||
}
|
||||
activeWorkspace = w;
|
||||
}
|
||||
public Workspace(File workspaceRoot) {
|
||||
boolean freshWorkspace = false;
|
||||
baseFolder = workspaceRoot;
|
||||
if (!workspaceRoot.exists()) {
|
||||
try {
|
||||
workspaceRoot.mkdir();
|
||||
} catch (SecurityException e) {
|
||||
Notification.addError("Error creating workspace directory: "
|
||||
+ e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
settings = new WorkspaceSettings(this);
|
||||
settingsFile = new File(workspaceRoot, WS_SETTINGS_FILE_JSON);
|
||||
if (!settingsFile.exists()) {
|
||||
try {
|
||||
settingsFile.createNewFile();
|
||||
freshWorkspace = true;
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error creating workspace datafile: "
|
||||
+ e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
Notification.addSuccess("New workspace created: "
|
||||
+ workspaceRoot.getAbsolutePath());
|
||||
}
|
||||
if (freshWorkspace)
|
||||
save();
|
||||
}
|
||||
|
||||
public static void saveActive() {
|
||||
activeWorkspace.save();
|
||||
}
|
||||
@Override
|
||||
public Map toMap() {
|
||||
Map map = new HashMap();
|
||||
map.put("serialVersionUID", serialVersionUID);
|
||||
map.put("preferences", preferences.toMap());
|
||||
map.put("projectsName", (new ArrayList<String>(projectsName)));
|
||||
map.put("projectsOpenByName", projectsOpenByName);
|
||||
List<String> l = new ArrayList<>(knownMapSourcesFolders.size());
|
||||
for (File f: knownMapSourcesFolders){
|
||||
l.add(f.getPath());
|
||||
}
|
||||
map.put("knownMapSourcesFolders", l);
|
||||
return map;
|
||||
}
|
||||
|
||||
public void save() {
|
||||
settings.save();
|
||||
SettingsSave.saveInstance(this, settingsFile, "Workspace");
|
||||
}
|
||||
@Override
|
||||
public void fromMap(Map map) {
|
||||
if(serialVersionUID != (long) map.get("serialVersionUID")){
|
||||
throw new SerializationException("wrong seriaVersionUID");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return Collections.enumeration(projects);
|
||||
}
|
||||
preferences.fromMap((Map) map.get("preferences"));
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
projectsName = new HashSet<>((List<String>) map.getOrDefault("projectsName", new HashSet<String>()));
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return projects.get(arg0);
|
||||
}
|
||||
projectsOpenByName = (Map<String, Boolean>) map.getOrDefault("projectsOpenByName", new HashMap<String, Boolean>() );
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return projects.size();
|
||||
}
|
||||
List<String> knownMapSourcesFolders1 = (List<String>) map.getOrDefault("knownMapSourcesFolders", new ArrayList<String>());
|
||||
knownMapSourcesFolders = new HashSet<>();
|
||||
if (knownMapSourcesFolders1 != null){
|
||||
int size = knownMapSourcesFolders1.size();
|
||||
for (String path: knownMapSourcesFolders1) {
|
||||
//TODO: catch invalid paths...?
|
||||
knownMapSourcesFolders.add(new File(path));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return projects.indexOf(arg0);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return null;
|
||||
}
|
||||
public static void setActive(File workspaceRoot) {
|
||||
Workspace w;
|
||||
File f2 = new File(workspaceRoot, WS_SETTINGS_FILE_JSON);
|
||||
if (f2.exists()) {
|
||||
w = loadWorkspaceFromJson(workspaceRoot, f2);
|
||||
w.refreshTransients();
|
||||
} else {
|
||||
Notification.addInfo("Could not find json workspace file. Checking for binary file");
|
||||
File f = new File(workspaceRoot, WS_SETTINGS_FILE);
|
||||
if (!workspaceRoot.exists() || !f.exists()) {
|
||||
w = new Workspace(workspaceRoot);
|
||||
} else {
|
||||
w = (Workspace) SettingsSave.loadInstance(f, "Workspace");
|
||||
if (w == null) {
|
||||
w = new Workspace(workspaceRoot);
|
||||
} else {
|
||||
w.settingsFile = f2;
|
||||
w.baseFolder = workspaceRoot;
|
||||
Notification.addInfo("Switched workspace to json format.");
|
||||
w.refreshTransients();
|
||||
}
|
||||
w.save();
|
||||
}
|
||||
}
|
||||
activeWorkspace = w;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
private static Workspace loadWorkspaceFromJson(File workspaceRoot, File settingsFile) {
|
||||
Workspace w = w = new Workspace(workspaceRoot);
|
||||
Map json = FileUtils.mapFromJsonFile(settingsFile);
|
||||
if (json!= null) {
|
||||
w.fromMap(json);
|
||||
}
|
||||
return w;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
if (projectsTreeModel != null)
|
||||
projectsTreeModel.insertNode(new TreePath(path.toArray()));
|
||||
}
|
||||
public static void saveActive() {
|
||||
activeWorkspace.save();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
ProjectTreeNode last = path.get(path.size() - 1);
|
||||
if (projectsTreeModel != null) {
|
||||
while (path.size() > 1) {
|
||||
projectsTreeModel.changeNode(new TreePath(path.toArray()));
|
||||
path.remove(path.size()-1);
|
||||
}
|
||||
|
||||
}
|
||||
ATContentStudio.frame.editorChanged(last);
|
||||
}
|
||||
public void save() {
|
||||
settings.save();
|
||||
FileUtils.writeStringToFile(FileUtils.toJsonString(this), settingsFile, "Workspace");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
if (projectsTreeModel != null)
|
||||
projectsTreeModel.removeNode(new TreePath(path.toArray()));
|
||||
}
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return Collections.enumeration(projects);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (ProjectTreeNode node : projects) {
|
||||
if (node != null)
|
||||
node.notifyCreated();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return "Workspace: " + baseFolder.getAbsolutePath();
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return projects.get(arg0);
|
||||
}
|
||||
|
||||
public static void createProject(final String projectName,
|
||||
final File gameSourceFolder, final Project.ResourceSet sourceSet) {
|
||||
WorkerDialog.showTaskMessage("Creating project " + projectName + "...",
|
||||
ATContentStudio.frame, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (activeWorkspace.projectsName.contains(projectName)) {
|
||||
Notification.addError("A project named "
|
||||
+ projectName
|
||||
+ " already exists in this workspace.");
|
||||
return;
|
||||
}
|
||||
Project p = new Project(activeWorkspace, projectName,
|
||||
gameSourceFolder, sourceSet);
|
||||
activeWorkspace.projects.add(p);
|
||||
activeWorkspace.projectsName.add(projectName);
|
||||
activeWorkspace.projectsOpenByName.put(projectName,
|
||||
p.open);
|
||||
activeWorkspace.knownMapSourcesFolders
|
||||
.add(gameSourceFolder);
|
||||
p.notifyCreated();
|
||||
Notification.addSuccess("Project " + projectName
|
||||
+ " successfully created");
|
||||
saveActive();
|
||||
}
|
||||
});
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return projects.size();
|
||||
}
|
||||
|
||||
public static void closeProject(Project p) {
|
||||
int index = activeWorkspace.projects.indexOf(p);
|
||||
if (index < 0) {
|
||||
Notification.addError("Cannot close unknown project " + p.name);
|
||||
return;
|
||||
}
|
||||
p.close();
|
||||
ClosedProject cp = new ClosedProject(activeWorkspace, p.name);
|
||||
activeWorkspace.projects.set(index, cp);
|
||||
activeWorkspace.projectsOpenByName.put(p.name, false);
|
||||
cp.notifyCreated();
|
||||
saveActive();
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return projects.indexOf(arg0);
|
||||
}
|
||||
|
||||
public static void openProject(final ClosedProject cp) {
|
||||
WorkerDialog.showTaskMessage("Opening project " + cp.name + "...",
|
||||
ATContentStudio.frame, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
int index = activeWorkspace.projects.indexOf(cp);
|
||||
if (index < 0) {
|
||||
Notification
|
||||
.addError("Cannot open unknown project "
|
||||
+ cp.name);
|
||||
return;
|
||||
}
|
||||
cp.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
Project p = Project.fromFolder(activeWorkspace,
|
||||
new File(activeWorkspace.baseFolder, cp.name));
|
||||
p.open();
|
||||
activeWorkspace.projects.set(index, p);
|
||||
activeWorkspace.projectsOpenByName.put(p.name, true);
|
||||
p.notifyCreated();
|
||||
saveActive();
|
||||
}
|
||||
});
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void refreshTransients() {
|
||||
this.settings = new WorkspaceSettings(this);
|
||||
this.projects = new ArrayList<ProjectTreeNode>();
|
||||
Set<String> projectsFailed = new HashSet<String>();
|
||||
for (String projectName : projectsName) {
|
||||
if (projectsOpenByName.get(projectName)) {
|
||||
File projRoot = new File(this.baseFolder, projectName);
|
||||
if (projRoot.exists()) {
|
||||
Project p = Project.fromFolder(this, projRoot);
|
||||
if (p != null) {
|
||||
projects.add(p);
|
||||
} else {
|
||||
Notification
|
||||
.addError("Failed to open project "
|
||||
+ projectName
|
||||
+ ". Removing it from workspace (not from filesystem though).");
|
||||
projectsFailed.add(projectName);
|
||||
}
|
||||
} else {
|
||||
Notification.addError("Unable to find project "
|
||||
+ projectName
|
||||
+ "'s root folder. Removing it from workspace");
|
||||
projectsFailed.add(projectName);
|
||||
}
|
||||
} else {
|
||||
projects.add(new ClosedProject(this, projectName));
|
||||
}
|
||||
}
|
||||
for (String projectName : projectsFailed) {
|
||||
projectsName.remove(projectName);
|
||||
projectsOpenByName.remove(projectName);
|
||||
}
|
||||
notifyCreated();
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
if (projectsTreeModel != null)
|
||||
projectsTreeModel.insertNode(new TreePath(path.toArray()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
ProjectTreeNode last = path.get(path.size() - 1);
|
||||
if (projectsTreeModel != null) {
|
||||
while (path.size() > 1) {
|
||||
projectsTreeModel.changeNode(new TreePath(path.toArray()));
|
||||
path.remove(path.size() - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
ATContentStudio.frame.editorChanged(last);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
if (projectsTreeModel != null)
|
||||
projectsTreeModel.removeNode(new TreePath(path.toArray()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (ProjectTreeNode node : projects) {
|
||||
if (node != null)
|
||||
node.notifyCreated();
|
||||
}
|
||||
}
|
||||
|
||||
public static void deleteProject(ClosedProject cp) {
|
||||
cp.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
activeWorkspace.projects.remove(cp);
|
||||
activeWorkspace.projectsOpenByName.remove(cp.name);
|
||||
activeWorkspace.projectsName.remove(cp.name);
|
||||
if (delete(new File(activeWorkspace.baseFolder, cp.name))) {
|
||||
Notification.addSuccess("Closed project " + cp.name
|
||||
+ " successfully deleted.");
|
||||
} else {
|
||||
Notification.addError("Error while deleting closed project "
|
||||
+ cp.name + ". Files may remain in the workspace.");
|
||||
}
|
||||
cp = null;
|
||||
saveActive();
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return "Workspace: " + baseFolder.getAbsolutePath();
|
||||
}
|
||||
|
||||
public static void deleteProject(Project p) {
|
||||
p.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
activeWorkspace.projects.remove(p);
|
||||
activeWorkspace.projectsOpenByName.remove(p.name);
|
||||
activeWorkspace.projectsName.remove(p.name);
|
||||
if (delete(p.baseFolder)) {
|
||||
Notification.addSuccess("Project " + p.name
|
||||
+ " successfully deleted.");
|
||||
} else {
|
||||
Notification.addError("Error while deleting project " + p.name
|
||||
+ ". Files may remain in the workspace.");
|
||||
}
|
||||
p = null;
|
||||
saveActive();
|
||||
}
|
||||
public static void createProject(final String projectName,
|
||||
final File gameSourceFolder, final Project.ResourceSet sourceSet) {
|
||||
WorkerDialog.showTaskMessage("Creating project " + projectName + "...",
|
||||
ATContentStudio.frame, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (activeWorkspace.projectsName.contains(projectName)) {
|
||||
Notification.addError("A project named "
|
||||
+ projectName
|
||||
+ " already exists in this workspace.");
|
||||
return;
|
||||
}
|
||||
Project p = new Project(activeWorkspace, projectName,
|
||||
gameSourceFolder, sourceSet);
|
||||
activeWorkspace.projects.add(p);
|
||||
activeWorkspace.projectsName.add(projectName);
|
||||
activeWorkspace.projectsOpenByName.put(projectName,
|
||||
p.open);
|
||||
activeWorkspace.knownMapSourcesFolders
|
||||
.add(gameSourceFolder);
|
||||
p.notifyCreated();
|
||||
Notification.addSuccess("Project " + projectName
|
||||
+ " successfully created");
|
||||
saveActive();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static boolean delete(File f) {
|
||||
boolean b = true;
|
||||
if (Files.isSymbolicLink(f.toPath())) {
|
||||
b &= f.delete();
|
||||
} else if (f.isDirectory()) {
|
||||
for (File c : f.listFiles())
|
||||
b &= delete(c);
|
||||
}
|
||||
return b &= f.delete();
|
||||
}
|
||||
public static void closeProject(Project p) {
|
||||
int index = activeWorkspace.projects.indexOf(p);
|
||||
if (index < 0) {
|
||||
Notification.addError("Cannot close unknown project " + p.name);
|
||||
return;
|
||||
}
|
||||
p.close();
|
||||
ClosedProject cp = new ClosedProject(activeWorkspace, p.name);
|
||||
activeWorkspace.projects.set(index, cp);
|
||||
activeWorkspace.projectsOpenByName.put(p.name, false);
|
||||
cp.notifyCreated();
|
||||
saveActive();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
public static void openProject(final ClosedProject cp) {
|
||||
WorkerDialog.showTaskMessage("Opening project " + cp.name + "...",
|
||||
ATContentStudio.frame, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
int index = activeWorkspace.projects.indexOf(cp);
|
||||
if (index < 0) {
|
||||
Notification
|
||||
.addError("Cannot open unknown project "
|
||||
+ cp.name);
|
||||
return;
|
||||
}
|
||||
cp.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
Project p = Project.fromFolder(activeWorkspace,
|
||||
new File(activeWorkspace.baseFolder, cp.name));
|
||||
p.open();
|
||||
activeWorkspace.projects.set(index, p);
|
||||
activeWorkspace.projectsOpenByName.put(p.name, true);
|
||||
p.notifyCreated();
|
||||
saveActive();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
public void refreshTransients() {
|
||||
this.settings = new WorkspaceSettings(this);
|
||||
this.projects = new ArrayList<ProjectTreeNode>();
|
||||
Set<String> projectsFailed = new HashSet<String>();
|
||||
for (String projectName : projectsName) {
|
||||
if (projectsOpenByName.get(projectName)) {
|
||||
File projRoot = new File(this.baseFolder, projectName);
|
||||
if (projRoot.exists()) {
|
||||
Project p = Project.fromFolder(this, projRoot);
|
||||
if (p != null) {
|
||||
projects.add(p);
|
||||
} else {
|
||||
Notification
|
||||
.addError("Failed to open project "
|
||||
+ projectName
|
||||
+ ". Removing it from workspace (not from filesystem though).");
|
||||
projectsFailed.add(projectName);
|
||||
}
|
||||
} else {
|
||||
Notification.addError("Unable to find project "
|
||||
+ projectName
|
||||
+ "'s root folder. Removing it from workspace");
|
||||
projectsFailed.add(projectName);
|
||||
}
|
||||
} else {
|
||||
projects.add(new ClosedProject(this, projectName));
|
||||
}
|
||||
}
|
||||
for (String projectName : projectsFailed) {
|
||||
projectsName.remove(projectName);
|
||||
projectsOpenByName.remove(projectName);
|
||||
}
|
||||
notifyCreated();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return projects.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : projects) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void deleteProject(ClosedProject cp) {
|
||||
cp.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
activeWorkspace.projects.remove(cp);
|
||||
activeWorkspace.projectsOpenByName.remove(cp.name);
|
||||
activeWorkspace.projectsName.remove(cp.name);
|
||||
if (delete(new File(activeWorkspace.baseFolder, cp.name))) {
|
||||
Notification.addSuccess("Closed project " + cp.name
|
||||
+ " successfully deleted.");
|
||||
} else {
|
||||
Notification.addError("Error while deleting closed project "
|
||||
+ cp.name + ". Files may remain in the workspace.");
|
||||
}
|
||||
saveActive();
|
||||
}
|
||||
|
||||
public static void deleteProject(Project p) {
|
||||
p.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
activeWorkspace.projects.remove(p);
|
||||
activeWorkspace.projectsOpenByName.remove(p.name);
|
||||
activeWorkspace.projectsName.remove(p.name);
|
||||
if (delete(p.baseFolder)) {
|
||||
Notification.addSuccess("Project " + p.name
|
||||
+ " successfully deleted.");
|
||||
} else {
|
||||
Notification.addError("Error while deleting project " + p.name
|
||||
+ ". Files may remain in the workspace.");
|
||||
}
|
||||
saveActive();
|
||||
}
|
||||
|
||||
private static boolean delete(File f) {
|
||||
boolean b = true;
|
||||
if (Files.isSymbolicLink(f.toPath())) {
|
||||
b &= f.delete();
|
||||
} else if (f.isDirectory()) {
|
||||
for (File c : f.listFiles())
|
||||
b &= delete(c);
|
||||
}
|
||||
return b & f.delete();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return projects.isEmpty();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : projects) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,220 +1,199 @@
|
||||
package com.gpl.rpg.atcontentstudio.model;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.utils.FileUtils;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
||||
|
||||
public class WorkspaceSettings {
|
||||
|
||||
public static final String VERSION_KEY = "ATCS_Version";
|
||||
public static final String FILENAME = "workspace_settings.json";
|
||||
|
||||
public static final int SETTINGS_VERSION = 1;
|
||||
|
||||
public Workspace parent;
|
||||
public File file;
|
||||
|
||||
public static Boolean DEFAULT_USE_SYS_MAP_EDITOR = true;
|
||||
public Setting<Boolean> useSystemDefaultMapEditor = new PrimitiveSetting<Boolean>("useSystemDefaultMapEditor", DEFAULT_USE_SYS_MAP_EDITOR);
|
||||
public static String DEFAULT_MAP_EDITOR_COMMAND = "tiled";
|
||||
public Setting<String> mapEditorCommand = new PrimitiveSetting<String>("mapEditorCommand", DEFAULT_MAP_EDITOR_COMMAND);
|
||||
|
||||
public static Boolean DEFAULT_USE_SYS_IMG_VIEWER = true;
|
||||
public Setting<Boolean> useSystemDefaultImageViewer = new PrimitiveSetting<Boolean>("useSystemDefaultImageViewer", DEFAULT_USE_SYS_IMG_VIEWER);
|
||||
public static Boolean DEFAULT_USE_SYS_IMG_EDITOR = false;
|
||||
public Setting<Boolean> useSystemDefaultImageEditor = new PrimitiveSetting<Boolean>("useSystemDefaultImageEditor", DEFAULT_USE_SYS_IMG_EDITOR);
|
||||
public static String DEFAULT_IMG_EDITOR_COMMAND = "gimp";
|
||||
public Setting<String> imageEditorCommand = new PrimitiveSetting<String>("imageEditorCommand", DEFAULT_IMG_EDITOR_COMMAND);
|
||||
public static final String VERSION_KEY = "ATCS_Version";
|
||||
public static final String FILENAME = "workspace_settings.json";
|
||||
|
||||
public static String[] LANGUAGE_LIST = new String[]{null, "de", "ru", "pl", "fr", "it", "es", "nl", "uk", "ca", "sv", "pt", "pt_BR", "zh_Hant", "zh_Hans", "ja", "cs", "tr", "ko", "hu", "sl", "bg", "id", "fi", "th", "gl", "ms" ,"pa", "az", "nb"};
|
||||
public Setting<String> translatorLanguage = new NullDefaultPrimitiveSetting<String>("translatorLanguage");
|
||||
public static Boolean DEFAULT_ALLOW_INTERNET = true;
|
||||
public Setting<Boolean> useInternet = new PrimitiveSetting<Boolean>("useInternet", DEFAULT_ALLOW_INTERNET);
|
||||
public static Boolean DEFAULT_CHECK_UPDATE = true;
|
||||
public Setting<Boolean> checkUpdates = new PrimitiveSetting<Boolean>("checkUpdates", DEFAULT_CHECK_UPDATE);
|
||||
|
||||
public static final int SETTINGS_VERSION = 1;
|
||||
|
||||
public List<Setting<? extends Object>> settings = new ArrayList<Setting<? extends Object>>();
|
||||
|
||||
public WorkspaceSettings(Workspace parent) {
|
||||
this.parent = parent;
|
||||
settings.add(useSystemDefaultMapEditor);
|
||||
settings.add(mapEditorCommand);
|
||||
settings.add(useSystemDefaultImageViewer);
|
||||
settings.add(useSystemDefaultImageEditor);
|
||||
settings.add(imageEditorCommand);
|
||||
settings.add(translatorLanguage);
|
||||
settings.add(useInternet);
|
||||
settings.add(checkUpdates);
|
||||
file = new File(parent.baseFolder, FILENAME);
|
||||
if (file.exists()) {
|
||||
load(file);
|
||||
}
|
||||
}
|
||||
|
||||
public void load(File f) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(f);
|
||||
@SuppressWarnings("rawtypes")
|
||||
Map jsonSettings = (Map) parser.parse(reader);
|
||||
Integer version = ((Number) jsonSettings.get(VERSION_KEY)).intValue();
|
||||
if (version != null) {
|
||||
if (version >= 1) {
|
||||
loadv1(jsonSettings);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
Notification.addError("Error while parsing workspace settings: "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
private void loadv1(Map jsonSettings) {
|
||||
for (Setting s : settings) {
|
||||
s.readFromJson(jsonSettings);
|
||||
}
|
||||
}
|
||||
public Workspace parent;
|
||||
public File file;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void save() {
|
||||
@SuppressWarnings("rawtypes")
|
||||
Map json = new LinkedHashMap();
|
||||
for (Setting<? extends Object> s : settings) {
|
||||
s.saveToJson(json);
|
||||
}
|
||||
|
||||
if (json.isEmpty()) {
|
||||
//Everything is default.
|
||||
file.delete();
|
||||
return;
|
||||
}
|
||||
public static Boolean DEFAULT_USE_SYS_MAP_EDITOR = true;
|
||||
public Setting<Boolean> useSystemDefaultMapEditor = new PrimitiveSetting<Boolean>("useSystemDefaultMapEditor", DEFAULT_USE_SYS_MAP_EDITOR);
|
||||
public static String DEFAULT_MAP_EDITOR_COMMAND = "tiled";
|
||||
public Setting<String> mapEditorCommand = new PrimitiveSetting<String>("mapEditorCommand", DEFAULT_MAP_EDITOR_COMMAND);
|
||||
|
||||
json.put(VERSION_KEY, SETTINGS_VERSION);
|
||||
StringWriter writer = new JsonPrettyWriter();
|
||||
try {
|
||||
JSONObject.writeJSONString(json, writer);
|
||||
} catch (IOException e) {
|
||||
//Impossible with a StringWriter
|
||||
}
|
||||
String toWrite = writer.toString();
|
||||
try {
|
||||
FileWriter w = new FileWriter(file);
|
||||
w.write(toWrite);
|
||||
w.close();
|
||||
Notification.addSuccess("Workspace settings saved.");
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while saving workspace settings : "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void resetDefault() {
|
||||
for (Setting<? extends Object> s : settings) {
|
||||
s.resetDefault();
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class Setting<X extends Object> {
|
||||
public static Boolean DEFAULT_USE_SYS_IMG_VIEWER = true;
|
||||
public Setting<Boolean> useSystemDefaultImageViewer = new PrimitiveSetting<Boolean>("useSystemDefaultImageViewer", DEFAULT_USE_SYS_IMG_VIEWER);
|
||||
public static Boolean DEFAULT_USE_SYS_IMG_EDITOR = false;
|
||||
public Setting<Boolean> useSystemDefaultImageEditor = new PrimitiveSetting<Boolean>("useSystemDefaultImageEditor", DEFAULT_USE_SYS_IMG_EDITOR);
|
||||
public static String DEFAULT_IMG_EDITOR_COMMAND = "gimp";
|
||||
public Setting<String> imageEditorCommand = new PrimitiveSetting<String>("imageEditorCommand", DEFAULT_IMG_EDITOR_COMMAND);
|
||||
|
||||
public String id;
|
||||
public X value, defaultValue;
|
||||
|
||||
public void setCurrentValue(X value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public X getCurrentValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public X getDefaultValue() {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
public void resetDefault() {
|
||||
value = defaultValue;
|
||||
}
|
||||
|
||||
public abstract void readFromJson(@SuppressWarnings("rawtypes") Map json);
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
public void saveToJson(Map json) {
|
||||
if (!defaultValue.equals(value)) json.put(id, value);
|
||||
}
|
||||
}
|
||||
|
||||
public class PrimitiveSetting<X extends Object> extends Setting<X> {
|
||||
|
||||
|
||||
public PrimitiveSetting(String id, X defaultValue) {
|
||||
this.id = id;
|
||||
this.value = this.defaultValue = defaultValue;
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
public void readFromJson(Map json) {
|
||||
if (json.get(id) != null) value = (X)json.get(id);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class NullDefaultPrimitiveSetting<X extends Object> extends PrimitiveSetting<X> {
|
||||
|
||||
public NullDefaultPrimitiveSetting(String id) {
|
||||
super(id, null);
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
@Override
|
||||
public void saveToJson(Map json) {
|
||||
if (value != null) json.put(id, value);
|
||||
}
|
||||
}
|
||||
|
||||
public class ListSetting<X extends Object> extends Setting<List<X>> {
|
||||
public static String[] LANGUAGE_LIST = new String[]{null, "de", "ru", "pl", "fr", "it", "es", "nl", "uk", "ca", "sv", "pt", "pt_BR", "zh_Hant", "zh_Hans", "ja", "cs", "tr", "ko", "hu", "sl", "bg", "id", "fi", "th", "gl", "ms", "pa", "az", "nb"};
|
||||
public Setting<String> translatorLanguage = new NullDefaultPrimitiveSetting<String>("translatorLanguage");
|
||||
public static Boolean DEFAULT_ALLOW_INTERNET = true;
|
||||
public Setting<Boolean> useInternet = new PrimitiveSetting<Boolean>("useInternet", DEFAULT_ALLOW_INTERNET);
|
||||
public static Boolean DEFAULT_CHECK_UPDATE = true;
|
||||
public Setting<Boolean> checkUpdates = new PrimitiveSetting<Boolean>("checkUpdates", DEFAULT_CHECK_UPDATE);
|
||||
|
||||
|
||||
public List<Setting<? extends Object>> settings = new ArrayList<Setting<? extends Object>>();
|
||||
|
||||
public WorkspaceSettings(Workspace parent) {
|
||||
this.parent = parent;
|
||||
settings.add(useSystemDefaultMapEditor);
|
||||
settings.add(mapEditorCommand);
|
||||
settings.add(useSystemDefaultImageViewer);
|
||||
settings.add(useSystemDefaultImageEditor);
|
||||
settings.add(imageEditorCommand);
|
||||
settings.add(translatorLanguage);
|
||||
settings.add(useInternet);
|
||||
settings.add(checkUpdates);
|
||||
file = new File(parent.baseFolder, FILENAME);
|
||||
if (file.exists()) {
|
||||
load(file);
|
||||
}
|
||||
}
|
||||
|
||||
public void load(File f) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(f);
|
||||
@SuppressWarnings("rawtypes")
|
||||
Map jsonSettings = (Map) parser.parse(reader);
|
||||
Integer version = ((Number) jsonSettings.get(VERSION_KEY)).intValue();
|
||||
if (version != null) {
|
||||
if (version >= 1) {
|
||||
loadv1(jsonSettings);
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
Notification.addError("Error while parsing workspace settings: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
private void loadv1(Map jsonSettings) {
|
||||
for (Setting s : settings) {
|
||||
s.readFromJson(jsonSettings);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void save() {
|
||||
@SuppressWarnings("rawtypes")
|
||||
Map json = new LinkedHashMap();
|
||||
for (Setting<? extends Object> s : settings) {
|
||||
s.saveToJson(json);
|
||||
}
|
||||
|
||||
if (json.isEmpty()) {
|
||||
//Everything is default.
|
||||
file.delete();
|
||||
return;
|
||||
}
|
||||
|
||||
json.put(VERSION_KEY, SETTINGS_VERSION);
|
||||
String toWrite = FileUtils.toJsonString(json);
|
||||
FileUtils.writeStringToFile(toWrite, file, "Workspace settings");
|
||||
}
|
||||
|
||||
public void resetDefault() {
|
||||
for (Setting<? extends Object> s : settings) {
|
||||
s.resetDefault();
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class Setting<X extends Object> {
|
||||
|
||||
public String id;
|
||||
public X value, defaultValue;
|
||||
|
||||
public void setCurrentValue(X value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public X getCurrentValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public X getDefaultValue() {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
public void resetDefault() {
|
||||
value = defaultValue;
|
||||
}
|
||||
|
||||
public abstract void readFromJson(@SuppressWarnings("rawtypes") Map json);
|
||||
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
public void saveToJson(Map json) {
|
||||
if (!defaultValue.equals(value)) json.put(id, value);
|
||||
}
|
||||
}
|
||||
|
||||
public class PrimitiveSetting<X extends Object> extends Setting<X> {
|
||||
|
||||
|
||||
public PrimitiveSetting(String id, X defaultValue) {
|
||||
this.id = id;
|
||||
this.value = this.defaultValue = defaultValue;
|
||||
}
|
||||
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
public void readFromJson(Map json) {
|
||||
if (json.get(id) != null) value = (X) json.get(id);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class NullDefaultPrimitiveSetting<X extends Object> extends PrimitiveSetting<X> {
|
||||
|
||||
public NullDefaultPrimitiveSetting(String id) {
|
||||
super(id, null);
|
||||
}
|
||||
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
@Override
|
||||
public void saveToJson(Map json) {
|
||||
if (value != null) json.put(id, value);
|
||||
}
|
||||
}
|
||||
|
||||
public class ListSetting<X extends Object> extends Setting<List<X>> {
|
||||
|
||||
public ListSetting(String id, List<X> defaultValue) {
|
||||
this.id = id;
|
||||
this.value = this.defaultValue = defaultValue;
|
||||
}
|
||||
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
@Override
|
||||
public void readFromJson(Map json) {
|
||||
value = new ArrayList<X>();
|
||||
if (json.get(id) != null) {
|
||||
for (Object o : ((List) json.get(id))) {
|
||||
value.add((X) o);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public ListSetting(String id, List<X> defaultValue) {
|
||||
this.id = id;
|
||||
this.value = this.defaultValue = defaultValue;
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public void readFromJson(Map json) {
|
||||
value = new ArrayList<X>();
|
||||
if (json.get(id) != null) {
|
||||
for (Object o : ((List)json.get(id))) {
|
||||
value.add((X)o);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,12 +1,5 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.bookmarks;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
@@ -15,141 +8,154 @@ import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Quest;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
public class BookmarkEntry implements BookmarkNode {
|
||||
|
||||
public GameDataElement bookmarkedElement;
|
||||
public BookmarkFolder parent;
|
||||
|
||||
public BookmarkEntry(BookmarkFolder parent, GameDataElement target) {
|
||||
this.parent = parent;
|
||||
this.bookmarkedElement = target;
|
||||
target.bookmark = this;
|
||||
parent.contents.add(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
public GameDataElement bookmarkedElement;
|
||||
public BookmarkFolder parent;
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
public BookmarkEntry(BookmarkFolder parent, GameDataElement target) {
|
||||
this.parent = parent;
|
||||
this.bookmarkedElement = target;
|
||||
target.bookmark = this;
|
||||
parent.contents.add(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
if (bookmarkedElement instanceof QuestStage) {
|
||||
String text = ((GameDataElement)bookmarkedElement).getDesc();
|
||||
if (text.length() > 60) {
|
||||
text = text.substring(0, 57)+"...";
|
||||
}
|
||||
return ((GameDataElement)bookmarkedElement).getDataType().toString()+"/"+((Quest)((QuestStage)bookmarkedElement).parent).id+"#"+((QuestStage)bookmarkedElement).progress+":"+text;
|
||||
} else {
|
||||
return ((GameDataElement)bookmarkedElement).getDataType().toString()+"/"+((GameDataElement)bookmarkedElement).getDesc();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return bookmarkedElement.getIcon();
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
if (bookmarkedElement instanceof QuestStage) {
|
||||
String text = ((GameDataElement) bookmarkedElement).getDesc();
|
||||
if (text.length() > 60) {
|
||||
text = text.substring(0, 57) + "...";
|
||||
}
|
||||
return ((GameDataElement) bookmarkedElement).getDataType().toString() +
|
||||
"/" +
|
||||
((Quest) ((QuestStage) bookmarkedElement).parent).id +
|
||||
"#" +
|
||||
((QuestStage) bookmarkedElement).progress +
|
||||
":" +
|
||||
text;
|
||||
} else {
|
||||
return ((GameDataElement) bookmarkedElement).getDataType().toString() + "/" + ((GameDataElement) bookmarkedElement).getDesc();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return getIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return bookmarkedElement.getIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
bookmarkedElement.bookmark = null;
|
||||
parent.delete(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
parent.save();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return getIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
bookmarkedElement.bookmark = null;
|
||||
parent.delete(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
parent.save();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,168 +1,165 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.bookmarks;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
public class BookmarkFolder implements BookmarkNode {
|
||||
|
||||
List<BookmarkNode> contents = new LinkedList<BookmarkNode>();
|
||||
BookmarkNode parent;
|
||||
String name;
|
||||
Image closedIcon, openIcon;
|
||||
List<BookmarkNode> contents = new LinkedList<BookmarkNode>();
|
||||
BookmarkNode parent;
|
||||
String name;
|
||||
Image closedIcon, openIcon;
|
||||
|
||||
public BookmarkFolder(BookmarkNode parent, String name) {
|
||||
this(parent, name, DefaultIcons.getStdClosedIcon(), DefaultIcons.getStdOpenIcon());
|
||||
}
|
||||
|
||||
public BookmarkFolder(BookmarkNode parent, String name, Image closedIcon, Image openIcon) {
|
||||
this.parent = parent;
|
||||
this.name = name;
|
||||
this.closedIcon = closedIcon;
|
||||
this.openIcon = openIcon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<? extends ProjectTreeNode> children() {
|
||||
return Collections.enumeration(contents);
|
||||
}
|
||||
public BookmarkFolder(BookmarkNode parent, String name) {
|
||||
this(parent, name, DefaultIcons.getStdClosedIcon(), DefaultIcons.getStdOpenIcon());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
public BookmarkFolder(BookmarkNode parent, String name, Image closedIcon, Image openIcon) {
|
||||
this.parent = parent;
|
||||
this.name = name;
|
||||
this.closedIcon = closedIcon;
|
||||
this.openIcon = openIcon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return contents.get(childIndex);
|
||||
}
|
||||
@Override
|
||||
public Enumeration<? extends ProjectTreeNode> children() {
|
||||
return Collections.enumeration(contents);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return contents.size();
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return contents.indexOf(node);
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return contents.get(childIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return contents.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return contents.indexOf(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return name;
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return openIcon;
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return closedIcon;
|
||||
}
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return getClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return contents.isEmpty();
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return openIcon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return closedIcon;
|
||||
}
|
||||
|
||||
public void delete(BookmarkEntry bookmarkEntry) {
|
||||
if (contents.contains(bookmarkEntry)) {
|
||||
bookmarkEntry.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
contents.remove(bookmarkEntry);
|
||||
save();
|
||||
}
|
||||
}
|
||||
|
||||
public void delete(BookmarkFolder bookmarkFolder) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
public void save() {
|
||||
parent.save();
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return getClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return contents.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void delete(BookmarkEntry bookmarkEntry) {
|
||||
if (contents.contains(bookmarkEntry)) {
|
||||
bookmarkEntry.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
contents.remove(bookmarkEntry);
|
||||
save();
|
||||
}
|
||||
}
|
||||
|
||||
public void delete(BookmarkFolder bookmarkFolder) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
public void save() {
|
||||
parent.save();
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,9 +2,10 @@ package com.gpl.rpg.atcontentstudio.model.bookmarks;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
|
||||
public interface BookmarkNode extends ProjectTreeNode{
|
||||
public interface BookmarkNode extends ProjectTreeNode {
|
||||
|
||||
public void save();
|
||||
|
||||
public void delete();
|
||||
|
||||
public void save();
|
||||
public void delete();
|
||||
|
||||
}
|
||||
|
||||
@@ -1,210 +1,206 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.bookmarks;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.SavedSlotCollection;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Item;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.ItemCategory;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Quest;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.*;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
|
||||
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
public class BookmarksRoot implements BookmarkNode {
|
||||
|
||||
SavedSlotCollection v = new SavedSlotCollection();
|
||||
SavedSlotCollection v = new SavedSlotCollection();
|
||||
|
||||
public transient Project parent = null;
|
||||
|
||||
BookmarkFolder ac, diag, dl, it, ic, npc, q, tmx, sp, wm;
|
||||
|
||||
public BookmarksRoot(Project parent) {
|
||||
this.parent = parent;
|
||||
public transient Project parent;
|
||||
|
||||
v.add(ac = new BookmarkFolder(this, ActorCondition.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(diag = new BookmarkFolder(this, Dialogue.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(dl = new BookmarkFolder(this, Droplist.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(it = new BookmarkFolder(this, Item.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(ic = new BookmarkFolder(this, ItemCategory.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(npc = new BookmarkFolder(this, NPC.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(q = new BookmarkFolder(this, Quest.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
|
||||
v.add(tmx = new BookmarkFolder(this, "TMX Maps", DefaultIcons.getTmxClosedIcon(), DefaultIcons.getTmxOpenIcon()));
|
||||
v.add(sp = new BookmarkFolder(this, "Spritesheets", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon()));
|
||||
v.add(wm = new BookmarkFolder(this, "Worldmap", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return v.getNonEmptyElements();
|
||||
}
|
||||
BookmarkFolder ac, diag, dl, it, ic, npc, q, tmx, sp, wm;
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
public BookmarksRoot(Project parent) {
|
||||
this.parent = parent;
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return v.getNonEmptyElementAt(arg0);
|
||||
}
|
||||
v.add(ac = new BookmarkFolder(this, ActorCondition.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(diag = new BookmarkFolder(this, Dialogue.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(dl = new BookmarkFolder(this, Droplist.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(it = new BookmarkFolder(this, Item.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(ic = new BookmarkFolder(this, ItemCategory.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(npc = new BookmarkFolder(this, NPC.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
v.add(q = new BookmarkFolder(this, Quest.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return v.getNonEmptySize();
|
||||
}
|
||||
v.add(tmx = new BookmarkFolder(this, "TMX Maps", DefaultIcons.getTmxClosedIcon(), DefaultIcons.getTmxOpenIcon()));
|
||||
v.add(sp = new BookmarkFolder(this, "Spritesheets", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon()));
|
||||
v.add(wm = new BookmarkFolder(this, "Worldmap", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
||||
}
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return v.getNonEmptyElements();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return v.getNonEmptyElementAt(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||
node.notifyCreated();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return v.getNonEmptySize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+"Bookmarks";
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent == null ? null : parent.getProject();
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getBookmarkOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getBookmarkClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return getClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||
node.notifyCreated();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + "Bookmarks";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return v.isEmpty();
|
||||
}
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent == null ? null : parent.getProject();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void save() {
|
||||
|
||||
}
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getBookmarkOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getBookmarkClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return getClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return v.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void save() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete() {
|
||||
}
|
||||
|
||||
public void addBookmark(GameDataElement target) {
|
||||
BookmarkEntry node;
|
||||
BookmarkFolder folder;
|
||||
if (target instanceof ActorCondition) {
|
||||
folder = ac;
|
||||
} else if (target instanceof Dialogue) {
|
||||
folder = diag;
|
||||
} else if (target instanceof Droplist) {
|
||||
folder = dl;
|
||||
} else if (target instanceof Item) {
|
||||
folder = it;
|
||||
} else if (target instanceof ItemCategory) {
|
||||
folder = ic;
|
||||
} else if (target instanceof NPC) {
|
||||
folder = npc;
|
||||
} else if (target instanceof Quest) {
|
||||
folder = q;
|
||||
} else if (target instanceof TMXMap) {
|
||||
folder = tmx;
|
||||
} else if (target instanceof Spritesheet) {
|
||||
folder = sp;
|
||||
} else if (target instanceof WorldmapSegment) {
|
||||
folder = wm;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
ProjectTreeNode higherEmptyParent = folder;
|
||||
while (higherEmptyParent != null) {
|
||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode) higherEmptyParent.getParent()).isEmpty())
|
||||
higherEmptyParent = (ProjectTreeNode) higherEmptyParent.getParent();
|
||||
else break;
|
||||
}
|
||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||
|
||||
node = new BookmarkEntry(folder, target);
|
||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||
else node.notifyCreated();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete() {}
|
||||
|
||||
public void addBookmark(GameDataElement target) {
|
||||
BookmarkEntry node;
|
||||
BookmarkFolder folder = null;
|
||||
if (target instanceof ActorCondition) {
|
||||
folder = ac;
|
||||
} else if (target instanceof Dialogue) {
|
||||
folder = diag;
|
||||
} else if (target instanceof Droplist) {
|
||||
folder = dl;
|
||||
} else if (target instanceof Item) {
|
||||
folder = it;
|
||||
} else if (target instanceof ItemCategory) {
|
||||
folder = ic;
|
||||
} else if (target instanceof NPC) {
|
||||
folder = npc;
|
||||
} else if (target instanceof Quest) {
|
||||
folder = q;
|
||||
} else if (target instanceof TMXMap) {
|
||||
folder = tmx;
|
||||
} else if (target instanceof Spritesheet) {
|
||||
folder = sp;
|
||||
} else if (target instanceof WorldmapSegment) {
|
||||
folder = wm;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
ProjectTreeNode higherEmptyParent = folder;
|
||||
while (higherEmptyParent != null) {
|
||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode)higherEmptyParent.getParent()).isEmpty()) higherEmptyParent = (ProjectTreeNode)higherEmptyParent.getParent();
|
||||
else break;
|
||||
}
|
||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||
|
||||
node = new BookmarkEntry(folder, target);
|
||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||
else node.notifyCreated();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||
|
||||
import java.awt.Image;
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
@@ -9,373 +15,372 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
|
||||
|
||||
public class ActorCondition extends JSONElement {
|
||||
|
||||
private static final long serialVersionUID = -3969824899972048507L;
|
||||
|
||||
public static final Integer MAGNITUDE_CLEAR = -99;
|
||||
public static final Integer DURATION_FOREVER = 999;;
|
||||
public static final Integer DURATION_NONE = 0;
|
||||
|
||||
// Available from init state
|
||||
//public String id; inherited.
|
||||
public String icon_id;
|
||||
public String display_name;
|
||||
public String description;
|
||||
private static final long serialVersionUID = -3969824899972048507L;
|
||||
|
||||
// Available from parsed state
|
||||
public ACCategory category = null;
|
||||
public Integer positive = null;
|
||||
public Integer stacking = null;
|
||||
public RoundEffect round_effect = null;
|
||||
public RoundEffect full_round_effect = null;
|
||||
public AbilityEffect constant_ability_effect = null;
|
||||
|
||||
public enum ACCategory {
|
||||
spiritual,
|
||||
mental,
|
||||
physical,
|
||||
blood
|
||||
}
|
||||
|
||||
public static enum VisualEffectID {
|
||||
redSplash
|
||||
,blueSwirl
|
||||
,greenSplash
|
||||
,miss
|
||||
}
|
||||
|
||||
public static class RoundEffect implements Cloneable {
|
||||
// Available from parsed state
|
||||
public VisualEffectID visual_effect = null;
|
||||
public Integer hp_boost_min = null;
|
||||
public Integer hp_boost_max = null;
|
||||
public Integer ap_boost_min = null;
|
||||
public Integer ap_boost_max = null;
|
||||
|
||||
public Object clone() {
|
||||
try {
|
||||
return super.clone();
|
||||
} catch (CloneNotSupportedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static class AbilityEffect implements Cloneable {
|
||||
// Available from parsed state
|
||||
public Integer max_hp_boost = null;
|
||||
public Integer max_ap_boost = null;
|
||||
public Integer increase_move_cost = null;
|
||||
public Integer increase_use_cost = null;
|
||||
public Integer increase_reequip_cost = null;
|
||||
public Integer increase_attack_cost = null;
|
||||
public Integer increase_attack_chance = null;
|
||||
public Integer increase_damage_min = null;
|
||||
public Integer increase_damage_max = null;
|
||||
public Integer increase_critical_skill = null;
|
||||
public Integer increase_block_chance = null;
|
||||
public Integer increase_damage_resistance = null;
|
||||
|
||||
public Object clone() {
|
||||
try {
|
||||
return super.clone();
|
||||
} catch (CloneNotSupportedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+display_name+" ("+id+")";
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void fromJson(File jsonFile, GameDataCategory<ActorCondition> category) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List actorConditions = (List) parser.parse(reader);
|
||||
for (Object obj : actorConditions) {
|
||||
Map aCondJson = (Map)obj;
|
||||
ActorCondition aCond = fromJson(aCondJson);
|
||||
aCond.jsonFile = jsonFile;
|
||||
aCond.parent = category;
|
||||
if (aCond.getDataType() == GameSource.Type.created || aCond.getDataType() == GameSource.Type.altered) {
|
||||
aCond.writable = true;
|
||||
}
|
||||
category.add(aCond);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static ActorCondition fromJson(String jsonString) throws ParseException {
|
||||
Map aCondJson = (Map) new JSONParser().parse(jsonString);
|
||||
ActorCondition aCond = fromJson(aCondJson);
|
||||
aCond.parse(aCondJson);
|
||||
return aCond;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static ActorCondition fromJson(Map aCondJson) {
|
||||
ActorCondition aCond = new ActorCondition();
|
||||
aCond.icon_id = (String) aCondJson.get("iconID");
|
||||
aCond.id = (String) aCondJson.get("id");
|
||||
aCond.display_name = (String) aCondJson.get("name");
|
||||
return aCond;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map aCondJson) {
|
||||
public static final Integer MAGNITUDE_CLEAR = -99;
|
||||
public static final Integer DURATION_FOREVER = 999;
|
||||
public static final Integer DURATION_NONE = 0;
|
||||
|
||||
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");
|
||||
if (abilityEffect != null) {
|
||||
this.constant_ability_effect = new AbilityEffect();
|
||||
this.constant_ability_effect.increase_attack_chance = JSONElement.getInteger((Number) abilityEffect.get("increaseAttackChance"));
|
||||
if (abilityEffect.get("increaseAttackDamage") != null) {
|
||||
this.constant_ability_effect.increase_damage_min = JSONElement.getInteger((Number) (((Map)abilityEffect.get("increaseAttackDamage")).get("min")));
|
||||
this.constant_ability_effect.increase_damage_max = JSONElement.getInteger((Number) (((Map)abilityEffect.get("increaseAttackDamage")).get("max")));
|
||||
}
|
||||
this.constant_ability_effect.max_hp_boost = JSONElement.getInteger((Number) abilityEffect.get("increaseMaxHP"));
|
||||
this.constant_ability_effect.max_ap_boost = JSONElement.getInteger((Number) abilityEffect.get("increaseMaxAP"));
|
||||
this.constant_ability_effect.increase_move_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseMoveCost"));
|
||||
this.constant_ability_effect.increase_use_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseUseItemCost"));
|
||||
this.constant_ability_effect.increase_reequip_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseReequipCost"));
|
||||
this.constant_ability_effect.increase_attack_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseAttackCost"));
|
||||
this.constant_ability_effect.increase_critical_skill = JSONElement.getInteger((Number) abilityEffect.get("increaseCriticalSkill"));
|
||||
this.constant_ability_effect.increase_block_chance = JSONElement.getInteger((Number) abilityEffect.get("increaseBlockChance"));
|
||||
this.constant_ability_effect.increase_damage_resistance = JSONElement.getInteger((Number) abilityEffect.get("increaseDamageResistance"));
|
||||
}
|
||||
this.stacking = JSONElement.getInteger((Number) aCondJson.get("isStacking"));
|
||||
Map roundEffect = (Map) aCondJson.get("roundEffect");
|
||||
if (roundEffect != null) {
|
||||
this.round_effect = new RoundEffect();
|
||||
if (roundEffect.get("increaseCurrentHP") != null) {
|
||||
this.round_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)roundEffect.get("increaseCurrentHP")).get("max")));
|
||||
this.round_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)roundEffect.get("increaseCurrentHP")).get("min")));
|
||||
}
|
||||
if (roundEffect.get("increaseCurrentAP") != null) {
|
||||
this.round_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map)roundEffect.get("increaseCurrentAP")).get("max")));
|
||||
this.round_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)roundEffect.get("increaseCurrentAP")).get("min")));
|
||||
}
|
||||
String vfx = (String) roundEffect.get("visualEffectID");
|
||||
this.round_effect.visual_effect = null;
|
||||
if (vfx != null) {
|
||||
try {
|
||||
this.round_effect.visual_effect = VisualEffectID.valueOf(vfx);
|
||||
} catch(IllegalArgumentException e) {}
|
||||
}
|
||||
}
|
||||
Map fullRoundEffect = (Map) aCondJson.get("fullRoundEffect");
|
||||
if (fullRoundEffect != null) {
|
||||
this.full_round_effect = new RoundEffect();
|
||||
if (fullRoundEffect.get("increaseCurrentHP") != null) {
|
||||
this.full_round_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)fullRoundEffect.get("increaseCurrentHP")).get("max")));
|
||||
this.full_round_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)fullRoundEffect.get("increaseCurrentHP")).get("min")));
|
||||
}
|
||||
if (fullRoundEffect.get("increaseCurrentAP") != null) {
|
||||
this.full_round_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map)fullRoundEffect.get("increaseCurrentAP")).get("max")));
|
||||
this.full_round_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)fullRoundEffect.get("increaseCurrentAP")).get("min")));
|
||||
}
|
||||
String vfx = (String) fullRoundEffect.get("visualEffectID");
|
||||
this.full_round_effect.visual_effect = null;
|
||||
if (vfx != null) {
|
||||
try {
|
||||
this.full_round_effect.visual_effect = VisualEffectID.valueOf(vfx);
|
||||
} catch(IllegalArgumentException e) {}
|
||||
}
|
||||
}
|
||||
this.state = State.parsed;
|
||||
// Available from init state
|
||||
//public String id; inherited.
|
||||
public String icon_id;
|
||||
public String display_name;
|
||||
public String description;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
||||
//This type of state is unrelated to parsing/linking.
|
||||
return;
|
||||
}
|
||||
if (this.state == State.init) {
|
||||
//Not parsed yet.
|
||||
this.parse();
|
||||
} else if (this.state == State.linked) {
|
||||
//Already linked.
|
||||
return;
|
||||
}
|
||||
if (this.icon_id != null) {
|
||||
String spritesheetId = this.icon_id.split(":")[0];
|
||||
if (getProject().getSpritesheet(spritesheetId) == null) {
|
||||
System.out.println("Actor Condition");
|
||||
System.out.println(this.id);
|
||||
System.out.println("failed to load spritesheet:");
|
||||
System.out.println(spritesheetId);
|
||||
System.out.println("while creating backlink for icon_id:");
|
||||
System.out.println(this.icon_id);
|
||||
}
|
||||
getProject().getSpritesheet(spritesheetId).addBacklink(this);
|
||||
}
|
||||
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
// Available from parsed state
|
||||
public ACCategory category = null;
|
||||
public Integer positive = null;
|
||||
public Integer stacking = null;
|
||||
public RoundEffect round_effect = null;
|
||||
public RoundEffect full_round_effect = null;
|
||||
public AbilityEffect constant_ability_effect = null;
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "Actor Conditions";
|
||||
}
|
||||
|
||||
public enum ACCategory {
|
||||
spiritual,
|
||||
mental,
|
||||
physical,
|
||||
blood
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getProject().getIcon(icon_id);
|
||||
}
|
||||
|
||||
public Image getImage() {
|
||||
return getProject().getImage(icon_id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONElement clone() {
|
||||
ActorCondition clone = new ActorCondition();
|
||||
clone.jsonFile = this.jsonFile;
|
||||
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;
|
||||
clone.stacking = this.stacking;
|
||||
if (this.round_effect != null) {
|
||||
clone.round_effect = (RoundEffect) this.round_effect.clone();
|
||||
}
|
||||
if (this.constant_ability_effect != null) {
|
||||
clone.constant_ability_effect = (AbilityEffect) constant_ability_effect.clone();
|
||||
}
|
||||
if (this.full_round_effect != null) {
|
||||
clone.full_round_effect = (RoundEffect) this.full_round_effect.clone();
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
//Nothing to link to.
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map jsonAC = new LinkedHashMap();
|
||||
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);
|
||||
if (this.round_effect != null) {
|
||||
Map jsonRound = new LinkedHashMap();
|
||||
if (this.round_effect.visual_effect != null) jsonRound.put("visualEffectID", this.round_effect.visual_effect.toString());
|
||||
if (this.round_effect.hp_boost_min != null || this.round_effect.hp_boost_max != null) {
|
||||
Map jsonHP = new LinkedHashMap();
|
||||
if (this.round_effect.hp_boost_min != null) jsonHP.put("min", this.round_effect.hp_boost_min);
|
||||
else jsonHP.put("min", 0);
|
||||
if (this.round_effect.hp_boost_max != null) jsonHP.put("max", this.round_effect.hp_boost_max);
|
||||
else jsonHP.put("max", 0);
|
||||
jsonRound.put("increaseCurrentHP", jsonHP);
|
||||
}
|
||||
if (this.round_effect.ap_boost_min != null || this.round_effect.ap_boost_max != null) {
|
||||
Map jsonAP = new LinkedHashMap();
|
||||
if (this.round_effect.ap_boost_min != null) jsonAP.put("min", this.round_effect.ap_boost_min);
|
||||
else jsonAP.put("min", 0);
|
||||
if (this.round_effect.ap_boost_max != null) jsonAP.put("max", this.round_effect.ap_boost_max);
|
||||
else jsonAP.put("max", 0);
|
||||
jsonRound.put("increaseCurrentAP", jsonAP);
|
||||
}
|
||||
jsonAC.put("roundEffect", jsonRound);
|
||||
}
|
||||
if (this.full_round_effect != null) {
|
||||
Map jsonFullRound = new LinkedHashMap();
|
||||
if (this.full_round_effect.visual_effect != null) jsonFullRound.put("visualEffectID", this.full_round_effect.visual_effect.toString());
|
||||
if (this.full_round_effect.hp_boost_min != null || this.full_round_effect.hp_boost_max != null) {
|
||||
Map jsonHP = new LinkedHashMap();
|
||||
if (this.full_round_effect.hp_boost_min != null) jsonHP.put("min", this.full_round_effect.hp_boost_min);
|
||||
else jsonHP.put("min", 0);
|
||||
if (this.full_round_effect.hp_boost_max != null) jsonHP.put("max", this.full_round_effect.hp_boost_max);
|
||||
else jsonHP.put("max", 0);
|
||||
jsonFullRound.put("increaseCurrentHP", jsonHP);
|
||||
}
|
||||
if (this.full_round_effect.ap_boost_min != null || this.full_round_effect.ap_boost_max != null) {
|
||||
Map jsonAP = new LinkedHashMap();
|
||||
if (this.full_round_effect.ap_boost_min != null) jsonAP.put("min", this.full_round_effect.ap_boost_min);
|
||||
else jsonAP.put("min", 0);
|
||||
if (this.full_round_effect.ap_boost_max != null) jsonAP.put("max", this.full_round_effect.ap_boost_max);
|
||||
else jsonAP.put("max", 0);
|
||||
jsonFullRound.put("increaseCurrentAP", jsonAP);
|
||||
}
|
||||
jsonAC.put("fullRoundEffect", jsonFullRound);
|
||||
}
|
||||
if (this.constant_ability_effect != null) {
|
||||
Map jsonAbility = new LinkedHashMap();
|
||||
if (this.constant_ability_effect.increase_attack_chance != null) jsonAbility.put("increaseAttackChance", this.constant_ability_effect.increase_attack_chance);
|
||||
if (this.constant_ability_effect.increase_damage_min != null || this.constant_ability_effect.increase_damage_max != null) {
|
||||
Map jsonAD = new LinkedHashMap();
|
||||
if (this.constant_ability_effect.increase_damage_min != null) jsonAD.put("min", this.constant_ability_effect.increase_damage_min);
|
||||
else jsonAD.put("min", 0);
|
||||
if (this.constant_ability_effect.increase_damage_max != null) jsonAD.put("max", this.constant_ability_effect.increase_damage_max);
|
||||
else jsonAD.put("max", 0);
|
||||
jsonAbility.put("increaseAttackDamage", jsonAD);
|
||||
}
|
||||
if (this.constant_ability_effect.max_hp_boost != null) jsonAbility.put("increaseMaxHP", this.constant_ability_effect.max_hp_boost);
|
||||
if (this.constant_ability_effect.max_ap_boost != null) jsonAbility.put("increaseMaxAP", this.constant_ability_effect.max_ap_boost);
|
||||
if (this.constant_ability_effect.increase_move_cost != null) jsonAbility.put("increaseMoveCost", this.constant_ability_effect.increase_move_cost);
|
||||
if (this.constant_ability_effect.increase_use_cost != null) jsonAbility.put("increaseUseItemCost", this.constant_ability_effect.increase_use_cost);
|
||||
if (this.constant_ability_effect.increase_reequip_cost != null) jsonAbility.put("increaseReequipCost", this.constant_ability_effect.increase_reequip_cost);
|
||||
if (this.constant_ability_effect.increase_attack_cost != null) jsonAbility.put("increaseAttackCost", this.constant_ability_effect.increase_attack_cost);
|
||||
if (this.constant_ability_effect.increase_critical_skill != null) jsonAbility.put("increaseCriticalSkill", this.constant_ability_effect.increase_critical_skill);
|
||||
if (this.constant_ability_effect.increase_block_chance != null) jsonAbility.put("increaseBlockChance", this.constant_ability_effect.increase_block_chance);
|
||||
if (this.constant_ability_effect.increase_damage_resistance != null) jsonAbility.put("increaseDamageResistance", this.constant_ability_effect.increase_damage_resistance);
|
||||
jsonAC.put("abilityEffect", jsonAbility);
|
||||
}
|
||||
return jsonAC;
|
||||
}
|
||||
public static enum VisualEffectID {
|
||||
redSplash, blueSwirl, greenSplash, miss
|
||||
}
|
||||
|
||||
public static class RoundEffect implements Cloneable {
|
||||
// Available from parsed state
|
||||
public VisualEffectID visual_effect = null;
|
||||
public Integer hp_boost_min = null;
|
||||
public Integer hp_boost_max = null;
|
||||
public Integer ap_boost_min = null;
|
||||
public Integer ap_boost_max = null;
|
||||
|
||||
public Object clone() {
|
||||
try {
|
||||
return super.clone();
|
||||
} catch (CloneNotSupportedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static class AbilityEffect implements Cloneable {
|
||||
// Available from parsed state
|
||||
public Integer max_hp_boost = null;
|
||||
public Integer max_ap_boost = null;
|
||||
public Integer increase_move_cost = null;
|
||||
public Integer increase_use_cost = null;
|
||||
public Integer increase_reequip_cost = null;
|
||||
public Integer increase_attack_cost = null;
|
||||
public Integer increase_attack_chance = null;
|
||||
public Integer increase_damage_min = null;
|
||||
public Integer increase_damage_max = null;
|
||||
public Integer increase_critical_skill = null;
|
||||
public Integer increase_block_chance = null;
|
||||
public Integer increase_damage_resistance = null;
|
||||
|
||||
public Object clone() {
|
||||
try {
|
||||
return super.clone();
|
||||
} catch (CloneNotSupportedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + display_name + " (" + id + ")";
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void fromJson(File jsonFile, GameDataCategory<ActorCondition> category) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List actorConditions = (List) parser.parse(reader);
|
||||
for (Object obj : actorConditions) {
|
||||
Map aCondJson = (Map) obj;
|
||||
ActorCondition aCond = fromJson(aCondJson);
|
||||
aCond.jsonFile = jsonFile;
|
||||
aCond.parent = category;
|
||||
if (aCond.getDataType() == GameSource.Type.created || aCond.getDataType() == GameSource.Type.altered) {
|
||||
aCond.writable = true;
|
||||
}
|
||||
category.add(aCond);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static ActorCondition fromJson(String jsonString) throws ParseException {
|
||||
Map aCondJson = (Map) new JSONParser().parse(jsonString);
|
||||
ActorCondition aCond = fromJson(aCondJson);
|
||||
aCond.parse(aCondJson);
|
||||
return aCond;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static ActorCondition fromJson(Map aCondJson) {
|
||||
ActorCondition aCond = new ActorCondition();
|
||||
aCond.icon_id = (String) aCondJson.get("iconID");
|
||||
aCond.id = (String) aCondJson.get("id");
|
||||
aCond.display_name = (String) aCondJson.get("name");
|
||||
return aCond;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@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");
|
||||
if (abilityEffect != null) {
|
||||
this.constant_ability_effect = new AbilityEffect();
|
||||
this.constant_ability_effect.increase_attack_chance = JSONElement.getInteger((Number) abilityEffect.get("increaseAttackChance"));
|
||||
if (abilityEffect.get("increaseAttackDamage") != null) {
|
||||
this.constant_ability_effect.increase_damage_min = JSONElement.getInteger((Number) (((Map) abilityEffect.get("increaseAttackDamage")).get("min")));
|
||||
this.constant_ability_effect.increase_damage_max = JSONElement.getInteger((Number) (((Map) abilityEffect.get("increaseAttackDamage")).get("max")));
|
||||
}
|
||||
this.constant_ability_effect.max_hp_boost = JSONElement.getInteger((Number) abilityEffect.get("increaseMaxHP"));
|
||||
this.constant_ability_effect.max_ap_boost = JSONElement.getInteger((Number) abilityEffect.get("increaseMaxAP"));
|
||||
this.constant_ability_effect.increase_move_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseMoveCost"));
|
||||
this.constant_ability_effect.increase_use_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseUseItemCost"));
|
||||
this.constant_ability_effect.increase_reequip_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseReequipCost"));
|
||||
this.constant_ability_effect.increase_attack_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseAttackCost"));
|
||||
this.constant_ability_effect.increase_critical_skill = JSONElement.getInteger((Number) abilityEffect.get("increaseCriticalSkill"));
|
||||
this.constant_ability_effect.increase_block_chance = JSONElement.getInteger((Number) abilityEffect.get("increaseBlockChance"));
|
||||
this.constant_ability_effect.increase_damage_resistance = JSONElement.getInteger((Number) abilityEffect.get("increaseDamageResistance"));
|
||||
}
|
||||
this.stacking = JSONElement.getInteger((Number) aCondJson.get("isStacking"));
|
||||
Map roundEffect = (Map) aCondJson.get("roundEffect");
|
||||
if (roundEffect != null) {
|
||||
this.round_effect = new RoundEffect();
|
||||
if (roundEffect.get("increaseCurrentHP") != null) {
|
||||
this.round_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map) roundEffect.get("increaseCurrentHP")).get("max")));
|
||||
this.round_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map) roundEffect.get("increaseCurrentHP")).get("min")));
|
||||
}
|
||||
if (roundEffect.get("increaseCurrentAP") != null) {
|
||||
this.round_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map) roundEffect.get("increaseCurrentAP")).get("max")));
|
||||
this.round_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map) roundEffect.get("increaseCurrentAP")).get("min")));
|
||||
}
|
||||
String vfx = (String) roundEffect.get("visualEffectID");
|
||||
this.round_effect.visual_effect = null;
|
||||
if (vfx != null) {
|
||||
try {
|
||||
this.round_effect.visual_effect = VisualEffectID.valueOf(vfx);
|
||||
} catch (IllegalArgumentException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
Map fullRoundEffect = (Map) aCondJson.get("fullRoundEffect");
|
||||
if (fullRoundEffect != null) {
|
||||
this.full_round_effect = new RoundEffect();
|
||||
if (fullRoundEffect.get("increaseCurrentHP") != null) {
|
||||
this.full_round_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map) fullRoundEffect.get("increaseCurrentHP")).get("max")));
|
||||
this.full_round_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map) fullRoundEffect.get("increaseCurrentHP")).get("min")));
|
||||
}
|
||||
if (fullRoundEffect.get("increaseCurrentAP") != null) {
|
||||
this.full_round_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map) fullRoundEffect.get("increaseCurrentAP")).get("max")));
|
||||
this.full_round_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map) fullRoundEffect.get("increaseCurrentAP")).get("min")));
|
||||
}
|
||||
String vfx = (String) fullRoundEffect.get("visualEffectID");
|
||||
this.full_round_effect.visual_effect = null;
|
||||
if (vfx != null) {
|
||||
try {
|
||||
this.full_round_effect.visual_effect = VisualEffectID.valueOf(vfx);
|
||||
} catch (IllegalArgumentException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
this.state = State.parsed;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (shouldSkipParseOrLink()) {
|
||||
return;
|
||||
}
|
||||
ensureParseIfNeeded();
|
||||
if (this.icon_id != null) {
|
||||
String spritesheetId = this.icon_id.split(":")[0];
|
||||
if (getProject().getSpritesheet(spritesheetId) == null) {
|
||||
System.out.println("Actor Condition");
|
||||
System.out.println(this.id);
|
||||
System.out.println("failed to load spritesheet:");
|
||||
System.out.println(spritesheetId);
|
||||
System.out.println("while creating backlink for icon_id:");
|
||||
System.out.println(this.icon_id);
|
||||
}
|
||||
getProject().getSpritesheet(spritesheetId).addBacklink(this);
|
||||
}
|
||||
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "Actor Conditions";
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getProject().getIcon(icon_id);
|
||||
}
|
||||
|
||||
public Image getImage() {
|
||||
return getProject().getImage(icon_id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public JSONElement clone() {
|
||||
ActorCondition clone = new ActorCondition();
|
||||
clone.jsonFile = this.jsonFile;
|
||||
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;
|
||||
clone.stacking = this.stacking;
|
||||
if (this.round_effect != null) {
|
||||
clone.round_effect = (RoundEffect) this.round_effect.clone();
|
||||
}
|
||||
if (this.constant_ability_effect != null) {
|
||||
clone.constant_ability_effect = (AbilityEffect) constant_ability_effect.clone();
|
||||
}
|
||||
if (this.full_round_effect != null) {
|
||||
clone.full_round_effect = (RoundEffect) this.full_round_effect.clone();
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
//Nothing to link to.
|
||||
}
|
||||
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map jsonAC = new LinkedHashMap();
|
||||
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);
|
||||
if (this.round_effect != null) {
|
||||
Map jsonRound = new LinkedHashMap();
|
||||
if (this.round_effect.visual_effect != null)
|
||||
jsonRound.put("visualEffectID", this.round_effect.visual_effect.toString());
|
||||
if (this.round_effect.hp_boost_min != null || this.round_effect.hp_boost_max != null) {
|
||||
Map jsonHP = new LinkedHashMap();
|
||||
if (this.round_effect.hp_boost_min != null) jsonHP.put("min", this.round_effect.hp_boost_min);
|
||||
else jsonHP.put("min", 0);
|
||||
if (this.round_effect.hp_boost_max != null) jsonHP.put("max", this.round_effect.hp_boost_max);
|
||||
else jsonHP.put("max", 0);
|
||||
jsonRound.put("increaseCurrentHP", jsonHP);
|
||||
}
|
||||
if (this.round_effect.ap_boost_min != null || this.round_effect.ap_boost_max != null) {
|
||||
Map jsonAP = new LinkedHashMap();
|
||||
if (this.round_effect.ap_boost_min != null) jsonAP.put("min", this.round_effect.ap_boost_min);
|
||||
else jsonAP.put("min", 0);
|
||||
if (this.round_effect.ap_boost_max != null) jsonAP.put("max", this.round_effect.ap_boost_max);
|
||||
else jsonAP.put("max", 0);
|
||||
jsonRound.put("increaseCurrentAP", jsonAP);
|
||||
}
|
||||
jsonAC.put("roundEffect", jsonRound);
|
||||
}
|
||||
if (this.full_round_effect != null) {
|
||||
Map jsonFullRound = new LinkedHashMap();
|
||||
if (this.full_round_effect.visual_effect != null)
|
||||
jsonFullRound.put("visualEffectID", this.full_round_effect.visual_effect.toString());
|
||||
if (this.full_round_effect.hp_boost_min != null || this.full_round_effect.hp_boost_max != null) {
|
||||
Map jsonHP = new LinkedHashMap();
|
||||
if (this.full_round_effect.hp_boost_min != null) jsonHP.put("min", this.full_round_effect.hp_boost_min);
|
||||
else jsonHP.put("min", 0);
|
||||
if (this.full_round_effect.hp_boost_max != null) jsonHP.put("max", this.full_round_effect.hp_boost_max);
|
||||
else jsonHP.put("max", 0);
|
||||
jsonFullRound.put("increaseCurrentHP", jsonHP);
|
||||
}
|
||||
if (this.full_round_effect.ap_boost_min != null || this.full_round_effect.ap_boost_max != null) {
|
||||
Map jsonAP = new LinkedHashMap();
|
||||
if (this.full_round_effect.ap_boost_min != null) jsonAP.put("min", this.full_round_effect.ap_boost_min);
|
||||
else jsonAP.put("min", 0);
|
||||
if (this.full_round_effect.ap_boost_max != null) jsonAP.put("max", this.full_round_effect.ap_boost_max);
|
||||
else jsonAP.put("max", 0);
|
||||
jsonFullRound.put("increaseCurrentAP", jsonAP);
|
||||
}
|
||||
jsonAC.put("fullRoundEffect", jsonFullRound);
|
||||
}
|
||||
if (this.constant_ability_effect != null) {
|
||||
Map jsonAbility = new LinkedHashMap();
|
||||
if (this.constant_ability_effect.increase_attack_chance != null)
|
||||
jsonAbility.put("increaseAttackChance", this.constant_ability_effect.increase_attack_chance);
|
||||
if (this.constant_ability_effect.increase_damage_min != null || this.constant_ability_effect.increase_damage_max != null) {
|
||||
Map jsonAD = new LinkedHashMap();
|
||||
if (this.constant_ability_effect.increase_damage_min != null)
|
||||
jsonAD.put("min", this.constant_ability_effect.increase_damage_min);
|
||||
else jsonAD.put("min", 0);
|
||||
if (this.constant_ability_effect.increase_damage_max != null)
|
||||
jsonAD.put("max", this.constant_ability_effect.increase_damage_max);
|
||||
else jsonAD.put("max", 0);
|
||||
jsonAbility.put("increaseAttackDamage", jsonAD);
|
||||
}
|
||||
if (this.constant_ability_effect.max_hp_boost != null)
|
||||
jsonAbility.put("increaseMaxHP", this.constant_ability_effect.max_hp_boost);
|
||||
if (this.constant_ability_effect.max_ap_boost != null)
|
||||
jsonAbility.put("increaseMaxAP", this.constant_ability_effect.max_ap_boost);
|
||||
if (this.constant_ability_effect.increase_move_cost != null)
|
||||
jsonAbility.put("increaseMoveCost", this.constant_ability_effect.increase_move_cost);
|
||||
if (this.constant_ability_effect.increase_use_cost != null)
|
||||
jsonAbility.put("increaseUseItemCost", this.constant_ability_effect.increase_use_cost);
|
||||
if (this.constant_ability_effect.increase_reequip_cost != null)
|
||||
jsonAbility.put("increaseReequipCost", this.constant_ability_effect.increase_reequip_cost);
|
||||
if (this.constant_ability_effect.increase_attack_cost != null)
|
||||
jsonAbility.put("increaseAttackCost", this.constant_ability_effect.increase_attack_cost);
|
||||
if (this.constant_ability_effect.increase_critical_skill != null)
|
||||
jsonAbility.put("increaseCriticalSkill", this.constant_ability_effect.increase_critical_skill);
|
||||
if (this.constant_ability_effect.increase_block_chance != null)
|
||||
jsonAbility.put("increaseBlockChance", this.constant_ability_effect.increase_block_chance);
|
||||
if (this.constant_ability_effect.increase_damage_resistance != null)
|
||||
jsonAbility.put("increaseDamageResistance", this.constant_ability_effect.increase_damage_resistance);
|
||||
jsonAC.put("abilityEffect", jsonAbility);
|
||||
}
|
||||
return jsonAC;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "actorconditions_" + getProject().name + ".json";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "actorconditions_"+getProject().name+".json";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
384
src/com/gpl/rpg/atcontentstudio/model/gamedata/Common.java
Normal file
384
src/com/gpl/rpg/atcontentstudio/model/gamedata/Common.java
Normal file
@@ -0,0 +1,384 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public final class Common {
|
||||
|
||||
public static <T extends ActorConditionEffect> void actorConditionElementChanged(List<T> list, GameDataElement oldOne, GameDataElement newOne, GameDataElement backlink) {
|
||||
if (list != null) {
|
||||
for (T c : list) {
|
||||
if (c.condition == oldOne) {
|
||||
oldOne.removeBacklink(backlink);
|
||||
c.condition = (ActorCondition) newOne;
|
||||
if (newOne != null) newOne.addBacklink(backlink);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//region link common stuff
|
||||
public static void linkConditions(List<? extends ActorConditionEffect> conditions, Project proj, GameDataElement backlink) {
|
||||
if (conditions != null) {
|
||||
for (ActorConditionEffect ce : conditions) {
|
||||
if (ce.condition_id != null) ce.condition = proj.getActorCondition(ce.condition_id);
|
||||
if (ce.condition != null) ce.condition.addBacklink(backlink);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void linkEffects(HitEffect effect, Project proj, GameDataElement backlink) {
|
||||
linkEffects((DeathEffect) effect, proj, backlink);
|
||||
if (effect != null) {
|
||||
linkConditions(effect.conditions_target, proj, backlink);
|
||||
}
|
||||
}
|
||||
|
||||
public static void linkEffects(DeathEffect effect, Project proj, GameDataElement backlink) {
|
||||
if (effect != null) {
|
||||
linkConditions(effect.conditions_source, proj, backlink);
|
||||
}
|
||||
}
|
||||
|
||||
public static void linkIcon(Project proj, String iconId, GameDataElement backlink) {
|
||||
if (iconId != null) {
|
||||
String spritesheetId = iconId.split(":")[0];
|
||||
if (proj.getSpritesheet(spritesheetId) == null) {
|
||||
Notification.addError("Error Spritesheet " + spritesheetId + ". has no backlink. (" + iconId + ")");
|
||||
return;
|
||||
}
|
||||
proj.getSpritesheet(spritesheetId).addBacklink(backlink);
|
||||
}
|
||||
}
|
||||
//endregion
|
||||
|
||||
//region write common stuff
|
||||
public static void writeMinMaxToMap(Map parent, Integer min, Integer max, int defaultValue) {
|
||||
if (min != null || max != null) {
|
||||
if (min != null)
|
||||
parent.put("min", min);
|
||||
else parent.put("min", defaultValue);
|
||||
if (max != null)
|
||||
parent.put("max", max);
|
||||
else parent.put("max", defaultValue);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeMinMaxToMap(Map parent, String key, Integer min, Integer max, int defaultValue) {
|
||||
if (min != null || max != null) {
|
||||
Map minMaxMap = new LinkedHashMap();
|
||||
parent.put(key, minMaxMap);
|
||||
writeMinMaxToMap(minMaxMap, min, max, defaultValue);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeDescriptionToMap(Map parent, String description) {
|
||||
if (description != null) parent.put("description", description);
|
||||
}
|
||||
|
||||
public static void writeIconToMap(Map parent, String icon_id) {
|
||||
if (icon_id != null) parent.put("iconID", icon_id);
|
||||
}
|
||||
|
||||
public static void writeHitReceivedEffectToMap(Map parent, HitReceivedEffect effect) {
|
||||
if (effect != null) {
|
||||
writeHitEffectToMap(parent, effect);
|
||||
writeBasicEffectObjectToMap(effect.target, parent, "increaseAttackerCurrentHP", "increaseAttackerCurrentAP");
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeHitReceivedEffectToMap(Map parent, HitReceivedEffect effect, String key) {
|
||||
if (effect != null) {
|
||||
Map effectJson = new LinkedHashMap();
|
||||
parent.put(key, effectJson);
|
||||
writeHitReceivedEffectToMap(effectJson, effect);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeHitEffectToMap(Map parent, HitEffect effect) {
|
||||
if (effect != null) {
|
||||
writeDeathEffectToMap(parent, effect);
|
||||
writeTimedActorConditionEffectObjectToMap(effect.conditions_target, parent, "conditionsTarget");
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeHitEffectToMap(Map parent, HitEffect effect, String key) {
|
||||
if (effect != null) {
|
||||
Map effectJson = new LinkedHashMap();
|
||||
parent.put(key, effectJson);
|
||||
writeHitEffectToMap(effectJson, effect);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeDeathEffectToMap(Map parent, DeathEffect effect) {
|
||||
writeBasicEffectObjectToMap(effect, parent, "increaseCurrentHP", "increaseCurrentAP");
|
||||
writeTimedActorConditionEffectObjectToMap(effect.conditions_source, parent, "conditionsSource");
|
||||
}
|
||||
|
||||
public static void writeDeathEffectToMap(Map parent, DeathEffect effect, String key) {
|
||||
if (effect != null) {
|
||||
Map effectJson = new LinkedHashMap();
|
||||
parent.put(key, effectJson);
|
||||
writeDeathEffectToMap(effectJson, effect);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeBasicEffectObjectToMap(BasicEffect effect, Map parent, String keyHP, String keyAP) {
|
||||
writeMinMaxToMap(parent, keyHP, effect.hp_boost_min, effect.hp_boost_max, 0);
|
||||
|
||||
writeMinMaxToMap(parent, keyAP, effect.ap_boost_min, effect.ap_boost_max, 0);
|
||||
}
|
||||
|
||||
public static void writeTimedActorConditionEffectObjectToMap(List<TimedActorConditionEffect> list, Map parent, String key) {
|
||||
if (list != null) {
|
||||
List conditionsSourceJson = new ArrayList();
|
||||
parent.put(key, conditionsSourceJson);
|
||||
for (TimedActorConditionEffect condition : list) {
|
||||
Map conditionJson = new LinkedHashMap();
|
||||
conditionsSourceJson.add(conditionJson);
|
||||
writeTimedConditionEffectToMap(condition, conditionJson);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void writeConditionEffectToMap(ActorConditionEffect condition, Map parent) {
|
||||
if (condition.condition != null) {
|
||||
parent.put("condition", condition.condition.id);
|
||||
} else if (condition.condition_id != null) {
|
||||
parent.put("condition", condition.condition_id);
|
||||
}
|
||||
if (condition.magnitude != null) {
|
||||
parent.put("magnitude", condition.magnitude);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeTimedConditionEffectToMap(TimedActorConditionEffect condition, Map parent) {
|
||||
writeConditionEffectToMap(condition, parent);
|
||||
if (condition.duration != null) {
|
||||
parent.put("duration", condition.duration);
|
||||
}
|
||||
if (condition.chance != null) {
|
||||
parent.put("chance", JSONElement.printJsonChance(condition.chance));
|
||||
}
|
||||
}
|
||||
|
||||
//endregion
|
||||
public static class TimedActorConditionEffect extends ActorConditionEffect {
|
||||
//Available from parsed state
|
||||
public Integer duration = null;
|
||||
public Double chance = null;
|
||||
|
||||
public TimedActorConditionEffect createClone() {
|
||||
TimedActorConditionEffect cclone = new TimedActorConditionEffect();
|
||||
cclone.magnitude = this.magnitude;
|
||||
cclone.condition_id = this.condition_id;
|
||||
cclone.condition = this.condition;
|
||||
cclone.chance = this.chance;
|
||||
cclone.duration = this.duration;
|
||||
return cclone;
|
||||
}
|
||||
|
||||
public boolean isInfinite() {
|
||||
return duration != null && duration.equals(ActorCondition.DURATION_FOREVER);
|
||||
}
|
||||
|
||||
public boolean isImmunity() {
|
||||
return (super.isClear()) && (duration != null && duration > ActorCondition.DURATION_NONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isClear() {
|
||||
return (super.isClear()) && (duration == null || duration.equals(ActorCondition.DURATION_NONE));
|
||||
}
|
||||
}
|
||||
|
||||
public static class ActorConditionEffect {
|
||||
//Available from parsed state
|
||||
public Integer magnitude = null;
|
||||
public String condition_id = null;
|
||||
|
||||
//Available from linked state
|
||||
public ActorCondition condition = null;
|
||||
|
||||
public boolean isClear() {
|
||||
return magnitude == null || magnitude.equals(ActorCondition.MAGNITUDE_CLEAR);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static ArrayList<TimedActorConditionEffect> parseTimedConditionEffects(List conditionsSourceJson) {
|
||||
ArrayList<TimedActorConditionEffect> conditions_source;
|
||||
if (conditionsSourceJson != null && !conditionsSourceJson.isEmpty()) {
|
||||
conditions_source = new ArrayList<>();
|
||||
for (Object conditionJsonObj : conditionsSourceJson) {
|
||||
Map conditionJson = (Map) conditionJsonObj;
|
||||
TimedActorConditionEffect condition = new TimedActorConditionEffect();
|
||||
readConditionEffect(condition, conditionJson);
|
||||
condition.duration = JSONElement.getInteger((Number) conditionJson.get("duration"));
|
||||
if (conditionJson.get("chance") != null)
|
||||
condition.chance = JSONElement.parseChance(conditionJson.get("chance").toString());
|
||||
conditions_source.add(condition);
|
||||
}
|
||||
} else {
|
||||
conditions_source = null;
|
||||
}
|
||||
return conditions_source;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
private static void readConditionEffect(ActorConditionEffect condition, Map conditionJson) {
|
||||
condition.condition_id = (String) conditionJson.get("condition");
|
||||
condition.magnitude = JSONElement.getInteger((Number) conditionJson.get("magnitude"));
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Common.DeathEffect parseDeathEffect(Map killEffect) {
|
||||
Common.DeathEffect kill_effect = new Common.DeathEffect();
|
||||
readDeathEffect(killEffect, kill_effect);
|
||||
return kill_effect;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static HitEffect parseHitEffect(Map hitEffect) {
|
||||
Common.HitEffect hit_effect = new Common.HitEffect();
|
||||
readHitEffect(hitEffect, hit_effect);
|
||||
return hit_effect;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static HitReceivedEffect parseHitReceivedEffect(Map hitReceivedEffect) {
|
||||
HitReceivedEffect hit_received_effect = new Common.HitReceivedEffect();
|
||||
readHitEffect(hitReceivedEffect, hit_received_effect);
|
||||
if (hitReceivedEffect.get("increaseAttackerCurrentHP") != null) {
|
||||
hit_received_effect.target.hp_boost_max = JSONElement.getInteger((Number) (((Map) hitReceivedEffect.get("increaseAttackerCurrentHP")).get("max")));
|
||||
hit_received_effect.target.hp_boost_min = JSONElement.getInteger((Number) (((Map) hitReceivedEffect.get("increaseAttackerCurrentHP")).get("min")));
|
||||
}
|
||||
if (hitReceivedEffect.get("increaseAttackerCurrentAP") != null) {
|
||||
hit_received_effect.target.ap_boost_max = JSONElement.getInteger((Number) (((Map) hitReceivedEffect.get("increaseAttackerCurrentAP")).get("max")));
|
||||
hit_received_effect.target.ap_boost_min = JSONElement.getInteger((Number) (((Map) hitReceivedEffect.get("increaseAttackerCurrentAP")).get("min")));
|
||||
}
|
||||
return hit_received_effect;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
private static void readDeathEffect(Map killEffect, DeathEffect kill_effect) {
|
||||
if (killEffect.get("increaseCurrentHP") != null) {
|
||||
kill_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map) killEffect.get("increaseCurrentHP")).get("min")));
|
||||
kill_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map) killEffect.get("increaseCurrentHP")).get("max")));
|
||||
}
|
||||
if (killEffect.get("increaseCurrentAP") != null) {
|
||||
kill_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map) killEffect.get("increaseCurrentAP")).get("min")));
|
||||
kill_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map) killEffect.get("increaseCurrentAP")).get("max")));
|
||||
}
|
||||
List conditionsSourceJson = (List) killEffect.get("conditionsSource");
|
||||
kill_effect.conditions_source = parseTimedConditionEffects(conditionsSourceJson);
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
private static void readHitEffect(Map hitEffect, HitEffect hit_effect) {
|
||||
readDeathEffect(hitEffect, hit_effect);
|
||||
List conditionsTargetJson = (List) hitEffect.get("conditionsTarget");
|
||||
hit_effect.conditions_target = parseTimedConditionEffects(conditionsTargetJson);
|
||||
}
|
||||
|
||||
public static class BasicEffect {
|
||||
public Integer hp_boost_min = null;
|
||||
public Integer hp_boost_max = null;
|
||||
public Integer ap_boost_min = null;
|
||||
public Integer ap_boost_max = null;
|
||||
|
||||
public boolean isNull() {
|
||||
if (ap_boost_min != null) return false;
|
||||
if (ap_boost_max != null) return false;
|
||||
if (hp_boost_min != null) return false;
|
||||
if (hp_boost_max != null) return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static class DeathEffect extends BasicEffect {
|
||||
//Available from parsed state
|
||||
public List<TimedActorConditionEffect> conditions_source = null;
|
||||
|
||||
@Override
|
||||
public boolean isNull() {
|
||||
if (!super.isNull()) return false;
|
||||
if (conditions_source != null) return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static class HitEffect extends DeathEffect {
|
||||
//Available from parsed state
|
||||
public List<TimedActorConditionEffect> conditions_target = null;
|
||||
|
||||
@Override
|
||||
public boolean isNull() {
|
||||
if (!super.isNull()) return false;
|
||||
if (conditions_target != null) return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public static class HitReceivedEffect extends Common.HitEffect {
|
||||
//Available from parsed state
|
||||
public BasicEffect target = new BasicEffect();
|
||||
|
||||
@Override
|
||||
public boolean isNull() {
|
||||
if (!super.isNull()) return false;
|
||||
if (!target.isNull()) return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void copyDeathEffectValues(Common.DeathEffect target, Common.DeathEffect source, GameDataElement backlink) {
|
||||
copyEffectValues(target, source);
|
||||
if (source.conditions_source != null) {
|
||||
target.conditions_source = new ArrayList<>();
|
||||
for (TimedActorConditionEffect c : source.conditions_source) {
|
||||
TimedActorConditionEffect cclone = c.createClone();
|
||||
if (cclone.condition != null) {
|
||||
cclone.condition.addBacklink(backlink);
|
||||
}
|
||||
target.conditions_source.add(cclone);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void copyEffectValues(BasicEffect target, BasicEffect source) {
|
||||
target.ap_boost_max = source.ap_boost_max;
|
||||
target.ap_boost_min = source.ap_boost_min;
|
||||
target.hp_boost_max = source.hp_boost_max;
|
||||
target.hp_boost_min = source.hp_boost_min;
|
||||
}
|
||||
|
||||
public static void copyHitEffectValues(Common.HitEffect target, Common.HitEffect source, GameDataElement backlink) {
|
||||
copyDeathEffectValues(target, source, backlink);
|
||||
if (source.conditions_target != null) {
|
||||
target.conditions_target = new ArrayList<>();
|
||||
for (TimedActorConditionEffect c : source.conditions_target) {
|
||||
TimedActorConditionEffect cclone = c.createClone();
|
||||
if (cclone.condition != null) {
|
||||
cclone.condition.addBacklink(backlink);
|
||||
}
|
||||
target.conditions_target.add(cclone);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void copyHitReceivedEffectValues(Common.HitReceivedEffect target, Common.HitReceivedEffect source, GameDataElement backlink) {
|
||||
copyHitEffectValues(target, source, backlink);
|
||||
copyEffectValues(target.target, source.target);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,19 +1,5 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
@@ -21,450 +7,455 @@ import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Requirement.RequirementType;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
|
||||
public class Dialogue extends JSONElement {
|
||||
|
||||
private static final long serialVersionUID = -6872164604703134683L;
|
||||
|
||||
|
||||
//Available from init state
|
||||
//public String id = null; inherited.
|
||||
public String message = null;
|
||||
|
||||
//Available from parsed state;
|
||||
public List<Reward> rewards = null;
|
||||
public List<Reply> replies = null;
|
||||
public String switch_to_npc_id = null;
|
||||
|
||||
//Available from linked state;
|
||||
public NPC switch_to_npc = null;
|
||||
|
||||
public static class Reward {
|
||||
|
||||
//Available from parsed state
|
||||
public RewardType type = null;
|
||||
public String reward_obj_id = null;
|
||||
public Integer reward_value = null;
|
||||
public String map_name = null;
|
||||
|
||||
//Available from linked state
|
||||
public GameDataElement reward_obj = null;
|
||||
public TMXMap map = null;
|
||||
|
||||
public enum RewardType {
|
||||
questProgress,
|
||||
removeQuestProgress,
|
||||
dropList,
|
||||
skillIncrease,
|
||||
actorCondition,
|
||||
actorConditionImmunity,
|
||||
alignmentChange,
|
||||
alignmentSet,
|
||||
giveItem,
|
||||
createTimer,
|
||||
spawnAll,
|
||||
removeSpawnArea,
|
||||
deactivateSpawnArea,
|
||||
activateMapObjectGroup,
|
||||
deactivateMapObjectGroup,
|
||||
changeMapFilter,
|
||||
mapchange
|
||||
}
|
||||
}
|
||||
|
||||
public static class Reply {
|
||||
|
||||
public static final String GO_NEXT_TEXT = "N";
|
||||
public static final String SHOP_PHRASE_ID = "S";
|
||||
public static final String FIGHT_PHRASE_ID = "F";
|
||||
public static final String EXIT_PHRASE_ID = "X";
|
||||
public static final String REMOVE_PHRASE_ID = "R";
|
||||
|
||||
public static final List<String> KEY_PHRASE_ID = Arrays.asList(new String[]{SHOP_PHRASE_ID, FIGHT_PHRASE_ID, EXIT_PHRASE_ID, REMOVE_PHRASE_ID});
|
||||
|
||||
//Available from parsed state
|
||||
public String text = null;
|
||||
public String next_phrase_id = null;
|
||||
public List<Requirement> requirements = null;
|
||||
|
||||
//Available from linked state
|
||||
public Dialogue next_phrase = null;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+id;
|
||||
}
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "Dialogues";
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void fromJson(File jsonFile, GameDataCategory<Dialogue> category) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List dialogues = (List) parser.parse(reader);
|
||||
for (Object obj : dialogues) {
|
||||
Map dialogueJson = (Map)obj;
|
||||
Dialogue dialogue = fromJson(dialogueJson);
|
||||
dialogue.jsonFile = jsonFile;
|
||||
dialogue.parent = category;
|
||||
if (dialogue.getDataType() == GameSource.Type.created || dialogue.getDataType() == GameSource.Type.altered) {
|
||||
dialogue.writable = true;
|
||||
}
|
||||
category.add(dialogue);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Dialogue fromJson(String jsonString) throws ParseException {
|
||||
Map dialogueJson = (Map) new JSONParser().parse(jsonString);
|
||||
Dialogue dialogue = fromJson(dialogueJson);
|
||||
dialogue.parse(dialogueJson);
|
||||
return dialogue;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Dialogue fromJson(Map dialogueJson) {
|
||||
Dialogue dialogue = new Dialogue();
|
||||
dialogue.id = (String) dialogueJson.get("id");
|
||||
dialogue.message = (String) dialogueJson.get("message");
|
||||
return dialogue;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map dialogueJson) {
|
||||
this.switch_to_npc_id = (String) dialogueJson.get("switchToNPC");
|
||||
List repliesJson = (List) dialogueJson.get("replies");
|
||||
if (repliesJson != null && !repliesJson.isEmpty()) {
|
||||
this.replies = new ArrayList<Dialogue.Reply>();
|
||||
for (Object replyJsonObj : repliesJson) {
|
||||
Map replyJson = (Map)replyJsonObj;
|
||||
Reply reply = new Reply();
|
||||
reply.text = (String) replyJson.get("text");
|
||||
reply.next_phrase_id = (String) replyJson.get("nextPhraseID");
|
||||
List requirementsJson = (List) replyJson.get("requires");
|
||||
if (requirementsJson != null && !requirementsJson.isEmpty()) {
|
||||
reply.requirements = new ArrayList<Requirement>();
|
||||
for (Object requirementJsonObj : requirementsJson) {
|
||||
Map requirementJson = (Map) requirementJsonObj;
|
||||
Requirement requirement = new Requirement();
|
||||
requirement.jsonFile = this.jsonFile;
|
||||
requirement.parent = this;
|
||||
if (requirementJson.get("requireType") != null) requirement.type = RequirementType.valueOf((String) requirementJson.get("requireType"));
|
||||
requirement.required_obj_id = (String) requirementJson.get("requireID");
|
||||
if (requirementJson.get("value") != null) requirement.required_value = JSONElement.getInteger(Integer.parseInt(requirementJson.get("value").toString()));
|
||||
if (requirementJson.get("negate") != null) requirement.negated = (Boolean) requirementJson.get("negate");
|
||||
requirement.state = State.parsed;
|
||||
reply.requirements.add(requirement);
|
||||
}
|
||||
}
|
||||
this.replies.add(reply);
|
||||
}
|
||||
}
|
||||
List rewardsJson = (List) dialogueJson.get("rewards");
|
||||
if (rewardsJson != null && !rewardsJson.isEmpty()) {
|
||||
this.rewards = new ArrayList<Dialogue.Reward>();
|
||||
for (Object rewardJsonObj : rewardsJson) {
|
||||
Map rewardJson = (Map)rewardJsonObj;
|
||||
Reward reward = new Reward();
|
||||
if (rewardJson.get("rewardType") != null) reward.type = Reward.RewardType.valueOf((String) rewardJson.get("rewardType"));
|
||||
if (rewardJson.get("rewardID") != null) reward.reward_obj_id = (String) rewardJson.get("rewardID");
|
||||
if (rewardJson.get("value") != null) reward.reward_value = JSONElement.getInteger((Number) rewardJson.get("value"));
|
||||
if (rewardJson.get("mapName") != null) reward.map_name = (String) rewardJson.get("mapName");
|
||||
this.rewards.add(reward);
|
||||
}
|
||||
}
|
||||
this.state = State.parsed;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
||||
//This type of state is unrelated to parsing/linking.
|
||||
return;
|
||||
}
|
||||
if (this.state == State.init) {
|
||||
//Not parsed yet.
|
||||
this.parse();
|
||||
} else if (this.state == State.linked) {
|
||||
//Already linked.
|
||||
return;
|
||||
}
|
||||
Project proj = getProject();
|
||||
if (proj == null) {
|
||||
Notification.addError("Error linking dialogue "+id+". No parent project found.");
|
||||
return;
|
||||
}
|
||||
if (this.switch_to_npc_id != null) this.switch_to_npc = proj.getNPC(this.switch_to_npc_id);
|
||||
if (this.switch_to_npc != null) this.switch_to_npc.addBacklink(this);
|
||||
|
||||
if (replies != null) {
|
||||
for (Reply reply : replies) {
|
||||
if (reply.next_phrase_id != null) {
|
||||
if (!Reply.KEY_PHRASE_ID.contains(reply.next_phrase_id)) {
|
||||
reply.next_phrase = proj.getDialogue(reply.next_phrase_id);
|
||||
}
|
||||
}
|
||||
if (reply.next_phrase != null) reply.next_phrase.addBacklink(this);
|
||||
if (reply.requirements != null) {
|
||||
for (Requirement requirement : reply.requirements) {
|
||||
requirement.link();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rewards != null) {
|
||||
for (Reward reward : rewards) {
|
||||
if (reward.reward_obj_id != null) {
|
||||
switch (reward.type) {
|
||||
case activateMapObjectGroup:
|
||||
case deactivateMapObjectGroup:
|
||||
case spawnAll:
|
||||
case removeSpawnArea:
|
||||
case deactivateSpawnArea:
|
||||
case changeMapFilter:
|
||||
case mapchange:
|
||||
reward.map = reward.map_name != null ? proj.getMap(reward.map_name) : null;
|
||||
break;
|
||||
case actorCondition:
|
||||
case actorConditionImmunity:
|
||||
reward.reward_obj = proj.getActorCondition(reward.reward_obj_id);
|
||||
break;
|
||||
case alignmentChange:
|
||||
case alignmentSet:
|
||||
//Nothing to do (yet ?).
|
||||
break;
|
||||
case createTimer:
|
||||
//Nothing to do.
|
||||
break;
|
||||
case dropList:
|
||||
reward.reward_obj = proj.getDroplist(reward.reward_obj_id);
|
||||
break;
|
||||
case giveItem:
|
||||
reward.reward_obj = proj.getItem(reward.reward_obj_id);
|
||||
break;
|
||||
case questProgress:
|
||||
case removeQuestProgress:
|
||||
reward.reward_obj = proj.getQuest(reward.reward_obj_id);
|
||||
if (reward.reward_obj != null && reward.reward_value != null) {
|
||||
QuestStage stage = ((Quest)reward.reward_obj).getStage(reward.reward_value);
|
||||
if (stage != null) {
|
||||
stage.addBacklink(this);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case skillIncrease:
|
||||
//Nothing to do (yet ?).
|
||||
break;
|
||||
}
|
||||
if (reward.reward_obj != null) reward.reward_obj.addBacklink(this);
|
||||
if (reward.map != null) reward.map.addBacklink(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
private static final long serialVersionUID = -6872164604703134683L;
|
||||
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getDialogueIcon();
|
||||
}
|
||||
|
||||
//Available from init state
|
||||
//public String id = null; inherited.
|
||||
public String message = null;
|
||||
|
||||
public Image getImage() {
|
||||
return DefaultIcons.getDialogueImage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
Dialogue clone = new Dialogue();
|
||||
clone.jsonFile = this.jsonFile;
|
||||
clone.state = this.state;
|
||||
clone.id = this.id;
|
||||
clone.message = this.message;
|
||||
clone.switch_to_npc_id = this.switch_to_npc_id;
|
||||
clone.switch_to_npc = this.switch_to_npc;
|
||||
if (clone.switch_to_npc != null) {
|
||||
clone.switch_to_npc.addBacklink(clone);
|
||||
}
|
||||
if (this.rewards != null) {
|
||||
clone.rewards = new ArrayList<Dialogue.Reward>();
|
||||
for (Reward r : this.rewards) {
|
||||
Reward rclone = new Reward();
|
||||
rclone.type = r.type;
|
||||
rclone.reward_obj_id = r.reward_obj_id;
|
||||
rclone.reward_value = r.reward_value;
|
||||
rclone.reward_obj = r.reward_obj;
|
||||
if (rclone.reward_obj != null) {
|
||||
rclone.reward_obj.addBacklink(clone);
|
||||
}
|
||||
rclone.map = r.map;
|
||||
rclone.map_name = r.map_name;
|
||||
if (rclone.map != null) {
|
||||
rclone.map.addBacklink(clone);
|
||||
}
|
||||
clone.rewards.add(rclone);
|
||||
}
|
||||
}
|
||||
if (this.replies != null) {
|
||||
clone.replies = new ArrayList<Dialogue.Reply>();
|
||||
for (Reply r : this.replies) {
|
||||
Reply rclone = new Reply();
|
||||
rclone.text = r.text;
|
||||
rclone.next_phrase_id = r.next_phrase_id;
|
||||
rclone.next_phrase = r.next_phrase;
|
||||
if (rclone.next_phrase != null) {
|
||||
rclone.next_phrase.addBacklink(clone);
|
||||
}
|
||||
if (r.requirements != null) {
|
||||
rclone.requirements = new ArrayList<Requirement>();
|
||||
for (Requirement req : r.requirements) {
|
||||
//Special clone method, as Requirement is a special GDE, hidden from the project tree.
|
||||
rclone.requirements.add((Requirement) req.clone(clone));
|
||||
}
|
||||
}
|
||||
clone.replies.add(rclone);
|
||||
}
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (switch_to_npc == oldOne) {
|
||||
oldOne.removeBacklink(this);
|
||||
switch_to_npc = (NPC) newOne;
|
||||
if (newOne != null) newOne.addBacklink(this);
|
||||
} else {
|
||||
if (replies != null) {
|
||||
for (Reply r : replies) {
|
||||
if (r.next_phrase == oldOne) {
|
||||
oldOne.removeBacklink(this);
|
||||
r.next_phrase = (Dialogue) newOne;
|
||||
if (newOne != null) newOne.addBacklink(this);
|
||||
}
|
||||
if (r.requirements != null) {
|
||||
for (Requirement req : r.requirements) {
|
||||
req.elementChanged(oldOne, newOne);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rewards != null) {
|
||||
for (Reward r : rewards) {
|
||||
if (r.reward_obj == oldOne) {
|
||||
oldOne.removeBacklink(this);
|
||||
r.reward_obj = newOne;
|
||||
if (newOne != null) newOne.addBacklink(this);
|
||||
}
|
||||
if (oldOne instanceof QuestStage) {
|
||||
if (r.reward_obj != null && r.reward_obj.equals(oldOne.parent) && r.reward_value != null && r.reward_value.equals(((QuestStage) oldOne).progress)) {
|
||||
oldOne.removeBacklink((GameDataElement) this);
|
||||
if (newOne != null) newOne.addBacklink((GameDataElement) this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//Available from parsed state;
|
||||
public List<Reward> rewards = null;
|
||||
public List<Reply> replies = null;
|
||||
public String switch_to_npc_id = null;
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map dialogueJson = new LinkedHashMap();
|
||||
dialogueJson.put("id", this.id);
|
||||
if (this.message != null) dialogueJson.put("message", this.message);
|
||||
if (this.switch_to_npc != null) {
|
||||
dialogueJson.put("switchToNPC", this.switch_to_npc.id);
|
||||
} else if (this.switch_to_npc_id != null) {
|
||||
dialogueJson.put("switchToNPC", this.switch_to_npc_id);
|
||||
}
|
||||
if (this.replies != null) {
|
||||
List repliesJson = new ArrayList();
|
||||
dialogueJson.put("replies", repliesJson);
|
||||
for (Reply reply : this.replies){
|
||||
Map replyJson = new LinkedHashMap();
|
||||
repliesJson.add(replyJson);
|
||||
if (reply.text != null) replyJson.put("text", reply.text);
|
||||
if (reply.next_phrase != null) {
|
||||
replyJson.put("nextPhraseID", reply.next_phrase.id);
|
||||
} else if (reply.next_phrase_id != null) {
|
||||
replyJson.put("nextPhraseID", reply.next_phrase_id);
|
||||
}
|
||||
if (reply.requirements != null) {
|
||||
List requirementsJson = new ArrayList();
|
||||
replyJson.put("requires", requirementsJson);
|
||||
for (Requirement requirement : reply.requirements) {
|
||||
Map requirementJson = new LinkedHashMap();
|
||||
requirementsJson.add(requirementJson);
|
||||
if (requirement.type != null) requirementJson.put("requireType", requirement.type.toString());
|
||||
if (requirement.required_obj != null) {
|
||||
requirementJson.put("requireID", requirement.required_obj.id);
|
||||
} else if (requirement.required_obj_id != null) {
|
||||
requirementJson.put("requireID", requirement.required_obj_id);
|
||||
}
|
||||
if (requirement.required_value != null) {
|
||||
requirementJson.put("value", requirement.required_value);
|
||||
}
|
||||
if (requirement.negated != null) requirementJson.put("negate", requirement.negated);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.rewards != null) {
|
||||
List rewardsJson = new ArrayList();
|
||||
dialogueJson.put("rewards", rewardsJson);
|
||||
for (Reward reward : this.rewards) {
|
||||
Map rewardJson = new LinkedHashMap();
|
||||
rewardsJson.add(rewardJson);
|
||||
if (reward.type != null) rewardJson.put("rewardType", reward.type.toString());
|
||||
if (reward.reward_obj != null) {
|
||||
rewardJson.put("rewardID", reward.reward_obj.id);
|
||||
} else if (reward.reward_obj_id != null) {
|
||||
rewardJson.put("rewardID", reward.reward_obj_id);
|
||||
}
|
||||
if (reward.reward_value != null) rewardJson.put("value", reward.reward_value);
|
||||
if (reward.map != null) {
|
||||
rewardJson.put("mapName", reward.map.id);
|
||||
} else if (reward.map_name != null) rewardJson.put("mapName", reward.map_name);
|
||||
}
|
||||
}
|
||||
return dialogueJson;
|
||||
}
|
||||
//Available from linked state;
|
||||
public NPC switch_to_npc = null;
|
||||
|
||||
public static class Reward {
|
||||
|
||||
//Available from parsed state
|
||||
public RewardType type = null;
|
||||
public String reward_obj_id = null;
|
||||
public Integer reward_value = null;
|
||||
public String map_name = null;
|
||||
|
||||
//Available from linked state
|
||||
public GameDataElement reward_obj = null;
|
||||
public TMXMap map = null;
|
||||
|
||||
public enum RewardType {
|
||||
questProgress,
|
||||
removeQuestProgress,
|
||||
dropList,
|
||||
skillIncrease,
|
||||
actorCondition,
|
||||
actorConditionImmunity,
|
||||
alignmentChange,
|
||||
alignmentSet,
|
||||
giveItem,
|
||||
createTimer,
|
||||
spawnAll,
|
||||
removeSpawnArea,
|
||||
deactivateSpawnArea,
|
||||
activateMapObjectGroup,
|
||||
deactivateMapObjectGroup,
|
||||
changeMapFilter,
|
||||
mapchange
|
||||
}
|
||||
}
|
||||
|
||||
public static class Reply {
|
||||
|
||||
public static final String GO_NEXT_TEXT = "N";
|
||||
public static final String SHOP_PHRASE_ID = "S";
|
||||
public static final String FIGHT_PHRASE_ID = "F";
|
||||
public static final String EXIT_PHRASE_ID = "X";
|
||||
public static final String REMOVE_PHRASE_ID = "R";
|
||||
|
||||
public static final List<String> KEY_PHRASE_ID = Arrays.asList(new String[]{SHOP_PHRASE_ID, FIGHT_PHRASE_ID, EXIT_PHRASE_ID, REMOVE_PHRASE_ID});
|
||||
|
||||
//Available from parsed state
|
||||
public String text = null;
|
||||
public String next_phrase_id = null;
|
||||
public List<Requirement> requirements = null;
|
||||
|
||||
//Available from linked state
|
||||
public Dialogue next_phrase = null;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + id;
|
||||
}
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "Dialogues";
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void fromJson(File jsonFile, GameDataCategory<Dialogue> category) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List dialogues = (List) parser.parse(reader);
|
||||
for (Object obj : dialogues) {
|
||||
Map dialogueJson = (Map) obj;
|
||||
Dialogue dialogue = fromJson(dialogueJson);
|
||||
dialogue.jsonFile = jsonFile;
|
||||
dialogue.parent = category;
|
||||
if (dialogue.getDataType() == GameSource.Type.created || dialogue.getDataType() == GameSource.Type.altered) {
|
||||
dialogue.writable = true;
|
||||
}
|
||||
category.add(dialogue);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Dialogue fromJson(String jsonString) throws ParseException {
|
||||
Map dialogueJson = (Map) new JSONParser().parse(jsonString);
|
||||
Dialogue dialogue = fromJson(dialogueJson);
|
||||
dialogue.parse(dialogueJson);
|
||||
return dialogue;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Dialogue fromJson(Map dialogueJson) {
|
||||
Dialogue dialogue = new Dialogue();
|
||||
dialogue.id = (String) dialogueJson.get("id");
|
||||
dialogue.message = (String) dialogueJson.get("message");
|
||||
return dialogue;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map dialogueJson) {
|
||||
this.switch_to_npc_id = (String) dialogueJson.get("switchToNPC");
|
||||
List repliesJson = (List) dialogueJson.get("replies");
|
||||
if (repliesJson != null && !repliesJson.isEmpty()) {
|
||||
this.replies = new ArrayList<Dialogue.Reply>();
|
||||
for (Object replyJsonObj : repliesJson) {
|
||||
Map replyJson = (Map) replyJsonObj;
|
||||
Reply reply = new Reply();
|
||||
reply.text = (String) replyJson.get("text");
|
||||
reply.next_phrase_id = (String) replyJson.get("nextPhraseID");
|
||||
List requirementsJson = (List) replyJson.get("requires");
|
||||
if (requirementsJson != null && !requirementsJson.isEmpty()) {
|
||||
reply.requirements = new ArrayList<Requirement>();
|
||||
for (Object requirementJsonObj : requirementsJson) {
|
||||
Map requirementJson = (Map) requirementJsonObj;
|
||||
Requirement requirement = new Requirement();
|
||||
requirement.jsonFile = this.jsonFile;
|
||||
requirement.parent = this;
|
||||
if (requirementJson.get("requireType") != null)
|
||||
requirement.type = RequirementType.valueOf((String) requirementJson.get("requireType"));
|
||||
requirement.required_obj_id = (String) requirementJson.get("requireID");
|
||||
if (requirementJson.get("value") != null)
|
||||
requirement.required_value = JSONElement.getInteger(Integer.parseInt(requirementJson.get("value").toString()));
|
||||
if (requirementJson.get("negate") != null)
|
||||
requirement.negated = (Boolean) requirementJson.get("negate");
|
||||
requirement.state = State.parsed;
|
||||
reply.requirements.add(requirement);
|
||||
}
|
||||
}
|
||||
this.replies.add(reply);
|
||||
}
|
||||
}
|
||||
List rewardsJson = (List) dialogueJson.get("rewards");
|
||||
if (rewardsJson != null && !rewardsJson.isEmpty()) {
|
||||
this.rewards = new ArrayList<Dialogue.Reward>();
|
||||
for (Object rewardJsonObj : rewardsJson) {
|
||||
Map rewardJson = (Map) rewardJsonObj;
|
||||
Reward reward = new Reward();
|
||||
if (rewardJson.get("rewardType") != null)
|
||||
reward.type = Reward.RewardType.valueOf((String) rewardJson.get("rewardType"));
|
||||
if (rewardJson.get("rewardID") != null) reward.reward_obj_id = (String) rewardJson.get("rewardID");
|
||||
if (rewardJson.get("value") != null)
|
||||
reward.reward_value = JSONElement.getInteger((Number) rewardJson.get("value"));
|
||||
if (rewardJson.get("mapName") != null) reward.map_name = (String) rewardJson.get("mapName");
|
||||
this.rewards.add(reward);
|
||||
}
|
||||
}
|
||||
this.state = State.parsed;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (shouldSkipParseOrLink()) {
|
||||
return;
|
||||
}
|
||||
ensureParseIfNeeded();
|
||||
Project proj = getProject();
|
||||
if (proj == null) {
|
||||
Notification.addError("Error linking dialogue " + id + ". No parent project found.");
|
||||
return;
|
||||
}
|
||||
if (this.switch_to_npc_id != null) this.switch_to_npc = proj.getNPC(this.switch_to_npc_id);
|
||||
if (this.switch_to_npc != null) this.switch_to_npc.addBacklink(this);
|
||||
|
||||
if (replies != null) {
|
||||
for (Reply reply : replies) {
|
||||
if (reply.next_phrase_id != null) {
|
||||
if (!Reply.KEY_PHRASE_ID.contains(reply.next_phrase_id)) {
|
||||
reply.next_phrase = proj.getDialogue(reply.next_phrase_id);
|
||||
}
|
||||
}
|
||||
if (reply.next_phrase != null) reply.next_phrase.addBacklink(this);
|
||||
if (reply.requirements != null) {
|
||||
for (Requirement requirement : reply.requirements) {
|
||||
requirement.link();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rewards != null) {
|
||||
for (Reward reward : rewards) {
|
||||
if (reward.reward_obj_id != null) {
|
||||
switch (reward.type) {
|
||||
case activateMapObjectGroup:
|
||||
case deactivateMapObjectGroup:
|
||||
case spawnAll:
|
||||
case removeSpawnArea:
|
||||
case deactivateSpawnArea:
|
||||
case changeMapFilter:
|
||||
case mapchange:
|
||||
reward.map = reward.map_name != null ? proj.getMap(reward.map_name) : null;
|
||||
break;
|
||||
case actorCondition:
|
||||
case actorConditionImmunity:
|
||||
reward.reward_obj = proj.getActorCondition(reward.reward_obj_id);
|
||||
break;
|
||||
case alignmentChange:
|
||||
case alignmentSet:
|
||||
//Nothing to do (yet ?).
|
||||
break;
|
||||
case createTimer:
|
||||
//Nothing to do.
|
||||
break;
|
||||
case dropList:
|
||||
reward.reward_obj = proj.getDroplist(reward.reward_obj_id);
|
||||
break;
|
||||
case giveItem:
|
||||
reward.reward_obj = proj.getItem(reward.reward_obj_id);
|
||||
break;
|
||||
case questProgress:
|
||||
case removeQuestProgress:
|
||||
reward.reward_obj = proj.getQuest(reward.reward_obj_id);
|
||||
if (reward.reward_obj != null && reward.reward_value != null) {
|
||||
QuestStage stage = ((Quest) reward.reward_obj).getStage(reward.reward_value);
|
||||
if (stage != null) {
|
||||
stage.addBacklink(this);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case skillIncrease:
|
||||
//Nothing to do (yet ?).
|
||||
break;
|
||||
}
|
||||
if (reward.reward_obj != null) reward.reward_obj.addBacklink(this);
|
||||
if (reward.map != null) reward.map.addBacklink(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getDialogueIcon();
|
||||
}
|
||||
|
||||
|
||||
public Image getImage() {
|
||||
return DefaultIcons.getDialogueImage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
Dialogue clone = new Dialogue();
|
||||
clone.jsonFile = this.jsonFile;
|
||||
clone.state = this.state;
|
||||
clone.id = this.id;
|
||||
clone.message = this.message;
|
||||
clone.switch_to_npc_id = this.switch_to_npc_id;
|
||||
clone.switch_to_npc = this.switch_to_npc;
|
||||
if (clone.switch_to_npc != null) {
|
||||
clone.switch_to_npc.addBacklink(clone);
|
||||
}
|
||||
if (this.rewards != null) {
|
||||
clone.rewards = new ArrayList<Dialogue.Reward>();
|
||||
for (Reward r : this.rewards) {
|
||||
Reward rclone = new Reward();
|
||||
rclone.type = r.type;
|
||||
rclone.reward_obj_id = r.reward_obj_id;
|
||||
rclone.reward_value = r.reward_value;
|
||||
rclone.reward_obj = r.reward_obj;
|
||||
if (rclone.reward_obj != null) {
|
||||
rclone.reward_obj.addBacklink(clone);
|
||||
}
|
||||
rclone.map = r.map;
|
||||
rclone.map_name = r.map_name;
|
||||
if (rclone.map != null) {
|
||||
rclone.map.addBacklink(clone);
|
||||
}
|
||||
clone.rewards.add(rclone);
|
||||
}
|
||||
}
|
||||
if (this.replies != null) {
|
||||
clone.replies = new ArrayList<Dialogue.Reply>();
|
||||
for (Reply r : this.replies) {
|
||||
Reply rclone = new Reply();
|
||||
rclone.text = r.text;
|
||||
rclone.next_phrase_id = r.next_phrase_id;
|
||||
rclone.next_phrase = r.next_phrase;
|
||||
if (rclone.next_phrase != null) {
|
||||
rclone.next_phrase.addBacklink(clone);
|
||||
}
|
||||
if (r.requirements != null) {
|
||||
rclone.requirements = new ArrayList<Requirement>();
|
||||
for (Requirement req : r.requirements) {
|
||||
//Special clone method, as Requirement is a special GDE, hidden from the project tree.
|
||||
rclone.requirements.add((Requirement) req.clone(clone));
|
||||
}
|
||||
}
|
||||
clone.replies.add(rclone);
|
||||
}
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (switch_to_npc == oldOne) {
|
||||
oldOne.removeBacklink(this);
|
||||
switch_to_npc = (NPC) newOne;
|
||||
if (newOne != null) newOne.addBacklink(this);
|
||||
} else {
|
||||
if (replies != null) {
|
||||
for (Reply r : replies) {
|
||||
if (r.next_phrase == oldOne) {
|
||||
oldOne.removeBacklink(this);
|
||||
r.next_phrase = (Dialogue) newOne;
|
||||
if (newOne != null) newOne.addBacklink(this);
|
||||
}
|
||||
if (r.requirements != null) {
|
||||
for (Requirement req : r.requirements) {
|
||||
req.elementChanged(oldOne, newOne);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (rewards != null) {
|
||||
for (Reward r : rewards) {
|
||||
if (r.reward_obj == oldOne) {
|
||||
oldOne.removeBacklink(this);
|
||||
r.reward_obj = newOne;
|
||||
if (newOne != null) newOne.addBacklink(this);
|
||||
}
|
||||
if (oldOne instanceof QuestStage) {
|
||||
if (r.reward_obj != null && r.reward_obj.equals(oldOne.parent) && r.reward_value != null && r.reward_value.equals(((QuestStage) oldOne).progress)) {
|
||||
oldOne.removeBacklink((GameDataElement) this);
|
||||
if (newOne != null) newOne.addBacklink((GameDataElement) this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map dialogueJson = new LinkedHashMap();
|
||||
dialogueJson.put("id", this.id);
|
||||
if (this.message != null) dialogueJson.put("message", this.message);
|
||||
if (this.switch_to_npc != null) {
|
||||
dialogueJson.put("switchToNPC", this.switch_to_npc.id);
|
||||
} else if (this.switch_to_npc_id != null) {
|
||||
dialogueJson.put("switchToNPC", this.switch_to_npc_id);
|
||||
}
|
||||
if (this.replies != null) {
|
||||
List repliesJson = new ArrayList();
|
||||
dialogueJson.put("replies", repliesJson);
|
||||
for (Reply reply : this.replies) {
|
||||
Map replyJson = new LinkedHashMap();
|
||||
repliesJson.add(replyJson);
|
||||
if (reply.text != null) replyJson.put("text", reply.text);
|
||||
if (reply.next_phrase != null) {
|
||||
replyJson.put("nextPhraseID", reply.next_phrase.id);
|
||||
} else if (reply.next_phrase_id != null) {
|
||||
replyJson.put("nextPhraseID", reply.next_phrase_id);
|
||||
}
|
||||
if (reply.requirements != null) {
|
||||
List requirementsJson = new ArrayList();
|
||||
replyJson.put("requires", requirementsJson);
|
||||
for (Requirement requirement : reply.requirements) {
|
||||
Map requirementJson = new LinkedHashMap();
|
||||
requirementsJson.add(requirementJson);
|
||||
if (requirement.type != null) requirementJson.put("requireType", requirement.type.toString());
|
||||
if (requirement.required_obj != null) {
|
||||
requirementJson.put("requireID", requirement.required_obj.id);
|
||||
} else if (requirement.required_obj_id != null) {
|
||||
requirementJson.put("requireID", requirement.required_obj_id);
|
||||
}
|
||||
if (requirement.required_value != null) {
|
||||
requirementJson.put("value", requirement.required_value);
|
||||
}
|
||||
if (requirement.negated != null) requirementJson.put("negate", requirement.negated);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.rewards != null) {
|
||||
List rewardsJson = new ArrayList();
|
||||
dialogueJson.put("rewards", rewardsJson);
|
||||
for (Reward reward : this.rewards) {
|
||||
Map rewardJson = new LinkedHashMap();
|
||||
rewardsJson.add(rewardJson);
|
||||
if (reward.type != null) rewardJson.put("rewardType", reward.type.toString());
|
||||
if (reward.reward_obj != null) {
|
||||
rewardJson.put("rewardID", reward.reward_obj.id);
|
||||
} else if (reward.reward_obj_id != null) {
|
||||
rewardJson.put("rewardID", reward.reward_obj_id);
|
||||
}
|
||||
if (reward.reward_value != null) rewardJson.put("value", reward.reward_value);
|
||||
if (reward.map != null) {
|
||||
rewardJson.put("mapName", reward.map.id);
|
||||
} else if (reward.map_name != null) rewardJson.put("mapName", reward.map_name);
|
||||
}
|
||||
}
|
||||
return dialogueJson;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "conversationlist_" + getProject().name + ".json";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "conversationlist_"+getProject().name+".json";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||
|
||||
import java.awt.Image;
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
@@ -10,233 +18,216 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
|
||||
public class Droplist extends JSONElement {
|
||||
|
||||
private static final long serialVersionUID = -2903944916807382571L;
|
||||
|
||||
//Available from init state
|
||||
//public String id = null; inherited.
|
||||
private static final long serialVersionUID = -2903944916807382571L;
|
||||
|
||||
//Available from parsed state;
|
||||
public List<DroppedItem> dropped_items = null;
|
||||
|
||||
//Available from linked state;
|
||||
//None
|
||||
|
||||
public static class DroppedItem {
|
||||
//Available from parsed state;
|
||||
public String item_id = null;
|
||||
public String chance = null;
|
||||
public Integer quantity_min = null;
|
||||
public Integer quantity_max = null;
|
||||
|
||||
//Available from linked state;
|
||||
public Item item = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+id;
|
||||
}
|
||||
//Available from init state
|
||||
//public String id = null; inherited.
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "Droplists";
|
||||
}
|
||||
//Available from parsed state;
|
||||
public List<DroppedItem> dropped_items = null;
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void fromJson(File jsonFile, GameDataCategory<Droplist> category) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List droplists = (List) parser.parse(reader);
|
||||
for (Object obj : droplists) {
|
||||
Map droplistJson = (Map)obj;
|
||||
Droplist droplist = fromJson(droplistJson);
|
||||
droplist.jsonFile = jsonFile;
|
||||
droplist.parent = category;
|
||||
if (droplist.getDataType() == GameSource.Type.created || droplist.getDataType() == GameSource.Type.altered) {
|
||||
droplist.writable = true;
|
||||
}
|
||||
category.add(droplist);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Droplist fromJson(String jsonString) throws ParseException {
|
||||
Map droplistJson = (Map) new JSONParser().parse(jsonString);
|
||||
Droplist droplist = fromJson(droplistJson);
|
||||
droplist.parse(droplistJson);
|
||||
return droplist;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Droplist fromJson(Map droplistJson) {
|
||||
Droplist droplist = new Droplist();
|
||||
droplist.id = (String) droplistJson.get("id");
|
||||
return droplist;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map droplistJson) {
|
||||
List droppedItemsJson = (List) droplistJson.get("items");
|
||||
if (droppedItemsJson != null && !droppedItemsJson.isEmpty()) {
|
||||
this.dropped_items = new ArrayList<DroppedItem>();
|
||||
for (Object droppedItemJsonObj : droppedItemsJson) {
|
||||
Map droppedItemJson = (Map)droppedItemJsonObj;
|
||||
DroppedItem droppedItem = new DroppedItem();
|
||||
droppedItem.item_id = (String) droppedItemJson.get("itemID");
|
||||
//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");
|
||||
if (droppedItemQtyJson != null) {
|
||||
droppedItem.quantity_min = JSONElement.getInteger((Number) droppedItemQtyJson.get("min"));
|
||||
droppedItem.quantity_max = JSONElement.getInteger((Number) droppedItemQtyJson.get("max"));
|
||||
}
|
||||
this.dropped_items.add(droppedItem);
|
||||
}
|
||||
}
|
||||
this.state = State.parsed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
||||
//This type of state is unrelated to parsing/linking.
|
||||
return;
|
||||
}
|
||||
if (this.state == State.init) {
|
||||
//Not parsed yet.
|
||||
this.parse();
|
||||
} else if (this.state == State.linked) {
|
||||
//Already linked.
|
||||
return;
|
||||
}
|
||||
Project proj = getProject();
|
||||
if (proj == null) {
|
||||
Notification.addError("Error linking droplist "+id+". No parent project found.");
|
||||
return;
|
||||
}
|
||||
if (dropped_items != null) {
|
||||
for (DroppedItem droppedItem : dropped_items) {
|
||||
if (droppedItem.item_id != null) droppedItem.item = proj.getItem(droppedItem.item_id);
|
||||
if (droppedItem.item != null) droppedItem.item.addBacklink(this);
|
||||
}
|
||||
}
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
//Available from linked state;
|
||||
//None
|
||||
|
||||
public static class DroppedItem {
|
||||
//Available from parsed state;
|
||||
public String item_id = null;
|
||||
public String chance = null;
|
||||
public Integer quantity_min = null;
|
||||
public Integer quantity_max = null;
|
||||
|
||||
//Available from linked state;
|
||||
public Item item = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + id;
|
||||
}
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "Droplists";
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void fromJson(File jsonFile, GameDataCategory<Droplist> category) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List droplists = (List) parser.parse(reader);
|
||||
for (Object obj : droplists) {
|
||||
Map droplistJson = (Map) obj;
|
||||
Droplist droplist = fromJson(droplistJson);
|
||||
droplist.jsonFile = jsonFile;
|
||||
droplist.parent = category;
|
||||
if (droplist.getDataType() == GameSource.Type.created || droplist.getDataType() == GameSource.Type.altered) {
|
||||
droplist.writable = true;
|
||||
}
|
||||
category.add(droplist);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Droplist fromJson(String jsonString) throws ParseException {
|
||||
Map droplistJson = (Map) new JSONParser().parse(jsonString);
|
||||
Droplist droplist = fromJson(droplistJson);
|
||||
droplist.parse(droplistJson);
|
||||
return droplist;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Droplist fromJson(Map droplistJson) {
|
||||
Droplist droplist = new Droplist();
|
||||
droplist.id = (String) droplistJson.get("id");
|
||||
return droplist;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map droplistJson) {
|
||||
List droppedItemsJson = (List) droplistJson.get("items");
|
||||
if (droppedItemsJson != null && !droppedItemsJson.isEmpty()) {
|
||||
this.dropped_items = new ArrayList<DroppedItem>();
|
||||
for (Object droppedItemJsonObj : droppedItemsJson) {
|
||||
Map droppedItemJson = (Map) droppedItemJsonObj;
|
||||
DroppedItem droppedItem = new DroppedItem();
|
||||
droppedItem.item_id = (String) droppedItemJson.get("itemID");
|
||||
//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");
|
||||
if (droppedItemQtyJson != null) {
|
||||
droppedItem.quantity_min = JSONElement.getInteger((Number) droppedItemQtyJson.get("min"));
|
||||
droppedItem.quantity_max = JSONElement.getInteger((Number) droppedItemQtyJson.get("max"));
|
||||
}
|
||||
this.dropped_items.add(droppedItem);
|
||||
}
|
||||
}
|
||||
this.state = State.parsed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (shouldSkipParseOrLink()) {
|
||||
return;
|
||||
}
|
||||
ensureParseIfNeeded();
|
||||
Project proj = getProject();
|
||||
if (proj == null) {
|
||||
Notification.addError("Error linking droplist " + id + ". No parent project found.");
|
||||
return;
|
||||
}
|
||||
if (dropped_items != null) {
|
||||
for (DroppedItem droppedItem : dropped_items) {
|
||||
if (droppedItem.item_id != null) droppedItem.item = proj.getItem(droppedItem.item_id);
|
||||
if (droppedItem.item != null) droppedItem.item.addBacklink(this);
|
||||
}
|
||||
}
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
|
||||
public static Image getImage() {
|
||||
return DefaultIcons.getDroplistImage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getDroplistIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
Droplist clone = new Droplist();
|
||||
clone.jsonFile = this.jsonFile;
|
||||
clone.state = this.state;
|
||||
clone.id = this.id;
|
||||
if (this.dropped_items != null) {
|
||||
clone.dropped_items = new ArrayList<Droplist.DroppedItem>();
|
||||
for (DroppedItem di : this.dropped_items) {
|
||||
DroppedItem diclone = new DroppedItem();
|
||||
diclone.chance = di.chance;
|
||||
diclone.item_id = di.item_id;
|
||||
diclone.quantity_min = di.quantity_min;
|
||||
diclone.quantity_max = di.quantity_max;
|
||||
diclone.item = di.item;
|
||||
if (diclone.item != null) {
|
||||
diclone.item.addBacklink(clone);
|
||||
}
|
||||
clone.dropped_items.add(diclone);
|
||||
}
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (dropped_items != null) {
|
||||
for (DroppedItem di : dropped_items) {
|
||||
if (di.item == oldOne) {
|
||||
oldOne.removeBacklink(this);
|
||||
di.item = (Item) newOne;
|
||||
if (newOne != null) newOne.addBacklink(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map droplistJson = new LinkedHashMap();
|
||||
droplistJson.put("id", this.id);
|
||||
if (this.dropped_items != null) {
|
||||
List droppedItemsJson = new ArrayList();
|
||||
droplistJson.put("items", droppedItemsJson);
|
||||
for (DroppedItem droppedItem : this.dropped_items) {
|
||||
Map droppedItemJson = new LinkedHashMap();
|
||||
droppedItemsJson.add(droppedItemJson);
|
||||
if (droppedItem.item != null) {
|
||||
droppedItemJson.put("itemID", droppedItem.item.id);
|
||||
} else if (droppedItem.item_id != null) {
|
||||
droppedItemJson.put("itemID", droppedItem.item_id);
|
||||
}
|
||||
//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) {
|
||||
Map quantityJson = new LinkedHashMap();
|
||||
droppedItemJson.put("quantity", quantityJson);
|
||||
if (droppedItem.quantity_min != null) quantityJson.put("min", droppedItem.quantity_min);
|
||||
else quantityJson.put("min", 0);
|
||||
if (droppedItem.quantity_max != null) quantityJson.put("max", droppedItem.quantity_max);
|
||||
else quantityJson.put("max", 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
return droplistJson;
|
||||
}
|
||||
|
||||
public static Image getImage() {
|
||||
return DefaultIcons.getDroplistImage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getDroplistIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
Droplist clone = new Droplist();
|
||||
clone.jsonFile = this.jsonFile;
|
||||
clone.state = this.state;
|
||||
clone.id = this.id;
|
||||
if (this.dropped_items != null) {
|
||||
clone.dropped_items = new ArrayList<Droplist.DroppedItem>();
|
||||
for (DroppedItem di : this.dropped_items) {
|
||||
DroppedItem diclone = new DroppedItem();
|
||||
diclone.chance = di.chance;
|
||||
diclone.item_id = di.item_id;
|
||||
diclone.quantity_min = di.quantity_min;
|
||||
diclone.quantity_max = di.quantity_max;
|
||||
diclone.item = di.item;
|
||||
if (diclone.item != null) {
|
||||
diclone.item.addBacklink(clone);
|
||||
}
|
||||
clone.dropped_items.add(diclone);
|
||||
}
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (dropped_items != null) {
|
||||
for (DroppedItem di : dropped_items) {
|
||||
if (di.item == oldOne) {
|
||||
oldOne.removeBacklink(this);
|
||||
di.item = (Item) newOne;
|
||||
if (newOne != null) newOne.addBacklink(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map droplistJson = new LinkedHashMap();
|
||||
droplistJson.put("id", this.id);
|
||||
if (this.dropped_items != null) {
|
||||
List droppedItemsJson = new ArrayList();
|
||||
droplistJson.put("items", droppedItemsJson);
|
||||
for (DroppedItem droppedItem : this.dropped_items) {
|
||||
Map droppedItemJson = new LinkedHashMap();
|
||||
droppedItemsJson.add(droppedItemJson);
|
||||
if (droppedItem.item != null) {
|
||||
droppedItemJson.put("itemID", droppedItem.item.id);
|
||||
} else if (droppedItem.item_id != null) {
|
||||
droppedItemJson.put("itemID", droppedItem.item_id);
|
||||
}
|
||||
//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) {
|
||||
Map quantityJson = new LinkedHashMap();
|
||||
droppedItemJson.put("quantity", quantityJson);
|
||||
if (droppedItem.quantity_min != null) quantityJson.put("min", droppedItem.quantity_min);
|
||||
else quantityJson.put("min", 0);
|
||||
if (droppedItem.quantity_max != null) quantityJson.put("max", droppedItem.quantity_max);
|
||||
else quantityJson.put("max", 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
return droplistJson;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "droplists_" + getProject().name + ".json";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "droplists_"+getProject().name+".json";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,253 +1,236 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
import java.io.StringWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.*;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
import com.gpl.rpg.atcontentstudio.utils.FileUtils;
|
||||
import org.json.simple.JSONArray;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.io.*;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
public class GameDataCategory<E extends JSONElement> extends ArrayList<E> implements ProjectTreeNode, Serializable {
|
||||
|
||||
private static final long serialVersionUID = 5486008219704443733L;
|
||||
|
||||
public GameDataSet parent;
|
||||
public String name;
|
||||
|
||||
public GameDataCategory(GameDataSet parent, String name) {
|
||||
super();
|
||||
this.parent = parent;
|
||||
this.name = name;
|
||||
}
|
||||
private static final long serialVersionUID = 5486008219704443733L;
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return get(childIndex);
|
||||
}
|
||||
public GameDataSet parent;
|
||||
public String name;
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return size();
|
||||
}
|
||||
public GameDataCategory(GameDataSet parent, String name) {
|
||||
super();
|
||||
this.parent = parent;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return get(childIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return indexOf(node);
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return indexOf(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<E> children() {
|
||||
return Collections.enumeration(this);
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (E node : this) {
|
||||
node.notifyCreated();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+this.name;
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
return (o == this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getJsonClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getJsonClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getJsonOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return parent.getDataSet();
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public void save(File jsonFile) {
|
||||
if (getDataType() != GameSource.Type.created && getDataType() != GameSource.Type.altered) {
|
||||
Notification.addError("Error while trying to write json file "+jsonFile.getAbsolutePath()+" : Game Source type "+getDataType().toString()+" should not be saved.");
|
||||
return;
|
||||
}
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (E element : this) {
|
||||
if (element.jsonFile.equals(jsonFile)) {
|
||||
dataToSave.add(element.toJson());
|
||||
}
|
||||
}
|
||||
if (dataToSave.isEmpty() && jsonFile.exists()) {
|
||||
if (jsonFile.delete()) {
|
||||
Notification.addSuccess("File "+jsonFile.getAbsolutePath()+" deleted.");
|
||||
} else {
|
||||
Notification.addError("Error deleting file "+jsonFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
StringWriter writer = new JsonPrettyWriter();
|
||||
try {
|
||||
JSONArray.writeJSONString(dataToSave, writer);
|
||||
} catch (IOException e) {
|
||||
//Impossible with a StringWriter
|
||||
}
|
||||
String toWrite = writer.toString();
|
||||
try {
|
||||
FileWriter w = new FileWriter(jsonFile);
|
||||
w.write(toWrite);
|
||||
w.close();
|
||||
for (E element : this) {
|
||||
element.state = GameDataElement.State.saved;
|
||||
}
|
||||
Notification.addSuccess("Json file "+jsonFile.getAbsolutePath()+" saved.");
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while writing json file "+jsonFile.getAbsolutePath()+" : "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<E> children() {
|
||||
return Collections.enumeration(this);
|
||||
}
|
||||
|
||||
public List<SaveEvent> attemptSave(boolean checkImpactedCategory, String fileName) {
|
||||
List<SaveEvent> events = new ArrayList<SaveEvent>();
|
||||
GameDataCategory<? extends JSONElement> impactedCategory = null;
|
||||
String impactedFileName = fileName;
|
||||
Map<String, Integer> containedIds = new LinkedHashMap<String, Integer>();
|
||||
for (JSONElement node : this) {
|
||||
if (node.getDataType() == GameSource.Type.created && getProject().baseContent.gameData.getGameDataElement(node.getClass(), node.id) != null) {
|
||||
if (getProject().alteredContent.gameData.getGameDataElement(node.getClass(), node.id) != null) {
|
||||
events.add(new SaveEvent(SaveEvent.Type.moveToAltered, node, true, "Element ID matches one already present in the altered game content. Change this ID before saving."));
|
||||
} else {
|
||||
events.add(new SaveEvent(SaveEvent.Type.moveToAltered, node));
|
||||
impactedFileName = getProject().baseContent.gameData.getGameDataElement(node.getClass(), node.id).jsonFile.getName();
|
||||
impactedCategory = getProject().alteredContent.gameData.getCategory(node.getClass());
|
||||
}
|
||||
} else if (this.getDataType() == GameSource.Type.altered && getProject().baseContent.gameData.getGameDataElement(node.getClass(), node.id) == null) {
|
||||
if (getProject().createdContent.gameData.getGameDataElement(node.getClass(), node.id) != null) {
|
||||
events.add(new SaveEvent(SaveEvent.Type.moveToCreated, node, true, "Element ID matches one already present in the created game content. Change this ID before saving."));
|
||||
} else {
|
||||
events.add(new SaveEvent(SaveEvent.Type.moveToCreated, node));
|
||||
impactedCategory = getProject().createdContent.gameData.getCategory(node.getClass());
|
||||
impactedFileName = node.getProjectFilename();
|
||||
}
|
||||
} else if (node.needsSaving()) {
|
||||
events.add(new SaveEvent(SaveEvent.Type.alsoSave, node));
|
||||
}
|
||||
if (containedIds.containsKey(node.id)) {
|
||||
containedIds.put(node.id, containedIds.get(node.id) + 1);
|
||||
} else {
|
||||
containedIds.put(node.id, 1);
|
||||
}
|
||||
}
|
||||
for (String key : containedIds.keySet()) {
|
||||
if (containedIds.get(key) > 1) {
|
||||
E node = null;
|
||||
for (E n : this) {
|
||||
if (key.equals(n.id)) {
|
||||
node = n;
|
||||
break;
|
||||
}
|
||||
}
|
||||
events.add(new SaveEvent(SaveEvent.Type.alsoSave, node, true, "There are "+containedIds.get(node.id)+" elements with this ID in this category. Change the conflicting IDs before saving."));
|
||||
}
|
||||
}
|
||||
if (checkImpactedCategory && impactedCategory != null) {
|
||||
events.addAll(impactedCategory.attemptSave(false, impactedFileName));
|
||||
}
|
||||
return events;
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (E node : this) {
|
||||
node.notifyCreated();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + this.name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
return (o == this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getJsonClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getJsonClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getJsonOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return parent.getDataSet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public void save(File jsonFile) {
|
||||
if (getDataType() != GameSource.Type.created && getDataType() != GameSource.Type.altered) {
|
||||
Notification.addError("Error while trying to write json file " + jsonFile.getAbsolutePath() + " : Game Source type " + getDataType().toString() + " should not be saved.");
|
||||
return;
|
||||
}
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (E element : this) {
|
||||
if (element.jsonFile.equals(jsonFile)) {
|
||||
dataToSave.add(element.toJson());
|
||||
}
|
||||
}
|
||||
if (dataToSave.isEmpty() && jsonFile.exists()) {
|
||||
if (jsonFile.delete()) {
|
||||
Notification.addSuccess("File " + jsonFile.getAbsolutePath() + " deleted.");
|
||||
} else {
|
||||
Notification.addError("Error deleting file " + jsonFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
String toWrite = FileUtils.toJsonString(dataToSave);
|
||||
if(FileUtils.writeStringToFile(toWrite, jsonFile, "JSON file '"+jsonFile.getAbsolutePath()+"'")){
|
||||
for (E element : this) {
|
||||
element.state = GameDataElement.State.saved;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public List<SaveEvent> attemptSave(boolean checkImpactedCategory, String fileName) {
|
||||
List<SaveEvent> events = new ArrayList<SaveEvent>();
|
||||
GameDataCategory<? extends JSONElement> impactedCategory = null;
|
||||
String impactedFileName = fileName;
|
||||
Map<String, Integer> containedIds = new LinkedHashMap<String, Integer>();
|
||||
for (JSONElement node : this) {
|
||||
if (node.getDataType() == GameSource.Type.created && getProject().baseContent.gameData.getGameDataElement(node.getClass(), node.id) != null) {
|
||||
if (getProject().alteredContent.gameData.getGameDataElement(node.getClass(), node.id) != null) {
|
||||
events.add(new SaveEvent(SaveEvent.Type.moveToAltered, node, true, "Element ID matches one already present in the altered game content. Change this ID before saving."));
|
||||
} else {
|
||||
events.add(new SaveEvent(SaveEvent.Type.moveToAltered, node));
|
||||
impactedFileName = getProject().baseContent.gameData.getGameDataElement(node.getClass(), node.id).jsonFile.getName();
|
||||
impactedCategory = getProject().alteredContent.gameData.getCategory(node.getClass());
|
||||
}
|
||||
} else if (this.getDataType() == GameSource.Type.altered && getProject().baseContent.gameData.getGameDataElement(node.getClass(), node.id) == null) {
|
||||
if (getProject().createdContent.gameData.getGameDataElement(node.getClass(), node.id) != null) {
|
||||
events.add(new SaveEvent(SaveEvent.Type.moveToCreated, node, true, "Element ID matches one already present in the created game content. Change this ID before saving."));
|
||||
} else {
|
||||
events.add(new SaveEvent(SaveEvent.Type.moveToCreated, node));
|
||||
impactedCategory = getProject().createdContent.gameData.getCategory(node.getClass());
|
||||
impactedFileName = node.getProjectFilename();
|
||||
}
|
||||
} else if (node.needsSaving()) {
|
||||
events.add(new SaveEvent(SaveEvent.Type.alsoSave, node));
|
||||
}
|
||||
if (containedIds.containsKey(node.id)) {
|
||||
containedIds.put(node.id, containedIds.get(node.id) + 1);
|
||||
} else {
|
||||
containedIds.put(node.id, 1);
|
||||
}
|
||||
}
|
||||
for (String key : containedIds.keySet()) {
|
||||
if (containedIds.get(key) > 1) {
|
||||
E node = null;
|
||||
for (E n : this) {
|
||||
if (key.equals(n.id)) {
|
||||
node = n;
|
||||
break;
|
||||
}
|
||||
}
|
||||
events.add(new SaveEvent(SaveEvent.Type.alsoSave, node, true,
|
||||
"There are " + containedIds.get(node.id) + " elements with this ID in this category. Change the conflicting IDs before saving."));
|
||||
}
|
||||
}
|
||||
if (checkImpactedCategory && impactedCategory != null) {
|
||||
events.addAll(impactedCategory.attemptSave(false, impactedFileName));
|
||||
}
|
||||
return events;
|
||||
}
|
||||
|
||||
public boolean remove(E o) {
|
||||
int index = getProject().getNodeIndex(o);
|
||||
boolean result = super.remove(o);
|
||||
getProject().fireElementRemoved(o, index);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (E node : this) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean remove(E o) {
|
||||
int index = getProject().getNodeIndex(o);
|
||||
boolean result = super.remove(o);
|
||||
getProject().fireElementRemoved(o, index);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (E node : this) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,14 +1,5 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.File;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
@@ -18,456 +9,479 @@ import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.SavedSlotCollection;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class GameDataSet implements ProjectTreeNode, Serializable {
|
||||
|
||||
private static final long serialVersionUID = -8558067213826970968L;
|
||||
|
||||
public static final String DEFAULT_REL_PATH_IN_SOURCE = "res"+File.separator+"raw"+File.separator;
|
||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "json"+File.separator;
|
||||
|
||||
public static final String GAME_AC_ARRAY_NAME = "loadresource_actorconditions";
|
||||
public static final String GAME_DIALOGUES_ARRAY_NAME = "loadresource_conversationlists";
|
||||
public static final String GAME_DROPLISTS_ARRAY_NAME = "loadresource_droplists";
|
||||
public static final String GAME_ITEMS_ARRAY_NAME = "loadresource_items";
|
||||
public static final String GAME_ITEMCAT_ARRAY_NAME = "loadresource_itemcategories";
|
||||
public static final String GAME_NPC_ARRAY_NAME = "loadresource_monsters";
|
||||
public static final String GAME_QUESTS_ARRAY_NAME = "loadresource_quests";
|
||||
public static final String DEBUG_SUFFIX = "_debug";
|
||||
public static final String RESOURCE_PREFIX = "@raw/";
|
||||
public static final String FILENAME_SUFFIX = ".json";
|
||||
|
||||
public File baseFolder;
|
||||
|
||||
public GameDataCategory<ActorCondition> actorConditions;
|
||||
public GameDataCategory<Dialogue> dialogues;
|
||||
public GameDataCategory<Droplist> droplists;
|
||||
public GameDataCategory<Item> items;
|
||||
public GameDataCategory<ItemCategory> itemCategories;
|
||||
public GameDataCategory<NPC> npcs;
|
||||
public GameDataCategory<Quest> quests;
|
||||
|
||||
public GameSource parent;
|
||||
public SavedSlotCollection v;
|
||||
|
||||
public GameDataSet(GameSource source) {
|
||||
|
||||
this.parent = source;
|
||||
v = new SavedSlotCollection();
|
||||
private static final long serialVersionUID = -8558067213826970968L;
|
||||
|
||||
if (parent.type.equals(GameSource.Type.altered) || parent.type.equals(GameSource.Type.created)) {
|
||||
this.baseFolder = new File(parent.baseFolder, GameDataSet.DEFAULT_REL_PATH_IN_PROJECT);
|
||||
if (!baseFolder.exists()) this.baseFolder.mkdirs();
|
||||
} else if (parent.type.equals(GameSource.Type.source)) {
|
||||
this.baseFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||
}
|
||||
|
||||
actorConditions = new GameDataCategory<ActorCondition>(this, ActorCondition.getStaticDesc());
|
||||
dialogues = new GameDataCategory<Dialogue>(this, Dialogue.getStaticDesc());
|
||||
droplists = new GameDataCategory<Droplist>(this, Droplist.getStaticDesc());
|
||||
items = new GameDataCategory<Item>(this, Item.getStaticDesc());
|
||||
itemCategories = new GameDataCategory<ItemCategory>(this, ItemCategory.getStaticDesc());
|
||||
npcs = new GameDataCategory<NPC>(this, NPC.getStaticDesc());
|
||||
quests = new GameDataCategory<Quest>(this, Quest.getStaticDesc());
|
||||
|
||||
v.add(actorConditions);
|
||||
v.add(dialogues);
|
||||
v.add(droplists);
|
||||
v.add(items);
|
||||
v.add(itemCategories);
|
||||
v.add(npcs);
|
||||
v.add(quests);
|
||||
|
||||
//Start parsing to populate categories' content.
|
||||
if (parent.type == GameSource.Type.source && (parent.parent.sourceSetToUse == ResourceSet.debugData || parent.parent.sourceSetToUse == ResourceSet.gameData)) {
|
||||
String suffix = (parent.parent.sourceSetToUse == ResourceSet.debugData) ? DEBUG_SUFFIX : "";
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_AC_ARRAY_NAME+suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_AC_ARRAY_NAME+suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
ActorCondition.fromJson(f, actorConditions);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_DIALOGUES_ARRAY_NAME+suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_DIALOGUES_ARRAY_NAME+suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
Dialogue.fromJson(f, dialogues);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_DROPLISTS_ARRAY_NAME+suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_DROPLISTS_ARRAY_NAME+suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
Droplist.fromJson(f, droplists);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_ITEMS_ARRAY_NAME+suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_ITEMS_ARRAY_NAME+suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
Item.fromJson(f, items);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_ITEMCAT_ARRAY_NAME+suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_ITEMCAT_ARRAY_NAME+suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
ItemCategory.fromJson(f, itemCategories);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_NPC_ARRAY_NAME+suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_NPC_ARRAY_NAME+suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
NPC.fromJson(f, npcs);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_QUESTS_ARRAY_NAME+suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_QUESTS_ARRAY_NAME+suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
Quest.fromJson(f, quests);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else if (parent.type != GameSource.Type.referenced) {
|
||||
for (File f : baseFolder.listFiles()) {
|
||||
if (f.getName().startsWith("actorconditions_")) {
|
||||
ActorCondition.fromJson(f, actorConditions);
|
||||
} else if (f.getName().startsWith("conversationlist_")) {
|
||||
Dialogue.fromJson(f, dialogues);
|
||||
} else if (f.getName().startsWith("droplists_")) {
|
||||
Droplist.fromJson(f, droplists);
|
||||
} else if (f.getName().startsWith("itemlist_")) {
|
||||
Item.fromJson(f, items);
|
||||
} else if (f.getName().startsWith("itemcategories_")) {
|
||||
ItemCategory.fromJson(f, itemCategories);
|
||||
} else if (f.getName().startsWith("monsterlist_")) {
|
||||
NPC.fromJson(f, npcs);
|
||||
} else if (f.getName().startsWith("questlist")) {
|
||||
Quest.fromJson(f, quests);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return v.getNonEmptyElements();
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return v.getNonEmptyElementAt(arg0);
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return v.getNonEmptySize();
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||
node.notifyCreated();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+"JSON data";
|
||||
}
|
||||
|
||||
public static final String DEFAULT_REL_PATH_IN_SOURCE = "res" + File.separator + "raw" + File.separator;
|
||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "json" + File.separator;
|
||||
|
||||
public void refreshTransients() {
|
||||
|
||||
}
|
||||
|
||||
public ActorCondition getActorCondition(String id) {
|
||||
if (actorConditions == null) return null;
|
||||
for (ActorCondition gde : actorConditions) {
|
||||
if (id.equals(gde.id)){
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Dialogue getDialogue(String id) {
|
||||
if (dialogues == null) return null;
|
||||
for (Dialogue gde : dialogues) {
|
||||
if (id.equals(gde.id)){
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Droplist getDroplist(String id) {
|
||||
if (droplists == null) return null;
|
||||
for (Droplist gde : droplists) {
|
||||
if (id.equals(gde.id)){
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Item getItem(String id) {
|
||||
if (items == null) return null;
|
||||
for (Item gde : items) {
|
||||
if (id.equals(gde.id)){
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public ItemCategory getItemCategory(String id) {
|
||||
if (itemCategories == null) return null;
|
||||
for (ItemCategory gde : itemCategories) {
|
||||
if (id.equals(gde.id)){
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public NPC getNPC(String id) {
|
||||
if (npcs == null) return null;
|
||||
for (NPC gde : npcs) {
|
||||
if (id.equals(gde.id)){
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public NPC getNPCIgnoreCase(String id) {
|
||||
if (npcs == null) return null;
|
||||
for (NPC gde : npcs) {
|
||||
if (id.equalsIgnoreCase(gde.id)){
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Quest getQuest(String id) {
|
||||
if (quests == null) return null;
|
||||
for (Quest gde : quests) {
|
||||
if (id.equals(gde.id)){
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
public static final String GAME_AC_ARRAY_NAME = "loadresource_actorconditions";
|
||||
public static final String GAME_DIALOGUES_ARRAY_NAME = "loadresource_conversationlists";
|
||||
public static final String GAME_DROPLISTS_ARRAY_NAME = "loadresource_droplists";
|
||||
public static final String GAME_ITEMS_ARRAY_NAME = "loadresource_items";
|
||||
public static final String GAME_ITEMCAT_ARRAY_NAME = "loadresource_itemcategories";
|
||||
public static final String GAME_NPC_ARRAY_NAME = "loadresource_monsters";
|
||||
public static final String GAME_QUESTS_ARRAY_NAME = "loadresource_quests";
|
||||
public static final String DEBUG_SUFFIX = "_debug";
|
||||
public static final String RESOURCE_PREFIX = "@raw/";
|
||||
public static final String FILENAME_SUFFIX = ".json";
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getJsonClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getJsonClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getJsonOpenIcon();
|
||||
}
|
||||
public File baseFolder;
|
||||
|
||||
public void addElement(JSONElement node) {
|
||||
ProjectTreeNode higherEmptyParent = this;
|
||||
while (higherEmptyParent != null) {
|
||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode)higherEmptyParent.getParent()).isEmpty()) higherEmptyParent = (ProjectTreeNode)higherEmptyParent.getParent();
|
||||
else break;
|
||||
}
|
||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||
if (node instanceof ActorCondition) {
|
||||
if (actorConditions.isEmpty() && higherEmptyParent == null) higherEmptyParent = actorConditions;
|
||||
actorConditions.add((ActorCondition) node);
|
||||
node.parent = actorConditions;
|
||||
} else if (node instanceof Dialogue) {
|
||||
if (dialogues.isEmpty() && higherEmptyParent == null) higherEmptyParent = dialogues;
|
||||
dialogues.add((Dialogue) node);
|
||||
node.parent = dialogues;
|
||||
} else if (node instanceof Droplist) {
|
||||
if (droplists.isEmpty() && higherEmptyParent == null) higherEmptyParent = droplists;
|
||||
droplists.add((Droplist) node);
|
||||
node.parent = droplists;
|
||||
} else if (node instanceof Item) {
|
||||
if (items.isEmpty() && higherEmptyParent == null) higherEmptyParent = items;
|
||||
items.add((Item) node);
|
||||
node.parent = items;
|
||||
} else if (node instanceof ItemCategory) {
|
||||
if (itemCategories.isEmpty() && higherEmptyParent == null) higherEmptyParent = itemCategories;
|
||||
itemCategories.add((ItemCategory) node);
|
||||
node.parent = itemCategories;
|
||||
} else if (node instanceof NPC) {
|
||||
if (npcs.isEmpty() && higherEmptyParent == null) higherEmptyParent = npcs;
|
||||
npcs.add((NPC) node);
|
||||
node.parent = npcs;
|
||||
} else if (node instanceof Quest) {
|
||||
if (quests.isEmpty() && higherEmptyParent == null) higherEmptyParent = quests;
|
||||
quests.add((Quest) node);
|
||||
node.parent = quests;
|
||||
} else {
|
||||
Notification.addError("Cannot add "+node.getDesc()+". Unknown data type.");
|
||||
return;
|
||||
}
|
||||
if (node.jsonFile != null && parent.type == GameSource.Type.altered) {
|
||||
//Altered node.
|
||||
node.jsonFile = new File(this.baseFolder, node.jsonFile.getName());
|
||||
} else {
|
||||
//Created node.
|
||||
node.jsonFile = new File(this.baseFolder, node.getProjectFilename());
|
||||
}
|
||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||
else node.notifyCreated();
|
||||
}
|
||||
|
||||
public GameDataCategory<ActorCondition> actorConditions;
|
||||
public GameDataCategory<Dialogue> dialogues;
|
||||
public GameDataCategory<Droplist> droplists;
|
||||
public GameDataCategory<Item> items;
|
||||
public GameDataCategory<ItemCategory> itemCategories;
|
||||
public GameDataCategory<NPC> npcs;
|
||||
public GameDataCategory<Quest> quests;
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return v.isEmpty();
|
||||
}
|
||||
public GameSource parent;
|
||||
public SavedSlotCollection v;
|
||||
|
||||
public JSONElement getGameDataElement(Class<? extends JSONElement> gdeClass, String id) {
|
||||
if (gdeClass == ActorCondition.class) {
|
||||
return getActorCondition(id);
|
||||
}
|
||||
if (gdeClass == Dialogue.class) {
|
||||
return getDialogue(id);
|
||||
}
|
||||
if (gdeClass == Droplist.class) {
|
||||
return getDroplist(id);
|
||||
}
|
||||
if (gdeClass == ItemCategory.class) {
|
||||
return getItemCategory(id);
|
||||
}
|
||||
if (gdeClass == Item.class) {
|
||||
return getItem(id);
|
||||
}
|
||||
if (gdeClass == NPC.class) {
|
||||
return getNPC(id);
|
||||
}
|
||||
if (gdeClass == Quest.class) {
|
||||
return getQuest(id);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public GameDataSet(GameSource source) {
|
||||
|
||||
public GameDataCategory<? extends JSONElement> getCategory(Class<? extends JSONElement> gdeClass) {
|
||||
if (gdeClass == ActorCondition.class) {
|
||||
return actorConditions;
|
||||
}
|
||||
if (gdeClass == Dialogue.class) {
|
||||
return dialogues;
|
||||
}
|
||||
if (gdeClass == Droplist.class) {
|
||||
return droplists;
|
||||
}
|
||||
if (gdeClass == ItemCategory.class) {
|
||||
return itemCategories;
|
||||
}
|
||||
if (gdeClass == Item.class) {
|
||||
return items;
|
||||
}
|
||||
if (gdeClass == NPC.class) {
|
||||
return npcs;
|
||||
}
|
||||
if (gdeClass == Quest.class) {
|
||||
return quests;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
this.parent = source;
|
||||
v = new SavedSlotCollection();
|
||||
|
||||
if (parent.type.equals(GameSource.Type.altered) || parent.type.equals(GameSource.Type.created)) {
|
||||
this.baseFolder = new File(parent.baseFolder, GameDataSet.DEFAULT_REL_PATH_IN_PROJECT);
|
||||
if (!baseFolder.exists()) this.baseFolder.mkdirs();
|
||||
} else if (parent.type.equals(GameSource.Type.source)) {
|
||||
this.baseFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||
}
|
||||
|
||||
actorConditions = new GameDataCategory<ActorCondition>(this, ActorCondition.getStaticDesc());
|
||||
dialogues = new GameDataCategory<Dialogue>(this, Dialogue.getStaticDesc());
|
||||
droplists = new GameDataCategory<Droplist>(this, Droplist.getStaticDesc());
|
||||
items = new GameDataCategory<Item>(this, Item.getStaticDesc());
|
||||
itemCategories = new GameDataCategory<ItemCategory>(this, ItemCategory.getStaticDesc());
|
||||
npcs = new GameDataCategory<NPC>(this, NPC.getStaticDesc());
|
||||
quests = new GameDataCategory<Quest>(this, Quest.getStaticDesc());
|
||||
|
||||
v.add(actorConditions);
|
||||
v.add(dialogues);
|
||||
v.add(droplists);
|
||||
v.add(items);
|
||||
v.add(itemCategories);
|
||||
v.add(npcs);
|
||||
v.add(quests);
|
||||
|
||||
//Start parsing to populate categories' content.
|
||||
if (parent.type == GameSource.Type.source && (parent.parent.sourceSetToUse == ResourceSet.debugData || parent.parent.sourceSetToUse == ResourceSet.gameData)) {
|
||||
String suffix = (parent.parent.sourceSetToUse == ResourceSet.debugData) ? DEBUG_SUFFIX : "";
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_AC_ARRAY_NAME + suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_AC_ARRAY_NAME + suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
ActorCondition.fromJson(f, actorConditions);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource " + resource + " in the game source for project " + getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_DIALOGUES_ARRAY_NAME + suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_DIALOGUES_ARRAY_NAME + suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
Dialogue.fromJson(f, dialogues);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource " + resource + " in the game source for project " + getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_DROPLISTS_ARRAY_NAME + suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_DROPLISTS_ARRAY_NAME + suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
Droplist.fromJson(f, droplists);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource " + resource + " in the game source for project " + getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_ITEMS_ARRAY_NAME + suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_ITEMS_ARRAY_NAME + suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
Item.fromJson(f, items);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource " + resource + " in the game source for project " + getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_ITEMCAT_ARRAY_NAME + suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_ITEMCAT_ARRAY_NAME + suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
ItemCategory.fromJson(f, itemCategories);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource " + resource + " in the game source for project " + getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_NPC_ARRAY_NAME + suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_NPC_ARRAY_NAME + suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
NPC.fromJson(f, npcs);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource " + resource + " in the game source for project " + getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (parent.referencedSourceFiles.get(GAME_QUESTS_ARRAY_NAME + suffix) != null) {
|
||||
for (String resource : parent.referencedSourceFiles.get(GAME_QUESTS_ARRAY_NAME + suffix)) {
|
||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
Quest.fromJson(f, quests);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource " + resource + " in the game source for project " + getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else if (parent.type != GameSource.Type.referenced) {
|
||||
for (File f : baseFolder.listFiles()) {
|
||||
if (f.getName().startsWith("actorconditions_")) {
|
||||
ActorCondition.fromJson(f, actorConditions);
|
||||
} else if (f.getName().startsWith("conversationlist_")) {
|
||||
Dialogue.fromJson(f, dialogues);
|
||||
} else if (f.getName().startsWith("droplists_")) {
|
||||
Droplist.fromJson(f, droplists);
|
||||
} else if (f.getName().startsWith("itemlist_")) {
|
||||
Item.fromJson(f, items);
|
||||
} else if (f.getName().startsWith("itemcategories_")) {
|
||||
ItemCategory.fromJson(f, itemCategories);
|
||||
} else if (f.getName().startsWith("monsterlist_")) {
|
||||
NPC.fromJson(f, npcs);
|
||||
} else if (f.getName().startsWith("questlist")) {
|
||||
Quest.fromJson(f, quests);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return v.getNonEmptyElements();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return v.getNonEmptyElementAt(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return v.getNonEmptySize();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||
node.notifyCreated();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + "JSON data";
|
||||
}
|
||||
|
||||
|
||||
public void refreshTransients() {
|
||||
|
||||
}
|
||||
|
||||
public ActorCondition getActorCondition(String id) {
|
||||
if (actorConditions == null) return null;
|
||||
for (ActorCondition gde : actorConditions) {
|
||||
if (id.equals(gde.id)) {
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Dialogue getDialogue(String id) {
|
||||
if (dialogues == null) return null;
|
||||
for (Dialogue gde : dialogues) {
|
||||
if (id.equals(gde.id)) {
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Droplist getDroplist(String id) {
|
||||
if (droplists == null) return null;
|
||||
for (Droplist gde : droplists) {
|
||||
if (id.equals(gde.id)) {
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Item getItem(String id) {
|
||||
if (items == null) return null;
|
||||
for (Item gde : items) {
|
||||
if (id.equals(gde.id)) {
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public ItemCategory getItemCategory(String id) {
|
||||
if (itemCategories == null) return null;
|
||||
for (ItemCategory gde : itemCategories) {
|
||||
if (id.equals(gde.id)) {
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public NPC getNPC(String id) {
|
||||
if (npcs == null) return null;
|
||||
for (NPC gde : npcs) {
|
||||
if (id.equals(gde.id)) {
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public NPC getNPCIgnoreCase(String id) {
|
||||
if (npcs == null) return null;
|
||||
for (NPC gde : npcs) {
|
||||
if (id.equalsIgnoreCase(gde.id)) {
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Quest getQuest(String id) {
|
||||
if (quests == null) return null;
|
||||
for (Quest gde : quests) {
|
||||
if (id.equals(gde.id)) {
|
||||
return gde;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getJsonClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getJsonClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getJsonOpenIcon();
|
||||
}
|
||||
|
||||
public void addElement(JSONElement node) {
|
||||
ProjectTreeNode higherEmptyParent = this;
|
||||
while (higherEmptyParent != null) {
|
||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode) higherEmptyParent.getParent()).isEmpty())
|
||||
higherEmptyParent = (ProjectTreeNode) higherEmptyParent.getParent();
|
||||
else break;
|
||||
}
|
||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||
if (node instanceof ActorCondition) {
|
||||
if (actorConditions.isEmpty() && higherEmptyParent == null) higherEmptyParent = actorConditions;
|
||||
actorConditions.add((ActorCondition) node);
|
||||
node.parent = actorConditions;
|
||||
} else if (node instanceof Dialogue) {
|
||||
if (dialogues.isEmpty() && higherEmptyParent == null) higherEmptyParent = dialogues;
|
||||
dialogues.add((Dialogue) node);
|
||||
node.parent = dialogues;
|
||||
} else if (node instanceof Droplist) {
|
||||
if (droplists.isEmpty() && higherEmptyParent == null) higherEmptyParent = droplists;
|
||||
droplists.add((Droplist) node);
|
||||
node.parent = droplists;
|
||||
} else if (node instanceof Item) {
|
||||
if (items.isEmpty() && higherEmptyParent == null) higherEmptyParent = items;
|
||||
items.add((Item) node);
|
||||
node.parent = items;
|
||||
} else if (node instanceof ItemCategory) {
|
||||
if (itemCategories.isEmpty() && higherEmptyParent == null) higherEmptyParent = itemCategories;
|
||||
itemCategories.add((ItemCategory) node);
|
||||
node.parent = itemCategories;
|
||||
} else if (node instanceof NPC) {
|
||||
if (npcs.isEmpty() && higherEmptyParent == null) higherEmptyParent = npcs;
|
||||
npcs.add((NPC) node);
|
||||
node.parent = npcs;
|
||||
} else if (node instanceof Quest) {
|
||||
if (quests.isEmpty() && higherEmptyParent == null) higherEmptyParent = quests;
|
||||
quests.add((Quest) node);
|
||||
node.parent = quests;
|
||||
} else {
|
||||
Notification.addError("Cannot add " + node.getDesc() + ". Unknown data type.");
|
||||
return;
|
||||
}
|
||||
if (node.jsonFile != null && parent.type == GameSource.Type.altered) {
|
||||
//Altered node.
|
||||
node.jsonFile = new File(this.baseFolder, node.jsonFile.getName());
|
||||
} else {
|
||||
//Created node.
|
||||
node.jsonFile = new File(this.baseFolder, node.getProjectFilename());
|
||||
}
|
||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||
else node.notifyCreated();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return v.isEmpty();
|
||||
}
|
||||
|
||||
public JSONElement getGameDataElement(Class<? extends JSONElement> gdeClass, String id) {
|
||||
if (gdeClass == ActorCondition.class) {
|
||||
return getActorCondition(id);
|
||||
}
|
||||
if (gdeClass == Dialogue.class) {
|
||||
return getDialogue(id);
|
||||
}
|
||||
if (gdeClass == Droplist.class) {
|
||||
return getDroplist(id);
|
||||
}
|
||||
if (gdeClass == ItemCategory.class) {
|
||||
return getItemCategory(id);
|
||||
}
|
||||
if (gdeClass == Item.class) {
|
||||
return getItem(id);
|
||||
}
|
||||
if (gdeClass == NPC.class) {
|
||||
return getNPC(id);
|
||||
}
|
||||
if (gdeClass == Quest.class) {
|
||||
return getQuest(id);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public GameDataCategory<? extends JSONElement> getCategory(Class<? extends JSONElement> gdeClass) {
|
||||
if (gdeClass == ActorCondition.class) {
|
||||
return actorConditions;
|
||||
}
|
||||
if (gdeClass == Dialogue.class) {
|
||||
return dialogues;
|
||||
}
|
||||
if (gdeClass == Droplist.class) {
|
||||
return droplists;
|
||||
}
|
||||
if (gdeClass == ItemCategory.class) {
|
||||
return itemCategories;
|
||||
}
|
||||
if (gdeClass == Item.class) {
|
||||
return items;
|
||||
}
|
||||
if (gdeClass == NPC.class) {
|
||||
return npcs;
|
||||
}
|
||||
if (gdeClass == Quest.class) {
|
||||
return quests;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,13 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||
|
||||
import java.awt.Image;
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
@@ -9,321 +16,307 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
|
||||
public class ItemCategory extends JSONElement {
|
||||
|
||||
private static final long serialVersionUID = -348864002519568300L;
|
||||
|
||||
public static final String ICON_NO_SLOT_RES = "/com/gpl/rpg/atcontentstudio/img/equip_square.png";
|
||||
public static final String ICON_BODY_RES = "/com/gpl/rpg/atcontentstudio/img/equip_body.png";
|
||||
public static final String ICON_FEET_RES = "/com/gpl/rpg/atcontentstudio/img/equip_feet.png";
|
||||
public static final String ICON_HAND_RES = "/com/gpl/rpg/atcontentstudio/img/equip_hand.png";
|
||||
public static final String ICON_HEAD_RES = "/com/gpl/rpg/atcontentstudio/img/equip_head.png";
|
||||
public static final String ICON_NECK_RES = "/com/gpl/rpg/atcontentstudio/img/equip_neck.png";
|
||||
public static final String ICON_RING_RES = "/com/gpl/rpg/atcontentstudio/img/equip_ring.png";
|
||||
public static final String ICON_SHIELD_RES = "/com/gpl/rpg/atcontentstudio/img/equip_shield.png";
|
||||
public static final String ICON_WEAPON_RES = "/com/gpl/rpg/atcontentstudio/img/equip_weapon.png";
|
||||
private static final long serialVersionUID = -348864002519568300L;
|
||||
|
||||
public static Image no_slot_image = null;
|
||||
public static Image no_slot_icon = null;
|
||||
public static final String ICON_NO_SLOT_RES = "/com/gpl/rpg/atcontentstudio/img/equip_square.png";
|
||||
public static final String ICON_BODY_RES = "/com/gpl/rpg/atcontentstudio/img/equip_body.png";
|
||||
public static final String ICON_FEET_RES = "/com/gpl/rpg/atcontentstudio/img/equip_feet.png";
|
||||
public static final String ICON_HAND_RES = "/com/gpl/rpg/atcontentstudio/img/equip_hand.png";
|
||||
public static final String ICON_HEAD_RES = "/com/gpl/rpg/atcontentstudio/img/equip_head.png";
|
||||
public static final String ICON_NECK_RES = "/com/gpl/rpg/atcontentstudio/img/equip_neck.png";
|
||||
public static final String ICON_RING_RES = "/com/gpl/rpg/atcontentstudio/img/equip_ring.png";
|
||||
public static final String ICON_SHIELD_RES = "/com/gpl/rpg/atcontentstudio/img/equip_shield.png";
|
||||
public static final String ICON_WEAPON_RES = "/com/gpl/rpg/atcontentstudio/img/equip_weapon.png";
|
||||
|
||||
public static Image body_image = null;
|
||||
public static Image body_icon = null;
|
||||
public static Image no_slot_image = null;
|
||||
public static Image no_slot_icon = null;
|
||||
|
||||
public static Image feet_image = null;
|
||||
public static Image feet_icon = null;
|
||||
public static Image body_image = null;
|
||||
public static Image body_icon = null;
|
||||
|
||||
public static Image hand_image = null;
|
||||
public static Image hand_icon = null;
|
||||
public static Image feet_image = null;
|
||||
public static Image feet_icon = null;
|
||||
|
||||
public static Image head_image = null;
|
||||
public static Image head_icon = null;
|
||||
public static Image hand_image = null;
|
||||
public static Image hand_icon = null;
|
||||
|
||||
public static Image neck_image = null;
|
||||
public static Image neck_icon = null;
|
||||
public static Image head_image = null;
|
||||
public static Image head_icon = null;
|
||||
|
||||
public static Image ring_image = null;
|
||||
public static Image ring_icon = null;
|
||||
public static Image neck_image = null;
|
||||
public static Image neck_icon = null;
|
||||
|
||||
public static Image shield_image = null;
|
||||
public static Image shield_icon = null;
|
||||
public static Image ring_image = null;
|
||||
public static Image ring_icon = null;
|
||||
|
||||
public static Image weapon_image = null;
|
||||
public static Image weapon_icon = null;
|
||||
|
||||
|
||||
//Available from init state
|
||||
//public String id = null; inherited.
|
||||
public String name = null;
|
||||
public InventorySlot slot = null;
|
||||
|
||||
//Available from parsed state
|
||||
public ActionType action_type = null;
|
||||
public Size size = null;
|
||||
|
||||
//Available from linked state
|
||||
//None
|
||||
|
||||
public static enum ActionType {
|
||||
none,
|
||||
use,
|
||||
equip
|
||||
}
|
||||
|
||||
public static enum Size {
|
||||
none,
|
||||
light,
|
||||
std,
|
||||
large
|
||||
}
|
||||
|
||||
public static enum InventorySlot {
|
||||
weapon,
|
||||
shield,
|
||||
head,
|
||||
body,
|
||||
hand,
|
||||
feet,
|
||||
neck,
|
||||
leftring,
|
||||
rightring
|
||||
}
|
||||
public static Image shield_image = null;
|
||||
public static Image shield_icon = null;
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+name+" ("+id+")";
|
||||
}
|
||||
public static Image weapon_image = null;
|
||||
public static Image weapon_icon = null;
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "Item categories";
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void fromJson(File jsonFile, GameDataCategory<ItemCategory> category) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List itemCategories = (List) parser.parse(reader);
|
||||
for (Object obj : itemCategories) {
|
||||
Map itemCatJson = (Map)obj;
|
||||
ItemCategory itemCat = fromJson(itemCatJson);
|
||||
itemCat.jsonFile = jsonFile;
|
||||
itemCat.parent = category;
|
||||
if (itemCat.getDataType() == GameSource.Type.created || itemCat.getDataType() == GameSource.Type.altered) {
|
||||
itemCat.writable = true;
|
||||
}
|
||||
category.add(itemCat);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static ItemCategory fromJson(String jsonString) throws ParseException {
|
||||
Map itemCatJson = (Map) new JSONParser().parse(jsonString);
|
||||
ItemCategory item = fromJson(itemCatJson);
|
||||
item.parse(itemCatJson);
|
||||
return item;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static ItemCategory fromJson(Map itemCatJson) {
|
||||
ItemCategory itemCat = new ItemCategory();
|
||||
itemCat.id = (String) itemCatJson.get("id");
|
||||
itemCat.name = (String) itemCatJson.get("name");
|
||||
if (itemCatJson.get("inventorySlot") != null) itemCat.slot = InventorySlot.valueOf((String) itemCatJson.get("inventorySlot"));
|
||||
return itemCat;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map itemCatJson) {
|
||||
if (itemCatJson.get("actionType") != null) action_type = ActionType.valueOf((String) itemCatJson.get("actionType"));
|
||||
if (itemCatJson.get("size") != null) size = Size.valueOf((String) itemCatJson.get("size"));
|
||||
this.state = State.parsed;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
||||
//This type of state is unrelated to parsing/linking.
|
||||
return;
|
||||
}
|
||||
if (this.state == State.init) {
|
||||
//Not parsed yet.
|
||||
this.parse();
|
||||
} else if (this.state == State.linked) {
|
||||
//Already linked.
|
||||
return;
|
||||
}
|
||||
|
||||
//Nothing to link to :D
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getIcon(this.slot);
|
||||
}
|
||||
|
||||
public Image getImage() {
|
||||
return getImage(this.slot);
|
||||
}
|
||||
|
||||
public static Image getImage(InventorySlot slot) {
|
||||
if (slot == null) {
|
||||
return getImage(ICON_NO_SLOT_RES, no_slot_image, "no_slot_image");
|
||||
}
|
||||
switch (slot) {
|
||||
case body:
|
||||
return getImage(ICON_BODY_RES, body_image, "body_image");
|
||||
case feet:
|
||||
return getImage(ICON_FEET_RES, feet_image, "feet_image");
|
||||
case hand:
|
||||
return getImage(ICON_HAND_RES, hand_image, "hand_image");
|
||||
case head:
|
||||
return getImage(ICON_HEAD_RES, head_image, "head_image");
|
||||
case leftring:
|
||||
case rightring:
|
||||
return getImage(ICON_RING_RES, ring_image, "ring_image");
|
||||
case neck:
|
||||
return getImage(ICON_NECK_RES, neck_image, "neck_image");
|
||||
case shield:
|
||||
return getImage(ICON_SHIELD_RES, shield_image, "shield_image");
|
||||
case weapon:
|
||||
return getImage(ICON_WEAPON_RES, weapon_image, "weapon_image");
|
||||
default:
|
||||
return getImage(ICON_NO_SLOT_RES, no_slot_image, "no_slot_image");
|
||||
}
|
||||
}
|
||||
|
||||
public static Image getIcon(InventorySlot slot) {
|
||||
if (slot == null) {
|
||||
return getIcon(ICON_NO_SLOT_RES, no_slot_image, no_slot_icon, "no_slot_image", "no_slot_icon");
|
||||
}
|
||||
switch (slot) {
|
||||
case body:
|
||||
return getIcon(ICON_BODY_RES, body_image, body_icon, "body_image", "body_icon");
|
||||
case feet:
|
||||
return getIcon(ICON_FEET_RES, feet_image, feet_icon, "feet_image", "feet_icon");
|
||||
case hand:
|
||||
return getIcon(ICON_HAND_RES, hand_image, hand_icon, "hand_image", "hand_icon");
|
||||
case head:
|
||||
return getIcon(ICON_HEAD_RES, head_image, head_icon, "head_image", "head_icon");
|
||||
case leftring:
|
||||
case rightring:
|
||||
return getIcon(ICON_RING_RES, ring_image, ring_icon, "ring_image", "ring_icon");
|
||||
case neck:
|
||||
return getIcon(ICON_NECK_RES, neck_image, neck_icon, "neck_image", "neck_icon");
|
||||
case shield:
|
||||
return getIcon(ICON_SHIELD_RES, shield_image, shield_icon, "shield_image", "shield_icon");
|
||||
case weapon:
|
||||
return getIcon(ICON_WEAPON_RES, weapon_image, weapon_icon, "weapon_image", "weapon_icon");
|
||||
default:
|
||||
return getIcon(ICON_NO_SLOT_RES, no_slot_image, no_slot_icon, "no_slot_image", "no_slot_icon");
|
||||
}
|
||||
}
|
||||
|
||||
public static Image getImage(String res, Image img, String fieldName) {
|
||||
if (img == null) {
|
||||
try {
|
||||
img = ImageIO.read(ItemCategory.class.getResourceAsStream(res));
|
||||
ItemCategory.class.getField(fieldName).set(null, img);
|
||||
} catch (IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SecurityException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Failed to load item category icon "+res);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return img;
|
||||
}
|
||||
|
||||
public static Image getIcon(String res, Image img, Image icon, String imgFieldName, String iconFieldName) {
|
||||
if (icon == null) {
|
||||
icon = getImage(res, img, imgFieldName).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
|
||||
try {
|
||||
ItemCategory.class.getField(iconFieldName).set(null, icon);
|
||||
} catch (IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SecurityException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return icon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
ItemCategory clone = new ItemCategory();
|
||||
clone.jsonFile = this.jsonFile;
|
||||
clone.state = this.state;
|
||||
clone.id = this.id;
|
||||
clone.name = this.name;
|
||||
clone.size = this.size;
|
||||
clone.slot = this.slot;
|
||||
clone.action_type = this.action_type;
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
// Nothing to link to.
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map itemCatJson = new LinkedHashMap();
|
||||
itemCatJson.put("id", this.id);
|
||||
if (this.name != null) itemCatJson.put("name", this.name);
|
||||
if (this.action_type != null) itemCatJson.put("actionType", this.action_type.toString());
|
||||
if (this.size != null) itemCatJson.put("size", this.size.toString());
|
||||
if (this.slot != null) itemCatJson.put("inventorySlot", this.slot.toString());
|
||||
return itemCatJson;
|
||||
}
|
||||
|
||||
//Available from init state
|
||||
//public String id = null; inherited.
|
||||
public String name = null;
|
||||
public InventorySlot slot = null;
|
||||
|
||||
//Available from parsed state
|
||||
public ActionType action_type = null;
|
||||
public Size size = null;
|
||||
|
||||
//Available from linked state
|
||||
//None
|
||||
|
||||
public static enum ActionType {
|
||||
none,
|
||||
use,
|
||||
equip
|
||||
}
|
||||
|
||||
public static enum Size {
|
||||
none,
|
||||
light,
|
||||
std,
|
||||
large
|
||||
}
|
||||
|
||||
public static enum InventorySlot {
|
||||
weapon,
|
||||
shield,
|
||||
head,
|
||||
body,
|
||||
hand,
|
||||
feet,
|
||||
neck,
|
||||
leftring,
|
||||
rightring
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + name + " (" + id + ")";
|
||||
}
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "Item categories";
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void fromJson(File jsonFile, GameDataCategory<ItemCategory> category) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List itemCategories = (List) parser.parse(reader);
|
||||
for (Object obj : itemCategories) {
|
||||
Map itemCatJson = (Map) obj;
|
||||
ItemCategory itemCat = fromJson(itemCatJson);
|
||||
itemCat.jsonFile = jsonFile;
|
||||
itemCat.parent = category;
|
||||
if (itemCat.getDataType() == GameSource.Type.created || itemCat.getDataType() == GameSource.Type.altered) {
|
||||
itemCat.writable = true;
|
||||
}
|
||||
category.add(itemCat);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static ItemCategory fromJson(String jsonString) throws ParseException {
|
||||
Map itemCatJson = (Map) new JSONParser().parse(jsonString);
|
||||
ItemCategory item = fromJson(itemCatJson);
|
||||
item.parse(itemCatJson);
|
||||
return item;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static ItemCategory fromJson(Map itemCatJson) {
|
||||
ItemCategory itemCat = new ItemCategory();
|
||||
itemCat.id = (String) itemCatJson.get("id");
|
||||
itemCat.name = (String) itemCatJson.get("name");
|
||||
if (itemCatJson.get("inventorySlot") != null)
|
||||
itemCat.slot = InventorySlot.valueOf((String) itemCatJson.get("inventorySlot"));
|
||||
return itemCat;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map itemCatJson) {
|
||||
if (itemCatJson.get("actionType") != null)
|
||||
action_type = ActionType.valueOf((String) itemCatJson.get("actionType"));
|
||||
if (itemCatJson.get("size") != null) size = Size.valueOf((String) itemCatJson.get("size"));
|
||||
this.state = State.parsed;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (shouldSkipParseOrLink()) {
|
||||
return;
|
||||
}
|
||||
ensureParseIfNeeded();
|
||||
|
||||
//Nothing to link to :D
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getIcon(this.slot);
|
||||
}
|
||||
|
||||
public Image getImage() {
|
||||
return getImage(this.slot);
|
||||
}
|
||||
|
||||
public static Image getImage(InventorySlot slot) {
|
||||
if (slot == null) {
|
||||
return getImage(ICON_NO_SLOT_RES, no_slot_image, "no_slot_image");
|
||||
}
|
||||
switch (slot) {
|
||||
case body:
|
||||
return getImage(ICON_BODY_RES, body_image, "body_image");
|
||||
case feet:
|
||||
return getImage(ICON_FEET_RES, feet_image, "feet_image");
|
||||
case hand:
|
||||
return getImage(ICON_HAND_RES, hand_image, "hand_image");
|
||||
case head:
|
||||
return getImage(ICON_HEAD_RES, head_image, "head_image");
|
||||
case leftring:
|
||||
case rightring:
|
||||
return getImage(ICON_RING_RES, ring_image, "ring_image");
|
||||
case neck:
|
||||
return getImage(ICON_NECK_RES, neck_image, "neck_image");
|
||||
case shield:
|
||||
return getImage(ICON_SHIELD_RES, shield_image, "shield_image");
|
||||
case weapon:
|
||||
return getImage(ICON_WEAPON_RES, weapon_image, "weapon_image");
|
||||
default:
|
||||
return getImage(ICON_NO_SLOT_RES, no_slot_image, "no_slot_image");
|
||||
}
|
||||
}
|
||||
|
||||
public static Image getIcon(InventorySlot slot) {
|
||||
if (slot == null) {
|
||||
return getIcon(ICON_NO_SLOT_RES, no_slot_image, no_slot_icon, "no_slot_image", "no_slot_icon");
|
||||
}
|
||||
switch (slot) {
|
||||
case body:
|
||||
return getIcon(ICON_BODY_RES, body_image, body_icon, "body_image", "body_icon");
|
||||
case feet:
|
||||
return getIcon(ICON_FEET_RES, feet_image, feet_icon, "feet_image", "feet_icon");
|
||||
case hand:
|
||||
return getIcon(ICON_HAND_RES, hand_image, hand_icon, "hand_image", "hand_icon");
|
||||
case head:
|
||||
return getIcon(ICON_HEAD_RES, head_image, head_icon, "head_image", "head_icon");
|
||||
case leftring:
|
||||
case rightring:
|
||||
return getIcon(ICON_RING_RES, ring_image, ring_icon, "ring_image", "ring_icon");
|
||||
case neck:
|
||||
return getIcon(ICON_NECK_RES, neck_image, neck_icon, "neck_image", "neck_icon");
|
||||
case shield:
|
||||
return getIcon(ICON_SHIELD_RES, shield_image, shield_icon, "shield_image", "shield_icon");
|
||||
case weapon:
|
||||
return getIcon(ICON_WEAPON_RES, weapon_image, weapon_icon, "weapon_image", "weapon_icon");
|
||||
default:
|
||||
return getIcon(ICON_NO_SLOT_RES, no_slot_image, no_slot_icon, "no_slot_image", "no_slot_icon");
|
||||
}
|
||||
}
|
||||
|
||||
public static Image getImage(String res, Image img, String fieldName) {
|
||||
if (img == null) {
|
||||
try {
|
||||
img = ImageIO.read(ItemCategory.class.getResourceAsStream(res));
|
||||
ItemCategory.class.getField(fieldName).set(null, img);
|
||||
} catch (IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SecurityException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Failed to load item category icon " + res);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return img;
|
||||
}
|
||||
|
||||
public static Image getIcon(String res, Image img, Image icon, String imgFieldName, String iconFieldName) {
|
||||
if (icon == null) {
|
||||
icon = getImage(res, img, imgFieldName).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
|
||||
try {
|
||||
ItemCategory.class.getField(iconFieldName).set(null, icon);
|
||||
} catch (IllegalArgumentException e) {
|
||||
e.printStackTrace();
|
||||
} catch (SecurityException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return icon;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
ItemCategory clone = new ItemCategory();
|
||||
clone.jsonFile = this.jsonFile;
|
||||
clone.state = this.state;
|
||||
clone.id = this.id;
|
||||
clone.name = this.name;
|
||||
clone.size = this.size;
|
||||
clone.slot = this.slot;
|
||||
clone.action_type = this.action_type;
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
// Nothing to link to.
|
||||
}
|
||||
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map itemCatJson = new LinkedHashMap();
|
||||
itemCatJson.put("id", this.id);
|
||||
if (this.name != null) itemCatJson.put("name", this.name);
|
||||
if (this.action_type != null) itemCatJson.put("actionType", this.action_type.toString());
|
||||
if (this.size != null) itemCatJson.put("size", this.size.toString());
|
||||
if (this.slot != null) itemCatJson.put("inventorySlot", this.slot.toString());
|
||||
return itemCatJson;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "itemcategories_" + getProject().name + ".json";
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "itemcategories_"+getProject().name+".json";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,133 +1,122 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
||||
import com.gpl.rpg.atcontentstudio.utils.FileUtils;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public abstract class JSONElement extends GameDataElement {
|
||||
|
||||
private static final long serialVersionUID = -8015398814080503982L;
|
||||
private static final long serialVersionUID = -8015398814080503982L;
|
||||
|
||||
//Available from state init.
|
||||
public File jsonFile;
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public void parse() {
|
||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
||||
//This type of state is unrelated to parsing/linking.
|
||||
return;
|
||||
}
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List gameDataElements = (List) parser.parse(reader);
|
||||
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);
|
||||
System.out.println(e.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} 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 {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public abstract void parse(@SuppressWarnings("rawtypes") Map jsonObj);
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public abstract Map toJson();
|
||||
public String toJsonString() {
|
||||
StringWriter writer = new JsonPrettyWriter();
|
||||
try {
|
||||
JSONObject.writeJSONString(this.toJson(), writer);
|
||||
} catch (IOException e) {
|
||||
//Impossible with a StringWriter
|
||||
}
|
||||
return writer.toString();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
if (parent == null) {
|
||||
System.out.println("blerf.");
|
||||
}
|
||||
return parent.getDataSet();
|
||||
}
|
||||
|
||||
public void save() {
|
||||
if (this.getParent() instanceof GameDataCategory<?> && writable) {
|
||||
((GameDataCategory<?>)this.getParent()).save(this.jsonFile);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns null if save occurred (no notable events).
|
||||
*/
|
||||
public List<SaveEvent> attemptSave() {
|
||||
List<SaveEvent> events = ((GameDataCategory<?>)this.getParent()).attemptSave(true, this.jsonFile.getName());
|
||||
if (events == null || events.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
if (events.size() == 1 && events.get(0).type == SaveEvent.Type.alsoSave && events.get(0).target == this) {
|
||||
save();
|
||||
return null;
|
||||
}
|
||||
return events;
|
||||
}
|
||||
//Available from state init.
|
||||
public File jsonFile;
|
||||
|
||||
public static Integer getInteger(Number n) {
|
||||
return n == null ? null : n.intValue();
|
||||
}
|
||||
@SuppressWarnings("rawtypes")
|
||||
public void parse() {
|
||||
if (shouldSkipParse()) {
|
||||
return;
|
||||
}
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List gameDataElements = (List) parser.parse(reader);
|
||||
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);
|
||||
System.out.println(e.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} 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 {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static Double getDouble(Number n) {
|
||||
return n == null ? null : n.doubleValue();
|
||||
}
|
||||
|
||||
public static Double parseChance(String s) {
|
||||
if (s.equals("100")) return 100d;
|
||||
}
|
||||
|
||||
public abstract void parse(@SuppressWarnings("rawtypes") Map jsonObj);
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public abstract Map toJson();
|
||||
|
||||
public String toJsonString() {
|
||||
Map json = this.toJson();
|
||||
return FileUtils.toJsonString(json);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
if (parent == null) {
|
||||
System.out.println("blerf.");
|
||||
}
|
||||
return parent.getDataSet();
|
||||
}
|
||||
|
||||
public void save() {
|
||||
if (this.getParent() instanceof GameDataCategory<?> && writable) {
|
||||
((GameDataCategory<?>) this.getParent()).save(this.jsonFile);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns null if save occurred (no notable events).
|
||||
*/
|
||||
public List<SaveEvent> attemptSave() {
|
||||
List<SaveEvent> events = ((GameDataCategory<?>) this.getParent()).attemptSave(true, this.jsonFile.getName());
|
||||
if (events == null || events.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
if (events.size() == 1 && events.get(0).type == SaveEvent.Type.alsoSave && events.get(0).target == this) {
|
||||
save();
|
||||
return null;
|
||||
}
|
||||
return events;
|
||||
}
|
||||
|
||||
public static Integer getInteger(Number n) {
|
||||
return n == null ? null : n.intValue();
|
||||
}
|
||||
|
||||
public static Double getDouble(Number n) {
|
||||
return n == null ? null : n.doubleValue();
|
||||
}
|
||||
|
||||
public static Double parseChance(String s) {
|
||||
if (s.equals("100")) return 100d;
|
||||
else if (s.equals("70")) return 70d;
|
||||
else if (s.equals("30")) return 30d;
|
||||
else if (s.equals("25")) return 25d;
|
||||
@@ -138,28 +127,30 @@ public abstract class JSONElement extends GameDataElement {
|
||||
else if (s.equals("1/1000")) return 0.1;
|
||||
else if (s.equals("1/10000")) return 0.01;
|
||||
else if (s.indexOf('/') >= 0) {
|
||||
int c = s.indexOf('/');
|
||||
double a = 1;
|
||||
try {
|
||||
a = Integer.parseInt(s.substring(0, c));
|
||||
} catch (NumberFormatException nfe) {}
|
||||
double b = 100;
|
||||
try {
|
||||
b = Integer.parseInt(s.substring(c+1));
|
||||
} catch (NumberFormatException nfe) {}
|
||||
return a/b;
|
||||
int c = s.indexOf('/');
|
||||
double a = 1;
|
||||
try {
|
||||
a = Integer.parseInt(s.substring(0, c));
|
||||
} catch (NumberFormatException nfe) {
|
||||
}
|
||||
double b = 100;
|
||||
try {
|
||||
b = Integer.parseInt(s.substring(c + 1));
|
||||
} catch (NumberFormatException nfe) {
|
||||
}
|
||||
return a / b;
|
||||
} else {
|
||||
double a = 10;
|
||||
try {
|
||||
a = Double.parseDouble(s);
|
||||
} catch (NumberFormatException nfe) {
|
||||
}
|
||||
return a;
|
||||
}
|
||||
else {
|
||||
double a = 10;
|
||||
try {
|
||||
a = Double.parseDouble(s);
|
||||
} catch (NumberFormatException nfe) {}
|
||||
return a;
|
||||
}
|
||||
}
|
||||
|
||||
public static String printJsonChance(Double chance) {
|
||||
if (chance.equals(100d)) return "100";
|
||||
}
|
||||
|
||||
public static String printJsonChance(Double chance) {
|
||||
if (chance.equals(100d)) return "100";
|
||||
else if (chance.equals(70d)) return "70";
|
||||
else if (chance.equals(30d)) return "30";
|
||||
else if (chance.equals(25d)) return "25";
|
||||
@@ -170,11 +161,11 @@ public abstract class JSONElement extends GameDataElement {
|
||||
else if (chance.equals(0.1d)) return "1/1000";
|
||||
else if (chance.equals(0.01d)) return "1/10000";
|
||||
else {
|
||||
if (chance.intValue() == chance) return Integer.toString(chance.intValue());
|
||||
//TODO Better handling of fractions. Chance description need a complete overhaul in AT.
|
||||
//This part does not output the input content of parseDouble(String s) in the case of fractions.
|
||||
return chance.toString();
|
||||
if (chance.intValue() == chance) return Integer.toString(chance.intValue());
|
||||
//TODO Better handling of fractions. Chance description need a complete overhaul in AT.
|
||||
//This part does not output the input content of parseDouble(String s) in the case of fractions.
|
||||
return chance.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,13 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||
|
||||
import java.awt.Image;
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
@@ -10,189 +17,174 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
public class Quest extends JSONElement {
|
||||
|
||||
private static final long serialVersionUID = 2004839647483250099L;
|
||||
|
||||
//Available from init state
|
||||
//public String id = null; inherited.
|
||||
public String name = null;
|
||||
|
||||
//Available in parsed state
|
||||
public Integer visible_in_log = null;
|
||||
public List<QuestStage> stages = null;
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+name+" ("+id+")";
|
||||
}
|
||||
private static final long serialVersionUID = 2004839647483250099L;
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "Quests";
|
||||
}
|
||||
|
||||
//Available from init state
|
||||
//public String id = null; inherited.
|
||||
public String name = null;
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void fromJson(File jsonFile, GameDataCategory<Quest> category) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List quests = (List) parser.parse(reader);
|
||||
for (Object obj : quests) {
|
||||
Map questJson = (Map)obj;
|
||||
Quest quest = fromJson(questJson);
|
||||
quest.jsonFile = jsonFile;
|
||||
quest.parent = category;
|
||||
if (quest.getDataType() == GameSource.Type.created || quest.getDataType() == GameSource.Type.altered) {
|
||||
quest.writable = true;
|
||||
}
|
||||
category.add(quest);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Quest fromJson(String jsonString) throws ParseException {
|
||||
Map questJson = (Map) new JSONParser().parse(jsonString);
|
||||
Quest quest = fromJson(questJson);
|
||||
quest.parse(questJson);
|
||||
return quest;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Quest fromJson(Map questJson) {
|
||||
Quest quest = new Quest();
|
||||
quest.id = (String) questJson.get("id");
|
||||
quest.name = (String) questJson.get("name");
|
||||
//Quests have to be parsed to have their stages initialized.
|
||||
quest.parse(questJson);
|
||||
return quest;
|
||||
}
|
||||
//Available in parsed state
|
||||
public Integer visible_in_log = null;
|
||||
public List<QuestStage> stages = null;
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map questJson) {
|
||||
this.visible_in_log = JSONElement.getInteger((Number) questJson.get("showInLog"));
|
||||
List questStagesJson = (List) questJson.get("stages");
|
||||
this.stages = new ArrayList<QuestStage>();
|
||||
if (questStagesJson != null && !questStagesJson.isEmpty()) {
|
||||
for (Object questStageJsonObj : questStagesJson) {
|
||||
Map questStageJson = (Map)questStageJsonObj;
|
||||
QuestStage questStage = new QuestStage(this);
|
||||
questStage.parse(questStageJson);
|
||||
this.stages.add(questStage);
|
||||
}
|
||||
}
|
||||
this.state = State.parsed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
||||
//This type of state is unrelated to parsing/linking.
|
||||
return;
|
||||
}
|
||||
if (this.state == State.init) {
|
||||
//Not parsed yet.
|
||||
this.parse();
|
||||
} else if (this.state == State.linked) {
|
||||
//Already linked.
|
||||
return;
|
||||
}
|
||||
|
||||
for (QuestStage stage : stages) {
|
||||
stage.link();
|
||||
}
|
||||
//Nothing to link to :D
|
||||
this.state = State.linked;
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + name + " (" + id + ")";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getQuestIcon();
|
||||
}
|
||||
|
||||
public Image getImage() {
|
||||
return DefaultIcons.getQuestImage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
Quest clone = new Quest();
|
||||
clone.jsonFile = this.jsonFile;
|
||||
clone.state = this.state;
|
||||
clone.id = this.id;
|
||||
clone.name = this.name;
|
||||
clone.visible_in_log = this.visible_in_log;
|
||||
if (this.stages != null) {
|
||||
clone.stages = new ArrayList<QuestStage>();
|
||||
for (QuestStage stage : this.stages){
|
||||
clone.stages.add((QuestStage) stage.clone(clone));
|
||||
}
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
//Nothing to link to.
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map questJson = new LinkedHashMap();
|
||||
questJson.put("id", this.id);
|
||||
if (this.name != null) questJson.put("name", this.name);
|
||||
if (this.visible_in_log != null) questJson.put("showInLog", this.visible_in_log);
|
||||
if (this.stages != null) {
|
||||
List stagesJson = new ArrayList();
|
||||
questJson.put("stages", stagesJson);
|
||||
for (QuestStage stage : this.stages) {
|
||||
stagesJson.add(stage.toJson());
|
||||
}
|
||||
}
|
||||
return questJson;
|
||||
}
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "Quests";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "questlist_"+getProject().name+".json";
|
||||
}
|
||||
|
||||
public QuestStage getStage(Integer stageId) {
|
||||
for (QuestStage stage : stages) {
|
||||
if (stage.progress.equals(stageId)) {
|
||||
return stage;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static void fromJson(File jsonFile, GameDataCategory<Quest> category) {
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(jsonFile);
|
||||
List quests = (List) parser.parse(reader);
|
||||
for (Object obj : quests) {
|
||||
Map questJson = (Map) obj;
|
||||
Quest quest = fromJson(questJson);
|
||||
quest.jsonFile = jsonFile;
|
||||
quest.parent = category;
|
||||
if (quest.getDataType() == GameSource.Type.created || quest.getDataType() == GameSource.Type.altered) {
|
||||
quest.writable = true;
|
||||
}
|
||||
category.add(quest);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Quest fromJson(String jsonString) throws ParseException {
|
||||
Map questJson = (Map) new JSONParser().parse(jsonString);
|
||||
Quest quest = fromJson(questJson);
|
||||
quest.parse(questJson);
|
||||
return quest;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static Quest fromJson(Map questJson) {
|
||||
Quest quest = new Quest();
|
||||
quest.id = (String) questJson.get("id");
|
||||
quest.name = (String) questJson.get("name");
|
||||
//Quests have to be parsed to have their stages initialized.
|
||||
quest.parse(questJson);
|
||||
return quest;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map questJson) {
|
||||
this.visible_in_log = JSONElement.getInteger((Number) questJson.get("showInLog"));
|
||||
List questStagesJson = (List) questJson.get("stages");
|
||||
this.stages = new ArrayList<QuestStage>();
|
||||
if (questStagesJson != null && !questStagesJson.isEmpty()) {
|
||||
for (Object questStageJsonObj : questStagesJson) {
|
||||
Map questStageJson = (Map) questStageJsonObj;
|
||||
QuestStage questStage = new QuestStage(this);
|
||||
questStage.parse(questStageJson);
|
||||
this.stages.add(questStage);
|
||||
}
|
||||
}
|
||||
this.state = State.parsed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (shouldSkipParseOrLink()) {
|
||||
return;
|
||||
}
|
||||
ensureParseIfNeeded();
|
||||
|
||||
for (QuestStage stage : stages) {
|
||||
stage.link();
|
||||
}
|
||||
//Nothing to link to :D
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getQuestIcon();
|
||||
}
|
||||
|
||||
public Image getImage() {
|
||||
return DefaultIcons.getQuestImage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
Quest clone = new Quest();
|
||||
clone.jsonFile = this.jsonFile;
|
||||
clone.state = this.state;
|
||||
clone.id = this.id;
|
||||
clone.name = this.name;
|
||||
clone.visible_in_log = this.visible_in_log;
|
||||
if (this.stages != null) {
|
||||
clone.stages = new ArrayList<QuestStage>();
|
||||
for (QuestStage stage : this.stages) {
|
||||
clone.stages.add((QuestStage) stage.clone(clone));
|
||||
}
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
//Nothing to link to.
|
||||
}
|
||||
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map questJson = new LinkedHashMap();
|
||||
questJson.put("id", this.id);
|
||||
if (this.name != null) questJson.put("name", this.name);
|
||||
if (this.visible_in_log != null) questJson.put("showInLog", this.visible_in_log);
|
||||
if (this.stages != null) {
|
||||
List stagesJson = new ArrayList();
|
||||
questJson.put("stages", stagesJson);
|
||||
for (QuestStage stage : this.stages) {
|
||||
stagesJson.add(stage.toJson());
|
||||
}
|
||||
}
|
||||
return questJson;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "questlist_" + getProject().name + ".json";
|
||||
}
|
||||
|
||||
public QuestStage getStage(Integer stageId) {
|
||||
for (QuestStage stage : stages) {
|
||||
if (stage.progress.equals(stageId)) {
|
||||
return stage;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,103 +1,96 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class QuestStage extends JSONElement {
|
||||
|
||||
private static final long serialVersionUID = 8313645819951513431L;
|
||||
|
||||
public Integer progress = null;
|
||||
public String log_text = null;
|
||||
public Integer exp_reward = null;
|
||||
public Integer finishes_quest = null;
|
||||
|
||||
public QuestStage(Quest parent){
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
public QuestStage clone(Quest cloneParent) {
|
||||
QuestStage clone = new QuestStage(cloneParent);
|
||||
clone.progress = progress != null ? new Integer(progress) : null;
|
||||
clone.log_text = log_text != null ? new String(log_text) : null;
|
||||
clone.exp_reward = exp_reward != null ? new Integer(exp_reward) : null;
|
||||
clone.finishes_quest = finishes_quest != null ? new Integer(finishes_quest) : null;
|
||||
clone.id = this.id;
|
||||
return clone;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map jsonObj) {
|
||||
progress = JSONElement.getInteger((Number) jsonObj.get("progress"));
|
||||
this.id = ((Quest)parent).id+":"+progress;
|
||||
log_text = (String) jsonObj.get("logText");
|
||||
exp_reward = JSONElement.getInteger((Number) jsonObj.get("rewardExperience"));
|
||||
finishes_quest = JSONElement.getInteger((Number) jsonObj.get("finishesQuest"));
|
||||
state = State.parsed;
|
||||
}
|
||||
private static final long serialVersionUID = 8313645819951513431L;
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map stageJson = new LinkedHashMap();
|
||||
if (progress != null) stageJson.put("progress", progress);
|
||||
if (log_text != null) stageJson.put("logText", log_text);
|
||||
if (exp_reward != null) stageJson.put("rewardExperience", exp_reward);
|
||||
if (finishes_quest != null) stageJson.put("finishesQuest", finishes_quest);
|
||||
return stageJson;
|
||||
}
|
||||
public Integer progress = null;
|
||||
public String log_text = null;
|
||||
public Integer exp_reward = null;
|
||||
public Integer finishes_quest = null;
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return progress+" - "+(exp_reward != null ? "["+exp_reward+"XP]" : "")+((finishes_quest != null) && (finishes_quest == 1) ? "[END]" : "")+log_text;
|
||||
}
|
||||
public QuestStage(Quest parent) {
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
||||
//This type of state is unrelated to parsing/linking.
|
||||
return;
|
||||
}
|
||||
if (this.state == State.init) {
|
||||
//Not parsed yet.
|
||||
this.parse();
|
||||
} else if (this.state == State.linked) {
|
||||
//Already linked.
|
||||
return;
|
||||
}
|
||||
|
||||
//Nothing to link to :D
|
||||
this.state = State.linked;
|
||||
}
|
||||
public QuestStage clone(Quest cloneParent) {
|
||||
QuestStage clone = new QuestStage(cloneParent);
|
||||
clone.progress = progress != null ? new Integer(progress) : null;
|
||||
clone.log_text = log_text != null ? new String(log_text) : null;
|
||||
clone.exp_reward = exp_reward != null ? new Integer(exp_reward) : null;
|
||||
clone.finishes_quest = finishes_quest != null ? new Integer(finishes_quest) : null;
|
||||
clone.id = this.id;
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
// Nothing to link to.
|
||||
}
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map jsonObj) {
|
||||
progress = JSONElement.getInteger((Number) jsonObj.get("progress"));
|
||||
this.id = ((Quest) parent).id + ":" + progress;
|
||||
log_text = (String) jsonObj.get("logText");
|
||||
exp_reward = JSONElement.getInteger((Number) jsonObj.get("rewardExperience"));
|
||||
finishes_quest = JSONElement.getInteger((Number) jsonObj.get("finishesQuest"));
|
||||
state = State.parsed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return ((Quest)parent).getProjectFilename();
|
||||
}
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
@Override
|
||||
public Map toJson() {
|
||||
Map stageJson = new LinkedHashMap();
|
||||
if (progress != null) stageJson.put("progress", progress);
|
||||
if (log_text != null) stageJson.put("logText", log_text);
|
||||
if (exp_reward != null) stageJson.put("rewardExperience", exp_reward);
|
||||
if (finishes_quest != null) stageJson.put("finishesQuest", finishes_quest);
|
||||
return stageJson;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return progress + " - " + (exp_reward != null ? "[" + exp_reward + "XP]" : "") + ((finishes_quest != null) && (finishes_quest == 1) ? "[END]" : "") + log_text;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (shouldSkipParseOrLink()) {
|
||||
return;
|
||||
}
|
||||
ensureParseIfNeeded();
|
||||
|
||||
//Nothing to link to :D
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
// Nothing to link to.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return ((Quest) parent).getProjectFilename();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getQuestIcon();
|
||||
}
|
||||
|
||||
public Image getImage() {
|
||||
return DefaultIcons.getQuestImage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getQuestIcon();
|
||||
}
|
||||
|
||||
public Image getImage() {
|
||||
return DefaultIcons.getQuestImage();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,268 +1,230 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
|
||||
public class Requirement extends JSONElement {
|
||||
|
||||
private static final long serialVersionUID = 7295593297142310955L;
|
||||
|
||||
private static Map<RequirementType, List<RequirementType>> COMPATIBLE_TYPES = new LinkedHashMap<RequirementType, List<RequirementType>>();
|
||||
|
||||
static {
|
||||
List<RequirementType> questTypes = new ArrayList<RequirementType>();
|
||||
questTypes.add(RequirementType.questProgress);
|
||||
questTypes.add(RequirementType.questLatestProgress);
|
||||
COMPATIBLE_TYPES.put(RequirementType.questProgress, questTypes);
|
||||
COMPATIBLE_TYPES.put(RequirementType.questLatestProgress, questTypes);
|
||||
|
||||
List<RequirementType> countedItemTypes = new ArrayList<RequirementType>();
|
||||
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
|
||||
public RequirementType type = null;
|
||||
public String required_obj_id = null;
|
||||
public Integer required_value = null;
|
||||
public Boolean negated = null;
|
||||
|
||||
//Available from linked state
|
||||
public GameDataElement required_obj = null;
|
||||
|
||||
public enum RequirementType {
|
||||
questProgress,
|
||||
questLatestProgress,
|
||||
inventoryRemove,
|
||||
inventoryKeep,
|
||||
wear,
|
||||
skillLevel,
|
||||
killedMonster,
|
||||
timerElapsed,
|
||||
usedItem,
|
||||
spentGold,
|
||||
consumedBonemeals,
|
||||
hasActorCondition,
|
||||
factionScore,
|
||||
random,
|
||||
factionScoreEquals,
|
||||
wearRemove,
|
||||
date,
|
||||
dateEquals,
|
||||
time,
|
||||
timeEquals
|
||||
}
|
||||
|
||||
public enum SkillID {
|
||||
weaponChance
|
||||
,weaponDmg
|
||||
,barter
|
||||
,dodge
|
||||
,barkSkin
|
||||
,moreCriticals
|
||||
,betterCriticals
|
||||
,speed // Raises max ap
|
||||
,coinfinder
|
||||
,moreExp
|
||||
,cleave // +10ap on kill
|
||||
,eater // +1hp per kill
|
||||
,fortitude // +N hp per levelup
|
||||
,evasion // increase successful flee chance & reduce chance of monster attack
|
||||
,regeneration // +N hp per round
|
||||
,lowerExploss
|
||||
,magicfinder
|
||||
,resistanceMental // lowers chance to get negative active conditions by monsters (Mental like Dazed)
|
||||
,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
|
||||
,taunt // Causes AP loss of attackers that miss
|
||||
,concussion // AC loss for monsters with (AC-BC)>N
|
||||
,weaponProficiencyDagger
|
||||
,weaponProficiency1hsword
|
||||
,weaponProficiency2hsword
|
||||
,weaponProficiencyAxe
|
||||
,weaponProficiencyBlunt
|
||||
,weaponProficiencyUnarmed
|
||||
,weaponProficiencyPole
|
||||
,armorProficiencyShield
|
||||
,armorProficiencyUnarmored
|
||||
,armorProficiencyLight
|
||||
,armorProficiencyHeavy
|
||||
,fightstyleDualWield
|
||||
,fightstyle2hand
|
||||
,fightstyleWeaponShield
|
||||
,specializationDualWield
|
||||
,specialization2hand
|
||||
,specializationWeaponShield
|
||||
}
|
||||
|
||||
@Override
|
||||
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 " : "")
|
||||
+(type == null ? "" : type.toString()+":")
|
||||
+obj_id
|
||||
+(required_value == null ? "" : required_value.toString());
|
||||
}
|
||||
private static final long serialVersionUID = 7295593297142310955L;
|
||||
|
||||
@Override
|
||||
public void parse() {
|
||||
throw new Error("Thou shalt not reach this method.");
|
||||
}
|
||||
private static Map<RequirementType, List<RequirementType>> COMPATIBLE_TYPES = new LinkedHashMap<RequirementType, List<RequirementType>>();
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public Map toJson() {
|
||||
throw new Error("Thou shalt not reach this method.");
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map jsonObj) {
|
||||
throw new Error("Thou shalt not reach this method.");
|
||||
}
|
||||
static {
|
||||
List<RequirementType> questTypes = new ArrayList<RequirementType>();
|
||||
questTypes.add(RequirementType.questProgress);
|
||||
questTypes.add(RequirementType.questLatestProgress);
|
||||
COMPATIBLE_TYPES.put(RequirementType.questProgress, questTypes);
|
||||
COMPATIBLE_TYPES.put(RequirementType.questLatestProgress, questTypes);
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
||||
//This type of state is unrelated to parsing/linking.
|
||||
return;
|
||||
}
|
||||
if (this.state == State.init) {
|
||||
//Not parsed yet.
|
||||
this.parse();
|
||||
} else if (this.state == State.linked) {
|
||||
//Already linked.
|
||||
return;
|
||||
}
|
||||
Project proj = getProject();
|
||||
if (proj == null) {
|
||||
Notification.addError("Error linking requirement "+getDesc()+". No parent project found.");
|
||||
return;
|
||||
}
|
||||
switch (type) {
|
||||
case hasActorCondition:
|
||||
this.required_obj = proj.getActorCondition(required_obj_id);
|
||||
break;
|
||||
case inventoryKeep:
|
||||
case inventoryRemove:
|
||||
case usedItem:
|
||||
case wear:
|
||||
case wearRemove:
|
||||
this.required_obj = proj.getItem(required_obj_id);
|
||||
break;
|
||||
case killedMonster:
|
||||
this.required_obj = proj.getNPC(required_obj_id);
|
||||
break;
|
||||
case questLatestProgress:
|
||||
case questProgress:
|
||||
this.required_obj = proj.getQuest(required_obj_id);
|
||||
if (this.required_obj != null && this.required_value != null) {
|
||||
QuestStage stage = ((Quest)this.required_obj).getStage(this.required_value);
|
||||
if (stage != null) {
|
||||
stage.addBacklink((GameDataElement) this.parent);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case consumedBonemeals:
|
||||
case skillLevel:
|
||||
case spentGold:
|
||||
case timerElapsed:
|
||||
case factionScore:
|
||||
case factionScoreEquals:
|
||||
case random:
|
||||
case date:
|
||||
case dateEquals:
|
||||
case time:
|
||||
case timeEquals:
|
||||
break;
|
||||
}
|
||||
if (this.required_obj != null) this.required_obj.addBacklink((GameDataElement) this.parent);
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
return clone(null);
|
||||
}
|
||||
|
||||
public GameDataElement clone(GameDataElement parent) {
|
||||
Requirement clone = new Requirement();
|
||||
clone.parent = parent;
|
||||
clone.jsonFile = this.jsonFile;
|
||||
clone.state = this.state;
|
||||
clone.required_obj_id = this.required_obj_id;
|
||||
clone.required_value = this.required_value;
|
||||
clone.negated = this.negated;
|
||||
clone.required_obj = this.required_obj;
|
||||
clone.type = this.type;
|
||||
if (clone.required_obj != null && parent != null) {
|
||||
clone.required_obj.addBacklink(parent);
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (this.required_obj == oldOne) {
|
||||
oldOne.removeBacklink((GameDataElement) this.parent);
|
||||
this.required_obj = newOne;
|
||||
if (newOne != null) newOne.addBacklink((GameDataElement) this.parent);
|
||||
}
|
||||
if (oldOne instanceof QuestStage) {
|
||||
if (this.required_obj != null && this.required_obj.equals(oldOne.parent) && this.required_value != null && this.required_value.equals(((QuestStage) oldOne).progress)) {
|
||||
oldOne.removeBacklink((GameDataElement) this.parent);
|
||||
if (newOne != null) newOne.addBacklink((GameDataElement) this.parent);
|
||||
}
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
throw new Error("Thou shalt not reach this method.");
|
||||
}
|
||||
|
||||
public void changeType(RequirementType destType) {
|
||||
if (COMPATIBLE_TYPES.get(type) == null || !COMPATIBLE_TYPES.get(type).contains(destType)) {
|
||||
required_obj = null;
|
||||
required_obj_id = null;
|
||||
required_value = null;
|
||||
}
|
||||
|
||||
if(destType==RequirementType.random)
|
||||
{
|
||||
required_obj_id = "50/100";
|
||||
}
|
||||
|
||||
type = destType;
|
||||
}
|
||||
List<RequirementType> countedItemTypes = new ArrayList<RequirementType>();
|
||||
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
|
||||
public RequirementType type = null;
|
||||
public String required_obj_id = null;
|
||||
public Integer required_value = null;
|
||||
public Boolean negated = null;
|
||||
|
||||
//Available from linked state
|
||||
public GameDataElement required_obj = null;
|
||||
|
||||
public enum RequirementType {
|
||||
questProgress,
|
||||
questLatestProgress,
|
||||
inventoryRemove,
|
||||
inventoryKeep,
|
||||
wear,
|
||||
skillLevel,
|
||||
killedMonster,
|
||||
timerElapsed,
|
||||
usedItem,
|
||||
spentGold,
|
||||
consumedBonemeals,
|
||||
hasActorCondition,
|
||||
factionScore,
|
||||
random,
|
||||
factionScoreEquals,
|
||||
wearRemove,
|
||||
date,
|
||||
dateEquals,
|
||||
time,
|
||||
timeEquals
|
||||
}
|
||||
|
||||
public enum SkillID {
|
||||
weaponChance, weaponDmg, barter, dodge, barkSkin, moreCriticals, betterCriticals, speed // Raises max ap
|
||||
, coinfinder, moreExp, cleave // +10ap on kill
|
||||
, eater // +1hp per kill
|
||||
, fortitude // +N hp per levelup
|
||||
, evasion // increase successful flee chance & reduce chance of monster attack
|
||||
, regeneration // +N hp per round
|
||||
, lowerExploss, magicfinder, resistanceMental // lowers chance to get negative active conditions by monsters (Mental like Dazed)
|
||||
, 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
|
||||
, taunt // Causes AP loss of attackers that miss
|
||||
, concussion // AC loss for monsters with (AC-BC)>N
|
||||
, weaponProficiencyDagger, weaponProficiency1hsword, weaponProficiency2hsword, weaponProficiencyAxe, weaponProficiencyBlunt, weaponProficiencyUnarmed, weaponProficiencyPole, armorProficiencyShield, armorProficiencyUnarmored, armorProficiencyLight, armorProficiencyHeavy, fightstyleDualWield, fightstyle2hand, fightstyleWeaponShield, specializationDualWield, specialization2hand, specializationWeaponShield
|
||||
}
|
||||
|
||||
@Override
|
||||
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 " : "")
|
||||
+ (type == null ? "" : type.toString() + ":")
|
||||
+ obj_id
|
||||
+ (required_value == null ? "" : required_value.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parse() {
|
||||
throw new Error("Thou shalt not reach this method.");
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public Map toJson() {
|
||||
throw new Error("Thou shalt not reach this method.");
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public void parse(Map jsonObj) {
|
||||
throw new Error("Thou shalt not reach this method.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (shouldSkipParseOrLink()) {
|
||||
return;
|
||||
}
|
||||
ensureParseIfNeeded();
|
||||
Project proj = getProject();
|
||||
if (proj == null) {
|
||||
Notification.addError("Error linking requirement " + getDesc() + ". No parent project found.");
|
||||
return;
|
||||
}
|
||||
switch (type) {
|
||||
case hasActorCondition:
|
||||
this.required_obj = proj.getActorCondition(required_obj_id);
|
||||
break;
|
||||
case inventoryKeep:
|
||||
case inventoryRemove:
|
||||
case usedItem:
|
||||
case wear:
|
||||
case wearRemove:
|
||||
this.required_obj = proj.getItem(required_obj_id);
|
||||
break;
|
||||
case killedMonster:
|
||||
this.required_obj = proj.getNPC(required_obj_id);
|
||||
break;
|
||||
case questLatestProgress:
|
||||
case questProgress:
|
||||
this.required_obj = proj.getQuest(required_obj_id);
|
||||
if (this.required_obj != null && this.required_value != null) {
|
||||
QuestStage stage = ((Quest) this.required_obj).getStage(this.required_value);
|
||||
if (stage != null) {
|
||||
stage.addBacklink((GameDataElement) this.parent);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case consumedBonemeals:
|
||||
case skillLevel:
|
||||
case spentGold:
|
||||
case timerElapsed:
|
||||
case factionScore:
|
||||
case factionScoreEquals:
|
||||
case random:
|
||||
case date:
|
||||
case dateEquals:
|
||||
case time:
|
||||
case timeEquals:
|
||||
break;
|
||||
}
|
||||
if (this.required_obj != null) this.required_obj.addBacklink((GameDataElement) this.parent);
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
return clone(null);
|
||||
}
|
||||
|
||||
public GameDataElement clone(GameDataElement parent) {
|
||||
Requirement clone = new Requirement();
|
||||
clone.parent = parent;
|
||||
clone.jsonFile = this.jsonFile;
|
||||
clone.state = this.state;
|
||||
clone.required_obj_id = this.required_obj_id;
|
||||
clone.required_value = this.required_value;
|
||||
clone.negated = this.negated;
|
||||
clone.required_obj = this.required_obj;
|
||||
clone.type = this.type;
|
||||
if (clone.required_obj != null && parent != null) {
|
||||
clone.required_obj.addBacklink(parent);
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (this.required_obj == oldOne) {
|
||||
oldOne.removeBacklink((GameDataElement) this.parent);
|
||||
this.required_obj = newOne;
|
||||
if (newOne != null) newOne.addBacklink((GameDataElement) this.parent);
|
||||
}
|
||||
if (oldOne instanceof QuestStage) {
|
||||
if (this.required_obj != null && this.required_obj.equals(oldOne.parent) && this.required_value != null && this.required_value.equals(((QuestStage) oldOne).progress)) {
|
||||
oldOne.removeBacklink((GameDataElement) this.parent);
|
||||
if (newOne != null) newOne.addBacklink((GameDataElement) this.parent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
throw new Error("Thou shalt not reach this method.");
|
||||
}
|
||||
|
||||
public void changeType(RequirementType destType) {
|
||||
if (COMPATIBLE_TYPES.get(type) == null || !COMPATIBLE_TYPES.get(type).contains(destType)) {
|
||||
required_obj = null;
|
||||
required_obj_id = null;
|
||||
required_value = null;
|
||||
}
|
||||
|
||||
if (destType == RequirementType.random) {
|
||||
required_obj_id = "50/100";
|
||||
}
|
||||
|
||||
type = destType;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,45 +1,46 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
public class ContainerArea extends MapObject {
|
||||
|
||||
public Droplist droplist = null;
|
||||
|
||||
public ContainerArea(tiled.core.MapObject obj) {}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
droplist = parentMap.getProject().getDroplist(name);
|
||||
if (droplist != null) {
|
||||
droplist.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (droplist != null) return DefaultIcons.getContainerIcon();
|
||||
else return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (oldOne == droplist) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
droplist = (Droplist) newOne;
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (droplist != null) {
|
||||
tmxObject.setName(droplist.id);
|
||||
}
|
||||
}
|
||||
public Droplist droplist = null;
|
||||
|
||||
public ContainerArea(tiled.core.MapObject obj) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
droplist = parentMap.getProject().getDroplist(name);
|
||||
if (droplist != null) {
|
||||
droplist.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (droplist != null) return DefaultIcons.getContainerIcon();
|
||||
else return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (oldOne == droplist) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
droplist = (Droplist) newOne;
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (droplist != null) {
|
||||
tmxObject.setName(droplist.id);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,116 +1,117 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Requirement;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
public class KeyArea extends MapObject {
|
||||
|
||||
public String dialogue_id = null;
|
||||
public Dialogue dialogue = null;
|
||||
public Requirement requirement = null;
|
||||
public boolean oldSchoolRequirement = true;
|
||||
|
||||
public KeyArea(tiled.core.MapObject obj) {
|
||||
dialogue_id = obj.getProperties().getProperty("phrase");
|
||||
String requireType = obj.getProperties().getProperty("requireType");
|
||||
String requireId = obj.getProperties().getProperty("requireId");
|
||||
String requireValue = obj.getProperties().getProperty("requireValue");
|
||||
String requireNegation = obj.getProperties().getProperty("requireNegation");
|
||||
oldSchoolRequirement = false;
|
||||
if (requireType == null) {
|
||||
String[] fields = obj.getName().split(":");
|
||||
if (fields.length == 2) {
|
||||
requireType = Requirement.RequirementType.questProgress.toString();
|
||||
requireValue = fields[1];
|
||||
requireId = fields[0];
|
||||
oldSchoolRequirement = true;
|
||||
} else if (fields.length == 3) {
|
||||
requireValue = fields[2];
|
||||
requireType = fields[0];
|
||||
requireId = fields[1];
|
||||
oldSchoolRequirement = true;
|
||||
}
|
||||
}
|
||||
requirement = new Requirement();
|
||||
if (requireType != null) requirement.type = Requirement.RequirementType.valueOf(requireType);
|
||||
requirement.required_obj_id = requireId;
|
||||
if (requireValue != null) requirement.required_value = Integer.parseInt(requireValue);
|
||||
if (requireNegation != null) requirement.negated = Boolean.parseBoolean(requireNegation);
|
||||
requirement.state = GameDataElement.State.parsed;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (dialogue_id != null) dialogue = parentMap.getProject().getDialogue(dialogue_id);
|
||||
if (dialogue != null) {
|
||||
dialogue.addBacklink(parentMap);
|
||||
}
|
||||
requirement.parent = parentMap;
|
||||
requirement.link();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (dialogue != null && requirement != null) return DefaultIcons.getKeyIcon();
|
||||
return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (oldOne == dialogue) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
dialogue = (Dialogue) newOne;
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
requirement.elementChanged(oldOne, newOne);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (dialogue != null) {
|
||||
tmxObject.getProperties().setProperty("phrase", dialogue.id);
|
||||
} else if (dialogue_id != null) {
|
||||
tmxObject.getProperties().setProperty("phrase", dialogue_id);
|
||||
}
|
||||
if (requirement != null) {
|
||||
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 {
|
||||
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) {
|
||||
tmxObject.getProperties().setProperty("requireId", requirement.required_obj_id);
|
||||
}
|
||||
if (requirement.required_value != null) {
|
||||
tmxObject.getProperties().setProperty("requireValue", requirement.required_value.toString());
|
||||
}
|
||||
if (requirement.negated != null) {
|
||||
tmxObject.getProperties().setProperty("requireNegation", Boolean.toString(requirement.negated));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public String dialogue_id;
|
||||
public Dialogue dialogue = null;
|
||||
public Requirement requirement;
|
||||
public boolean oldSchoolRequirement;
|
||||
|
||||
public void updateNameFromRequirementChange() {
|
||||
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
|
||||
name = (requirement.negated != null && requirement.negated) ? "NOT " : "" + requirement.required_obj_id+":"+((requirement.required_value == null) ? "" : Integer.toString(requirement.required_value));
|
||||
} else if (oldSchoolRequirement) {
|
||||
int i = 0;
|
||||
String futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
||||
while (parentMap.getMapObject(futureName) != null) {
|
||||
i++;
|
||||
futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
||||
}
|
||||
this.name = futureName;
|
||||
}
|
||||
}
|
||||
public KeyArea(tiled.core.MapObject obj) {
|
||||
dialogue_id = obj.getProperties().getProperty("phrase");
|
||||
String requireType = obj.getProperties().getProperty("requireType");
|
||||
String requireId = obj.getProperties().getProperty("requireId");
|
||||
String requireValue = obj.getProperties().getProperty("requireValue");
|
||||
String requireNegation = obj.getProperties().getProperty("requireNegation");
|
||||
oldSchoolRequirement = false;
|
||||
if (requireType == null) {
|
||||
String[] fields = obj.getName().split(":");
|
||||
if (fields.length == 2) {
|
||||
requireType = Requirement.RequirementType.questProgress.toString();
|
||||
requireValue = fields[1];
|
||||
requireId = fields[0];
|
||||
oldSchoolRequirement = true;
|
||||
} else if (fields.length == 3) {
|
||||
requireValue = fields[2];
|
||||
requireType = fields[0];
|
||||
requireId = fields[1];
|
||||
oldSchoolRequirement = true;
|
||||
}
|
||||
}
|
||||
requirement = new Requirement();
|
||||
if (requireType != null) requirement.type = Requirement.RequirementType.valueOf(requireType);
|
||||
requirement.required_obj_id = requireId;
|
||||
if (requireValue != null) requirement.required_value = Integer.parseInt(requireValue);
|
||||
if (requireNegation != null) requirement.negated = Boolean.parseBoolean(requireNegation);
|
||||
requirement.state = GameDataElement.State.parsed;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (dialogue_id != null) dialogue = parentMap.getProject().getDialogue(dialogue_id);
|
||||
if (dialogue != null) {
|
||||
dialogue.addBacklink(parentMap);
|
||||
}
|
||||
requirement.parent = parentMap;
|
||||
requirement.link();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (dialogue != null && requirement != null) return DefaultIcons.getKeyIcon();
|
||||
return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (oldOne == dialogue) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
dialogue = (Dialogue) newOne;
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
requirement.elementChanged(oldOne, newOne);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (dialogue != null) {
|
||||
tmxObject.getProperties().setProperty("phrase", dialogue.id);
|
||||
} else if (dialogue_id != null) {
|
||||
tmxObject.getProperties().setProperty("phrase", dialogue_id);
|
||||
}
|
||||
if (requirement != null) {
|
||||
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 {
|
||||
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) {
|
||||
tmxObject.getProperties().setProperty("requireId", requirement.required_obj_id);
|
||||
}
|
||||
if (requirement.required_value != null) {
|
||||
tmxObject.getProperties().setProperty("requireValue", requirement.required_value.toString());
|
||||
}
|
||||
if (requirement.negated != null) {
|
||||
tmxObject.getProperties().setProperty("requireNegation", Boolean.toString(requirement.negated));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void updateNameFromRequirementChange() {
|
||||
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
|
||||
name = (requirement.negated != null && requirement.negated) ? "NOT " : "" + requirement.required_obj_id + ":" + ((requirement.required_value == null) ? "" : Integer.toString(
|
||||
requirement.required_value));
|
||||
} else if (oldSchoolRequirement) {
|
||||
int i = 0;
|
||||
String futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
||||
while (parentMap.getMapObject(futureName) != null) {
|
||||
i++;
|
||||
futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
||||
}
|
||||
this.name = futureName;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,58 +1,57 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
|
||||
public class MapChange extends MapObject {
|
||||
|
||||
public String map_id = null;
|
||||
public TMXMap map = null;
|
||||
public String place_id = null;
|
||||
|
||||
public MapChange(tiled.core.MapObject obj) {
|
||||
this.map_id = obj.getProperties().getProperty("map");
|
||||
this.place_id = obj.getProperties().getProperty("place");
|
||||
}
|
||||
public String map_id;
|
||||
public TMXMap map = null;
|
||||
public String place_id;
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (map_id != null) this.map = parentMap.getProject().getMap(map_id);
|
||||
if (map != null) {
|
||||
map.addBacklink(parentMap);
|
||||
}
|
||||
//TODO reinstate this if data validation system ever exist.
|
||||
public MapChange(tiled.core.MapObject obj) {
|
||||
this.map_id = obj.getProperties().getProperty("map");
|
||||
this.place_id = obj.getProperties().getProperty("place");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (map_id != null) this.map = parentMap.getProject().getMap(map_id);
|
||||
if (map != null) {
|
||||
map.addBacklink(parentMap);
|
||||
}
|
||||
//TODO reinstate this if data validation system ever exist.
|
||||
// else Notification.addWarn("Incomplete mapchange area \""+name+"\" in map \""+parentMap.id+"\". This is OK if it's an arrival only (no exit through this point).");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (name != null) return DefaultIcons.getTiledIconIcon();
|
||||
else return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (oldOne == map) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
map = (TMXMap) newOne;
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (map != null) {
|
||||
tmxObject.getProperties().setProperty("map", map.id);
|
||||
} else if (map_id != null) {
|
||||
tmxObject.getProperties().setProperty("map", map_id);
|
||||
}
|
||||
if (place_id != null) {
|
||||
tmxObject.getProperties().setProperty("place", place_id);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (name != null) return DefaultIcons.getTiledIconIcon();
|
||||
else return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (oldOne == map) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
map = (TMXMap) newOne;
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (map != null) {
|
||||
tmxObject.getProperties().setProperty("map", map.id);
|
||||
} else if (map_id != null) {
|
||||
tmxObject.getProperties().setProperty("map", map_id);
|
||||
}
|
||||
if (place_id != null) {
|
||||
tmxObject.getProperties().setProperty("place", place_id);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,171 +1,171 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
public abstract class MapObject {
|
||||
|
||||
public int x, y, w, h;
|
||||
public String name;
|
||||
|
||||
public TMXMap parentMap;
|
||||
|
||||
public Types type;
|
||||
|
||||
protected static enum Types {
|
||||
mapchange,
|
||||
spawn,
|
||||
rest,
|
||||
key,
|
||||
replace,
|
||||
script,
|
||||
container,
|
||||
sign
|
||||
}
|
||||
|
||||
|
||||
public static MapObject buildObject(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
MapObject result = null;
|
||||
if (obj.getType() != null && !obj.getType().equals("") && Types.valueOf(obj.getType()) != null) {
|
||||
switch (Types.valueOf(obj.getType())) {
|
||||
case key:
|
||||
result = new KeyArea(obj);
|
||||
result.type = Types.key;
|
||||
break;
|
||||
case mapchange:
|
||||
result = new MapChange(obj);
|
||||
result.type = Types.mapchange;
|
||||
break;
|
||||
case replace:
|
||||
result = new ReplaceArea(obj);
|
||||
result.type = Types.replace;
|
||||
break;
|
||||
case rest:
|
||||
result = new RestArea(obj);
|
||||
result.type = Types.rest;
|
||||
break;
|
||||
case script:
|
||||
result = new ScriptArea(obj);
|
||||
result.type = Types.script;
|
||||
break;
|
||||
case sign:
|
||||
result = new SignArea(obj);
|
||||
result.type = Types.sign;
|
||||
break;
|
||||
case spawn:
|
||||
result = new SpawnArea(obj);
|
||||
result.type = Types.spawn;
|
||||
break;
|
||||
case container:
|
||||
result = new ContainerArea(obj);
|
||||
result.type = Types.container;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
Notification.addWarn("Unknown map object type: "+obj.getType()+"with name "+obj.getName()+" in map "+parentMap.id);
|
||||
}
|
||||
if (result != null) {
|
||||
result.x = obj.getX();
|
||||
result.y = obj.getY();
|
||||
result.w = obj.getWidth();
|
||||
result.h = obj.getHeight();
|
||||
result.name = obj.getName();
|
||||
result.parentMap = parentMap;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public abstract void link();
|
||||
public int x, y, w, h;
|
||||
public String name;
|
||||
|
||||
public abstract Image getIcon();
|
||||
public TMXMap parentMap;
|
||||
|
||||
public abstract void elementChanged(GameDataElement oldOne, GameDataElement newOne);
|
||||
public Types type;
|
||||
|
||||
public tiled.core.MapObject toTmxObject() {
|
||||
tiled.core.MapObject tmxObject = new tiled.core.MapObject(x, y, w, h);
|
||||
tmxObject.setName(name);
|
||||
tmxObject.setType(type.toString());
|
||||
savePropertiesInTmxObject(tmxObject);
|
||||
return tmxObject;
|
||||
}
|
||||
|
||||
public abstract void savePropertiesInTmxObject(tiled.core.MapObject tmxObject);
|
||||
|
||||
public static MapObject newMapchange(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Mapchange");
|
||||
MapObject result = new MapChange(obj);
|
||||
result.type = Types.mapchange;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
protected static enum Types {
|
||||
mapchange,
|
||||
spawn,
|
||||
rest,
|
||||
key,
|
||||
replace,
|
||||
script,
|
||||
container,
|
||||
sign
|
||||
}
|
||||
|
||||
public static MapObject newSpawnArea(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Spawnarea");
|
||||
MapObject result = new SpawnArea(obj);
|
||||
result.type = Types.spawn;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static MapObject newRest(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Rest");
|
||||
MapObject result = new RestArea(obj);
|
||||
result.type = Types.rest;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
public static MapObject buildObject(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
MapObject result = null;
|
||||
if (obj.getType() != null && !obj.getType().equals("") && Types.valueOf(obj.getType()) != null) {
|
||||
switch (Types.valueOf(obj.getType())) {
|
||||
case key:
|
||||
result = new KeyArea(obj);
|
||||
result.type = Types.key;
|
||||
break;
|
||||
case mapchange:
|
||||
result = new MapChange(obj);
|
||||
result.type = Types.mapchange;
|
||||
break;
|
||||
case replace:
|
||||
result = new ReplaceArea(obj);
|
||||
result.type = Types.replace;
|
||||
break;
|
||||
case rest:
|
||||
result = new RestArea(obj);
|
||||
result.type = Types.rest;
|
||||
break;
|
||||
case script:
|
||||
result = new ScriptArea(obj);
|
||||
result.type = Types.script;
|
||||
break;
|
||||
case sign:
|
||||
result = new SignArea(obj);
|
||||
result.type = Types.sign;
|
||||
break;
|
||||
case spawn:
|
||||
result = new SpawnArea(obj);
|
||||
result.type = Types.spawn;
|
||||
break;
|
||||
case container:
|
||||
result = new ContainerArea(obj);
|
||||
result.type = Types.container;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
Notification.addWarn("Unknown map object type: " + obj.getType() + "with name " + obj.getName() + " in map " + parentMap.id);
|
||||
}
|
||||
if (result != null) {
|
||||
result.x = obj.getX();
|
||||
result.y = obj.getY();
|
||||
result.w = obj.getWidth();
|
||||
result.h = obj.getHeight();
|
||||
result.name = obj.getName();
|
||||
result.parentMap = parentMap;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static MapObject newKey(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Key");
|
||||
MapObject result = new KeyArea(obj);
|
||||
result.type = Types.key;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
public abstract void link();
|
||||
|
||||
public static MapObject newReplace(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Replace");
|
||||
MapObject result = new ReplaceArea(obj);
|
||||
result.type = Types.replace;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
public abstract Image getIcon();
|
||||
|
||||
public static MapObject newScript(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Script");
|
||||
MapObject result = new ScriptArea(obj);
|
||||
result.type = Types.script;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
public abstract void elementChanged(GameDataElement oldOne, GameDataElement newOne);
|
||||
|
||||
public tiled.core.MapObject toTmxObject() {
|
||||
tiled.core.MapObject tmxObject = new tiled.core.MapObject(x, y, w, h);
|
||||
tmxObject.setName(name);
|
||||
tmxObject.setType(type.toString());
|
||||
savePropertiesInTmxObject(tmxObject);
|
||||
return tmxObject;
|
||||
}
|
||||
|
||||
public abstract void savePropertiesInTmxObject(tiled.core.MapObject tmxObject);
|
||||
|
||||
public static MapObject newMapchange(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Mapchange");
|
||||
MapObject result = new MapChange(obj);
|
||||
result.type = Types.mapchange;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static MapObject newSpawnArea(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Spawnarea");
|
||||
MapObject result = new SpawnArea(obj);
|
||||
result.type = Types.spawn;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static MapObject newRest(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Rest");
|
||||
MapObject result = new RestArea(obj);
|
||||
result.type = Types.rest;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static MapObject newKey(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Key");
|
||||
MapObject result = new KeyArea(obj);
|
||||
result.type = Types.key;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static MapObject newReplace(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Replace");
|
||||
MapObject result = new ReplaceArea(obj);
|
||||
result.type = Types.replace;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static MapObject newScript(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Script");
|
||||
MapObject result = new ScriptArea(obj);
|
||||
result.type = Types.script;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static MapObject newContainer(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Container");
|
||||
MapObject result = new ContainerArea(obj);
|
||||
result.type = Types.container;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static MapObject newSign(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Sign");
|
||||
MapObject result = new SignArea(obj);
|
||||
result.type = Types.sign;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static MapObject initObj(MapObject result, tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
result.x = obj.getX();
|
||||
result.y = obj.getY();
|
||||
result.w = obj.getWidth();
|
||||
result.h = obj.getHeight();
|
||||
result.name = obj.getName();
|
||||
result.parentMap = parentMap;
|
||||
return result;
|
||||
}
|
||||
|
||||
public static MapObject newContainer(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Container");
|
||||
MapObject result = new ContainerArea(obj);
|
||||
result.type = Types.container;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static MapObject newSign(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
if (obj.getName() == null) obj.setName("Sign");
|
||||
MapObject result = new SignArea(obj);
|
||||
result.type = Types.sign;
|
||||
initObj(result, obj, parentMap);
|
||||
return result;
|
||||
}
|
||||
|
||||
private static MapObject initObj(MapObject result, tiled.core.MapObject obj, TMXMap parentMap) {
|
||||
result.x = obj.getX();
|
||||
result.y = obj.getY();
|
||||
result.w = obj.getWidth();
|
||||
result.h = obj.getHeight();
|
||||
result.name = obj.getName();
|
||||
result.parentMap = parentMap;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,60 +1,60 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
|
||||
public class MapObjectGroup {
|
||||
|
||||
|
||||
public tiled.core.ObjectGroup tmxGroup;
|
||||
public TMXMap parentMap;
|
||||
public String name;
|
||||
public boolean visible;
|
||||
public List<MapObject> mapObjects = new ArrayList<MapObject>();
|
||||
public Boolean active;
|
||||
|
||||
public MapObjectGroup(tiled.core.ObjectGroup layer, TMXMap map) {
|
||||
this.tmxGroup = layer;
|
||||
this.name = layer.getName();
|
||||
this.visible = layer.isVisible();
|
||||
this.parentMap = map;
|
||||
if (layer.getProperties().get("active") != null) {
|
||||
active = new Boolean(((String) layer.getProperties().get("active")));
|
||||
} else {
|
||||
active = true;
|
||||
}
|
||||
for (tiled.core.MapObject obj : layer.getObjectsList()) {
|
||||
mapObjects.add(MapObject.buildObject(obj, map));
|
||||
}
|
||||
}
|
||||
|
||||
public void link() {
|
||||
for (MapObject obj : mapObjects) {
|
||||
obj.link();
|
||||
}
|
||||
}
|
||||
public tiled.core.ObjectGroup tmxGroup;
|
||||
public TMXMap parentMap;
|
||||
public String name;
|
||||
public boolean visible;
|
||||
public List<MapObject> mapObjects = new ArrayList<MapObject>();
|
||||
public Boolean active;
|
||||
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
for (MapObject object : mapObjects) {
|
||||
object.elementChanged(oldOne, newOne);
|
||||
}
|
||||
}
|
||||
public MapObjectGroup(tiled.core.ObjectGroup layer, TMXMap map) {
|
||||
this.tmxGroup = layer;
|
||||
this.name = layer.getName();
|
||||
this.visible = layer.isVisible();
|
||||
this.parentMap = map;
|
||||
if (layer.getProperties().get("active") != null) {
|
||||
active = new Boolean(((String) layer.getProperties().get("active")));
|
||||
} else {
|
||||
active = true;
|
||||
}
|
||||
for (tiled.core.MapObject obj : layer.getObjectsList()) {
|
||||
mapObjects.add(MapObject.buildObject(obj, map));
|
||||
}
|
||||
}
|
||||
|
||||
public void pushBackToTiledProperties() {
|
||||
if (tmxGroup != null) {
|
||||
tmxGroup.clear();
|
||||
} else {
|
||||
tmxGroup = new tiled.core.ObjectGroup();
|
||||
}
|
||||
tmxGroup.setVisible(visible);
|
||||
tmxGroup.setName(name);
|
||||
if (!active) {
|
||||
tmxGroup.getProperties().put("active", Boolean.toString(active));
|
||||
}
|
||||
for (MapObject object : mapObjects) {
|
||||
tmxGroup.addObject(object.toTmxObject());
|
||||
}
|
||||
}
|
||||
public void link() {
|
||||
for (MapObject obj : mapObjects) {
|
||||
obj.link();
|
||||
}
|
||||
}
|
||||
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
for (MapObject object : mapObjects) {
|
||||
object.elementChanged(oldOne, newOne);
|
||||
}
|
||||
}
|
||||
|
||||
public void pushBackToTiledProperties() {
|
||||
if (tmxGroup != null) {
|
||||
tmxGroup.clear();
|
||||
} else {
|
||||
tmxGroup = new tiled.core.ObjectGroup();
|
||||
}
|
||||
tmxGroup.setVisible(visible);
|
||||
tmxGroup.setName(name);
|
||||
if (!active) {
|
||||
tmxGroup.getProperties().put("active", Boolean.toString(active));
|
||||
}
|
||||
for (MapObject object : mapObjects) {
|
||||
tmxGroup.addObject(object.toTmxObject());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,146 +1,134 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Requirement;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class ReplaceArea extends MapObject {
|
||||
|
||||
public Requirement requirement = null;
|
||||
public boolean oldSchoolRequirement = false;
|
||||
|
||||
public List<ReplaceArea.Replacement> replacements = null;
|
||||
public Requirement requirement;
|
||||
public boolean oldSchoolRequirement = false;
|
||||
|
||||
public ReplaceArea(tiled.core.MapObject obj) {
|
||||
String requireType = obj.getProperties().getProperty("requireType");
|
||||
String requireId = obj.getProperties().getProperty("requireId");
|
||||
String requireValue = obj.getProperties().getProperty("requireValue");
|
||||
String requireNegation = obj.getProperties().getProperty("requireNegation");
|
||||
if (requireType == null) {
|
||||
String[] fields = obj.getName().split(":");
|
||||
if (fields.length == 2) {
|
||||
requireType = Requirement.RequirementType.questProgress.toString();
|
||||
requireValue = fields[1];
|
||||
requireId = fields[0];
|
||||
oldSchoolRequirement = true;
|
||||
} /*else if (fields.length == 3) {
|
||||
public List<ReplaceArea.Replacement> replacements = null;
|
||||
|
||||
public ReplaceArea(tiled.core.MapObject obj) {
|
||||
String requireType = obj.getProperties().getProperty("requireType");
|
||||
String requireId = obj.getProperties().getProperty("requireId");
|
||||
String requireValue = obj.getProperties().getProperty("requireValue");
|
||||
String requireNegation = obj.getProperties().getProperty("requireNegation");
|
||||
if (requireType == null) {
|
||||
String[] fields = obj.getName().split(":");
|
||||
if (fields.length == 2) {
|
||||
requireType = Requirement.RequirementType.questProgress.toString();
|
||||
requireValue = fields[1];
|
||||
requireId = fields[0];
|
||||
oldSchoolRequirement = true;
|
||||
} /*else if (fields.length == 3) {
|
||||
requireValue = fields[2];
|
||||
requireType = fields[0];
|
||||
requireId = fields[1];
|
||||
}*/
|
||||
}
|
||||
requirement = new Requirement();
|
||||
if (requireType != null) requirement.type = Requirement.RequirementType.valueOf(requireType);
|
||||
requirement.required_obj_id = requireId;
|
||||
if (requireValue != null) requirement.required_value = Integer.parseInt(requireValue);
|
||||
if (requireNegation != null) requirement.negated = Boolean.parseBoolean(requireNegation);
|
||||
requirement.state = GameDataElement.State.parsed;
|
||||
|
||||
|
||||
for (Object s : obj.getProperties().keySet()) {
|
||||
if (!TMXMap.isPaintedLayerName(s.toString())) continue;
|
||||
if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>();
|
||||
replacements.add(new Replacement(s.toString(), obj.getProperties().getProperty(s.toString())));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
requirement = new Requirement();
|
||||
if (requireType != null) requirement.type = Requirement.RequirementType.valueOf(requireType);
|
||||
requirement.required_obj_id = requireId;
|
||||
if (requireValue != null) requirement.required_value = Integer.parseInt(requireValue);
|
||||
if (requireNegation != null) requirement.negated = Boolean.parseBoolean(requireNegation);
|
||||
requirement.state = GameDataElement.State.parsed;
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
requirement.parent = parentMap;
|
||||
requirement.link();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getReplaceIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
requirement.elementChanged(oldOne, newOne);
|
||||
}
|
||||
|
||||
public ReplaceArea.Replacement addReplacement(String source, String target) {
|
||||
Replacement repl = new Replacement(source, target);
|
||||
addReplacement(repl);
|
||||
return repl;
|
||||
}
|
||||
|
||||
public void addReplacement(ReplaceArea.Replacement repl) {
|
||||
if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>();
|
||||
replacements.add(repl);
|
||||
}
|
||||
|
||||
// public void removeReplacement(String source, String target) {
|
||||
// replacedLayers.remove(source);
|
||||
// }
|
||||
|
||||
public void removeReplacement(Replacement repl) {
|
||||
replacements.remove(repl);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (replacements != null) {
|
||||
for(Replacement r : replacements)
|
||||
tmxObject.getProperties().setProperty(r.sourceLayer, r.targetLayer);
|
||||
}
|
||||
if (requirement != null) {
|
||||
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 {
|
||||
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) {
|
||||
tmxObject.getProperties().setProperty("requireId", requirement.required_obj_id);
|
||||
}
|
||||
if (requirement.required_value != null) {
|
||||
tmxObject.getProperties().setProperty("requireValue", requirement.required_value.toString());
|
||||
}
|
||||
if (requirement.negated != null) {
|
||||
tmxObject.getProperties().setProperty("requireNegation", Boolean.toString(requirement.negated));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Don't use yet !
|
||||
public void updateNameFromRequirementChange() {
|
||||
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
|
||||
name = (requirement.negated != null && requirement.negated) ? "NOT " : "" + requirement.required_obj_id+":"+((requirement.required_value == null) ? "" : Integer.toString(requirement.required_value));
|
||||
} else if (oldSchoolRequirement) {
|
||||
int i = 0;
|
||||
String futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
||||
while (parentMap.getMapObject(futureName) != null) {
|
||||
i++;
|
||||
futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
||||
}
|
||||
this.name = futureName;
|
||||
}
|
||||
}
|
||||
|
||||
public class Replacement {
|
||||
public String sourceLayer, targetLayer;
|
||||
public Replacement(String source, String target) {
|
||||
this.sourceLayer = source;
|
||||
this.targetLayer = target;
|
||||
}
|
||||
}
|
||||
for (Object s : obj.getProperties().keySet()) {
|
||||
if (!TMXMap.isPaintedLayerName(s.toString())) continue;
|
||||
if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>();
|
||||
replacements.add(new Replacement(s.toString(), obj.getProperties().getProperty(s.toString())));
|
||||
}
|
||||
|
||||
public boolean hasReplacementFor(String name) {
|
||||
if (name == null) return false;
|
||||
for (Replacement repl : replacements) {
|
||||
if (name.equalsIgnoreCase(repl.sourceLayer)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
requirement.parent = parentMap;
|
||||
requirement.link();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getReplaceIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
requirement.elementChanged(oldOne, newOne);
|
||||
}
|
||||
|
||||
public ReplaceArea.Replacement createReplacement(String source, String target) {
|
||||
Replacement repl = new Replacement(source, target);
|
||||
return repl;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (replacements != null) {
|
||||
for (Replacement r : replacements)
|
||||
tmxObject.getProperties().setProperty(r.sourceLayer, r.targetLayer);
|
||||
}
|
||||
if (requirement != null) {
|
||||
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 {
|
||||
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) {
|
||||
tmxObject.getProperties().setProperty("requireId", requirement.required_obj_id);
|
||||
}
|
||||
if (requirement.required_value != null) {
|
||||
tmxObject.getProperties().setProperty("requireValue", requirement.required_value.toString());
|
||||
}
|
||||
if (requirement.negated != null) {
|
||||
tmxObject.getProperties().setProperty("requireNegation", Boolean.toString(requirement.negated));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Don't use yet !
|
||||
public void updateNameFromRequirementChange() {
|
||||
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
|
||||
name = (requirement.negated != null && requirement.negated) ? "NOT " : "" + requirement.required_obj_id + ":" + ((requirement.required_value == null) ? "" : Integer.toString(
|
||||
requirement.required_value));
|
||||
} else if (oldSchoolRequirement) {
|
||||
int i = 0;
|
||||
String futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
||||
while (parentMap.getMapObject(futureName) != null) {
|
||||
i++;
|
||||
futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
||||
}
|
||||
this.name = futureName;
|
||||
}
|
||||
}
|
||||
|
||||
public class Replacement {
|
||||
public String sourceLayer, targetLayer;
|
||||
|
||||
public Replacement(String source, String target) {
|
||||
this.sourceLayer = source;
|
||||
this.targetLayer = target;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasReplacementFor(String name) {
|
||||
if (name == null) return false;
|
||||
for (Replacement repl : replacements) {
|
||||
if (name.equalsIgnoreCase(repl.sourceLayer)) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,31 +1,33 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
|
||||
public class RestArea extends MapObject {
|
||||
|
||||
public RestArea(tiled.core.MapObject obj) {}
|
||||
public RestArea(tiled.core.MapObject obj) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getRestIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getRestIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,61 +1,61 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
public class ScriptArea extends MapObject {
|
||||
|
||||
public Dialogue dialogue = null;
|
||||
public EvaluationTrigger trigger_type = null;
|
||||
|
||||
public enum EvaluationTrigger {
|
||||
enter,
|
||||
step,
|
||||
round,
|
||||
always
|
||||
}
|
||||
import java.awt.*;
|
||||
|
||||
public ScriptArea(tiled.core.MapObject obj) {
|
||||
String triggerTypeId = obj.getProperties().getProperty("when");
|
||||
if (triggerTypeId != null) {
|
||||
trigger_type = EvaluationTrigger.valueOf(triggerTypeId);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (name != null) dialogue = parentMap.getProject().getDialogue(name);
|
||||
if (dialogue != null) {
|
||||
dialogue.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (dialogue != null) return DefaultIcons.getScriptIcon();
|
||||
else return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (oldOne == dialogue) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
dialogue = (Dialogue) newOne;
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (dialogue != null) {
|
||||
tmxObject.setName(dialogue.id);
|
||||
}
|
||||
if (trigger_type != null) {
|
||||
tmxObject.getProperties().setProperty("when", trigger_type.toString());
|
||||
}
|
||||
}
|
||||
public class ScriptArea extends MapObject {
|
||||
|
||||
public Dialogue dialogue = null;
|
||||
public EvaluationTrigger trigger_type = null;
|
||||
|
||||
public enum EvaluationTrigger {
|
||||
enter,
|
||||
step,
|
||||
round,
|
||||
always
|
||||
}
|
||||
|
||||
public ScriptArea(tiled.core.MapObject obj) {
|
||||
String triggerTypeId = obj.getProperties().getProperty("when");
|
||||
if (triggerTypeId != null) {
|
||||
trigger_type = EvaluationTrigger.valueOf(triggerTypeId);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (name != null) dialogue = parentMap.getProject().getDialogue(name);
|
||||
if (dialogue != null) {
|
||||
dialogue.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (dialogue != null) return DefaultIcons.getScriptIcon();
|
||||
else return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (oldOne == dialogue) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
dialogue = (Dialogue) newOne;
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (dialogue != null) {
|
||||
tmxObject.setName(dialogue.id);
|
||||
}
|
||||
if (trigger_type != null) {
|
||||
tmxObject.getProperties().setProperty("when", trigger_type.toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,47 +1,47 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import java.awt.*;
|
||||
|
||||
public class SignArea extends MapObject {
|
||||
|
||||
public Dialogue dialogue = null;
|
||||
|
||||
public SignArea(tiled.core.MapObject obj) {
|
||||
|
||||
}
|
||||
public Dialogue dialogue = null;
|
||||
|
||||
public SignArea(tiled.core.MapObject obj) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (name != null) dialogue = parentMap.getProject().getDialogue(name);
|
||||
if (dialogue != null) {
|
||||
dialogue.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (dialogue != null) return DefaultIcons.getSignIcon();
|
||||
else return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (oldOne == dialogue) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
dialogue = (Dialogue) newOne;
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (dialogue != null) {
|
||||
tmxObject.setName(dialogue.id);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (name != null) dialogue = parentMap.getProject().getDialogue(name);
|
||||
if (dialogue != null) {
|
||||
dialogue.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (dialogue != null) return DefaultIcons.getSignIcon();
|
||||
else return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
if (oldOne == dialogue) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
dialogue = (Dialogue) newOne;
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (dialogue != null) {
|
||||
tmxObject.setName(dialogue.id);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,95 +1,95 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SpawnArea extends MapObject {
|
||||
|
||||
public int quantity = 1;
|
||||
public int respawnSpeed = 10;
|
||||
public boolean active = true;
|
||||
public boolean ignoreAreas = false;
|
||||
public String spawngroup_id;
|
||||
public List<NPC> spawnGroup = new ArrayList<NPC>();
|
||||
|
||||
public SpawnArea(tiled.core.MapObject obj) {
|
||||
if (obj.getProperties().getProperty("quantity") != null) {
|
||||
this.quantity = Integer.parseInt(obj.getProperties().getProperty("quantity"));
|
||||
}
|
||||
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"));
|
||||
}
|
||||
if (obj.getProperties().getProperty("ignoreAreas") != null) {
|
||||
this.ignoreAreas = Boolean.parseBoolean(obj.getProperties().getProperty("ignoreAreas"));
|
||||
}
|
||||
if (obj.getProperties().getProperty("spawngroup") != null) {
|
||||
this.spawngroup_id = obj.getProperties().getProperty("spawngroup");
|
||||
} else if (obj.getName() != null ){
|
||||
this.spawngroup_id = obj.getName();
|
||||
}
|
||||
}
|
||||
public int quantity = 1;
|
||||
public int respawnSpeed = 10;
|
||||
public boolean active = true;
|
||||
public boolean ignoreAreas = false;
|
||||
public String spawngroup_id;
|
||||
public List<NPC> spawnGroup = new ArrayList<NPC>();
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (spawngroup_id != null) {
|
||||
spawnGroup = parentMap.getProject().getSpawnGroup(spawngroup_id);
|
||||
} else {
|
||||
spawnGroup = new ArrayList<NPC>();
|
||||
}
|
||||
if (spawnGroup != null) {
|
||||
for (NPC npc : spawnGroup) {
|
||||
npc.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (spawnGroup != null && !spawnGroup.isEmpty()) {
|
||||
return spawnGroup.get(0).getIcon();
|
||||
}
|
||||
return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
int replacedIndex = -1;
|
||||
for (NPC npc : spawnGroup) {
|
||||
if (npc == oldOne) {
|
||||
replacedIndex = spawnGroup.indexOf(npc);
|
||||
}
|
||||
}
|
||||
if (replacedIndex >= 0) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
spawnGroup.set(replacedIndex, (NPC) newOne);
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (spawngroup_id != null) {
|
||||
tmxObject.getProperties().setProperty("spawngroup", spawngroup_id);
|
||||
}
|
||||
if (quantity != 1) {
|
||||
tmxObject.getProperties().setProperty("quantity", Integer.toString(quantity));
|
||||
}
|
||||
if (respawnSpeed != 10) {
|
||||
tmxObject.getProperties().setProperty("respawnspeed", Integer.toString(respawnSpeed));
|
||||
}
|
||||
if (!this.active) {
|
||||
tmxObject.getProperties().setProperty("active", Boolean.toString(active));
|
||||
}
|
||||
if (this.ignoreAreas) {
|
||||
tmxObject.getProperties().setProperty("ignoreAreas", Boolean.toString(ignoreAreas));
|
||||
}
|
||||
}
|
||||
public SpawnArea(tiled.core.MapObject obj) {
|
||||
if (obj.getProperties().getProperty("quantity") != null) {
|
||||
this.quantity = Integer.parseInt(obj.getProperties().getProperty("quantity"));
|
||||
}
|
||||
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"));
|
||||
}
|
||||
if (obj.getProperties().getProperty("ignoreAreas") != null) {
|
||||
this.ignoreAreas = Boolean.parseBoolean(obj.getProperties().getProperty("ignoreAreas"));
|
||||
}
|
||||
if (obj.getProperties().getProperty("spawngroup") != null) {
|
||||
this.spawngroup_id = obj.getProperties().getProperty("spawngroup");
|
||||
} else if (obj.getName() != null) {
|
||||
this.spawngroup_id = obj.getName();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (spawngroup_id != null) {
|
||||
spawnGroup = parentMap.getProject().getSpawnGroup(spawngroup_id);
|
||||
} else {
|
||||
spawnGroup = new ArrayList<NPC>();
|
||||
}
|
||||
if (spawnGroup != null) {
|
||||
for (NPC npc : spawnGroup) {
|
||||
npc.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
if (spawnGroup != null && !spawnGroup.isEmpty()) {
|
||||
return spawnGroup.get(0).getIcon();
|
||||
}
|
||||
return DefaultIcons.getNullifyIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
int replacedIndex = -1;
|
||||
for (NPC npc : spawnGroup) {
|
||||
if (npc == oldOne) {
|
||||
replacedIndex = spawnGroup.indexOf(npc);
|
||||
}
|
||||
}
|
||||
if (replacedIndex >= 0) {
|
||||
oldOne.removeBacklink(parentMap);
|
||||
spawnGroup.set(replacedIndex, (NPC) newOne);
|
||||
if (newOne != null) newOne.addBacklink(parentMap);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||
if (spawngroup_id != null) {
|
||||
tmxObject.getProperties().setProperty("spawngroup", spawngroup_id);
|
||||
}
|
||||
if (quantity != 1) {
|
||||
tmxObject.getProperties().setProperty("quantity", Integer.toString(quantity));
|
||||
}
|
||||
if (respawnSpeed != 10) {
|
||||
tmxObject.getProperties().setProperty("respawnspeed", Integer.toString(respawnSpeed));
|
||||
}
|
||||
if (!this.active) {
|
||||
tmxObject.getProperties().setProperty("active", Boolean.toString(active));
|
||||
}
|
||||
if (this.ignoreAreas) {
|
||||
tmxObject.getProperties().setProperty("ignoreAreas", Boolean.toString(ignoreAreas));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,478 +1,476 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import tiled.io.TMXMapReader;
|
||||
import tiled.io.TMXMapWriter;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.*;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
|
||||
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
import tiled.io.TMXMapReader;
|
||||
import tiled.io.TMXMapWriter;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.io.*;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
public class TMXMap extends GameDataElement {
|
||||
|
||||
private static final long serialVersionUID = 1609502879500898837L;
|
||||
|
||||
public static final String GROUND_LAYER_NAME = "Ground";
|
||||
public static final String OBJECTS_LAYER_NAME = "Objects";
|
||||
public static final String ABOVE_LAYER_NAME = "Above";
|
||||
public static final String TOP_LAYER_NAME = "Top";
|
||||
public static final String WALKABLE_LAYER_NAME = "Walkable";
|
||||
|
||||
public enum ColorFilter {
|
||||
none,
|
||||
black20,
|
||||
black40,
|
||||
black60,
|
||||
black80,
|
||||
invert,
|
||||
bw,
|
||||
redtint,
|
||||
greentint,
|
||||
bluetint
|
||||
}
|
||||
|
||||
public File tmxFile = null;
|
||||
public tiled.core.Map tmxMap = null;
|
||||
public Set<Spritesheet> usedSpritesheets = null;
|
||||
public List<MapObjectGroup> groups = null;
|
||||
|
||||
public ProjectTreeNode parent;
|
||||
public Integer outside = null;
|
||||
public ColorFilter colorFilter = null;
|
||||
private static final long serialVersionUID = 1609502879500898837L;
|
||||
|
||||
public boolean changedOnDisk = false;
|
||||
public int dismissNextChangeNotif = 0;
|
||||
public static final String GROUND_LAYER_NAME = "Ground";
|
||||
public static final String OBJECTS_LAYER_NAME = "Objects";
|
||||
public static final String ABOVE_LAYER_NAME = "Above";
|
||||
public static final String TOP_LAYER_NAME = "Top";
|
||||
public static final String WALKABLE_LAYER_NAME = "Walkable";
|
||||
|
||||
public TMXMap(TMXMapSet parent, File f) {
|
||||
this.parent = parent;
|
||||
this.tmxFile = f;
|
||||
String name = f.getName();
|
||||
id = name.substring(0, name.length() - 4);
|
||||
}
|
||||
|
||||
public void parse() {
|
||||
if (this.state == GameDataElement.State.init) {
|
||||
if (tmxMap != null) return;
|
||||
usedSpritesheets = new HashSet<Spritesheet>();
|
||||
try {
|
||||
tmxMap = new TMXMapReader().readMap(tmxFile.getAbsolutePath(), this);
|
||||
if (tmxMap.getProperties().get("outdoors") != null) {
|
||||
outside = new Integer(((String) tmxMap.getProperties().get("outdoors")));
|
||||
}
|
||||
if (tmxMap.getProperties().get("colorfilter") != null) {
|
||||
colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Impossible to load TMX map file "+tmxFile.getAbsolutePath());
|
||||
} catch (Exception e) {
|
||||
Notification.addError("Error while loading TMX map file "+tmxFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
for (tiled.core.MapLayer layer : tmxMap.getLayers()) {
|
||||
if (layer instanceof tiled.core.ObjectGroup) {
|
||||
if (groups == null) {
|
||||
groups = new ArrayList<MapObjectGroup>();
|
||||
}
|
||||
MapObjectGroup group = new MapObjectGroup((tiled.core.ObjectGroup) layer, this);
|
||||
groups.add(group);
|
||||
}
|
||||
}
|
||||
for (Spritesheet s : usedSpritesheets) {
|
||||
s.addBacklink(this);
|
||||
}
|
||||
state = State.parsed;
|
||||
}
|
||||
}
|
||||
|
||||
public void create() {
|
||||
if (tmxMap != null) return;
|
||||
tmxMap = new tiled.core.Map(30, 30);
|
||||
}
|
||||
|
||||
public TMXMap clone() {
|
||||
TMXMap clone = new TMXMap((TMXMapSet) this.parent, this.tmxFile);
|
||||
try {
|
||||
clone.usedSpritesheets = new HashSet<Spritesheet>();
|
||||
clone.tmxMap = new TMXMapReader().readMap(new StringReader(this.toXml()), clone);
|
||||
if (clone.tmxMap.getProperties().get("outdoors") != null) {
|
||||
clone.outside = new Integer(((String) clone.tmxMap.getProperties().get("outdoors")));
|
||||
}
|
||||
if (clone.tmxMap.getProperties().get("colorfilter") != null) {
|
||||
clone.colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
|
||||
}
|
||||
for (tiled.core.MapLayer layer : clone.tmxMap.getLayers()) {
|
||||
if (layer instanceof tiled.core.ObjectGroup) {
|
||||
if (clone.groups == null) {
|
||||
clone.groups = new ArrayList<MapObjectGroup>();
|
||||
}
|
||||
MapObjectGroup group = new MapObjectGroup((tiled.core.ObjectGroup) layer, this);
|
||||
group.link();
|
||||
clone.groups.add(group);
|
||||
}
|
||||
}
|
||||
for (Spritesheet s : usedSpritesheets) {
|
||||
s.addBacklink(clone);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Notification.addError("Error while cloning map "+this.id+" : "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
public enum ColorFilter {
|
||||
none,
|
||||
black20,
|
||||
black40,
|
||||
black60,
|
||||
black80,
|
||||
invert,
|
||||
bw,
|
||||
redtint,
|
||||
greentint,
|
||||
bluetint
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
public File tmxFile;
|
||||
public tiled.core.Map tmxMap = null;
|
||||
public Set<Spritesheet> usedSpritesheets = null;
|
||||
public List<MapObjectGroup> groups = null;
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return null;
|
||||
}
|
||||
public ProjectTreeNode parent;
|
||||
public Integer outside = null;
|
||||
public ColorFilter colorFilter = null;
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
public boolean changedOnDisk = false;
|
||||
public int dismissNextChangeNotif = 0;
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return 0;
|
||||
}
|
||||
public TMXMap(TMXMapSet parent, File f) {
|
||||
this.parent = parent;
|
||||
this.tmxFile = f;
|
||||
String name = f.getName();
|
||||
id = name.substring(0, name.length() - 4);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
public void parse() {
|
||||
if (this.state == GameDataElement.State.init) {
|
||||
if (tmxMap != null) return;
|
||||
usedSpritesheets = new HashSet<Spritesheet>();
|
||||
try {
|
||||
tmxMap = new TMXMapReader().readMap(tmxFile.getAbsolutePath(), this);
|
||||
if (tmxMap.getProperties().get("outdoors") != null) {
|
||||
outside = new Integer(((String) tmxMap.getProperties().get("outdoors")));
|
||||
}
|
||||
if (tmxMap.getProperties().get("colorfilter") != null) {
|
||||
colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Impossible to load TMX map file " + tmxFile.getAbsolutePath());
|
||||
} catch (Exception e) {
|
||||
Notification.addError("Error while loading TMX map file " + tmxFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
for (tiled.core.MapLayer layer : tmxMap.getLayers()) {
|
||||
if (layer instanceof tiled.core.ObjectGroup) {
|
||||
if (groups == null) {
|
||||
groups = new ArrayList<MapObjectGroup>();
|
||||
}
|
||||
MapObjectGroup group = new MapObjectGroup((tiled.core.ObjectGroup) layer, this);
|
||||
groups.add(group);
|
||||
}
|
||||
}
|
||||
for (Spritesheet s : usedSpritesheets) {
|
||||
s.addBacklink(this);
|
||||
}
|
||||
state = State.parsed;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
public void create() {
|
||||
if (tmxMap != null) return;
|
||||
tmxMap = new tiled.core.Map(30, 30);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
public TMXMap clone() {
|
||||
TMXMap clone = new TMXMap((TMXMapSet) this.parent, this.tmxFile);
|
||||
try {
|
||||
clone.usedSpritesheets = new HashSet<Spritesheet>();
|
||||
clone.tmxMap = new TMXMapReader().readMap(new StringReader(this.toXml()), clone);
|
||||
if (clone.tmxMap.getProperties().get("outdoors") != null) {
|
||||
clone.outside = new Integer(((String) clone.tmxMap.getProperties().get("outdoors")));
|
||||
}
|
||||
if (clone.tmxMap.getProperties().get("colorfilter") != null) {
|
||||
clone.colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
|
||||
}
|
||||
for (tiled.core.MapLayer layer : clone.tmxMap.getLayers()) {
|
||||
if (layer instanceof tiled.core.ObjectGroup) {
|
||||
if (clone.groups == null) {
|
||||
clone.groups = new ArrayList<MapObjectGroup>();
|
||||
}
|
||||
MapObjectGroup group = new MapObjectGroup((tiled.core.ObjectGroup) layer, this);
|
||||
group.link();
|
||||
clone.groups.add(group);
|
||||
}
|
||||
}
|
||||
for (Spritesheet s : usedSpritesheets) {
|
||||
s.addBacklink(clone);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Notification.addError("Error while cloning map " + this.id + " : " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getTiledIconIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getTiledIconIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {return null;}
|
||||
@Override
|
||||
public Image getOpenIcon() {return null;}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public String toXml() {
|
||||
if (outside != null && outside == 1) {
|
||||
tmxMap.getProperties().put("outdoors", Integer.toString(outside));
|
||||
} else {
|
||||
tmxMap.getProperties().remove("outdoors");
|
||||
}
|
||||
if (colorFilter != null) {
|
||||
tmxMap.getProperties().put("colorfilter", colorFilter.toString());
|
||||
} else {
|
||||
tmxMap.getProperties().remove("colorfilter");
|
||||
}
|
||||
|
||||
for (MapObjectGroup group : groups) {
|
||||
group.pushBackToTiledProperties();
|
||||
if (!tmxMap.containsLayer(group.tmxGroup)) {
|
||||
tmxMap.addLayer(group.tmxGroup);
|
||||
}
|
||||
}
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
try {
|
||||
TMXMapWriter writer = new TMXMapWriter();
|
||||
writer.settings.layerCompressionMethod = TMXMapWriter.Settings.LAYER_COMPRESSION_METHOD_ZLIB;
|
||||
if (getDataType() == GameSource.Type.source) {
|
||||
writer.writeMap(tmxMap, baos, tmxFile.getAbsolutePath());
|
||||
} else {
|
||||
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());
|
||||
e.printStackTrace();
|
||||
}
|
||||
return baos.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void save() {
|
||||
if (writable) {
|
||||
String xml = toXml();
|
||||
try {
|
||||
//TODO: check in fileutils, to test the workspace's filesystem once at startup, and figure out how many of these can occur, instead of hard-coded '2'
|
||||
dismissNextChangeNotif += 2;
|
||||
FileWriter w = new FileWriter(tmxFile);
|
||||
w.write(xml);
|
||||
w.close();
|
||||
this.state = State.saved;
|
||||
changedOnDisk = false;
|
||||
Notification.addSuccess("TMX file "+tmxFile.getAbsolutePath()+" saved.");
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while writing TMX file "+tmxFile.getAbsolutePath()+" : "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaveEvent> attemptSave() {
|
||||
//TODO check cases where map should be moved from altered/created to created/altered....
|
||||
save();
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
if (writable) {
|
||||
if (tmxFile.exists()) {
|
||||
if (tmxFile.delete()) {
|
||||
Notification.addSuccess("TMX file "+tmxFile.getAbsolutePath()+" deleted.");
|
||||
} else {
|
||||
Notification.addError("Error while deleting TMX file "+tmxFile.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
((TMXMapSet)parent).tmxMaps.remove(this);
|
||||
//TODO clear blacklinks ?
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == GameDataElement.State.init) {
|
||||
parse();
|
||||
}
|
||||
if (this.state == GameDataElement.State.parsed) {
|
||||
if (groups != null) {
|
||||
for (MapObjectGroup group : groups) {
|
||||
group.link();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
for (MapObjectGroup group : groups) {
|
||||
group.elementChanged(oldOne, newOne);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return tmxFile.getName();
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
public void addLayer(tiled.core.MapLayer layer) {
|
||||
tmxMap.addLayer(layer);
|
||||
if (layer instanceof tiled.core.ObjectGroup) {
|
||||
groups.add(new MapObjectGroup((tiled.core.ObjectGroup) layer, this));
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
public void removeLayer(tiled.core.MapLayer layer) {
|
||||
tmxMap.removeLayer(tmxMap.getLayerIndex(layer));
|
||||
if (layer instanceof tiled.core.ObjectGroup) {
|
||||
MapObjectGroup toRemove = null;
|
||||
for (MapObjectGroup group : groups) {
|
||||
if (group.tmxGroup == layer) {
|
||||
toRemove = group;
|
||||
}
|
||||
}
|
||||
if (toRemove != null) {
|
||||
groups.remove(toRemove);
|
||||
}
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
|
||||
public MapObjectGroup getGroup(tiled.core.ObjectGroup selectedLayer) {
|
||||
for (MapObjectGroup group : groups) {
|
||||
if (group.tmxGroup == selectedLayer) {
|
||||
return group;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getTiledIconIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getTiledIconIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
public String toXml() {
|
||||
if (outside != null && outside == 1) {
|
||||
tmxMap.getProperties().put("outdoors", Integer.toString(outside));
|
||||
} else {
|
||||
tmxMap.getProperties().remove("outdoors");
|
||||
}
|
||||
if (colorFilter != null) {
|
||||
tmxMap.getProperties().put("colorfilter", colorFilter.toString());
|
||||
} else {
|
||||
tmxMap.getProperties().remove("colorfilter");
|
||||
}
|
||||
|
||||
for (MapObjectGroup group : groups) {
|
||||
group.pushBackToTiledProperties();
|
||||
if (!tmxMap.containsLayer(group.tmxGroup)) {
|
||||
tmxMap.addLayer(group.tmxGroup);
|
||||
}
|
||||
}
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
try {
|
||||
TMXMapWriter writer = new TMXMapWriter();
|
||||
writer.settings.layerCompressionMethod = TMXMapWriter.Settings.LAYER_COMPRESSION_METHOD_ZLIB;
|
||||
if (getDataType() == GameSource.Type.source) {
|
||||
writer.writeMap(tmxMap, baos, tmxFile.getAbsolutePath());
|
||||
} else {
|
||||
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());
|
||||
e.printStackTrace();
|
||||
}
|
||||
return baos.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return false;
|
||||
}
|
||||
|
||||
public void save() {
|
||||
if (writable) {
|
||||
String xml = toXml();
|
||||
try {
|
||||
//TODO: check in fileutils, to test the workspace's filesystem once at startup, and figure out how many of these can occur, instead of hard-coded '2'
|
||||
dismissNextChangeNotif += 2;
|
||||
FileWriter w = new FileWriter(tmxFile);
|
||||
w.write(xml);
|
||||
w.close();
|
||||
this.state = State.saved;
|
||||
changedOnDisk = false;
|
||||
Notification.addSuccess("TMX file " + tmxFile.getAbsolutePath() + " saved.");
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while writing TMX file " + tmxFile.getAbsolutePath() + " : " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaveEvent> attemptSave() {
|
||||
//TODO check cases where map should be moved from altered/created to created/altered....
|
||||
save();
|
||||
return null;
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
if (writable) {
|
||||
if (tmxFile.exists()) {
|
||||
if (tmxFile.delete()) {
|
||||
Notification.addSuccess("TMX file " + tmxFile.getAbsolutePath() + " deleted.");
|
||||
} else {
|
||||
Notification.addError("Error while deleting TMX file " + tmxFile.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
((TMXMapSet) parent).tmxMaps.remove(this);
|
||||
//TODO clear blacklinks ?
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == GameDataElement.State.init) {
|
||||
parse();
|
||||
}
|
||||
if (this.state == GameDataElement.State.parsed) {
|
||||
if (groups != null) {
|
||||
for (MapObjectGroup group : groups) {
|
||||
group.link();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
for (MapObjectGroup group : groups) {
|
||||
group.elementChanged(oldOne, newOne);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return tmxFile.getName();
|
||||
}
|
||||
|
||||
public void addLayer(tiled.core.MapLayer layer) {
|
||||
tmxMap.addLayer(layer);
|
||||
if (layer instanceof tiled.core.ObjectGroup) {
|
||||
groups.add(new MapObjectGroup((tiled.core.ObjectGroup) layer, this));
|
||||
}
|
||||
}
|
||||
|
||||
public void removeLayer(tiled.core.MapLayer layer) {
|
||||
tmxMap.removeLayer(tmxMap.getLayerIndex(layer));
|
||||
if (layer instanceof tiled.core.ObjectGroup) {
|
||||
MapObjectGroup toRemove = null;
|
||||
for (MapObjectGroup group : groups) {
|
||||
if (group.tmxGroup == layer) {
|
||||
toRemove = group;
|
||||
}
|
||||
}
|
||||
if (toRemove != null) {
|
||||
groups.remove(toRemove);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public MapObjectGroup getGroup(tiled.core.ObjectGroup selectedLayer) {
|
||||
for (MapObjectGroup group : groups) {
|
||||
if (group.tmxGroup == selectedLayer) {
|
||||
return group;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public List<String> getMapchangesNames() {
|
||||
List<String> result = new ArrayList<String>();
|
||||
result.add(null);
|
||||
for (MapObjectGroup group : groups) {
|
||||
for (MapObject obj : group.mapObjects) {
|
||||
if (obj.type == MapObject.Types.mapchange) {
|
||||
result.add(obj.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public MapObject getMapObject(String name) {
|
||||
MapObject result = null;
|
||||
for (MapObjectGroup group : groups) {
|
||||
for (MapObject obj : group.mapObjects) {
|
||||
if (obj.name.equals(name)) {
|
||||
result = obj;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static boolean isPaintedLayerName(String name) {
|
||||
return GROUND_LAYER_NAME.equalsIgnoreCase(name) ||
|
||||
OBJECTS_LAYER_NAME.equalsIgnoreCase(name) ||
|
||||
ABOVE_LAYER_NAME.equalsIgnoreCase(name) ||
|
||||
TOP_LAYER_NAME.equalsIgnoreCase(name) ||
|
||||
WALKABLE_LAYER_NAME.equalsIgnoreCase(name);
|
||||
}
|
||||
|
||||
|
||||
public void reload() {
|
||||
tmxMap = null;
|
||||
for (Spritesheet s : usedSpritesheets) {
|
||||
s.elementChanged(this, null);
|
||||
}
|
||||
usedSpritesheets.clear();
|
||||
for (MapObjectGroup g : groups) {
|
||||
for (MapObject o : g.mapObjects) {
|
||||
if (o instanceof ContainerArea) {
|
||||
if (((ContainerArea) o).droplist != null) ((ContainerArea) o).droplist.elementChanged(this, null);
|
||||
} else if (o instanceof KeyArea) {
|
||||
if (((KeyArea) o).dialogue != null) ((KeyArea) o).dialogue.elementChanged(this, null);
|
||||
if (((KeyArea) o).requirement != null && ((KeyArea) o).requirement.required_obj != null)
|
||||
((KeyArea) o).requirement.required_obj.elementChanged(this, null);
|
||||
} else if (o instanceof MapChange) {
|
||||
if (((MapChange) o).map != null) ((MapChange) o).map.elementChanged(this, null);
|
||||
} else if (o instanceof ReplaceArea) {
|
||||
if (((ReplaceArea) o).requirement != null && ((ReplaceArea) o).requirement.required_obj != null)
|
||||
((ReplaceArea) o).requirement.required_obj.elementChanged(this, null);
|
||||
} else if (o instanceof RestArea) {
|
||||
} else if (o instanceof ScriptArea) {
|
||||
if (((ScriptArea) o).dialogue != null) ((ScriptArea) o).dialogue.elementChanged(this, null);
|
||||
} else if (o instanceof SignArea) {
|
||||
if (((SignArea) o).dialogue != null) ((SignArea) o).dialogue.elementChanged(this, null);
|
||||
} else if (o instanceof SpawnArea) {
|
||||
if (((SpawnArea) o).spawnGroup != null) {
|
||||
for (NPC n : ((SpawnArea) o).spawnGroup) {
|
||||
n.elementChanged(this, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
groups.clear();
|
||||
outside = null;
|
||||
colorFilter = null;
|
||||
|
||||
state = GameDataElement.State.init;
|
||||
this.link();
|
||||
|
||||
changedOnDisk = false;
|
||||
for (MapChangedOnDiskListener l : listeners) {
|
||||
l.mapReloaded();
|
||||
}
|
||||
}
|
||||
|
||||
public void mapChangedOnDisk() {
|
||||
if (dismissNextChangeNotif > 0) {
|
||||
dismissNextChangeNotif--;
|
||||
} else {
|
||||
changedOnDisk = true;
|
||||
for (MapChangedOnDiskListener l : listeners) {
|
||||
l.mapChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface MapChangedOnDiskListener {
|
||||
public void mapChanged();
|
||||
|
||||
public void mapReloaded();
|
||||
}
|
||||
|
||||
private List<MapChangedOnDiskListener> listeners = new CopyOnWriteArrayList<TMXMap.MapChangedOnDiskListener>();
|
||||
|
||||
public void addMapChangedOnDiskListener(MapChangedOnDiskListener l) {
|
||||
listeners.add(l);
|
||||
}
|
||||
|
||||
public void removeMapChangedOnDiskListener(MapChangedOnDiskListener l) {
|
||||
listeners.remove(l);
|
||||
}
|
||||
|
||||
public List<String> getMapchangesNames() {
|
||||
List<String> result = new ArrayList<String>();
|
||||
result.add(null);
|
||||
for (MapObjectGroup group : groups) {
|
||||
for (MapObject obj : group.mapObjects) {
|
||||
if (obj.type == MapObject.Types.mapchange) {
|
||||
result.add(obj.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public MapObject getMapObject(String name) {
|
||||
MapObject result = null;
|
||||
for (MapObjectGroup group : groups) {
|
||||
for (MapObject obj : group.mapObjects) {
|
||||
if (obj.name.equals(name)) {
|
||||
result = obj;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static boolean isPaintedLayerName(String name) {
|
||||
return GROUND_LAYER_NAME.equalsIgnoreCase(name) ||
|
||||
OBJECTS_LAYER_NAME.equalsIgnoreCase(name) ||
|
||||
ABOVE_LAYER_NAME.equalsIgnoreCase(name) ||
|
||||
TOP_LAYER_NAME.equalsIgnoreCase(name) ||
|
||||
WALKABLE_LAYER_NAME.equalsIgnoreCase(name);
|
||||
}
|
||||
|
||||
|
||||
public void reload() {
|
||||
tmxMap = null;
|
||||
for (Spritesheet s : usedSpritesheets) {
|
||||
s.elementChanged(this, null);
|
||||
}
|
||||
usedSpritesheets.clear();
|
||||
for (MapObjectGroup g : groups) {
|
||||
for (MapObject o : g.mapObjects) {
|
||||
if (o instanceof ContainerArea) {
|
||||
if (((ContainerArea)o).droplist != null) ((ContainerArea)o).droplist.elementChanged(this, null);
|
||||
} else if (o instanceof KeyArea) {
|
||||
if (((KeyArea)o).dialogue != null) ((KeyArea)o).dialogue.elementChanged(this, null);
|
||||
if (((KeyArea)o).requirement != null && ((KeyArea)o).requirement.required_obj != null) ((KeyArea)o).requirement.required_obj.elementChanged(this, null);
|
||||
} else if (o instanceof MapChange) {
|
||||
if (((MapChange)o).map != null) ((MapChange)o).map.elementChanged(this, null);
|
||||
} else if (o instanceof ReplaceArea) {
|
||||
if (((ReplaceArea)o).requirement != null && ((ReplaceArea)o).requirement.required_obj != null) ((ReplaceArea)o).requirement.required_obj.elementChanged(this, null);
|
||||
} else if (o instanceof RestArea) {
|
||||
} else if (o instanceof ScriptArea) {
|
||||
if (((ScriptArea)o).dialogue != null) ((ScriptArea)o).dialogue.elementChanged(this, null);
|
||||
} else if (o instanceof SignArea) {
|
||||
if (((SignArea)o).dialogue != null) ((SignArea)o).dialogue.elementChanged(this, null);
|
||||
} else if (o instanceof SpawnArea) {
|
||||
if (((SpawnArea)o).spawnGroup != null) {
|
||||
for (NPC n : ((SpawnArea)o).spawnGroup) {
|
||||
n.elementChanged(this, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
groups.clear();
|
||||
outside = null;
|
||||
colorFilter = null;
|
||||
|
||||
state = GameDataElement.State.init;
|
||||
this.link();
|
||||
|
||||
changedOnDisk = false;
|
||||
for (MapChangedOnDiskListener l : listeners) {
|
||||
l.mapReloaded();
|
||||
}
|
||||
}
|
||||
|
||||
public void mapChangedOnDisk() {
|
||||
if (dismissNextChangeNotif > 0) {
|
||||
dismissNextChangeNotif--;
|
||||
} else {
|
||||
changedOnDisk = true;
|
||||
for (MapChangedOnDiskListener l : listeners) {
|
||||
l.mapChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public interface MapChangedOnDiskListener {
|
||||
public void mapChanged();
|
||||
public void mapReloaded();
|
||||
}
|
||||
|
||||
private List<MapChangedOnDiskListener> listeners = new CopyOnWriteArrayList<TMXMap.MapChangedOnDiskListener>();
|
||||
|
||||
public void addMapChangedOnDiskListener(MapChangedOnDiskListener l) {
|
||||
listeners.add(l);
|
||||
}
|
||||
|
||||
public void removeMapChangedOnDiskListener(MapChangedOnDiskListener l) {
|
||||
listeners.remove(l);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,24 +1,5 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.FileSystems;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardWatchEventKinds;
|
||||
import java.nio.file.WatchEvent;
|
||||
import java.nio.file.WatchKey;
|
||||
import java.nio.file.WatchService;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
@@ -29,246 +10,272 @@ import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
import com.gpl.rpg.atcontentstudio.utils.FileUtils;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.*;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class TMXMapSet implements ProjectTreeNode {
|
||||
|
||||
public static final String DEFAULT_REL_PATH_IN_SOURCE = "res"+File.separator+"xml"+File.separator;
|
||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "maps"+File.separator;
|
||||
public static final String DEFAULT_REL_PATH_TO_DRAWABLE = ".."+File.separator+"drawable"+File.separator;
|
||||
public static final String DEFAULT_REL_PATH_IN_SOURCE = "res" + File.separator + "xml" + File.separator;
|
||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "maps" + File.separator;
|
||||
public static final String DEFAULT_REL_PATH_TO_DRAWABLE = ".." + File.separator + "drawable" + File.separator;
|
||||
|
||||
public static final String GAME_MAPS_ARRAY_NAME = "loadresource_maps";
|
||||
public static final String DEBUG_SUFFIX = "_debug";
|
||||
public static final String RESOURCE_PREFIX = "@xml/";
|
||||
public static final String FILENAME_SUFFIX = ".tmx";
|
||||
|
||||
public File mapFolder = null;
|
||||
public List<TMXMap> tmxMaps;
|
||||
|
||||
public ProjectTreeNode parent;
|
||||
|
||||
public TMXMapSet(GameSource source) {
|
||||
this.parent = source;
|
||||
if (source.type == GameSource.Type.source) {
|
||||
this.mapFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||
}
|
||||
else if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||
this.mapFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||
if (!this.mapFolder.exists()) {
|
||||
this.mapFolder.mkdirs();
|
||||
}
|
||||
FileUtils.makeSymlink(getProject().baseContent.gameSprites.drawableFolder, new File(mapFolder.getAbsolutePath()+File.separator+DEFAULT_REL_PATH_TO_DRAWABLE));
|
||||
}
|
||||
this.tmxMaps = new ArrayList<TMXMap>();
|
||||
|
||||
if (source.type == GameSource.Type.source && (source.parent.sourceSetToUse == ResourceSet.debugData || source.parent.sourceSetToUse == ResourceSet.gameData)) {
|
||||
String suffix = (source.parent.sourceSetToUse == ResourceSet.debugData) ? DEBUG_SUFFIX : "";
|
||||
|
||||
if (source.referencedSourceFiles.get(GAME_MAPS_ARRAY_NAME+suffix) != null) {
|
||||
for (String resource : source.referencedSourceFiles.get(GAME_MAPS_ARRAY_NAME+suffix)) {
|
||||
File f = new File(mapFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
TMXMap map = new TMXMap(this, f);
|
||||
tmxMaps.add(map);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else if (this.mapFolder != null) {
|
||||
for (File f : this.mapFolder.listFiles()) {
|
||||
if (f.getName().endsWith(".tmx") || f.getName().endsWith(".TMX")) {
|
||||
TMXMap map = new TMXMap(this, f);
|
||||
if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||
map.writable = true;
|
||||
}
|
||||
tmxMaps.add(map);
|
||||
}
|
||||
}
|
||||
}
|
||||
Collections.sort(tmxMaps, new Comparator<TMXMap>() {
|
||||
@Override
|
||||
public int compare(TMXMap o1, TMXMap o2) {
|
||||
return o1.id.compareTo(o2.id);
|
||||
}
|
||||
});
|
||||
if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||
final Path folderPath = Paths.get(mapFolder.getAbsolutePath());
|
||||
Thread watcher = new Thread("Map folder watcher for "+getProject().name+"/"+source.type) {
|
||||
public void run() {
|
||||
WatchService watchService;
|
||||
public static final String GAME_MAPS_ARRAY_NAME = "loadresource_maps";
|
||||
public static final String DEBUG_SUFFIX = "_debug";
|
||||
public static final String RESOURCE_PREFIX = "@xml/";
|
||||
public static final String FILENAME_SUFFIX = ".tmx";
|
||||
|
||||
while(getProject().open) {
|
||||
try {
|
||||
watchService = FileSystems.getDefault().newWatchService();
|
||||
/*WatchKey watchKey = */folderPath.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE);
|
||||
WatchKey wk;
|
||||
validService: while(getProject().open) {
|
||||
wk = watchService.poll(10, TimeUnit.SECONDS);
|
||||
if (wk != null) {
|
||||
for (WatchEvent<?> event : wk.pollEvents()) {
|
||||
Path changed = (Path) event.context();
|
||||
String name = changed.getFileName().toString();
|
||||
String id = name.substring(0, name.length() - 4);
|
||||
TMXMap map = getMap(id);
|
||||
if (map != null) {
|
||||
map.mapChangedOnDisk();
|
||||
}
|
||||
}
|
||||
if(!wk.reset()) {
|
||||
watchService.close();
|
||||
break validService;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
watcher.start();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<TMXMap> children() {
|
||||
return Collections.enumeration(tmxMaps);
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return tmxMaps.get(arg0);
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return tmxMaps.size();
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return tmxMaps.indexOf(arg0);
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (TMXMap map : tmxMaps) {
|
||||
map.notifyCreated();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+"TMX Maps";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
public File mapFolder = null;
|
||||
public List<TMXMap> tmxMaps;
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getTmxClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getTmxClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getTmxOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return tmxMaps.isEmpty();
|
||||
}
|
||||
public ProjectTreeNode parent;
|
||||
|
||||
public TMXMap getMap(String id) {
|
||||
if (tmxMaps == null) return null;
|
||||
for (TMXMap map : tmxMaps) {
|
||||
if (id.equals(map.id)){
|
||||
return map;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public TMXMapSet(GameSource source) {
|
||||
this.parent = source;
|
||||
if (source.type == GameSource.Type.source) {
|
||||
this.mapFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||
} else if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||
this.mapFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||
if (!this.mapFolder.exists()) {
|
||||
this.mapFolder.mkdirs();
|
||||
}
|
||||
FileUtils.makeSymlink(getProject().baseContent.gameSprites.drawableFolder, new File(mapFolder.getAbsolutePath() + File.separator + DEFAULT_REL_PATH_TO_DRAWABLE));
|
||||
}
|
||||
this.tmxMaps = new ArrayList<TMXMap>();
|
||||
|
||||
public void addMap(TMXMap node) {
|
||||
ProjectTreeNode higherEmptyParent = this;
|
||||
while (higherEmptyParent != null) {
|
||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode)higherEmptyParent.getParent()).isEmpty()) higherEmptyParent = (ProjectTreeNode)higherEmptyParent.getParent();
|
||||
else break;
|
||||
}
|
||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||
tmxMaps.add(node);
|
||||
if (node.tmxFile != null) {
|
||||
//Altered node.
|
||||
node.tmxFile = new File(this.mapFolder, node.tmxFile.getName());
|
||||
} else {
|
||||
//Created node.
|
||||
node.tmxFile = new File(this.mapFolder, node.id+".tmx");
|
||||
}
|
||||
node.parent = this;
|
||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||
else node.notifyCreated();
|
||||
}
|
||||
if (source.type == GameSource.Type.source && (source.parent.sourceSetToUse == ResourceSet.debugData || source.parent.sourceSetToUse == ResourceSet.gameData)) {
|
||||
String suffix = (source.parent.sourceSetToUse == ResourceSet.debugData) ? DEBUG_SUFFIX : "";
|
||||
|
||||
if (source.referencedSourceFiles.get(GAME_MAPS_ARRAY_NAME + suffix) != null) {
|
||||
for (String resource : source.referencedSourceFiles.get(GAME_MAPS_ARRAY_NAME + suffix)) {
|
||||
File f = new File(mapFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||
if (f.exists()) {
|
||||
TMXMap map = new TMXMap(this, f);
|
||||
tmxMaps.add(map);
|
||||
} else {
|
||||
Notification.addWarn("Unable to locate resource " + resource + " in the game source for project " + getProject().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else if (this.mapFolder != null) {
|
||||
for (File f : this.mapFolder.listFiles()) {
|
||||
if (f.getName().endsWith(".tmx") || f.getName().endsWith(".TMX")) {
|
||||
TMXMap map = new TMXMap(this, f);
|
||||
if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||
map.writable = true;
|
||||
}
|
||||
tmxMaps.add(map);
|
||||
}
|
||||
}
|
||||
}
|
||||
Collections.sort(tmxMaps, new Comparator<TMXMap>() {
|
||||
@Override
|
||||
public int compare(TMXMap o1, TMXMap o2) {
|
||||
return o1.id.compareTo(o2.id);
|
||||
}
|
||||
});
|
||||
if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||
final Path folderPath = Paths.get(mapFolder.getAbsolutePath());
|
||||
Thread watcher = new Thread("Map folder watcher for " + getProject().name + "/" + source.type) {
|
||||
public void run() {
|
||||
WatchService watchService;
|
||||
|
||||
while (getProject().open) {
|
||||
try {
|
||||
watchService = FileSystems.getDefault().newWatchService();
|
||||
/*WatchKey watchKey = */
|
||||
folderPath.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE);
|
||||
WatchKey wk;
|
||||
validService:
|
||||
while (getProject().open) {
|
||||
wk = watchService.poll(10, TimeUnit.SECONDS);
|
||||
if (wk != null) {
|
||||
for (WatchEvent<?> event : wk.pollEvents()) {
|
||||
Path changed = (Path) event.context();
|
||||
String name = changed.getFileName().toString();
|
||||
String id = name.substring(0, name.length() - 4);
|
||||
TMXMap map = getMap(id);
|
||||
if (map != null) {
|
||||
map.mapChangedOnDisk();
|
||||
}
|
||||
}
|
||||
if (!wk.reset()) {
|
||||
watchService.close();
|
||||
break validService;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
watcher.start();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<TMXMap> children() {
|
||||
return Collections.enumeration(tmxMaps);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return tmxMaps.get(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return tmxMaps.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return tmxMaps.indexOf(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (TMXMap map : tmxMaps) {
|
||||
map.notifyCreated();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + "TMX Maps";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getTmxClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getTmxClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getTmxOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return tmxMaps.isEmpty();
|
||||
}
|
||||
|
||||
public TMXMap getMap(String id) {
|
||||
if (tmxMaps == null) return null;
|
||||
for (TMXMap map : tmxMaps) {
|
||||
if (id.equals(map.id)) {
|
||||
return map;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addMap(TMXMap node) {
|
||||
ProjectTreeNode higherEmptyParent = this;
|
||||
while (higherEmptyParent != null) {
|
||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode) higherEmptyParent.getParent()).isEmpty())
|
||||
higherEmptyParent = (ProjectTreeNode) higherEmptyParent.getParent();
|
||||
else break;
|
||||
}
|
||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||
tmxMaps.add(node);
|
||||
if (node.tmxFile != null) {
|
||||
//Altered node.
|
||||
node.tmxFile = new File(this.mapFolder, node.tmxFile.getName());
|
||||
} else {
|
||||
//Created node.
|
||||
node.tmxFile = new File(this.mapFolder, node.id + ".tmx");
|
||||
}
|
||||
node.parent = this;
|
||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||
else node.notifyCreated();
|
||||
}
|
||||
|
||||
public TMXMap get(int index) {
|
||||
return tmxMaps.get(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : tmxMaps) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public TMXMap get(int index) {
|
||||
return tmxMaps.get(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : tmxMaps) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,40 +1,5 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.awt.Point;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.transform.OutputKeys;
|
||||
import javax.xml.transform.Result;
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerConfigurationException;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.TransformerFactoryConfigurationError;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
@@ -42,250 +7,272 @@ import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.transform.*;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
import java.awt.*;
|
||||
import java.io.*;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
public class Worldmap extends ArrayList<WorldmapSegment> implements ProjectTreeNode {
|
||||
|
||||
private static final long serialVersionUID = 4590409256594556179L;
|
||||
private static final long serialVersionUID = 4590409256594556179L;
|
||||
|
||||
public static final String DEFAULT_REL_PATH_IN_SOURCE = "res/xml/worldmap.xml";
|
||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "maps"+File.separator+"worldmap.xml";
|
||||
|
||||
public File worldmapFile;
|
||||
public GameSource parent;
|
||||
|
||||
public Map<String, Map<String, Point>> segments = new LinkedHashMap<String, Map<String,Point>>();
|
||||
public static final String DEFAULT_REL_PATH_IN_SOURCE = "res/xml/worldmap.xml";
|
||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "maps" + File.separator + "worldmap.xml";
|
||||
|
||||
public Worldmap(GameSource gameSource) {
|
||||
this.parent = gameSource;
|
||||
if (getDataType() == Type.source) {
|
||||
worldmapFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||
} else {
|
||||
worldmapFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||
}
|
||||
if (worldmapFile.exists()) {
|
||||
loadFromFile(worldmapFile);
|
||||
}
|
||||
if (getDataType() == Type.source) {
|
||||
for (WorldmapSegment segment : this) {
|
||||
segment.writable = false;
|
||||
}
|
||||
} else {
|
||||
for (WorldmapSegment segment : this) {
|
||||
segment.writable = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
public File worldmapFile;
|
||||
public GameSource parent;
|
||||
|
||||
private void loadFromFile(File file) {
|
||||
if (!file.exists()) return;
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
Document doc;
|
||||
try {
|
||||
factory.setIgnoringComments(true);
|
||||
factory.setIgnoringElementContentWhitespace(true);
|
||||
factory.setExpandEntityReferences(false);
|
||||
DocumentBuilder builder = factory.newDocumentBuilder();
|
||||
InputSource insrc = new InputSource(new FileInputStream(file));
|
||||
insrc.setSystemId("http://worldmap/");
|
||||
insrc.setEncoding("UTF-8");
|
||||
doc = builder.parse(insrc);
|
||||
|
||||
Element root = (Element) doc.getElementsByTagName("worldmap").item(0);
|
||||
if (root != null) {
|
||||
NodeList segmentsList = root.getElementsByTagName("segment");
|
||||
if (segmentsList != null) {
|
||||
for (int i = 0; i < segmentsList.getLength(); i++) {
|
||||
Element segmentNode = (Element) segmentsList.item(i);
|
||||
String name = segmentNode.getAttribute("id");
|
||||
add(new WorldmapSegment(this, name, segmentNode));
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SAXException e) {
|
||||
e.printStackTrace();
|
||||
} catch (FileNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (ParserConfigurationException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
public Map<String, Map<String, Point>> segments = new LinkedHashMap<String, Map<String, Point>>();
|
||||
|
||||
@Override
|
||||
public Enumeration<WorldmapSegment> children() {
|
||||
return Collections.enumeration(this);
|
||||
}
|
||||
public Worldmap(GameSource gameSource) {
|
||||
this.parent = gameSource;
|
||||
if (getDataType() == Type.source) {
|
||||
worldmapFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||
} else {
|
||||
worldmapFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||
}
|
||||
if (worldmapFile.exists()) {
|
||||
loadFromFile(worldmapFile);
|
||||
}
|
||||
if (getDataType() == Type.source) {
|
||||
for (WorldmapSegment segment : this) {
|
||||
segment.writable = false;
|
||||
}
|
||||
} else {
|
||||
for (WorldmapSegment segment : this) {
|
||||
segment.writable = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
private void loadFromFile(File file) {
|
||||
if (!file.exists()) return;
|
||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||
Document doc;
|
||||
try {
|
||||
factory.setIgnoringComments(true);
|
||||
factory.setIgnoringElementContentWhitespace(true);
|
||||
factory.setExpandEntityReferences(false);
|
||||
DocumentBuilder builder = factory.newDocumentBuilder();
|
||||
InputSource insrc = new InputSource(new FileInputStream(file));
|
||||
insrc.setSystemId("http://worldmap/");
|
||||
insrc.setEncoding("UTF-8");
|
||||
doc = builder.parse(insrc);
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return get(arg0);
|
||||
}
|
||||
Element root = (Element) doc.getElementsByTagName("worldmap").item(0);
|
||||
if (root != null) {
|
||||
NodeList segmentsList = root.getElementsByTagName("segment");
|
||||
if (segmentsList != null) {
|
||||
for (int i = 0; i < segmentsList.getLength(); i++) {
|
||||
Element segmentNode = (Element) segmentsList.item(i);
|
||||
String name = segmentNode.getAttribute("id");
|
||||
add(new WorldmapSegment(this, name, segmentNode));
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SAXException e) {
|
||||
e.printStackTrace();
|
||||
} catch (FileNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (ParserConfigurationException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return size();
|
||||
}
|
||||
@Override
|
||||
public Enumeration<WorldmapSegment> children() {
|
||||
return Collections.enumeration(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return indexOf(arg0);
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return get(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return indexOf(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+"Worldmap";
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getMapClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getMapClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getMapOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + "Worldmap";
|
||||
}
|
||||
|
||||
public void save() {
|
||||
|
||||
try {
|
||||
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
||||
doc.setXmlVersion("1.0");
|
||||
Element root = doc.createElement("worldmap");
|
||||
doc.appendChild(root);
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
|
||||
for (WorldmapSegment segment : this) {
|
||||
root.appendChild(segment.toXmlElement(doc));
|
||||
segment.state = GameDataElement.State.saved;
|
||||
}
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
saveDocToFile(doc, worldmapFile);
|
||||
} catch (ParserConfigurationException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getMapClosedIcon();
|
||||
}
|
||||
|
||||
public WorldmapSegment getWorldmapSegment(String id) {
|
||||
for (WorldmapSegment s : this) {
|
||||
if (s.id.equals(id)) {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addSegment(WorldmapSegment node) {
|
||||
ProjectTreeNode higherEmptyParent = this;
|
||||
while (higherEmptyParent != null) {
|
||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode)higherEmptyParent.getParent()).isEmpty()) higherEmptyParent = (ProjectTreeNode)higherEmptyParent.getParent();
|
||||
else break;
|
||||
}
|
||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||
add(node);
|
||||
node.parent = this;
|
||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||
else node.notifyCreated();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getMapClosedIcon();
|
||||
}
|
||||
|
||||
|
||||
public static void saveDocToFile(Document doc, File f) {
|
||||
try {
|
||||
Transformer transformer = TransformerFactory.newInstance().newTransformer();
|
||||
Result output = new StreamResult(new FileOutputStream(f));
|
||||
Source input = new DOMSource(doc);
|
||||
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
|
||||
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||
transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
|
||||
transformer.transform(input, output);
|
||||
} catch (TransformerConfigurationException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (TransformerFactoryConfigurationError e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (FileNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (TransformerException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getMapOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
public void save() {
|
||||
|
||||
try {
|
||||
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
||||
doc.setXmlVersion("1.0");
|
||||
Element root = doc.createElement("worldmap");
|
||||
doc.appendChild(root);
|
||||
|
||||
for (WorldmapSegment segment : this) {
|
||||
root.appendChild(segment.toXmlElement(doc));
|
||||
segment.state = GameDataElement.State.saved;
|
||||
}
|
||||
|
||||
saveDocToFile(doc, worldmapFile);
|
||||
} catch (ParserConfigurationException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public WorldmapSegment getWorldmapSegment(String id) {
|
||||
for (WorldmapSegment s : this) {
|
||||
if (s.id.equals(id)) {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addSegment(WorldmapSegment node) {
|
||||
ProjectTreeNode higherEmptyParent = this;
|
||||
while (higherEmptyParent != null) {
|
||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode) higherEmptyParent.getParent()).isEmpty())
|
||||
higherEmptyParent = (ProjectTreeNode) higherEmptyParent.getParent();
|
||||
else break;
|
||||
}
|
||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||
add(node);
|
||||
node.parent = this;
|
||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||
else node.notifyCreated();
|
||||
}
|
||||
|
||||
|
||||
public static void saveDocToFile(Document doc, File f) {
|
||||
try {
|
||||
Transformer transformer = TransformerFactory.newInstance().newTransformer();
|
||||
Result output = new StreamResult(new FileOutputStream(f));
|
||||
Source input = new DOMSource(doc);
|
||||
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
|
||||
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||
transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
|
||||
transformer.transform(input, output);
|
||||
} catch (TransformerConfigurationException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (TransformerFactoryConfigurationError e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (FileNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (TransformerException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : this) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : this) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,240 +1,233 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.awt.Point;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.transform.OutputKeys;
|
||||
import javax.xml.transform.Result;
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.ATContentStudio;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.transform.*;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
import java.awt.*;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class WorldmapSegment extends GameDataElement {
|
||||
|
||||
private static final long serialVersionUID = 2658610076889592723L;
|
||||
|
||||
public static final String TEMP_LABEL_KEY = "ATCS_INTERNAL_TEMPORARY_KEY_FOR_LABEL";
|
||||
|
||||
public int segmentX;
|
||||
public int segmentY;
|
||||
public Map<String, Point> mapLocations = new LinkedHashMap<String, Point>();
|
||||
public Map<String, List<String>> labelledMaps = new LinkedHashMap<String, List<String>>();
|
||||
public Map<String, NamedArea> labels = new LinkedHashMap<String, NamedArea>();
|
||||
public Element xmlNode;
|
||||
|
||||
public WorldmapSegment(Worldmap parent, String name, Element xmlNode) {
|
||||
this.parent = parent;
|
||||
this.id = name;
|
||||
this.xmlNode = xmlNode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return parent.getDataSet();
|
||||
}
|
||||
private static final long serialVersionUID = 2658610076889592723L;
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+id;
|
||||
}
|
||||
public static final String TEMP_LABEL_KEY = "ATCS_INTERNAL_TEMPORARY_KEY_FOR_LABEL";
|
||||
|
||||
@Override
|
||||
public void parse() {
|
||||
segmentX = Integer.parseInt(xmlNode.getAttribute("x"));
|
||||
segmentY = Integer.parseInt(xmlNode.getAttribute("y"));
|
||||
NodeList mapsList = xmlNode.getElementsByTagName("map");
|
||||
for (int j = 0; j < mapsList.getLength(); j++) {
|
||||
Element mapNode = (Element) mapsList.item(j);
|
||||
mapLocations.put(mapNode.getAttribute("id"), new Point(Integer.parseInt(mapNode.getAttribute("x")) - segmentX, Integer.parseInt(mapNode.getAttribute("y")) - segmentY));
|
||||
String area;
|
||||
if ((area = mapNode.getAttribute("area")) != null && !"".equals(area)) {
|
||||
if (labelledMaps.get(area) == null) {
|
||||
labelledMaps.put(area, new ArrayList<String>());
|
||||
}
|
||||
labelledMaps.get(area).add(mapNode.getAttribute("id"));
|
||||
}
|
||||
}
|
||||
NodeList namedAreasNodeList = xmlNode.getElementsByTagName("namedarea");
|
||||
for (int j = 0; j < namedAreasNodeList.getLength(); j++) {
|
||||
Element namedAreaNode = (Element) namedAreasNodeList.item(j);
|
||||
labels.put(namedAreaNode.getAttribute("id"), new NamedArea(namedAreaNode.getAttribute("id"), namedAreaNode.getAttribute("name"), namedAreaNode.getAttribute("type")));
|
||||
}
|
||||
this.state = State.parsed;
|
||||
}
|
||||
public int segmentX;
|
||||
public int segmentY;
|
||||
public Map<String, Point> mapLocations = new LinkedHashMap<String, Point>();
|
||||
public Map<String, List<String>> labelledMaps = new LinkedHashMap<String, List<String>>();
|
||||
public Map<String, NamedArea> labels = new LinkedHashMap<String, NamedArea>();
|
||||
public Element xmlNode;
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == State.init) {
|
||||
this.parse();
|
||||
} else if (this.state == State.linked) {
|
||||
return;
|
||||
}
|
||||
for (String mapName : mapLocations.keySet()) {
|
||||
if (getProject().getMap(mapName) != null) {
|
||||
getProject().getMap(mapName).addBacklink(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
public WorldmapSegment(Worldmap parent, String name, Element xmlNode) {
|
||||
this.parent = parent;
|
||||
this.id = name;
|
||||
this.xmlNode = xmlNode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WorldmapSegment clone() {
|
||||
WorldmapSegment clone = new WorldmapSegment((Worldmap)parent, id, (Element) xmlNode.cloneNode(true));
|
||||
|
||||
return clone;
|
||||
}
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return parent.getDataSet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
boolean modified = false;
|
||||
if (newOne == null && writable) {
|
||||
//A referenced map may have been deleted.
|
||||
if (mapLocations.containsKey(oldOne.id)) {
|
||||
mapLocations.remove(oldOne.id);
|
||||
modified = true;
|
||||
}
|
||||
List<String> deprecatedLabels = new ArrayList<String>();
|
||||
for (String label : labelledMaps.keySet()) {
|
||||
if (labelledMaps.get(label).contains(oldOne.id)) {
|
||||
labelledMaps.get(label).remove(oldOne.id);
|
||||
modified = true;
|
||||
if (labelledMaps.get(label).isEmpty()) {
|
||||
deprecatedLabels.add(label);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (String label : deprecatedLabels) {
|
||||
labelledMaps.remove(label);
|
||||
labels.remove(label);
|
||||
}
|
||||
}
|
||||
|
||||
oldOne.removeBacklink(this);
|
||||
if(newOne != null) newOne.addBacklink(this);
|
||||
|
||||
if (modified) {
|
||||
this.state = GameDataElement.State.modified;
|
||||
childrenChanged(new ArrayList<ProjectTreeNode>());
|
||||
ATContentStudio.frame.editorChanged(this);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "worldmap.xml";
|
||||
}
|
||||
@Override
|
||||
public void parse() {
|
||||
segmentX = Integer.parseInt(xmlNode.getAttribute("x"));
|
||||
segmentY = Integer.parseInt(xmlNode.getAttribute("y"));
|
||||
NodeList mapsList = xmlNode.getElementsByTagName("map");
|
||||
for (int j = 0; j < mapsList.getLength(); j++) {
|
||||
Element mapNode = (Element) mapsList.item(j);
|
||||
mapLocations.put(mapNode.getAttribute("id"), new Point(Integer.parseInt(mapNode.getAttribute("x")) - segmentX, Integer.parseInt(mapNode.getAttribute("y")) - segmentY));
|
||||
String area;
|
||||
if ((area = mapNode.getAttribute("area")) != null && !"".equals(area)) {
|
||||
if (labelledMaps.get(area) == null) {
|
||||
labelledMaps.put(area, new ArrayList<String>());
|
||||
}
|
||||
labelledMaps.get(area).add(mapNode.getAttribute("id"));
|
||||
}
|
||||
}
|
||||
NodeList namedAreasNodeList = xmlNode.getElementsByTagName("namedarea");
|
||||
for (int j = 0; j < namedAreasNodeList.getLength(); j++) {
|
||||
Element namedAreaNode = (Element) namedAreasNodeList.item(j);
|
||||
labels.put(namedAreaNode.getAttribute("id"), new NamedArea(namedAreaNode.getAttribute("id"), namedAreaNode.getAttribute("name"), namedAreaNode.getAttribute("type")));
|
||||
}
|
||||
this.state = State.parsed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
((Worldmap)parent).save();
|
||||
}
|
||||
|
||||
public String toXml() {
|
||||
Document doc;
|
||||
try {
|
||||
doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
||||
doc.setXmlVersion("1.0");
|
||||
Element root = doc.createElement("worldmap");
|
||||
doc.appendChild(root);
|
||||
root.appendChild(this.toXmlElement(doc));
|
||||
Transformer transformer = TransformerFactory.newInstance().newTransformer();
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
Result output = new StreamResult(baos);
|
||||
Source input = new DOMSource(doc);
|
||||
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
|
||||
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||
transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
|
||||
transformer.transform(input, output);
|
||||
return baos.toString();
|
||||
} catch (ParserConfigurationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (TransformerException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
public Element toXmlElement(Document doc) {
|
||||
Element element = doc.createElement("segment");
|
||||
element.setAttribute("id", id);
|
||||
element.setAttribute("x", Integer.toString(segmentX));
|
||||
element.setAttribute("y", Integer.toString(segmentY));
|
||||
|
||||
for (String s : mapLocations.keySet()) {
|
||||
Element map = doc.createElement("map");
|
||||
map.setAttribute("id", s);
|
||||
map.setAttribute("x", Integer.toString(mapLocations.get(s).x + segmentX));
|
||||
map.setAttribute("y", Integer.toString(mapLocations.get(s).y + segmentY));
|
||||
for (String label : labelledMaps.keySet()) {
|
||||
if (TEMP_LABEL_KEY.equals(label)) continue;
|
||||
if (labelledMaps.get(label).contains(s)) {
|
||||
map.setAttribute("area", label);
|
||||
}
|
||||
}
|
||||
element.appendChild(map);
|
||||
}
|
||||
|
||||
for (String key : labels.keySet()) {
|
||||
if (TEMP_LABEL_KEY.equals(key)) continue;
|
||||
NamedArea area = labels.get(key);
|
||||
Element namedArea = doc.createElement("namedarea");
|
||||
namedArea.setAttribute("id", area.id);
|
||||
namedArea.setAttribute("name", area.name);
|
||||
namedArea.setAttribute("type", area.type);
|
||||
element.appendChild(namedArea);
|
||||
}
|
||||
|
||||
return element;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == State.init) {
|
||||
this.parse();
|
||||
} else if (this.state == State.linked) {
|
||||
return;
|
||||
}
|
||||
for (String mapName : mapLocations.keySet()) {
|
||||
if (getProject().getMap(mapName) != null) {
|
||||
getProject().getMap(mapName).addBacklink(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaveEvent> attemptSave() {
|
||||
// TODO Auto-generated method stub
|
||||
save();
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public WorldmapSegment clone() {
|
||||
WorldmapSegment clone = new WorldmapSegment((Worldmap) parent, id, (Element) xmlNode.cloneNode(true));
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
boolean modified = false;
|
||||
if (newOne == null && writable) {
|
||||
//A referenced map may have been deleted.
|
||||
if (mapLocations.containsKey(oldOne.id)) {
|
||||
mapLocations.remove(oldOne.id);
|
||||
modified = true;
|
||||
}
|
||||
List<String> deprecatedLabels = new ArrayList<String>();
|
||||
for (String label : labelledMaps.keySet()) {
|
||||
if (labelledMaps.get(label).contains(oldOne.id)) {
|
||||
labelledMaps.get(label).remove(oldOne.id);
|
||||
modified = true;
|
||||
if (labelledMaps.get(label).isEmpty()) {
|
||||
deprecatedLabels.add(label);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (String label : deprecatedLabels) {
|
||||
labelledMaps.remove(label);
|
||||
labels.remove(label);
|
||||
}
|
||||
}
|
||||
|
||||
oldOne.removeBacklink(this);
|
||||
if (newOne != null) newOne.addBacklink(this);
|
||||
|
||||
if (modified) {
|
||||
this.state = GameDataElement.State.modified;
|
||||
childrenChanged(new ArrayList<ProjectTreeNode>());
|
||||
ATContentStudio.frame.editorChanged(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return "worldmap.xml";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
((Worldmap) parent).save();
|
||||
}
|
||||
|
||||
public String toXml() {
|
||||
Document doc;
|
||||
try {
|
||||
doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
||||
doc.setXmlVersion("1.0");
|
||||
Element root = doc.createElement("worldmap");
|
||||
doc.appendChild(root);
|
||||
root.appendChild(this.toXmlElement(doc));
|
||||
Transformer transformer = TransformerFactory.newInstance().newTransformer();
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
Result output = new StreamResult(baos);
|
||||
Source input = new DOMSource(doc);
|
||||
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
|
||||
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||
transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
|
||||
transformer.transform(input, output);
|
||||
return baos.toString();
|
||||
} catch (ParserConfigurationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (TransformerException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
public Element toXmlElement(Document doc) {
|
||||
Element element = doc.createElement("segment");
|
||||
element.setAttribute("id", id);
|
||||
element.setAttribute("x", Integer.toString(segmentX));
|
||||
element.setAttribute("y", Integer.toString(segmentY));
|
||||
|
||||
for (String s : mapLocations.keySet()) {
|
||||
Element map = doc.createElement("map");
|
||||
map.setAttribute("id", s);
|
||||
map.setAttribute("x", Integer.toString(mapLocations.get(s).x + segmentX));
|
||||
map.setAttribute("y", Integer.toString(mapLocations.get(s).y + segmentY));
|
||||
for (String label : labelledMaps.keySet()) {
|
||||
if (TEMP_LABEL_KEY.equals(label)) continue;
|
||||
if (labelledMaps.get(label).contains(s)) {
|
||||
map.setAttribute("area", label);
|
||||
}
|
||||
}
|
||||
element.appendChild(map);
|
||||
}
|
||||
|
||||
for (String key : labels.keySet()) {
|
||||
if (TEMP_LABEL_KEY.equals(key)) continue;
|
||||
NamedArea area = labels.get(key);
|
||||
Element namedArea = doc.createElement("namedarea");
|
||||
namedArea.setAttribute("id", area.id);
|
||||
namedArea.setAttribute("name", area.name);
|
||||
namedArea.setAttribute("type", area.type);
|
||||
element.appendChild(namedArea);
|
||||
}
|
||||
|
||||
return element;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<SaveEvent> attemptSave() {
|
||||
// TODO Auto-generated method stub
|
||||
save();
|
||||
return null;
|
||||
}
|
||||
|
||||
public static class NamedArea {
|
||||
public String id;
|
||||
public String name;
|
||||
public String type;
|
||||
|
||||
public NamedArea(String id, String name, String type) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getUIMapIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getUIMapIcon();
|
||||
}
|
||||
|
||||
public static class NamedArea {
|
||||
public String id;
|
||||
public String name;
|
||||
public String type;
|
||||
|
||||
public NamedArea(String id, String name, String type) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getUIMapIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getUIMapIcon();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,177 +0,0 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.saves;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.andorstrainer.io.SavedGameIO;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
public class SavedGame extends GameDataElement {
|
||||
|
||||
private static final long serialVersionUID = -6443495534761084990L;
|
||||
|
||||
public File savedFile;
|
||||
transient public com.gpl.rpg.andorstrainer.model.SavedGame loadedSave = null;
|
||||
transient public SavedGamesSet parent;
|
||||
|
||||
public SavedGame(SavedGamesSet parent, File f) throws IOException {
|
||||
savedFile = f;
|
||||
refreshTransients(parent);
|
||||
}
|
||||
|
||||
public void refreshTransients(SavedGamesSet parent) throws IOException {
|
||||
this.parent = parent;
|
||||
this.loadedSave = SavedGameIO.loadFile(savedFile);
|
||||
if (this.loadedSave == null) {
|
||||
throw new IOException("Unable to load save: "+savedFile.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+loadedSave.displayInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getHeroIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getHeroIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {return null;}
|
||||
@Override
|
||||
public Image getOpenIcon() {return null;}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parse() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaveEvent> attemptSave() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,180 +0,0 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.saves;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
public class SavedGamesSet implements ProjectTreeNode, Serializable {
|
||||
|
||||
private static final long serialVersionUID = -6565834239789184087L;
|
||||
|
||||
public Vector<SavedGame> saves; //For simulations.
|
||||
|
||||
public Project parent;
|
||||
|
||||
public SavedGamesSet(Project parent) {
|
||||
this.parent = parent;
|
||||
saves = new Vector<SavedGame>();
|
||||
}
|
||||
|
||||
public void refreshTransients() {
|
||||
for (SavedGame save : saves) {
|
||||
try {
|
||||
save.refreshTransients(this);
|
||||
} catch (IOException e) {
|
||||
Notification.addError(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void addSave(File f) {
|
||||
try {
|
||||
ProjectTreeNode higherEmptyParent = this;
|
||||
while (higherEmptyParent != null) {
|
||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode)higherEmptyParent.getParent()).isEmpty()) higherEmptyParent = (ProjectTreeNode)higherEmptyParent.getParent();
|
||||
else break;
|
||||
}
|
||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||
SavedGame node = new SavedGame(this, f);
|
||||
saves.add(node);
|
||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||
else node.notifyCreated();
|
||||
} catch (IOException e) {
|
||||
Notification.addError(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public SavedGame getSave(File f) {
|
||||
for (SavedGame save : saves) {
|
||||
if (save.savedFile.equals(f)) return save;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<? extends ProjectTreeNode> children() {
|
||||
return saves.elements();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return saves.elementAt(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return saves.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return saves.indexOf(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (SavedGame s : saves) {
|
||||
s.notifyCreated();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+"Saved games";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getSavClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getSavClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getSavOpenIcon();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return saves.isEmpty();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : saves) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,5 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.sprites;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
@@ -16,147 +7,169 @@ import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
|
||||
public class SpriteSheetSet implements ProjectTreeNode {
|
||||
|
||||
public static final String DEFAULT_REL_PATH_IN_SOURCE = "res"+File.separator+"drawable"+File.separator;
|
||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "spritesheets"+File.separator;
|
||||
|
||||
public File drawableFolder = null;
|
||||
|
||||
public transient List<Spritesheet> spritesheets;
|
||||
public static final String DEFAULT_REL_PATH_IN_SOURCE = "res" + File.separator + "drawable" + File.separator;
|
||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "spritesheets" + File.separator;
|
||||
|
||||
public GameSource parent;
|
||||
|
||||
public SpriteSheetSet(GameSource source) {
|
||||
this.parent = source;
|
||||
if (source.type == GameSource.Type.source) this.drawableFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||
else if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||
this.drawableFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||
if (!this.drawableFolder.exists()) {
|
||||
this.drawableFolder.mkdirs();
|
||||
}
|
||||
}
|
||||
spritesheets = new ArrayList<Spritesheet>();
|
||||
if (this.drawableFolder != null) {
|
||||
for (File f : this.drawableFolder.listFiles()) {
|
||||
if (f.getName().endsWith(".png") || f.getName().endsWith(".PNG")) {
|
||||
spritesheets.add(new Spritesheet(this, f));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<Spritesheet> children() {
|
||||
return Collections.enumeration(spritesheets);
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return spritesheets.get(arg0);
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return spritesheets.size();
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return spritesheets.indexOf(arg0);
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (Spritesheet s : spritesheets) {
|
||||
s.notifyCreated();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+"Spritesheets";
|
||||
}
|
||||
public File drawableFolder = null;
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getSpriteClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getSpriteClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getSpriteOpenIcon();
|
||||
}
|
||||
public transient List<Spritesheet> spritesheets;
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return spritesheets.isEmpty();
|
||||
}
|
||||
public GameSource parent;
|
||||
|
||||
public Spritesheet getSpritesheet(String id) {
|
||||
if (spritesheets == null) return null;
|
||||
for (Spritesheet sheet : spritesheets) {
|
||||
if (id.equals(sheet.id)){
|
||||
return sheet;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : spritesheets) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public SpriteSheetSet(GameSource source) {
|
||||
this.parent = source;
|
||||
if (source.type == GameSource.Type.source)
|
||||
this.drawableFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||
else if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||
this.drawableFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||
if (!this.drawableFolder.exists()) {
|
||||
this.drawableFolder.mkdirs();
|
||||
}
|
||||
}
|
||||
spritesheets = new ArrayList<Spritesheet>();
|
||||
if (this.drawableFolder != null) {
|
||||
for (File f : this.drawableFolder.listFiles()) {
|
||||
if (f.getName().endsWith(".png") || f.getName().endsWith(".PNG")) {
|
||||
spritesheets.add(new Spritesheet(this, f));
|
||||
}
|
||||
}
|
||||
}
|
||||
spritesheets.sort(Comparator.comparing(s -> s.id));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<Spritesheet> children() {
|
||||
return Collections.enumeration(spritesheets);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return spritesheets.get(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return spritesheets.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return spritesheets.indexOf(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||
} else {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
for (Spritesheet s : spritesheets) {
|
||||
s.notifyCreated();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + "Spritesheets";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getSpriteClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return DefaultIcons.getSpriteClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getSpriteOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return spritesheets.isEmpty();
|
||||
}
|
||||
|
||||
public Spritesheet getSpritesheet(String id) {
|
||||
if (spritesheets == null) return null;
|
||||
for (Spritesheet sheet : spritesheets) {
|
||||
if (id.equals(sheet.id)) {
|
||||
return sheet;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : spritesheets) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,5 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.sprites;
|
||||
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Image;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.ATContentStudio;
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
@@ -23,250 +9,281 @@ import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
public class Spritesheet extends GameDataElement {
|
||||
|
||||
private static final long serialVersionUID = -5981708088278528586L;
|
||||
|
||||
public SpriteSheetSet parent;
|
||||
public File spritesheetFile;
|
||||
public int spriteWidth = 32;
|
||||
public int spriteHeight = 32;
|
||||
public String id;
|
||||
public Category category = Category.none;
|
||||
public boolean animated = false;
|
||||
|
||||
public enum Category {
|
||||
none,
|
||||
monster,
|
||||
item,
|
||||
actorcondition
|
||||
};
|
||||
|
||||
//Lazy initialization.
|
||||
public BufferedImage spritesheet = null;
|
||||
public Map<Integer, BufferedImage> cache_full_size = new LinkedHashMap<Integer, BufferedImage>();
|
||||
public Map<Integer, Image> cache_icon = new LinkedHashMap<Integer, Image>();
|
||||
|
||||
public Spritesheet(SpriteSheetSet parent, File f) {
|
||||
this.spritesheetFile = f;
|
||||
this.id = f.getName().substring(0, f.getName().lastIndexOf("."));
|
||||
this.parent = parent;
|
||||
|
||||
String cat = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".category");
|
||||
if (cat != null) {
|
||||
this.category = Category.valueOf(cat);
|
||||
}
|
||||
String sizex = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".sizex");
|
||||
if (sizex != null) {
|
||||
this.spriteWidth = Integer.parseInt(sizex);
|
||||
}
|
||||
String sizey = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".sizey");
|
||||
if (sizey != null) {
|
||||
this.spriteHeight = Integer.parseInt(sizey);
|
||||
}
|
||||
String anim = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".animate");
|
||||
if (anim != null) {
|
||||
this.animated = Boolean.parseBoolean(anim);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+spritesheetFile.getName();
|
||||
}
|
||||
private static final long serialVersionUID = -5981708088278528586L;
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
public int getSpriteCount() {
|
||||
if (spritesheet == null) {
|
||||
try {
|
||||
spritesheet = ImageIO.read(spritesheetFile);
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error loading image "+spritesheetFile.getAbsolutePath()+" : "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return (int) (Math.ceil(((double)spritesheet.getWidth()) / ((double)spriteWidth)) * Math.ceil(((double)spritesheet.getHeight()) / ((double)spriteHeight)));
|
||||
}
|
||||
|
||||
public BufferedImage getImage(int index) {
|
||||
if (spritesheet == null) {
|
||||
try {
|
||||
spritesheet = ImageIO.read(spritesheetFile);
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error loading image "+spritesheetFile.getAbsolutePath()+" : "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
if (cache_full_size.get(index) != null) {
|
||||
return cache_full_size.get(index);
|
||||
}
|
||||
BufferedImage result = new BufferedImage(spriteWidth, spriteHeight, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics g = result.getGraphics();
|
||||
int sx1, sy1;
|
||||
sx1 = (index * spriteWidth) % spritesheet.getWidth();
|
||||
sy1 = spriteHeight * ((index * spriteWidth) / spritesheet.getWidth());
|
||||
if (sx1 + spriteWidth > spritesheet.getWidth() || sy1 + spriteHeight > spritesheet.getHeight()) {
|
||||
g.finalize();
|
||||
return null;
|
||||
}
|
||||
g.drawImage(spritesheet, 0, 0, spriteWidth, spriteHeight, sx1, sy1, sx1 + spriteWidth, sy1 + spriteHeight, null);
|
||||
result.flush();
|
||||
g.finalize();
|
||||
cache_full_size.put(index, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public Image getIcon(int index) {
|
||||
if (cache_icon.get(index) != null) {
|
||||
return cache_icon.get(index);
|
||||
}
|
||||
Image result = getImage(index);
|
||||
if (result == null) return null;
|
||||
result = result.getScaledInstance((int)(16*ATContentStudio.SCALING), (int)(16*ATContentStudio.SCALING), Image.SCALE_SMOOTH);
|
||||
cache_icon.put(index, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public void clearCache() {
|
||||
cache_full_size.clear();
|
||||
cache_icon.clear();
|
||||
}
|
||||
|
||||
public SpriteSheetSet parent;
|
||||
public File spritesheetFile;
|
||||
public int spriteWidth = 32;
|
||||
public int spriteHeight = 32;
|
||||
public String id;
|
||||
public Category category = Category.none;
|
||||
public boolean animated = false;
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getIcon(0);
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return getIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {return null;}
|
||||
@Override
|
||||
public Image getOpenIcon() {return null;}
|
||||
public enum Category {
|
||||
none,
|
||||
monster,
|
||||
item,
|
||||
actorcondition
|
||||
}
|
||||
|
||||
//Lazy initialization.
|
||||
public BufferedImage spritesheet = null;
|
||||
public Map<Integer, BufferedImage> cache_full_size = new LinkedHashMap<Integer, BufferedImage>();
|
||||
public Map<Integer, Image> cache_icon = new LinkedHashMap<Integer, Image>();
|
||||
|
||||
public Spritesheet(SpriteSheetSet parent, File f) {
|
||||
this.spritesheetFile = f;
|
||||
this.id = f.getName().substring(0, f.getName().lastIndexOf("."));
|
||||
this.parent = parent;
|
||||
|
||||
String cat = getProject().getSpritesheetsProperty("atcs.spritesheet." + this.id + ".category");
|
||||
if (cat != null) {
|
||||
this.category = Category.valueOf(cat);
|
||||
}
|
||||
String sizex = getProject().getSpritesheetsProperty("atcs.spritesheet." + this.id + ".sizex");
|
||||
if (sizex != null) {
|
||||
this.spriteWidth = Integer.parseInt(sizex);
|
||||
}
|
||||
String sizey = getProject().getSpritesheetsProperty("atcs.spritesheet." + this.id + ".sizey");
|
||||
if (sizey != null) {
|
||||
this.spriteHeight = Integer.parseInt(sizey);
|
||||
}
|
||||
String anim = getProject().getSpritesheetsProperty("atcs.spritesheet." + this.id + ".animate");
|
||||
if (anim != null) {
|
||||
this.animated = Boolean.parseBoolean(anim);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int arg0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode arg0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + spritesheetFile.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
public int getSpriteCount() {
|
||||
if (spritesheet == null) {
|
||||
try {
|
||||
spritesheet = ImageIO.read(spritesheetFile);
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error loading image " + spritesheetFile.getAbsolutePath() + " : " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return (int) (Math.ceil(((double) spritesheet.getWidth()) / ((double) spriteWidth)) * Math.ceil(((double) spritesheet.getHeight()) / ((double) spriteHeight)));
|
||||
}
|
||||
|
||||
public BufferedImage getImage(int index) {
|
||||
if (spritesheet == null) {
|
||||
try {
|
||||
spritesheet = ImageIO.read(spritesheetFile);
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error loading image " + spritesheetFile.getAbsolutePath() + " : " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
if (cache_full_size.get(index) != null) {
|
||||
return cache_full_size.get(index);
|
||||
}
|
||||
BufferedImage result = new BufferedImage(spriteWidth, spriteHeight, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics g = result.getGraphics();
|
||||
int sx1, sy1;
|
||||
sx1 = (index * spriteWidth) % spritesheet.getWidth();
|
||||
sy1 = spriteHeight * ((index * spriteWidth) / spritesheet.getWidth());
|
||||
if (sx1 + spriteWidth > spritesheet.getWidth() || sy1 + spriteHeight > spritesheet.getHeight()) {
|
||||
g.finalize();
|
||||
return null;
|
||||
}
|
||||
g.drawImage(spritesheet, 0, 0, spriteWidth, spriteHeight, sx1, sy1, sx1 + spriteWidth, sy1 + spriteHeight, null);
|
||||
result.flush();
|
||||
g.finalize();
|
||||
cache_full_size.put(index, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public Image getIcon(int index) {
|
||||
if (cache_icon.get(index) != null) {
|
||||
return cache_icon.get(index);
|
||||
}
|
||||
Image result = getImage(index);
|
||||
if (result == null) return null;
|
||||
result = result.getScaledInstance((int) (16 * ATContentStudio.SCALING), (int) (16 * ATContentStudio.SCALING), Image.SCALE_SMOOTH);
|
||||
cache_icon.put(index, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public void clearCache() {
|
||||
cache_full_size.clear();
|
||||
cache_icon.clear();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parse() {
|
||||
if(this.state == GameDataElement.State.init){
|
||||
this.state = GameDataElement.State.parsed;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getIcon(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == GameDataElement.State.init) {
|
||||
this.parse();
|
||||
}
|
||||
if(this.state == GameDataElement.State.parsed) {
|
||||
this.state = GameDataElement.State.linked;
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return getIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
Spritesheet clone = new Spritesheet((SpriteSheetSet) getParent(), new File(spritesheetFile.getAbsolutePath()));
|
||||
clone.id = this.id;
|
||||
clone.animated = this.animated;
|
||||
clone.category = this.category;
|
||||
clone.spriteWidth = this.spriteWidth;
|
||||
clone.spriteHeight = this.spriteHeight;
|
||||
return clone;
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
//nothing linked.
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return spritesheetFile.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
if (this.category != null) getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".category", this.category.toString());
|
||||
if (this.spriteWidth != 32) getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".sizex", Integer.toString(this.spriteWidth));
|
||||
if (this.spriteHeight != 32) getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".sizey", Integer.toString(this.spriteHeight));
|
||||
if (this.animated)getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".animate", Boolean.toString(this.animated));
|
||||
getProject().save();
|
||||
|
||||
this.state = GameDataElement.State.saved;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaveEvent> attemptSave() {
|
||||
save();
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parse() {
|
||||
if (this.state == GameDataElement.State.init) {
|
||||
this.state = GameDataElement.State.parsed;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
if (this.state == GameDataElement.State.init) {
|
||||
this.parse();
|
||||
}
|
||||
if (this.state == GameDataElement.State.parsed) {
|
||||
this.state = GameDataElement.State.linked;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
Spritesheet clone = new Spritesheet((SpriteSheetSet) getParent(), new File(spritesheetFile.getAbsolutePath()));
|
||||
clone.id = this.id;
|
||||
clone.animated = this.animated;
|
||||
clone.category = this.category;
|
||||
clone.spriteWidth = this.spriteWidth;
|
||||
clone.spriteHeight = this.spriteHeight;
|
||||
return clone;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
//nothing linked.
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return spritesheetFile.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
if (this.category != null)
|
||||
getProject().setSpritesheetsProperty("atcs.spritesheet." + this.id + ".category", this.category.toString());
|
||||
if (this.spriteWidth != 32)
|
||||
getProject().setSpritesheetsProperty("atcs.spritesheet." + this.id + ".sizex", Integer.toString(this.spriteWidth));
|
||||
if (this.spriteHeight != 32)
|
||||
getProject().setSpritesheetsProperty("atcs.spritesheet." + this.id + ".sizey", Integer.toString(this.spriteHeight));
|
||||
if (this.animated)
|
||||
getProject().setSpritesheetsProperty("atcs.spritesheet." + this.id + ".animate", Boolean.toString(this.animated));
|
||||
getProject().save();
|
||||
|
||||
this.state = GameDataElement.State.saved;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaveEvent> attemptSave() {
|
||||
save();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,6 @@
|
||||
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.io.*;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedList;
|
||||
@@ -14,76 +9,76 @@ import java.util.Map;
|
||||
|
||||
public class PoPotWriter {
|
||||
|
||||
Map<String, List<String>> stringsResources = new LinkedHashMap<String, List<String>>();
|
||||
Map<String, String> translations = new LinkedHashMap<String, String>();
|
||||
File f;
|
||||
|
||||
public static void writePoFile(Map<String, List<String>> stringsResources, Map<String, String> translations, File destination) {
|
||||
try {
|
||||
Writer fw = new OutputStreamWriter(new FileOutputStream(destination), StandardCharsets.UTF_8);
|
||||
if (translations.get("") != null) {
|
||||
fw.write(translations.get(""));
|
||||
writeEndOfEntry(fw);
|
||||
}
|
||||
if (translations.get("translator-credits") != null) {
|
||||
List<String> refs = new LinkedList<String>();
|
||||
refs.add("[none]");
|
||||
writeReferences(fw, refs);
|
||||
writeMsgId(fw, "translator-credits");
|
||||
writeMsgStr(fw, translations.get("translator-credits"));
|
||||
writeEndOfEntry(fw);
|
||||
}
|
||||
for (String msg : stringsResources.keySet()) {
|
||||
writeReferences(fw, stringsResources.get(msg));
|
||||
writeMsgId(fw, msg);
|
||||
writeMsgStr(fw, translations.get(msg));
|
||||
writeEndOfEntry(fw);
|
||||
}
|
||||
fw.flush();
|
||||
fw.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void writePotFile(Map<String, List<String>> stringsResources, File destination) {
|
||||
try {
|
||||
FileWriter fw = new FileWriter(destination);
|
||||
for (String msg : stringsResources.keySet()) {
|
||||
writeReferences(fw, stringsResources.get(msg));
|
||||
writeMsgId(fw, msg);
|
||||
writeMsgStr(fw, "");
|
||||
writeEndOfEntry(fw);
|
||||
}
|
||||
fw.flush();
|
||||
fw.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static void writeReferences(Writer w, List<String> references) throws IOException {
|
||||
for (String ref : references) {
|
||||
w.write("#: ");
|
||||
w.write(ref);
|
||||
w.write("\n");
|
||||
}
|
||||
}
|
||||
|
||||
private static void writeMsgId(Writer w, String msg) throws IOException {
|
||||
w.write("msgid \"");
|
||||
w.write(msg);
|
||||
w.write("\"\n");
|
||||
}
|
||||
|
||||
private static void writeMsgStr(Writer w, String translation) throws IOException {
|
||||
w.write("msgstr \"");
|
||||
w.write(translation == null ? "" : translation);
|
||||
w.write("\"\n");
|
||||
}
|
||||
|
||||
private static void writeEndOfEntry(Writer w) throws IOException {
|
||||
w.write("\n");
|
||||
}
|
||||
|
||||
Map<String, List<String>> stringsResources = new LinkedHashMap<String, List<String>>();
|
||||
Map<String, String> translations = new LinkedHashMap<String, String>();
|
||||
File f;
|
||||
|
||||
public static void writePoFile(Map<String, List<String>> stringsResources, Map<String, String> translations, File destination) {
|
||||
try {
|
||||
Writer fw = new OutputStreamWriter(new FileOutputStream(destination), StandardCharsets.UTF_8);
|
||||
if (translations.get("") != null) {
|
||||
fw.write(translations.get(""));
|
||||
writeEndOfEntry(fw);
|
||||
}
|
||||
if (translations.get("translator-credits") != null) {
|
||||
List<String> refs = new LinkedList<String>();
|
||||
refs.add("[none]");
|
||||
writeReferences(fw, refs);
|
||||
writeMsgId(fw, "translator-credits");
|
||||
writeMsgStr(fw, translations.get("translator-credits"));
|
||||
writeEndOfEntry(fw);
|
||||
}
|
||||
for (String msg : stringsResources.keySet()) {
|
||||
writeReferences(fw, stringsResources.get(msg));
|
||||
writeMsgId(fw, msg);
|
||||
writeMsgStr(fw, translations.get(msg));
|
||||
writeEndOfEntry(fw);
|
||||
}
|
||||
fw.flush();
|
||||
fw.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static void writePotFile(Map<String, List<String>> stringsResources, File destination) {
|
||||
try {
|
||||
FileWriter fw = new FileWriter(destination);
|
||||
for (String msg : stringsResources.keySet()) {
|
||||
writeReferences(fw, stringsResources.get(msg));
|
||||
writeMsgId(fw, msg);
|
||||
writeMsgStr(fw, "");
|
||||
writeEndOfEntry(fw);
|
||||
}
|
||||
fw.flush();
|
||||
fw.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static void writeReferences(Writer w, List<String> references) throws IOException {
|
||||
for (String ref : references) {
|
||||
w.write("#: ");
|
||||
w.write(ref);
|
||||
w.write("\n");
|
||||
}
|
||||
}
|
||||
|
||||
private static void writeMsgId(Writer w, String msg) throws IOException {
|
||||
w.write("msgid \"");
|
||||
w.write(msg);
|
||||
w.write("\"\n");
|
||||
}
|
||||
|
||||
private static void writeMsgStr(Writer w, String translation) throws IOException {
|
||||
w.write("msgstr \"");
|
||||
w.write(translation == null ? "" : translation);
|
||||
w.write("\"\n");
|
||||
}
|
||||
|
||||
private static void writeEndOfEntry(Writer w) throws IOException {
|
||||
w.write("\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,310 +1,304 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.tools.i18n;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileFilter;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Vector;
|
||||
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
|
||||
import net.launchpad.tobal.poparser.POEntry;
|
||||
import net.launchpad.tobal.poparser.POFile;
|
||||
import net.launchpad.tobal.poparser.POParser;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.io.File;
|
||||
import java.io.FileFilter;
|
||||
import java.util.*;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Kevin
|
||||
*
|
||||
* <p>
|
||||
* To use this, paste the following script in the beanshell console of ATCS.
|
||||
* Don't forget to change the project number to suit your needs.
|
||||
*
|
||||
import com.gpl.rpg.atcontentstudio.model.Workspace;
|
||||
import com.gpl.rpg.atcontentstudio.model.tools.i18n.PotGenerator;
|
||||
import com.gpl.rpg.atcontentstudio.model.tools.i18n.PotComparator;
|
||||
|
||||
proj = Workspace.activeWorkspace.projects.get(7);
|
||||
PotGenerator.generatePotFileForProject(proj);
|
||||
comp = new PotComparator(proj);
|
||||
comp.compare();
|
||||
comp.updatePoFiles(proj);
|
||||
*
|
||||
*
|
||||
* <p>
|
||||
* <code>
|
||||
*
|
||||
* import com.gpl.rpg.atcontentstudio.model.Workspace;
|
||||
* import com.gpl.rpg.atcontentstudio.model.tools.i18n.PotGenerator;
|
||||
* import com.gpl.rpg.atcontentstudio.model.tools.i18n.PotComparator;
|
||||
*
|
||||
* proj = Workspace.activeWorkspace.projects.get(7);
|
||||
* PotGenerator.generatePotFileForProject(proj);
|
||||
* comp = new PotComparator(proj);
|
||||
* comp.compare();
|
||||
* comp.updatePoFiles(proj);
|
||||
* </code>
|
||||
*/
|
||||
public class PotComparator {
|
||||
|
||||
Map<String, List<String>> stringsResourcesNew = new LinkedHashMap<String, List<String>>();
|
||||
Map<String, String> resourcesStringsNew = new LinkedHashMap<String, String>();
|
||||
|
||||
Map<String, List<String>> stringsResourcesOld = new LinkedHashMap<String, List<String>>();
|
||||
Map<String, String> resourcesStringsOld = new LinkedHashMap<String, String>();
|
||||
Map<String, List<String>> stringsResourcesNew = new LinkedHashMap<String, List<String>>();
|
||||
Map<String, String> resourcesStringsNew = new LinkedHashMap<String, String>();
|
||||
|
||||
Map<String, String> msgIdToReplace = new LinkedHashMap<String, String>();
|
||||
List<String> msgIdToReview = new LinkedList<String>();
|
||||
List<String> msgIdOutdated = new LinkedList<String>();
|
||||
|
||||
|
||||
public PotComparator(Project proj) {
|
||||
POParser parser = new POParser();
|
||||
Map<String, List<String>> stringsResourcesOld = new LinkedHashMap<String, List<String>>();
|
||||
Map<String, String> resourcesStringsOld = new LinkedHashMap<String, String>();
|
||||
|
||||
POFile newPot = parser.parseFile(new File(proj.alteredContent.baseFolder.getAbsolutePath()+File.separator+"english.pot"));
|
||||
if (newPot == null) {
|
||||
System.err.println("Cannot locate new english.pot file at "+proj.alteredContent.baseFolder.getAbsolutePath()+File.separator);
|
||||
}
|
||||
extractFromPoFile(newPot, stringsResourcesNew, resourcesStringsNew);
|
||||
|
||||
POFile oldPot = parser.parseFile(new File(proj.baseContent.baseFolder.getAbsolutePath()+File.separator+"assets"+File.separator+"translation"+File.separator+"english.pot"));
|
||||
if (oldPot == null) {
|
||||
System.err.println("Cannot locate old english.pot file at "+proj.baseContent.baseFolder.getAbsolutePath()+File.separator+"assets"+File.separator+"translations"+File.separator);
|
||||
}
|
||||
extractFromPoFile(oldPot, stringsResourcesOld, resourcesStringsOld);
|
||||
}
|
||||
|
||||
|
||||
private void extractFromPoFile(POFile po, Map<String, List<String>> stringsResources, Map<String, String> resourcesStrings) {
|
||||
for (POEntry entry : po.getEntryArray()) {
|
||||
Vector<String> resources = entry.getStringsByType(POEntry.StringType.REFERENCE);
|
||||
Vector<String> msgids = entry.getStringsByType(POEntry.StringType.MSGID);
|
||||
if (resources == null || resources.size() == 0 || msgids == null || msgids.size() == 0) continue;
|
||||
String msgid = msgids.get(0);
|
||||
if (msgids.size() > 1) {
|
||||
for (int i = 1; i < msgids.size(); i++) {
|
||||
msgid += msgids.get(i);
|
||||
}
|
||||
}
|
||||
if (msgid.contains("\\n")) {
|
||||
msgid = msgid.replaceAll("\\\\n", "\\\\n\"\n\"");
|
||||
msgid = "\"\n\""+msgid;
|
||||
}
|
||||
for (String resLine : resources) {
|
||||
String[] resArray = resLine.split(" ");
|
||||
for (String res : resArray) {
|
||||
resourcesStrings.put(res, msgid);
|
||||
if (stringsResources.get(msgid) == null) {
|
||||
stringsResources.put(msgid, new LinkedList<String>());
|
||||
}
|
||||
stringsResources.get(msgid).add(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void compare() {
|
||||
for (String oldRes : resourcesStringsOld.keySet()) {
|
||||
String newString = resourcesStringsNew.get(oldRes);
|
||||
String oldString = resourcesStringsOld.get(oldRes);
|
||||
if (newString != null) {
|
||||
if (!newString.equals(oldString)) {
|
||||
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
||||
List<String> allNewResources = stringsResourcesNew.get(oldString);
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append("---------------------------------------------\n");
|
||||
sb.append("--- TYPO CHECK ------------------------------\n");
|
||||
sb.append("---------------------------------------------\n");
|
||||
sb.append("String at: "+oldRes+"\n");
|
||||
if (allOldResources.size() > 1) {
|
||||
sb.append("Also present at:\n");
|
||||
for (String res : allOldResources) {
|
||||
if (!res.equals(oldRes)) {
|
||||
sb.append("- "+res+"\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (allNewResources != null) {
|
||||
sb.append("Still present at: \n");
|
||||
for (String res : allNewResources) {
|
||||
sb.append("- "+res+"\n");
|
||||
}
|
||||
}
|
||||
sb.append("Was : \""+oldString+"\"\n");
|
||||
sb.append("Now : \""+newString+"\"\n");
|
||||
System.out.println(sb.toString());
|
||||
showTypoDialog(oldString, newString, sb.toString());
|
||||
}
|
||||
} else {
|
||||
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
||||
List<String> allNewResources = stringsResourcesNew.get(oldString);
|
||||
if (allOldResources.size() >= 1) {
|
||||
System.out.println("---------------------------------------------");
|
||||
System.out.println("--- REMOVED RESOURCE ------------------------");
|
||||
System.out.println("---------------------------------------------");
|
||||
System.out.println("String at: "+oldRes);
|
||||
if (allOldResources.size() > 1) {
|
||||
System.out.println("And also at:");
|
||||
for (String res : allOldResources) {
|
||||
if (!res.equals(oldRes)) {
|
||||
System.out.println("- "+res);
|
||||
}
|
||||
}
|
||||
}
|
||||
System.out.println("Was: \""+oldString+"\"");
|
||||
if (allNewResources == null) {
|
||||
System.out.println("Absent from new.");
|
||||
} else {
|
||||
System.out.println("Still present at: ");
|
||||
for (String res : allNewResources) {
|
||||
System.out.println("- "+res);
|
||||
}
|
||||
Map<String, String> msgIdToReplace = new LinkedHashMap<String, String>();
|
||||
List<String> msgIdToReview = new LinkedList<String>();
|
||||
List<String> msgIdOutdated = new LinkedList<String>();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
removedStrings: for (String oldString : stringsResourcesOld.keySet()) {
|
||||
if (stringsResourcesNew.get(oldString) == null) {
|
||||
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
||||
if (allOldResources.size() >= 1) {
|
||||
if (allOldResources.size() > 0) {
|
||||
for (String res : allOldResources) {
|
||||
String newString = resourcesStringsNew.get(res);
|
||||
if (newString != null) {
|
||||
continue removedStrings;
|
||||
}
|
||||
}
|
||||
}
|
||||
System.out.println("---------------------------------------------");
|
||||
System.out.println("--- REMOVED STRING --------------------------");
|
||||
System.out.println("---------------------------------------------");
|
||||
System.out.println("String: \""+oldString+"\"");
|
||||
if (allOldResources.size() > 0) {
|
||||
System.out.println("Was at:");
|
||||
for (String res : allOldResources) {
|
||||
System.out.println("- "+res);
|
||||
}
|
||||
}
|
||||
System.out.println("This string is absent from the new file, and its attached resources are missing too.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void showTypoDialog(String oldMsg, String newMsg, String checkReport) {
|
||||
String typo = "Typo";
|
||||
String review = "Review";
|
||||
String outdated = "Outdated";
|
||||
String none = "None";
|
||||
Object[] options = new Object[] {typo, review, outdated, none};
|
||||
|
||||
int result = JOptionPane.showOptionDialog(null, checkReport, "Choose action", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, typo);
|
||||
|
||||
if (result < 0 || result >= options.length) {
|
||||
System.out.println("No decision");
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println("Decision: "+options[result]);
|
||||
|
||||
if (options[result] != none) {
|
||||
msgIdToReplace.put(oldMsg, newMsg);
|
||||
if (options[result] == review) {
|
||||
msgIdToReview.add(newMsg);
|
||||
} else if (options[result] == outdated) {
|
||||
msgIdOutdated.add(newMsg);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void updatePoFiles(Project proj) {
|
||||
File poFolder = new File(proj.baseContent.baseFolder.getAbsolutePath()+File.separator+"assets"+File.separator+"translation");
|
||||
File[] poFiles = poFolder.listFiles(new FileFilter() {
|
||||
@Override
|
||||
public boolean accept(File arg0) {
|
||||
return arg0.isFile() && arg0.getName().endsWith(".po");
|
||||
}
|
||||
});
|
||||
|
||||
for (File f : poFiles) {
|
||||
updatePoFile(proj, f);
|
||||
}
|
||||
}
|
||||
|
||||
private void updatePoFile(Project proj, File f) {
|
||||
POParser parser = new POParser();
|
||||
POFile poFile = parser.parseFile(f);
|
||||
|
||||
Map<String, String> translations = new LinkedHashMap<String, String>();
|
||||
|
||||
//Collect existing translations
|
||||
if (poFile.getHeader() != null) {
|
||||
Vector<String> msgstrs = poFile.getHeader().getStringsByType(POEntry.StringType.HEADER);
|
||||
String header = "";
|
||||
if (!msgstrs.isEmpty()) {
|
||||
if (msgstrs.size() == 1) {
|
||||
header = msgstrs.get(0);
|
||||
} else {
|
||||
for (String msgstr : msgstrs) {
|
||||
header += msgstr;
|
||||
header += "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
translations.put("", header);
|
||||
}
|
||||
|
||||
for (POEntry entry : poFile.getEntryArray()) {
|
||||
Vector<String> msgids = entry.getStringsByType(POEntry.StringType.MSGID);
|
||||
Vector<String> msgstrs = entry.getStringsByType(POEntry.StringType.MSGSTR);
|
||||
if (msgids == null || msgids.size() == 0) continue;
|
||||
String msgid = msgids.get(0);
|
||||
if (msgids.size() > 1) {
|
||||
for (int i = 1; i < msgids.size(); i++) {
|
||||
msgid += msgids.get(i);
|
||||
}
|
||||
}
|
||||
if (msgid.contains("\\n")) {
|
||||
msgid = msgid.replaceAll("\\\\n", "\\\\n\"\n\"");
|
||||
msgid = "\"\n\""+msgid;
|
||||
}
|
||||
String translation = "";
|
||||
if (!msgstrs.isEmpty()) {
|
||||
if (msgstrs.size() == 1) {
|
||||
translation = msgstrs.get(0);
|
||||
} else {
|
||||
for (String msgstr : msgstrs) {
|
||||
translation += msgstr;
|
||||
}
|
||||
}
|
||||
if (translation.contains("\\n")) {
|
||||
translation = translation.replaceAll("\\\\n", "\\\\n\"\n\"");
|
||||
translation = "\"\n\""+translation;
|
||||
}
|
||||
}
|
||||
translations.put(msgid, translation);
|
||||
}
|
||||
|
||||
//Patch data
|
||||
for (String oldId : msgIdToReplace.keySet()) {
|
||||
String newId = msgIdToReplace.get(oldId);
|
||||
if (translations.containsKey(oldId)) {
|
||||
String trans = translations.get(oldId);
|
||||
translations.remove(oldId);
|
||||
translations.put(newId, trans);
|
||||
}
|
||||
}
|
||||
|
||||
for (String msgid : msgIdToReview) {
|
||||
if (translations.containsKey(msgid)) {
|
||||
String trans = translations.get(msgid);
|
||||
if (trans != null && trans.length() >= 1) translations.put(msgid, "[REVIEW]"+trans);
|
||||
}
|
||||
}
|
||||
public PotComparator(Project proj) {
|
||||
POParser parser = new POParser();
|
||||
|
||||
POFile newPot = parser.parseFile(new File(proj.alteredContent.baseFolder.getAbsolutePath() + File.separator + "english.pot"));
|
||||
if (newPot == null) {
|
||||
System.err.println("Cannot locate new english.pot file at " + proj.alteredContent.baseFolder.getAbsolutePath() + File.separator);
|
||||
}
|
||||
extractFromPoFile(newPot, stringsResourcesNew, resourcesStringsNew);
|
||||
|
||||
POFile oldPot = parser.parseFile(new File(proj.baseContent.baseFolder.getAbsolutePath() + File.separator + "assets" + File.separator + "translation" + File.separator + "english.pot"));
|
||||
if (oldPot == null) {
|
||||
System.err.println("Cannot locate old english.pot file at " + proj.baseContent.baseFolder.getAbsolutePath() + File.separator + "assets" + File.separator + "translations" + File.separator);
|
||||
}
|
||||
extractFromPoFile(oldPot, stringsResourcesOld, resourcesStringsOld);
|
||||
}
|
||||
|
||||
|
||||
private void extractFromPoFile(POFile po, Map<String, List<String>> stringsResources, Map<String, String> resourcesStrings) {
|
||||
for (POEntry entry : po.getEntryArray()) {
|
||||
Vector<String> resources = entry.getStringsByType(POEntry.StringType.REFERENCE);
|
||||
Vector<String> msgids = entry.getStringsByType(POEntry.StringType.MSGID);
|
||||
if (resources == null || resources.size() == 0 || msgids == null || msgids.size() == 0) continue;
|
||||
String msgid = msgids.get(0);
|
||||
if (msgids.size() > 1) {
|
||||
for (int i = 1; i < msgids.size(); i++) {
|
||||
msgid += msgids.get(i);
|
||||
}
|
||||
}
|
||||
if (msgid.contains("\\n")) {
|
||||
msgid = msgid.replaceAll("\\\\n", "\\\\n\"\n\"");
|
||||
msgid = "\"\n\"" + msgid;
|
||||
}
|
||||
for (String resLine : resources) {
|
||||
String[] resArray = resLine.split(" ");
|
||||
for (String res : resArray) {
|
||||
resourcesStrings.put(res, msgid);
|
||||
if (stringsResources.get(msgid) == null) {
|
||||
stringsResources.put(msgid, new LinkedList<String>());
|
||||
}
|
||||
stringsResources.get(msgid).add(res);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void compare() {
|
||||
for (String oldRes : resourcesStringsOld.keySet()) {
|
||||
String newString = resourcesStringsNew.get(oldRes);
|
||||
String oldString = resourcesStringsOld.get(oldRes);
|
||||
if (newString != null) {
|
||||
if (!newString.equals(oldString)) {
|
||||
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
||||
List<String> allNewResources = stringsResourcesNew.get(oldString);
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append("---------------------------------------------\n");
|
||||
sb.append("--- TYPO CHECK ------------------------------\n");
|
||||
sb.append("---------------------------------------------\n");
|
||||
sb.append("String at: " + oldRes + "\n");
|
||||
if (allOldResources.size() > 1) {
|
||||
sb.append("Also present at:\n");
|
||||
for (String res : allOldResources) {
|
||||
if (!res.equals(oldRes)) {
|
||||
sb.append("- " + res + "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (allNewResources != null) {
|
||||
sb.append("Still present at: \n");
|
||||
for (String res : allNewResources) {
|
||||
sb.append("- " + res + "\n");
|
||||
}
|
||||
}
|
||||
sb.append("Was : \"" + oldString + "\"\n");
|
||||
sb.append("Now : \"" + newString + "\"\n");
|
||||
System.out.println(sb.toString());
|
||||
showTypoDialog(oldString, newString, sb.toString());
|
||||
}
|
||||
} else {
|
||||
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
||||
List<String> allNewResources = stringsResourcesNew.get(oldString);
|
||||
if (allOldResources.size() >= 1) {
|
||||
System.out.println("---------------------------------------------");
|
||||
System.out.println("--- REMOVED RESOURCE ------------------------");
|
||||
System.out.println("---------------------------------------------");
|
||||
System.out.println("String at: " + oldRes);
|
||||
if (allOldResources.size() > 1) {
|
||||
System.out.println("And also at:");
|
||||
for (String res : allOldResources) {
|
||||
if (!res.equals(oldRes)) {
|
||||
System.out.println("- " + res);
|
||||
}
|
||||
}
|
||||
}
|
||||
System.out.println("Was: \"" + oldString + "\"");
|
||||
if (allNewResources == null) {
|
||||
System.out.println("Absent from new.");
|
||||
} else {
|
||||
System.out.println("Still present at: ");
|
||||
for (String res : allNewResources) {
|
||||
System.out.println("- " + res);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
removedStrings:
|
||||
for (String oldString : stringsResourcesOld.keySet()) {
|
||||
if (stringsResourcesNew.get(oldString) == null) {
|
||||
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
||||
if (allOldResources.size() >= 1) {
|
||||
if (allOldResources.size() > 0) {
|
||||
for (String res : allOldResources) {
|
||||
String newString = resourcesStringsNew.get(res);
|
||||
if (newString != null) {
|
||||
continue removedStrings;
|
||||
}
|
||||
}
|
||||
}
|
||||
System.out.println("---------------------------------------------");
|
||||
System.out.println("--- REMOVED STRING --------------------------");
|
||||
System.out.println("---------------------------------------------");
|
||||
System.out.println("String: \"" + oldString + "\"");
|
||||
if (allOldResources.size() > 0) {
|
||||
System.out.println("Was at:");
|
||||
for (String res : allOldResources) {
|
||||
System.out.println("- " + res);
|
||||
}
|
||||
}
|
||||
System.out.println("This string is absent from the new file, and its attached resources are missing too.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void showTypoDialog(String oldMsg, String newMsg, String checkReport) {
|
||||
String typo = "Typo";
|
||||
String review = "Review";
|
||||
String outdated = "Outdated";
|
||||
String none = "None";
|
||||
Object[] options = new Object[]{typo, review, outdated, none};
|
||||
|
||||
int result = JOptionPane.showOptionDialog(null, checkReport, "Choose action", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, typo);
|
||||
|
||||
if (result < 0 || result >= options.length) {
|
||||
System.out.println("No decision");
|
||||
return;
|
||||
}
|
||||
|
||||
System.out.println("Decision: " + options[result]);
|
||||
|
||||
if (options[result] != none) {
|
||||
msgIdToReplace.put(oldMsg, newMsg);
|
||||
if (options[result] == review) {
|
||||
msgIdToReview.add(newMsg);
|
||||
} else if (options[result] == outdated) {
|
||||
msgIdOutdated.add(newMsg);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public void updatePoFiles(Project proj) {
|
||||
File poFolder = new File(proj.baseContent.baseFolder.getAbsolutePath() + File.separator + "assets" + File.separator + "translation");
|
||||
File[] poFiles = poFolder.listFiles(new FileFilter() {
|
||||
@Override
|
||||
public boolean accept(File arg0) {
|
||||
return arg0.isFile() && arg0.getName().endsWith(".po");
|
||||
}
|
||||
});
|
||||
|
||||
for (File f : poFiles) {
|
||||
updatePoFile(proj, f);
|
||||
}
|
||||
}
|
||||
|
||||
private void updatePoFile(Project proj, File f) {
|
||||
POParser parser = new POParser();
|
||||
POFile poFile = parser.parseFile(f);
|
||||
|
||||
Map<String, String> translations = new LinkedHashMap<String, String>();
|
||||
|
||||
//Collect existing translations
|
||||
if (poFile.getHeader() != null) {
|
||||
Vector<String> msgstrs = poFile.getHeader().getStringsByType(POEntry.StringType.HEADER);
|
||||
String header = "";
|
||||
if (!msgstrs.isEmpty()) {
|
||||
if (msgstrs.size() == 1) {
|
||||
header = msgstrs.get(0);
|
||||
} else {
|
||||
for (String msgstr : msgstrs) {
|
||||
header += msgstr;
|
||||
header += "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
translations.put("", header);
|
||||
}
|
||||
|
||||
for (POEntry entry : poFile.getEntryArray()) {
|
||||
Vector<String> msgids = entry.getStringsByType(POEntry.StringType.MSGID);
|
||||
Vector<String> msgstrs = entry.getStringsByType(POEntry.StringType.MSGSTR);
|
||||
if (msgids == null || msgids.size() == 0) continue;
|
||||
String msgid = msgids.get(0);
|
||||
if (msgids.size() > 1) {
|
||||
for (int i = 1; i < msgids.size(); i++) {
|
||||
msgid += msgids.get(i);
|
||||
}
|
||||
}
|
||||
if (msgid.contains("\\n")) {
|
||||
msgid = msgid.replaceAll("\\\\n", "\\\\n\"\n\"");
|
||||
msgid = "\"\n\"" + msgid;
|
||||
}
|
||||
String translation = "";
|
||||
if (!msgstrs.isEmpty()) {
|
||||
if (msgstrs.size() == 1) {
|
||||
translation = msgstrs.get(0);
|
||||
} else {
|
||||
for (String msgstr : msgstrs) {
|
||||
translation += msgstr;
|
||||
}
|
||||
}
|
||||
if (translation.contains("\\n")) {
|
||||
translation = translation.replaceAll("\\\\n", "\\\\n\"\n\"");
|
||||
translation = "\"\n\"" + translation;
|
||||
}
|
||||
}
|
||||
translations.put(msgid, translation);
|
||||
}
|
||||
|
||||
//Patch data
|
||||
for (String oldId : msgIdToReplace.keySet()) {
|
||||
String newId = msgIdToReplace.get(oldId);
|
||||
if (translations.containsKey(oldId)) {
|
||||
String trans = translations.get(oldId);
|
||||
translations.remove(oldId);
|
||||
translations.put(newId, trans);
|
||||
}
|
||||
}
|
||||
|
||||
for (String msgid : msgIdToReview) {
|
||||
if (translations.containsKey(msgid)) {
|
||||
String trans = translations.get(msgid);
|
||||
if (trans != null && trans.length() >= 1) translations.put(msgid, "[REVIEW]" + trans);
|
||||
}
|
||||
}
|
||||
|
||||
for (String msgid : msgIdOutdated) {
|
||||
if (translations.containsKey(msgid)) {
|
||||
String trans = translations.get(msgid);
|
||||
if (trans != null && trans.length() >= 1) translations.put(msgid, "[OUTDATED]" + trans);
|
||||
}
|
||||
}
|
||||
|
||||
PoPotWriter.writePoFile(stringsResourcesNew, translations, new File(proj.alteredContent.baseFolder.getAbsolutePath() + File.separator + f.getName()));
|
||||
}
|
||||
|
||||
for (String msgid : msgIdOutdated) {
|
||||
if (translations.containsKey(msgid)) {
|
||||
String trans = translations.get(msgid);
|
||||
if (trans != null && trans.length() >= 1) translations.put(msgid, "[OUTDATED]"+trans);
|
||||
}
|
||||
}
|
||||
|
||||
PoPotWriter.writePoFile(stringsResourcesNew, translations, new File(proj.alteredContent.baseFolder.getAbsolutePath()+File.separator+f.getName()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,101 +1,94 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.tools.i18n;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.*;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Item;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.ItemCategory;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.JSONElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Quest;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
|
||||
|
||||
public class PotGenerator {
|
||||
|
||||
public static void generatePotFileForProject(Project proj) {
|
||||
Map<String, List<String>> stringsResources = new LinkedHashMap<String, List<String>>();
|
||||
Map<String, String> resourcesStrings = new LinkedHashMap<String, String>();
|
||||
|
||||
GameSource gsrc = proj.baseContent;
|
||||
|
||||
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 ) {
|
||||
pushString(stringsResources, resourcesStrings, d.message, getPotContextComment(d));
|
||||
if (d.replies == null) continue;
|
||||
for (Dialogue.Reply r : d.replies) {
|
||||
if (r.text != null && !r.text.equals(Dialogue.Reply.GO_NEXT_TEXT) ) {
|
||||
pushString(stringsResources, resourcesStrings, r.text, getPotContextComment(d)+":"+d.replies.indexOf(r));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (ItemCategory ic : gsrc.gameData.itemCategories) {
|
||||
pushString(stringsResources, resourcesStrings, ic.name, getPotContextComment(ic));
|
||||
}
|
||||
|
||||
for (Item i : gsrc.gameData.items) {
|
||||
pushString(stringsResources, resourcesStrings, i.name, getPotContextComment(i));
|
||||
pushString(stringsResources, resourcesStrings, i.description, getPotContextComment(i)+":description");
|
||||
}
|
||||
|
||||
for (NPC npc : gsrc.gameData.npcs ) {
|
||||
pushString(stringsResources, resourcesStrings, npc.name, getPotContextComment(npc));
|
||||
}
|
||||
|
||||
for (Quest q : gsrc.gameData.quests) {
|
||||
if (q.visible_in_log != null && q.visible_in_log != 0) {
|
||||
pushString(stringsResources, resourcesStrings, q.name, getPotContextComment(q));
|
||||
for (QuestStage qs : q.stages) {
|
||||
pushString(stringsResources, resourcesStrings, qs.log_text, getPotContextComment(q)+":"+Integer.toString(qs.progress));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (WorldmapSegment ws : gsrc.worldmap) {
|
||||
for (WorldmapSegment.NamedArea area : ws.labels.values()) {
|
||||
pushString(stringsResources, resourcesStrings, area.name, gsrc.worldmap.worldmapFile.getName()+":"+ws.id+":"+area.id);
|
||||
}
|
||||
}
|
||||
|
||||
File f = new File(proj.alteredContent.baseFolder, "english.pot");
|
||||
PoPotWriter.writePotFile(stringsResources, f);
|
||||
|
||||
}
|
||||
|
||||
private static void pushString (Map<String, List<String>> stringsResources, Map<String, String> resourcesStrings, String translatableString, String resourceIdentifier) {
|
||||
if (translatableString == null) return;
|
||||
if (translatableString.length() == 0) return;
|
||||
if (translatableString.contains("\"")) {
|
||||
translatableString = translatableString.replaceAll("\"", "\\\\\"");
|
||||
}
|
||||
if (translatableString.contains("\n")) {
|
||||
translatableString = translatableString.replaceAll("\n", "\\\\n\"\n\"");
|
||||
translatableString = "\"\n\""+translatableString;
|
||||
}
|
||||
resourcesStrings.put(resourceIdentifier, translatableString);
|
||||
List<String> resourceIdentifiers = stringsResources.get(translatableString);
|
||||
if (resourceIdentifiers == null) {
|
||||
resourceIdentifiers = new LinkedList<String>();
|
||||
stringsResources.put(translatableString, resourceIdentifiers);
|
||||
}
|
||||
resourceIdentifiers.add(resourceIdentifier);
|
||||
}
|
||||
|
||||
private static String getPotContextComment(JSONElement e) {
|
||||
return e.jsonFile.getName()+":"+e.id;
|
||||
}
|
||||
public static void generatePotFileForProject(Project proj) {
|
||||
Map<String, List<String>> stringsResources = new LinkedHashMap<String, List<String>>();
|
||||
Map<String, String> resourcesStrings = new LinkedHashMap<String, String>();
|
||||
|
||||
GameSource gsrc = proj.baseContent;
|
||||
|
||||
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) {
|
||||
pushString(stringsResources, resourcesStrings, d.message, getPotContextComment(d));
|
||||
if (d.replies == null) continue;
|
||||
for (Dialogue.Reply r : d.replies) {
|
||||
if (r.text != null && !r.text.equals(Dialogue.Reply.GO_NEXT_TEXT)) {
|
||||
pushString(stringsResources, resourcesStrings, r.text, getPotContextComment(d) + ":" + d.replies.indexOf(r));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (ItemCategory ic : gsrc.gameData.itemCategories) {
|
||||
pushString(stringsResources, resourcesStrings, ic.name, getPotContextComment(ic));
|
||||
}
|
||||
|
||||
for (Item i : gsrc.gameData.items) {
|
||||
pushString(stringsResources, resourcesStrings, i.name, getPotContextComment(i));
|
||||
pushString(stringsResources, resourcesStrings, i.description, getPotContextComment(i) + ":description");
|
||||
}
|
||||
|
||||
for (NPC npc : gsrc.gameData.npcs) {
|
||||
pushString(stringsResources, resourcesStrings, npc.name, getPotContextComment(npc));
|
||||
}
|
||||
|
||||
for (Quest q : gsrc.gameData.quests) {
|
||||
if (q.visible_in_log != null && q.visible_in_log != 0) {
|
||||
pushString(stringsResources, resourcesStrings, q.name, getPotContextComment(q));
|
||||
for (QuestStage qs : q.stages) {
|
||||
pushString(stringsResources, resourcesStrings, qs.log_text, getPotContextComment(q) + ":" + Integer.toString(qs.progress));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (WorldmapSegment ws : gsrc.worldmap) {
|
||||
for (WorldmapSegment.NamedArea area : ws.labels.values()) {
|
||||
pushString(stringsResources, resourcesStrings, area.name, gsrc.worldmap.worldmapFile.getName() + ":" + ws.id + ":" + area.id);
|
||||
}
|
||||
}
|
||||
|
||||
File f = new File(proj.alteredContent.baseFolder, "english.pot");
|
||||
PoPotWriter.writePotFile(stringsResources, f);
|
||||
|
||||
}
|
||||
|
||||
private static void pushString(Map<String, List<String>> stringsResources, Map<String, String> resourcesStrings, String translatableString, String resourceIdentifier) {
|
||||
if (translatableString == null) return;
|
||||
if (translatableString.length() == 0) return;
|
||||
if (translatableString.contains("\"")) {
|
||||
translatableString = translatableString.replaceAll("\"", "\\\\\"");
|
||||
}
|
||||
if (translatableString.contains("\n")) {
|
||||
translatableString = translatableString.replaceAll("\n", "\\\\n\"\n\"");
|
||||
translatableString = "\"\n\"" + translatableString;
|
||||
}
|
||||
resourcesStrings.put(resourceIdentifier, translatableString);
|
||||
List<String> resourceIdentifiers = stringsResources.get(translatableString);
|
||||
if (resourceIdentifiers == null) {
|
||||
resourceIdentifiers = new LinkedList<String>();
|
||||
stringsResources.put(translatableString, resourceIdentifiers);
|
||||
}
|
||||
resourceIdentifiers.add(resourceIdentifier);
|
||||
}
|
||||
|
||||
private static String getPotContextComment(JSONElement e) {
|
||||
return e.jsonFile.getName() + ":" + e.id;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,30 +1,7 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.tools.resoptimizer;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileFilter;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.StringWriter;
|
||||
import java.nio.CharBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
@@ -38,344 +15,347 @@ import com.whoischarles.util.json.Minify;
|
||||
import com.whoischarles.util.json.Minify.UnterminatedCommentException;
|
||||
import com.whoischarles.util.json.Minify.UnterminatedRegExpLiteralException;
|
||||
import com.whoischarles.util.json.Minify.UnterminatedStringLiteralException;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
import tiled.core.TileSet;
|
||||
import tiled.io.TMXMapWriter;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.*;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Kevin
|
||||
*
|
||||
* <p>
|
||||
* To use this, paste the following script in the beanshell console of ATCS.
|
||||
* Don't forget to change the project number to suit your needs.
|
||||
*
|
||||
import com.gpl.rpg.atcontentstudio.model.tools.resoptimizer.ResourcesCompactor;
|
||||
import com.gpl.rpg.atcontentstudio.model.Workspace;
|
||||
|
||||
proj = Workspace.activeWorkspace.projects.get(0);
|
||||
new ResourcesCompactor(proj).compactData();
|
||||
* <p>
|
||||
* <code>
|
||||
* import com.gpl.rpg.atcontentstudio.model.tools.resoptimizer.ResourcesCompactor;
|
||||
* import com.gpl.rpg.atcontentstudio.model.Workspace;
|
||||
*
|
||||
* proj = Workspace.activeWorkspace.projects.get(0);
|
||||
* new ResourcesCompactor(proj).compactData();
|
||||
* </code>
|
||||
*/
|
||||
public class ResourcesCompactor {
|
||||
|
||||
public static String DEFAULT_REL_PATH_IN_PROJECT = "compressed"+File.separator;
|
||||
|
||||
private Project proj;
|
||||
private File baseFolder;
|
||||
private List<CompressedSpritesheet> compressedSpritesheets = new LinkedList<CompressedSpritesheet>();
|
||||
private List<File> preservedSpritesheets = new LinkedList<File>();
|
||||
|
||||
private Map<SpritesheetId, SpritesheetId> spritesRelocationForObjects = new LinkedHashMap<SpritesheetId, SpritesheetId>();
|
||||
private Integer currentSpritesheetIndexForObjects = 0;
|
||||
private CompressedSpritesheet currentSpritesheetForObjects = null;
|
||||
public static String DEFAULT_REL_PATH_IN_PROJECT = "compressed" + File.separator;
|
||||
|
||||
private Map<SpritesheetId, SpritesheetId> spritesRelocationForMaps = new LinkedHashMap<SpritesheetId, SpritesheetId>();
|
||||
private Map<SpritesheetId, CompressedSpritesheet> spritesheetsBySidForMaps = new LinkedHashMap<SpritesheetId, CompressedSpritesheet>();
|
||||
private Integer currentSpritesheetIndexForMaps = 0;
|
||||
private CompressedSpritesheet currentSpritesheetForMaps = null;
|
||||
|
||||
public ResourcesCompactor(Project proj) {
|
||||
this.proj = proj;
|
||||
this.baseFolder = new File(proj.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||
if (!baseFolder.exists()) baseFolder.mkdirs();
|
||||
}
|
||||
|
||||
public void compactData() {
|
||||
compactJsonData();
|
||||
for(CompressedSpritesheet cs : compressedSpritesheets) {
|
||||
cs.drawFile();
|
||||
}
|
||||
for (File preserved : preservedSpritesheets) {
|
||||
FileUtils.copyFile(preserved, new File(baseFolder.getAbsolutePath()+File.separator+DEFAULT_DRAWABLE_REL_PATH+File.separator+preserved.getName()));
|
||||
}
|
||||
compactMaps();
|
||||
}
|
||||
|
||||
public void compactJsonData() {
|
||||
final List<File> filesCovered = new LinkedList<File>();
|
||||
|
||||
File folder = new File(baseFolder.getAbsolutePath()+File.separator+GameDataSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
if (!folder.exists()) folder.mkdirs();
|
||||
|
||||
for (ActorCondition ac : proj.baseContent.gameData.actorConditions) {
|
||||
if (filesCovered.contains(ac.jsonFile)) continue;
|
||||
File currentFile = ac.jsonFile;
|
||||
filesCovered.add(currentFile);
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (ActorCondition acond : proj.baseContent.gameData.actorConditions) {
|
||||
if (!acond.jsonFile.equals(currentFile)) continue;
|
||||
Map json = acond.toJson();
|
||||
json.put("iconID", convertObjectSprite(acond.icon_id).toStringID());
|
||||
dataToSave.add(json);
|
||||
}
|
||||
File target = new File(folder, ac.jsonFile.getName());
|
||||
writeJson(dataToSave, target);
|
||||
}
|
||||
|
||||
for (Item it : proj.baseContent.gameData.items) {
|
||||
if (filesCovered.contains(it.jsonFile)) continue;
|
||||
File currentFile = it.jsonFile;
|
||||
filesCovered.add(currentFile);
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (Item item : proj.baseContent.gameData.items) {
|
||||
if (!item.jsonFile.equals(currentFile)) continue;
|
||||
Map json = item.toJson();
|
||||
json.put("iconID", convertObjectSprite(item.icon_id).toStringID());
|
||||
dataToSave.add(json);
|
||||
}
|
||||
File target = new File(folder, it.jsonFile.getName());
|
||||
writeJson(dataToSave, target);
|
||||
}
|
||||
|
||||
private Project proj;
|
||||
private File baseFolder;
|
||||
private List<CompressedSpritesheet> compressedSpritesheets = new LinkedList<CompressedSpritesheet>();
|
||||
private List<File> preservedSpritesheets = new LinkedList<File>();
|
||||
|
||||
for (NPC np : proj.baseContent.gameData.npcs) {
|
||||
if (filesCovered.contains(np.jsonFile)) continue;
|
||||
File currentFile = np.jsonFile;
|
||||
filesCovered.add(currentFile);
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (NPC npc : proj.baseContent.gameData.npcs) {
|
||||
if (!npc.jsonFile.equals(currentFile)) continue;
|
||||
Map json = npc.toJson();
|
||||
if (proj.getImage(npc.icon_id).getWidth(null) == TILE_WIDTH_IN_PIXELS || proj.getImage(npc.icon_id).getHeight(null) == TILE_HEIGHT_IN_PIXELS) {
|
||||
json.put("iconID", convertObjectSprite(npc.icon_id).toStringID());
|
||||
}
|
||||
dataToSave.add(json);
|
||||
}
|
||||
File target = new File(folder, np.jsonFile.getName());
|
||||
writeJson(dataToSave, target);
|
||||
}
|
||||
|
||||
File[] remainingFiles = proj.baseContent.gameData.baseFolder.listFiles(new FileFilter() {
|
||||
@Override
|
||||
public boolean accept(File arg0) {
|
||||
return arg0.getName().endsWith(".json") && !filesCovered.contains(arg0);
|
||||
}
|
||||
});
|
||||
|
||||
for (File source : remainingFiles) {
|
||||
File target = new File(folder, source.getName());
|
||||
minifyJson(source, target);
|
||||
}
|
||||
}
|
||||
private Map<SpritesheetId, SpritesheetId> spritesRelocationForObjects = new LinkedHashMap<SpritesheetId, SpritesheetId>();
|
||||
private Integer currentSpritesheetIndexForObjects = 0;
|
||||
private CompressedSpritesheet currentSpritesheetForObjects = null;
|
||||
|
||||
private Minify jsonMinifier = new Minify();
|
||||
|
||||
private void writeJson(List<Map> dataToSave, File target) {
|
||||
StringWriter writer = new JsonPrettyWriter();
|
||||
try {
|
||||
JSONArray.writeJSONString(dataToSave, writer);
|
||||
} catch (IOException e) {
|
||||
//Impossible with a StringWriter
|
||||
}
|
||||
String toWrite = writer.toString();
|
||||
try {
|
||||
FileWriter w = new FileWriter(target);
|
||||
w.write(jsonMinifier.minify(toWrite));
|
||||
w.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
private Map<SpritesheetId, SpritesheetId> spritesRelocationForMaps = new LinkedHashMap<SpritesheetId, SpritesheetId>();
|
||||
private Map<SpritesheetId, CompressedSpritesheet> spritesheetsBySidForMaps = new LinkedHashMap<SpritesheetId, CompressedSpritesheet>();
|
||||
private Integer currentSpritesheetIndexForMaps = 0;
|
||||
private CompressedSpritesheet currentSpritesheetForMaps = null;
|
||||
|
||||
private void minifyJson(File source, File target) {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
try {
|
||||
FileInputStream fis = new FileInputStream(source);
|
||||
jsonMinifier.minify(fis, baos);
|
||||
FileWriter w = new FileWriter(target);
|
||||
w.write(baos.toString());
|
||||
w.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (UnterminatedRegExpLiteralException e) {
|
||||
e.printStackTrace();
|
||||
} catch (UnterminatedCommentException e) {
|
||||
e.printStackTrace();
|
||||
} catch (UnterminatedStringLiteralException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
private void compactMaps() {
|
||||
for (TMXMap map : proj.baseContent.gameMaps.tmxMaps) {
|
||||
TMXMap clone = map.clone();
|
||||
for (GameDataElement gde : clone.getBacklinks()) {
|
||||
gde.removeBacklink(clone);
|
||||
}
|
||||
clone.getBacklinks().clear();
|
||||
tiled.core.Map tmx = clone.tmxMap;
|
||||
compactMap(tmx, map.id);
|
||||
clone.tmxMap = null;
|
||||
clone.groups.clear();
|
||||
clone = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void compactMap(tiled.core.Map tmx, String name) {
|
||||
File target = new File(baseFolder.getAbsolutePath()+File.separator+TMXMapSet.DEFAULT_REL_PATH_IN_SOURCE+File.separator+name+".tmx");
|
||||
if (!target.getParentFile().exists()) target.getParentFile().mkdirs();
|
||||
|
||||
Map<tiled.core.Tile, SpritesheetId> localConvertions = new LinkedHashMap<tiled.core.Tile, SpritesheetId>();
|
||||
List<CompressedSpritesheet> usedSpritesheets = new LinkedList<CompressedSpritesheet>();
|
||||
|
||||
List<tiled.core.TileSet> toRemove = new LinkedList<TileSet>();
|
||||
|
||||
for (tiled.core.TileSet ts : tmx.getTileSets()) {
|
||||
if (!ts.getName().equalsIgnoreCase("map_dynamic_placeholders")) {
|
||||
toRemove.add(ts);
|
||||
}
|
||||
}
|
||||
|
||||
for (tiled.core.TileLayer layer : tmx.getTileLayers()) {
|
||||
for (int x = 0; x < layer.getWidth(); x++) {
|
||||
for (int y = 0; y < layer.getHeight(); y++) {
|
||||
tiled.core.Tile tile = layer.getTileAt(x, y);
|
||||
if (tile != null && !tile.getTileSet().getName().equalsIgnoreCase("map_dynamic_placeholders")) {
|
||||
SpritesheetId sid = convertMapSprite(SpritesheetId.toStringID(tile.getTileSet().getName(), tile.getId()));
|
||||
localConvertions.put(tile, sid);
|
||||
if (!usedSpritesheets.contains(spritesheetsBySidForMaps.get(sid))) {
|
||||
usedSpritesheets.add(spritesheetsBySidForMaps.get(sid));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map<CompressedSpritesheet, tiled.core.TileSet> csToTs = new LinkedHashMap<CompressedSpritesheet, tiled.core.TileSet>();
|
||||
for (CompressedSpritesheet cs : usedSpritesheets) {
|
||||
cs.drawFile();
|
||||
tiled.core.TileSet ts = new tiled.core.TileSet();
|
||||
csToTs.put(cs, ts);
|
||||
tiled.util.BasicTileCutter cutter = new tiled.util.BasicTileCutter(TILE_WIDTH_IN_PIXELS, TILE_HEIGHT_IN_PIXELS, 0, 0);
|
||||
try {
|
||||
ts.importTileBitmap(cs.f.getAbsolutePath(), cutter);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
ts.setName(cs.prefix+Integer.toString(cs.index));
|
||||
//ts.setSource("../drawable/"+ts.getName()+TILESHEET_SUFFIX);
|
||||
tmx.addTileset(ts);
|
||||
}
|
||||
|
||||
for (tiled.core.TileLayer layer : tmx.getTileLayers()) {
|
||||
for (tiled.core.Tile tile : localConvertions.keySet()) {
|
||||
SpritesheetId sid = localConvertions.get(tile);
|
||||
layer.replaceTile(tile, csToTs.get(spritesheetsBySidForMaps.get(sid)).getTile(sid.offset));
|
||||
}
|
||||
}
|
||||
|
||||
for (tiled.core.TileSet ts : toRemove) {
|
||||
tmx.removeTileset(ts);
|
||||
}
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
TMXMapWriter writer = new TMXMapWriter();
|
||||
writer.settings.layerCompressionMethod = TMXMapWriter.Settings.LAYER_COMPRESSION_METHOD_ZLIB;
|
||||
try {
|
||||
writer.writeMap(tmx, baos, target.getAbsolutePath());
|
||||
String xml = baos.toString();
|
||||
FileWriter w = new FileWriter(target);
|
||||
w.write(xml);
|
||||
w.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private SpritesheetId convertObjectSprite(String originalSpriteId) {
|
||||
if (spritesRelocationForObjects.containsKey(SpritesheetId.getInstance(originalSpriteId))) {
|
||||
return spritesRelocationForObjects.get(SpritesheetId.getInstance(originalSpriteId));
|
||||
} else if (currentSpritesheetForObjects == null || !currentSpritesheetForObjects.hasFreeSlot()) {
|
||||
currentSpritesheetForObjects = new CompressedSpritesheet(TILESHEET_PREFIX_FOR_OBJECTS, currentSpritesheetIndexForObjects);
|
||||
compressedSpritesheets.add(currentSpritesheetForObjects);
|
||||
currentSpritesheetIndexForObjects++;
|
||||
}
|
||||
SpritesheetId sid = currentSpritesheetForObjects.addSprite(originalSpriteId);
|
||||
spritesRelocationForObjects.put(SpritesheetId.getInstance(originalSpriteId), sid);
|
||||
return sid;
|
||||
}
|
||||
|
||||
private SpritesheetId convertMapSprite(String originalSpriteId) {
|
||||
if (spritesRelocationForMaps.containsKey(SpritesheetId.getInstance(originalSpriteId))) {
|
||||
return spritesRelocationForMaps.get(SpritesheetId.getInstance(originalSpriteId));
|
||||
} else if (currentSpritesheetForMaps == null || !currentSpritesheetForMaps.hasFreeSlot()) {
|
||||
currentSpritesheetForMaps = new CompressedSpritesheet(TILESHEET_PREFIX_FOR_MAPS, currentSpritesheetIndexForMaps);
|
||||
compressedSpritesheets.add(currentSpritesheetForMaps);
|
||||
currentSpritesheetIndexForMaps++;
|
||||
}
|
||||
SpritesheetId sid = currentSpritesheetForMaps.addSprite(originalSpriteId);
|
||||
spritesRelocationForMaps.put(SpritesheetId.getInstance(originalSpriteId), sid);
|
||||
spritesheetsBySidForMaps.put(sid, currentSpritesheetForMaps);
|
||||
return sid;
|
||||
}
|
||||
|
||||
|
||||
private static final int TILESHEET_WIDTH_IN_SPRITES = 8;
|
||||
private static final int TILESHEET_HEIGHT_IN_SPRITES = 8;
|
||||
private static final int TILE_WIDTH_IN_PIXELS = 32;
|
||||
private static final int TILE_HEIGHT_IN_PIXELS = 32;
|
||||
|
||||
private static final String TILESHEET_PREFIX_FOR_OBJECTS = "obj_";
|
||||
private static final String TILESHEET_PREFIX_FOR_MAPS = "map_";
|
||||
private static final String TILESHEET_SUFFIX = ".png";
|
||||
|
||||
private static final String DEFAULT_DRAWABLE_REL_PATH = SpriteSheetSet.DEFAULT_REL_PATH_IN_SOURCE;
|
||||
|
||||
private class CompressedSpritesheet {
|
||||
String prefix;
|
||||
int index;
|
||||
File f;
|
||||
public ResourcesCompactor(Project proj) {
|
||||
this.proj = proj;
|
||||
this.baseFolder = new File(proj.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||
if (!baseFolder.exists()) baseFolder.mkdirs();
|
||||
}
|
||||
|
||||
public void compactData() {
|
||||
compactJsonData();
|
||||
for (CompressedSpritesheet cs : compressedSpritesheets) {
|
||||
cs.drawFile();
|
||||
}
|
||||
for (File preserved : preservedSpritesheets) {
|
||||
FileUtils.copyFile(preserved, new File(baseFolder.getAbsolutePath() + File.separator + DEFAULT_DRAWABLE_REL_PATH + File.separator + preserved.getName()));
|
||||
}
|
||||
compactMaps();
|
||||
}
|
||||
|
||||
public void compactJsonData() {
|
||||
final List<File> filesCovered = new LinkedList<File>();
|
||||
|
||||
File folder = new File(baseFolder.getAbsolutePath() + File.separator + GameDataSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
if (!folder.exists()) folder.mkdirs();
|
||||
|
||||
for (ActorCondition ac : proj.baseContent.gameData.actorConditions) {
|
||||
if (filesCovered.contains(ac.jsonFile)) continue;
|
||||
File currentFile = ac.jsonFile;
|
||||
filesCovered.add(currentFile);
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (ActorCondition acond : proj.baseContent.gameData.actorConditions) {
|
||||
if (!acond.jsonFile.equals(currentFile)) continue;
|
||||
Map json = acond.toJson();
|
||||
json.put("iconID", convertObjectSprite(acond.icon_id).toStringID());
|
||||
dataToSave.add(json);
|
||||
}
|
||||
File target = new File(folder, ac.jsonFile.getName());
|
||||
writeJson(dataToSave, target);
|
||||
}
|
||||
|
||||
for (Item it : proj.baseContent.gameData.items) {
|
||||
if (filesCovered.contains(it.jsonFile)) continue;
|
||||
File currentFile = it.jsonFile;
|
||||
filesCovered.add(currentFile);
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (Item item : proj.baseContent.gameData.items) {
|
||||
if (!item.jsonFile.equals(currentFile)) continue;
|
||||
Map json = item.toJson();
|
||||
json.put("iconID", convertObjectSprite(item.icon_id).toStringID());
|
||||
dataToSave.add(json);
|
||||
}
|
||||
File target = new File(folder, it.jsonFile.getName());
|
||||
writeJson(dataToSave, target);
|
||||
}
|
||||
|
||||
|
||||
for (NPC np : proj.baseContent.gameData.npcs) {
|
||||
if (filesCovered.contains(np.jsonFile)) continue;
|
||||
File currentFile = np.jsonFile;
|
||||
filesCovered.add(currentFile);
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (NPC npc : proj.baseContent.gameData.npcs) {
|
||||
if (!npc.jsonFile.equals(currentFile)) continue;
|
||||
Map json = npc.toJson();
|
||||
if (proj.getImage(npc.icon_id).getWidth(null) == TILE_WIDTH_IN_PIXELS || proj.getImage(npc.icon_id).getHeight(null) == TILE_HEIGHT_IN_PIXELS) {
|
||||
json.put("iconID", convertObjectSprite(npc.icon_id).toStringID());
|
||||
}
|
||||
dataToSave.add(json);
|
||||
}
|
||||
File target = new File(folder, np.jsonFile.getName());
|
||||
writeJson(dataToSave, target);
|
||||
}
|
||||
|
||||
File[] remainingFiles = proj.baseContent.gameData.baseFolder.listFiles(new FileFilter() {
|
||||
@Override
|
||||
public boolean accept(File arg0) {
|
||||
return arg0.getName().endsWith(".json") && !filesCovered.contains(arg0);
|
||||
}
|
||||
});
|
||||
|
||||
for (File source : remainingFiles) {
|
||||
File target = new File(folder, source.getName());
|
||||
minifyJson(source, target);
|
||||
}
|
||||
}
|
||||
|
||||
private Minify jsonMinifier = new Minify();
|
||||
|
||||
private void writeJson(List<Map> dataToSave, File target) {
|
||||
String toWrite = FileUtils.toJsonString(dataToSave);
|
||||
toWrite = jsonMinifier.minify(toWrite);
|
||||
FileUtils.writeStringToFile(toWrite, target, null);
|
||||
try {
|
||||
FileWriter w = new FileWriter(target);
|
||||
w.write(toWrite);
|
||||
w.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void minifyJson(File source, File target) {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
try {
|
||||
FileInputStream fis = new FileInputStream(source);
|
||||
jsonMinifier.minify(fis, baos);
|
||||
FileWriter w = new FileWriter(target);
|
||||
w.write(baos.toString());
|
||||
w.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (UnterminatedRegExpLiteralException e) {
|
||||
e.printStackTrace();
|
||||
} catch (UnterminatedCommentException e) {
|
||||
e.printStackTrace();
|
||||
} catch (UnterminatedStringLiteralException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void compactMaps() {
|
||||
for (TMXMap map : proj.baseContent.gameMaps.tmxMaps) {
|
||||
TMXMap clone = map.clone();
|
||||
for (GameDataElement gde : clone.getBacklinks()) {
|
||||
gde.removeBacklink(clone);
|
||||
}
|
||||
clone.getBacklinks().clear();
|
||||
tiled.core.Map tmx = clone.tmxMap;
|
||||
compactMap(tmx, map.id);
|
||||
clone.tmxMap = null;
|
||||
clone.groups.clear();
|
||||
}
|
||||
}
|
||||
|
||||
private void compactMap(tiled.core.Map tmx, String name) {
|
||||
File target = new File(baseFolder.getAbsolutePath() + File.separator + TMXMapSet.DEFAULT_REL_PATH_IN_SOURCE + File.separator + name + ".tmx");
|
||||
if (!target.getParentFile().exists()) target.getParentFile().mkdirs();
|
||||
|
||||
Map<tiled.core.Tile, SpritesheetId> localConvertions = new LinkedHashMap<tiled.core.Tile, SpritesheetId>();
|
||||
List<CompressedSpritesheet> usedSpritesheets = new LinkedList<CompressedSpritesheet>();
|
||||
|
||||
List<tiled.core.TileSet> toRemove = new LinkedList<TileSet>();
|
||||
|
||||
for (tiled.core.TileSet ts : tmx.getTileSets()) {
|
||||
if (!ts.getName().equalsIgnoreCase("map_dynamic_placeholders")) {
|
||||
toRemove.add(ts);
|
||||
}
|
||||
}
|
||||
|
||||
for (tiled.core.TileLayer layer : tmx.getTileLayers()) {
|
||||
for (int x = 0; x < layer.getWidth(); x++) {
|
||||
for (int y = 0; y < layer.getHeight(); y++) {
|
||||
tiled.core.Tile tile = layer.getTileAt(x, y);
|
||||
if (tile != null && !tile.getTileSet().getName().equalsIgnoreCase("map_dynamic_placeholders")) {
|
||||
SpritesheetId sid = convertMapSprite(SpritesheetId.toStringID(tile.getTileSet().getName(), tile.getId()));
|
||||
localConvertions.put(tile, sid);
|
||||
if (!usedSpritesheets.contains(spritesheetsBySidForMaps.get(sid))) {
|
||||
usedSpritesheets.add(spritesheetsBySidForMaps.get(sid));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Map<CompressedSpritesheet, tiled.core.TileSet> csToTs = new LinkedHashMap<CompressedSpritesheet, tiled.core.TileSet>();
|
||||
for (CompressedSpritesheet cs : usedSpritesheets) {
|
||||
cs.drawFile();
|
||||
tiled.core.TileSet ts = new tiled.core.TileSet();
|
||||
csToTs.put(cs, ts);
|
||||
tiled.util.BasicTileCutter cutter = new tiled.util.BasicTileCutter(TILE_WIDTH_IN_PIXELS, TILE_HEIGHT_IN_PIXELS, 0, 0);
|
||||
try {
|
||||
ts.importTileBitmap(cs.f.getAbsolutePath(), cutter);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
ts.setName(cs.prefix + Integer.toString(cs.index));
|
||||
//ts.setSource("../drawable/"+ts.getName()+TILESHEET_SUFFIX);
|
||||
tmx.addTileset(ts);
|
||||
}
|
||||
|
||||
for (tiled.core.TileLayer layer : tmx.getTileLayers()) {
|
||||
for (tiled.core.Tile tile : localConvertions.keySet()) {
|
||||
SpritesheetId sid = localConvertions.get(tile);
|
||||
layer.replaceTile(tile, csToTs.get(spritesheetsBySidForMaps.get(sid)).getTile(sid.offset));
|
||||
}
|
||||
}
|
||||
|
||||
for (tiled.core.TileSet ts : toRemove) {
|
||||
tmx.removeTileset(ts);
|
||||
}
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
TMXMapWriter writer = new TMXMapWriter();
|
||||
writer.settings.layerCompressionMethod = TMXMapWriter.Settings.LAYER_COMPRESSION_METHOD_ZLIB;
|
||||
try {
|
||||
writer.writeMap(tmx, baos, target.getAbsolutePath());
|
||||
String xml = baos.toString();
|
||||
FileWriter w = new FileWriter(target);
|
||||
w.write(xml);
|
||||
w.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private SpritesheetId convertObjectSprite(String originalSpriteId) {
|
||||
if (spritesRelocationForObjects.containsKey(SpritesheetId.getInstance(originalSpriteId))) {
|
||||
return spritesRelocationForObjects.get(SpritesheetId.getInstance(originalSpriteId));
|
||||
} else if (currentSpritesheetForObjects == null || !currentSpritesheetForObjects.hasFreeSlot()) {
|
||||
currentSpritesheetForObjects = new CompressedSpritesheet(TILESHEET_PREFIX_FOR_OBJECTS, currentSpritesheetIndexForObjects);
|
||||
compressedSpritesheets.add(currentSpritesheetForObjects);
|
||||
currentSpritesheetIndexForObjects++;
|
||||
}
|
||||
SpritesheetId sid = currentSpritesheetForObjects.addSprite(originalSpriteId);
|
||||
spritesRelocationForObjects.put(SpritesheetId.getInstance(originalSpriteId), sid);
|
||||
return sid;
|
||||
}
|
||||
|
||||
private SpritesheetId convertMapSprite(String originalSpriteId) {
|
||||
if (spritesRelocationForMaps.containsKey(SpritesheetId.getInstance(originalSpriteId))) {
|
||||
return spritesRelocationForMaps.get(SpritesheetId.getInstance(originalSpriteId));
|
||||
} else if (currentSpritesheetForMaps == null || !currentSpritesheetForMaps.hasFreeSlot()) {
|
||||
currentSpritesheetForMaps = new CompressedSpritesheet(TILESHEET_PREFIX_FOR_MAPS, currentSpritesheetIndexForMaps);
|
||||
compressedSpritesheets.add(currentSpritesheetForMaps);
|
||||
currentSpritesheetIndexForMaps++;
|
||||
}
|
||||
SpritesheetId sid = currentSpritesheetForMaps.addSprite(originalSpriteId);
|
||||
spritesRelocationForMaps.put(SpritesheetId.getInstance(originalSpriteId), sid);
|
||||
spritesheetsBySidForMaps.put(sid, currentSpritesheetForMaps);
|
||||
return sid;
|
||||
}
|
||||
|
||||
|
||||
private static final int TILESHEET_WIDTH_IN_SPRITES = 8;
|
||||
private static final int TILESHEET_HEIGHT_IN_SPRITES = 8;
|
||||
private static final int TILE_WIDTH_IN_PIXELS = 32;
|
||||
private static final int TILE_HEIGHT_IN_PIXELS = 32;
|
||||
|
||||
private static final String TILESHEET_PREFIX_FOR_OBJECTS = "obj_";
|
||||
private static final String TILESHEET_PREFIX_FOR_MAPS = "map_";
|
||||
private static final String TILESHEET_SUFFIX = ".png";
|
||||
|
||||
private static final String DEFAULT_DRAWABLE_REL_PATH = SpriteSheetSet.DEFAULT_REL_PATH_IN_SOURCE;
|
||||
|
||||
private class CompressedSpritesheet {
|
||||
String prefix;
|
||||
int index;
|
||||
File f;
|
||||
|
||||
|
||||
boolean mustDraw = true;
|
||||
int nextFreeSlot = 0;
|
||||
String[] originalSpritesId = new String[TILESHEET_WIDTH_IN_SPRITES * TILESHEET_HEIGHT_IN_SPRITES];
|
||||
|
||||
public CompressedSpritesheet(String prefix, int index) {
|
||||
this.prefix = prefix;
|
||||
this.index = index;
|
||||
|
||||
File folder = new File(ResourcesCompactor.this.baseFolder.getAbsolutePath() + File.separator + DEFAULT_DRAWABLE_REL_PATH);
|
||||
if (!folder.exists()) folder.mkdirs();
|
||||
this.f = new File(folder, prefix + Integer.toString(index) + TILESHEET_SUFFIX);
|
||||
}
|
||||
|
||||
public boolean hasFreeSlot() {
|
||||
return nextFreeSlot < TILESHEET_WIDTH_IN_SPRITES * TILESHEET_HEIGHT_IN_SPRITES;
|
||||
}
|
||||
|
||||
public SpritesheetId addSprite(String spriteId) {
|
||||
mustDraw = true;
|
||||
originalSpritesId[nextFreeSlot] = spriteId;
|
||||
nextFreeSlot++;
|
||||
return SpritesheetId.getInstance(prefix + Integer.toString(index), nextFreeSlot - 1);
|
||||
}
|
||||
|
||||
|
||||
public void drawFile() {
|
||||
if (!mustDraw) return;
|
||||
BufferedImage img = new BufferedImage(TILESHEET_WIDTH_IN_SPRITES * TILE_WIDTH_IN_PIXELS, TILESHEET_HEIGHT_IN_SPRITES * TILE_HEIGHT_IN_PIXELS, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g = (Graphics2D) img.getGraphics();
|
||||
Color transparent = new Color(0, 0, 0, 0);
|
||||
g.setColor(transparent);
|
||||
g.fillRect(0, 0, img.getWidth(), img.getHeight());
|
||||
for (int i = 0; i < nextFreeSlot; i++) {
|
||||
g.drawImage(
|
||||
proj.getImage(originalSpritesId[i]),
|
||||
(i % TILESHEET_WIDTH_IN_SPRITES) * TILE_WIDTH_IN_PIXELS,
|
||||
(i / TILESHEET_WIDTH_IN_SPRITES) * TILE_HEIGHT_IN_PIXELS,
|
||||
TILE_WIDTH_IN_PIXELS,
|
||||
TILE_HEIGHT_IN_PIXELS,
|
||||
null);
|
||||
}
|
||||
try {
|
||||
ImageIO.write(img, "png", f);
|
||||
mustDraw = false;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
boolean mustDraw = true;
|
||||
int nextFreeSlot = 0;
|
||||
String[] originalSpritesId = new String[TILESHEET_WIDTH_IN_SPRITES * TILESHEET_HEIGHT_IN_SPRITES];
|
||||
|
||||
public CompressedSpritesheet(String prefix, int index) {
|
||||
this.prefix = prefix;
|
||||
this.index = index;
|
||||
|
||||
File folder = new File(ResourcesCompactor.this.baseFolder.getAbsolutePath()+File.separator+DEFAULT_DRAWABLE_REL_PATH);
|
||||
if (!folder.exists()) folder.mkdirs();
|
||||
this.f = new File(folder, prefix+Integer.toString(index)+TILESHEET_SUFFIX);
|
||||
}
|
||||
|
||||
public boolean hasFreeSlot() {
|
||||
return nextFreeSlot < TILESHEET_WIDTH_IN_SPRITES * TILESHEET_HEIGHT_IN_SPRITES;
|
||||
}
|
||||
|
||||
public SpritesheetId addSprite(String spriteId) {
|
||||
mustDraw = true;
|
||||
originalSpritesId[nextFreeSlot] = spriteId;
|
||||
nextFreeSlot++;
|
||||
return SpritesheetId.getInstance(prefix+Integer.toString(index), nextFreeSlot - 1);
|
||||
}
|
||||
|
||||
|
||||
public void drawFile() {
|
||||
if (!mustDraw) return;
|
||||
BufferedImage img = new BufferedImage(TILESHEET_WIDTH_IN_SPRITES * TILE_WIDTH_IN_PIXELS, TILESHEET_HEIGHT_IN_SPRITES * TILE_HEIGHT_IN_PIXELS, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g = (Graphics2D)img.getGraphics();
|
||||
Color transparent = new Color(0, 0, 0, 0);
|
||||
g.setColor(transparent);
|
||||
g.fillRect(0, 0, img.getWidth(), img.getHeight());
|
||||
for (int i = 0; i < nextFreeSlot; i++) {
|
||||
g.drawImage(
|
||||
proj.getImage(originalSpritesId[i]),
|
||||
(i % TILESHEET_WIDTH_IN_SPRITES) * TILE_WIDTH_IN_PIXELS,
|
||||
(i / TILESHEET_WIDTH_IN_SPRITES) * TILE_HEIGHT_IN_PIXELS,
|
||||
TILE_WIDTH_IN_PIXELS,
|
||||
TILE_HEIGHT_IN_PIXELS,
|
||||
null);
|
||||
}
|
||||
try {
|
||||
ImageIO.write(img, "png", f);
|
||||
mustDraw = false;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -4,35 +4,35 @@ import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class SpritesheetId {
|
||||
static Map<String, SpritesheetId> instancesCache = new LinkedHashMap<String, SpritesheetId>();
|
||||
static Map<String, SpritesheetId> instancesCache = new LinkedHashMap<String, SpritesheetId>();
|
||||
|
||||
String tileset;
|
||||
int offset;
|
||||
String tileset;
|
||||
int offset;
|
||||
|
||||
static SpritesheetId getInstance(String id) {
|
||||
String[] values = id.split(":");
|
||||
return getInstance(values[0], Integer.parseInt(values[1]));
|
||||
}
|
||||
static SpritesheetId getInstance(String id) {
|
||||
String[] values = id.split(":");
|
||||
return getInstance(values[0], Integer.parseInt(values[1]));
|
||||
}
|
||||
|
||||
static SpritesheetId getInstance(String tilesetId, int offset) {
|
||||
if (!instancesCache.containsKey(toStringID(tilesetId, offset))) {
|
||||
SpritesheetId instance = new SpritesheetId(tilesetId, offset);
|
||||
instancesCache.put(instance.toStringID(), instance);
|
||||
}
|
||||
return instancesCache.get(toStringID(tilesetId, offset));
|
||||
}
|
||||
static SpritesheetId getInstance(String tilesetId, int offset) {
|
||||
if (!instancesCache.containsKey(toStringID(tilesetId, offset))) {
|
||||
SpritesheetId instance = new SpritesheetId(tilesetId, offset);
|
||||
instancesCache.put(instance.toStringID(), instance);
|
||||
}
|
||||
return instancesCache.get(toStringID(tilesetId, offset));
|
||||
}
|
||||
|
||||
private SpritesheetId(String tileset, int offset) {
|
||||
this.tileset = tileset;
|
||||
this.offset = offset;
|
||||
}
|
||||
private SpritesheetId(String tileset, int offset) {
|
||||
this.tileset = tileset;
|
||||
this.offset = offset;
|
||||
}
|
||||
|
||||
public String toStringID() {
|
||||
return toStringID(tileset, offset);
|
||||
}
|
||||
public String toStringID() {
|
||||
return toStringID(tileset, offset);
|
||||
}
|
||||
|
||||
static String toStringID(String tileset, int offset) {
|
||||
return tileset+":"+Integer.toString(offset);
|
||||
}
|
||||
static String toStringID(String tileset, int offset) {
|
||||
return tileset + ":" + Integer.toString(offset);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,274 +1,249 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.tools.writermode;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.Serializable;
|
||||
import java.io.StringWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
||||
import com.gpl.rpg.atcontentstudio.model.*;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
import com.gpl.rpg.atcontentstudio.utils.FileUtils;
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.io.*;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
public class WriterModeDataSet implements ProjectTreeNode, Serializable {
|
||||
|
||||
private static final long serialVersionUID = 5434504851883441971L;
|
||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "writer.json";
|
||||
|
||||
|
||||
public GameSource parent;
|
||||
public File writerFile;
|
||||
|
||||
public List<WriterModeData> writerModeDataList = new ArrayList<WriterModeData>();
|
||||
|
||||
public WriterModeDataSet(GameSource gameSource) {
|
||||
this.parent = gameSource;
|
||||
writerFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||
parse();
|
||||
}
|
||||
private static final long serialVersionUID = 5434504851883441971L;
|
||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "writer.json";
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return writerModeDataList.get(childIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return writerModeDataList.size();
|
||||
}
|
||||
public GameSource parent;
|
||||
public File writerFile;
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
public List<WriterModeData> writerModeDataList = new ArrayList<WriterModeData>();
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return writerModeDataList.indexOf(node);
|
||||
}
|
||||
public WriterModeDataSet(GameSource gameSource) {
|
||||
this.parent = gameSource;
|
||||
writerFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||
parse();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return writerModeDataList.get(childIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return writerModeDataList.size();
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public Enumeration children() {
|
||||
return Collections.enumeration(writerModeDataList);
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return writerModeDataList.indexOf(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "")+"Dialogue sketches";
|
||||
}
|
||||
@SuppressWarnings("rawtypes")
|
||||
@Override
|
||||
public Enumeration children() {
|
||||
return Collections.enumeration(writerModeDataList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getStdOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return (needsSaving() ? "*" : "") + "Dialogue sketches";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return parent.getProject();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return writerModeDataList.isEmpty();
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public void save(File jsonFile) {
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (WriterModeData data : writerModeDataList) {
|
||||
if (data.jsonFile.equals(jsonFile)) {
|
||||
dataToSave.add(data.toJson());
|
||||
}
|
||||
}
|
||||
if (dataToSave.isEmpty() && writerFile.exists()) {
|
||||
if (writerFile.delete()) {
|
||||
Notification.addSuccess("File "+writerFile.getAbsolutePath()+" deleted.");
|
||||
} else {
|
||||
Notification.addError("Error deleting file "+writerFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
StringWriter writer = new JsonPrettyWriter();
|
||||
try {
|
||||
JSONArray.writeJSONString(dataToSave, writer);
|
||||
} catch (IOException e) {
|
||||
//Impossible with a StringWriter
|
||||
}
|
||||
String toWrite = writer.toString();
|
||||
try {
|
||||
FileWriter w = new FileWriter(writerFile);
|
||||
w.write(toWrite);
|
||||
w.close();
|
||||
for (WriterModeData element : writerModeDataList) {
|
||||
element.state = GameDataElement.State.saved;
|
||||
}
|
||||
Notification.addSuccess("Json file "+writerFile.getAbsolutePath()+" saved.");
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while writing json file "+writerFile.getAbsolutePath()+" : "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public List<SaveEvent> attemptSave() {
|
||||
List<SaveEvent> events = new ArrayList<SaveEvent>();
|
||||
for (WriterModeData data : writerModeDataList) {
|
||||
if (data.needsSaving()) {
|
||||
events.add(new SaveEvent(SaveEvent.Type.alsoSave, data));
|
||||
}
|
||||
}
|
||||
return events;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public void parse() {
|
||||
if (!writerFile.exists()) return;
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(writerFile);
|
||||
List writerDataListJson = (List) parser.parse(reader);
|
||||
for (Object obj : writerDataListJson) {
|
||||
Map jsonObj = (Map)obj;
|
||||
WriterModeData data = new WriterModeData(this, jsonObj);
|
||||
data.writable = true;
|
||||
writerModeDataList.add(data);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file "+writerFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file "+writerFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file "+writerFile.getAbsolutePath()+": "+e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
|
||||
public WriterModeData getWriterSketch(String id) {
|
||||
for (WriterModeData sketch : writerModeDataList) {
|
||||
if (id.equals(sketch.id)){
|
||||
return sketch;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
return DefaultIcons.getStdOpenIcon();
|
||||
}
|
||||
|
||||
public WriterModeData get(int index) {
|
||||
return writerModeDataList.get(index);
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
|
||||
public void add(WriterModeData node) {
|
||||
ProjectTreeNode higherEmptyParent = this;
|
||||
while (higherEmptyParent != null) {
|
||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode)higherEmptyParent.getParent()).isEmpty()) higherEmptyParent = (ProjectTreeNode)higherEmptyParent.getParent();
|
||||
else break;
|
||||
}
|
||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||
writerModeDataList.add(node);
|
||||
node.writable = true;
|
||||
if (node.jsonFile == null) node.jsonFile = this.writerFile;
|
||||
node.parent = this;
|
||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||
else node.notifyCreated();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : writerModeDataList) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return writerModeDataList.isEmpty();
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public void save(File jsonFile) {
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (WriterModeData data : writerModeDataList) {
|
||||
if (data.jsonFile.equals(jsonFile)) {
|
||||
dataToSave.add(data.toJson());
|
||||
}
|
||||
}
|
||||
if (dataToSave.isEmpty() && writerFile.exists()) {
|
||||
if (writerFile.delete()) {
|
||||
Notification.addSuccess("File " + writerFile.getAbsolutePath() + " deleted.");
|
||||
} else {
|
||||
Notification.addError("Error deleting file " + writerFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
String toWrite = FileUtils.toJsonString(dataToSave);
|
||||
if(FileUtils.writeStringToFile(toWrite, writerFile, "Json file " + writerFile.getAbsolutePath())) {
|
||||
for (WriterModeData element : writerModeDataList) {
|
||||
element.state = GameDataElement.State.saved;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public List<SaveEvent> attemptSave() {
|
||||
List<SaveEvent> events = new ArrayList<SaveEvent>();
|
||||
for (WriterModeData data : writerModeDataList) {
|
||||
if (data.needsSaving()) {
|
||||
events.add(new SaveEvent(SaveEvent.Type.alsoSave, data));
|
||||
}
|
||||
}
|
||||
return events;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public void parse() {
|
||||
if (!writerFile.exists()) return;
|
||||
JSONParser parser = new JSONParser();
|
||||
FileReader reader = null;
|
||||
try {
|
||||
reader = new FileReader(writerFile);
|
||||
List writerDataListJson = (List) parser.parse(reader);
|
||||
for (Object obj : writerDataListJson) {
|
||||
Map jsonObj = (Map) obj;
|
||||
WriterModeData data = new WriterModeData(this, jsonObj);
|
||||
data.writable = true;
|
||||
writerModeDataList.add(data);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
Notification.addError("Error while parsing JSON file " + writerFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
Notification.addError("Error while parsing JSON file " + writerFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} catch (ParseException e) {
|
||||
Notification.addError("Error while parsing JSON file " + writerFile.getAbsolutePath() + ": " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (reader != null)
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public WriterModeData getWriterSketch(String id) {
|
||||
for (WriterModeData sketch : writerModeDataList) {
|
||||
if (id.equals(sketch.id)) {
|
||||
return sketch;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public WriterModeData get(int index) {
|
||||
return writerModeDataList.get(index);
|
||||
}
|
||||
|
||||
public void add(WriterModeData node) {
|
||||
ProjectTreeNode higherEmptyParent = this;
|
||||
while (higherEmptyParent != null) {
|
||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode) higherEmptyParent.getParent()).isEmpty())
|
||||
higherEmptyParent = (ProjectTreeNode) higherEmptyParent.getParent();
|
||||
else break;
|
||||
}
|
||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||
writerModeDataList.add(node);
|
||||
node.writable = true;
|
||||
if (node.jsonFile == null) node.jsonFile = this.writerFile;
|
||||
node.parent = this;
|
||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
||||
else node.notifyCreated();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
for (ProjectTreeNode node : writerModeDataList) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,180 +1,203 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Desktop;
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.List;
|
||||
import java.util.Scanner;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JEditorPane;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.event.HyperlinkEvent;
|
||||
import javax.swing.event.HyperlinkEvent.EventType;
|
||||
import javax.swing.event.HyperlinkListener;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.ATContentStudio;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.jidesoft.swing.JideTabbedPane;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.HyperlinkEvent;
|
||||
import javax.swing.event.HyperlinkEvent.EventType;
|
||||
import javax.swing.event.HyperlinkListener;
|
||||
import java.awt.*;
|
||||
import java.io.IOException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.List;
|
||||
import java.util.Scanner;
|
||||
|
||||
public class AboutEditor extends Editor {
|
||||
|
||||
private static final long serialVersionUID = 6230549148222457139L;
|
||||
private static final long serialVersionUID = 6230549148222457139L;
|
||||
|
||||
public static final String WELCOME_STRING =
|
||||
"<html><head>" +
|
||||
"<meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html; charset=UTF-8\\\" />" +
|
||||
"</head><body>" +
|
||||
"<table><tr valign=\"top\">" +
|
||||
"<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/>" +
|
||||
"<br/>" +
|
||||
"This is a content editor for Andor's Trail.<br/>" +
|
||||
"<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=\"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=\"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=\"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/>" +
|
||||
"Contributors: <br/>" +
|
||||
"Quentin Delvallet<br/>" +
|
||||
"Žižkin<br/>" +
|
||||
"Gonk<br/>" +
|
||||
"<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/>" +
|
||||
"License: <a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache License 2.0</a><br/>" +
|
||||
"<br/>" +
|
||||
"<a href=\"http://fifesoft.com/rsyntaxtextarea/\">RSyntaxTextArea</a> by Robert Futrell.<br/>" +
|
||||
"License: <a href=\"http://fifesoft.com/rsyntaxtextarea/RSyntaxTextArea.License.txt\">Modified BSD License (a.k.a. 3-Clause BSD)</a><br/>" +
|
||||
"<br/>" +
|
||||
"<a href=\"http://www.jidesoft.com/products/oss.htm\">JIDE Common Layer</a> by JIDE Software.<br/>" +
|
||||
"License: <a href=\"http://openjdk.java.net/legal/gplv2+ce.html\">GPL v2 with classpath exception</a><br/>" +
|
||||
"<br/>" +
|
||||
"A modified version of <a href=\"https://github.com/bjorn/tiled/tree/master/util/java/libtiled-java\">libtiled-java</a> by Adam Turk & Thorbjorn Lindeijer.<br/>" +
|
||||
"License: <a href=\"https://github.com/bjorn/tiled/blob/master/LICENSE.BSD\">Simplified BSD License (a.k.a 2-Clause BSD)</a><br/>" +
|
||||
"Sources of the modified version are included in this package.<br/>" +
|
||||
"<br/>" +
|
||||
"<a href=\"http://prefuse.org/\">Prefuse</a> by the Berkeley Institue of Design.<br/>" +
|
||||
"License: <a href=\"http://prefuse.org/license-prefuse.txt\">Modified BSD License (a.k.a 3-Clause BSD)</a><br/>" +
|
||||
"<br/>" +
|
||||
"<a href=\"http://www.beanshell.org/\">BeanShell</a> by Pat Niemeyer.<br/>" +
|
||||
"License: <a href=\"http://www.beanshell.org/license.html\">LGPL v3</a><br/>" +
|
||||
"<br/>" +
|
||||
"A slightly modified version of <a href=\"https://github.com/zackehh/siphash-java\">SipHash for Java</a> by Isaac Whitfield.<br/>" +
|
||||
"License: <a href=\"https://github.com/zackehh/siphash-java/blob/master/LICENSE\">MIT License</a><br/>" +
|
||||
"<br/>" +
|
||||
"<a href=\"https://jsoup.org/\">jsoup</a> by Jonathan Hedley<br/>" +
|
||||
"License: <a href=\"https://jsoup.org/license\">MIT License</a><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/>" +
|
||||
"License: <a href=\"http://www.gnu.org/licenses/gpl-3.0.html\">GPL v3</a><br/>" +
|
||||
"<br/>" +
|
||||
"A slightly modified version of <a href=\"www.whoischarles.com\">Minify.java</a> by Charles Bihis<br/>" +
|
||||
"License: <a href=\"https://github.com/charlesbihis/minify#license\">Douglas Crockford variant of MIT License</a><br/>" +
|
||||
"<br/>" +
|
||||
"See the tabs below to find the full license text for each of these.<br/>" +
|
||||
"<br/>" +
|
||||
"The Windows installer was created with:<br/>" +
|
||||
"<a href=\"http://nsis.sourceforge.net/Main_Page\">NSIS (Nullsoft Scriptable Install System) v2.46</a>" +
|
||||
"</td></tr></table>" +
|
||||
"</body></html>";
|
||||
|
||||
|
||||
public static final AboutEditor instance = new AboutEditor();
|
||||
@SuppressWarnings("resource")
|
||||
private AboutEditor() {
|
||||
this.name="About "+ATContentStudio.APP_NAME;
|
||||
this.icon = new ImageIcon(DefaultIcons.getMainIconIcon());
|
||||
this.target = new GameDataElement(){
|
||||
private static final long serialVersionUID = -227480102288529682L;
|
||||
@Override
|
||||
public GameDataSet getDataSet() {return null;}
|
||||
@Override
|
||||
public String getDesc() {return null;}
|
||||
@Override
|
||||
public void parse() {}
|
||||
@Override
|
||||
public void link() {}
|
||||
@Override
|
||||
public GameDataElement clone() {return null;}
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {}
|
||||
@Override
|
||||
public String getProjectFilename() {return null;}
|
||||
@Override
|
||||
public void save() {}
|
||||
@Override
|
||||
public List<SaveEvent> attemptSave() {return null;}
|
||||
};
|
||||
|
||||
setLayout(new BorderLayout());
|
||||
JideTabbedPane editorTabsHolder = new JideTabbedPane(JideTabbedPane.BOTTOM);
|
||||
editorTabsHolder.setTabShape(JideTabbedPane.SHAPE_FLAT);
|
||||
editorTabsHolder.setUseDefaultShowCloseButtonOnTab(false);
|
||||
editorTabsHolder.setShowCloseButtonOnTab(false);
|
||||
add(editorTabsHolder, BorderLayout.CENTER);
|
||||
|
||||
editorTabsHolder.add("Welcome", getInfoPane(WELCOME_STRING, "text/html"));
|
||||
editorTabsHolder.add("JSON.simple License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.JSON.simple.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("RSyntaxTextArea License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/RSyntaxTextArea.License.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("JIDE Common Layer License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.JIDE.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("libtiled-java License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.libtiled.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("prefuse License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/license-prefuse.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("BeanShell License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.LGPLv3.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("SipHash for Java License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.siphash-zackehh.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("jsoup License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.jsoup.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("General PO Parser License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.GPLv3.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("Minify.java License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.minify.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("ATCS License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.GPLv3.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
|
||||
}
|
||||
|
||||
private JPanel getInfoPane(String content, String mime) {
|
||||
JEditorPane welcome = new JEditorPane();
|
||||
welcome.setContentType(mime);
|
||||
welcome.setText(content);
|
||||
welcome.setEditable(false);
|
||||
welcome.addHyperlinkListener(new HyperlinkListener() {
|
||||
@Override
|
||||
public void hyperlinkUpdate(HyperlinkEvent arg0) {
|
||||
arg0.getEventType();
|
||||
if (arg0.getEventType() == EventType.ACTIVATED) {
|
||||
if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
|
||||
try {
|
||||
Desktop.getDesktop().browse(arg0.getURL().toURI());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (URISyntaxException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
JPanel pane = new JPanel();
|
||||
pane.setLayout(new BorderLayout());
|
||||
pane.add(new JScrollPane(welcome), BorderLayout.CENTER);
|
||||
return pane;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void targetUpdated() {}
|
||||
public static final String WELCOME_STRING =
|
||||
"<html><head>" +
|
||||
"<meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html; charset=UTF-8\\\" />" +
|
||||
"</head><body>" +
|
||||
"<table><tr valign=\"top\">" +
|
||||
"<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/>" +
|
||||
"<br/>" +
|
||||
"This is a content editor for Andor's Trail.<br/>" +
|
||||
"<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=\"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=\"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=\"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/>" +
|
||||
"Contributors: <br/>" +
|
||||
"Quentin Delvallet<br/>" +
|
||||
"Žižkin<br/>" +
|
||||
"Gonk<br/>" +
|
||||
"<a href=\"https://github.com/OMGeeky\">OMGeeky</a><br/>" +
|
||||
"<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/>" +
|
||||
"License: <a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache License 2.0</a><br/>" +
|
||||
"<br/>" +
|
||||
"<a href=\"http://fifesoft.com/rsyntaxtextarea/\">RSyntaxTextArea</a> by Robert Futrell.<br/>" +
|
||||
"License: <a href=\"http://fifesoft.com/rsyntaxtextarea/RSyntaxTextArea.License.txt\">Modified BSD License (a.k.a. 3-Clause BSD)</a><br/>" +
|
||||
"<br/>" +
|
||||
"<a href=\"http://www.jidesoft.com/products/oss.htm\">JIDE Common Layer</a> by JIDE Software.<br/>" +
|
||||
"License: <a href=\"http://openjdk.java.net/legal/gplv2+ce.html\">GPL v2 with classpath exception</a><br/>" +
|
||||
"<br/>" +
|
||||
"A modified version of <a href=\"https://github.com/bjorn/tiled/tree/master/util/java/libtiled-java\">libtiled-java</a> by Adam Turk & Thorbjorn Lindeijer.<br/>" +
|
||||
"License: <a href=\"https://github.com/bjorn/tiled/blob/master/LICENSE.BSD\">Simplified BSD License (a.k.a 2-Clause BSD)</a><br/>" +
|
||||
"Sources of the modified version are included in this package.<br/>" +
|
||||
"<br/>" +
|
||||
"<a href=\"http://prefuse.org/\">Prefuse</a> by the Berkeley Institue of Design.<br/>" +
|
||||
"License: <a href=\"http://prefuse.org/license-prefuse.txt\">Modified BSD License (a.k.a 3-Clause BSD)</a><br/>" +
|
||||
"<br/>" +
|
||||
"<a href=\"http://www.beanshell.org/\">BeanShell</a> by Pat Niemeyer.<br/>" +
|
||||
"License: <a href=\"http://www.beanshell.org/license.html\">LGPL v3</a><br/>" +
|
||||
"<br/>" +
|
||||
"A slightly modified version of <a href=\"https://github.com/zackehh/siphash-java\">SipHash for Java</a> by Isaac Whitfield.<br/>" +
|
||||
"License: <a href=\"https://github.com/zackehh/siphash-java/blob/master/LICENSE\">MIT License</a><br/>" +
|
||||
"<br/>" +
|
||||
"<a href=\"https://jsoup.org/\">jsoup</a> by Jonathan Hedley<br/>" +
|
||||
"License: <a href=\"https://jsoup.org/license\">MIT License</a><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/>" +
|
||||
"License: <a href=\"http://www.gnu.org/licenses/gpl-3.0.html\">GPL v3</a><br/>" +
|
||||
"<br/>" +
|
||||
"A slightly modified version of <a href=\"www.whoischarles.com\">Minify.java</a> by Charles Bihis<br/>" +
|
||||
"License: <a href=\"https://github.com/charlesbihis/minify#license\">Douglas Crockford variant of MIT License</a><br/>" +
|
||||
"<br/>" +
|
||||
"See the tabs below to find the full license text for each of these.<br/>" +
|
||||
"<br/>" +
|
||||
"The Windows installer was created with:<br/>" +
|
||||
"<a href=\"http://nsis.sourceforge.net/Main_Page\">NSIS (Nullsoft Scriptable Install System) v2.46</a>" +
|
||||
"</td></tr></table>" +
|
||||
"</body></html>";
|
||||
|
||||
|
||||
public static final AboutEditor instance = new AboutEditor();
|
||||
|
||||
@SuppressWarnings("resource")
|
||||
private AboutEditor() {
|
||||
this.name = "About " + ATContentStudio.APP_NAME;
|
||||
this.icon = new ImageIcon(DefaultIcons.getMainIconIcon());
|
||||
this.target = new GameDataElement() {
|
||||
private static final long serialVersionUID = -227480102288529682L;
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void parse() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void link() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataElement clone() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getProjectFilename() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SaveEvent> attemptSave() {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
setLayout(new BorderLayout());
|
||||
JideTabbedPane editorTabsHolder = new JideTabbedPane(JideTabbedPane.BOTTOM);
|
||||
editorTabsHolder.setTabShape(JideTabbedPane.SHAPE_FLAT);
|
||||
editorTabsHolder.setUseDefaultShowCloseButtonOnTab(false);
|
||||
editorTabsHolder.setShowCloseButtonOnTab(false);
|
||||
add(editorTabsHolder, BorderLayout.CENTER);
|
||||
|
||||
editorTabsHolder.add("Welcome", getInfoPane(WELCOME_STRING, "text/html"));
|
||||
editorTabsHolder.add("JSON.simple License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.JSON.simple.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("RSyntaxTextArea License",
|
||||
getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/RSyntaxTextArea.License.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("JIDE Common Layer License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.JIDE.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("libtiled-java License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.libtiled.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("prefuse License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/license-prefuse.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("BeanShell License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.LGPLv3.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("SipHash for Java License",
|
||||
getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.siphash-zackehh.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("jsoup License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.jsoup.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("General PO Parser License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.GPLv3.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("Minify.java License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.minify.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
editorTabsHolder.add("ATCS License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.GPLv3.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
||||
|
||||
}
|
||||
|
||||
private JPanel getInfoPane(String content, String mime) {
|
||||
JEditorPane welcome = new JEditorPane();
|
||||
welcome.setContentType(mime);
|
||||
welcome.setText(content);
|
||||
welcome.setEditable(false);
|
||||
welcome.addHyperlinkListener(new HyperlinkListener() {
|
||||
@Override
|
||||
public void hyperlinkUpdate(HyperlinkEvent arg0) {
|
||||
arg0.getEventType();
|
||||
if (arg0.getEventType() == EventType.ACTIVATED) {
|
||||
if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
|
||||
try {
|
||||
Desktop.getDesktop().browse(arg0.getURL().toURI());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (URISyntaxException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
JPanel pane = new JPanel();
|
||||
pane.setLayout(new BorderLayout());
|
||||
pane.add(new JScrollPane(welcome), BorderLayout.CENTER);
|
||||
return pane;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void targetUpdated() {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.*;
|
||||
|
||||
public class BooleanBasedCheckBox extends JCheckBox {
|
||||
|
||||
private static final long serialVersionUID = 3941646360487399554L;
|
||||
|
||||
public Boolean getBooleanValue() {
|
||||
return isSelected() ? Boolean.TRUE : null;
|
||||
}
|
||||
|
||||
public void setBooleanValue(Boolean val) {
|
||||
setSelected(val != null && val);
|
||||
}
|
||||
private static final long serialVersionUID = 3941646360487399554L;
|
||||
|
||||
public Boolean getBooleanValue() {
|
||||
return isSelected() ? Boolean.TRUE : null;
|
||||
}
|
||||
|
||||
public void setBooleanValue(Boolean val) {
|
||||
setSelected(val != null && val);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,160 +1,155 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.event.ComponentAdapter;
|
||||
import java.awt.event.ComponentEvent;
|
||||
import java.awt.event.ComponentListener;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseListener;
|
||||
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.TitledBorder;
|
||||
|
||||
public class CollapsiblePanel extends JPanel {
|
||||
|
||||
private static final long serialVersionUID = 319384990345722150L;
|
||||
|
||||
String title;
|
||||
TitledBorder border;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
public class CollapsiblePanel extends JPanel {
|
||||
|
||||
private static final long serialVersionUID = 319384990345722150L;
|
||||
|
||||
String title;
|
||||
TitledBorder border;
|
||||
|
||||
public CollapsiblePanel(String title) {
|
||||
super();
|
||||
this.title = title;
|
||||
border = BorderFactory.createTitledBorder(title);
|
||||
setBorder(border);
|
||||
BorderLayout borderLayout = new BorderLayout();
|
||||
setLayout(borderLayout);
|
||||
addMouseListener(mouseListener);
|
||||
}
|
||||
|
||||
MouseListener mouseListener = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
toggleVisibility();
|
||||
}
|
||||
};
|
||||
|
||||
ComponentListener contentComponentListener = new ComponentAdapter() {
|
||||
@Override
|
||||
public void componentShown(ComponentEvent e) {
|
||||
updateBorderTitle();
|
||||
}
|
||||
@Override
|
||||
public void componentHidden(ComponentEvent e) {
|
||||
updateBorderTitle();
|
||||
}
|
||||
};
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
super();
|
||||
this.title = title;
|
||||
border = BorderFactory.createTitledBorder(title);
|
||||
setBorder(border);
|
||||
BorderLayout borderLayout = new BorderLayout();
|
||||
setLayout(borderLayout);
|
||||
addMouseListener(mouseListener);
|
||||
}
|
||||
|
||||
MouseListener mouseListener = new MouseAdapter() {
|
||||
@Override
|
||||
public void mouseClicked(MouseEvent e) {
|
||||
toggleVisibility();
|
||||
}
|
||||
};
|
||||
|
||||
ComponentListener contentComponentListener = new ComponentAdapter() {
|
||||
@Override
|
||||
public void componentShown(ComponentEvent e) {
|
||||
updateBorderTitle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void componentHidden(ComponentEvent e) {
|
||||
updateBorderTitle();
|
||||
}
|
||||
};
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
String oldTitle = this.title;
|
||||
this.title = title;
|
||||
String oldTitle = this.title;
|
||||
this.title = title;
|
||||
firePropertyChange("title", oldTitle, this.title);
|
||||
updateBorderTitle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component add(Component comp) {
|
||||
comp.addComponentListener(contentComponentListener);
|
||||
Component r = super.add(comp);
|
||||
updateBorderTitle();
|
||||
return r;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component add(String name, Component comp) {
|
||||
comp.addComponentListener(contentComponentListener);
|
||||
Component r = super.add(name, comp);
|
||||
updateBorderTitle();
|
||||
return r;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component add(Component comp, int index) {
|
||||
comp.addComponentListener(contentComponentListener);
|
||||
Component r = super.add(comp, index);
|
||||
updateBorderTitle();
|
||||
return r;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(Component comp, Object constraints) {
|
||||
comp.addComponentListener(contentComponentListener);
|
||||
super.add(comp, constraints);
|
||||
updateBorderTitle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(Component comp, Object constraints, int index) {
|
||||
comp.addComponentListener(contentComponentListener);
|
||||
super.add(comp, constraints, index);
|
||||
updateBorderTitle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove(int index) {
|
||||
Component comp = getComponent(index);
|
||||
comp.removeComponentListener(contentComponentListener);
|
||||
super.remove(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove(Component comp) {
|
||||
comp.removeComponentListener(contentComponentListener);
|
||||
super.remove(comp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeAll() {
|
||||
for (Component c : getComponents()) {
|
||||
c.removeComponentListener(contentComponentListener);
|
||||
}
|
||||
super.removeAll();
|
||||
}
|
||||
|
||||
protected void toggleVisibility() {
|
||||
toggleVisibility(hasInvisibleComponent());
|
||||
}
|
||||
|
||||
protected void toggleVisibility(boolean visible) {
|
||||
for (Component c : getComponents()) {
|
||||
c.setVisible(visible);
|
||||
}
|
||||
updateBorderTitle();
|
||||
}
|
||||
|
||||
protected void updateBorderTitle() {
|
||||
String arrow = "";
|
||||
if (getComponentCount() > 0) {
|
||||
arrow = (hasInvisibleComponent()?"[+] ":"[-] ");
|
||||
}
|
||||
border.setTitle(arrow+title);
|
||||
repaint();
|
||||
}
|
||||
|
||||
protected final boolean hasInvisibleComponent() {
|
||||
for (Component c : getComponents()) {
|
||||
if (!c.isVisible()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component add(Component comp) {
|
||||
comp.addComponentListener(contentComponentListener);
|
||||
Component r = super.add(comp);
|
||||
updateBorderTitle();
|
||||
return r;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component add(String name, Component comp) {
|
||||
comp.addComponentListener(contentComponentListener);
|
||||
Component r = super.add(name, comp);
|
||||
updateBorderTitle();
|
||||
return r;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Component add(Component comp, int index) {
|
||||
comp.addComponentListener(contentComponentListener);
|
||||
Component r = super.add(comp, index);
|
||||
updateBorderTitle();
|
||||
return r;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(Component comp, Object constraints) {
|
||||
comp.addComponentListener(contentComponentListener);
|
||||
super.add(comp, constraints);
|
||||
updateBorderTitle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(Component comp, Object constraints, int index) {
|
||||
comp.addComponentListener(contentComponentListener);
|
||||
super.add(comp, constraints, index);
|
||||
updateBorderTitle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove(int index) {
|
||||
Component comp = getComponent(index);
|
||||
comp.removeComponentListener(contentComponentListener);
|
||||
super.remove(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove(Component comp) {
|
||||
comp.removeComponentListener(contentComponentListener);
|
||||
super.remove(comp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeAll() {
|
||||
for (Component c : getComponents()) {
|
||||
c.removeComponentListener(contentComponentListener);
|
||||
}
|
||||
super.removeAll();
|
||||
}
|
||||
|
||||
protected void toggleVisibility() {
|
||||
toggleVisibility(hasInvisibleComponent());
|
||||
}
|
||||
|
||||
protected void toggleVisibility(boolean visible) {
|
||||
for (Component c : getComponents()) {
|
||||
c.setVisible(visible);
|
||||
}
|
||||
updateBorderTitle();
|
||||
}
|
||||
|
||||
protected void updateBorderTitle() {
|
||||
String arrow = "";
|
||||
if (getComponentCount() > 0) {
|
||||
arrow = (hasInvisibleComponent() ? "[+] " : "[-] ");
|
||||
}
|
||||
border.setTitle(arrow + title);
|
||||
repaint();
|
||||
}
|
||||
|
||||
protected final boolean hasInvisibleComponent() {
|
||||
for (Component c : getComponents()) {
|
||||
if (!c.isVisible()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void collapse() {
|
||||
toggleVisibility(false);
|
||||
toggleVisibility(false);
|
||||
}
|
||||
|
||||
public void expand() {
|
||||
toggleVisibility(true);
|
||||
toggleVisibility(true);
|
||||
}
|
||||
|
||||
public void setExpanded(boolean expand) {
|
||||
toggleVisibility(expand);
|
||||
toggleVisibility(expand);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,198 +1,177 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.*;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
|
||||
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
|
||||
import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeData;
|
||||
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.*;
|
||||
import com.gpl.rpg.atcontentstudio.ui.map.TMXMapEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.map.WorldMapEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.sprites.SpritesheetEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.tools.writermode.WriterModeEditor;
|
||||
import com.jidesoft.swing.JideTabbedPane;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.beans.PropertyChangeListener;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.swing.Action;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Item;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.ItemCategory;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.JSONElement;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Quest;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
|
||||
import com.gpl.rpg.atcontentstudio.model.saves.SavedGame;
|
||||
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
|
||||
import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeData;
|
||||
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.ActorConditionEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.DialogueEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.DroplistEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.ItemCategoryEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.ItemEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.NPCEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.gamedataeditors.QuestEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.map.TMXMapEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.map.WorldMapEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.saves.SavedGameEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.sprites.SpritesheetEditor;
|
||||
import com.gpl.rpg.atcontentstudio.ui.tools.writermode.WriterModeEditor;
|
||||
import com.jidesoft.swing.JideTabbedPane;
|
||||
|
||||
public class EditorsArea extends JPanel {
|
||||
|
||||
private static final long serialVersionUID = 8801849846876081538L;
|
||||
private static final long serialVersionUID = 8801849846876081538L;
|
||||
|
||||
private Map<Object, Editor> editors = new LinkedHashMap<Object, Editor>();
|
||||
private JideTabbedPane tabHolder;
|
||||
|
||||
public EditorsArea() {
|
||||
super();
|
||||
setLayout(new BorderLayout());
|
||||
tabHolder = new JideTabbedPane();
|
||||
tabHolder.setTabPlacement(JideTabbedPane.TOP);
|
||||
tabHolder.setTabShape(JideTabbedPane.SHAPE_FLAT);
|
||||
tabHolder.setUseDefaultShowCloseButtonOnTab(false);
|
||||
tabHolder.setShowCloseButtonOnTab(true);
|
||||
tabHolder.setCloseAction(new Action() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
closeEditor((Editor) e.getSource());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEnabled(boolean b) {
|
||||
}
|
||||
@Override
|
||||
public void removePropertyChangeListener(PropertyChangeListener listener) {
|
||||
}
|
||||
@Override
|
||||
public void putValue(String key, Object value) {
|
||||
}
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public Object getValue(String key) {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public void addPropertyChangeListener(PropertyChangeListener listener) {
|
||||
}
|
||||
});
|
||||
add(tabHolder, BorderLayout.CENTER);
|
||||
}
|
||||
|
||||
public void openEditor(Editor e) {
|
||||
if (!editors.containsKey(e.target) && !editors.containsValue(e)) {
|
||||
editors.put(e.target, e);
|
||||
tabHolder.addTab(e.name, e.icon, e);
|
||||
tabHolder.setSelectedComponent(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void closeEditor(Editor e) {
|
||||
if (editors.containsValue(e)) {
|
||||
tabHolder.remove(e);
|
||||
editors.remove(e.target);
|
||||
e.clearElementListeners();
|
||||
}
|
||||
}
|
||||
private Map<Object, Editor> editors = new LinkedHashMap<Object, Editor>();
|
||||
private JideTabbedPane tabHolder;
|
||||
|
||||
public void openEditor(JSONElement node) {
|
||||
if (editors.containsKey(node)) {
|
||||
tabHolder.setSelectedComponent(editors.get(node));
|
||||
return;
|
||||
}
|
||||
if (node instanceof Quest) {
|
||||
openEditor(new QuestEditor((Quest)node));
|
||||
} else if (node instanceof Dialogue) {
|
||||
openEditor(new DialogueEditor((Dialogue) node));
|
||||
} else if (node instanceof Droplist) {
|
||||
openEditor(new DroplistEditor((Droplist) node));
|
||||
} else if (node instanceof ActorCondition) {
|
||||
openEditor(new ActorConditionEditor((ActorCondition) node));
|
||||
} else if (node instanceof ItemCategory) {
|
||||
openEditor(new ItemCategoryEditor((ItemCategory) node));
|
||||
} else if (node instanceof Item) {
|
||||
openEditor(new ItemEditor((Item) node));
|
||||
} else if (node instanceof NPC) {
|
||||
openEditor(new NPCEditor((NPC) node));
|
||||
}
|
||||
}
|
||||
|
||||
public void openEditor(Spritesheet node) {
|
||||
if (editors.containsKey(node)) {
|
||||
tabHolder.setSelectedComponent(editors.get(node));
|
||||
return;
|
||||
}
|
||||
node.link();
|
||||
openEditor(new SpritesheetEditor((Spritesheet) node));
|
||||
}
|
||||
public EditorsArea() {
|
||||
super();
|
||||
setLayout(new BorderLayout());
|
||||
tabHolder = new JideTabbedPane();
|
||||
tabHolder.setTabPlacement(JideTabbedPane.TOP);
|
||||
tabHolder.setTabShape(JideTabbedPane.SHAPE_FLAT);
|
||||
tabHolder.setUseDefaultShowCloseButtonOnTab(false);
|
||||
tabHolder.setShowCloseButtonOnTab(true);
|
||||
tabHolder.setCloseAction(new Action() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
closeEditor((Editor) e.getSource());
|
||||
}
|
||||
|
||||
public void openEditor(TMXMap node) {
|
||||
if (editors.containsKey(node)) {
|
||||
tabHolder.setSelectedComponent(editors.get(node));
|
||||
return;
|
||||
}
|
||||
node.link();
|
||||
openEditor(new TMXMapEditor(node));
|
||||
}
|
||||
@Override
|
||||
public void setEnabled(boolean b) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removePropertyChangeListener(PropertyChangeListener listener) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void putValue(String key, Object value) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getValue(String key) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addPropertyChangeListener(PropertyChangeListener listener) {
|
||||
}
|
||||
});
|
||||
add(tabHolder, BorderLayout.CENTER);
|
||||
}
|
||||
|
||||
public void openEditor(Editor e) {
|
||||
if (!editors.containsKey(e.target) && !editors.containsValue(e)) {
|
||||
editors.put(e.target, e);
|
||||
tabHolder.addTab(e.name, e.icon, e);
|
||||
tabHolder.setSelectedComponent(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void closeEditor(Editor e) {
|
||||
if (editors.containsValue(e)) {
|
||||
tabHolder.remove(e);
|
||||
editors.remove(e.target);
|
||||
e.clearElementListeners();
|
||||
}
|
||||
}
|
||||
|
||||
public void openEditor(JSONElement node) {
|
||||
if (editors.containsKey(node)) {
|
||||
tabHolder.setSelectedComponent(editors.get(node));
|
||||
return;
|
||||
}
|
||||
if (node instanceof Quest) {
|
||||
openEditor(new QuestEditor((Quest) node));
|
||||
} else if (node instanceof Dialogue) {
|
||||
openEditor(new DialogueEditor((Dialogue) node));
|
||||
} else if (node instanceof Droplist) {
|
||||
openEditor(new DroplistEditor((Droplist) node));
|
||||
} else if (node instanceof ActorCondition) {
|
||||
openEditor(new ActorConditionEditor((ActorCondition) node));
|
||||
} else if (node instanceof ItemCategory) {
|
||||
openEditor(new ItemCategoryEditor((ItemCategory) node));
|
||||
} else if (node instanceof Item) {
|
||||
openEditor(new ItemEditor((Item) node));
|
||||
} else if (node instanceof NPC) {
|
||||
openEditor(new NPCEditor((NPC) node));
|
||||
}
|
||||
}
|
||||
|
||||
public void openEditor(Spritesheet node) {
|
||||
if (editors.containsKey(node)) {
|
||||
tabHolder.setSelectedComponent(editors.get(node));
|
||||
return;
|
||||
}
|
||||
node.link();
|
||||
openEditor(new SpritesheetEditor((Spritesheet) node));
|
||||
}
|
||||
|
||||
public void openEditor(TMXMap node) {
|
||||
if (editors.containsKey(node)) {
|
||||
tabHolder.setSelectedComponent(editors.get(node));
|
||||
return;
|
||||
}
|
||||
node.link();
|
||||
openEditor(new TMXMapEditor(node));
|
||||
}
|
||||
|
||||
|
||||
public void openEditor(SavedGame save) {
|
||||
if (editors.containsKey(save)) {
|
||||
tabHolder.setSelectedComponent(editors.get(save));
|
||||
return;
|
||||
}
|
||||
openEditor(new SavedGameEditor(save));
|
||||
}
|
||||
public void openEditor(WorldmapSegment node) {
|
||||
if (editors.containsKey(node)) {
|
||||
tabHolder.setSelectedComponent(editors.get(node));
|
||||
return;
|
||||
}
|
||||
node.link();
|
||||
openEditor(new WorldMapEditor(node));
|
||||
}
|
||||
|
||||
public void openEditor(WriterModeData node) {
|
||||
if (editors.containsKey(node)) {
|
||||
tabHolder.setSelectedComponent(editors.get(node));
|
||||
return;
|
||||
}
|
||||
node.link();
|
||||
openEditor(new WriterModeEditor(node));
|
||||
}
|
||||
|
||||
public void openEditor(WorldmapSegment node) {
|
||||
if (editors.containsKey(node)) {
|
||||
tabHolder.setSelectedComponent(editors.get(node));
|
||||
return;
|
||||
}
|
||||
node.link();
|
||||
openEditor(new WorldMapEditor(node));
|
||||
}
|
||||
|
||||
public void openEditor(WriterModeData node) {
|
||||
if (editors.containsKey(node)) {
|
||||
tabHolder.setSelectedComponent(editors.get(node));
|
||||
return;
|
||||
}
|
||||
node.link();
|
||||
openEditor(new WriterModeEditor(node));
|
||||
}
|
||||
|
||||
public void closeEditor(ProjectTreeNode node) {
|
||||
if (editors.containsKey(node)) {
|
||||
closeEditor(editors.get(node));
|
||||
}
|
||||
}
|
||||
|
||||
public void editorTabChanged(Editor e) {
|
||||
int index = tabHolder.indexOfComponent(e);
|
||||
if (index >= 0) {
|
||||
tabHolder.setTitleAt(index, e.name);
|
||||
tabHolder.setIconAt(index, e.icon);
|
||||
}
|
||||
}
|
||||
public void closeEditor(ProjectTreeNode node) {
|
||||
if (editors.containsKey(node)) {
|
||||
closeEditor(editors.get(node));
|
||||
}
|
||||
}
|
||||
|
||||
public void editorTabChanged(ProjectTreeNode node) {
|
||||
if (editors.get(node) != null) {
|
||||
editors.get(node).targetUpdated();
|
||||
editorTabChanged(editors.get(node));
|
||||
}
|
||||
}
|
||||
|
||||
public void showAbout() {
|
||||
if (editors.containsKey(AboutEditor.instance)) {
|
||||
tabHolder.setSelectedComponent(AboutEditor.instance);
|
||||
return;
|
||||
}
|
||||
openEditor(AboutEditor.instance);
|
||||
}
|
||||
public void editorTabChanged(Editor e) {
|
||||
int index = tabHolder.indexOfComponent(e);
|
||||
if (index >= 0) {
|
||||
tabHolder.setTitleAt(index, e.name);
|
||||
tabHolder.setIconAt(index, e.icon);
|
||||
}
|
||||
}
|
||||
|
||||
public void editorTabChanged(ProjectTreeNode node) {
|
||||
if (editors.get(node) != null) {
|
||||
editors.get(node).targetUpdated();
|
||||
editorTabChanged(editors.get(node));
|
||||
}
|
||||
}
|
||||
|
||||
public void showAbout() {
|
||||
if (editors.containsKey(AboutEditor.instance)) {
|
||||
tabHolder.setSelectedComponent(AboutEditor.instance);
|
||||
return;
|
||||
}
|
||||
openEditor(AboutEditor.instance);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,21 +1,5 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.File;
|
||||
|
||||
import javax.swing.ButtonGroup;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JRadioButton;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.ATContentStudio;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
@@ -23,204 +7,211 @@ import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
|
||||
import com.gpl.rpg.atcontentstudio.model.sprites.SpriteSheetSet;
|
||||
import com.jidesoft.swing.JideBoxLayout;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.File;
|
||||
|
||||
public class ExportProjectWizard extends JDialog {
|
||||
|
||||
private static final long serialVersionUID = -8745083621008868612L;
|
||||
|
||||
JPanel pane;
|
||||
JLabel errorLabel, fileSelectionLabel;
|
||||
JRadioButton asZip, overSources;
|
||||
JComboBox<String> target;
|
||||
JButton browse;
|
||||
JButton okButton, cancelButton;
|
||||
|
||||
Project proj;
|
||||
|
||||
public ExportProjectWizard(Project proj) {
|
||||
|
||||
super(ATContentStudio.frame);
|
||||
setTitle("Export project for inclusion in-game");
|
||||
|
||||
this.proj = proj;
|
||||
|
||||
pane = new JPanel();
|
||||
pane.setLayout(new JideBoxLayout(pane, JideBoxLayout.PAGE_AXIS, 6));
|
||||
|
||||
errorLabel = new JLabel();
|
||||
private static final long serialVersionUID = -8745083621008868612L;
|
||||
|
||||
pane.add(errorLabel, JideBoxLayout.FIX);
|
||||
pane.add(new JLabel("Export this ATCS project..."), JideBoxLayout.FIX);
|
||||
|
||||
ButtonGroup radioGroup = new ButtonGroup();
|
||||
|
||||
asZip = new JRadioButton("... as a Zip archive");
|
||||
radioGroup.add(asZip);
|
||||
overSources = new JRadioButton("... into a game source folder");
|
||||
radioGroup.add(overSources);
|
||||
overSources.setSelected(true);
|
||||
JPanel pane;
|
||||
JLabel errorLabel, fileSelectionLabel;
|
||||
JRadioButton asZip, overSources;
|
||||
JComboBox<String> target;
|
||||
JButton browse;
|
||||
JButton okButton, cancelButton;
|
||||
|
||||
pane.add(asZip, JideBoxLayout.FIX);
|
||||
pane.add(overSources, JideBoxLayout.FIX);
|
||||
|
||||
ActionListener updateListener = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
updateState();
|
||||
}
|
||||
};
|
||||
asZip.addActionListener(updateListener);
|
||||
overSources.addActionListener(updateListener);
|
||||
|
||||
target = new JComboBox<String>();
|
||||
target.setEditable(true);
|
||||
target.addActionListener(updateListener);
|
||||
browse = new JButton("Browse");
|
||||
browse.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
JFileChooser jfc = new JFileChooser(){
|
||||
private static final long serialVersionUID = -3001082967957619011L;
|
||||
@Override
|
||||
public boolean accept(File f) {
|
||||
if (asZip.isSelected()) {
|
||||
if (f.isDirectory() || f.getName().endsWith(".zip") || f.getName().endsWith(".ZIP")) {
|
||||
return super.accept(f);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return f.isDirectory();
|
||||
}
|
||||
}
|
||||
};
|
||||
jfc.setFileSelectionMode(asZip.isSelected() ? JFileChooser.FILES_AND_DIRECTORIES : JFileChooser.DIRECTORIES_ONLY);
|
||||
jfc.setSelectedFile(new File(target.getSelectedItem() == null ? "" : target.getSelectedItem().toString()));
|
||||
jfc.setMultiSelectionEnabled(false);
|
||||
int result = jfc.showOpenDialog(ATContentStudio.frame);
|
||||
if (result == JFileChooser.APPROVE_OPTION) {
|
||||
File f = jfc.getSelectedFile();
|
||||
if (asZip.isSelected() && !f.getAbsolutePath().substring(f.getAbsolutePath().length() - 4, f.getAbsolutePath().length()).equalsIgnoreCase(".zip")) {
|
||||
f = new File(f.getAbsolutePath()+".zip");
|
||||
}
|
||||
target.setSelectedItem(f.getAbsolutePath());
|
||||
updateState();
|
||||
}
|
||||
}
|
||||
});
|
||||
JPanel fileSelectionPane = new JPanel();
|
||||
fileSelectionPane.setLayout(new JideBoxLayout(fileSelectionPane, JideBoxLayout.LINE_AXIS, 6));
|
||||
fileSelectionLabel = new JLabel("Zip file: ");
|
||||
fileSelectionPane.add(fileSelectionLabel, JideBoxLayout.FIX);
|
||||
fileSelectionPane.add(target, JideBoxLayout.VARY);
|
||||
fileSelectionPane.add(browse, JideBoxLayout.FIX);
|
||||
|
||||
pane.add(fileSelectionPane, JideBoxLayout.FIX);
|
||||
|
||||
JPanel buttonPane = new JPanel();
|
||||
buttonPane.setLayout(new JideBoxLayout(buttonPane, JideBoxLayout.LINE_AXIS, 6));
|
||||
buttonPane.add(new JPanel(), JideBoxLayout.VARY);
|
||||
cancelButton = new JButton("Cancel");
|
||||
buttonPane.add(cancelButton, JideBoxLayout.FIX);
|
||||
okButton = new JButton("Ok");
|
||||
buttonPane.add(okButton, JideBoxLayout.FIX);
|
||||
|
||||
pane.add(new JPanel(), JideBoxLayout.VARY);
|
||||
|
||||
pane.add(buttonPane, JideBoxLayout.FIX);
|
||||
|
||||
|
||||
cancelButton.addActionListener(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
ExportProjectWizard.this.setVisible(false);
|
||||
ExportProjectWizard.this.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
okButton.addActionListener(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (asZip.isSelected()) {
|
||||
ExportProjectWizard.this.proj.exportProjectAsZipPackage(new File(target.getSelectedItem().toString()));
|
||||
} else {
|
||||
ExportProjectWizard.this.proj.exportProjectOverGameSource(new File(target.getSelectedItem().toString()));
|
||||
}
|
||||
ExportProjectWizard.this.setVisible(false);
|
||||
ExportProjectWizard.this.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
updateState();
|
||||
|
||||
getContentPane().setLayout(new BorderLayout());
|
||||
getContentPane().add(pane, BorderLayout.CENTER);
|
||||
|
||||
setMinimumSize(new Dimension(500,150));
|
||||
pack();
|
||||
Project proj;
|
||||
|
||||
Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
Dimension wdim = getSize();
|
||||
setLocation((sdim.width - wdim.width)/2, (sdim.height - wdim.height)/2);
|
||||
}
|
||||
|
||||
private void updateState() {
|
||||
if (asZip.isSelected()) {
|
||||
fileSelectionLabel.setText("Zip file: ");
|
||||
} else {
|
||||
fileSelectionLabel.setText("Game source folder: ");
|
||||
}
|
||||
|
||||
|
||||
File f = new File(target.getSelectedItem() == null ? "" : target.getSelectedItem().toString());
|
||||
if (asZip.isSelected()) {
|
||||
if (target.getSelectedItem() == null || target.getSelectedItem().toString().length() <= 0) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">You must select where to save the zip file.</font></html>");
|
||||
okButton.setEnabled(false);
|
||||
} else if (f.isDirectory()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected target is a directory. It should be a zip file.</font></html>");
|
||||
okButton.setEnabled(false);
|
||||
} else if (!(f.getName().toLowerCase().endsWith(".zip"))) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected target is not a zip file. It should be a zip file.</font></html>");
|
||||
okButton.setEnabled(false);
|
||||
} else if (f.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF9000\">The selected target is an existing zip file. It will be overwritten.</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
} else {
|
||||
errorLabel.setText("<html><font color=\"#00AA00\">Everything looks good !</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
}
|
||||
} else {
|
||||
if (target.getSelectedItem() == null || target.getSelectedItem().toString().length() <= 0) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">You must select an AT source root folder.</font></html>");
|
||||
okButton.setEnabled(false);
|
||||
} else if (!f.isDirectory() || !f.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected AT source is not a folder. It should be an existing AT source root folder.</font></html>");
|
||||
okButton.setEnabled(false);
|
||||
} else {
|
||||
File res = new File(f, GameDataSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
File drawable = new File(f, SpriteSheetSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
File xml = new File(f, TMXMapSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
if (!res.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF9000\">The selected AT source root folder does not contain the \"res\" folder.</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
} else if (!drawable.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF9000\">The selected AT source root folder does not contain the \"drawable\" folder.</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
} else if (!xml.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF9000\">The selected AT source root folder does not contain the \"xml\" folder.</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
} else {
|
||||
errorLabel.setText("<html><font color=\"#00AA00\">Everything looks good !</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
revalidate();
|
||||
repaint();
|
||||
public ExportProjectWizard(Project proj) {
|
||||
|
||||
super(ATContentStudio.frame);
|
||||
setTitle("Export project for inclusion in-game");
|
||||
|
||||
this.proj = proj;
|
||||
|
||||
pane = new JPanel();
|
||||
pane.setLayout(new JideBoxLayout(pane, JideBoxLayout.PAGE_AXIS, 6));
|
||||
|
||||
errorLabel = new JLabel();
|
||||
|
||||
pane.add(errorLabel, JideBoxLayout.FIX);
|
||||
pane.add(new JLabel("Export this ATCS project..."), JideBoxLayout.FIX);
|
||||
|
||||
ButtonGroup radioGroup = new ButtonGroup();
|
||||
|
||||
asZip = new JRadioButton("... as a Zip archive");
|
||||
radioGroup.add(asZip);
|
||||
overSources = new JRadioButton("... into a game source folder");
|
||||
radioGroup.add(overSources);
|
||||
overSources.setSelected(true);
|
||||
|
||||
pane.add(asZip, JideBoxLayout.FIX);
|
||||
pane.add(overSources, JideBoxLayout.FIX);
|
||||
|
||||
ActionListener updateListener = new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
updateState();
|
||||
}
|
||||
};
|
||||
asZip.addActionListener(updateListener);
|
||||
overSources.addActionListener(updateListener);
|
||||
|
||||
target = new JComboBox<String>();
|
||||
target.setEditable(true);
|
||||
target.addActionListener(updateListener);
|
||||
browse = new JButton("Browse");
|
||||
browse.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
JFileChooser jfc = new JFileChooser() {
|
||||
private static final long serialVersionUID = -3001082967957619011L;
|
||||
|
||||
@Override
|
||||
public boolean accept(File f) {
|
||||
if (asZip.isSelected()) {
|
||||
if (f.isDirectory() || f.getName().endsWith(".zip") || f.getName().endsWith(".ZIP")) {
|
||||
return super.accept(f);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return f.isDirectory();
|
||||
}
|
||||
}
|
||||
};
|
||||
jfc.setFileSelectionMode(asZip.isSelected() ? JFileChooser.FILES_AND_DIRECTORIES : JFileChooser.DIRECTORIES_ONLY);
|
||||
jfc.setSelectedFile(new File(target.getSelectedItem() == null ? "" : target.getSelectedItem().toString()));
|
||||
jfc.setMultiSelectionEnabled(false);
|
||||
int result = jfc.showOpenDialog(ATContentStudio.frame);
|
||||
if (result == JFileChooser.APPROVE_OPTION) {
|
||||
File f = jfc.getSelectedFile();
|
||||
if (asZip.isSelected() && !f.getAbsolutePath().substring(f.getAbsolutePath().length() - 4, f.getAbsolutePath().length()).equalsIgnoreCase(".zip")) {
|
||||
f = new File(f.getAbsolutePath() + ".zip");
|
||||
}
|
||||
target.setSelectedItem(f.getAbsolutePath());
|
||||
updateState();
|
||||
}
|
||||
}
|
||||
});
|
||||
JPanel fileSelectionPane = new JPanel();
|
||||
fileSelectionPane.setLayout(new JideBoxLayout(fileSelectionPane, JideBoxLayout.LINE_AXIS, 6));
|
||||
fileSelectionLabel = new JLabel("Zip file: ");
|
||||
fileSelectionPane.add(fileSelectionLabel, JideBoxLayout.FIX);
|
||||
fileSelectionPane.add(target, JideBoxLayout.VARY);
|
||||
fileSelectionPane.add(browse, JideBoxLayout.FIX);
|
||||
|
||||
pane.add(fileSelectionPane, JideBoxLayout.FIX);
|
||||
|
||||
JPanel buttonPane = new JPanel();
|
||||
buttonPane.setLayout(new JideBoxLayout(buttonPane, JideBoxLayout.LINE_AXIS, 6));
|
||||
buttonPane.add(new JPanel(), JideBoxLayout.VARY);
|
||||
cancelButton = new JButton("Cancel");
|
||||
buttonPane.add(cancelButton, JideBoxLayout.FIX);
|
||||
okButton = new JButton("Ok");
|
||||
buttonPane.add(okButton, JideBoxLayout.FIX);
|
||||
|
||||
pane.add(new JPanel(), JideBoxLayout.VARY);
|
||||
|
||||
pane.add(buttonPane, JideBoxLayout.FIX);
|
||||
|
||||
|
||||
cancelButton.addActionListener(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
ExportProjectWizard.this.setVisible(false);
|
||||
ExportProjectWizard.this.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
okButton.addActionListener(new ActionListener() {
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (asZip.isSelected()) {
|
||||
ExportProjectWizard.this.proj.exportProjectAsZipPackage(new File(target.getSelectedItem().toString()));
|
||||
} else {
|
||||
ExportProjectWizard.this.proj.exportProjectOverGameSource(new File(target.getSelectedItem().toString()));
|
||||
}
|
||||
ExportProjectWizard.this.setVisible(false);
|
||||
ExportProjectWizard.this.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
updateState();
|
||||
|
||||
getContentPane().setLayout(new BorderLayout());
|
||||
getContentPane().add(pane, BorderLayout.CENTER);
|
||||
|
||||
setMinimumSize(new Dimension(500, 150));
|
||||
pack();
|
||||
|
||||
Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
Dimension wdim = getSize();
|
||||
setLocation((sdim.width - wdim.width) / 2, (sdim.height - wdim.height) / 2);
|
||||
}
|
||||
|
||||
private void updateState() {
|
||||
if (asZip.isSelected()) {
|
||||
fileSelectionLabel.setText("Zip file: ");
|
||||
} else {
|
||||
fileSelectionLabel.setText("Game source folder: ");
|
||||
}
|
||||
|
||||
|
||||
File f = new File(target.getSelectedItem() == null ? "" : target.getSelectedItem().toString());
|
||||
if (asZip.isSelected()) {
|
||||
if (target.getSelectedItem() == null || target.getSelectedItem().toString().length() <= 0) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">You must select where to save the zip file.</font></html>");
|
||||
okButton.setEnabled(false);
|
||||
} else if (f.isDirectory()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected target is a directory. It should be a zip file.</font></html>");
|
||||
okButton.setEnabled(false);
|
||||
} else if (!(f.getName().toLowerCase().endsWith(".zip"))) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected target is not a zip file. It should be a zip file.</font></html>");
|
||||
okButton.setEnabled(false);
|
||||
} else if (f.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF9000\">The selected target is an existing zip file. It will be overwritten.</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
} else {
|
||||
errorLabel.setText("<html><font color=\"#00AA00\">Everything looks good !</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
}
|
||||
} else {
|
||||
if (target.getSelectedItem() == null || target.getSelectedItem().toString().length() <= 0) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">You must select an AT source root folder.</font></html>");
|
||||
okButton.setEnabled(false);
|
||||
} else if (!f.isDirectory() || !f.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected AT source is not a folder. It should be an existing AT source root folder.</font></html>");
|
||||
okButton.setEnabled(false);
|
||||
} else {
|
||||
File res = new File(f, GameDataSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
File drawable = new File(f, SpriteSheetSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
File xml = new File(f, TMXMapSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
if (!res.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF9000\">The selected AT source root folder does not contain the \"res\" folder.</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
} else if (!drawable.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF9000\">The selected AT source root folder does not contain the \"drawable\" folder.</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
} else if (!xml.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF9000\">The selected AT source root folder does not contain the \"xml\" folder.</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
} else {
|
||||
errorLabel.setText("<html><font color=\"#00AA00\">Everything looks good !</font></html>");
|
||||
okButton.setEnabled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
revalidate();
|
||||
repaint();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.*;
|
||||
|
||||
public interface FieldUpdateListener {
|
||||
|
||||
public void valueChanged(JComponent source, Object value);
|
||||
|
||||
public void valueChanged(JComponent source, Object value);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,100 +1,91 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
|
||||
import javax.swing.DefaultListCellRenderer;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.ATContentStudio;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||
import com.jidesoft.swing.JideBoxLayout;
|
||||
|
||||
public class IdChangeImpactWizard extends JDialog {
|
||||
|
||||
private static final long serialVersionUID = 8532169707953315739L;
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
|
||||
public static enum Result {
|
||||
ok, cancel
|
||||
}
|
||||
|
||||
Result result = null;
|
||||
|
||||
private IdChangeImpactWizard(GameDataElement changing, List<GameDataElement> toModify, List<GameDataElement> toAlter) {
|
||||
super(ATContentStudio.frame, true);
|
||||
JPanel pane = new JPanel();
|
||||
pane.setLayout(new JideBoxLayout(pane, JideBoxLayout.PAGE_AXIS));
|
||||
|
||||
pane.add(new JLabel("Changing the id for \""+changing.getDesc()+"\" has impacts on your project:"), JideBoxLayout.FIX);
|
||||
pane.add(new JLabel("The following elements from your project will be modified:"), JideBoxLayout.FIX);
|
||||
JList<GameDataElement> modifList = new JList<GameDataElement>(new Vector<GameDataElement>(toModify));
|
||||
modifList.setCellRenderer(new ChangeImpactListCellRenderer());
|
||||
pane.add(new JScrollPane(modifList), JideBoxLayout.FIX);
|
||||
pane.add(new JLabel("The following elements from the game source will be altered:"), JideBoxLayout.FIX);
|
||||
JList<GameDataElement> alterList = new JList<GameDataElement>(new Vector<GameDataElement>(toAlter));
|
||||
alterList.setCellRenderer(new ChangeImpactListCellRenderer());
|
||||
pane.add(new JScrollPane(alterList), JideBoxLayout.FIX);
|
||||
pane.add(new JLabel("Press Ok to apply the changes, or Cancel to cancel your edition of the object's ID"), JideBoxLayout.FIX);
|
||||
|
||||
JPanel buttonPane = new JPanel();
|
||||
buttonPane.setLayout(new JideBoxLayout(buttonPane, JideBoxLayout.LINE_AXIS));
|
||||
buttonPane.add(new JPanel(), JideBoxLayout.VARY);
|
||||
JButton cancelButton = new JButton("Cancel");
|
||||
cancelButton.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
result = Result.cancel;
|
||||
dispose();
|
||||
}
|
||||
});
|
||||
buttonPane.add(cancelButton, JideBoxLayout.FIX);
|
||||
JButton okButton = new JButton("Ok");
|
||||
okButton.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
result = Result.ok;
|
||||
dispose();
|
||||
}
|
||||
});
|
||||
buttonPane.add(okButton, JideBoxLayout.FIX);
|
||||
pane.add(buttonPane, JideBoxLayout.FIX);
|
||||
getContentPane().setLayout(new BorderLayout());
|
||||
getContentPane().add(pane, BorderLayout.CENTER);
|
||||
pack();
|
||||
}
|
||||
|
||||
|
||||
public static Result showIdChangeImapctWizard(GameDataElement changing, List<GameDataElement> toModify, List<GameDataElement> toAlter) {
|
||||
IdChangeImpactWizard wizard = new IdChangeImpactWizard(changing, toModify, toAlter);
|
||||
wizard.setVisible(true);
|
||||
return wizard.result;
|
||||
}
|
||||
|
||||
public class ChangeImpactListCellRenderer extends DefaultListCellRenderer {
|
||||
private static final long serialVersionUID = 5764079243906396333L;
|
||||
|
||||
@Override
|
||||
public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
|
||||
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
|
||||
if (c instanceof JLabel) {
|
||||
JLabel label = (JLabel) c;
|
||||
GameDataElement target = ((GameDataElement)value);
|
||||
label.setIcon(new ImageIcon(target.getIcon()));
|
||||
label.setText(target.getDataType().toString()+"/"+target.getDesc());
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
}
|
||||
public class IdChangeImpactWizard extends JDialog {
|
||||
|
||||
private static final long serialVersionUID = 8532169707953315739L;
|
||||
|
||||
public static enum Result {
|
||||
ok, cancel
|
||||
}
|
||||
|
||||
Result result = null;
|
||||
|
||||
private IdChangeImpactWizard(GameDataElement changing, List<GameDataElement> toModify, List<GameDataElement> toAlter) {
|
||||
super(ATContentStudio.frame, true);
|
||||
JPanel pane = new JPanel();
|
||||
pane.setLayout(new JideBoxLayout(pane, JideBoxLayout.PAGE_AXIS));
|
||||
|
||||
pane.add(new JLabel("Changing the id for \"" + changing.getDesc() + "\" has impacts on your project:"), JideBoxLayout.FIX);
|
||||
pane.add(new JLabel("The following elements from your project will be modified:"), JideBoxLayout.FIX);
|
||||
JList<GameDataElement> modifList = new JList<GameDataElement>(new Vector<GameDataElement>(toModify));
|
||||
modifList.setCellRenderer(new ChangeImpactListCellRenderer());
|
||||
pane.add(new JScrollPane(modifList), JideBoxLayout.FIX);
|
||||
pane.add(new JLabel("The following elements from the game source will be altered:"), JideBoxLayout.FIX);
|
||||
JList<GameDataElement> alterList = new JList<GameDataElement>(new Vector<GameDataElement>(toAlter));
|
||||
alterList.setCellRenderer(new ChangeImpactListCellRenderer());
|
||||
pane.add(new JScrollPane(alterList), JideBoxLayout.FIX);
|
||||
pane.add(new JLabel("Press Ok to apply the changes, or Cancel to cancel your edition of the object's ID"), JideBoxLayout.FIX);
|
||||
|
||||
JPanel buttonPane = new JPanel();
|
||||
buttonPane.setLayout(new JideBoxLayout(buttonPane, JideBoxLayout.LINE_AXIS));
|
||||
buttonPane.add(new JPanel(), JideBoxLayout.VARY);
|
||||
JButton cancelButton = new JButton("Cancel");
|
||||
cancelButton.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
result = Result.cancel;
|
||||
dispose();
|
||||
}
|
||||
});
|
||||
buttonPane.add(cancelButton, JideBoxLayout.FIX);
|
||||
JButton okButton = new JButton("Ok");
|
||||
okButton.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
result = Result.ok;
|
||||
dispose();
|
||||
}
|
||||
});
|
||||
buttonPane.add(okButton, JideBoxLayout.FIX);
|
||||
pane.add(buttonPane, JideBoxLayout.FIX);
|
||||
getContentPane().setLayout(new BorderLayout());
|
||||
getContentPane().add(pane, BorderLayout.CENTER);
|
||||
pack();
|
||||
}
|
||||
|
||||
|
||||
public static Result showIdChangeImapctWizard(GameDataElement changing, List<GameDataElement> toModify, List<GameDataElement> toAlter) {
|
||||
IdChangeImpactWizard wizard = new IdChangeImpactWizard(changing, toModify, toAlter);
|
||||
wizard.setVisible(true);
|
||||
return wizard.result;
|
||||
}
|
||||
|
||||
public class ChangeImpactListCellRenderer extends DefaultListCellRenderer {
|
||||
private static final long serialVersionUID = 5764079243906396333L;
|
||||
|
||||
@Override
|
||||
public Component getListCellRendererComponent(@SuppressWarnings("rawtypes") JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
|
||||
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
|
||||
if (c instanceof JLabel) {
|
||||
JLabel label = (JLabel) c;
|
||||
GameDataElement target = ((GameDataElement) value);
|
||||
label.setIcon(new ImageIcon(target.getIcon()));
|
||||
label.setText(target.getDataType().toString() + "/" + target.getDesc());
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import javax.swing.JCheckBox;
|
||||
import javax.swing.*;
|
||||
|
||||
public class IntegerBasedCheckBox extends JCheckBox {
|
||||
|
||||
private static final long serialVersionUID = 3941646360487399554L;
|
||||
|
||||
static final Integer one = 1;
|
||||
|
||||
public Integer getIntegerValue() {
|
||||
return isSelected() ? one : null;
|
||||
}
|
||||
|
||||
public void setIntegerValue(Integer val) {
|
||||
setSelected(val != null && val.equals(one));
|
||||
}
|
||||
private static final long serialVersionUID = 3941646360487399554L;
|
||||
|
||||
static final Integer one = 1;
|
||||
|
||||
public Integer getIntegerValue() {
|
||||
return isSelected() ? one : null;
|
||||
}
|
||||
|
||||
public void setIntegerValue(Integer val) {
|
||||
setSelected(val != null && val.equals(one));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,96 +1,93 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.GradientPaint;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Paint;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
|
||||
public class JMovingIdler extends JComponent {
|
||||
|
||||
private static final long serialVersionUID = -2980521421870322717L;
|
||||
|
||||
int position = 0;
|
||||
boolean destroyed=false, running=false;
|
||||
Thread moverThread = new Thread(){
|
||||
public void run() {
|
||||
while (!destroyed) {
|
||||
boolean back = false;
|
||||
while (running) {
|
||||
if (back) {
|
||||
position = --position % 100;
|
||||
if (position == 0) {
|
||||
back = false;
|
||||
}
|
||||
} else {
|
||||
position = ++position % 100;
|
||||
if (position == 99) {
|
||||
back = true;
|
||||
}
|
||||
}
|
||||
try {
|
||||
sleep(10);
|
||||
} catch (InterruptedException e) {}
|
||||
JMovingIdler.this.revalidate();
|
||||
JMovingIdler.this.repaint();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public void start() {
|
||||
if (!moverThread.isAlive()) {
|
||||
moverThread.start();
|
||||
}
|
||||
running = true;
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
running = false;
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
destroyed = true;
|
||||
running = false;
|
||||
try {
|
||||
moverThread.join();
|
||||
} catch (InterruptedException e) {}
|
||||
}
|
||||
|
||||
protected void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
Graphics2D g2 = (Graphics2D) g;
|
||||
int w = this.getWidth();
|
||||
int h = this.getHeight();
|
||||
|
||||
g2.setColor(getBackground());
|
||||
g2.fillRect(0,0,w,h);
|
||||
|
||||
int x = w * position / 100;
|
||||
|
||||
Paint p = new GradientPaint(x - (w/8), 0, getBackground(), x , 0, getForeground());
|
||||
g2.setPaint(p);
|
||||
g2.fillRect(Math.max(0,x-(w/8)),0, Math.min(x, w), h);
|
||||
private static final long serialVersionUID = -2980521421870322717L;
|
||||
|
||||
int position = 0;
|
||||
boolean destroyed = false, running = false;
|
||||
Thread moverThread = new Thread() {
|
||||
public void run() {
|
||||
while (!destroyed) {
|
||||
boolean back = false;
|
||||
while (running) {
|
||||
if (back) {
|
||||
position = --position % 100;
|
||||
if (position == 0) {
|
||||
back = false;
|
||||
}
|
||||
} else {
|
||||
position = ++position % 100;
|
||||
if (position == 99) {
|
||||
back = true;
|
||||
}
|
||||
}
|
||||
try {
|
||||
sleep(10);
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
JMovingIdler.this.revalidate();
|
||||
JMovingIdler.this.repaint();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public void start() {
|
||||
if (!moverThread.isAlive()) {
|
||||
moverThread.start();
|
||||
}
|
||||
running = true;
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
running = false;
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
destroyed = true;
|
||||
running = false;
|
||||
try {
|
||||
moverThread.join();
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
}
|
||||
|
||||
protected void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
Graphics2D g2 = (Graphics2D) g;
|
||||
int w = this.getWidth();
|
||||
int h = this.getHeight();
|
||||
|
||||
g2.setColor(getBackground());
|
||||
g2.fillRect(0, 0, w, h);
|
||||
|
||||
int x = w * position / 100;
|
||||
|
||||
Paint p = new GradientPaint(x - (w / 8), 0, getBackground(), x, 0, getForeground());
|
||||
g2.setPaint(p);
|
||||
g2.fillRect(Math.max(0, x - (w / 8)), 0, Math.min(x, w), h);
|
||||
|
||||
p = new GradientPaint(x, 0, getForeground(), x + (w / 8), 0, getBackground());
|
||||
g2.setPaint(p);
|
||||
g2.fillRect(Math.max(0, x), 0, Math.min(x + (w / 8), w), h);
|
||||
|
||||
g2.setColor(Color.BLACK);
|
||||
g2.drawLine(0, 0, 0, h);
|
||||
g2.drawLine(0, 0, w, 0);
|
||||
g2.drawLine(w, 0, w, h);
|
||||
g2.drawLine(0, h, w, h);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisible(boolean aFlag) {
|
||||
super.setVisible(aFlag);
|
||||
if (!aFlag) destroy();
|
||||
}
|
||||
|
||||
p = new GradientPaint(x, 0, getForeground(), x + (w/8), 0, getBackground());
|
||||
g2.setPaint(p);
|
||||
g2.fillRect(Math.max(0,x),0, Math.min(x+(w/8), w), h);
|
||||
|
||||
g2.setColor(Color.BLACK);
|
||||
g2.drawLine(0,0,0,h);
|
||||
g2.drawLine(0,0,w,0);
|
||||
g2.drawLine(w,0,w,h);
|
||||
g2.drawLine(0,h,w,h);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVisible(boolean aFlag) {
|
||||
super.setVisible(aFlag);
|
||||
if (!aFlag) destroy();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,24 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface ListenerCollectionModel<E> extends ListenerListModel<E> {
|
||||
public Collection<E> getElements();
|
||||
|
||||
@Override
|
||||
default int getSize() {
|
||||
Collection<E> elements = getElements();
|
||||
if (elements == null) return 0;
|
||||
return elements.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
default E getElementAt(int index) {
|
||||
for (E obj : getElements()) {
|
||||
if (index == 0) return obj;
|
||||
index--;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
67
src/com/gpl/rpg/atcontentstudio/ui/ListenerListModel.java
Normal file
67
src/com/gpl/rpg/atcontentstudio/ui/ListenerListModel.java
Normal file
@@ -0,0 +1,67 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.ListDataEvent;
|
||||
import javax.swing.event.ListDataListener;
|
||||
import java.util.List;
|
||||
|
||||
public interface ListenerListModel<E> extends ListModel<E> {
|
||||
List<ListDataListener> getListeners();
|
||||
|
||||
default void notifyListeners(ChangeType event, int index0, int index1) {
|
||||
notifyListeners(this, event, index0, index1);
|
||||
}
|
||||
|
||||
default void notifyListeners(Object source, ChangeType event, int index0, int index1) {
|
||||
int eventCode;
|
||||
switch (event) {
|
||||
case CHANGED:
|
||||
eventCode = ListDataEvent.CONTENTS_CHANGED;
|
||||
break;
|
||||
case ADDED:
|
||||
eventCode = ListDataEvent.INTERVAL_ADDED;
|
||||
break;
|
||||
case REMOVED:
|
||||
eventCode = ListDataEvent.INTERVAL_REMOVED;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
for (ListDataListener l : getListeners()) {
|
||||
ListDataEvent e = new ListDataEvent(source, eventCode, index0, index1);
|
||||
switch (event) {
|
||||
case CHANGED: {
|
||||
l.contentsChanged(e);
|
||||
break;
|
||||
}
|
||||
case ADDED: {
|
||||
l.intervalAdded(e);
|
||||
break;
|
||||
}
|
||||
case REMOVED: {
|
||||
l.intervalRemoved(e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
default void addListDataListener(ListDataListener l) {
|
||||
getListeners().add(l);
|
||||
}
|
||||
|
||||
default void removeListDataListener(ListDataListener l) {
|
||||
getListeners().remove(l);
|
||||
}
|
||||
|
||||
default void fireListChanged() {
|
||||
notifyListeners(this, ChangeType.CHANGED, 0, getSize() - 1);
|
||||
}
|
||||
|
||||
enum ChangeType {
|
||||
CHANGED,
|
||||
ADDED,
|
||||
REMOVED,
|
||||
}
|
||||
}
|
||||
@@ -1,105 +1,87 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Component;
|
||||
import java.awt.Font;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.ListCellRenderer;
|
||||
import javax.swing.ListModel;
|
||||
import javax.swing.event.ListDataEvent;
|
||||
import javax.swing.event.ListDataListener;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.ATContentStudio;
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.NotificationListener;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.ListDataListener;
|
||||
import java.awt.*;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
public class NotificationsPane extends JList {
|
||||
|
||||
private static final long serialVersionUID = -1100364214372392608L;
|
||||
private static final long serialVersionUID = -1100364214372392608L;
|
||||
|
||||
public static final Map<Notification.Type, Icon> icons = new LinkedHashMap<Notification.Type, Icon>(Notification.Type.values().length);
|
||||
|
||||
static {
|
||||
icons.put(Notification.Type.SUCCESS, new ImageIcon(DefaultIcons.getStatusGreenIcon()));
|
||||
icons.put(Notification.Type.INFO, new ImageIcon(DefaultIcons.getStatusBlueIcon()));
|
||||
icons.put(Notification.Type.WARN, new ImageIcon(DefaultIcons.getStatusOrangeIcon()));
|
||||
icons.put(Notification.Type.ERROR, new ImageIcon(DefaultIcons.getStatusRedIcon()));
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public NotificationsPane() {
|
||||
super();
|
||||
MyListModel model = new MyListModel();
|
||||
setModel(model);
|
||||
setCellRenderer(new ListCellRenderer(){
|
||||
@Override
|
||||
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
|
||||
JLabel label = new JLabel();
|
||||
Font f = label.getFont();
|
||||
label.setIcon(NotificationsPane.icons.get(((Notification)value).type));
|
||||
label.setText(((Notification)value).text);
|
||||
if (isSelected) {
|
||||
public static final Map<Notification.Type, Icon> icons = new LinkedHashMap<Notification.Type, Icon>(Notification.Type.values().length);
|
||||
|
||||
static {
|
||||
icons.put(Notification.Type.SUCCESS, new ImageIcon(DefaultIcons.getStatusGreenIcon()));
|
||||
icons.put(Notification.Type.INFO, new ImageIcon(DefaultIcons.getStatusBlueIcon()));
|
||||
icons.put(Notification.Type.WARN, new ImageIcon(DefaultIcons.getStatusOrangeIcon()));
|
||||
icons.put(Notification.Type.ERROR, new ImageIcon(DefaultIcons.getStatusRedIcon()));
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public NotificationsPane() {
|
||||
super();
|
||||
MyListModel model = new MyListModel();
|
||||
setModel(model);
|
||||
setCellRenderer(new ListCellRenderer() {
|
||||
@Override
|
||||
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
|
||||
JLabel label = new JLabel();
|
||||
Font f = label.getFont();
|
||||
label.setIcon(NotificationsPane.icons.get(((Notification) value).type));
|
||||
label.setText(((Notification) value).text);
|
||||
if (isSelected) {
|
||||
// label.setBackground(Color.RED);
|
||||
label.setBorder(BorderFactory.createLineBorder(Color.BLUE));
|
||||
label.setBorder(BorderFactory.createLineBorder(Color.BLUE));
|
||||
// label.setForeground(Color.WHITE);
|
||||
}
|
||||
f = f.deriveFont(10f*ATContentStudio.SCALING);
|
||||
label.setFont(f);
|
||||
return label;
|
||||
}
|
||||
});
|
||||
Notification.addNotificationListener(model);
|
||||
}
|
||||
|
||||
|
||||
private class MyListModel implements ListModel, NotificationListener {
|
||||
|
||||
@Override
|
||||
public Object getElementAt(int index) {
|
||||
return Notification.notifs.get(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSize() {
|
||||
return Notification.notifs.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewNotification(Notification n) {
|
||||
for (ListDataListener l : listeners) {
|
||||
l.intervalAdded(new ListDataEvent(NotificationsPane.this, ListDataEvent.INTERVAL_ADDED, Notification.notifs.size() - 1 , Notification.notifs.size() - 1));
|
||||
}
|
||||
NotificationsPane.this.ensureIndexIsVisible(Notification.notifs.indexOf(n));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onListCleared(int i) {
|
||||
for (ListDataListener l : listeners) {
|
||||
l.intervalRemoved(new ListDataEvent(NotificationsPane.this, ListDataEvent.INTERVAL_REMOVED, 0 , i));
|
||||
}
|
||||
}
|
||||
|
||||
private List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
|
||||
@Override
|
||||
public void addListDataListener(ListDataListener l) {
|
||||
listeners.add(l);
|
||||
}
|
||||
@Override
|
||||
public void removeListDataListener(ListDataListener l) {
|
||||
listeners.remove(l);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
f = f.deriveFont(10f * ATContentStudio.SCALING);
|
||||
label.setFont(f);
|
||||
return label;
|
||||
}
|
||||
});
|
||||
Notification.addNotificationListener(model);
|
||||
}
|
||||
|
||||
|
||||
private class MyListModel implements ListenerListModel<Notification>, NotificationListener {
|
||||
|
||||
@Override
|
||||
public Notification getElementAt(int index) {
|
||||
return Notification.notifs.get(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ListDataListener> getListeners() {
|
||||
return listeners;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSize() {
|
||||
return Notification.notifs.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNewNotification(Notification n) {
|
||||
notifyListeners(NotificationsPane.this, ChangeType.ADDED, Notification.notifs.size() - 1, Notification.notifs.size() - 1);
|
||||
NotificationsPane.this.ensureIndexIsVisible(Notification.notifs.indexOf(n));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onListCleared(int i) {
|
||||
notifyListeners(NotificationsPane.this, ChangeType.REMOVED, 0, i);
|
||||
}
|
||||
|
||||
private List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import javax.swing.event.ListDataListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
public abstract class OrderedListenerListModel<S, E> implements ListenerCollectionModel<E> {
|
||||
protected S source;
|
||||
|
||||
protected abstract List<E> getItems();
|
||||
|
||||
protected abstract void setItems(List<E> items);
|
||||
|
||||
public OrderedListenerListModel(S source) {
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<E> getElements() {
|
||||
return getItems();
|
||||
}
|
||||
|
||||
@Override
|
||||
public E getElementAt(int index) {
|
||||
if (index < 0 || index >= getSize()) return null;
|
||||
return getItems().get(index);
|
||||
}
|
||||
|
||||
public E setElementAt(int index, E value) {
|
||||
if (index < 0 || index >= getSize()) return null;
|
||||
return getItems().set(index, value);
|
||||
}
|
||||
|
||||
public void addObject(E item) {
|
||||
addItem(item);
|
||||
}
|
||||
|
||||
public void addItem(E item) {
|
||||
if (getItems() == null) {
|
||||
setItems(new ArrayList<E>());
|
||||
}
|
||||
getItems().add(item);
|
||||
int index = getItems().indexOf(item);
|
||||
notifyListeners(ChangeType.ADDED, index, index);
|
||||
}
|
||||
|
||||
public void removeObject(E item) {
|
||||
removeItem(item);
|
||||
}
|
||||
|
||||
public void removeItem(E item) {
|
||||
int index = getItems().indexOf(item);
|
||||
getItems().remove(item);
|
||||
if (getSize() == 0) {
|
||||
setItems(null);
|
||||
}
|
||||
notifyListeners(this, ChangeType.REMOVED, index, index);
|
||||
}
|
||||
|
||||
|
||||
public void moveUp(E item) {
|
||||
moveUpOrDown(item, -1);
|
||||
}
|
||||
|
||||
public void moveDown(E item) {
|
||||
moveUpOrDown(item, 1);
|
||||
}
|
||||
|
||||
private void moveUpOrDown(E item, int direction) {
|
||||
int index = getItems().indexOf(item);
|
||||
E exchanged = getElementAt(index + direction);
|
||||
setElementAt(index, exchanged);
|
||||
setElementAt(index + direction, item);
|
||||
notifyListeners(this, ChangeType.CHANGED, index + direction, index);
|
||||
}
|
||||
|
||||
public void objectChanged(E item) {
|
||||
itemChanged(item);
|
||||
}
|
||||
|
||||
public void itemChanged(E item) {
|
||||
int index = getItems().indexOf(item);
|
||||
notifyListeners(this, ChangeType.CHANGED, index, index);
|
||||
}
|
||||
|
||||
private final List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
|
||||
|
||||
public List<ListDataListener> getListeners() {
|
||||
return listeners;
|
||||
}
|
||||
}
|
||||
@@ -1,35 +1,32 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Image;
|
||||
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
public class OverlayIcon implements Icon {
|
||||
|
||||
private Image background;
|
||||
private Image overlay;
|
||||
|
||||
public OverlayIcon(Image background, Image overlay) {
|
||||
this.background = background;
|
||||
this.overlay = overlay;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paintIcon(Component c, Graphics g, int x, int y) {
|
||||
g.drawImage(background, x, y, null);
|
||||
g.drawImage(overlay, x, y, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIconWidth() {
|
||||
return Math.max(background.getWidth(null), overlay.getWidth(null));
|
||||
}
|
||||
private Image background;
|
||||
private Image overlay;
|
||||
|
||||
@Override
|
||||
public int getIconHeight() {
|
||||
return Math.max(background.getHeight(null), overlay.getHeight(null));
|
||||
}
|
||||
public OverlayIcon(Image background, Image overlay) {
|
||||
this.background = background;
|
||||
this.overlay = overlay;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paintIcon(Component c, Graphics g, int x, int y) {
|
||||
g.drawImage(background, x, y, null);
|
||||
g.drawImage(overlay, x, y, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIconWidth() {
|
||||
return Math.max(background.getWidth(null), overlay.getWidth(null));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIconHeight() {
|
||||
return Math.max(background.getHeight(null), overlay.getHeight(null));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,31 +1,5 @@
|
||||
package com.gpl.rpg.atcontentstudio.ui;
|
||||
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.GridBagLayout;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import javax.swing.ComboBoxModel;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.ListCellRenderer;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import javax.swing.event.ListDataListener;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.ATContentStudio;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||
import com.gpl.rpg.atcontentstudio.model.Project.ResourceSet;
|
||||
@@ -34,293 +8,305 @@ import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
|
||||
import com.gpl.rpg.atcontentstudio.model.sprites.SpriteSheetSet;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import javax.swing.event.ListDataListener;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
public class ProjectCreationWizard extends JDialog {
|
||||
|
||||
private static final long serialVersionUID = -2854969975146867119L;
|
||||
private static final long serialVersionUID = -2854969975146867119L;
|
||||
|
||||
final JTextField projectNameField;
|
||||
final JComboBox<String> atSourceSelectionCombo;
|
||||
final JComboBox<Project.ResourceSet> resourceSetToUse;
|
||||
final JTextField projectNameField;
|
||||
final JComboBox<String> atSourceSelectionCombo;
|
||||
final JComboBox<Project.ResourceSet> resourceSetToUse;
|
||||
|
||||
final JButton browse;
|
||||
final JButton okButton;
|
||||
final JButton cancelButton;
|
||||
|
||||
final JLabel errorLabel;
|
||||
|
||||
public ProjectCreationWizard() {
|
||||
super(ATContentStudio.frame);
|
||||
setTitle("Create project");
|
||||
projectNameField = new JTextField();
|
||||
atSourceSelectionCombo = new JComboBox<String>();
|
||||
resourceSetToUse = new JComboBox<Project.ResourceSet>(new ComboBoxModel<Project.ResourceSet>() {
|
||||
final JButton browse;
|
||||
final JButton okButton;
|
||||
final JButton cancelButton;
|
||||
|
||||
Project.ResourceSet selected = Project.ResourceSet.gameData;
|
||||
|
||||
@Override
|
||||
public int getSize() {
|
||||
return Project.ResourceSet.values().length;
|
||||
}
|
||||
final JLabel errorLabel;
|
||||
|
||||
@Override
|
||||
public ResourceSet getElementAt(int index) {
|
||||
return Project.ResourceSet.values()[index];
|
||||
}
|
||||
public ProjectCreationWizard() {
|
||||
super(ATContentStudio.frame);
|
||||
setTitle("Create project");
|
||||
projectNameField = new JTextField();
|
||||
atSourceSelectionCombo = new JComboBox<String>();
|
||||
resourceSetToUse = new JComboBox<Project.ResourceSet>(new ComboBoxModel<Project.ResourceSet>() {
|
||||
|
||||
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
|
||||
|
||||
@Override
|
||||
public void addListDataListener(ListDataListener l) {
|
||||
listeners.add(l);
|
||||
}
|
||||
Project.ResourceSet selected = Project.ResourceSet.gameData;
|
||||
|
||||
@Override
|
||||
public void removeListDataListener(ListDataListener l) {
|
||||
listeners.remove(l);
|
||||
}
|
||||
@Override
|
||||
public int getSize() {
|
||||
return Project.ResourceSet.values().length;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelectedItem(Object anItem) {
|
||||
selected = (ResourceSet) anItem;
|
||||
}
|
||||
@Override
|
||||
public ResourceSet getElementAt(int index) {
|
||||
return Project.ResourceSet.values()[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getSelectedItem() {
|
||||
return selected;
|
||||
}
|
||||
|
||||
});
|
||||
resourceSetToUse.setRenderer(new ListCellRenderer<Project.ResourceSet>() {
|
||||
@Override
|
||||
public Component getListCellRendererComponent(
|
||||
JList<? extends ResourceSet> list, ResourceSet value,
|
||||
int index, boolean isSelected, boolean cellHasFocus) {
|
||||
switch (value) {
|
||||
case allFiles:
|
||||
return new JLabel("All available files");
|
||||
case debugData:
|
||||
return new JLabel("Debug data");
|
||||
case gameData:
|
||||
return new JLabel("Real game data");
|
||||
default:
|
||||
return new JLabel();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
browse = new JButton("Browse...");
|
||||
okButton = new JButton("Ok");
|
||||
cancelButton = new JButton("Cancel");
|
||||
errorLabel = new JLabel("Enter the following information about your project.");
|
||||
|
||||
projectNameField.getDocument().addDocumentListener(new DocumentListener() {
|
||||
@Override
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
updateOkButtonEnablement();
|
||||
}
|
||||
@Override
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
updateOkButtonEnablement();
|
||||
}
|
||||
@Override
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
updateOkButtonEnablement();
|
||||
}
|
||||
});
|
||||
for (File f : Workspace.activeWorkspace.knownMapSourcesFolders) {
|
||||
atSourceSelectionCombo.addItem(f.getAbsolutePath());
|
||||
}
|
||||
atSourceSelectionCombo.setEditable(true);
|
||||
atSourceSelectionCombo.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
updateOkButtonEnablement();
|
||||
}
|
||||
});
|
||||
browse.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
JFileChooser chooser = new JFileChooser();
|
||||
boolean keepTrying = true;
|
||||
if (atSourceSelectionCombo.getSelectedItem() != null && ((String)atSourceSelectionCombo.getSelectedItem()).length() > 0) {
|
||||
File f = new File((String)atSourceSelectionCombo.getSelectedItem());
|
||||
if (f.exists()) {
|
||||
chooser.setCurrentDirectory(f);
|
||||
keepTrying = false;
|
||||
}
|
||||
}
|
||||
if (keepTrying && Workspace.activeWorkspace.knownMapSourcesFolders != null && !Workspace.activeWorkspace.knownMapSourcesFolders.isEmpty()) {
|
||||
chooser.setCurrentDirectory(Workspace.activeWorkspace.knownMapSourcesFolders.iterator().next());
|
||||
}
|
||||
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
|
||||
int result = chooser.showOpenDialog(ProjectCreationWizard.this);
|
||||
if (result == JFileChooser.APPROVE_OPTION) {
|
||||
atSourceSelectionCombo.setSelectedItem(chooser.getSelectedFile().getAbsolutePath());
|
||||
updateOkButtonEnablement();
|
||||
}
|
||||
}
|
||||
});
|
||||
okButton.setEnabled(false);
|
||||
okButton.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
File atSourceFolder = new File((String) atSourceSelectionCombo.getSelectedItem());
|
||||
if (!Workspace.activeWorkspace.knownMapSourcesFolders.contains(atSourceFolder)) {
|
||||
Workspace.activeWorkspace.knownMapSourcesFolders.add(atSourceFolder);
|
||||
}
|
||||
Workspace.createProject(projectNameField.getText(), atSourceFolder, (Project.ResourceSet)resourceSetToUse.getSelectedItem());
|
||||
ProjectCreationWizard.this.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
cancelButton.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
ProjectCreationWizard.this.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
JPanel panel = new JPanel();
|
||||
panel.setLayout(new GridBagLayout());
|
||||
GridBagConstraints c =new GridBagConstraints();
|
||||
|
||||
c.anchor = GridBagConstraints.NORTHWEST;
|
||||
c.fill = GridBagConstraints.BOTH;
|
||||
c.gridheight = 1;
|
||||
c.gridwidth = 3;
|
||||
c.gridx = 1;
|
||||
c.gridy = 1;
|
||||
c.weightx = 100;
|
||||
c.weighty = 100;
|
||||
panel.add(errorLabel, c);
|
||||
|
||||
c.gridy++;
|
||||
c.gridx = 1;
|
||||
c.gridwidth = 1;
|
||||
c.weightx = 20;
|
||||
panel.add(new JLabel("Project name: "), c);
|
||||
|
||||
c.gridx++;
|
||||
c.gridwidth = 2;
|
||||
c.weightx = 80;
|
||||
panel.add(projectNameField, c);
|
||||
|
||||
c.gridy++;
|
||||
c.gridx = 1;
|
||||
c.gridwidth = 1;
|
||||
c.weightx = 20;
|
||||
panel.add(new JLabel("AT Source: "), c);
|
||||
List<ListDataListener> listeners = new CopyOnWriteArrayList<ListDataListener>();
|
||||
|
||||
c.gridx++;
|
||||
c.weightx = 60;
|
||||
panel.add(atSourceSelectionCombo, c);
|
||||
|
||||
c.gridx++;
|
||||
c.weightx = 20;
|
||||
panel.add(browse, c);
|
||||
|
||||
c.gridy++;
|
||||
c.gridx = 1;
|
||||
c.gridwidth = 1;
|
||||
c.weightx = 20;
|
||||
panel.add(new JLabel("Resource set: "), c);
|
||||
@Override
|
||||
public void addListDataListener(ListDataListener l) {
|
||||
listeners.add(l);
|
||||
}
|
||||
|
||||
c.gridx++;
|
||||
c.weightx = 80;
|
||||
c.gridwidth = 2;
|
||||
panel.add(resourceSetToUse, c);
|
||||
|
||||
JPanel buttonPane = new JPanel();
|
||||
buttonPane.setLayout(new GridBagLayout());
|
||||
GridBagConstraints c2 = new GridBagConstraints();
|
||||
c2.fill = GridBagConstraints.HORIZONTAL;
|
||||
c2.gridx = 1;
|
||||
c2.weightx = 80;
|
||||
|
||||
c2.gridx = 1;
|
||||
c2.weightx = 80;
|
||||
buttonPane.add(new JLabel(), c2);
|
||||
@Override
|
||||
public void removeListDataListener(ListDataListener l) {
|
||||
listeners.remove(l);
|
||||
}
|
||||
|
||||
c2.gridx++;
|
||||
c2.weightx = 10;
|
||||
c.fill = GridBagConstraints.NONE;
|
||||
buttonPane.add(cancelButton, c2);
|
||||
|
||||
c2.gridx++;
|
||||
c2.weightx = 10;
|
||||
buttonPane.add(okButton, c2);
|
||||
|
||||
c.gridy++;
|
||||
c.fill = GridBagConstraints.HORIZONTAL;
|
||||
c.gridwidth = 3;
|
||||
panel.add(buttonPane, c);
|
||||
|
||||
updateOkButtonEnablement();
|
||||
|
||||
setContentPane(panel);
|
||||
|
||||
pack();
|
||||
Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
Dimension wdim = getSize();
|
||||
setLocation((sdim.width - wdim.width)/2, (sdim.height - wdim.height)/2);
|
||||
}
|
||||
@Override
|
||||
public void setSelectedItem(Object anItem) {
|
||||
selected = (ResourceSet) anItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getSelectedItem() {
|
||||
return selected;
|
||||
}
|
||||
|
||||
});
|
||||
resourceSetToUse.setRenderer(new ListCellRenderer<Project.ResourceSet>() {
|
||||
@Override
|
||||
public Component getListCellRendererComponent(
|
||||
JList<? extends ResourceSet> list, ResourceSet value,
|
||||
int index, boolean isSelected, boolean cellHasFocus) {
|
||||
switch (value) {
|
||||
case allFiles:
|
||||
return new JLabel("All available files");
|
||||
case debugData:
|
||||
return new JLabel("Debug data");
|
||||
case gameData:
|
||||
return new JLabel("Real game data");
|
||||
default:
|
||||
return new JLabel();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
browse = new JButton("Browse...");
|
||||
okButton = new JButton("Ok");
|
||||
cancelButton = new JButton("Cancel");
|
||||
errorLabel = new JLabel("Enter the following information about your project.");
|
||||
|
||||
projectNameField.getDocument().addDocumentListener(new DocumentListener() {
|
||||
@Override
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
updateOkButtonEnablement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
updateOkButtonEnablement();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
updateOkButtonEnablement();
|
||||
}
|
||||
});
|
||||
for (File f : Workspace.activeWorkspace.knownMapSourcesFolders) {
|
||||
atSourceSelectionCombo.addItem(f.getAbsolutePath());
|
||||
}
|
||||
atSourceSelectionCombo.setEditable(true);
|
||||
atSourceSelectionCombo.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
updateOkButtonEnablement();
|
||||
}
|
||||
});
|
||||
browse.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
JFileChooser chooser = new JFileChooser();
|
||||
boolean keepTrying = true;
|
||||
if (atSourceSelectionCombo.getSelectedItem() != null && ((String) atSourceSelectionCombo.getSelectedItem()).length() > 0) {
|
||||
File f = new File((String) atSourceSelectionCombo.getSelectedItem());
|
||||
if (f.exists()) {
|
||||
chooser.setCurrentDirectory(f);
|
||||
keepTrying = false;
|
||||
}
|
||||
}
|
||||
if (keepTrying && Workspace.activeWorkspace.knownMapSourcesFolders != null && !Workspace.activeWorkspace.knownMapSourcesFolders.isEmpty()) {
|
||||
chooser.setCurrentDirectory(Workspace.activeWorkspace.knownMapSourcesFolders.iterator().next());
|
||||
}
|
||||
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
|
||||
int result = chooser.showOpenDialog(ProjectCreationWizard.this);
|
||||
if (result == JFileChooser.APPROVE_OPTION) {
|
||||
atSourceSelectionCombo.setSelectedItem(chooser.getSelectedFile().getAbsolutePath());
|
||||
updateOkButtonEnablement();
|
||||
}
|
||||
}
|
||||
});
|
||||
okButton.setEnabled(false);
|
||||
okButton.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
File atSourceFolder = new File((String) atSourceSelectionCombo.getSelectedItem());
|
||||
if (!Workspace.activeWorkspace.knownMapSourcesFolders.contains(atSourceFolder)) {
|
||||
Workspace.activeWorkspace.knownMapSourcesFolders.add(atSourceFolder);
|
||||
}
|
||||
Workspace.createProject(projectNameField.getText(), atSourceFolder, (Project.ResourceSet) resourceSetToUse.getSelectedItem());
|
||||
ProjectCreationWizard.this.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
cancelButton.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
ProjectCreationWizard.this.dispose();
|
||||
}
|
||||
});
|
||||
|
||||
JPanel panel = new JPanel();
|
||||
panel.setLayout(new GridBagLayout());
|
||||
GridBagConstraints c = new GridBagConstraints();
|
||||
|
||||
c.anchor = GridBagConstraints.NORTHWEST;
|
||||
c.fill = GridBagConstraints.BOTH;
|
||||
c.gridheight = 1;
|
||||
c.gridwidth = 3;
|
||||
c.gridx = 1;
|
||||
c.gridy = 1;
|
||||
c.weightx = 100;
|
||||
c.weighty = 100;
|
||||
panel.add(errorLabel, c);
|
||||
|
||||
c.gridy++;
|
||||
c.gridx = 1;
|
||||
c.gridwidth = 1;
|
||||
c.weightx = 20;
|
||||
panel.add(new JLabel("Project name: "), c);
|
||||
|
||||
c.gridx++;
|
||||
c.gridwidth = 2;
|
||||
c.weightx = 80;
|
||||
panel.add(projectNameField, c);
|
||||
|
||||
c.gridy++;
|
||||
c.gridx = 1;
|
||||
c.gridwidth = 1;
|
||||
c.weightx = 20;
|
||||
panel.add(new JLabel("AT Source: "), c);
|
||||
|
||||
c.gridx++;
|
||||
c.weightx = 60;
|
||||
panel.add(atSourceSelectionCombo, c);
|
||||
|
||||
c.gridx++;
|
||||
c.weightx = 20;
|
||||
panel.add(browse, c);
|
||||
|
||||
c.gridy++;
|
||||
c.gridx = 1;
|
||||
c.gridwidth = 1;
|
||||
c.weightx = 20;
|
||||
panel.add(new JLabel("Resource set: "), c);
|
||||
|
||||
c.gridx++;
|
||||
c.weightx = 80;
|
||||
c.gridwidth = 2;
|
||||
panel.add(resourceSetToUse, c);
|
||||
|
||||
JPanel buttonPane = new JPanel();
|
||||
buttonPane.setLayout(new GridBagLayout());
|
||||
GridBagConstraints c2 = new GridBagConstraints();
|
||||
c2.fill = GridBagConstraints.HORIZONTAL;
|
||||
|
||||
c2.gridx = 1;
|
||||
c2.weightx = 80;
|
||||
buttonPane.add(new JLabel(), c2);
|
||||
|
||||
c2.gridx++;
|
||||
c2.weightx = 10;
|
||||
c.fill = GridBagConstraints.NONE;
|
||||
buttonPane.add(cancelButton, c2);
|
||||
|
||||
c2.gridx++;
|
||||
c2.weightx = 10;
|
||||
buttonPane.add(okButton, c2);
|
||||
|
||||
c.gridy++;
|
||||
c.fill = GridBagConstraints.HORIZONTAL;
|
||||
c.gridwidth = 3;
|
||||
panel.add(buttonPane, c);
|
||||
|
||||
updateOkButtonEnablement();
|
||||
|
||||
setContentPane(panel);
|
||||
|
||||
pack();
|
||||
Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
Dimension wdim = getSize();
|
||||
setLocation((sdim.width - wdim.width) / 2, (sdim.height - wdim.height) / 2);
|
||||
}
|
||||
|
||||
|
||||
protected void updateOkButtonEnablement() {
|
||||
if (projectNameField.getText() == null || projectNameField.getText().length() <= 0) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">Select a project name.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
if (atSourceSelectionCombo.getSelectedItem() == null || ((String)atSourceSelectionCombo.getSelectedItem()).length() <= 0) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">Select an AT source root folder.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
File projFolder = new File(Workspace.activeWorkspace.baseFolder, projectNameField.getText()+File.separator);
|
||||
File sourceFolder = new File((String) atSourceSelectionCombo.getSelectedItem());
|
||||
if (projFolder.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">A project with this name already exists.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
} else {
|
||||
try {
|
||||
projFolder.getCanonicalPath();
|
||||
} catch (IOException ioe) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">"+projectNameField.getText()+" is not a valid project name.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!sourceFolder.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected AT source root folder does not exist.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
} else {
|
||||
File res = new File(sourceFolder, GameDataSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
if (!res.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected AT source root folder does not contain the \"res\" folder.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
File drawable = new File(sourceFolder, SpriteSheetSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
if (!drawable.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected AT source root folder does not contain the \"drawable\" folder.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
File xml = new File(sourceFolder, TMXMapSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
if (!xml.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected AT source root folder does not contain the \"xml\" folder.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!projFolder.exists() && sourceFolder.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#00AA00\">Everything looks good !</font></html>");
|
||||
this.okButton.setEnabled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateOkButtonEnablement() {
|
||||
if (projectNameField.getText() == null || projectNameField.getText().length() <= 0) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">Select a project name.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
if (atSourceSelectionCombo.getSelectedItem() == null || ((String) atSourceSelectionCombo.getSelectedItem()).length() <= 0) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">Select an AT source root folder.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
File projFolder = new File(Workspace.activeWorkspace.baseFolder, projectNameField.getText() + File.separator);
|
||||
File sourceFolder = new File((String) atSourceSelectionCombo.getSelectedItem());
|
||||
if (projFolder.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">A project with this name already exists.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
} else {
|
||||
try {
|
||||
projFolder.getCanonicalPath();
|
||||
} catch (IOException ioe) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">" + projectNameField.getText() + " is not a valid project name.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!sourceFolder.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected AT source root folder does not exist.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
} else {
|
||||
File res = new File(sourceFolder, GameDataSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
if (!res.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected AT source root folder does not contain the \"res\" folder.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
File drawable = new File(sourceFolder, SpriteSheetSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
if (!drawable.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected AT source root folder does not contain the \"drawable\" folder.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
File xml = new File(sourceFolder, TMXMapSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||
if (!xml.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#FF0000\">The selected AT source root folder does not contain the \"xml\" folder.</font></html>");
|
||||
this.okButton.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!projFolder.exists() && sourceFolder.exists()) {
|
||||
errorLabel.setText("<html><font color=\"#00AA00\">Everything looks good !</font></html>");
|
||||
this.okButton.setEnabled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user