mirror of
https://github.com/OMGeeky/ATCS.git
synced 2025-12-27 14:58:55 +01:00
Compare commits
288 Commits
v0.6.15
...
fix-orderi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
86b838f755 | ||
|
|
f66d016d08 | ||
|
|
9ba45fe848 | ||
|
|
f14255ce1c | ||
|
|
c37b56988d | ||
|
|
9654da02c2 | ||
|
|
d5c1ccebce | ||
|
|
0bf6b3f4d1 | ||
|
|
69c031d28e | ||
|
|
6ec4cbf83d | ||
|
|
5b2480920e | ||
|
|
e6f89b8802 | ||
|
|
f2008de3e2 | ||
|
|
0df961c8d3 | ||
|
|
15b98eedcf | ||
|
|
8399ae60ee | ||
|
|
1b643f4aa1 | ||
|
|
4293095e8e | ||
|
|
5f2927e00c | ||
|
|
79eddde155 | ||
|
|
c94c5fb41b | ||
|
|
be040a74bd | ||
|
|
31cbdcabab | ||
|
|
7e5c8d05ab | ||
|
|
b2003bfc38 | ||
|
|
3b99a94654 | ||
|
|
806f0b10e6 | ||
|
|
29241f18b8 | ||
|
|
7df75482eb | ||
|
|
f93d865da7 | ||
|
|
bad86eec93 | ||
|
|
ef9a2a628d | ||
|
|
9dfd217a27 | ||
|
|
6f10e5b94a | ||
|
|
7cbce8e4d7 | ||
|
|
364bf8ee11 | ||
|
|
e2b0b0e81e | ||
|
|
703b723322 | ||
|
|
297bff84db | ||
|
|
67724f5124 | ||
|
|
09d23c8cdf | ||
|
|
749e64e09e | ||
|
|
998560a6ff | ||
|
|
2bf64c417f | ||
|
|
120ed02a69 | ||
|
|
f308580deb | ||
|
|
fd41013ade | ||
|
|
114e09597e | ||
|
|
3ceee2e9e6 | ||
|
|
83cc57515d | ||
|
|
06d4131582 | ||
|
|
60205d54de | ||
|
|
f6fbb0f5a3 | ||
|
|
af48341439 | ||
|
|
7b7218ad4e | ||
|
|
1ddf1c5051 | ||
|
|
f9a9ab97de | ||
|
|
b37d32b5c2 | ||
|
|
3c5ed1d6f6 | ||
|
|
bc3333bd0e | ||
|
|
e6d9d8fbda | ||
|
|
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 | ||
|
|
b58d080f4d | ||
|
|
a2640c2da0 | ||
|
|
4fe7e71a43 | ||
|
|
9a162ac58d | ||
|
|
93718230a5 | ||
|
|
4fbf7de85a | ||
|
|
f0be1a8135 | ||
|
|
104d3db5ad | ||
|
|
f154efcecc | ||
|
|
00e9e3b2a7 | ||
|
|
92436d3ce9 | ||
|
|
b6cfe349c0 | ||
|
|
1e2daa56a4 | ||
|
|
2caaaeb474 | ||
|
|
0e8ed1a25d | ||
|
|
e2fdf08fec | ||
|
|
b5dceb9fd1 | ||
|
|
1555bd63db | ||
|
|
56fff8a730 | ||
|
|
dd7b3d5300 | ||
|
|
68affdde8c | ||
|
|
6cec8b835e | ||
|
|
aa43382296 | ||
|
|
ec346e9c98 | ||
|
|
61d5af822c | ||
|
|
c2d05b2bff | ||
|
|
e60378ab64 | ||
|
|
6578236775 | ||
|
|
4fa2409c24 | ||
|
|
b5aa453fd6 | ||
|
|
42f1c87278 | ||
|
|
9097b97316 | ||
|
|
7965ecb4f1 | ||
|
|
01963517ba | ||
|
|
30bef443d5 | ||
|
|
8d01716d93 | ||
|
|
fce5cd71ff | ||
|
|
0cddbb04e9 | ||
|
|
00ec5fe49f | ||
|
|
5cdb42ae07 | ||
|
|
c98f51744b | ||
|
|
5550b257ca | ||
|
|
619aa1075f | ||
|
|
38a3ad85c8 | ||
|
|
89f764b62b | ||
|
|
d81233d470 | ||
|
|
e1685aa625 | ||
|
|
ae3ca5d50a | ||
|
|
a00b8fbc66 | ||
|
|
4d03c15e08 | ||
|
|
4571bea429 | ||
|
|
ecc9a35c69 | ||
|
|
c4d71df4b1 | ||
|
|
a13dac467a | ||
|
|
e305dfd7bf | ||
|
|
80984a43af | ||
|
|
2bc8b65264 | ||
|
|
b2584a24cc | ||
|
|
1626a8340f | ||
|
|
5fe2dfe148 | ||
|
|
abc1e7c912 | ||
|
|
317d6d4216 | ||
|
|
3628386019 | ||
|
|
ada352a02c | ||
|
|
fc0d97aa2f | ||
|
|
7451f582ce | ||
|
|
7b80bf5768 | ||
|
|
ddd98c5a8f | ||
|
|
0ef703d82e | ||
|
|
2339a9307c | ||
|
|
7dcdb90750 | ||
|
|
b638c31ebe | ||
|
|
862f4b7366 | ||
|
|
693de98212 | ||
|
|
3f4bf58375 | ||
|
|
7ae4d9d3f6 | ||
|
|
0f20f0cd6d | ||
|
|
481956cfa5 | ||
|
|
7c282aae53 | ||
|
|
1fd3e6253e | ||
|
|
70f61f0281 | ||
|
|
2f82fd13a6 | ||
|
|
f7e5785970 | ||
|
|
084b23f641 | ||
|
|
ff4d8a6b6c | ||
|
|
45aff3d25b | ||
|
|
28a1d0b09e | ||
|
|
b96568049f | ||
|
|
e125b0339c | ||
|
|
65456a110b | ||
|
|
a9bd84b9f2 | ||
|
|
1bab8dc42f | ||
|
|
7863b73eda | ||
|
|
32e1b87e09 | ||
|
|
4b6be99d98 | ||
|
|
13847bb8cd | ||
|
|
2d92a97689 | ||
|
|
9c21c7cd02 | ||
|
|
f4fd8ad5bb | ||
|
|
63acc5bf2c | ||
|
|
4c51353e93 | ||
|
|
7bf6bbfcd1 | ||
|
|
7d40d56430 | ||
|
|
d7e83575e3 | ||
|
|
811870184b | ||
|
|
7297f47b67 | ||
|
|
20877f7850 | ||
|
|
b3c8879be1 |
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
|
||||
69
.github/workflows/release.yml
vendored
Normal file
69
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
name: Release Build
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [ created ]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Get Version
|
||||
id: get_version
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Reading version from file:"
|
||||
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"
|
||||
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'temurin'
|
||||
|
||||
- name: Build JAR
|
||||
shell: bash
|
||||
run: |
|
||||
cd packaging
|
||||
chmod +x package.sh
|
||||
echo "Building JAR and ZIP for version: ${{ env.VERSION }}"
|
||||
./package.sh
|
||||
echo "Created artifacts:"
|
||||
ls -la common/ATCS.jar
|
||||
ls -la ATCS_${{ env.VERSION }}.zip
|
||||
|
||||
- name: Upload Release Assets (zip)
|
||||
uses: softprops/action-gh-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
files: |
|
||||
./packaging/ATCS_${{ env.VERSION }}.zip
|
||||
|
||||
- name: 'Install makensis (apt)'
|
||||
run: sudo apt update && sudo apt install -y nsis nsis-pluginapi
|
||||
continue-on-error: true
|
||||
|
||||
- name: Create Windows-Installer with NSIS
|
||||
uses: joncloud/makensis-action@v4
|
||||
with:
|
||||
script-file: packaging/Windows/ATCS_Installer.nsi
|
||||
arguments: -DVERSION="${{ env.VERSION }}"
|
||||
continue-on-error: true
|
||||
|
||||
- name: Upload Release Assets (exe)
|
||||
uses: softprops/action-gh-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
files: ./packaging/ATCS_${{ env.VERSION }}_Setup.exe
|
||||
continue-on-error: true
|
||||
10
.gitignore
vendored
10
.gitignore
vendored
@@ -1,3 +1,13 @@
|
||||
/ATCS_v*.jar
|
||||
/Project
|
||||
/bin
|
||||
/packaging/tmp/
|
||||
/out
|
||||
packaging/common/lib
|
||||
packaging/common/ATCS.jar
|
||||
packaging/ATCS_*.zip
|
||||
ATCS_v*.tar.gz
|
||||
ATCS.jar
|
||||
/packaging/common/ATCS.env.bat
|
||||
/packaging/common/ATCS.env
|
||||
/packaging/common/ATCS_v*.zip
|
||||
|
||||
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
17
.idea/artifacts/ATContentStudio_jar.xml
generated
Normal file
17
.idea/artifacts/ATContentStudio_jar.xml
generated
Normal file
@@ -0,0 +1,17 @@
|
||||
<component name="ArtifactManager">
|
||||
<artifact name="ATContentStudio:jar">
|
||||
<output-path>$PROJECT_DIR$/out/artifacts/ATContentStudio_jar</output-path>
|
||||
<root id="root">
|
||||
<element id="archive" name="ATContentStudio.jar">
|
||||
<element id="module-output" name="ATContentStudio" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/bsh-2.0b4.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/rsyntaxtextarea.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/prefuse.jar" path-in-jar="/" />
|
||||
<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/jide-oss.jar" path-in-jar="/" />
|
||||
</element>
|
||||
</root>
|
||||
</artifact>
|
||||
</component>
|
||||
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>
|
||||
4
.idea/misc.xml
generated
Normal file
4
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK" />
|
||||
</project>
|
||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/ATContentStudio.iml" filepath="$PROJECT_DIR$/ATContentStudio.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<jardesc>
|
||||
<jar path="ATContentStudio/ATCS_v0.6.15.jar"/>
|
||||
<jar path="ATContentStudio/ATCS_v0.6.20.jar"/>
|
||||
<options buildIfNeeded="true" compress="true" descriptionLocation="/ATContentStudio/ATCS_JAR.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
|
||||
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
|
||||
<selectedProjects/>
|
||||
|
||||
117
ATContentStudio.iml
Normal file
117
ATContentStudio.iml
Normal file
@@ -0,0 +1,117 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="EclipseModuleManager">
|
||||
<libelement value="jar://$MODULE_DIR$/lib/jide-oss.jar!/" />
|
||||
<libelement value="jar://$MODULE_DIR$/lib/json_simple-1.1.jar!/" />
|
||||
<libelement value="jar://$MODULE_DIR$/lib/junit-4.10.jar!/" />
|
||||
<libelement value="jar://$MODULE_DIR$/lib/prefuse.jar!/" />
|
||||
<libelement value="jar://$MODULE_DIR$/lib/rsyntaxtextarea.jar!/" />
|
||||
<libelement value="jar://$MODULE_DIR$/lib/ui.jar!/" />
|
||||
<libelement value="jar://$MODULE_DIR$/lib/bsh-2.0b4.jar!/" />
|
||||
<libelement value="jar://$MODULE_DIR$/lib/jsoup-1.10.2.jar!/" />
|
||||
<libelement value="jar://$MODULE_DIR$/lib/AndorsTrainer_v0.1.5.jar!/" />
|
||||
<src_description expected_position="0">
|
||||
<src_folder value="file://$MODULE_DIR$/src" expected_position="0" />
|
||||
<src_folder value="file://$MODULE_DIR$/res" expected_position="1" />
|
||||
<src_folder value="file://$MODULE_DIR$/hacked-libtiled" expected_position="2" />
|
||||
<src_folder value="file://$MODULE_DIR$/siphash-zackehh/src/main/java" expected_position="3" />
|
||||
<src_folder value="file://$MODULE_DIR$/minify" expected_position="4" />
|
||||
</src_description>
|
||||
</component>
|
||||
<component name="NewModuleRootManager">
|
||||
<output url="file://$MODULE_DIR$/bin" />
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/hacked-libtiled" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/minify" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/res" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/siphash-zackehh/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
</content>
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="module-library">
|
||||
<library name="jide-oss.jar">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/lib/jide-oss.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module-library">
|
||||
<library name="json_simple-1.1.jar">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/lib/json_simple-1.1.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module-library">
|
||||
<library name="junit-4.10.jar">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/lib/junit-4.10.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module-library">
|
||||
<library name="prefuse.jar">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/lib/prefuse.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module-library">
|
||||
<library name="rsyntaxtextarea.jar">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/lib/rsyntaxtextarea.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module-library">
|
||||
<library name="ui.jar">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/lib/ui.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module-library">
|
||||
<library name="bsh-2.0b4.jar">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/lib/bsh-2.0b4.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module-library">
|
||||
<library name="jsoup-1.10.2.jar">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/lib/jsoup-1.10.2.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES>
|
||||
<root url="jar://$MODULE_DIR$/lib/jsoup-1.10.2-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module-library">
|
||||
<library name="AndorsTrainer_v0.1.5.jar">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/lib/AndorsTrainer_v0.1.5.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
</component>
|
||||
</module>
|
||||
129
createProject.bat
Normal file
129
createProject.bat
Normal file
@@ -0,0 +1,129 @@
|
||||
@echo off
|
||||
echo.
|
||||
echo ***
|
||||
echo *** createProject v1.0 (2024-08-24)
|
||||
echo ***
|
||||
echo *** This script will help to setup an ATCS project
|
||||
echo *** and connect it to a repo on Github
|
||||
echo ***
|
||||
echo.
|
||||
rem Save this script anywhere on your PC (e.g. C:\AT\createProject.bat)
|
||||
rem Then open a command shell: CMD
|
||||
rem and call the script in the shell.
|
||||
|
||||
if "%1"=="" goto :noParamError
|
||||
|
||||
echo You have entered:
|
||||
echo.
|
||||
echo ATCS-project: %1
|
||||
echo in Directory: %2
|
||||
echo Github user: %3
|
||||
echo.
|
||||
pause
|
||||
if "%3"=="" goto :help
|
||||
if not "%4"=="" goto :help
|
||||
|
||||
if not exist %2 md %2
|
||||
|
||||
rem --- Create ATCS project (if not already done)
|
||||
:atcs
|
||||
if not exist %2\%1\created\drawable\char_hero.png (
|
||||
echo.
|
||||
echo Do the following steps:
|
||||
echo.
|
||||
echo 1. Start ATCS
|
||||
echo 2. Create your ATCS workspace in %2
|
||||
echo 3. Add the new project %1
|
||||
echo 4. Exit ATCS
|
||||
echo.
|
||||
pause
|
||||
goto :atcs
|
||||
) else (
|
||||
echo ATCS Project exists
|
||||
)
|
||||
|
||||
rem --- Create git repository
|
||||
rem This is the really important part :)
|
||||
rem -- go into project dir (even if we do not need to create the git repo)
|
||||
echo cd %2\%1
|
||||
cd %2\%1
|
||||
|
||||
if not exist %2\%1\readme.md (
|
||||
echo creating readme
|
||||
|
||||
echo # %1 > readme.md
|
||||
) else (
|
||||
echo readme already exists
|
||||
)
|
||||
|
||||
if not exist %2\%1\.gitignore (
|
||||
echo creating 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
|
||||
echo created/drawable/* >> .gitignore
|
||||
echo tmp/res/values/loadresources.xml >> .gitignore
|
||||
) else (
|
||||
echo gitignore already existed
|
||||
)
|
||||
|
||||
:git
|
||||
if not exist %2\%1\.git (
|
||||
echo Initializing git
|
||||
git init -b main || (
|
||||
echo "failed to init git. Please make sure it is installed"
|
||||
pause
|
||||
goto :git
|
||||
)
|
||||
:git_commit
|
||||
git add readme.md
|
||||
git add .gitignore
|
||||
git commit -m "Init project" || (
|
||||
echo "failed to create the initial commit."
|
||||
pause
|
||||
goto :git_commit
|
||||
)
|
||||
echo Done initializing git
|
||||
) else (
|
||||
echo git was already initialized
|
||||
)
|
||||
|
||||
echo.
|
||||
echo Now create your repo %1 on https://github.com/%3 (if not already done)
|
||||
echo.
|
||||
pause
|
||||
echo pushing to git repo https://github.com/%3/%1.git
|
||||
git remote add origin https://github.com/%3/%1.git
|
||||
git push -u origin main
|
||||
|
||||
echo.
|
||||
echo At last you have to find the repo in your git client:
|
||||
echo - In Smartgit: Menu option: Repository / Search for repository
|
||||
echo.
|
||||
goto :end
|
||||
|
||||
:noParamError
|
||||
echo.
|
||||
echo You have given no parameter.
|
||||
echo Maybe you have just double clicked it? That won't work.
|
||||
echo I have opened a CMD shell for you. Enter the command in that shell.
|
||||
start cmd
|
||||
echo Please switch to the CMD shell
|
||||
|
||||
:help
|
||||
echo.
|
||||
echo Enter the command with 3 parameters:
|
||||
echo %0 project path git-user
|
||||
echo.
|
||||
echo Example: %0 feygard_1 c:\AT\ATCS NutAndor
|
||||
echo.
|
||||
|
||||
:end
|
||||
echo.
|
||||
echo *** End ***
|
||||
pause
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -913,7 +913,8 @@ public class TMXMapReader
|
||||
private class MapEntityResolver implements EntityResolver
|
||||
{
|
||||
public InputSource resolveEntity(String publicId, String systemId) {
|
||||
if (systemId.equals("http://mapeditor.org/dtd/1.0/map.dtd")) {
|
||||
if (systemId.equals("http://mapeditor.org/dtd/1.0/map.dtd") ||
|
||||
systemId.equals("https://mapeditor.org/dtd/1.0/map.dtd")) {
|
||||
return new InputSource(TMXMapReader.class.getResourceAsStream(
|
||||
"resources/map.dtd"));
|
||||
}
|
||||
|
||||
@@ -47,6 +47,9 @@ import java.util.Vector;
|
||||
import java.util.zip.DeflaterOutputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
|
||||
|
||||
import tiled.core.AnimatedTile;
|
||||
import tiled.core.Map;
|
||||
import tiled.core.MapLayer;
|
||||
@@ -150,7 +153,7 @@ public class TMXMapWriter
|
||||
}
|
||||
|
||||
private void writeMap(Map map, XMLWriter w, String wp) throws IOException {
|
||||
w.writeDocType("map", null, "http://mapeditor.org/dtd/1.0/map.dtd");
|
||||
w.writeDocType("map", null, "https://mapeditor.org/dtd/1.0/map.dtd");
|
||||
w.startElement("map");
|
||||
|
||||
w.writeAttribute("version", "1.0");
|
||||
@@ -238,7 +241,15 @@ public class TMXMapWriter
|
||||
} else {
|
||||
w.startElement("tileset");
|
||||
w.writeAttribute("firstgid", getFirstGidForTileset(set));
|
||||
w.writeAttribute("source", getRelativePath(wp, source));
|
||||
if (set.sheet != null && set.sheet.parent.getDataType() == Type.source) {
|
||||
String fileName = set.getName();
|
||||
if (fileName.length() > 3 && !(fileName.substring(fileName.length() - 4).equalsIgnoreCase(".png"))) {
|
||||
fileName += ".png";
|
||||
}
|
||||
w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + fileName).replace("\\", "/"));
|
||||
} else {
|
||||
w.writeAttribute("source", getRelativePath(wp, source));
|
||||
}
|
||||
if (set.getBaseDir() != null) {
|
||||
w.writeAttribute("basedir", set.getBaseDir());
|
||||
}
|
||||
@@ -279,7 +290,15 @@ public class TMXMapWriter
|
||||
|
||||
if (tileBitmapFile != null) {
|
||||
w.startElement("image");
|
||||
w.writeAttribute("source", getRelativePath(wp, tileBitmapFile));
|
||||
if (set.sheet != null && set.sheet.parent.getDataType() == Type.source) {
|
||||
String fileName = set.getName();
|
||||
if (fileName.length() > 3 && !(fileName.substring(fileName.length() - 4).equalsIgnoreCase(".png"))) {
|
||||
fileName += ".png";
|
||||
}
|
||||
w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + fileName).replace("\\", "/"));
|
||||
} else {
|
||||
w.writeAttribute("source", getRelativePath(wp, tileBitmapFile));
|
||||
}
|
||||
if (set.sheetDimensions != null) {
|
||||
w.writeAttribute("width", set.sheetDimensions.width);
|
||||
w.writeAttribute("height", set.sheetDimensions.height);
|
||||
@@ -569,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.
BIN
lib/jide-oss.jar
BIN
lib/jide-oss.jar
Binary file not shown.
@@ -1 +0,0 @@
|
||||
v0.6.15
|
||||
2
packaging/Linux/.gitignore
vendored
2
packaging/Linux/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
/ATCS_v*.zip
|
||||
/ATCS_v*.zip.rename
|
||||
@@ -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
|
||||
2
packaging/Manifest.txt
Normal file
2
packaging/Manifest.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Manifest-Version: 1.0
|
||||
Main-Class: com.gpl.rpg.atcontentstudio.ATContentStudio
|
||||
@@ -1,11 +1,12 @@
|
||||
!include MUI2.nsh
|
||||
|
||||
!define VERSION "0.6.15"
|
||||
; Version will be passed as /DVERSION=vx.x.x
|
||||
!define TRAINER_VERSION "0.1.5"
|
||||
!define JAVA_BIN "javaw"
|
||||
!define JAVA_BIN "java"
|
||||
!define ATCS_SOURCE_DIR "..\..\"
|
||||
|
||||
Name "Andor's Trail Content Studio v${VERSION}"
|
||||
OutFile "ATCS_v${VERSION}_Setup.exe"
|
||||
Name "Andor's Trail Content Studio ${VERSION}"
|
||||
OutFile "..\ATCS_${VERSION}_Setup.exe"
|
||||
InstallDir "$PROGRAMFILES\ATCS\"
|
||||
|
||||
;SetCompressor /SOLID /FINAL lzma
|
||||
@@ -13,10 +14,10 @@ InstallDir "$PROGRAMFILES\ATCS\"
|
||||
Var StartMenuFolder
|
||||
|
||||
!define MUI_WELCOMEPAGE_TITLE "Welcome to Andor's Trail Content Studio installer"
|
||||
!define MUI_WELCOMEPAGE_TEXT "This will install Andor's Trail Content Studio v${VERSION} installer"
|
||||
!define MUI_FINISHPAGE_TEXT "Andor's Trail Content Studio v${VERSION} install completed !"
|
||||
!define MUI_WELCOMEPAGE_TEXT "This will install Andor's Trail Content Studio ${VERSION}"
|
||||
!define MUI_FINISHPAGE_TEXT "Andor's Trail Content Studio ${VERSION} - Install completed !"
|
||||
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Andor's Trail Content Studio"
|
||||
!define MUI_PAGE_HEADER_TEXT "Installing Andor's Trail Content Studio v${VERSION}"
|
||||
!define MUI_PAGE_HEADER_TEXT "Installing Andor's Trail Content Studio ${VERSION}"
|
||||
|
||||
|
||||
;Start Menu Folder Page Configuration
|
||||
@@ -46,130 +47,120 @@ Var StartMenuFolder
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
|
||||
|
||||
!insertmacro MUI_LANGUAGE "English"
|
||||
|
||||
|
||||
;------------------------------------------------------------------------------------
|
||||
Section install
|
||||
|
||||
|
||||
;--- Create in ...\packaging\common\ ATCS.cmd ATCT.ico ATCS.jar
|
||||
SetOutPath $INSTDIR
|
||||
file "ATCS.ico"
|
||||
|
||||
Delete "$INSTDIR\lib\*"
|
||||
|
||||
file "${ATCS_SOURCE_DIR}\packaging\common\ATCS.jar"
|
||||
|
||||
Call GetJRE
|
||||
Pop $R0
|
||||
; file "${ATCS_SOURCE_DIR}\packaging\common\ATCS.cmd"
|
||||
; !insertmacro _ReplaceInFile "ATCS.cmd" "java.exe" "$R0" (It was too much work this way)
|
||||
FileOpen $9 "ATCS.cmd" w
|
||||
FileWrite $9 '@echo off$\r$\n'
|
||||
FileWrite $9 '$\r$\n'
|
||||
FileWrite $9 'set "ATCS_DIR=%~dp0"$\r$\n'
|
||||
FileWrite $9 'set "MAX_MEM=512M"$\r$\n'
|
||||
FileWrite $9 'set "CP=%ATCS_DIR%lib\*"$\r$\n'
|
||||
FileWrite $9 'set "MAX_MEM=1024M"$\r$\n'
|
||||
FileWrite $9 'REM required minimum java version is 11$\r$\n'
|
||||
FileWrite $9 'set "JAVA=$R0"$\r$\n'
|
||||
FileWrite $9 'set "JAVA_OPTS="$\r$\n'
|
||||
FileWrite $9 'set "JAVA_OPTS=-DFONT_SCALE=1.0 -Dswing.aatext=true"$\r$\n'
|
||||
FileWrite $9 'set "ENV_FILE=%ATCS_DIR%ATCS.env.bat"$\r$\n'
|
||||
FileWrite $9 'set "MAIN_CLASS=com.gpl.rpg.atcontentstudio.ATContentStudio"$\r$\n'
|
||||
FileWrite $9 '$\r$\n'
|
||||
FileWrite $9 'if exist "%ENV_FILE%" ($\r$\n'
|
||||
FileWrite $9 'if exist "%ENV_FILE%" ($\r$\n'
|
||||
FileWrite $9 ' call "%ENV_FILE%"$\r$\n'
|
||||
FileWrite $9 ') else ($\r$\n'
|
||||
FileWrite $9 ' echo REM set "MAX_MEM=%MAX_MEM%">"%ENV_FILE%"$\r$\n'
|
||||
FileWrite $9 ' echo REM required minimum java version is 11$\r$\n'
|
||||
FileWrite $9 ' echo REM set "JAVA=%JAVA%">>"%ENV_FILE%"$\r$\n'
|
||||
FileWrite $9 ' echo REM set "JAVA_OPTS=%JAVA_OPTS%">>"%ENV_FILE%"$\r$\n'
|
||||
FileWrite $9 ' echo.>>"%ENV_FILE%"$\r$\n'
|
||||
FileWrite $9 ')$\r$\n'
|
||||
FileWrite $9 '$\r$\n'
|
||||
FileWrite $9 'start "" "%JAVA%" %JAVA_OPTS% -Xmx%MAX_MEM% -cp "%CP%" %MAIN_CLASS%$\r$\n'
|
||||
FileWrite $9 'start "" "%JAVA%" %JAVA_OPTS% -Xmx%MAX_MEM% -jar "%ATCS_DIR%\ATCS.jar"$\r$\n'
|
||||
FileClose $9
|
||||
|
||||
SetOutPath "$INSTDIR\lib\"
|
||||
file "jide-oss.jar"
|
||||
file "ui.jar"
|
||||
file "AndorsTrainer_v${TRAINER_VERSION}.jar"
|
||||
file "junit-4.10.jar"
|
||||
file "json_simple-1.1.jar"
|
||||
file "ATCS_v${VERSION}.jar"
|
||||
file "rsyntaxtextarea.jar"
|
||||
file "prefuse.jar"
|
||||
file "bsh-2.0b4.jar"
|
||||
file "jsoup-1.10.2.jar"
|
||||
|
||||
SetOutPath $INSTDIR
|
||||
|
||||
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
||||
|
||||
|
||||
|
||||
|
||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN "ATCS"
|
||||
|
||||
;Create shortcuts
|
||||
|
||||
;--- Create shortcuts
|
||||
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
|
||||
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Andor's Trail Content Studio.lnk" "$INSTDIR\ATCS.cmd" "" "$INSTDIR\ATCS.ico"
|
||||
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
||||
|
||||
|
||||
!insertmacro MUI_STARTMENU_WRITE_END
|
||||
|
||||
|
||||
SectionEnd
|
||||
|
||||
|
||||
;------------------------------------------------------------------------------------
|
||||
Section uninstall
|
||||
|
||||
|
||||
Delete "$INSTDIR\lib\jide-oss.jar"
|
||||
Delete "$INSTDIR\lib\ui.jar"
|
||||
Delete "$INSTDIR\lib\junit-4.10.jar"
|
||||
Delete "$INSTDIR\lib\json_simple-1.1.jar"
|
||||
Delete "$INSTDIR\lib\AndorsTrainer_v${TRAINER_VERSION}.jar"
|
||||
Delete "$INSTDIR\lib\ATCS_v${VERSION}.jar"
|
||||
Delete "$INSTDIR\lib\rsyntaxtextarea.jar"
|
||||
Delete "$INSTDIR\lib\prefuse.jar"
|
||||
Delete "$INSTDIR\lib\bsh-2.0b4.jar"
|
||||
Delete "$INSTDIR\lib\jsoup-1.10.2.jar"
|
||||
RMDir "$INSTDIR\lib\"
|
||||
|
||||
Delete "$INSTDIR\ATCS.ico"
|
||||
Delete "$INSTDIR\ATCS.cmd"
|
||||
Delete "$INSTDIR\ATCS.env.bat"
|
||||
|
||||
Delete "$INSTDIR\ATCS.jar"
|
||||
Delete "$INSTDIR\Uninstall.exe"
|
||||
|
||||
RMDir "$INSTDIR"
|
||||
|
||||
|
||||
!insertmacro MUI_STARTMENU_GETFOLDER "ATCS" $StartMenuFolder
|
||||
|
||||
|
||||
Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk"
|
||||
Delete "$SMPROGRAMS\$StartMenuFolder\Andor's Trail Content Studio.lnk"
|
||||
RMDir "$SMPROGRAMS\$StartMenuFolder"
|
||||
|
||||
|
||||
SectionEnd
|
||||
|
||||
|
||||
;------------------------------------------------------------------------------------
|
||||
Function GetJRE
|
||||
;
|
||||
; Find JRE (javaw.exe)
|
||||
; Find JRE (java.exe)
|
||||
; DISABLED 1 - in .\jre directory (JRE Installed with application)
|
||||
; 2 - in JAVA_HOME environment variable
|
||||
; 3 - in the registry
|
||||
; 4 - assume javaw.exe in current dir or PATH
|
||||
|
||||
; 4 - assume java.exe in current dir or PATH
|
||||
|
||||
Push $R0
|
||||
Push $R1
|
||||
|
||||
|
||||
;ClearErrors
|
||||
;StrCpy $R0 "$EXEDIR\jre\bin\javaw.exe"
|
||||
;StrCpy $R0 "$EXEDIR\jre\bin\java.exe"
|
||||
;IfFileExists $R0 JreFound
|
||||
;StrCpy $R0 ""
|
||||
|
||||
|
||||
ClearErrors
|
||||
ReadEnvStr $R0 "JAVA_HOME"
|
||||
StrCpy $R0 "$R0\bin\${JAVA_BIN}.exe"
|
||||
IfErrors 0 JreFound
|
||||
|
||||
|
||||
ClearErrors
|
||||
ReadRegStr $R1 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion"
|
||||
ReadRegStr $R0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment\$R1" "JavaHome"
|
||||
StrCpy $R0 "$R0\bin\${JAVA_BIN}.exe"
|
||||
|
||||
|
||||
IfErrors 0 JreFound
|
||||
StrCpy $R0 "${JAVA_BIN}.exe"
|
||||
|
||||
|
||||
JreFound:
|
||||
Pop $R1
|
||||
Exch $R0
|
||||
FunctionEnd
|
||||
FunctionEnd
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
@echo off
|
||||
|
||||
set "ATCS_DIR=%~dp0"
|
||||
set "MAX_MEM=512M"
|
||||
set "CP=%ATCS_DIR%lib\*"
|
||||
set "JAVA=javaw.exe"
|
||||
set "MAX_MEM=1024M"
|
||||
REM required minimum java version is 11
|
||||
set "JAVA=java.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 required minimum java version is 11
|
||||
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%
|
||||
start "" "%JAVA%" %JAVA_OPTS% -Xmx%MAX_MEM% -jar "%ATCS_DIR%\ATCS.jar"
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
28
packaging/common/ATCS.sh
Executable file
28
packaging/common/ATCS.sh
Executable file
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# get the directory of this script
|
||||
ATCS_DIR="$(dirname "$(readlink -f "$0" || greadlink -f "$0" || stat -f "$0")")"
|
||||
echo "ATCS_DIR: '${ATCS_DIR}'"
|
||||
|
||||
MAX_MEM="512M"
|
||||
JAVA="java" # minimum required version is Java 11
|
||||
JAVA_OPTS='-DFONT_SCALE=1.0 -Dswing.aatext=true'
|
||||
|
||||
ENV_FILE="${ATCS_DIR}/ATCS.env"
|
||||
|
||||
if [ -f "${ENV_FILE}" ]; then
|
||||
source "${ENV_FILE}"
|
||||
else
|
||||
{
|
||||
echo "#MAX_MEM=\"${MAX_MEM}\""
|
||||
echo "#JAVA=\"${JAVA}\" # minimum required version is Java 11"
|
||||
echo "#JAVA_OPTS=\"${JAVA_OPTS}\""
|
||||
echo ""
|
||||
}>"${ENV_FILE}"
|
||||
fi
|
||||
|
||||
export ENV_FILE
|
||||
|
||||
# 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"
|
||||
1
packaging/package-windows.sh
Normal file
1
packaging/package-windows.sh
Normal file
@@ -0,0 +1 @@
|
||||
sh ./package.sh -windows
|
||||
125
packaging/package.sh
Executable file
125
packaging/package.sh
Executable file
@@ -0,0 +1,125 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script to build ATCS.jar, replicating IntelliJ artifact definition
|
||||
# Linux and Windows compatible
|
||||
|
||||
# --- Platform Detection ---
|
||||
if [ "$1" = "-windows" ]; then
|
||||
echo "Got '-windows' flag. Running Windows version"
|
||||
PLATFORM="WINDOWS"
|
||||
else
|
||||
echo "No '-windows' flag. Running Linux version"
|
||||
PLATFORM="LINUX"
|
||||
fi
|
||||
|
||||
# --- Configuration ---
|
||||
PACKAGING_DIR=$(dirname "$(readlink -f "$0" || greadlink -f "$0" || stat -f "$0")") # Directory of this script
|
||||
ATCS_SOURCE_DIR=$(dirname "${PACKAGING_DIR}") # Parent directory of this script, assumed to be ATCS source root
|
||||
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="${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
|
||||
|
||||
# --- **ADDITIONAL SOURCE CODE FOLDERS** ---
|
||||
EXTRA_SOURCE_DIRS=(
|
||||
"hacked-libtiled"
|
||||
"minify"
|
||||
"siphash-zackehh/src/main/java"
|
||||
)
|
||||
|
||||
# --- Libraries to include ---
|
||||
LIBRARIES=(
|
||||
"bsh-2.0b4.jar"
|
||||
"jide-oss.jar"
|
||||
"json_simple-1.1.jar"
|
||||
"jsoup-1.10.2.jar"
|
||||
"junit-4.10.jar"
|
||||
"prefuse.jar"
|
||||
"rsyntaxtextarea.jar"
|
||||
"ui.jar"
|
||||
)
|
||||
|
||||
# --- Get version ---
|
||||
echo "Getting version"
|
||||
VERSION=$(tr -d '[:space:]' < "${VERSION_FILE}")
|
||||
echo "Got version ${VERSION}"
|
||||
|
||||
# --- Prepare temporary directory ---
|
||||
echo "Removing tmp folder"
|
||||
rm -rf "${TEMP_DIR}"
|
||||
echo "Recreating tmp folder"
|
||||
mkdir -p "${TEMP_DIR}"
|
||||
|
||||
# --- **EXTRACT lib files directly to TEMP_DIR** ---
|
||||
echo 'Extracting lib files to TEMP_DIR'
|
||||
for LIB in "${LIBRARIES[@]}"; do
|
||||
echo "Extracting library: ${LIB}"
|
||||
unzip -qo "${LIB_BASE_DIR}/${LIB}" -d "${TEMP_DIR}" # Extract JAR contents to TEMP_DIR root
|
||||
done
|
||||
|
||||
# --- Set ClassPath ---
|
||||
echo "Getting source files"
|
||||
# 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 ""
|
||||
|
||||
# --- 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."
|
||||
exit 1
|
||||
fi
|
||||
echo "Compilation successful"
|
||||
|
||||
# --- Copy res stuff to temp folder ---
|
||||
echo "Copying some stuff to temp folder"
|
||||
cp -r "${ATCS_SOURCE_DIR}"/res/* "${TEMP_DIR}/"
|
||||
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 ""
|
||||
echo "Creating jar at location: ${JAR_LOCATION}"
|
||||
|
||||
cd "${TEMP_DIR}" || exit # Change to temp dir for JAR command
|
||||
|
||||
# JAR command WITHOUT lib directory
|
||||
jar cfm "${JAR_LOCATION}" "${MANIFEST_LOCATION}" -C . .
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "JAR creation failed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "${PACKAGING_DIR}" || exit # Go back to packaging dir
|
||||
|
||||
echo ''
|
||||
echo "Done creating jar at ${JAR_LOCATION}"
|
||||
cp -f "${JAR_LOCATION}" "${PACKAGING_DIR}/common/ATCS.jar" # Copy JAR to versioned name
|
||||
|
||||
# --- Create archive ---
|
||||
cd "${PACKAGING_DIR}" || exit
|
||||
echo "Creating archive"
|
||||
if [ "$PLATFORM" = "WINDOWS" ]; then
|
||||
# Use PowerShell's Compress-Archive which is available by default on Windows
|
||||
powershell.exe -Command "Compress-Archive -Path './common/*' -DestinationPath './ATCS_${VERSION}.zip' -Force"
|
||||
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"
|
||||
|
||||
echo "Script finished."
|
||||
1
res/ATCS_latest
Normal file
1
res/ATCS_latest
Normal file
@@ -0,0 +1 @@
|
||||
v0.6.24
|
||||
@@ -1,64 +1,95 @@
|
||||
atcs.spritesheet.actorconditions_1.category=actorcondition
|
||||
atcs.spritesheet.actorconditions_2.category=actorcondition
|
||||
atcs.spritesheet.actorconditions_japozero.category=actorcondition
|
||||
atcs.spritesheet.actorconditions_newb.category=actorcondition
|
||||
atcs.spritesheet.actorconditions_omi1.category=actorcondition
|
||||
atcs.spritesheet.actorconditions_omi2.category=actorcondition
|
||||
|
||||
atcs.spritesheet.effect_blood3.animate=true
|
||||
atcs.spritesheet.effect_blood4.animate=true
|
||||
atcs.spritesheet.effect_bluetentacle.animate=true
|
||||
atcs.spritesheet.effect_heal2.animate=true
|
||||
atcs.spritesheet.effect_miss1.animate=true
|
||||
atcs.spritesheet.effect_poison1.animate=true
|
||||
atcs.spritesheet.effect_tometik1.animate=true
|
||||
atcs.spritesheet.effect_tometik2.animate=true
|
||||
|
||||
atcs.spritesheet.items_armours.category=item
|
||||
atcs.spritesheet.items_armours_2.category=item
|
||||
atcs.spritesheet.items_armours_3.category=item
|
||||
atcs.spritesheet.items_weapons.category=item
|
||||
atcs.spritesheet.items_weapons_2.category=item
|
||||
atcs.spritesheet.items_weapons_3.category=item
|
||||
atcs.spritesheet.items_jewelry.category=item
|
||||
atcs.spritesheet.items_rings_1.category=item
|
||||
atcs.spritesheet.items_necklaces_1.category=item
|
||||
atcs.spritesheet.items_consumables.category=item
|
||||
atcs.spritesheet.items_japozero.category=item
|
||||
atcs.spritesheet.items_books.category=item
|
||||
atcs.spritesheet.items_consumables.category=item
|
||||
atcs.spritesheet.items_consumables_omi1.category=item
|
||||
atcs.spritesheet.items_feygard1.category=item
|
||||
atcs.spritesheet.items_g03_package_omi1.category=item
|
||||
atcs.spritesheet.items_japozero.category=item
|
||||
atcs.spritesheet.items_jewelry.category=item
|
||||
atcs.spritesheet.items_misc.category=item
|
||||
atcs.spritesheet.items_misc_2.category=item
|
||||
atcs.spritesheet.items_misc_3.category=item
|
||||
atcs.spritesheet.items_misc_4.category=item
|
||||
atcs.spritesheet.items_misc_5.category=item
|
||||
atcs.spritesheet.items_misc_6.category=item
|
||||
atcs.spritesheet.items_necklaces_1.category=item
|
||||
atcs.spritesheet.items_newb.category=item
|
||||
atcs.spritesheet.items_omgeeky.category=item
|
||||
atcs.spritesheet.items_omi2.category=item
|
||||
atcs.spritesheet.items_phoenix01.category=item
|
||||
atcs.spritesheet.items_reterski_1.category=item
|
||||
atcs.spritesheet.items_rijackson_1.category=item
|
||||
atcs.spritesheet.items_rings_1.category=item
|
||||
atcs.spritesheet.items_tometik1.category=item
|
||||
atcs.spritesheet.items_tometik2.category=item
|
||||
atcs.spritesheet.items_tometik3.category=item
|
||||
atcs.spritesheet.items_weapons.category=item
|
||||
atcs.spritesheet.items_weapons_2.category=item
|
||||
atcs.spritesheet.items_weapons_3.category=item
|
||||
|
||||
atcs.spritesheet.monsters_antison.category=monster
|
||||
atcs.spritesheet.monsters_armor1.category=monster
|
||||
atcs.spritesheet.monsters_arulirs.category=monster
|
||||
|
||||
atcs.spritesheet.monsters_cats.category=monster
|
||||
atcs.spritesheet.monsters_dogs.category=monster
|
||||
atcs.spritesheet.monsters_eye1.category=monster
|
||||
atcs.spritesheet.monsters_eye2.category=monster
|
||||
atcs.spritesheet.monsters_eye3.category=monster
|
||||
atcs.spritesheet.monsters_eye4.category=monster
|
||||
atcs.spritesheet.monsters_fatboy73.category=monster
|
||||
atcs.spritesheet.monsters_ghost1.category=monster
|
||||
atcs.spritesheet.monsters_hydra1.category=monster
|
||||
atcs.spritesheet.monsters_hydra1.sizex=64
|
||||
atcs.spritesheet.monsters_hydra1.sizey=64
|
||||
|
||||
atcs.spritesheet.monsters_gisons.category=monster
|
||||
atcs.spritesheet.monsters_guynmart.category=monster
|
||||
|
||||
atcs.spritesheet.monsters_insects.category=monster
|
||||
atcs.spritesheet.monsters_johny.category=monster
|
||||
atcs.spritesheet.monsters_karvis1.category=monster
|
||||
atcs.spritesheet.monsters_karvis2.category=monster
|
||||
atcs.spritesheet.monsters_ld1.category=monster
|
||||
atcs.spritesheet.monsters_ld2.category=monster
|
||||
atcs.spritesheet.monsters_liches.category=monster
|
||||
atcs.spritesheet.monsters_mage.category=monster
|
||||
atcs.spritesheet.monsters_mage2.category=monster
|
||||
atcs.spritesheet.monsters_maksiu1.category=monster
|
||||
atcs.spritesheet.monsters_man1.category=monster
|
||||
atcs.spritesheet.monsters_men.category=monster
|
||||
atcs.spritesheet.monsters_men2.category=monster
|
||||
atcs.spritesheet.monsters_misc.category=monster
|
||||
atcs.spritesheet.monsters_newb_1.category=monster
|
||||
atcs.spritesheet.monsters_omi1.category=monster
|
||||
atcs.spritesheet.monsters_omi1_b.category=monster
|
||||
atcs.spritesheet.monsters_omi2.category=monster
|
||||
atcs.spritesheet.monsters_phoenix01.category=monster
|
||||
atcs.spritesheet.monsters_rats.category=monster
|
||||
atcs.spritesheet.monsters_rogue1.category=monster
|
||||
atcs.spritesheet.monsters_skeleton1.category=monster
|
||||
atcs.spritesheet.monsters_skeleton2.category=monster
|
||||
atcs.spritesheet.monsters_snakes.category=monster
|
||||
atcs.spritesheet.monsters_warrior1.category=monster
|
||||
atcs.spritesheet.monsters_wraiths.category=monster
|
||||
atcs.spritesheet.monsters_zombie1.category=monster
|
||||
atcs.spritesheet.monsters_zombie2.category=monster
|
||||
atcs.spritesheet.monsters_karvis1.category=monster
|
||||
atcs.spritesheet.monsters_karvis2.category=monster
|
||||
atcs.spritesheet.monsters_redshrike1.category=monster
|
||||
atcs.spritesheet.monsters_rltiles1.category=monster
|
||||
atcs.spritesheet.monsters_rltiles2.category=monster
|
||||
atcs.spritesheet.monsters_rltiles3.category=monster
|
||||
atcs.spritesheet.monsters_rltiles4.category=monster
|
||||
atcs.spritesheet.monsters_redshrike1.category=monster
|
||||
atcs.spritesheet.monsters_ld1.category=monster
|
||||
atcs.spritesheet.monsters_ld2.category=monster
|
||||
atcs.spritesheet.monsters_rogue1.category=monster
|
||||
atcs.spritesheet.monsters_skeleton1.category=monster
|
||||
atcs.spritesheet.monsters_skeleton2.category=monster
|
||||
atcs.spritesheet.monsters_snakes.category=monster
|
||||
atcs.spritesheet.monsters_tometik1.category=monster
|
||||
atcs.spritesheet.monsters_tometik2.category=monster
|
||||
atcs.spritesheet.monsters_tometik3.category=monster
|
||||
@@ -69,20 +100,39 @@ atcs.spritesheet.monsters_tometik7.category=monster
|
||||
atcs.spritesheet.monsters_tometik8.category=monster
|
||||
atcs.spritesheet.monsters_tometik9.category=monster
|
||||
atcs.spritesheet.monsters_tometik10.category=monster
|
||||
atcs.spritesheet.monsters_warrior1.category=monster
|
||||
atcs.spritesheet.monsters_unknown.category=monster
|
||||
atcs.spritesheet.monsters_wraiths.category=monster
|
||||
atcs.spritesheet.monsters_zombie1.category=monster
|
||||
atcs.spritesheet.monsters_zombie2.category=monster
|
||||
|
||||
atcs.spritesheet.monsters_bosses_2x2.category=monster
|
||||
atcs.spritesheet.monsters_bosses_2x2.sizex=64
|
||||
atcs.spritesheet.monsters_bosses_2x2.sizey=64
|
||||
atcs.spritesheet.monsters_cyclops.category=monster
|
||||
atcs.spritesheet.monsters_cyclops.sizex=64
|
||||
atcs.spritesheet.monsters_cyclops.sizey=96
|
||||
atcs.spritesheet.monsters_demon1.category=monster
|
||||
atcs.spritesheet.monsters_demon1.sizex=64
|
||||
atcs.spritesheet.monsters_demon1.sizey=64
|
||||
atcs.spritesheet.monsters_demon2.category=monster
|
||||
atcs.spritesheet.monsters_demon2.sizex=64
|
||||
atcs.spritesheet.monsters_demon2.sizey=64
|
||||
atcs.spritesheet.monsters_cyclops.category=monster
|
||||
atcs.spritesheet.monsters_cyclops.sizex=64
|
||||
atcs.spritesheet.monsters_cyclops.sizey=96
|
||||
atcs.spritesheet.effect_blood3.animate=true
|
||||
atcs.spritesheet.effect_blood4.animate=true
|
||||
atcs.spritesheet.effect_bluetentacle.animate=true
|
||||
atcs.spritesheet.effect_heal2.animate=true
|
||||
atcs.spritesheet.effect_poison1.animate=true
|
||||
atcs.spritesheet.effect_tometik1.animate=true
|
||||
atcs.spritesheet.effect_tometik2.animate=true
|
||||
atcs.spritesheet.monsters_guynmart.category=monster
|
||||
atcs.spritesheet.monsters_giantbasilisk.category=monster
|
||||
atcs.spritesheet.monsters_giantbasilisk.sizex=64
|
||||
atcs.spritesheet.monsters_giantbasilisk.sizey=64
|
||||
atcs.spritesheet.monsters_hydra1.category=monster
|
||||
atcs.spritesheet.monsters_hydra1.sizex=64
|
||||
atcs.spritesheet.monsters_hydra1.sizey=64
|
||||
atcs.spritesheet.monsters_newb_2.category=monster
|
||||
atcs.spritesheet.monsters_newb_2.sizex=64
|
||||
atcs.spritesheet.monsters_newb_2.sizey=32
|
||||
atcs.spritesheet.monsters_newb_3.category=monster
|
||||
atcs.spritesheet.monsters_newb_3.sizex=64
|
||||
atcs.spritesheet.monsters_newb_3.sizey=64
|
||||
atcs.spritesheet.monsters_newb_4.category=monster
|
||||
atcs.spritesheet.monsters_newb_4.sizex=32
|
||||
atcs.spritesheet.monsters_newb_4.sizey=64
|
||||
atcs.spritesheet.monsters_1x2.category=monster
|
||||
atcs.spritesheet.monsters_1x2.sizex=32
|
||||
atcs.spritesheet.monsters_1x2.sizey=64
|
||||
|
||||
6
src/META-INF/MANIFEST.MF
Normal file
6
src/META-INF/MANIFEST.MF
Normal file
@@ -0,0 +1,6 @@
|
||||
Manifest-Version: 1.0
|
||||
Main-Class: com.gpl.rpg.atcontentstudio.ATContentStudio
|
||||
Class-Path: jide-oss.jar jsoup-1.10.2.jar ui.jar junit-4.10.jar AndorsTr
|
||||
ainer_v0.1.5.jar prefuse.jar rsyntaxtextarea.jar bsh-2.0b4.jar json_sim
|
||||
ple-1.1.jar
|
||||
|
||||
@@ -1,227 +1,254 @@
|
||||
package com.gpl.rpg.atcontentstudio;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Desktop;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Font;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import javax.swing.JEditorPane;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JOptionPane;
|
||||
import javax.swing.UIDefaults;
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.UnsupportedLookAndFeelException;
|
||||
import javax.swing.event.HyperlinkEvent;
|
||||
import javax.swing.event.HyperlinkListener;
|
||||
import javax.swing.plaf.FontUIResource;
|
||||
|
||||
import prefuse.data.expression.parser.ExpressionParser;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.Workspace;
|
||||
import com.gpl.rpg.atcontentstudio.ui.StudioFrame;
|
||||
import com.gpl.rpg.atcontentstudio.ui.WorkerDialog;
|
||||
import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector;
|
||||
|
||||
|
||||
public class ATContentStudio {
|
||||
|
||||
public static final String APP_NAME = "Andor's Trail Content Studio";
|
||||
public static final String APP_VERSION = "v0.6.15";
|
||||
|
||||
public static final String CHECK_UPDATE_URL = "https://andorstrail.com/static/ATCS_latest";
|
||||
public static final String DOWNLOAD_URL = "https://andorstrail.com/viewtopic.php?f=6&t=4806";
|
||||
|
||||
public static final String FONT_SCALE_ENV_VAR_NAME = "FONT_SCALE";
|
||||
|
||||
public static boolean STARTED = false;
|
||||
public static float SCALING=1.0f;
|
||||
public static StudioFrame frame = null;
|
||||
|
||||
//Need to keep a strong reference to it, to avoid garbage collection that'll reset these loggers.
|
||||
public static final List<Logger> configuredLoggers = new LinkedList<Logger>();
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
String fontScaling = System.getProperty(FONT_SCALE_ENV_VAR_NAME);
|
||||
Float fontScale = null;
|
||||
if (fontScaling != null) {
|
||||
try {
|
||||
fontScale = Float.parseFloat(fontScaling);
|
||||
SCALING=fontScale;
|
||||
} catch (NumberFormatException e) {
|
||||
System.err.println("Failed to parse font scaling parameter. Using default.");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
ConfigCache.init();
|
||||
|
||||
try {
|
||||
String laf = ConfigCache.getFavoriteLaFClassName();
|
||||
if (laf == null) laf = UIManager.getSystemLookAndFeelClassName();
|
||||
UIManager.setLookAndFeel(laf);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (UnsupportedLookAndFeelException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
scaleUIFont();
|
||||
|
||||
//Need to keep a strong reference to it, to avoid garbage collection that'll reset this setting.
|
||||
Logger l = Logger.getLogger(ExpressionParser.class.getName());
|
||||
l.setLevel(Level.OFF);
|
||||
configuredLoggers.add(l);
|
||||
|
||||
final WorkspaceSelector wsSelect = new WorkspaceSelector();
|
||||
wsSelect.pack();
|
||||
Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
Dimension wdim = wsSelect.getSize();
|
||||
wsSelect.setLocation((sdim.width - wdim.width)/2, (sdim.height - wdim.height)/2);
|
||||
wsSelect.setVisible(true);
|
||||
|
||||
wsSelect.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public synchronized void windowClosed(WindowEvent e) {
|
||||
if (wsSelect.selected != null && !STARTED) {
|
||||
ATContentStudio.STARTED = true;
|
||||
final File workspaceRoot = new File(wsSelect.selected);
|
||||
WorkerDialog.showTaskMessage("Loading your workspace...", null, new Runnable(){
|
||||
public void run() {
|
||||
Workspace.setActive(workspaceRoot);
|
||||
if (Workspace.activeWorkspace.settings.useInternet.getCurrentValue() && Workspace.activeWorkspace.settings.checkUpdates.getCurrentValue()) {
|
||||
new Thread() {
|
||||
public void run() {checkUpdate();}
|
||||
}.start();
|
||||
}
|
||||
frame = new StudioFrame(APP_NAME+" "+APP_VERSION);
|
||||
frame.setVisible(true);
|
||||
frame.setDefaultCloseOperation(StudioFrame.DO_NOTHING_ON_CLOSE);
|
||||
};
|
||||
});
|
||||
for (File f : ConfigCache.getKnownWorkspaces()) {
|
||||
if (workspaceRoot.equals(f)) {
|
||||
if (!workspaceRoot.equals(ConfigCache.getLatestWorkspace())) {
|
||||
ConfigCache.setLatestWorkspace(f);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
ConfigCache.addWorkspace(workspaceRoot);
|
||||
ConfigCache.setLatestWorkspace(workspaceRoot);
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void checkUpdate() {
|
||||
BufferedReader in = null;
|
||||
try {
|
||||
URL url = new URL(CHECK_UPDATE_URL);
|
||||
in = new BufferedReader(new InputStreamReader(url.openStream()));
|
||||
|
||||
String inputLine, lastLine = null;
|
||||
while ((inputLine = in.readLine()) != null) {lastLine = inputLine;}
|
||||
if (lastLine != null && !lastLine.equals(APP_VERSION)) {
|
||||
|
||||
// for copying style
|
||||
JLabel label = new JLabel();
|
||||
Font font = label.getFont();
|
||||
Color color = label.getBackground();
|
||||
|
||||
// create some css from the label's font
|
||||
StringBuffer style = new StringBuffer("font-family:" + font.getFamily() + ";");
|
||||
style.append("font-weight:" + (font.isBold() ? "bold" : "normal") + ";");
|
||||
style.append("font-size:" + font.getSize() + "pt;");
|
||||
style.append("background-color: rgb("+color.getRed()+","+color.getGreen()+","+color.getBlue()+");");
|
||||
|
||||
JEditorPane ep = new JEditorPane("text/html", "<html><body style=\"" + style + "\">"
|
||||
+ "You are not running the latest ATCS version.<br/>"
|
||||
+ "You can get the latest version ("+lastLine+") by clicking the link below.<br/>"
|
||||
+ "<a href=\""+DOWNLOAD_URL+"\">"+DOWNLOAD_URL+"</a><br/>"
|
||||
+ "<br/>"
|
||||
+ "</body></html>");
|
||||
|
||||
ep.setEditable(false);
|
||||
ep.setBorder(null);
|
||||
|
||||
ep.addHyperlinkListener(new HyperlinkListener() {
|
||||
|
||||
@Override
|
||||
public void hyperlinkUpdate(HyperlinkEvent e) {
|
||||
try {
|
||||
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
|
||||
Desktop.getDesktop().browse(e.getURL().toURI());
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
e1.printStackTrace();
|
||||
} catch (URISyntaxException e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
JOptionPane.showMessageDialog(null, ep, "Update available", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try {
|
||||
if (in != null) in.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void scaleUIFont() {
|
||||
if (SCALING != 1.0f) {
|
||||
System.out.println("Scaling fonts to "+SCALING);
|
||||
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
|
||||
Map<Object, Object> newDefaults = new HashMap<Object, Object>();
|
||||
for (Enumeration<Object> e = defaults.keys(); e.hasMoreElements();) {
|
||||
Object key = e.nextElement();
|
||||
Object value = defaults.get(key);
|
||||
if (value instanceof Font) {
|
||||
Font font = (Font) value;
|
||||
int newSize = (int)(font.getSize() * SCALING);
|
||||
if (value instanceof FontUIResource) {
|
||||
newDefaults.put(key, new FontUIResource(font.getName(), font.getStyle(), newSize));
|
||||
} else {
|
||||
newDefaults.put(key, new Font(font.getName(), font.getStyle(), newSize));
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Object key : newDefaults.keySet()) {
|
||||
defaults.put(key, newDefaults.get(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
package com.gpl.rpg.atcontentstudio;
|
||||
|
||||
import 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;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.net.http.HttpTimeoutException;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class ATContentStudio {
|
||||
|
||||
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 FONT_SCALE_ENV_VAR_NAME = "FONT_SCALE";
|
||||
|
||||
public static boolean STARTED = false;
|
||||
public static float SCALING = 1.0f;
|
||||
public static StudioFrame frame = null;
|
||||
|
||||
// Need to keep a strong reference to it, to avoid garbage collection that'll
|
||||
// reset these loggers.
|
||||
public static final List<Logger> configuredLoggers = new LinkedList<Logger>();
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
String fontScaling = System.getProperty(FONT_SCALE_ENV_VAR_NAME);
|
||||
Float fontScale;
|
||||
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();
|
||||
|
||||
String laf = ConfigCache.getFavoriteLaFClassName();
|
||||
setLookAndFeel(laf);
|
||||
|
||||
// Need to keep a strong reference to it, to avoid garbage collection that'll
|
||||
// reset this setting.
|
||||
Logger l = Logger.getLogger(ExpressionParser.class.getName());
|
||||
l.setLevel(Level.OFF);
|
||||
configuredLoggers.add(l);
|
||||
|
||||
final WorkspaceSelector wsSelect = new WorkspaceSelector();
|
||||
wsSelect.pack();
|
||||
Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
Dimension wdim = wsSelect.getSize();
|
||||
wsSelect.setLocation((sdim.width - wdim.width) / 2, (sdim.height - wdim.height) / 2);
|
||||
wsSelect.setVisible(true);
|
||||
|
||||
wsSelect.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public synchronized void windowClosed(WindowEvent e) {
|
||||
if (wsSelect.selected != null && !STARTED) {
|
||||
ATContentStudio.STARTED = true;
|
||||
final File workspaceRoot = new File(wsSelect.selected);
|
||||
WorkerDialog.showTaskMessage("Loading your workspace...", null, new Runnable() {
|
||||
public void run() {
|
||||
Workspace.setActive(workspaceRoot);
|
||||
if (Workspace.activeWorkspace.settings.useInternet.getCurrentValue()
|
||||
&& Workspace.activeWorkspace.settings.checkUpdates.getCurrentValue()) {
|
||||
new Thread() {
|
||||
public void run() {
|
||||
checkUpdate();
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
frame = new StudioFrame(APP_NAME + " " + APP_VERSION);
|
||||
frame.setVisible(true);
|
||||
frame.setDefaultCloseOperation(StudioFrame.DO_NOTHING_ON_CLOSE);
|
||||
}
|
||||
});
|
||||
for (File f : ConfigCache.getKnownWorkspaces()) {
|
||||
if (workspaceRoot.equals(f)) {
|
||||
if (!workspaceRoot.equals(ConfigCache.getLatestWorkspace())) {
|
||||
ConfigCache.setLatestWorkspace(f);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
ConfigCache.addWorkspace(workspaceRoot);
|
||||
ConfigCache.setLatestWorkspace(workspaceRoot);
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void setLookAndFeel(String laf) {
|
||||
if (laf == null)
|
||||
{
|
||||
System.out.println("No look and feel specified, using system default.");
|
||||
laf = UIManager.getSystemLookAndFeelClassName();
|
||||
}
|
||||
System.out.println("Info: Setting look and feel to: " + laf);
|
||||
|
||||
try {
|
||||
UIManager.setLookAndFeel(laf);
|
||||
} catch (ClassNotFoundException e) {
|
||||
System.err.println("Failed to load system look and feel. ");
|
||||
System.err.println("Installed look and feel classes: ");
|
||||
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
|
||||
System.err.println(" " + info.getName() + " (" + info.getClassName() + ")");
|
||||
}
|
||||
System.err.println("Tried to load: " + laf + " but got this error:");
|
||||
|
||||
e.printStackTrace();
|
||||
} catch (InstantiationException | UnsupportedLookAndFeelException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
var newLaF = UIManager.getLookAndFeel();
|
||||
System.out.println("Using look and feel: " + newLaF.getName() + " (" + newLaF.getClass().getName() + ")");
|
||||
|
||||
scaleUIFont();
|
||||
}
|
||||
|
||||
private static void checkUpdate() {
|
||||
BufferedReader in = null;
|
||||
try {
|
||||
URL url = new URL(CHECK_UPDATE_URL);
|
||||
in = new BufferedReader(new InputStreamReader(url.openStream()));
|
||||
|
||||
String inputLine, lastLine = null;
|
||||
while ((inputLine = in.readLine()) != null) {
|
||||
lastLine = inputLine;
|
||||
}
|
||||
if (lastLine != null && !lastLine.equals(APP_VERSION)) {
|
||||
|
||||
// for copying style
|
||||
JLabel label = new JLabel();
|
||||
Font font = label.getFont();
|
||||
Color color = label.getBackground();
|
||||
|
||||
// create some css from the label's font
|
||||
StringBuffer style = new StringBuffer("font-family:" + font.getFamily() + ";");
|
||||
style.append("font-weight:" + (font.isBold() ? "bold" : "normal") + ";");
|
||||
style.append("font-size:" + font.getSize() + "pt;");
|
||||
style.append("background-color: rgb(" + color.getRed() + "," + color.getGreen() + "," + color.getBlue()
|
||||
+ ");");
|
||||
|
||||
JEditorPane ep = new JEditorPane("text/html",
|
||||
"<html><body style=\"" + style + "\">" + "You are not running the latest ATCS version.<br/>"
|
||||
+ "You can get the latest version (" + lastLine + ") by clicking the link below.<br/>"
|
||||
+ "<a href=\"" + DOWNLOAD_URL + "\">" + DOWNLOAD_URL + "</a><br/>" + "<br/>"
|
||||
+ "</body></html>");
|
||||
|
||||
ep.setEditable(false);
|
||||
ep.setBorder(null);
|
||||
|
||||
ep.addHyperlinkListener(new HyperlinkListener() {
|
||||
|
||||
@Override
|
||||
public void hyperlinkUpdate(HyperlinkEvent e) {
|
||||
try {
|
||||
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
|
||||
Desktop.getDesktop().browse(e.getURL().toURI());
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
e1.printStackTrace();
|
||||
} catch (URISyntaxException e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
JOptionPane.showMessageDialog(null, ep, "Update available", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
} catch (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);
|
||||
|
||||
}
|
||||
BIN
src/com/gpl/rpg/atcontentstudio/img/date.png
Normal file
BIN
src/com/gpl/rpg/atcontentstudio/img/date.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 275 B |
BIN
src/com/gpl/rpg/atcontentstudio/img/time.png
Normal file
BIN
src/com/gpl/rpg/atcontentstudio/img/time.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 703 B |
@@ -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,364 +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;
|
||||
|
||||
// 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) {
|
||||
private static final long serialVersionUID = -3969824899972048507L;
|
||||
|
||||
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;
|
||||
public static final Integer MAGNITUDE_CLEAR = -99;
|
||||
public static final Integer DURATION_FOREVER = 999;
|
||||
public static final Integer DURATION_NONE = 0;
|
||||
|
||||
}
|
||||
|
||||
@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(this.id);
|
||||
}
|
||||
getProject().getSpritesheet(spritesheetId).addBacklink(this);
|
||||
}
|
||||
|
||||
this.state = State.linked;
|
||||
}
|
||||
|
||||
// Available from init state
|
||||
//public String id; inherited.
|
||||
public String icon_id;
|
||||
public String display_name;
|
||||
public String description;
|
||||
|
||||
public static String getStaticDesc() {
|
||||
return "Actor Conditions";
|
||||
}
|
||||
|
||||
// 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;
|
||||
|
||||
@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.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.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 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) {
|
||||
|
||||
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,448 +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
|
||||
}
|
||||
}
|
||||
|
||||
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:
|
||||
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,321 @@
|
||||
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 com.gpl.rpg.atcontentstudio.Notification;
|
||||
import com.gpl.rpg.atcontentstudio.model.*;
|
||||
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.util.*;
|
||||
import java.util.List;
|
||||
|
||||
import org.json.simple.JSONArray;
|
||||
public class GameDataCategory<E extends JSONElement> implements ProjectTreeNode {
|
||||
//region Data
|
||||
private final ArrayList<String> keyList = new ArrayList<>();
|
||||
private final HashMap<String, E> dataMap = new HashMap<>();
|
||||
|
||||
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.ui.DefaultIcons;
|
||||
//endregion
|
||||
|
||||
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;
|
||||
}
|
||||
public GameDataSet parent;
|
||||
public String name;
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return get(childIndex);
|
||||
}
|
||||
public GameDataCategory(GameDataSet parent, String name) {
|
||||
this.parent = parent;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return size();
|
||||
}
|
||||
//region Helpers
|
||||
public E get(String key) {
|
||||
return dataMap.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
public E get(int index) {
|
||||
String key = keyList.get(index);
|
||||
return dataMap.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return indexOf(node);
|
||||
}
|
||||
public E getIgnoreCase(String key) {
|
||||
for (String k : keyList) {
|
||||
if (k.equalsIgnoreCase(key)) {
|
||||
return dataMap.get(k);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
public E put(String key, E element) {
|
||||
if (!dataMap.containsKey(key)) {
|
||||
keyList.add(key);
|
||||
}
|
||||
return dataMap.put(key, element);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
public void add(E quest) {
|
||||
String key = quest.id;
|
||||
put(key, quest);
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
public E remove(String key) {
|
||||
if (dataMap.containsKey(key)) {
|
||||
keyList.remove(key);
|
||||
}
|
||||
return dataMap.remove(key);
|
||||
}
|
||||
|
||||
@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();
|
||||
}
|
||||
public E remove(int index) {
|
||||
String key = keyList.get(index);
|
||||
keyList.remove(index);
|
||||
return dataMap.remove(key);
|
||||
}
|
||||
|
||||
@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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public boolean removeGeneric(JSONElement element){
|
||||
return remove((E) element);
|
||||
}
|
||||
public boolean remove(E element) {
|
||||
String key = element.id;
|
||||
int index = getProject().getNodeIndex(element);
|
||||
boolean result = false;
|
||||
if (dataMap.containsKey(key)) {
|
||||
keyList.remove(key);
|
||||
dataMap.remove(key);
|
||||
result = true;
|
||||
}
|
||||
getProject().fireElementRemoved(element, index);
|
||||
return result;
|
||||
}
|
||||
|
||||
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 int size() {
|
||||
return dataMap.size();
|
||||
}
|
||||
public int indexOf(String key) {
|
||||
return keyList.indexOf(key);
|
||||
}
|
||||
public int indexOf(E element) {
|
||||
String key = element.id;
|
||||
return keyList.indexOf(key);
|
||||
}
|
||||
|
||||
public ArrayList<E> toList() {
|
||||
ArrayList<E> list = new ArrayList<>();
|
||||
for (String key : keyList) {
|
||||
list.add(dataMap.get(key));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
//endregion
|
||||
|
||||
//region copied implementation of ProjectTreeNode
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return get(childIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return indexOf((E) node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<E> children() {
|
||||
return Collections.enumeration(toList());
|
||||
}
|
||||
|
||||
@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 : toList()) {
|
||||
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 GameSource.Type getDataType() {
|
||||
return parent.getDataType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return dataMap.isEmpty();
|
||||
}
|
||||
|
||||
@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 : toList()) {
|
||||
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 : dataMap.values()) {
|
||||
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>();
|
||||
ArrayList<E> list = toList();
|
||||
for (JSONElement node : list) {
|
||||
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 : list) {
|
||||
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 boolean needsSaving() {
|
||||
for (E node : dataMap.values()) {
|
||||
if (node.needsSaving()) return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//endregion
|
||||
|
||||
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,441 @@ 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.*;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
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<>(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) {
|
||||
List<File> files = new ArrayList<File>(Arrays.stream(baseFolder.listFiles()).collect(Collectors.toList()));
|
||||
Collections.sort(files,Comparator.comparing(x->x.getName()));
|
||||
for (File f : files) {
|
||||
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;
|
||||
return actorConditions.get(id);
|
||||
}
|
||||
|
||||
public Dialogue getDialogue(String id) {
|
||||
if (dialogues == null) return null;
|
||||
return dialogues.get(id);
|
||||
}
|
||||
|
||||
public Droplist getDroplist(String id) {
|
||||
if (droplists == null) return null;
|
||||
return droplists.get(id);
|
||||
}
|
||||
|
||||
public Item getItem(String id) {
|
||||
if (items == null) return null;
|
||||
return items.get(id);
|
||||
}
|
||||
|
||||
public ItemCategory getItemCategory(String id) {
|
||||
if (itemCategories == null) return null;
|
||||
return itemCategories.get(id);
|
||||
}
|
||||
|
||||
public NPC getNPC(String id) {
|
||||
if (npcs == null) return null;
|
||||
return npcs.get(id);
|
||||
}
|
||||
|
||||
public NPC getNPCIgnoreCase(String id) {
|
||||
if (npcs == null) return null;
|
||||
return npcs.getIgnoreCase(id);
|
||||
}
|
||||
|
||||
public Quest getQuest(String id) {
|
||||
if (quests == null) return null;
|
||||
return quests.get(id);
|
||||
}
|
||||
|
||||
@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,123 +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");
|
||||
if (id != null && id.equals(this.id )) {
|
||||
this.parse(jsonObj);
|
||||
this.state = State.parsed;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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;
|
||||
@@ -128,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";
|
||||
@@ -160,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,173 @@ 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,251 +1,232 @@
|
||||
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);
|
||||
COMPATIBLE_TYPES.put(RequirementType.inventoryRemove, countedItemTypes);
|
||||
COMPATIBLE_TYPES.put(RequirementType.inventoryKeep, countedItemTypes);
|
||||
COMPATIBLE_TYPES.put(RequirementType.usedItem, 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
|
||||
}
|
||||
|
||||
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
|
||||
,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
|
||||
,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:
|
||||
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 random:
|
||||
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,
|
||||
skillIncrease
|
||||
}
|
||||
|
||||
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:
|
||||
case skillIncrease:
|
||||
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,144 +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 {
|
||||
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,96 +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 spawnchance = 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("spawnchance") != null) {
|
||||
this.spawnchance = Integer.parseInt(obj.getProperties().getProperty("spawnchance"));
|
||||
}
|
||||
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 (spawnchance != 10) {
|
||||
tmxObject.getProperties().setProperty("spawnchance", Integer.toString(spawnchance));
|
||||
}
|
||||
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, getProject().baseContent.gameMaps.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,9 +1,7 @@
|
||||
package com.gpl.rpg.atcontentstudio.model.tools.i18n;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.io.*;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
@@ -11,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 {
|
||||
FileWriter fw = new FileWriter(destination);
|
||||
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,100 +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));
|
||||
}
|
||||
|
||||
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.toList()) {
|
||||
pushString(stringsResources, resourcesStrings, ac.display_name, getPotContextComment(ac));
|
||||
pushString(stringsResources, resourcesStrings, ac.description, getPotContextComment(ac) + ":description");
|
||||
}
|
||||
|
||||
for (Dialogue d : gsrc.gameData.dialogues.toList()) {
|
||||
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.toList()) {
|
||||
pushString(stringsResources, resourcesStrings, ic.name, getPotContextComment(ic));
|
||||
}
|
||||
|
||||
for (Item i : gsrc.gameData.items.toList()) {
|
||||
pushString(stringsResources, resourcesStrings, i.name, getPotContextComment(i));
|
||||
pushString(stringsResources, resourcesStrings, i.description, getPotContextComment(i) + ":description");
|
||||
}
|
||||
|
||||
for (NPC npc : gsrc.gameData.npcs.toList()) {
|
||||
pushString(stringsResources, resourcesStrings, npc.name, getPotContextComment(npc));
|
||||
}
|
||||
|
||||
for (Quest q : gsrc.gameData.quests.toList()) {
|
||||
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,35 +1,9 @@
|
||||
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;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Item;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.*;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
|
||||
import com.gpl.rpg.atcontentstudio.model.sprites.SpriteSheetSet;
|
||||
@@ -38,344 +12,350 @@ 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();
|
||||
|
||||
ArrayList<ActorCondition> actorConditions = proj.baseContent.gameData.actorConditions.toList();
|
||||
for (ActorCondition ac : actorConditions) {
|
||||
if (filesCovered.contains(ac.jsonFile)) continue;
|
||||
File currentFile = ac.jsonFile;
|
||||
filesCovered.add(currentFile);
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (ActorCondition acond : 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);
|
||||
}
|
||||
|
||||
ArrayList<Item> items = proj.baseContent.gameData.items.toList();
|
||||
for (Item it : items) {
|
||||
if (filesCovered.contains(it.jsonFile)) continue;
|
||||
File currentFile = it.jsonFile;
|
||||
filesCovered.add(currentFile);
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (Item item : 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);
|
||||
}
|
||||
|
||||
|
||||
ArrayList<NPC> npcs = proj.baseContent.gameData.npcs.toList();
|
||||
for (NPC np : npcs) {
|
||||
if (filesCovered.contains(np.jsonFile)) continue;
|
||||
File currentFile = np.jsonFile;
|
||||
filesCovered.add(currentFile);
|
||||
List<Map> dataToSave = new ArrayList<Map>();
|
||||
for (NPC npc : 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=\"http://andorstrail.com/\">the official forum</a> to give or receive help.<br/>" +
|
||||
"Open the project's <a href=\"https://github.com/Zukero/andors-trail/\">GitHub project page</a> to check out the game's source code.<br/>" +
|
||||
"<br/>" +
|
||||
"For content creation help, make sure to use the following resources:<br/>" +
|
||||
"<a href=\"http://andorstrail.com/viewtopic.php?f=6&t=4560\">The contribution guide on the forums</a><br/>" +
|
||||
"<a href=\"http://andorstrail.com/wiki/doku.php?id=andors_trail_wiki:developer_section\">The developer section of the Andor's Trail wiki</a><br/>" +
|
||||
"<a href=\"https://docs.google.com/document/d/1BwWD1tLgPcmA2bwudrVnOc6f2dkPLFCjWdn7tXlIp5g\">The design outline document on Google Drive/Docs</a><br/>" +
|
||||
"<br/>" +
|
||||
"<font size=+1>Credits:</font><br/>" +
|
||||
"<br/>" +
|
||||
"Author: <a href=\"http://andorstrail.com/memberlist.php?mode=viewprofile&u=2875\">Zukero</a><br/>" +
|
||||
"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
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user