mirror of
https://github.com/OMGeeky/ATCS.git
synced 2025-12-27 23:07:41 +01:00
Compare commits
213 Commits
spawnchanc
...
performanc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
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
|
||||||
56
.github/workflows/release.yml
vendored
Normal file
56
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
name: Release Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: windows-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 -windows
|
||||||
|
echo "Created artifacts:"
|
||||||
|
ls -la common/ATCS.jar
|
||||||
|
ls -la ATCS_${{ env.VERSION }}.zip
|
||||||
|
|
||||||
|
- name: Install NSIS
|
||||||
|
uses: joncloud/makensis-action@v4
|
||||||
|
with:
|
||||||
|
script-file: packaging/Windows/ATCS_Installer.nsi
|
||||||
|
arguments: /DVERSION="${{ env.VERSION }}"
|
||||||
|
|
||||||
|
- name: Upload Release Assets
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
./packaging/ATCS_${{ env.VERSION }}.zip
|
||||||
|
./packaging/ATCS_${{ env.VERSION }}_Setup.exe
|
||||||
10
.gitignore
vendored
10
.gitignore
vendored
@@ -1,3 +1,13 @@
|
|||||||
/ATCS_v*.jar
|
/ATCS_v*.jar
|
||||||
/Project
|
/Project
|
||||||
/bin
|
/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"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<jardesc>
|
<jardesc>
|
||||||
<jar path="ATContentStudio/ATCS_v0.6.19.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"/>
|
<options buildIfNeeded="true" compress="true" descriptionLocation="/ATContentStudio/ATCS_JAR.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
|
||||||
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
|
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
|
||||||
<selectedProjects/>
|
<selectedProjects/>
|
||||||
|
|||||||
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 Properties properties = new Properties();
|
||||||
private ObjectGroup objectGroup;
|
private ObjectGroup objectGroup;
|
||||||
private Rectangle bounds = new Rectangle();
|
private Rectangle bounds;
|
||||||
private String name = "Object";
|
private String name = "Object";
|
||||||
private String type = "";
|
private String type = "";
|
||||||
private String imageSource = "";
|
private String imageSource = "";
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public class Sprite
|
|||||||
|
|
||||||
private String name = null;
|
private String name = null;
|
||||||
private int id = -1;
|
private int id = -1;
|
||||||
private int flags = KEY_LOOP;
|
private int flags;
|
||||||
private float frameRate = 1.0f; //one fps
|
private float frameRate = 1.0f; //one fps
|
||||||
private Tile[] frames;
|
private Tile[] frames;
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,11 @@ public class TileSet implements Iterable<Tile>
|
|||||||
|
|
||||||
File f = new File(imgFilename);
|
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) {
|
if (image == null) {
|
||||||
throw new IOException("Failed to load " + imgFilename);
|
throw new IOException("Failed to load " + imgFilename);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -588,7 +588,7 @@ public class TMXMapWriter
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Iterate while parents are the same
|
// Iterate while parents are the same
|
||||||
int shared = 0;
|
int shared;
|
||||||
int maxShared = Math.min(fromParents.size(), toParents.size());
|
int maxShared = Math.min(fromParents.size(), toParents.size());
|
||||||
for (shared = 0; shared < maxShared; shared++) {
|
for (shared = 0; shared < maxShared; shared++) {
|
||||||
String fromParent = fromParents.get(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.19
|
|
||||||
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
|
!include MUI2.nsh
|
||||||
|
|
||||||
!define VERSION "0.6.19"
|
; Version will be passed as /DVERSION=vx.x.x
|
||||||
!define TRAINER_VERSION "0.1.5"
|
!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}"
|
Name "Andor's Trail Content Studio ${VERSION}"
|
||||||
OutFile "ATCS_v${VERSION}_Setup.exe"
|
OutFile "..\ATCS_${VERSION}_Setup.exe"
|
||||||
InstallDir "$PROGRAMFILES\ATCS\"
|
InstallDir "$PROGRAMFILES\ATCS\"
|
||||||
|
|
||||||
;SetCompressor /SOLID /FINAL lzma
|
;SetCompressor /SOLID /FINAL lzma
|
||||||
@@ -13,10 +14,10 @@ InstallDir "$PROGRAMFILES\ATCS\"
|
|||||||
Var StartMenuFolder
|
Var StartMenuFolder
|
||||||
|
|
||||||
!define MUI_WELCOMEPAGE_TITLE "Welcome to Andor's Trail Content Studio installer"
|
!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_WELCOMEPAGE_TEXT "This will install Andor's Trail Content Studio ${VERSION}"
|
||||||
!define MUI_FINISHPAGE_TEXT "Andor's Trail Content Studio v${VERSION} install completed !"
|
!define MUI_FINISHPAGE_TEXT "Andor's Trail Content Studio ${VERSION} - Install completed !"
|
||||||
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Andor's Trail Content Studio"
|
!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
|
;Start Menu Folder Page Configuration
|
||||||
@@ -46,24 +47,26 @@ Var StartMenuFolder
|
|||||||
!insertmacro MUI_UNPAGE_CONFIRM
|
!insertmacro MUI_UNPAGE_CONFIRM
|
||||||
!insertmacro MUI_UNPAGE_INSTFILES
|
!insertmacro MUI_UNPAGE_INSTFILES
|
||||||
|
|
||||||
|
|
||||||
!insertmacro MUI_LANGUAGE "English"
|
!insertmacro MUI_LANGUAGE "English"
|
||||||
|
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------------
|
||||||
Section install
|
Section install
|
||||||
|
|
||||||
|
;--- Create in ...\packaging\common\ ATCS.cmd ATCT.ico ATCS.jar
|
||||||
SetOutPath $INSTDIR
|
SetOutPath $INSTDIR
|
||||||
file "ATCS.ico"
|
file "ATCS.ico"
|
||||||
|
file "${ATCS_SOURCE_DIR}\packaging\common\ATCS.jar"
|
||||||
Delete "$INSTDIR\lib\*"
|
|
||||||
|
|
||||||
Call GetJRE
|
Call GetJRE
|
||||||
Pop $R0
|
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
|
FileOpen $9 "ATCS.cmd" w
|
||||||
FileWrite $9 '@echo off$\r$\n'
|
FileWrite $9 '@echo off$\r$\n'
|
||||||
FileWrite $9 '$\r$\n'
|
FileWrite $9 '$\r$\n'
|
||||||
FileWrite $9 'set "ATCS_DIR=%~dp0"$\r$\n'
|
FileWrite $9 'set "ATCS_DIR=%~dp0"$\r$\n'
|
||||||
FileWrite $9 'set "MAX_MEM=512M"$\r$\n'
|
FileWrite $9 'set "MAX_MEM=1024M"$\r$\n'
|
||||||
FileWrite $9 'set "CP=%ATCS_DIR%lib\*"$\r$\n'
|
FileWrite $9 'set "CP=%ATCS_DIR%lib\*"$\r$\n'
|
||||||
FileWrite $9 'set "JAVA=$R0"$\r$\n'
|
FileWrite $9 'set "JAVA=$R0"$\r$\n'
|
||||||
FileWrite $9 'set "JAVA_OPTS="$\r$\n'
|
FileWrite $9 'set "JAVA_OPTS="$\r$\n'
|
||||||
@@ -79,29 +82,15 @@ Section install
|
|||||||
FileWrite $9 ' echo.>>"%ENV_FILE%"$\r$\n'
|
FileWrite $9 ' echo.>>"%ENV_FILE%"$\r$\n'
|
||||||
FileWrite $9 ')$\r$\n'
|
FileWrite $9 ')$\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.jar$\r$\n'
|
||||||
FileClose $9
|
FileClose $9
|
||||||
|
|
||||||
SetOutPath "$INSTDIR\lib\"
|
|
||||||
file "C:\AT\ATCS_source\lib\jide-oss.jar"
|
|
||||||
file "C:\AT\ATCS_source\lib\ui.jar"
|
|
||||||
file "C:\AT\ATCS_source\lib\AndorsTrainer_v${TRAINER_VERSION}.jar"
|
|
||||||
file "C:\AT\ATCS_source\lib\junit-4.10.jar"
|
|
||||||
file "C:\AT\ATCS_source\lib\json_simple-1.1.jar"
|
|
||||||
file "C:\AT\temp\ATCS_v0.6.19\ATCS_v${VERSION}.jar"
|
|
||||||
file "C:\AT\ATCS_source\lib\rsyntaxtextarea.jar"
|
|
||||||
file "C:\AT\ATCS_source\lib\prefuse.jar"
|
|
||||||
file "C:\AT\ATCS_source\lib\bsh-2.0b4.jar"
|
|
||||||
file "C:\AT\ATCS_source\lib\jsoup-1.10.2.jar"
|
|
||||||
|
|
||||||
SetOutPath $INSTDIR
|
|
||||||
|
|
||||||
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
||||||
|
|
||||||
|
|
||||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN "ATCS"
|
!insertmacro MUI_STARTMENU_WRITE_BEGIN "ATCS"
|
||||||
|
|
||||||
;Create shortcuts
|
;--- Create shortcuts
|
||||||
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
|
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
|
||||||
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Andor's Trail Content Studio.lnk" "$INSTDIR\ATCS.cmd" "" "$INSTDIR\ATCS.ico"
|
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Andor's Trail Content Studio.lnk" "$INSTDIR\ATCS.cmd" "" "$INSTDIR\ATCS.ico"
|
||||||
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
||||||
@@ -110,6 +99,8 @@ Section install
|
|||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------------
|
||||||
Section uninstall
|
Section uninstall
|
||||||
|
|
||||||
Delete "$INSTDIR\lib\jide-oss.jar"
|
Delete "$INSTDIR\lib\jide-oss.jar"
|
||||||
@@ -117,18 +108,17 @@ Section uninstall
|
|||||||
Delete "$INSTDIR\lib\junit-4.10.jar"
|
Delete "$INSTDIR\lib\junit-4.10.jar"
|
||||||
Delete "$INSTDIR\lib\json_simple-1.1.jar"
|
Delete "$INSTDIR\lib\json_simple-1.1.jar"
|
||||||
Delete "$INSTDIR\lib\AndorsTrainer_v${TRAINER_VERSION}.jar"
|
Delete "$INSTDIR\lib\AndorsTrainer_v${TRAINER_VERSION}.jar"
|
||||||
Delete "$INSTDIR\lib\ATCS_v${VERSION}.jar"
|
|
||||||
Delete "$INSTDIR\lib\rsyntaxtextarea.jar"
|
Delete "$INSTDIR\lib\rsyntaxtextarea.jar"
|
||||||
Delete "$INSTDIR\lib\prefuse.jar"
|
Delete "$INSTDIR\lib\prefuse.jar"
|
||||||
Delete "$INSTDIR\lib\bsh-2.0b4.jar"
|
Delete "$INSTDIR\lib\bsh-2.0b4.jar"
|
||||||
Delete "$INSTDIR\lib\jsoup-1.10.2.jar"
|
Delete "$INSTDIR\lib\jsoup-1.10.2.jar"
|
||||||
RMDir "$INSTDIR\lib\"
|
RMDir "$INSTDIR\lib\"
|
||||||
|
|
||||||
Delete "$INSTDIR\ATCS.ico"
|
Delete "$INSTDIR\ATCS.ico"
|
||||||
Delete "$INSTDIR\ATCS.cmd"
|
Delete "$INSTDIR\ATCS.cmd"
|
||||||
Delete "$INSTDIR\ATCS.env.bat"
|
Delete "$INSTDIR\ATCS.env.bat"
|
||||||
|
Delete "$INSTDIR\ATCS.jar"
|
||||||
Delete "$INSTDIR\Uninstall.exe"
|
Delete "$INSTDIR\Uninstall.exe"
|
||||||
|
|
||||||
RMDir "$INSTDIR"
|
RMDir "$INSTDIR"
|
||||||
|
|
||||||
!insertmacro MUI_STARTMENU_GETFOLDER "ATCS" $StartMenuFolder
|
!insertmacro MUI_STARTMENU_GETFOLDER "ATCS" $StartMenuFolder
|
||||||
@@ -140,19 +130,20 @@ Section uninstall
|
|||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------------
|
||||||
Function GetJRE
|
Function GetJRE
|
||||||
;
|
;
|
||||||
; Find JRE (javaw.exe)
|
; Find JRE (java.exe)
|
||||||
; DISABLED 1 - in .\jre directory (JRE Installed with application)
|
; DISABLED 1 - in .\jre directory (JRE Installed with application)
|
||||||
; 2 - in JAVA_HOME environment variable
|
; 2 - in JAVA_HOME environment variable
|
||||||
; 3 - in the registry
|
; 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 $R0
|
||||||
Push $R1
|
Push $R1
|
||||||
|
|
||||||
;ClearErrors
|
;ClearErrors
|
||||||
;StrCpy $R0 "$EXEDIR\jre\bin\javaw.exe"
|
;StrCpy $R0 "$EXEDIR\jre\bin\java.exe"
|
||||||
;IfFileExists $R0 JreFound
|
;IfFileExists $R0 JreFound
|
||||||
;StrCpy $R0 ""
|
;StrCpy $R0 ""
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
set "ATCS_DIR=%~dp0"
|
set "ATCS_DIR=%~dp0"
|
||||||
set "MAX_MEM=512M"
|
set "MAX_MEM=1024M"
|
||||||
set "CP=%ATCS_DIR%lib\*"
|
set "JAVA=java.exe"
|
||||||
set "JAVA=javaw.exe"
|
|
||||||
set "JAVA_OPTS=-DFONT_SCALE=1.0 -Dswing.aatext=true"
|
set "JAVA_OPTS=-DFONT_SCALE=1.0 -Dswing.aatext=true"
|
||||||
set "ENV_FILE=%ATCS_DIR%ATCS.env.bat"
|
set "ENV_FILE=%ATCS_DIR%ATCS.env.bat"
|
||||||
set "MAIN_CLASS=com.gpl.rpg.atcontentstudio.ATContentStudio"
|
|
||||||
|
|
||||||
if exist "%ENV_FILE%" (
|
if exist "%ENV_FILE%" (
|
||||||
call "%ENV_FILE%"
|
call "%ENV_FILE%"
|
||||||
@@ -17,4 +15,4 @@ if exist "%ENV_FILE%" (
|
|||||||
echo.>>"%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 |
26
packaging/common/ATCS.sh
Executable file
26
packaging/common/ATCS.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
ATCS_DIR="$(dirname "$(readlink -f "$0" || greadlink -f "$0" || stat -f "$0")")"
|
||||||
|
echo "ATCS_DIR: '${ATCS_DIR}'"
|
||||||
|
|
||||||
|
MAX_MEM="512M"
|
||||||
|
JAVA="java"
|
||||||
|
JAVA_OPTS='-DFONT_SCALE=1.0 -Dswing.aatext=true'
|
||||||
|
|
||||||
|
ENV_FILE="${ATCS_DIR}/ATCS.env"
|
||||||
|
|
||||||
|
if [ -f "${ENV_FILE}" ]; then
|
||||||
|
source "${ENV_FILE}"
|
||||||
|
else
|
||||||
|
{
|
||||||
|
echo "#MAX_MEM=\"${MAX_MEM}\""
|
||||||
|
echo "#JAVA=\"${JAVA}\""
|
||||||
|
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")")
|
||||||
|
ATCS_SOURCE_DIR=$(dirname "${PACKAGING_DIR}")
|
||||||
|
TEMP_DIR="${PACKAGING_DIR}/tmp"
|
||||||
|
JAR_LOCATION="${PACKAGING_DIR}/ATCS.jar" # Output JAR location as per script
|
||||||
|
MANIFEST_LOCATION="${PACKAGING_DIR}/Manifest.txt"
|
||||||
|
VERSION_FILE="${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.22
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
atcs.spritesheet.actorconditions_1.category=actorcondition
|
atcs.spritesheet.actorconditions_1.category=actorcondition
|
||||||
atcs.spritesheet.actorconditions_2.category=actorcondition
|
atcs.spritesheet.actorconditions_2.category=actorcondition
|
||||||
atcs.spritesheet.actorconditions_japozero.category=actorcondition
|
atcs.spritesheet.actorconditions_japozero.category=actorcondition
|
||||||
|
atcs.spritesheet.actorconditions_newb.category=actorcondition
|
||||||
atcs.spritesheet.actorconditions_omi1.category=actorcondition
|
atcs.spritesheet.actorconditions_omi1.category=actorcondition
|
||||||
atcs.spritesheet.actorconditions_omi2.category=actorcondition
|
atcs.spritesheet.actorconditions_omi2.category=actorcondition
|
||||||
|
|
||||||
@@ -30,7 +31,10 @@ atcs.spritesheet.items_misc_4.category=item
|
|||||||
atcs.spritesheet.items_misc_5.category=item
|
atcs.spritesheet.items_misc_5.category=item
|
||||||
atcs.spritesheet.items_misc_6.category=item
|
atcs.spritesheet.items_misc_6.category=item
|
||||||
atcs.spritesheet.items_necklaces_1.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_omi2.category=item
|
||||||
|
atcs.spritesheet.items_phoenix01.category=item
|
||||||
atcs.spritesheet.items_reterski_1.category=item
|
atcs.spritesheet.items_reterski_1.category=item
|
||||||
atcs.spritesheet.items_rijackson_1.category=item
|
atcs.spritesheet.items_rijackson_1.category=item
|
||||||
atcs.spritesheet.items_rings_1.category=item
|
atcs.spritesheet.items_rings_1.category=item
|
||||||
@@ -42,17 +46,22 @@ atcs.spritesheet.items_weapons_2.category=item
|
|||||||
atcs.spritesheet.items_weapons_3.category=item
|
atcs.spritesheet.items_weapons_3.category=item
|
||||||
|
|
||||||
atcs.spritesheet.monsters_armor1.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_dogs.category=monster
|
||||||
atcs.spritesheet.monsters_eye1.category=monster
|
atcs.spritesheet.monsters_eye1.category=monster
|
||||||
atcs.spritesheet.monsters_eye2.category=monster
|
atcs.spritesheet.monsters_eye2.category=monster
|
||||||
atcs.spritesheet.monsters_eye3.category=monster
|
atcs.spritesheet.monsters_eye3.category=monster
|
||||||
atcs.spritesheet.monsters_eye4.category=monster
|
atcs.spritesheet.monsters_eye4.category=monster
|
||||||
|
atcs.spritesheet.monsters_fatboy73.category=monster
|
||||||
atcs.spritesheet.monsters_ghost1.category=monster
|
atcs.spritesheet.monsters_ghost1.category=monster
|
||||||
|
|
||||||
atcs.spritesheet.monsters_gisons.category=monster
|
atcs.spritesheet.monsters_gisons.category=monster
|
||||||
atcs.spritesheet.monsters_guynmart.category=monster
|
atcs.spritesheet.monsters_guynmart.category=monster
|
||||||
|
|
||||||
atcs.spritesheet.monsters_insects.category=monster
|
atcs.spritesheet.monsters_insects.category=monster
|
||||||
|
atcs.spritesheet.monsters_johny.category=monster
|
||||||
atcs.spritesheet.monsters_karvis1.category=monster
|
atcs.spritesheet.monsters_karvis1.category=monster
|
||||||
atcs.spritesheet.monsters_karvis2.category=monster
|
atcs.spritesheet.monsters_karvis2.category=monster
|
||||||
atcs.spritesheet.monsters_ld1.category=monster
|
atcs.spritesheet.monsters_ld1.category=monster
|
||||||
@@ -65,9 +74,11 @@ atcs.spritesheet.monsters_man1.category=monster
|
|||||||
atcs.spritesheet.monsters_men.category=monster
|
atcs.spritesheet.monsters_men.category=monster
|
||||||
atcs.spritesheet.monsters_men2.category=monster
|
atcs.spritesheet.monsters_men2.category=monster
|
||||||
atcs.spritesheet.monsters_misc.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.category=monster
|
||||||
atcs.spritesheet.monsters_omi1_b.category=monster
|
atcs.spritesheet.monsters_omi1_b.category=monster
|
||||||
atcs.spritesheet.monsters_omi2.category=monster
|
atcs.spritesheet.monsters_omi2.category=monster
|
||||||
|
atcs.spritesheet.monsters_phoenix01.category=monster
|
||||||
atcs.spritesheet.monsters_rats.category=monster
|
atcs.spritesheet.monsters_rats.category=monster
|
||||||
atcs.spritesheet.monsters_redshrike1.category=monster
|
atcs.spritesheet.monsters_redshrike1.category=monster
|
||||||
atcs.spritesheet.monsters_rltiles1.category=monster
|
atcs.spritesheet.monsters_rltiles1.category=monster
|
||||||
@@ -79,7 +90,6 @@ atcs.spritesheet.monsters_skeleton1.category=monster
|
|||||||
atcs.spritesheet.monsters_skeleton2.category=monster
|
atcs.spritesheet.monsters_skeleton2.category=monster
|
||||||
atcs.spritesheet.monsters_snakes.category=monster
|
atcs.spritesheet.monsters_snakes.category=monster
|
||||||
atcs.spritesheet.monsters_tometik1.category=monster
|
atcs.spritesheet.monsters_tometik1.category=monster
|
||||||
atcs.spritesheet.monsters_tometik10.category=monster
|
|
||||||
atcs.spritesheet.monsters_tometik2.category=monster
|
atcs.spritesheet.monsters_tometik2.category=monster
|
||||||
atcs.spritesheet.monsters_tometik3.category=monster
|
atcs.spritesheet.monsters_tometik3.category=monster
|
||||||
atcs.spritesheet.monsters_tometik4.category=monster
|
atcs.spritesheet.monsters_tometik4.category=monster
|
||||||
@@ -88,6 +98,7 @@ atcs.spritesheet.monsters_tometik6.category=monster
|
|||||||
atcs.spritesheet.monsters_tometik7.category=monster
|
atcs.spritesheet.monsters_tometik7.category=monster
|
||||||
atcs.spritesheet.monsters_tometik8.category=monster
|
atcs.spritesheet.monsters_tometik8.category=monster
|
||||||
atcs.spritesheet.monsters_tometik9.category=monster
|
atcs.spritesheet.monsters_tometik9.category=monster
|
||||||
|
atcs.spritesheet.monsters_tometik10.category=monster
|
||||||
atcs.spritesheet.monsters_warrior1.category=monster
|
atcs.spritesheet.monsters_warrior1.category=monster
|
||||||
atcs.spritesheet.monsters_unknown.category=monster
|
atcs.spritesheet.monsters_unknown.category=monster
|
||||||
atcs.spritesheet.monsters_wraiths.category=monster
|
atcs.spritesheet.monsters_wraiths.category=monster
|
||||||
@@ -112,3 +123,12 @@ atcs.spritesheet.monsters_giantbasilisk.sizey=64
|
|||||||
atcs.spritesheet.monsters_hydra1.category=monster
|
atcs.spritesheet.monsters_hydra1.category=monster
|
||||||
atcs.spritesheet.monsters_hydra1.sizex=64
|
atcs.spritesheet.monsters_hydra1.sizex=64
|
||||||
atcs.spritesheet.monsters_hydra1.sizey=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
|
||||||
|
|||||||
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,10 +1,16 @@
|
|||||||
package com.gpl.rpg.atcontentstudio;
|
package com.gpl.rpg.atcontentstudio;
|
||||||
|
|
||||||
import java.awt.Color;
|
import com.gpl.rpg.atcontentstudio.model.Workspace;
|
||||||
import java.awt.Desktop;
|
import com.gpl.rpg.atcontentstudio.ui.StudioFrame;
|
||||||
import java.awt.Dimension;
|
import com.gpl.rpg.atcontentstudio.ui.WorkerDialog;
|
||||||
import java.awt.Font;
|
import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector;
|
||||||
import java.awt.Toolkit;
|
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.WindowAdapter;
|
||||||
import java.awt.event.WindowEvent;
|
import java.awt.event.WindowEvent;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
@@ -14,214 +20,235 @@ import java.io.InputStreamReader;
|
|||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.net.http.HttpTimeoutException;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.*;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
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 class ATContentStudio {
|
||||||
|
|
||||||
public static final String APP_NAME = "Andor's Trail Content Studio";
|
public static final String APP_NAME = "Andor's Trail Content Studio";
|
||||||
public static final String APP_VERSION = "v0.6.19";
|
public static final String APP_VERSION = readVersionFromFile();
|
||||||
|
|
||||||
public static final String CHECK_UPDATE_URL = "https://andorstrail.com/static/ATCS_latest";
|
public static final String CHECK_UPDATE_URL = "https://andorstrail.com/static/ATCS_latest";
|
||||||
public static final String DOWNLOAD_URL = "https://andorstrail.com/viewtopic.php?f=6&t=4806";
|
public static final String DOWNLOAD_URL = "https://andorstrail.com/viewtopic.php?f=6&t=4806";
|
||||||
|
|
||||||
public static final String FONT_SCALE_ENV_VAR_NAME = "FONT_SCALE";
|
public static final String FONT_SCALE_ENV_VAR_NAME = "FONT_SCALE";
|
||||||
|
|
||||||
public static boolean STARTED = false;
|
public static boolean STARTED = false;
|
||||||
public static float SCALING=1.0f;
|
public static float SCALING = 1.0f;
|
||||||
public static StudioFrame frame = null;
|
public static StudioFrame frame = null;
|
||||||
|
|
||||||
//Need to keep a strong reference to it, to avoid garbage collection that'll reset these loggers.
|
// Need to keep a strong reference to it, to avoid garbage collection that'll
|
||||||
public static final List<Logger> configuredLoggers = new LinkedList<Logger>();
|
// reset these loggers.
|
||||||
|
public static final List<Logger> configuredLoggers = new LinkedList<Logger>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param args
|
* @param args
|
||||||
*/
|
*/
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
String fontScaling = System.getProperty(FONT_SCALE_ENV_VAR_NAME);
|
String fontScaling = System.getProperty(FONT_SCALE_ENV_VAR_NAME);
|
||||||
Float fontScale = null;
|
Float fontScale;
|
||||||
if (fontScaling != null) {
|
if (fontScaling != null) {
|
||||||
try {
|
try {
|
||||||
fontScale = Float.parseFloat(fontScaling);
|
fontScale = Float.parseFloat(fontScaling);
|
||||||
SCALING=fontScale;
|
SCALING = fontScale;
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
System.err.println("Failed to parse font scaling parameter. Using default.");
|
System.err.println("Failed to parse font scaling parameter. Using default.");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigCache.init();
|
ConfigCache.init();
|
||||||
|
|
||||||
try {
|
String laf = ConfigCache.getFavoriteLaFClassName();
|
||||||
String laf = ConfigCache.getFavoriteLaFClassName();
|
setLookAndFeel(laf);
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
|
||||||
scaleUIFont();
|
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);
|
||||||
|
|
||||||
//Need to keep a strong reference to it, to avoid garbage collection that'll reset this setting.
|
wsSelect.addWindowListener(new WindowAdapter() {
|
||||||
Logger l = Logger.getLogger(ExpressionParser.class.getName());
|
@Override
|
||||||
l.setLevel(Level.OFF);
|
public synchronized void windowClosed(WindowEvent e) {
|
||||||
configuredLoggers.add(l);
|
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);
|
||||||
|
|
||||||
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() {
|
public static void setLookAndFeel(String laf) {
|
||||||
@Override
|
if (laf == null)
|
||||||
public synchronized void windowClosed(WindowEvent e) {
|
{
|
||||||
if (wsSelect.selected != null && !STARTED) {
|
System.out.println("No look and feel specified, using system default.");
|
||||||
ATContentStudio.STARTED = true;
|
laf = UIManager.getSystemLookAndFeelClassName();
|
||||||
final File workspaceRoot = new File(wsSelect.selected);
|
}
|
||||||
WorkerDialog.showTaskMessage("Loading your workspace...", null, new Runnable(){
|
System.out.println("Info: Setting look and feel to: " + laf);
|
||||||
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);
|
|
||||||
|
|
||||||
}
|
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:");
|
||||||
|
|
||||||
private static void checkUpdate() {
|
e.printStackTrace();
|
||||||
BufferedReader in = null;
|
} catch (InstantiationException | UnsupportedLookAndFeelException | IllegalAccessException e) {
|
||||||
try {
|
e.printStackTrace();
|
||||||
URL url = new URL(CHECK_UPDATE_URL);
|
}
|
||||||
in = new BufferedReader(new InputStreamReader(url.openStream()));
|
var newLaF = UIManager.getLookAndFeel();
|
||||||
|
System.out.println("Using look and feel: " + newLaF.getName() + " (" + newLaF.getClass().getName() + ")");
|
||||||
|
|
||||||
String inputLine, lastLine = null;
|
scaleUIFont();
|
||||||
while ((inputLine = in.readLine()) != null) {lastLine = inputLine;}
|
}
|
||||||
if (lastLine != null && !lastLine.equals(APP_VERSION)) {
|
|
||||||
|
|
||||||
// for copying style
|
private static void checkUpdate() {
|
||||||
JLabel label = new JLabel();
|
BufferedReader in = null;
|
||||||
Font font = label.getFont();
|
try {
|
||||||
Color color = label.getBackground();
|
URL url = new URL(CHECK_UPDATE_URL);
|
||||||
|
in = new BufferedReader(new InputStreamReader(url.openStream()));
|
||||||
|
|
||||||
// create some css from the label's font
|
String inputLine, lastLine = null;
|
||||||
StringBuffer style = new StringBuffer("font-family:" + font.getFamily() + ";");
|
while ((inputLine = in.readLine()) != null) {
|
||||||
style.append("font-weight:" + (font.isBold() ? "bold" : "normal") + ";");
|
lastLine = inputLine;
|
||||||
style.append("font-size:" + font.getSize() + "pt;");
|
}
|
||||||
style.append("background-color: rgb("+color.getRed()+","+color.getGreen()+","+color.getBlue()+");");
|
if (lastLine != null && !lastLine.equals(APP_VERSION)) {
|
||||||
|
|
||||||
JEditorPane ep = new JEditorPane("text/html", "<html><body style=\"" + style + "\">"
|
// for copying style
|
||||||
+ "You are not running the latest ATCS version.<br/>"
|
JLabel label = new JLabel();
|
||||||
+ "You can get the latest version ("+lastLine+") by clicking the link below.<br/>"
|
Font font = label.getFont();
|
||||||
+ "<a href=\""+DOWNLOAD_URL+"\">"+DOWNLOAD_URL+"</a><br/>"
|
Color color = label.getBackground();
|
||||||
+ "<br/>"
|
|
||||||
+ "</body></html>");
|
|
||||||
|
|
||||||
ep.setEditable(false);
|
// create some css from the label's font
|
||||||
ep.setBorder(null);
|
StringBuffer style = new StringBuffer("font-family:" + font.getFamily() + ";");
|
||||||
|
style.append("font-weight:" + (font.isBold() ? "bold" : "normal") + ";");
|
||||||
|
style.append("font-size:" + font.getSize() + "pt;");
|
||||||
|
style.append("background-color: rgb(" + color.getRed() + "," + color.getGreen() + "," + color.getBlue()
|
||||||
|
+ ");");
|
||||||
|
|
||||||
ep.addHyperlinkListener(new HyperlinkListener() {
|
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>");
|
||||||
|
|
||||||
@Override
|
ep.setEditable(false);
|
||||||
public void hyperlinkUpdate(HyperlinkEvent e) {
|
ep.setBorder(null);
|
||||||
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);
|
ep.addHyperlinkListener(new HyperlinkListener() {
|
||||||
}
|
|
||||||
} 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() {
|
@Override
|
||||||
if (SCALING != 1.0f) {
|
public void hyperlinkUpdate(HyperlinkEvent e) {
|
||||||
System.out.println("Scaling fonts to "+SCALING);
|
try {
|
||||||
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
|
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
|
||||||
Map<Object, Object> newDefaults = new HashMap<Object, Object>();
|
Desktop.getDesktop().browse(e.getURL().toURI());
|
||||||
for (Enumeration<Object> e = defaults.keys(); e.hasMoreElements();) {
|
}
|
||||||
Object key = e.nextElement();
|
} catch (IOException e1) {
|
||||||
Object value = defaults.get(key);
|
e1.printStackTrace();
|
||||||
if (value instanceof Font) {
|
} catch (URISyntaxException e1) {
|
||||||
Font font = (Font) value;
|
e1.printStackTrace();
|
||||||
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));
|
JOptionPane.showMessageDialog(null, ep, "Update available", JOptionPane.INFORMATION_MESSAGE);
|
||||||
}
|
}
|
||||||
}
|
} catch (MalformedURLException e) {
|
||||||
}
|
e.printStackTrace();
|
||||||
for (Object key : newDefaults.keySet()) {
|
} catch (HttpTimeoutException e) {
|
||||||
defaults.put(key, newDefaults.get(key));
|
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;
|
package com.gpl.rpg.atcontentstudio;
|
||||||
|
|
||||||
|
import com.gpl.rpg.atcontentstudio.io.SettingsSave;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.gpl.rpg.atcontentstudio.io.SettingsSave;
|
|
||||||
|
|
||||||
public class ConfigCache implements Serializable {
|
public class ConfigCache implements Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 4584324644282843961L;
|
private static final long serialVersionUID = 4584324644282843961L;
|
||||||
|
|
||||||
private static final File CONFIG_CACHE_STORAGE;
|
private static final File CONFIG_CACHE_STORAGE;
|
||||||
|
|
||||||
private static ConfigCache instance = null;
|
private static ConfigCache instance = null;
|
||||||
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
if (System.getenv("APPDATA") != null) {
|
if (System.getenv("APPDATA") != null) {
|
||||||
CONFIG_CACHE_STORAGE = new File(System.getenv("APPDATA")+File.separator+ATContentStudio.APP_NAME+File.separator+"configCache" );
|
CONFIG_CACHE_STORAGE = new File(System.getenv("APPDATA") + File.separator + ATContentStudio.APP_NAME + File.separator + "configCache");
|
||||||
} else {
|
} else {
|
||||||
CONFIG_CACHE_STORAGE = new File(System.getenv("HOME")+File.separator+"."+ATContentStudio.APP_NAME+File.separator+"configCache" );
|
CONFIG_CACHE_STORAGE = new File(System.getenv("HOME") + File.separator + "." + ATContentStudio.APP_NAME + File.separator + "configCache");
|
||||||
}
|
}
|
||||||
CONFIG_CACHE_STORAGE.getParentFile().mkdirs();
|
CONFIG_CACHE_STORAGE.getParentFile().mkdirs();
|
||||||
if (CONFIG_CACHE_STORAGE.exists()) {
|
if (CONFIG_CACHE_STORAGE.exists()) {
|
||||||
ConfigCache.instance = (ConfigCache) SettingsSave.loadInstance(CONFIG_CACHE_STORAGE, "Configuration cache");
|
ConfigCache.instance = (ConfigCache) SettingsSave.loadInstance(CONFIG_CACHE_STORAGE, "Configuration cache");
|
||||||
if (ConfigCache.instance == null) {
|
if (ConfigCache.instance == null) {
|
||||||
ConfigCache.instance = new ConfigCache();
|
ConfigCache.instance = new ConfigCache();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ConfigCache.instance = new ConfigCache();
|
ConfigCache.instance = new ConfigCache();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void save() {
|
private void save() {
|
||||||
SettingsSave.saveInstance(instance, ConfigCache.CONFIG_CACHE_STORAGE, "Configuration cache");
|
SettingsSave.saveInstance(instance, ConfigCache.CONFIG_CACHE_STORAGE, "Configuration cache");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private List<File> knownWorkspaces = new ArrayList<File>();
|
private List<File> knownWorkspaces = new ArrayList<File>();
|
||||||
private File latestWorkspace = null;
|
private File latestWorkspace = null;
|
||||||
private String favoriteLaFClassName = null;
|
private String favoriteLaFClassName = null;
|
||||||
private boolean[] notifConfig = new boolean[]{true, true, true, true};
|
private boolean[] notifConfig = new boolean[]{true, true, true, true};
|
||||||
|
|
||||||
|
|
||||||
public static List<File> getKnownWorkspaces() {
|
public static List<File> getKnownWorkspaces() {
|
||||||
return instance.knownWorkspaces;
|
return instance.knownWorkspaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addWorkspace(File w) {
|
public static void addWorkspace(File w) {
|
||||||
instance.knownWorkspaces.add(w);
|
instance.knownWorkspaces.add(w);
|
||||||
instance.save();
|
instance.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void removeWorkspace(File w) {
|
public static void removeWorkspace(File w) {
|
||||||
instance.knownWorkspaces.remove(w);
|
instance.knownWorkspaces.remove(w);
|
||||||
instance.save();
|
instance.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static File getLatestWorkspace() {
|
public static File getLatestWorkspace() {
|
||||||
return instance.latestWorkspace;
|
return instance.latestWorkspace;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setLatestWorkspace(File latestWorkspace) {
|
public static void setLatestWorkspace(File latestWorkspace) {
|
||||||
instance.latestWorkspace = latestWorkspace;
|
instance.latestWorkspace = latestWorkspace;
|
||||||
instance.save();
|
instance.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getFavoriteLaFClassName() {
|
public static String getFavoriteLaFClassName() {
|
||||||
return instance.favoriteLaFClassName;
|
return instance.favoriteLaFClassName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setFavoriteLaFClassName(String favoriteLaFClassName) {
|
public static void setFavoriteLaFClassName(String favoriteLaFClassName) {
|
||||||
instance.favoriteLaFClassName = favoriteLaFClassName;
|
instance.favoriteLaFClassName = favoriteLaFClassName;
|
||||||
instance.save();
|
instance.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void putNotifViewConfig(boolean[] view) {
|
public static void putNotifViewConfig(boolean[] view) {
|
||||||
for (int i=instance.notifConfig.length; i<0; --i) {
|
for (int i = instance.notifConfig.length; i < 0; --i) {
|
||||||
instance.notifConfig[i] = view[i];
|
instance.notifConfig[i] = view[i];
|
||||||
}
|
}
|
||||||
instance.save();
|
instance.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean[] getNotifViewConfig() {
|
public static boolean[] getNotifViewConfig() {
|
||||||
if (instance == null || instance.notifConfig == null) {
|
if (instance == null || instance.notifConfig == null) {
|
||||||
//Not yet initialized. All flags on to help corner out init issues.
|
//Not yet initialized. All flags on to help corner out init issues.
|
||||||
return new boolean[]{true, true, true, true};
|
return new boolean[]{true, true, true, true};
|
||||||
}
|
}
|
||||||
return instance.notifConfig;
|
return instance.notifConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void init() {}
|
public static void init() {
|
||||||
|
}
|
||||||
|
|
||||||
public static void clear() {
|
public static void clear() {
|
||||||
instance.knownWorkspaces.clear();
|
instance.knownWorkspaces.clear();
|
||||||
setFavoriteLaFClassName(null);
|
setFavoriteLaFClassName(null);
|
||||||
instance.notifConfig = new boolean[]{true, true, true, true};
|
instance.notifConfig = new boolean[]{true, true, true, true};
|
||||||
instance.save();
|
instance.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,87 +6,87 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
|||||||
|
|
||||||
public class Notification {
|
public class Notification {
|
||||||
|
|
||||||
public static List<Notification> notifs = new ArrayList<Notification>();
|
public static List<Notification> notifs = new ArrayList<Notification>();
|
||||||
private static List<NotificationListener> listeners = new CopyOnWriteArrayList<NotificationListener>();
|
private static List<NotificationListener> listeners = new CopyOnWriteArrayList<NotificationListener>();
|
||||||
public static boolean showS = true, showI = true, showW = true, showE = true;
|
public static boolean showS, showI, showW, showE;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
boolean[] config = ConfigCache.getNotifViewConfig();
|
boolean[] config = ConfigCache.getNotifViewConfig();
|
||||||
showS = config[0];
|
showS = config[0];
|
||||||
showI = config[1];
|
showI = config[1];
|
||||||
showW = config[2];
|
showW = config[2];
|
||||||
showE = config[3];
|
showE = config[3];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static enum Type {
|
public static enum Type {
|
||||||
SUCCESS,
|
SUCCESS,
|
||||||
INFO,
|
INFO,
|
||||||
WARN,
|
WARN,
|
||||||
ERROR
|
ERROR
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type type;
|
public Type type;
|
||||||
public String text;
|
public String text;
|
||||||
|
|
||||||
public Notification(Type type, String text) {
|
public Notification(Type type, String text) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.text = text;
|
this.text = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "["+type.toString()+"] "+text;
|
return "[" + type.toString() + "] " + text;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void clear() {
|
public static void clear() {
|
||||||
int i = notifs.size();
|
int i = notifs.size();
|
||||||
notifs.clear();
|
notifs.clear();
|
||||||
for (NotificationListener l : listeners) {
|
for (NotificationListener l : listeners) {
|
||||||
l.onListCleared(i);
|
l.onListCleared(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addSuccess(String text) {
|
public static void addSuccess(String text) {
|
||||||
if (!showS) return;
|
if (!showS) return;
|
||||||
Notification n = new Notification(Notification.Type.SUCCESS, text);
|
Notification n = new Notification(Notification.Type.SUCCESS, text);
|
||||||
notifs.add(n);
|
notifs.add(n);
|
||||||
for (NotificationListener l : listeners) {
|
for (NotificationListener l : listeners) {
|
||||||
l.onNewNotification(n);
|
l.onNewNotification(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addInfo(String text) {
|
public static void addInfo(String text) {
|
||||||
if (!showI) return;
|
if (!showI) return;
|
||||||
Notification n = new Notification(Notification.Type.INFO, text);
|
Notification n = new Notification(Notification.Type.INFO, text);
|
||||||
notifs.add(n);
|
notifs.add(n);
|
||||||
for (NotificationListener l : listeners) {
|
for (NotificationListener l : listeners) {
|
||||||
l.onNewNotification(n);
|
l.onNewNotification(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addWarn(String text) {
|
public static void addWarn(String text) {
|
||||||
if (!showW) return;
|
if (!showW) return;
|
||||||
Notification n = new Notification(Notification.Type.WARN, text);
|
Notification n = new Notification(Notification.Type.WARN, text);
|
||||||
notifs.add(n);
|
notifs.add(n);
|
||||||
for (NotificationListener l : listeners) {
|
for (NotificationListener l : listeners) {
|
||||||
l.onNewNotification(n);
|
l.onNewNotification(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addError(String text) {
|
public static void addError(String text) {
|
||||||
if (!showE) return;
|
if (!showE) return;
|
||||||
Notification n = new Notification(Notification.Type.ERROR, text);
|
Notification n = new Notification(Notification.Type.ERROR, text);
|
||||||
notifs.add(n);
|
notifs.add(n);
|
||||||
for (NotificationListener l : listeners) {
|
for (NotificationListener l : listeners) {
|
||||||
l.onNewNotification(n);
|
l.onNewNotification(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addNotificationListener(NotificationListener l) {
|
public static void addNotificationListener(NotificationListener l) {
|
||||||
listeners.add(l);
|
listeners.add(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void removeNotificationListener(NotificationListener l) {
|
public static void removeNotificationListener(NotificationListener l) {
|
||||||
listeners.remove(l);
|
listeners.remove(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,8 @@ package com.gpl.rpg.atcontentstudio;
|
|||||||
|
|
||||||
public interface NotificationListener {
|
public interface NotificationListener {
|
||||||
|
|
||||||
public void onNewNotification(Notification n);
|
public void onNewNotification(Notification n);
|
||||||
public void onListCleared(int i);
|
|
||||||
|
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 {
|
public class JsonPrettyWriter extends StringWriter {
|
||||||
|
|
||||||
private int indentLevel = 0;
|
private int indentLevel = 0;
|
||||||
private String indentText = " ";
|
private String indentText = " ";
|
||||||
|
|
||||||
public JsonPrettyWriter() {
|
public JsonPrettyWriter() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
public JsonPrettyWriter(String indent) {
|
public JsonPrettyWriter(String indent) {
|
||||||
super();
|
super();
|
||||||
this.indentText = indent;
|
this.indentText = indent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(int c) {
|
public void write(int c) {
|
||||||
if (((char) c) == '[' || ((char) c) == '{') {
|
if (((char) c) == '[' || ((char) c) == '{') {
|
||||||
super.write(c);
|
super.write(c);
|
||||||
super.write('\n');
|
super.write('\n');
|
||||||
indentLevel++;
|
indentLevel++;
|
||||||
writeIndentation();
|
writeIndentation();
|
||||||
} else if (((char) c) == ',') {
|
} else if (((char) c) == ',') {
|
||||||
super.write(c);
|
super.write(c);
|
||||||
super.write('\n');
|
super.write('\n');
|
||||||
writeIndentation();
|
writeIndentation();
|
||||||
} else if (((char) c) == ']' || ((char) c) == '}') {
|
} else if (((char) c) == ']' || ((char) c) == '}') {
|
||||||
super.write('\n');
|
super.write('\n');
|
||||||
indentLevel--;
|
indentLevel--;
|
||||||
writeIndentation();
|
writeIndentation();
|
||||||
super.write(c);
|
super.write(c);
|
||||||
} else {
|
} else {
|
||||||
super.write(c);
|
super.write(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Horrible hack to remove the horrible escaping of slashes in json-simple....
|
//Horrible hack to remove the horrible escaping of slashes in json-simple....
|
||||||
@Override
|
@Override
|
||||||
public void write(String str) {
|
public void write(String str) {
|
||||||
super.write(str.replaceAll("\\\\/", "/"));
|
super.write(str.replaceAll("\\\\/", "/"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeIndentation() {
|
private void writeIndentation() {
|
||||||
for (int i = 0; i < indentLevel; i++) {
|
for (int i = 0; i < indentLevel; i++) {
|
||||||
super.write(indentText);
|
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;
|
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 com.gpl.rpg.atcontentstudio.Notification;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
public class SettingsSave {
|
public class SettingsSave {
|
||||||
|
|
||||||
public static void saveInstance(Object obj, File f, String type) {
|
public static void saveInstance(Object obj, File f, String type) {
|
||||||
try {
|
try {
|
||||||
FileOutputStream fos = new FileOutputStream(f);
|
FileOutputStream fos = new FileOutputStream(f);
|
||||||
try {
|
try {
|
||||||
ObjectOutputStream oos = new ObjectOutputStream(fos);
|
ObjectOutputStream oos = new ObjectOutputStream(fos);
|
||||||
oos.writeObject(obj);
|
oos.writeObject(obj);
|
||||||
oos.flush();
|
oos.flush();
|
||||||
oos.close();
|
oos.close();
|
||||||
Notification.addSuccess(type+" successfully saved.");
|
Notification.addSuccess(type + " successfully saved.");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Notification.addError(type+" saving error: "+e.getMessage());
|
Notification.addError(type + " saving error: " + e.getMessage());
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
fos.close();
|
fos.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Notification.addError(type+" saving error: "+e.getMessage());
|
Notification.addError(type + " saving error: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Notification.addError(type+" saving error: "+e.getMessage());
|
Notification.addError(type + " saving error: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Object loadInstance(File f, String type) {
|
public static Object loadInstance(File f, String type) {
|
||||||
FileInputStream fis;
|
FileInputStream fis;
|
||||||
Object result = null;
|
Object result = null;
|
||||||
try {
|
try {
|
||||||
fis = new FileInputStream(f);
|
fis = new FileInputStream(f);
|
||||||
ObjectInputStream ois;
|
ObjectInputStream ois;
|
||||||
try {
|
try {
|
||||||
ois = new ObjectInputStream(fis);
|
ois = new ObjectInputStream(fis);
|
||||||
try {
|
try {
|
||||||
result = ois.readObject();
|
result = ois.readObject();
|
||||||
Notification.addSuccess(type+" successfully loaded.");
|
Notification.addSuccess(type + " successfully loaded.");
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Notification.addError(type+" loading error: "+e.getMessage());
|
Notification.addError(type + " loading error: " + e.getMessage());
|
||||||
} finally {
|
} finally {
|
||||||
ois.close();
|
ois.close();
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Notification.addError(type+" loading error: "+e.getMessage());
|
Notification.addError(type + " loading error: " + e.getMessage());
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
fis.close();
|
fis.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Notification.addError(type+" loading error: "+e.getMessage());
|
Notification.addError(type + " loading error: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Notification.addError(type+" loading error: "+e.getMessage());
|
Notification.addError(type + " loading error: " + e.getMessage());
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,124 +1,135 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model;
|
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.GameSource.Type;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
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 {
|
public class ClosedProject implements ProjectTreeNode {
|
||||||
|
|
||||||
String name;
|
String name;
|
||||||
Workspace parent;
|
Workspace parent;
|
||||||
|
|
||||||
public ClosedProject(Workspace w, String name) {
|
public ClosedProject(Workspace w, String name) {
|
||||||
this.parent = w;
|
this.parent = w;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getChildAt(int childIndex) {
|
public TreeNode getChildAt(int childIndex) {
|
||||||
return null;
|
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
|
@Override
|
||||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
public int getChildCount() {
|
||||||
path.add(0,this);
|
return 0;
|
||||||
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
|
@Override
|
||||||
public String getDesc() {
|
public TreeNode getParent() {
|
||||||
return name+" [closed]";
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Project getProject() {
|
public int getIndex(TreeNode node) {
|
||||||
return null;
|
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
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return getOpenIcon();
|
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
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public Image getClosedIcon() {
|
||||||
return null;
|
//TODO Create a cool Project icon.
|
||||||
}
|
return DefaultIcons.getStdClosedIcon();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public Image getLeafIcon() {
|
||||||
return null;
|
//TODO Create a cool Project icon.
|
||||||
}
|
return DefaultIcons.getStdClosedIcon();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public Image getOpenIcon() {
|
||||||
return true;
|
//TODO Create a cool Project icon.
|
||||||
}
|
return DefaultIcons.getStdOpenIcon();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean needsSaving() {
|
public GameDataSet getDataSet() {
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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;
|
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 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 {
|
public abstract class GameDataElement implements ProjectTreeNode, Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 2028934451226743389L;
|
private static final long serialVersionUID = 2028934451226743389L;
|
||||||
|
|
||||||
public static enum State {
|
public static enum State {
|
||||||
init, // We know the object exists, and have its key/ID.
|
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.
|
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.
|
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
|
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.
|
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.
|
saved // Whether altered or created, this item has been saved since last modification.
|
||||||
}
|
}
|
||||||
|
|
||||||
public State state = State.init;
|
public State state = State.init;
|
||||||
|
|
||||||
//Available from state init.
|
//Available from state init.
|
||||||
public ProjectTreeNode parent;
|
public ProjectTreeNode parent;
|
||||||
|
|
||||||
public boolean writable = false;
|
public boolean writable = false;
|
||||||
|
|
||||||
public BookmarkEntry bookmark = null;
|
public BookmarkEntry bookmark = null;
|
||||||
|
|
||||||
//List of objects whose transition to "linked" state made them point to this instance.
|
//List of objects whose transition to "linked" state made them point to this instance.
|
||||||
private Map<GameDataElement, Integer> backlinks = new ConcurrentHashMap<GameDataElement, Integer>();
|
private Map<GameDataElement, Integer> backlinks = new ConcurrentHashMap<GameDataElement, Integer>();
|
||||||
|
|
||||||
public String id = null;
|
public String id = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Enumeration<ProjectTreeNode> children() {
|
public Enumeration<ProjectTreeNode> children() {
|
||||||
return null;
|
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
|
@Override
|
||||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
public boolean getAllowsChildren() {
|
||||||
path.add(0,this);
|
return false;
|
||||||
parent.childrenChanged(path);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
public TreeNode getChildAt(int arg0) {
|
||||||
path.add(0,this);
|
return null;
|
||||||
parent.childrenRemoved(path);
|
}
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void notifyCreated() {
|
|
||||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public abstract String getDesc();
|
|
||||||
|
|
||||||
public static String getStaticDesc() {
|
@Override
|
||||||
return "GameDataElements";
|
public int getChildCount() {
|
||||||
}
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract void parse();
|
@Override
|
||||||
public abstract void link();
|
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
|
||||||
@Override
|
public Project getProject() {
|
||||||
public Project getProject() {
|
return parent == null ? null : parent.getProject();
|
||||||
return parent == null ? null : parent.getProject();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public Image getClosedIcon() {return null;}
|
@Override
|
||||||
@Override
|
public Image getClosedIcon() {
|
||||||
public Image getOpenIcon() {return null;}
|
return null;
|
||||||
@Override
|
}
|
||||||
public Image getLeafIcon() {
|
|
||||||
return getIcon();
|
@Override
|
||||||
}
|
public Image getOpenIcon() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getLeafIcon() {
|
||||||
|
return getIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public abstract GameDataElement clone();
|
public abstract GameDataElement clone();
|
||||||
|
|
||||||
public abstract void elementChanged(GameDataElement oldOne, GameDataElement newOne);
|
public abstract void elementChanged(GameDataElement oldOne, GameDataElement newOne);
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameSource.Type getDataType() {
|
public GameSource.Type getDataType() {
|
||||||
if (parent == null) {
|
if (parent == null) {
|
||||||
System.out.println("blerf.");
|
System.out.println("blerf.");
|
||||||
}
|
}
|
||||||
return parent.getDataType();
|
return parent.getDataType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<BacklinksListener> backlinkListeners = new ArrayList<GameDataElement.BacklinksListener>();
|
public List<BacklinksListener> backlinkListeners = new ArrayList<GameDataElement.BacklinksListener>();
|
||||||
|
|
||||||
public void addBacklinkListener(BacklinksListener l) {
|
public void addBacklinkListener(BacklinksListener l) {
|
||||||
backlinkListeners.add(l);
|
backlinkListeners.add(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeBacklinkListener(BacklinksListener l) {
|
public void removeBacklinkListener(BacklinksListener l) {
|
||||||
backlinkListeners.remove(l);
|
backlinkListeners.remove(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addBacklink(GameDataElement gde) {
|
public void addBacklink(GameDataElement gde) {
|
||||||
if (!backlinks.containsKey(gde)) {
|
if (!backlinks.containsKey(gde)) {
|
||||||
backlinks.put(gde, 1);
|
backlinks.put(gde, 1);
|
||||||
for (BacklinksListener l : backlinkListeners) {
|
for (BacklinksListener l : backlinkListeners) {
|
||||||
l.backlinkAdded(gde);
|
l.backlinkAdded(gde);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
backlinks.put(gde, backlinks.get(gde) + 1);
|
backlinks.put(gde, backlinks.get(gde) + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeBacklink(GameDataElement gde) {
|
public void removeBacklink(GameDataElement gde) {
|
||||||
if (backlinks.get(gde) == null) return;
|
if (backlinks.get(gde) == null) return;
|
||||||
backlinks.put(gde, backlinks.get(gde) - 1);
|
backlinks.put(gde, backlinks.get(gde) - 1);
|
||||||
if (backlinks.get(gde) == 0) {
|
if (backlinks.get(gde) == 0) {
|
||||||
backlinks.remove(gde);
|
backlinks.remove(gde);
|
||||||
for (BacklinksListener l : backlinkListeners) {
|
for (BacklinksListener l : backlinkListeners) {
|
||||||
l.backlinkRemoved(gde);
|
l.backlinkRemoved(gde);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<GameDataElement> getBacklinks() {
|
public Set<GameDataElement> getBacklinks() {
|
||||||
return backlinks.keySet();
|
return backlinks.keySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static interface BacklinksListener {
|
public static interface BacklinksListener {
|
||||||
public void backlinkAdded(GameDataElement gde);
|
public void backlinkAdded(GameDataElement gde);
|
||||||
public void backlinkRemoved(GameDataElement gde);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
public void backlinkRemoved(GameDataElement gde);
|
||||||
public boolean isEmpty() {
|
}
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean needsSaving() {
|
@Override
|
||||||
return this.state == State.modified || this.state == State.created;
|
public boolean isEmpty() {
|
||||||
}
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract String getProjectFilename();
|
public boolean needsSaving() {
|
||||||
|
return this.state == State.modified || this.state == State.created;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract void save();
|
public abstract String getProjectFilename();
|
||||||
|
|
||||||
public abstract List<SaveEvent> attemptSave();
|
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;
|
package com.gpl.rpg.atcontentstudio.model;
|
||||||
|
|
||||||
import java.awt.Image;
|
import com.gpl.rpg.atcontentstudio.io.JsonSerializable;
|
||||||
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.model.Project.ResourceSet;
|
import com.gpl.rpg.atcontentstudio.model.Project.ResourceSet;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
|
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.sprites.Spritesheet;
|
||||||
import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeDataSet;
|
import com.gpl.rpg.atcontentstudio.model.tools.writermode.WriterModeDataSet;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
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 class GameSource implements ProjectTreeNode, Serializable, JsonSerializable {
|
||||||
|
|
||||||
public static final String DEFAULT_REL_PATH_FOR_GAME_RESOURCE = "res"+File.separator+"values"+File.separator+"loadresources.xml";
|
private static final long serialVersionUID = -1512979360971918158L;
|
||||||
public static final String DEFAULT_REL_PATH_FOR_DEBUG_RESOURCE = "res"+File.separator+"values"+File.separator+"loadresources_debug.xml";
|
|
||||||
|
|
||||||
public transient GameDataSet gameData;
|
public static final String DEFAULT_REL_PATH_FOR_GAME_RESOURCE = "res" + File.separator + "values" + File.separator + "loadresources.xml";
|
||||||
public transient TMXMapSet gameMaps;
|
public static final String DEFAULT_REL_PATH_FOR_DEBUG_RESOURCE = "res" + File.separator + "values" + File.separator + "loadresources_debug.xml";
|
||||||
public transient SpriteSheetSet gameSprites;
|
|
||||||
public transient Worldmap worldmap;
|
|
||||||
public transient WriterModeDataSet writerModeDataSet;
|
|
||||||
private transient SavedSlotCollection v;
|
|
||||||
|
|
||||||
public static enum Type {
|
public transient GameDataSet gameData;
|
||||||
source,
|
public transient TMXMapSet gameMaps;
|
||||||
referenced,
|
public transient SpriteSheetSet gameSprites;
|
||||||
altered,
|
public transient Worldmap worldmap;
|
||||||
created
|
public transient WriterModeDataSet writerModeDataSet;
|
||||||
}
|
private transient SavedSlotCollection v;
|
||||||
|
|
||||||
public File baseFolder;
|
|
||||||
public Type type;
|
|
||||||
|
|
||||||
public transient Project parent = null;
|
@Override
|
||||||
|
public Map toMap() {
|
||||||
|
Map map = new HashMap();
|
||||||
|
map.put("type", type.toString());
|
||||||
|
map.put("baseFolder", baseFolder.getPath());
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
public transient Map<String, List<String>> referencedSourceFiles = null;
|
@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 GameSource(File folder, Project parent) {
|
public static enum Type {
|
||||||
this.parent = parent;
|
source,
|
||||||
this.baseFolder = folder;
|
referenced,
|
||||||
this.type = Type.source;
|
altered,
|
||||||
initData();
|
created
|
||||||
}
|
}
|
||||||
|
|
||||||
public GameSource(Project parent, Type type) {
|
public File baseFolder;
|
||||||
this.parent = parent;
|
public Type type;
|
||||||
this.baseFolder = new File(parent.baseFolder, type.toString());
|
|
||||||
this.type = type;
|
|
||||||
initData();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void refreshTransients(Project p) {
|
public transient Project parent;
|
||||||
parent = p;
|
|
||||||
initData();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void initData() {
|
public transient Map<String, List<String>> referencedSourceFiles = null;
|
||||||
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() {
|
public GameSource(Map json, Project parent) {
|
||||||
File xmlFile = null;
|
fromMap(json);
|
||||||
if (parent.sourceSetToUse == ResourceSet.gameData) {
|
refreshTransients(parent);
|
||||||
xmlFile = new File(baseFolder, DEFAULT_REL_PATH_FOR_GAME_RESOURCE);
|
}
|
||||||
} else if (parent.sourceSetToUse == ResourceSet.debugData) {
|
public GameSource(File folder, Project parent) {
|
||||||
xmlFile = new File(baseFolder, DEFAULT_REL_PATH_FOR_DEBUG_RESOURCE);
|
this.parent = parent;
|
||||||
} else {
|
this.baseFolder = folder;
|
||||||
return;
|
this.type = Type.source;
|
||||||
}
|
initData();
|
||||||
|
}
|
||||||
|
|
||||||
if (!xmlFile.exists()) return;
|
public GameSource(Project parent, Type type) {
|
||||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
this.parent = parent;
|
||||||
Document doc;
|
this.baseFolder = new File(parent.baseFolder, type.toString());
|
||||||
try {
|
this.type = type;
|
||||||
factory.setIgnoringComments(true);
|
initData();
|
||||||
factory.setIgnoringElementContentWhitespace(true);
|
}
|
||||||
factory.setExpandEntityReferences(false);
|
|
||||||
DocumentBuilder builder = factory.newDocumentBuilder();
|
public void refreshTransients(Project p) {
|
||||||
InputSource insrc = new InputSource(new FileInputStream(xmlFile));
|
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.setSystemId("http://worldmap/");
|
||||||
insrc.setEncoding("UTF-8");
|
insrc.setEncoding("UTF-8");
|
||||||
doc = builder.parse(insrc);
|
doc = builder.parse(insrc);
|
||||||
|
|
||||||
Element root = (Element) doc.getElementsByTagName("resources").item(0);
|
Element root = (Element) doc.getElementsByTagName("resources").item(0);
|
||||||
if (root != null) {
|
if (root != null) {
|
||||||
NodeList arraysList = root.getElementsByTagName("array");
|
NodeList arraysList = root.getElementsByTagName("array");
|
||||||
if (arraysList != null) {
|
if (arraysList != null) {
|
||||||
for (int i = 0; i < arraysList.getLength(); i++) {
|
for (int i = 0; i < arraysList.getLength(); i++) {
|
||||||
Element arrayNode = (Element) arraysList.item(i);
|
Element arrayNode = (Element) arraysList.item(i);
|
||||||
String name = arrayNode.getAttribute("name");
|
String name = arrayNode.getAttribute("name");
|
||||||
List<String> arrayContents = new ArrayList<String>();
|
List<String> arrayContents = new ArrayList<String>();
|
||||||
NodeList arrayItems = arrayNode.getElementsByTagName("item");
|
NodeList arrayItems = arrayNode.getElementsByTagName("item");
|
||||||
if (arrayItems != null) {
|
if (arrayItems != null) {
|
||||||
for (int j = 0; j < arrayItems.getLength(); j++) {
|
for (int j = 0; j < arrayItems.getLength(); j++) {
|
||||||
arrayContents.add(((Element)arrayItems.item(j)).getTextContent());
|
arrayContents.add(((Element) arrayItems.item(j)).getTextContent());
|
||||||
}
|
}
|
||||||
referencedSourceFiles.put(name, arrayContents);
|
referencedSourceFiles.put(name, arrayContents);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (SAXException e) {
|
} catch (SAXException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (ParserConfigurationException e) {
|
} catch (ParserConfigurationException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Enumeration<ProjectTreeNode> children() {
|
public Enumeration<ProjectTreeNode> children() {
|
||||||
return v.getNonEmptyElements();
|
return v.getNonEmptyElements();
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public boolean getAllowsChildren() {
|
@Override
|
||||||
return true;
|
public boolean getAllowsChildren() {
|
||||||
}
|
return true;
|
||||||
@Override
|
}
|
||||||
public TreeNode getChildAt(int arg0) {
|
|
||||||
return v.getNonEmptyElementAt(arg0);
|
@Override
|
||||||
}
|
public TreeNode getChildAt(int arg0) {
|
||||||
@Override
|
return v.getNonEmptyElementAt(arg0);
|
||||||
public int getChildCount() {
|
}
|
||||||
return v.getNonEmptySize();
|
|
||||||
}
|
@Override
|
||||||
@Override
|
public int getChildCount() {
|
||||||
public int getIndex(TreeNode arg0) {
|
return v.getNonEmptySize();
|
||||||
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
}
|
||||||
}
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getParent() {
|
public int getIndex(TreeNode arg0) {
|
||||||
return parent;
|
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public boolean isLeaf() {
|
@Override
|
||||||
return false;
|
public TreeNode getParent() {
|
||||||
}
|
return parent;
|
||||||
@Override
|
}
|
||||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
|
||||||
path.add(0, this);
|
@Override
|
||||||
parent.childrenAdded(path);
|
public boolean isLeaf() {
|
||||||
}
|
return false;
|
||||||
@Override
|
}
|
||||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
|
||||||
path.add(0, this);
|
@Override
|
||||||
parent.childrenChanged(path);
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
}
|
path.add(0, this);
|
||||||
@Override
|
parent.childrenAdded(path);
|
||||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
}
|
||||||
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
|
||||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
@Override
|
||||||
} else {
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
path.add(0, this);
|
path.add(0, this);
|
||||||
parent.childrenRemoved(path);
|
parent.childrenChanged(path);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyCreated() {
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
||||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||||
node.notifyCreated();
|
} else {
|
||||||
}
|
path.add(0, this);
|
||||||
}
|
parent.childrenRemoved(path);
|
||||||
@Override
|
}
|
||||||
public String getDesc() {
|
}
|
||||||
switch(type) {
|
|
||||||
case altered: return (needsSaving() ? "*" : "")+"Altered data";
|
@Override
|
||||||
case created: return (needsSaving() ? "*" : "")+"Created data";
|
public void notifyCreated() {
|
||||||
case referenced: return (needsSaving() ? "*" : "")+"Referenced data";
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||||
case source: return (needsSaving() ? "*" : "")+"AT Source"; //The fact that it is from "source" is already mentionned by its parent.
|
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||||
default: return (needsSaving() ? "*" : "")+"Game data";
|
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
|
@Override
|
||||||
public Project getProject() {
|
public Project getProject() {
|
||||||
return parent == null ? null : parent.getProject();
|
return parent == null ? null : parent.getProject();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Image getIcon(String iconId) {
|
public Image getIcon(String iconId) {
|
||||||
String[] data = iconId.split(":");
|
String[] data = iconId.split(":");
|
||||||
for (Spritesheet sheet : gameSprites.spritesheets) {
|
for (Spritesheet sheet : gameSprites.spritesheets) {
|
||||||
if (sheet.id.equals(data[0])) {
|
if (sheet.id.equals(data[0])) {
|
||||||
return sheet.getIcon(Integer.parseInt(data[1]));
|
return sheet.getIcon(Integer.parseInt(data[1]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Image getImage(String iconId) {
|
public Image getImage(String iconId) {
|
||||||
String[] data = iconId.split(":");
|
String[] data = iconId.split(":");
|
||||||
for (Spritesheet sheet : gameSprites.spritesheets) {
|
for (Spritesheet sheet : gameSprites.spritesheets) {
|
||||||
if (sheet.id.equals(data[0])) {
|
if (sheet.id.equals(data[0])) {
|
||||||
return sheet.getImage(Integer.parseInt(data[1]));
|
return sheet.getImage(Integer.parseInt(data[1]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return getOpenIcon();
|
return getOpenIcon();
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public Image getClosedIcon() {
|
@Override
|
||||||
return DefaultIcons.getATClosedIcon();
|
public Image getClosedIcon() {
|
||||||
}
|
return DefaultIcons.getATClosedIcon();
|
||||||
@Override
|
}
|
||||||
public Image getLeafIcon() {
|
|
||||||
return DefaultIcons.getATClosedIcon();
|
@Override
|
||||||
}
|
public Image getLeafIcon() {
|
||||||
@Override
|
return DefaultIcons.getATClosedIcon();
|
||||||
public Image getOpenIcon() {
|
}
|
||||||
return DefaultIcons.getATOpenIcon();
|
|
||||||
}
|
@Override
|
||||||
@Override
|
public Image getOpenIcon() {
|
||||||
public GameDataSet getDataSet() {
|
return DefaultIcons.getATOpenIcon();
|
||||||
return null;
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
|
public GameDataSet getDataSet() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public Type getDataType() {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
return v.isEmpty();
|
return v.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public WorldmapSegment getWorldmapSegment(String id) {
|
public WorldmapSegment getWorldmapSegment(String id) {
|
||||||
return worldmap.getWorldmapSegment(id);
|
return worldmap.getWorldmapSegment(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean needsSaving() {
|
public boolean needsSaving() {
|
||||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||||
if (node.needsSaving()) return true;
|
if (node.needsSaving()) return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,53 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model;
|
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.io.Serializable;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class Preferences implements Serializable {
|
public class Preferences implements Serializable, JsonSerializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 2455802658424031276L;
|
private static final long serialVersionUID = 2455802658424031276L;
|
||||||
|
|
||||||
public Dimension windowSize = null;
|
public Dimension windowSize = null;
|
||||||
public Map<String, Integer> splittersPositions = new HashMap<String, Integer>();
|
public Map<String, Integer> splittersPositions = new HashMap<>();
|
||||||
|
|
||||||
public Preferences() {
|
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 interface ProjectElementListener {
|
||||||
|
|
||||||
public void elementAdded(GameDataElement added, int index);
|
public void elementAdded(GameDataElement added, int index);
|
||||||
|
|
||||||
public void elementRemoved(GameDataElement removed, int index);
|
public void elementRemoved(GameDataElement removed, int index);
|
||||||
|
|
||||||
public Class<? extends GameDataElement> getDataType();
|
public Class<? extends GameDataElement> getDataType();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,59 +1,64 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model;
|
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 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 interface ProjectTreeNode extends TreeNode {
|
||||||
|
|
||||||
public void childrenAdded(List<ProjectTreeNode> path);
|
public void childrenAdded(List<ProjectTreeNode> path);
|
||||||
public void childrenChanged(List<ProjectTreeNode> path);
|
|
||||||
public void childrenRemoved(List<ProjectTreeNode> path);
|
|
||||||
public void notifyCreated();
|
|
||||||
|
|
||||||
public String getDesc();
|
public void childrenChanged(List<ProjectTreeNode> path);
|
||||||
|
|
||||||
/**
|
public void childrenRemoved(List<ProjectTreeNode> path);
|
||||||
* Unnecessary for anything not below a Project. Can return null.
|
|
||||||
* @return the parent Project or null.
|
public void notifyCreated();
|
||||||
*/
|
|
||||||
public Project getProject();
|
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.
|
* Unnecessary for anything not below a GameDataSet. Can return null.
|
||||||
* @return the parent GameDataSet or null.
|
*
|
||||||
*/
|
* @return the parent GameDataSet or null.
|
||||||
public GameDataSet getDataSet();
|
*/
|
||||||
|
public GameDataSet getDataSet();
|
||||||
|
|
||||||
public Image getIcon();
|
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 icon depicting this node when it is an open folder. Can be null for leaves.
|
||||||
* @return the parent GameSource or null.
|
*/
|
||||||
*/
|
public Image getOpenIcon();
|
||||||
public GameSource.Type getDataType();
|
|
||||||
|
|
||||||
public boolean isEmpty();
|
/**
|
||||||
|
* @return The icon depicting this node when it is a closed folder. Can be null for leaves.
|
||||||
|
*/
|
||||||
|
public Image getClosedIcon();
|
||||||
|
|
||||||
public boolean needsSaving();
|
/**
|
||||||
|
* @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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,34 +2,34 @@ package com.gpl.rpg.atcontentstudio.model;
|
|||||||
|
|
||||||
public class SaveEvent {
|
public class SaveEvent {
|
||||||
|
|
||||||
public enum Type {
|
public enum Type {
|
||||||
moveToAltered,
|
moveToAltered,
|
||||||
moveToCreated,
|
moveToCreated,
|
||||||
alsoSave
|
alsoSave
|
||||||
}
|
}
|
||||||
|
|
||||||
public Type type;
|
public Type type;
|
||||||
public GameDataElement target;
|
public GameDataElement target;
|
||||||
|
|
||||||
public boolean error = false;
|
public boolean error = false;
|
||||||
public String errorText;
|
public String errorText;
|
||||||
|
|
||||||
public SaveEvent(SaveEvent.Type type, GameDataElement target) {
|
public SaveEvent(SaveEvent.Type type, GameDataElement target) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.target = target;
|
this.target = target;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SaveEvent(SaveEvent.Type type, GameDataElement target, boolean error, String errorText) {
|
public SaveEvent(SaveEvent.Type type, GameDataElement target, boolean error, String errorText) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.target = target;
|
this.target = target;
|
||||||
this.error = error;
|
this.error = error;
|
||||||
this.errorText = errorText;
|
this.errorText = errorText;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (!(obj instanceof SaveEvent)) return false;
|
if (!(obj instanceof SaveEvent)) return false;
|
||||||
else return (((SaveEvent)obj).type == this.type) && (((SaveEvent)obj).target == this.target);
|
else return (((SaveEvent) obj).type == this.type) && (((SaveEvent) obj).target == this.target);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,67 +5,67 @@ import java.util.Vector;
|
|||||||
|
|
||||||
public class SavedSlotCollection {
|
public class SavedSlotCollection {
|
||||||
|
|
||||||
Vector<ProjectTreeNode> contents = new Vector<ProjectTreeNode>();
|
Vector<ProjectTreeNode> contents = new Vector<ProjectTreeNode>();
|
||||||
|
|
||||||
public void add(ProjectTreeNode node) {
|
public void add(ProjectTreeNode node) {
|
||||||
contents.add(node);
|
contents.add(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getNonEmptySize() {
|
public int getNonEmptySize() {
|
||||||
// return contents.size();
|
// return contents.size();
|
||||||
int size = 0;
|
int size = 0;
|
||||||
for (ProjectTreeNode node : contents) {
|
for (ProjectTreeNode node : contents) {
|
||||||
if (!node.isEmpty()) size++;
|
if (!node.isEmpty()) size++;
|
||||||
}
|
}
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Enumeration<ProjectTreeNode> getNonEmptyElements() {
|
public Enumeration<ProjectTreeNode> getNonEmptyElements() {
|
||||||
// return contents.elements();
|
// return contents.elements();
|
||||||
Vector<ProjectTreeNode> v = new Vector<ProjectTreeNode>();
|
Vector<ProjectTreeNode> v = new Vector<ProjectTreeNode>();
|
||||||
for (ProjectTreeNode node : contents) {
|
for (ProjectTreeNode node : contents) {
|
||||||
if (!node.isEmpty()) v.add(node);
|
if (!node.isEmpty()) v.add(node);
|
||||||
}
|
}
|
||||||
return v.elements();
|
return v.elements();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProjectTreeNode getNonEmptyElementAt(int index) {
|
public ProjectTreeNode getNonEmptyElementAt(int index) {
|
||||||
// return contents.get(index);
|
// return contents.get(index);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i < contents.size()) {
|
while (i < contents.size()) {
|
||||||
if (!contents.get(i).isEmpty()) index--;
|
if (!contents.get(i).isEmpty()) index--;
|
||||||
if (index == -1) return contents.get(i);
|
if (index == -1) return contents.get(i);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public int getNonEmptyIndexOf(ProjectTreeNode node) {
|
public int getNonEmptyIndexOf(ProjectTreeNode node) {
|
||||||
// return contents.indexOf(node);
|
// return contents.indexOf(node);
|
||||||
int index = contents.indexOf(node);
|
int index = contents.indexOf(node);
|
||||||
int trueIndex = index;
|
int trueIndex = index;
|
||||||
for (int i = 0; i < trueIndex; i++) {
|
for (int i = 0; i < trueIndex; i++) {
|
||||||
if (contents.get(i).isEmpty()) index--;
|
if (contents.get(i).isEmpty()) index--;
|
||||||
}
|
}
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Vector<ProjectTreeNode> getNonEmptyIterable() {
|
public Vector<ProjectTreeNode> getNonEmptyIterable() {
|
||||||
// return contents;
|
// return contents;
|
||||||
Vector<ProjectTreeNode> v = new Vector<ProjectTreeNode>();
|
Vector<ProjectTreeNode> v = new Vector<ProjectTreeNode>();
|
||||||
for (ProjectTreeNode node : contents) {
|
for (ProjectTreeNode node : contents) {
|
||||||
if (!node.isEmpty()) v.add(node);
|
if (!node.isEmpty()) v.add(node);
|
||||||
}
|
}
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
// return contents.isEmpty();
|
// return contents.isEmpty();
|
||||||
for (ProjectTreeNode node : contents) {
|
for (ProjectTreeNode node : contents) {
|
||||||
if (!node.isEmpty()) return false;
|
if (!node.isEmpty()) return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,369 +1,423 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model;
|
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.ATContentStudio;
|
||||||
import com.gpl.rpg.atcontentstudio.Notification;
|
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.io.SettingsSave;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.ProjectsTree.ProjectsTreeModel;
|
import com.gpl.rpg.atcontentstudio.ui.ProjectsTree.ProjectsTreeModel;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.WorkerDialog;
|
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 static Workspace activeWorkspace;
|
||||||
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 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) {
|
public transient ProjectsTreeModel projectsTreeModel = null;
|
||||||
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 static void setActive(File workspaceRoot) {
|
public Workspace(File workspaceRoot) {
|
||||||
Workspace w = null;
|
boolean freshWorkspace = false;
|
||||||
File f = new File(workspaceRoot, WS_SETTINGS_FILE);
|
baseFolder = workspaceRoot;
|
||||||
if (!workspaceRoot.exists() || !f.exists()) {
|
if (!workspaceRoot.exists()) {
|
||||||
w = new Workspace(workspaceRoot);
|
try {
|
||||||
} else {
|
workspaceRoot.mkdir();
|
||||||
w = (Workspace) SettingsSave.loadInstance(f, "Workspace");
|
} catch (SecurityException e) {
|
||||||
if (w == null) {
|
Notification.addError("Error creating workspace directory: "
|
||||||
w = new Workspace(workspaceRoot);
|
+ e.getMessage());
|
||||||
} else {
|
e.printStackTrace();
|
||||||
w.refreshTransients();
|
}
|
||||||
}
|
}
|
||||||
}
|
settings = new WorkspaceSettings(this);
|
||||||
activeWorkspace = w;
|
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() {
|
@Override
|
||||||
activeWorkspace.save();
|
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() {
|
@Override
|
||||||
settings.save();
|
public void fromMap(Map map) {
|
||||||
SettingsSave.saveInstance(this, settingsFile, "Workspace");
|
if(serialVersionUID != (long) map.get("serialVersionUID")){
|
||||||
}
|
throw new SerializationException("wrong seriaVersionUID");
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
preferences.fromMap((Map) map.get("preferences"));
|
||||||
public Enumeration<ProjectTreeNode> children() {
|
|
||||||
return Collections.enumeration(projects);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
projectsName = new HashSet<>((List<String>) map.getOrDefault("projectsName", new HashSet<String>()));
|
||||||
public boolean getAllowsChildren() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
projectsOpenByName = (Map<String, Boolean>) map.getOrDefault("projectsOpenByName", new HashMap<String, Boolean>() );
|
||||||
public TreeNode getChildAt(int arg0) {
|
|
||||||
return projects.get(arg0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
List<String> knownMapSourcesFolders1 = (List<String>) map.getOrDefault("knownMapSourcesFolders", new ArrayList<String>());
|
||||||
public int getChildCount() {
|
knownMapSourcesFolders = new HashSet<>();
|
||||||
return projects.size();
|
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 static void setActive(File workspaceRoot) {
|
||||||
public TreeNode getParent() {
|
Workspace w;
|
||||||
return null;
|
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
|
private static Workspace loadWorkspaceFromJson(File workspaceRoot, File settingsFile) {
|
||||||
public boolean isLeaf() {
|
Workspace w = w = new Workspace(workspaceRoot);
|
||||||
return false;
|
Map json = FileUtils.mapFromJsonFile(settingsFile);
|
||||||
}
|
if (json!= null) {
|
||||||
|
w.fromMap(json);
|
||||||
|
}
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
public static void saveActive() {
|
||||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
activeWorkspace.save();
|
||||||
path.add(0, this);
|
}
|
||||||
if (projectsTreeModel != null)
|
|
||||||
projectsTreeModel.insertNode(new TreePath(path.toArray()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
public void save() {
|
||||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
settings.save();
|
||||||
path.add(0, this);
|
FileUtils.writeStringToFile(FileUtils.toJsonString(this), settingsFile, "Workspace");
|
||||||
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
|
||||||
ATContentStudio.frame.editorChanged(last);
|
public Enumeration<ProjectTreeNode> children() {
|
||||||
}
|
return Collections.enumeration(projects);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
public boolean getAllowsChildren() {
|
||||||
path.add(0, this);
|
return true;
|
||||||
if (projectsTreeModel != null)
|
}
|
||||||
projectsTreeModel.removeNode(new TreePath(path.toArray()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyCreated() {
|
public TreeNode getChildAt(int arg0) {
|
||||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
return projects.get(arg0);
|
||||||
for (ProjectTreeNode node : projects) {
|
}
|
||||||
if (node != null)
|
|
||||||
node.notifyCreated();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public int getChildCount() {
|
||||||
return "Workspace: " + baseFolder.getAbsolutePath();
|
return projects.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void createProject(final String projectName,
|
@Override
|
||||||
final File gameSourceFolder, final Project.ResourceSet sourceSet) {
|
public int getIndex(TreeNode arg0) {
|
||||||
WorkerDialog.showTaskMessage("Creating project " + projectName + "...",
|
return projects.indexOf(arg0);
|
||||||
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();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void closeProject(Project p) {
|
@Override
|
||||||
int index = activeWorkspace.projects.indexOf(p);
|
public TreeNode getParent() {
|
||||||
if (index < 0) {
|
return null;
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void openProject(final ClosedProject cp) {
|
@Override
|
||||||
WorkerDialog.showTaskMessage("Opening project " + cp.name + "...",
|
public boolean isLeaf() {
|
||||||
ATContentStudio.frame, new Runnable() {
|
return false;
|
||||||
@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();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void refreshTransients() {
|
@Override
|
||||||
this.settings = new WorkspaceSettings(this);
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
this.projects = new ArrayList<ProjectTreeNode>();
|
path.add(0, this);
|
||||||
Set<String> projectsFailed = new HashSet<String>();
|
if (projectsTreeModel != null)
|
||||||
for (String projectName : projectsName) {
|
projectsTreeModel.insertNode(new TreePath(path.toArray()));
|
||||||
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
|
@Override
|
||||||
public Project getProject() {
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
return null;
|
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 getIcon() {
|
ATContentStudio.frame.editorChanged(last);
|
||||||
return null;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getClosedIcon() {
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
return null;
|
path.add(0, this);
|
||||||
}
|
if (projectsTreeModel != null)
|
||||||
|
projectsTreeModel.removeNode(new TreePath(path.toArray()));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getLeafIcon() {
|
public void notifyCreated() {
|
||||||
return null;
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||||
}
|
for (ProjectTreeNode node : projects) {
|
||||||
|
if (node != null)
|
||||||
|
node.notifyCreated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getOpenIcon() {
|
public String getDesc() {
|
||||||
return null;
|
return "Workspace: " + baseFolder.getAbsolutePath();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void deleteProject(ClosedProject cp) {
|
public static void createProject(final String projectName,
|
||||||
cp.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
final File gameSourceFolder, final Project.ResourceSet sourceSet) {
|
||||||
activeWorkspace.projects.remove(cp);
|
WorkerDialog.showTaskMessage("Creating project " + projectName + "...",
|
||||||
activeWorkspace.projectsOpenByName.remove(cp.name);
|
ATContentStudio.frame, new Runnable() {
|
||||||
activeWorkspace.projectsName.remove(cp.name);
|
@Override
|
||||||
if (delete(new File(activeWorkspace.baseFolder, cp.name))) {
|
public void run() {
|
||||||
Notification.addSuccess("Closed project " + cp.name
|
if (activeWorkspace.projectsName.contains(projectName)) {
|
||||||
+ " successfully deleted.");
|
Notification.addError("A project named "
|
||||||
} else {
|
+ projectName
|
||||||
Notification.addError("Error while deleting closed project "
|
+ " already exists in this workspace.");
|
||||||
+ cp.name + ". Files may remain in the workspace.");
|
return;
|
||||||
}
|
}
|
||||||
cp = null;
|
Project p = new Project(activeWorkspace, projectName,
|
||||||
saveActive();
|
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();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public static void deleteProject(Project p) {
|
public static void closeProject(Project p) {
|
||||||
p.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
int index = activeWorkspace.projects.indexOf(p);
|
||||||
activeWorkspace.projects.remove(p);
|
if (index < 0) {
|
||||||
activeWorkspace.projectsOpenByName.remove(p.name);
|
Notification.addError("Cannot close unknown project " + p.name);
|
||||||
activeWorkspace.projectsName.remove(p.name);
|
return;
|
||||||
if (delete(p.baseFolder)) {
|
}
|
||||||
Notification.addSuccess("Project " + p.name
|
p.close();
|
||||||
+ " successfully deleted.");
|
ClosedProject cp = new ClosedProject(activeWorkspace, p.name);
|
||||||
} else {
|
activeWorkspace.projects.set(index, cp);
|
||||||
Notification.addError("Error while deleting project " + p.name
|
activeWorkspace.projectsOpenByName.put(p.name, false);
|
||||||
+ ". Files may remain in the workspace.");
|
cp.notifyCreated();
|
||||||
}
|
saveActive();
|
||||||
p = null;
|
}
|
||||||
saveActive();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean delete(File f) {
|
public static void openProject(final ClosedProject cp) {
|
||||||
boolean b = true;
|
WorkerDialog.showTaskMessage("Opening project " + cp.name + "...",
|
||||||
if (Files.isSymbolicLink(f.toPath())) {
|
ATContentStudio.frame, new Runnable() {
|
||||||
b &= f.delete();
|
@Override
|
||||||
} else if (f.isDirectory()) {
|
public void run() {
|
||||||
for (File c : f.listFiles())
|
int index = activeWorkspace.projects.indexOf(cp);
|
||||||
b &= delete(c);
|
if (index < 0) {
|
||||||
}
|
Notification
|
||||||
return b &= f.delete();
|
.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 void refreshTransients() {
|
||||||
public GameDataSet getDataSet() {
|
this.settings = new WorkspaceSettings(this);
|
||||||
return null;
|
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
|
@Override
|
||||||
public Type getDataType() {
|
public Project getProject() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public Image getIcon() {
|
||||||
return projects.isEmpty();
|
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
|
@Override
|
||||||
public boolean needsSaving() {
|
public boolean needsSaving() {
|
||||||
for (ProjectTreeNode node : projects) {
|
for (ProjectTreeNode node : projects) {
|
||||||
if (node.needsSaving()) return true;
|
if (node.needsSaving()) return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,220 +1,199 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model;
|
package com.gpl.rpg.atcontentstudio.model;
|
||||||
|
|
||||||
import java.io.File;
|
import com.gpl.rpg.atcontentstudio.Notification;
|
||||||
import java.io.FileReader;
|
import com.gpl.rpg.atcontentstudio.utils.FileUtils;
|
||||||
import java.io.FileWriter;
|
import org.json.simple.parser.JSONParser;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.StringWriter;
|
import java.io.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
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 class WorkspaceSettings {
|
||||||
|
|
||||||
public static final String VERSION_KEY = "ATCS_Version";
|
public static final String VERSION_KEY = "ATCS_Version";
|
||||||
public static final String FILENAME = "workspace_settings.json";
|
public static final String FILENAME = "workspace_settings.json";
|
||||||
|
|
||||||
public static final int SETTINGS_VERSION = 1;
|
public static final int SETTINGS_VERSION = 1;
|
||||||
|
|
||||||
public Workspace parent;
|
public Workspace parent;
|
||||||
public File file;
|
public File file;
|
||||||
|
|
||||||
public static Boolean DEFAULT_USE_SYS_MAP_EDITOR = true;
|
public static Boolean DEFAULT_USE_SYS_MAP_EDITOR = true;
|
||||||
public Setting<Boolean> useSystemDefaultMapEditor = new PrimitiveSetting<Boolean>("useSystemDefaultMapEditor", DEFAULT_USE_SYS_MAP_EDITOR);
|
public Setting<Boolean> useSystemDefaultMapEditor = new PrimitiveSetting<Boolean>("useSystemDefaultMapEditor", DEFAULT_USE_SYS_MAP_EDITOR);
|
||||||
public static String DEFAULT_MAP_EDITOR_COMMAND = "tiled";
|
public static String DEFAULT_MAP_EDITOR_COMMAND = "tiled";
|
||||||
public Setting<String> mapEditorCommand = new PrimitiveSetting<String>("mapEditorCommand", DEFAULT_MAP_EDITOR_COMMAND);
|
public Setting<String> mapEditorCommand = new PrimitiveSetting<String>("mapEditorCommand", DEFAULT_MAP_EDITOR_COMMAND);
|
||||||
|
|
||||||
public static Boolean DEFAULT_USE_SYS_IMG_VIEWER = true;
|
public static Boolean DEFAULT_USE_SYS_IMG_VIEWER = true;
|
||||||
public Setting<Boolean> useSystemDefaultImageViewer = new PrimitiveSetting<Boolean>("useSystemDefaultImageViewer", DEFAULT_USE_SYS_IMG_VIEWER);
|
public Setting<Boolean> useSystemDefaultImageViewer = new PrimitiveSetting<Boolean>("useSystemDefaultImageViewer", DEFAULT_USE_SYS_IMG_VIEWER);
|
||||||
public static Boolean DEFAULT_USE_SYS_IMG_EDITOR = false;
|
public static Boolean DEFAULT_USE_SYS_IMG_EDITOR = false;
|
||||||
public Setting<Boolean> useSystemDefaultImageEditor = new PrimitiveSetting<Boolean>("useSystemDefaultImageEditor", DEFAULT_USE_SYS_IMG_EDITOR);
|
public Setting<Boolean> useSystemDefaultImageEditor = new PrimitiveSetting<Boolean>("useSystemDefaultImageEditor", DEFAULT_USE_SYS_IMG_EDITOR);
|
||||||
public static String DEFAULT_IMG_EDITOR_COMMAND = "gimp";
|
public static String DEFAULT_IMG_EDITOR_COMMAND = "gimp";
|
||||||
public Setting<String> imageEditorCommand = new PrimitiveSetting<String>("imageEditorCommand", DEFAULT_IMG_EDITOR_COMMAND);
|
public Setting<String> imageEditorCommand = new PrimitiveSetting<String>("imageEditorCommand", DEFAULT_IMG_EDITOR_COMMAND);
|
||||||
|
|
||||||
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 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 Setting<String> translatorLanguage = new NullDefaultPrimitiveSetting<String>("translatorLanguage");
|
||||||
public static Boolean DEFAULT_ALLOW_INTERNET = true;
|
public static Boolean DEFAULT_ALLOW_INTERNET = true;
|
||||||
public Setting<Boolean> useInternet = new PrimitiveSetting<Boolean>("useInternet", DEFAULT_ALLOW_INTERNET);
|
public Setting<Boolean> useInternet = new PrimitiveSetting<Boolean>("useInternet", DEFAULT_ALLOW_INTERNET);
|
||||||
public static Boolean DEFAULT_CHECK_UPDATE = true;
|
public static Boolean DEFAULT_CHECK_UPDATE = true;
|
||||||
public Setting<Boolean> checkUpdates = new PrimitiveSetting<Boolean>("checkUpdates", DEFAULT_CHECK_UPDATE);
|
public Setting<Boolean> checkUpdates = new PrimitiveSetting<Boolean>("checkUpdates", DEFAULT_CHECK_UPDATE);
|
||||||
|
|
||||||
|
|
||||||
public List<Setting<? extends Object>> settings = new ArrayList<Setting<? extends Object>>();
|
public List<Setting<? extends Object>> settings = new ArrayList<Setting<? extends Object>>();
|
||||||
|
|
||||||
public WorkspaceSettings(Workspace parent) {
|
public WorkspaceSettings(Workspace parent) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
settings.add(useSystemDefaultMapEditor);
|
settings.add(useSystemDefaultMapEditor);
|
||||||
settings.add(mapEditorCommand);
|
settings.add(mapEditorCommand);
|
||||||
settings.add(useSystemDefaultImageViewer);
|
settings.add(useSystemDefaultImageViewer);
|
||||||
settings.add(useSystemDefaultImageEditor);
|
settings.add(useSystemDefaultImageEditor);
|
||||||
settings.add(imageEditorCommand);
|
settings.add(imageEditorCommand);
|
||||||
settings.add(translatorLanguage);
|
settings.add(translatorLanguage);
|
||||||
settings.add(useInternet);
|
settings.add(useInternet);
|
||||||
settings.add(checkUpdates);
|
settings.add(checkUpdates);
|
||||||
file = new File(parent.baseFolder, FILENAME);
|
file = new File(parent.baseFolder, FILENAME);
|
||||||
if (file.exists()) {
|
if (file.exists()) {
|
||||||
load(file);
|
load(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void load(File f) {
|
public void load(File f) {
|
||||||
JSONParser parser = new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
FileReader reader = null;
|
FileReader reader = null;
|
||||||
try {
|
try {
|
||||||
reader = new FileReader(f);
|
reader = new FileReader(f);
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
Map jsonSettings = (Map) parser.parse(reader);
|
Map jsonSettings = (Map) parser.parse(reader);
|
||||||
Integer version = ((Number) jsonSettings.get(VERSION_KEY)).intValue();
|
Integer version = ((Number) jsonSettings.get(VERSION_KEY)).intValue();
|
||||||
if (version != null) {
|
if (version != null) {
|
||||||
if (version >= 1) {
|
if (version >= 1) {
|
||||||
loadv1(jsonSettings);
|
loadv1(jsonSettings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Notification.addError("Error while parsing workspace settings: "+e.getMessage());
|
Notification.addError("Error while parsing workspace settings: " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
if (reader != null)
|
if (reader != null)
|
||||||
try {
|
try {
|
||||||
reader.close();
|
reader.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
private void loadv1(Map jsonSettings) {
|
private void loadv1(Map jsonSettings) {
|
||||||
for (Setting s : settings) {
|
for (Setting s : settings) {
|
||||||
s.readFromJson(jsonSettings);
|
s.readFromJson(jsonSettings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void save() {
|
public void save() {
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
Map json = new LinkedHashMap();
|
Map json = new LinkedHashMap();
|
||||||
for (Setting<? extends Object> s : settings) {
|
for (Setting<? extends Object> s : settings) {
|
||||||
s.saveToJson(json);
|
s.saveToJson(json);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (json.isEmpty()) {
|
if (json.isEmpty()) {
|
||||||
//Everything is default.
|
//Everything is default.
|
||||||
file.delete();
|
file.delete();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
json.put(VERSION_KEY, SETTINGS_VERSION);
|
json.put(VERSION_KEY, SETTINGS_VERSION);
|
||||||
StringWriter writer = new JsonPrettyWriter();
|
String toWrite = FileUtils.toJsonString(json);
|
||||||
try {
|
FileUtils.writeStringToFile(toWrite, file, "Workspace settings");
|
||||||
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() {
|
public void resetDefault() {
|
||||||
for (Setting<? extends Object> s : settings) {
|
for (Setting<? extends Object> s : settings) {
|
||||||
s.resetDefault();
|
s.resetDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract class Setting<X extends Object> {
|
public abstract class Setting<X extends Object> {
|
||||||
|
|
||||||
public String id;
|
public String id;
|
||||||
public X value, defaultValue;
|
public X value, defaultValue;
|
||||||
|
|
||||||
public void setCurrentValue(X value) {
|
public void setCurrentValue(X value) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public X getCurrentValue() {
|
public X getCurrentValue() {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public X getDefaultValue() {
|
public X getDefaultValue() {
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resetDefault() {
|
public void resetDefault() {
|
||||||
value = defaultValue;
|
value = defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void readFromJson(@SuppressWarnings("rawtypes") Map json);
|
public abstract void readFromJson(@SuppressWarnings("rawtypes") Map json);
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
public void saveToJson(Map json) {
|
public void saveToJson(Map json) {
|
||||||
if (!defaultValue.equals(value)) json.put(id, value);
|
if (!defaultValue.equals(value)) json.put(id, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class PrimitiveSetting<X extends Object> extends Setting<X> {
|
public class PrimitiveSetting<X extends Object> extends Setting<X> {
|
||||||
|
|
||||||
|
|
||||||
public PrimitiveSetting(String id, X defaultValue) {
|
public PrimitiveSetting(String id, X defaultValue) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.value = this.defaultValue = defaultValue;
|
this.value = this.defaultValue = defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
public void readFromJson(Map json) {
|
public void readFromJson(Map json) {
|
||||||
if (json.get(id) != null) value = (X)json.get(id);
|
if (json.get(id) != null) value = (X) json.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NullDefaultPrimitiveSetting<X extends Object> extends PrimitiveSetting<X> {
|
public class NullDefaultPrimitiveSetting<X extends Object> extends PrimitiveSetting<X> {
|
||||||
|
|
||||||
public NullDefaultPrimitiveSetting(String id) {
|
public NullDefaultPrimitiveSetting(String id) {
|
||||||
super(id, null);
|
super(id, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||||
@Override
|
@Override
|
||||||
public void saveToJson(Map json) {
|
public void saveToJson(Map json) {
|
||||||
if (value != null) json.put(id, value);
|
if (value != null) json.put(id, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ListSetting<X extends Object> extends Setting<List<X>> {
|
public class ListSetting<X extends Object> extends Setting<List<X>> {
|
||||||
|
|
||||||
public ListSetting(String id, List<X> defaultValue) {
|
public ListSetting(String id, List<X> defaultValue) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.value = this.defaultValue = defaultValue;
|
this.value = this.defaultValue = defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
@Override
|
@Override
|
||||||
public void readFromJson(Map json) {
|
public void readFromJson(Map json) {
|
||||||
value = new ArrayList<X>();
|
value = new ArrayList<X>();
|
||||||
if (json.get(id) != null) {
|
if (json.get(id) != null) {
|
||||||
for (Object o : ((List)json.get(id))) {
|
for (Object o : ((List) json.get(id))) {
|
||||||
value.add((X)o);
|
value.add((X) o);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,5 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.bookmarks;
|
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.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
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.Quest;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.QuestStage;
|
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 class BookmarkEntry implements BookmarkNode {
|
||||||
|
|
||||||
public GameDataElement bookmarkedElement;
|
public GameDataElement bookmarkedElement;
|
||||||
public BookmarkFolder parent;
|
public BookmarkFolder parent;
|
||||||
|
|
||||||
public BookmarkEntry(BookmarkFolder parent, GameDataElement target) {
|
public BookmarkEntry(BookmarkFolder parent, GameDataElement target) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.bookmarkedElement = target;
|
this.bookmarkedElement = target;
|
||||||
target.bookmark = this;
|
target.bookmark = this;
|
||||||
parent.contents.add(this);
|
parent.contents.add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Enumeration<ProjectTreeNode> children() {
|
public Enumeration<ProjectTreeNode> children() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getAllowsChildren() {
|
public boolean getAllowsChildren() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getChildAt(int childIndex) {
|
public TreeNode getChildAt(int childIndex) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getChildCount() {
|
public int getChildCount() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getIndex(TreeNode node) {
|
public int getIndex(TreeNode node) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getParent() {
|
public TreeNode getParent() {
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isLeaf() {
|
public boolean isLeaf() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenAdded(path);
|
parent.childrenAdded(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenChanged(path);
|
parent.childrenChanged(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenRemoved(path);
|
parent.childrenRemoved(path);
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public void notifyCreated() {
|
|
||||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public void notifyCreated() {
|
||||||
if (bookmarkedElement instanceof QuestStage) {
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||||
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
|
@Override
|
||||||
public Project getProject() {
|
public String getDesc() {
|
||||||
return parent.getProject();
|
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
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public Project getProject() {
|
||||||
return null;
|
return parent.getProject();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public GameDataSet getDataSet() {
|
||||||
return bookmarkedElement.getIcon();
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getOpenIcon() {
|
public Image getIcon() {
|
||||||
return null;
|
return bookmarkedElement.getIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getClosedIcon() {
|
public Image getOpenIcon() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getLeafIcon() {
|
public Image getClosedIcon() {
|
||||||
return getIcon();
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public Image getLeafIcon() {
|
||||||
return null;
|
return getIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public Type getDataType() {
|
||||||
return true;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean needsSaving() {
|
public boolean isEmpty() {
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void delete() {
|
@Override
|
||||||
bookmarkedElement.bookmark = null;
|
public boolean needsSaving() {
|
||||||
parent.delete(this);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void delete() {
|
||||||
public void save() {
|
bookmarkedElement.bookmark = null;
|
||||||
parent.save();
|
parent.delete(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void save() {
|
||||||
|
parent.save();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,168 +1,165 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.bookmarks;
|
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.GameSource.Type;
|
||||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
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 {
|
public class BookmarkFolder implements BookmarkNode {
|
||||||
|
|
||||||
List<BookmarkNode> contents = new LinkedList<BookmarkNode>();
|
List<BookmarkNode> contents = new LinkedList<BookmarkNode>();
|
||||||
BookmarkNode parent;
|
BookmarkNode parent;
|
||||||
String name;
|
String name;
|
||||||
Image closedIcon, openIcon;
|
Image closedIcon, openIcon;
|
||||||
|
|
||||||
public BookmarkFolder(BookmarkNode parent, String name) {
|
public BookmarkFolder(BookmarkNode parent, String name) {
|
||||||
this(parent, name, DefaultIcons.getStdClosedIcon(), DefaultIcons.getStdOpenIcon());
|
this(parent, name, DefaultIcons.getStdClosedIcon(), DefaultIcons.getStdOpenIcon());
|
||||||
}
|
}
|
||||||
|
|
||||||
public BookmarkFolder(BookmarkNode parent, String name, Image closedIcon, Image openIcon) {
|
public BookmarkFolder(BookmarkNode parent, String name, Image closedIcon, Image openIcon) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.closedIcon = closedIcon;
|
this.closedIcon = closedIcon;
|
||||||
this.openIcon = openIcon;
|
this.openIcon = openIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Enumeration<? extends ProjectTreeNode> children() {
|
public Enumeration<? extends ProjectTreeNode> children() {
|
||||||
return Collections.enumeration(contents);
|
return Collections.enumeration(contents);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getAllowsChildren() {
|
public boolean getAllowsChildren() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getChildAt(int childIndex) {
|
public TreeNode getChildAt(int childIndex) {
|
||||||
return contents.get(childIndex);
|
return contents.get(childIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getChildCount() {
|
public int getChildCount() {
|
||||||
return contents.size();
|
return contents.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getIndex(TreeNode node) {
|
public int getIndex(TreeNode node) {
|
||||||
return contents.indexOf(node);
|
return contents.indexOf(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getParent() {
|
public TreeNode getParent() {
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isLeaf() {
|
public boolean isLeaf() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenAdded(path);
|
parent.childrenAdded(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenChanged(path);
|
parent.childrenChanged(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||||
} else {
|
} else {
|
||||||
path.add(0, this);
|
path.add(0, this);
|
||||||
parent.childrenRemoved(path);
|
parent.childrenRemoved(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public void notifyCreated() {
|
|
||||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public void notifyCreated() {
|
||||||
return name;
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Project getProject() {
|
public String getDesc() {
|
||||||
return parent.getProject();
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public Project getProject() {
|
||||||
return null;
|
return parent.getProject();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public GameDataSet getDataSet() {
|
||||||
return getClosedIcon();
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getOpenIcon() {
|
public Image getIcon() {
|
||||||
return openIcon;
|
return getClosedIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getClosedIcon() {
|
public Image getOpenIcon() {
|
||||||
return closedIcon;
|
return openIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getLeafIcon() {
|
public Image getClosedIcon() {
|
||||||
return getClosedIcon();
|
return closedIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public Image getLeafIcon() {
|
||||||
return null;
|
return getClosedIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public Type getDataType() {
|
||||||
return contents.isEmpty();
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean needsSaving() {
|
public boolean isEmpty() {
|
||||||
return false;
|
return contents.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void delete(BookmarkEntry bookmarkEntry) {
|
@Override
|
||||||
if (contents.contains(bookmarkEntry)) {
|
public boolean needsSaving() {
|
||||||
bookmarkEntry.childrenRemoved(new ArrayList<ProjectTreeNode>());
|
return false;
|
||||||
contents.remove(bookmarkEntry);
|
}
|
||||||
save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void delete(BookmarkFolder bookmarkFolder) {
|
public void delete(BookmarkEntry bookmarkEntry) {
|
||||||
// TODO Auto-generated method stub
|
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() {
|
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;
|
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||||
|
|
||||||
public interface BookmarkNode extends ProjectTreeNode{
|
public interface BookmarkNode extends ProjectTreeNode {
|
||||||
|
|
||||||
public void save();
|
public void save();
|
||||||
public void delete();
|
|
||||||
|
public void delete();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,210 +1,206 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.bookmarks;
|
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.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
import com.gpl.rpg.atcontentstudio.model.Project;
|
||||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||||
import com.gpl.rpg.atcontentstudio.model.SavedSlotCollection;
|
import com.gpl.rpg.atcontentstudio.model.SavedSlotCollection;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.*;
|
||||||
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.maps.TMXMap;
|
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
||||||
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
|
import com.gpl.rpg.atcontentstudio.model.maps.WorldmapSegment;
|
||||||
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
|
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
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 {
|
public class BookmarksRoot implements BookmarkNode {
|
||||||
|
|
||||||
SavedSlotCollection v = new SavedSlotCollection();
|
SavedSlotCollection v = new SavedSlotCollection();
|
||||||
|
|
||||||
public transient Project parent = null;
|
public transient Project parent;
|
||||||
|
|
||||||
BookmarkFolder ac, diag, dl, it, ic, npc, q, tmx, sp, wm;
|
BookmarkFolder ac, diag, dl, it, ic, npc, q, tmx, sp, wm;
|
||||||
|
|
||||||
public BookmarksRoot(Project parent) {
|
public BookmarksRoot(Project parent) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
|
|
||||||
v.add(ac = new BookmarkFolder(this, ActorCondition.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
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(diag = new BookmarkFolder(this, Dialogue.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||||
v.add(dl = new BookmarkFolder(this, Droplist.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(it = new BookmarkFolder(this, Item.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||||
v.add(ic = new BookmarkFolder(this, ItemCategory.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(npc = new BookmarkFolder(this, NPC.getStaticDesc(), DefaultIcons.getJsonClosedIcon(), DefaultIcons.getJsonOpenIcon()));
|
||||||
v.add(q = new BookmarkFolder(this, Quest.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(tmx = new BookmarkFolder(this, "TMX Maps", DefaultIcons.getTmxClosedIcon(), DefaultIcons.getTmxOpenIcon()));
|
||||||
v.add(sp = new BookmarkFolder(this, "Spritesheets", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon()));
|
v.add(sp = new BookmarkFolder(this, "Spritesheets", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon()));
|
||||||
v.add(wm = new BookmarkFolder(this, "Worldmap", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon()));
|
v.add(wm = new BookmarkFolder(this, "Worldmap", DefaultIcons.getSpriteClosedIcon(), DefaultIcons.getSpriteOpenIcon()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Enumeration<ProjectTreeNode> children() {
|
public Enumeration<ProjectTreeNode> children() {
|
||||||
return v.getNonEmptyElements();
|
return v.getNonEmptyElements();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getAllowsChildren() {
|
public boolean getAllowsChildren() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getChildAt(int arg0) {
|
public TreeNode getChildAt(int arg0) {
|
||||||
return v.getNonEmptyElementAt(arg0);
|
return v.getNonEmptyElementAt(arg0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getChildCount() {
|
public int getChildCount() {
|
||||||
return v.getNonEmptySize();
|
return v.getNonEmptySize();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getIndex(TreeNode arg0) {
|
public int getIndex(TreeNode arg0) {
|
||||||
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getParent() {
|
public TreeNode getParent() {
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isLeaf() {
|
public boolean isLeaf() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
path.add(0, this);
|
path.add(0, this);
|
||||||
parent.childrenAdded(path);
|
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
|
@Override
|
||||||
public String getDesc() {
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
return (needsSaving() ? "*" : "")+"Bookmarks";
|
path.add(0, this);
|
||||||
}
|
parent.childrenChanged(path);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Project getProject() {
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
return parent == null ? null : parent.getProject();
|
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
||||||
}
|
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||||
|
} else {
|
||||||
|
path.add(0, this);
|
||||||
|
parent.childrenRemoved(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public void notifyCreated() {
|
||||||
return null;
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||||
}
|
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||||
|
node.notifyCreated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public String getDesc() {
|
||||||
return getOpenIcon();
|
return (needsSaving() ? "*" : "") + "Bookmarks";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getOpenIcon() {
|
public Project getProject() {
|
||||||
return DefaultIcons.getBookmarkOpenIcon();
|
return parent == null ? null : parent.getProject();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getClosedIcon() {
|
public GameDataSet getDataSet() {
|
||||||
return DefaultIcons.getBookmarkClosedIcon();
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getLeafIcon() {
|
public Image getIcon() {
|
||||||
return getClosedIcon();
|
return getOpenIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public Image getOpenIcon() {
|
||||||
return null;
|
return DefaultIcons.getBookmarkOpenIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public Image getClosedIcon() {
|
||||||
return v.isEmpty();
|
return DefaultIcons.getBookmarkClosedIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean needsSaving() {
|
public Image getLeafIcon() {
|
||||||
return false;
|
return getClosedIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save() {
|
@Override
|
||||||
|
public Type getDataType() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
@Override
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return v.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void delete() {}
|
public boolean needsSaving() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public void addBookmark(GameDataElement target) {
|
public void save() {
|
||||||
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();
|
@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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
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.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
@@ -9,364 +15,372 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
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 {
|
public class ActorCondition extends JSONElement {
|
||||||
|
|
||||||
private static final long serialVersionUID = -3969824899972048507L;
|
private static final long serialVersionUID = -3969824899972048507L;
|
||||||
|
|
||||||
public static final Integer MAGNITUDE_CLEAR = -99;
|
public static final Integer MAGNITUDE_CLEAR = -99;
|
||||||
public static final Integer DURATION_FOREVER = 999;;
|
public static final Integer DURATION_FOREVER = 999;
|
||||||
public static final Integer DURATION_NONE = 0;
|
public static final Integer DURATION_NONE = 0;
|
||||||
|
|
||||||
// Available from init state
|
// Available from init state
|
||||||
//public String id; inherited.
|
//public String id; inherited.
|
||||||
public String icon_id;
|
public String icon_id;
|
||||||
public String display_name;
|
public String display_name;
|
||||||
|
public String description;
|
||||||
|
|
||||||
// Available from parsed state
|
// Available from parsed state
|
||||||
public ACCategory category = null;
|
public ACCategory category = null;
|
||||||
public Integer positive = null;
|
public Integer positive = null;
|
||||||
public Integer stacking = null;
|
public Integer stacking = null;
|
||||||
public RoundEffect round_effect = null;
|
public RoundEffect round_effect = null;
|
||||||
public RoundEffect full_round_effect = null;
|
public RoundEffect full_round_effect = null;
|
||||||
public AbilityEffect constant_ability_effect = null;
|
public AbilityEffect constant_ability_effect = null;
|
||||||
|
|
||||||
public enum ACCategory {
|
public enum ACCategory {
|
||||||
spiritual,
|
spiritual,
|
||||||
mental,
|
mental,
|
||||||
physical,
|
physical,
|
||||||
blood
|
blood
|
||||||
}
|
}
|
||||||
|
|
||||||
public static enum VisualEffectID {
|
public static enum VisualEffectID {
|
||||||
redSplash
|
redSplash, blueSwirl, greenSplash, miss
|
||||||
,blueSwirl
|
}
|
||||||
,greenSplash
|
|
||||||
,miss
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class RoundEffect implements Cloneable {
|
public static class RoundEffect implements Cloneable {
|
||||||
// Available from parsed state
|
// Available from parsed state
|
||||||
public VisualEffectID visual_effect = null;
|
public VisualEffectID visual_effect = null;
|
||||||
public Integer hp_boost_min = null;
|
public Integer hp_boost_min = null;
|
||||||
public Integer hp_boost_max = null;
|
public Integer hp_boost_max = null;
|
||||||
public Integer ap_boost_min = null;
|
public Integer ap_boost_min = null;
|
||||||
public Integer ap_boost_max = null;
|
public Integer ap_boost_max = null;
|
||||||
|
|
||||||
public Object clone() {
|
public Object clone() {
|
||||||
try {
|
try {
|
||||||
return super.clone();
|
return super.clone();
|
||||||
} catch (CloneNotSupportedException e) {
|
} catch (CloneNotSupportedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class AbilityEffect implements Cloneable {
|
public static class AbilityEffect implements Cloneable {
|
||||||
// Available from parsed state
|
// Available from parsed state
|
||||||
public Integer max_hp_boost = null;
|
public Integer max_hp_boost = null;
|
||||||
public Integer max_ap_boost = null;
|
public Integer max_ap_boost = null;
|
||||||
public Integer increase_move_cost = null;
|
public Integer increase_move_cost = null;
|
||||||
public Integer increase_use_cost = null;
|
public Integer increase_use_cost = null;
|
||||||
public Integer increase_reequip_cost = null;
|
public Integer increase_reequip_cost = null;
|
||||||
public Integer increase_attack_cost = null;
|
public Integer increase_attack_cost = null;
|
||||||
public Integer increase_attack_chance = null;
|
public Integer increase_attack_chance = null;
|
||||||
public Integer increase_damage_min = null;
|
public Integer increase_damage_min = null;
|
||||||
public Integer increase_damage_max = null;
|
public Integer increase_damage_max = null;
|
||||||
public Integer increase_critical_skill = null;
|
public Integer increase_critical_skill = null;
|
||||||
public Integer increase_block_chance = null;
|
public Integer increase_block_chance = null;
|
||||||
public Integer increase_damage_resistance = null;
|
public Integer increase_damage_resistance = null;
|
||||||
|
|
||||||
public Object clone() {
|
public Object clone() {
|
||||||
try {
|
try {
|
||||||
return super.clone();
|
return super.clone();
|
||||||
} catch (CloneNotSupportedException e) {
|
} catch (CloneNotSupportedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
return (needsSaving() ? "*" : "")+display_name+" ("+id+")";
|
return (needsSaving() ? "*" : "") + display_name + " (" + id + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static void fromJson(File jsonFile, GameDataCategory<ActorCondition> category) {
|
public static void fromJson(File jsonFile, GameDataCategory<ActorCondition> category) {
|
||||||
JSONParser parser = new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
FileReader reader = null;
|
FileReader reader = null;
|
||||||
try {
|
try {
|
||||||
reader = new FileReader(jsonFile);
|
reader = new FileReader(jsonFile);
|
||||||
List actorConditions = (List) parser.parse(reader);
|
List actorConditions = (List) parser.parse(reader);
|
||||||
for (Object obj : actorConditions) {
|
for (Object obj : actorConditions) {
|
||||||
Map aCondJson = (Map)obj;
|
Map aCondJson = (Map) obj;
|
||||||
ActorCondition aCond = fromJson(aCondJson);
|
ActorCondition aCond = fromJson(aCondJson);
|
||||||
aCond.jsonFile = jsonFile;
|
aCond.jsonFile = jsonFile;
|
||||||
aCond.parent = category;
|
aCond.parent = category;
|
||||||
if (aCond.getDataType() == GameSource.Type.created || aCond.getDataType() == GameSource.Type.altered) {
|
if (aCond.getDataType() == GameSource.Type.created || aCond.getDataType() == GameSource.Type.altered) {
|
||||||
aCond.writable = true;
|
aCond.writable = true;
|
||||||
}
|
}
|
||||||
category.add(aCond);
|
category.add(aCond);
|
||||||
}
|
}
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
if (reader != null)
|
if (reader != null)
|
||||||
try {
|
try {
|
||||||
reader.close();
|
reader.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static ActorCondition fromJson(String jsonString) throws ParseException {
|
public static ActorCondition fromJson(String jsonString) throws ParseException {
|
||||||
Map aCondJson = (Map) new JSONParser().parse(jsonString);
|
Map aCondJson = (Map) new JSONParser().parse(jsonString);
|
||||||
ActorCondition aCond = fromJson(aCondJson);
|
ActorCondition aCond = fromJson(aCondJson);
|
||||||
aCond.parse(aCondJson);
|
aCond.parse(aCondJson);
|
||||||
return aCond;
|
return aCond;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static ActorCondition fromJson(Map aCondJson) {
|
public static ActorCondition fromJson(Map aCondJson) {
|
||||||
ActorCondition aCond = new ActorCondition();
|
ActorCondition aCond = new ActorCondition();
|
||||||
aCond.icon_id = (String) aCondJson.get("iconID");
|
aCond.icon_id = (String) aCondJson.get("iconID");
|
||||||
aCond.id = (String) aCondJson.get("id");
|
aCond.id = (String) aCondJson.get("id");
|
||||||
aCond.display_name = (String) aCondJson.get("name");
|
aCond.display_name = (String) aCondJson.get("name");
|
||||||
return aCond;
|
return aCond;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
@Override
|
@Override
|
||||||
public void parse(Map aCondJson) {
|
public void parse(Map aCondJson) {
|
||||||
|
|
||||||
if (aCondJson.get("category") != null) this.category = ACCategory.valueOf((String) aCondJson.get("category"));
|
if (aCondJson.get("description") != null) this.description = (String) aCondJson.get("description");
|
||||||
this.positive = JSONElement.getInteger((Number) aCondJson.get("isPositive"));
|
if (aCondJson.get("category") != null) this.category = ACCategory.valueOf((String) aCondJson.get("category"));
|
||||||
Map abilityEffect = (Map) aCondJson.get("abilityEffect");
|
this.positive = JSONElement.getInteger((Number) aCondJson.get("isPositive"));
|
||||||
if (abilityEffect != null) {
|
Map abilityEffect = (Map) aCondJson.get("abilityEffect");
|
||||||
this.constant_ability_effect = new AbilityEffect();
|
if (abilityEffect != null) {
|
||||||
this.constant_ability_effect.increase_attack_chance = JSONElement.getInteger((Number) abilityEffect.get("increaseAttackChance"));
|
this.constant_ability_effect = new AbilityEffect();
|
||||||
if (abilityEffect.get("increaseAttackDamage") != null) {
|
this.constant_ability_effect.increase_attack_chance = JSONElement.getInteger((Number) abilityEffect.get("increaseAttackChance"));
|
||||||
this.constant_ability_effect.increase_damage_min = JSONElement.getInteger((Number) (((Map)abilityEffect.get("increaseAttackDamage")).get("min")));
|
if (abilityEffect.get("increaseAttackDamage") != null) {
|
||||||
this.constant_ability_effect.increase_damage_max = JSONElement.getInteger((Number) (((Map)abilityEffect.get("increaseAttackDamage")).get("max")));
|
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.max_hp_boost = JSONElement.getInteger((Number) abilityEffect.get("increaseMaxHP"));
|
||||||
this.constant_ability_effect.increase_move_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseMoveCost"));
|
this.constant_ability_effect.max_ap_boost = JSONElement.getInteger((Number) abilityEffect.get("increaseMaxAP"));
|
||||||
this.constant_ability_effect.increase_use_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseUseItemCost"));
|
this.constant_ability_effect.increase_move_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseMoveCost"));
|
||||||
this.constant_ability_effect.increase_reequip_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseReequipCost"));
|
this.constant_ability_effect.increase_use_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseUseItemCost"));
|
||||||
this.constant_ability_effect.increase_attack_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseAttackCost"));
|
this.constant_ability_effect.increase_reequip_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseReequipCost"));
|
||||||
this.constant_ability_effect.increase_critical_skill = JSONElement.getInteger((Number) abilityEffect.get("increaseCriticalSkill"));
|
this.constant_ability_effect.increase_attack_cost = JSONElement.getInteger((Number) abilityEffect.get("increaseAttackCost"));
|
||||||
this.constant_ability_effect.increase_block_chance = JSONElement.getInteger((Number) abilityEffect.get("increaseBlockChance"));
|
this.constant_ability_effect.increase_critical_skill = JSONElement.getInteger((Number) abilityEffect.get("increaseCriticalSkill"));
|
||||||
this.constant_ability_effect.increase_damage_resistance = JSONElement.getInteger((Number) abilityEffect.get("increaseDamageResistance"));
|
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");
|
this.stacking = JSONElement.getInteger((Number) aCondJson.get("isStacking"));
|
||||||
if (roundEffect != null) {
|
Map roundEffect = (Map) aCondJson.get("roundEffect");
|
||||||
this.round_effect = new RoundEffect();
|
if (roundEffect != null) {
|
||||||
if (roundEffect.get("increaseCurrentHP") != null) {
|
this.round_effect = new RoundEffect();
|
||||||
this.round_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)roundEffect.get("increaseCurrentHP")).get("max")));
|
if (roundEffect.get("increaseCurrentHP") != null) {
|
||||||
this.round_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)roundEffect.get("increaseCurrentHP")).get("min")));
|
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")));
|
if (roundEffect.get("increaseCurrentAP") != null) {
|
||||||
this.round_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map)roundEffect.get("increaseCurrentAP")).get("min")));
|
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;
|
String vfx = (String) roundEffect.get("visualEffectID");
|
||||||
if (vfx != null) {
|
this.round_effect.visual_effect = null;
|
||||||
try {
|
if (vfx != null) {
|
||||||
this.round_effect.visual_effect = VisualEffectID.valueOf(vfx);
|
try {
|
||||||
} catch(IllegalArgumentException e) {}
|
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();
|
Map fullRoundEffect = (Map) aCondJson.get("fullRoundEffect");
|
||||||
if (fullRoundEffect.get("increaseCurrentHP") != null) {
|
if (fullRoundEffect != null) {
|
||||||
this.full_round_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map)fullRoundEffect.get("increaseCurrentHP")).get("max")));
|
this.full_round_effect = new RoundEffect();
|
||||||
this.full_round_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map)fullRoundEffect.get("increaseCurrentHP")).get("min")));
|
if (fullRoundEffect.get("increaseCurrentHP") != null) {
|
||||||
}
|
this.full_round_effect.hp_boost_max = JSONElement.getInteger((Number) (((Map) fullRoundEffect.get("increaseCurrentHP")).get("max")));
|
||||||
if (fullRoundEffect.get("increaseCurrentAP") != null) {
|
this.full_round_effect.hp_boost_min = JSONElement.getInteger((Number) (((Map) fullRoundEffect.get("increaseCurrentHP")).get("min")));
|
||||||
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")));
|
if (fullRoundEffect.get("increaseCurrentAP") != null) {
|
||||||
}
|
this.full_round_effect.ap_boost_max = JSONElement.getInteger((Number) (((Map) fullRoundEffect.get("increaseCurrentAP")).get("max")));
|
||||||
String vfx = (String) fullRoundEffect.get("visualEffectID");
|
this.full_round_effect.ap_boost_min = JSONElement.getInteger((Number) (((Map) fullRoundEffect.get("increaseCurrentAP")).get("min")));
|
||||||
this.full_round_effect.visual_effect = null;
|
}
|
||||||
if (vfx != null) {
|
String vfx = (String) fullRoundEffect.get("visualEffectID");
|
||||||
try {
|
this.full_round_effect.visual_effect = null;
|
||||||
this.full_round_effect.visual_effect = VisualEffectID.valueOf(vfx);
|
if (vfx != null) {
|
||||||
} catch(IllegalArgumentException e) {}
|
try {
|
||||||
}
|
this.full_round_effect.visual_effect = VisualEffectID.valueOf(vfx);
|
||||||
}
|
} catch (IllegalArgumentException e) {
|
||||||
this.state = State.parsed;
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.state = State.parsed;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
if (shouldSkipParseOrLink()) {
|
||||||
//This type of state is unrelated to parsing/linking.
|
return;
|
||||||
return;
|
}
|
||||||
}
|
ensureParseIfNeeded();
|
||||||
if (this.state == State.init) {
|
if (this.icon_id != null) {
|
||||||
//Not parsed yet.
|
String spritesheetId = this.icon_id.split(":")[0];
|
||||||
this.parse();
|
if (getProject().getSpritesheet(spritesheetId) == null) {
|
||||||
} else if (this.state == State.linked) {
|
System.out.println("Actor Condition");
|
||||||
//Already linked.
|
System.out.println(this.id);
|
||||||
return;
|
System.out.println("failed to load spritesheet:");
|
||||||
}
|
System.out.println(spritesheetId);
|
||||||
if (this.icon_id != null) {
|
System.out.println("while creating backlink for icon_id:");
|
||||||
String spritesheetId = this.icon_id.split(":")[0];
|
System.out.println(this.icon_id);
|
||||||
if (getProject().getSpritesheet(spritesheetId) == null) {
|
}
|
||||||
System.out.println(this.id);
|
getProject().getSpritesheet(spritesheetId).addBacklink(this);
|
||||||
}
|
}
|
||||||
getProject().getSpritesheet(spritesheetId).addBacklink(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.state = State.linked;
|
this.state = State.linked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String getStaticDesc() {
|
public static String getStaticDesc() {
|
||||||
return "Actor Conditions";
|
return "Actor Conditions";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return getProject().getIcon(icon_id);
|
return getProject().getIcon(icon_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Image getImage() {
|
public Image getImage() {
|
||||||
return getProject().getImage(icon_id);
|
return getProject().getImage(icon_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JSONElement clone() {
|
public JSONElement clone() {
|
||||||
ActorCondition clone = new ActorCondition();
|
ActorCondition clone = new ActorCondition();
|
||||||
clone.jsonFile = this.jsonFile;
|
clone.jsonFile = this.jsonFile;
|
||||||
clone.state = this.state;
|
clone.state = this.state;
|
||||||
clone.id = this.id;
|
clone.id = this.id;
|
||||||
clone.display_name = this.display_name;
|
clone.display_name = this.display_name;
|
||||||
clone.icon_id = this.icon_id;
|
clone.description = this.description;
|
||||||
clone.category = this.category;
|
clone.icon_id = this.icon_id;
|
||||||
clone.positive = this.positive;
|
clone.category = this.category;
|
||||||
clone.stacking = this.stacking;
|
clone.positive = this.positive;
|
||||||
if (this.round_effect != null) {
|
clone.stacking = this.stacking;
|
||||||
clone.round_effect = (RoundEffect) this.round_effect.clone();
|
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.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();
|
if (this.full_round_effect != null) {
|
||||||
}
|
clone.full_round_effect = (RoundEffect) this.full_round_effect.clone();
|
||||||
return clone;
|
}
|
||||||
}
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
//Nothing to link to.
|
//Nothing to link to.
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
@Override
|
@Override
|
||||||
public Map toJson() {
|
public Map toJson() {
|
||||||
Map jsonAC = new LinkedHashMap();
|
Map jsonAC = new LinkedHashMap();
|
||||||
jsonAC.put("id", this.id);
|
jsonAC.put("id", this.id);
|
||||||
if (this.icon_id != null) jsonAC.put("iconID", this.icon_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.display_name != null) jsonAC.put("name", this.display_name);
|
||||||
if (this.category != null) jsonAC.put("category", this.category.toString());
|
if (this.description != null) jsonAC.put("description", this.description);
|
||||||
if (this.positive != null && this.positive == 1) jsonAC.put("isPositive", this.positive);
|
if (this.category != null) jsonAC.put("category", this.category.toString());
|
||||||
if (this.stacking != null && this.stacking == 1) jsonAC.put("isStacking", this.stacking);
|
if (this.positive != null && this.positive == 1) jsonAC.put("isPositive", this.positive);
|
||||||
if (this.round_effect != null) {
|
if (this.stacking != null && this.stacking == 1) jsonAC.put("isStacking", this.stacking);
|
||||||
Map jsonRound = new LinkedHashMap();
|
if (this.round_effect != null) {
|
||||||
if (this.round_effect.visual_effect != null) jsonRound.put("visualEffectID", this.round_effect.visual_effect.toString());
|
Map jsonRound = new LinkedHashMap();
|
||||||
if (this.round_effect.hp_boost_min != null || this.round_effect.hp_boost_max != null) {
|
if (this.round_effect.visual_effect != null)
|
||||||
Map jsonHP = new LinkedHashMap();
|
jsonRound.put("visualEffectID", this.round_effect.visual_effect.toString());
|
||||||
if (this.round_effect.hp_boost_min != null) jsonHP.put("min", this.round_effect.hp_boost_min);
|
if (this.round_effect.hp_boost_min != null || this.round_effect.hp_boost_max != null) {
|
||||||
else jsonHP.put("min", 0);
|
Map jsonHP = new LinkedHashMap();
|
||||||
if (this.round_effect.hp_boost_max != null) jsonHP.put("max", this.round_effect.hp_boost_max);
|
if (this.round_effect.hp_boost_min != null) jsonHP.put("min", this.round_effect.hp_boost_min);
|
||||||
else jsonHP.put("max", 0);
|
else jsonHP.put("min", 0);
|
||||||
jsonRound.put("increaseCurrentHP", jsonHP);
|
if (this.round_effect.hp_boost_max != null) jsonHP.put("max", this.round_effect.hp_boost_max);
|
||||||
}
|
else jsonHP.put("max", 0);
|
||||||
if (this.round_effect.ap_boost_min != null || this.round_effect.ap_boost_max != null) {
|
jsonRound.put("increaseCurrentHP", jsonHP);
|
||||||
Map jsonAP = new LinkedHashMap();
|
}
|
||||||
if (this.round_effect.ap_boost_min != null) jsonAP.put("min", this.round_effect.ap_boost_min);
|
if (this.round_effect.ap_boost_min != null || this.round_effect.ap_boost_max != null) {
|
||||||
else jsonAP.put("min", 0);
|
Map jsonAP = new LinkedHashMap();
|
||||||
if (this.round_effect.ap_boost_max != null) jsonAP.put("max", this.round_effect.ap_boost_max);
|
if (this.round_effect.ap_boost_min != null) jsonAP.put("min", this.round_effect.ap_boost_min);
|
||||||
else jsonAP.put("max", 0);
|
else jsonAP.put("min", 0);
|
||||||
jsonRound.put("increaseCurrentAP", jsonAP);
|
if (this.round_effect.ap_boost_max != null) jsonAP.put("max", this.round_effect.ap_boost_max);
|
||||||
}
|
else jsonAP.put("max", 0);
|
||||||
jsonAC.put("roundEffect", jsonRound);
|
jsonRound.put("increaseCurrentAP", jsonAP);
|
||||||
}
|
}
|
||||||
if (this.full_round_effect != null) {
|
jsonAC.put("roundEffect", jsonRound);
|
||||||
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 != null) {
|
||||||
if (this.full_round_effect.hp_boost_min != null || this.full_round_effect.hp_boost_max != null) {
|
Map jsonFullRound = new LinkedHashMap();
|
||||||
Map jsonHP = new LinkedHashMap();
|
if (this.full_round_effect.visual_effect != null)
|
||||||
if (this.full_round_effect.hp_boost_min != null) jsonHP.put("min", this.full_round_effect.hp_boost_min);
|
jsonFullRound.put("visualEffectID", this.full_round_effect.visual_effect.toString());
|
||||||
else jsonHP.put("min", 0);
|
if (this.full_round_effect.hp_boost_min != null || this.full_round_effect.hp_boost_max != null) {
|
||||||
if (this.full_round_effect.hp_boost_max != null) jsonHP.put("max", this.full_round_effect.hp_boost_max);
|
Map jsonHP = new LinkedHashMap();
|
||||||
else jsonHP.put("max", 0);
|
if (this.full_round_effect.hp_boost_min != null) jsonHP.put("min", this.full_round_effect.hp_boost_min);
|
||||||
jsonFullRound.put("increaseCurrentHP", jsonHP);
|
else jsonHP.put("min", 0);
|
||||||
}
|
if (this.full_round_effect.hp_boost_max != null) jsonHP.put("max", this.full_round_effect.hp_boost_max);
|
||||||
if (this.full_round_effect.ap_boost_min != null || this.full_round_effect.ap_boost_max != null) {
|
else jsonHP.put("max", 0);
|
||||||
Map jsonAP = new LinkedHashMap();
|
jsonFullRound.put("increaseCurrentHP", jsonHP);
|
||||||
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_min != null || this.full_round_effect.ap_boost_max != null) {
|
||||||
if (this.full_round_effect.ap_boost_max != null) jsonAP.put("max", this.full_round_effect.ap_boost_max);
|
Map jsonAP = new LinkedHashMap();
|
||||||
else jsonAP.put("max", 0);
|
if (this.full_round_effect.ap_boost_min != null) jsonAP.put("min", this.full_round_effect.ap_boost_min);
|
||||||
jsonFullRound.put("increaseCurrentAP", jsonAP);
|
else jsonAP.put("min", 0);
|
||||||
}
|
if (this.full_round_effect.ap_boost_max != null) jsonAP.put("max", this.full_round_effect.ap_boost_max);
|
||||||
jsonAC.put("fullRoundEffect", jsonFullRound);
|
else jsonAP.put("max", 0);
|
||||||
}
|
jsonFullRound.put("increaseCurrentAP", jsonAP);
|
||||||
if (this.constant_ability_effect != null) {
|
}
|
||||||
Map jsonAbility = new LinkedHashMap();
|
jsonAC.put("fullRoundEffect", jsonFullRound);
|
||||||
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) {
|
if (this.constant_ability_effect != null) {
|
||||||
Map jsonAD = new LinkedHashMap();
|
Map jsonAbility = new LinkedHashMap();
|
||||||
if (this.constant_ability_effect.increase_damage_min != null) jsonAD.put("min", this.constant_ability_effect.increase_damage_min);
|
if (this.constant_ability_effect.increase_attack_chance != null)
|
||||||
else jsonAD.put("min", 0);
|
jsonAbility.put("increaseAttackChance", this.constant_ability_effect.increase_attack_chance);
|
||||||
if (this.constant_ability_effect.increase_damage_max != null) jsonAD.put("max", this.constant_ability_effect.increase_damage_max);
|
if (this.constant_ability_effect.increase_damage_min != null || this.constant_ability_effect.increase_damage_max != null) {
|
||||||
else jsonAD.put("max", 0);
|
Map jsonAD = new LinkedHashMap();
|
||||||
jsonAbility.put("increaseAttackDamage", jsonAD);
|
if (this.constant_ability_effect.increase_damage_min != null)
|
||||||
}
|
jsonAD.put("min", this.constant_ability_effect.increase_damage_min);
|
||||||
if (this.constant_ability_effect.max_hp_boost != null) jsonAbility.put("increaseMaxHP", this.constant_ability_effect.max_hp_boost);
|
else jsonAD.put("min", 0);
|
||||||
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_damage_max != null)
|
||||||
if (this.constant_ability_effect.increase_move_cost != null) jsonAbility.put("increaseMoveCost", this.constant_ability_effect.increase_move_cost);
|
jsonAD.put("max", this.constant_ability_effect.increase_damage_max);
|
||||||
if (this.constant_ability_effect.increase_use_cost != null) jsonAbility.put("increaseUseItemCost", this.constant_ability_effect.increase_use_cost);
|
else jsonAD.put("max", 0);
|
||||||
if (this.constant_ability_effect.increase_reequip_cost != null) jsonAbility.put("increaseReequipCost", this.constant_ability_effect.increase_reequip_cost);
|
jsonAbility.put("increaseAttackDamage", jsonAD);
|
||||||
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.max_hp_boost != null)
|
||||||
if (this.constant_ability_effect.increase_block_chance != null) jsonAbility.put("increaseBlockChance", this.constant_ability_effect.increase_block_chance);
|
jsonAbility.put("increaseMaxHP", this.constant_ability_effect.max_hp_boost);
|
||||||
if (this.constant_ability_effect.increase_damage_resistance != null) jsonAbility.put("increaseDamageResistance", this.constant_ability_effect.increase_damage_resistance);
|
if (this.constant_ability_effect.max_ap_boost != null)
|
||||||
jsonAC.put("abilityEffect", jsonAbility);
|
jsonAbility.put("increaseMaxAP", this.constant_ability_effect.max_ap_boost);
|
||||||
}
|
if (this.constant_ability_effect.increase_move_cost != null)
|
||||||
return jsonAC;
|
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
|
@Override
|
||||||
public String getProjectFilename() {
|
public String getProjectFilename() {
|
||||||
return "actorconditions_"+getProject().name+".json";
|
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;
|
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.Notification;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
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.gamedata.Requirement.RequirementType;
|
||||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
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 {
|
public class Dialogue extends JSONElement {
|
||||||
|
|
||||||
private static final long serialVersionUID = -6872164604703134683L;
|
private static final long serialVersionUID = -6872164604703134683L;
|
||||||
|
|
||||||
|
|
||||||
//Available from init state
|
//Available from init state
|
||||||
//public String id = null; inherited.
|
//public String id = null; inherited.
|
||||||
public String message = null;
|
public String message = null;
|
||||||
|
|
||||||
//Available from parsed state;
|
//Available from parsed state;
|
||||||
public List<Reward> rewards = null;
|
public List<Reward> rewards = null;
|
||||||
public List<Reply> replies = null;
|
public List<Reply> replies = null;
|
||||||
public String switch_to_npc_id = null;
|
public String switch_to_npc_id = null;
|
||||||
|
|
||||||
//Available from linked state;
|
//Available from linked state;
|
||||||
public NPC switch_to_npc = null;
|
public NPC switch_to_npc = null;
|
||||||
|
|
||||||
public static class Reward {
|
public static class Reward {
|
||||||
|
|
||||||
//Available from parsed state
|
//Available from parsed state
|
||||||
public RewardType type = null;
|
public RewardType type = null;
|
||||||
public String reward_obj_id = null;
|
public String reward_obj_id = null;
|
||||||
public Integer reward_value = null;
|
public Integer reward_value = null;
|
||||||
public String map_name = null;
|
public String map_name = null;
|
||||||
|
|
||||||
//Available from linked state
|
//Available from linked state
|
||||||
public GameDataElement reward_obj = null;
|
public GameDataElement reward_obj = null;
|
||||||
public TMXMap map = null;
|
public TMXMap map = null;
|
||||||
|
|
||||||
public enum RewardType {
|
public enum RewardType {
|
||||||
questProgress,
|
questProgress,
|
||||||
removeQuestProgress,
|
removeQuestProgress,
|
||||||
dropList,
|
dropList,
|
||||||
skillIncrease,
|
skillIncrease,
|
||||||
actorCondition,
|
actorCondition,
|
||||||
actorConditionImmunity,
|
actorConditionImmunity,
|
||||||
alignmentChange,
|
alignmentChange,
|
||||||
alignmentSet,
|
alignmentSet,
|
||||||
giveItem,
|
giveItem,
|
||||||
createTimer,
|
createTimer,
|
||||||
spawnAll,
|
spawnAll,
|
||||||
removeSpawnArea,
|
removeSpawnArea,
|
||||||
deactivateSpawnArea,
|
deactivateSpawnArea,
|
||||||
activateMapObjectGroup,
|
activateMapObjectGroup,
|
||||||
deactivateMapObjectGroup,
|
deactivateMapObjectGroup,
|
||||||
changeMapFilter
|
changeMapFilter,
|
||||||
}
|
mapchange
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class Reply {
|
public static class Reply {
|
||||||
|
|
||||||
public static final String GO_NEXT_TEXT = "N";
|
public static final String GO_NEXT_TEXT = "N";
|
||||||
public static final String SHOP_PHRASE_ID = "S";
|
public static final String SHOP_PHRASE_ID = "S";
|
||||||
public static final String FIGHT_PHRASE_ID = "F";
|
public static final String FIGHT_PHRASE_ID = "F";
|
||||||
public static final String EXIT_PHRASE_ID = "X";
|
public static final String EXIT_PHRASE_ID = "X";
|
||||||
public static final String REMOVE_PHRASE_ID = "R";
|
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});
|
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
|
//Available from parsed state
|
||||||
public String text = null;
|
public String text = null;
|
||||||
public String next_phrase_id = null;
|
public String next_phrase_id = null;
|
||||||
public List<Requirement> requirements = null;
|
public List<Requirement> requirements = null;
|
||||||
|
|
||||||
//Available from linked state
|
//Available from linked state
|
||||||
public Dialogue next_phrase = null;
|
public Dialogue next_phrase = null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
return (needsSaving() ? "*" : "")+id;
|
return (needsSaving() ? "*" : "") + id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getStaticDesc() {
|
public static String getStaticDesc() {
|
||||||
return "Dialogues";
|
return "Dialogues";
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static void fromJson(File jsonFile, GameDataCategory<Dialogue> category) {
|
public static void fromJson(File jsonFile, GameDataCategory<Dialogue> category) {
|
||||||
JSONParser parser = new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
FileReader reader = null;
|
FileReader reader = null;
|
||||||
try {
|
try {
|
||||||
reader = new FileReader(jsonFile);
|
reader = new FileReader(jsonFile);
|
||||||
List dialogues = (List) parser.parse(reader);
|
List dialogues = (List) parser.parse(reader);
|
||||||
for (Object obj : dialogues) {
|
for (Object obj : dialogues) {
|
||||||
Map dialogueJson = (Map)obj;
|
Map dialogueJson = (Map) obj;
|
||||||
Dialogue dialogue = fromJson(dialogueJson);
|
Dialogue dialogue = fromJson(dialogueJson);
|
||||||
dialogue.jsonFile = jsonFile;
|
dialogue.jsonFile = jsonFile;
|
||||||
dialogue.parent = category;
|
dialogue.parent = category;
|
||||||
if (dialogue.getDataType() == GameSource.Type.created || dialogue.getDataType() == GameSource.Type.altered) {
|
if (dialogue.getDataType() == GameSource.Type.created || dialogue.getDataType() == GameSource.Type.altered) {
|
||||||
dialogue.writable = true;
|
dialogue.writable = true;
|
||||||
}
|
}
|
||||||
category.add(dialogue);
|
category.add(dialogue);
|
||||||
}
|
}
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
if (reader != null)
|
if (reader != null)
|
||||||
try {
|
try {
|
||||||
reader.close();
|
reader.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static Dialogue fromJson(String jsonString) throws ParseException {
|
public static Dialogue fromJson(String jsonString) throws ParseException {
|
||||||
Map dialogueJson = (Map) new JSONParser().parse(jsonString);
|
Map dialogueJson = (Map) new JSONParser().parse(jsonString);
|
||||||
Dialogue dialogue = fromJson(dialogueJson);
|
Dialogue dialogue = fromJson(dialogueJson);
|
||||||
dialogue.parse(dialogueJson);
|
dialogue.parse(dialogueJson);
|
||||||
return dialogue;
|
return dialogue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static Dialogue fromJson(Map dialogueJson) {
|
public static Dialogue fromJson(Map dialogueJson) {
|
||||||
Dialogue dialogue = new Dialogue();
|
Dialogue dialogue = new Dialogue();
|
||||||
dialogue.id = (String) dialogueJson.get("id");
|
dialogue.id = (String) dialogueJson.get("id");
|
||||||
dialogue.message = (String) dialogueJson.get("message");
|
dialogue.message = (String) dialogueJson.get("message");
|
||||||
return dialogue;
|
return dialogue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
@Override
|
@Override
|
||||||
public void parse(Map dialogueJson) {
|
public void parse(Map dialogueJson) {
|
||||||
this.switch_to_npc_id = (String) dialogueJson.get("switchToNPC");
|
this.switch_to_npc_id = (String) dialogueJson.get("switchToNPC");
|
||||||
List repliesJson = (List) dialogueJson.get("replies");
|
List repliesJson = (List) dialogueJson.get("replies");
|
||||||
if (repliesJson != null && !repliesJson.isEmpty()) {
|
if (repliesJson != null && !repliesJson.isEmpty()) {
|
||||||
this.replies = new ArrayList<Dialogue.Reply>();
|
this.replies = new ArrayList<Dialogue.Reply>();
|
||||||
for (Object replyJsonObj : repliesJson) {
|
for (Object replyJsonObj : repliesJson) {
|
||||||
Map replyJson = (Map)replyJsonObj;
|
Map replyJson = (Map) replyJsonObj;
|
||||||
Reply reply = new Reply();
|
Reply reply = new Reply();
|
||||||
reply.text = (String) replyJson.get("text");
|
reply.text = (String) replyJson.get("text");
|
||||||
reply.next_phrase_id = (String) replyJson.get("nextPhraseID");
|
reply.next_phrase_id = (String) replyJson.get("nextPhraseID");
|
||||||
List requirementsJson = (List) replyJson.get("requires");
|
List requirementsJson = (List) replyJson.get("requires");
|
||||||
if (requirementsJson != null && !requirementsJson.isEmpty()) {
|
if (requirementsJson != null && !requirementsJson.isEmpty()) {
|
||||||
reply.requirements = new ArrayList<Requirement>();
|
reply.requirements = new ArrayList<Requirement>();
|
||||||
for (Object requirementJsonObj : requirementsJson) {
|
for (Object requirementJsonObj : requirementsJson) {
|
||||||
Map requirementJson = (Map) requirementJsonObj;
|
Map requirementJson = (Map) requirementJsonObj;
|
||||||
Requirement requirement = new Requirement();
|
Requirement requirement = new Requirement();
|
||||||
requirement.jsonFile = this.jsonFile;
|
requirement.jsonFile = this.jsonFile;
|
||||||
requirement.parent = this;
|
requirement.parent = this;
|
||||||
if (requirementJson.get("requireType") != null) requirement.type = RequirementType.valueOf((String) requirementJson.get("requireType"));
|
if (requirementJson.get("requireType") != null)
|
||||||
requirement.required_obj_id = (String) requirementJson.get("requireID");
|
requirement.type = RequirementType.valueOf((String) requirementJson.get("requireType"));
|
||||||
if (requirementJson.get("value") != null) requirement.required_value = JSONElement.getInteger(Integer.parseInt(requirementJson.get("value").toString()));
|
requirement.required_obj_id = (String) requirementJson.get("requireID");
|
||||||
if (requirementJson.get("negate") != null) requirement.negated = (Boolean) requirementJson.get("negate");
|
if (requirementJson.get("value") != null)
|
||||||
requirement.state = State.parsed;
|
requirement.required_value = JSONElement.getInteger(Integer.parseInt(requirementJson.get("value").toString()));
|
||||||
reply.requirements.add(requirement);
|
if (requirementJson.get("negate") != null)
|
||||||
}
|
requirement.negated = (Boolean) requirementJson.get("negate");
|
||||||
}
|
requirement.state = State.parsed;
|
||||||
this.replies.add(reply);
|
reply.requirements.add(requirement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
List rewardsJson = (List) dialogueJson.get("rewards");
|
this.replies.add(reply);
|
||||||
if (rewardsJson != null && !rewardsJson.isEmpty()) {
|
}
|
||||||
this.rewards = new ArrayList<Dialogue.Reward>();
|
}
|
||||||
for (Object rewardJsonObj : rewardsJson) {
|
List rewardsJson = (List) dialogueJson.get("rewards");
|
||||||
Map rewardJson = (Map)rewardJsonObj;
|
if (rewardsJson != null && !rewardsJson.isEmpty()) {
|
||||||
Reward reward = new Reward();
|
this.rewards = new ArrayList<Dialogue.Reward>();
|
||||||
if (rewardJson.get("rewardType") != null) reward.type = Reward.RewardType.valueOf((String) rewardJson.get("rewardType"));
|
for (Object rewardJsonObj : rewardsJson) {
|
||||||
if (rewardJson.get("rewardID") != null) reward.reward_obj_id = (String) rewardJson.get("rewardID");
|
Map rewardJson = (Map) rewardJsonObj;
|
||||||
if (rewardJson.get("value") != null) reward.reward_value = JSONElement.getInteger((Number) rewardJson.get("value"));
|
Reward reward = new Reward();
|
||||||
if (rewardJson.get("mapName") != null) reward.map_name = (String) rewardJson.get("mapName");
|
if (rewardJson.get("rewardType") != null)
|
||||||
this.rewards.add(reward);
|
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)
|
||||||
this.state = State.parsed;
|
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
|
@Override
|
||||||
public void link() {
|
public Image getIcon() {
|
||||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
return DefaultIcons.getDialogueIcon();
|
||||||
//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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
public Image getImage() {
|
||||||
|
return DefaultIcons.getDialogueImage();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public GameDataElement clone() {
|
||||||
return DefaultIcons.getDialogueIcon();
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Image getImage() {
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
return DefaultIcons.getDialogueImage();
|
@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
|
@Override
|
||||||
public GameDataElement clone() {
|
public String getProjectFilename() {
|
||||||
Dialogue clone = new Dialogue();
|
return "conversationlist_" + getProject().name + ".json";
|
||||||
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";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
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.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
@@ -10,233 +18,216 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
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 {
|
public class Droplist extends JSONElement {
|
||||||
|
|
||||||
private static final long serialVersionUID = -2903944916807382571L;
|
private static final long serialVersionUID = -2903944916807382571L;
|
||||||
|
|
||||||
//Available from init state
|
//Available from init state
|
||||||
//public String id = null; inherited.
|
//public String id = null; inherited.
|
||||||
|
|
||||||
//Available from parsed state;
|
//Available from parsed state;
|
||||||
public List<DroppedItem> dropped_items = null;
|
public List<DroppedItem> dropped_items = null;
|
||||||
|
|
||||||
//Available from linked state;
|
//Available from linked state;
|
||||||
//None
|
//None
|
||||||
|
|
||||||
public static class DroppedItem {
|
public static class DroppedItem {
|
||||||
//Available from parsed state;
|
//Available from parsed state;
|
||||||
public String item_id = null;
|
public String item_id = null;
|
||||||
public String chance = null;
|
public String chance = null;
|
||||||
public Integer quantity_min = null;
|
public Integer quantity_min = null;
|
||||||
public Integer quantity_max = null;
|
public Integer quantity_max = null;
|
||||||
|
|
||||||
//Available from linked state;
|
//Available from linked state;
|
||||||
public Item item = null;
|
public Item item = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
return (needsSaving() ? "*" : "")+id;
|
return (needsSaving() ? "*" : "") + id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getStaticDesc() {
|
public static String getStaticDesc() {
|
||||||
return "Droplists";
|
return "Droplists";
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static void fromJson(File jsonFile, GameDataCategory<Droplist> category) {
|
public static void fromJson(File jsonFile, GameDataCategory<Droplist> category) {
|
||||||
JSONParser parser = new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
FileReader reader = null;
|
FileReader reader = null;
|
||||||
try {
|
try {
|
||||||
reader = new FileReader(jsonFile);
|
reader = new FileReader(jsonFile);
|
||||||
List droplists = (List) parser.parse(reader);
|
List droplists = (List) parser.parse(reader);
|
||||||
for (Object obj : droplists) {
|
for (Object obj : droplists) {
|
||||||
Map droplistJson = (Map)obj;
|
Map droplistJson = (Map) obj;
|
||||||
Droplist droplist = fromJson(droplistJson);
|
Droplist droplist = fromJson(droplistJson);
|
||||||
droplist.jsonFile = jsonFile;
|
droplist.jsonFile = jsonFile;
|
||||||
droplist.parent = category;
|
droplist.parent = category;
|
||||||
if (droplist.getDataType() == GameSource.Type.created || droplist.getDataType() == GameSource.Type.altered) {
|
if (droplist.getDataType() == GameSource.Type.created || droplist.getDataType() == GameSource.Type.altered) {
|
||||||
droplist.writable = true;
|
droplist.writable = true;
|
||||||
}
|
}
|
||||||
category.add(droplist);
|
category.add(droplist);
|
||||||
}
|
}
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
if (reader != null)
|
if (reader != null)
|
||||||
try {
|
try {
|
||||||
reader.close();
|
reader.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static Droplist fromJson(String jsonString) throws ParseException {
|
public static Droplist fromJson(String jsonString) throws ParseException {
|
||||||
Map droplistJson = (Map) new JSONParser().parse(jsonString);
|
Map droplistJson = (Map) new JSONParser().parse(jsonString);
|
||||||
Droplist droplist = fromJson(droplistJson);
|
Droplist droplist = fromJson(droplistJson);
|
||||||
droplist.parse(droplistJson);
|
droplist.parse(droplistJson);
|
||||||
return droplist;
|
return droplist;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static Droplist fromJson(Map droplistJson) {
|
public static Droplist fromJson(Map droplistJson) {
|
||||||
Droplist droplist = new Droplist();
|
Droplist droplist = new Droplist();
|
||||||
droplist.id = (String) droplistJson.get("id");
|
droplist.id = (String) droplistJson.get("id");
|
||||||
return droplist;
|
return droplist;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
@Override
|
@Override
|
||||||
public void parse(Map droplistJson) {
|
public void parse(Map droplistJson) {
|
||||||
List droppedItemsJson = (List) droplistJson.get("items");
|
List droppedItemsJson = (List) droplistJson.get("items");
|
||||||
if (droppedItemsJson != null && !droppedItemsJson.isEmpty()) {
|
if (droppedItemsJson != null && !droppedItemsJson.isEmpty()) {
|
||||||
this.dropped_items = new ArrayList<DroppedItem>();
|
this.dropped_items = new ArrayList<DroppedItem>();
|
||||||
for (Object droppedItemJsonObj : droppedItemsJson) {
|
for (Object droppedItemJsonObj : droppedItemsJson) {
|
||||||
Map droppedItemJson = (Map)droppedItemJsonObj;
|
Map droppedItemJson = (Map) droppedItemJsonObj;
|
||||||
DroppedItem droppedItem = new DroppedItem();
|
DroppedItem droppedItem = new DroppedItem();
|
||||||
droppedItem.item_id = (String) droppedItemJson.get("itemID");
|
droppedItem.item_id = (String) droppedItemJson.get("itemID");
|
||||||
//if (droppedItemJson.get("chance") != null) droppedItem.chance = JSONElement.parseChance(droppedItemJson.get("chance").toString());
|
//if (droppedItemJson.get("chance") != null) droppedItem.chance = JSONElement.parseChance(droppedItemJson.get("chance").toString());
|
||||||
droppedItem.chance = (String) droppedItemJson.get("chance");
|
droppedItem.chance = (String) droppedItemJson.get("chance");
|
||||||
Map droppedItemQtyJson = (Map) droppedItemJson.get("quantity");
|
Map droppedItemQtyJson = (Map) droppedItemJson.get("quantity");
|
||||||
if (droppedItemQtyJson != null) {
|
if (droppedItemQtyJson != null) {
|
||||||
droppedItem.quantity_min = JSONElement.getInteger((Number) droppedItemQtyJson.get("min"));
|
droppedItem.quantity_min = JSONElement.getInteger((Number) droppedItemQtyJson.get("min"));
|
||||||
droppedItem.quantity_max = JSONElement.getInteger((Number) droppedItemQtyJson.get("max"));
|
droppedItem.quantity_max = JSONElement.getInteger((Number) droppedItemQtyJson.get("max"));
|
||||||
}
|
}
|
||||||
this.dropped_items.add(droppedItem);
|
this.dropped_items.add(droppedItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.state = State.parsed;
|
this.state = State.parsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
if (shouldSkipParseOrLink()) {
|
||||||
//This type of state is unrelated to parsing/linking.
|
return;
|
||||||
return;
|
}
|
||||||
}
|
ensureParseIfNeeded();
|
||||||
if (this.state == State.init) {
|
Project proj = getProject();
|
||||||
//Not parsed yet.
|
if (proj == null) {
|
||||||
this.parse();
|
Notification.addError("Error linking droplist " + id + ". No parent project found.");
|
||||||
} else if (this.state == State.linked) {
|
return;
|
||||||
//Already linked.
|
}
|
||||||
return;
|
if (dropped_items != null) {
|
||||||
}
|
for (DroppedItem droppedItem : dropped_items) {
|
||||||
Project proj = getProject();
|
if (droppedItem.item_id != null) droppedItem.item = proj.getItem(droppedItem.item_id);
|
||||||
if (proj == null) {
|
if (droppedItem.item != null) droppedItem.item.addBacklink(this);
|
||||||
Notification.addError("Error linking droplist "+id+". No parent project found.");
|
}
|
||||||
return;
|
}
|
||||||
}
|
this.state = State.linked;
|
||||||
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();
|
||||||
|
}
|
||||||
|
|
||||||
public static Image getImage() {
|
@Override
|
||||||
return DefaultIcons.getDroplistImage();
|
public Image getIcon() {
|
||||||
}
|
return DefaultIcons.getDroplistIcon();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public GameDataElement clone() {
|
||||||
return DefaultIcons.getDroplistIcon();
|
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
|
@Override
|
||||||
public GameDataElement clone() {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
Droplist clone = new Droplist();
|
if (dropped_items != null) {
|
||||||
clone.jsonFile = this.jsonFile;
|
for (DroppedItem di : dropped_items) {
|
||||||
clone.state = this.state;
|
if (di.item == oldOne) {
|
||||||
clone.id = this.id;
|
oldOne.removeBacklink(this);
|
||||||
if (this.dropped_items != null) {
|
di.item = (Item) newOne;
|
||||||
clone.dropped_items = new ArrayList<Droplist.DroppedItem>();
|
if (newOne != null) newOne.addBacklink(this);
|
||||||
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
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
@Override
|
||||||
if (dropped_items != null) {
|
public Map toJson() {
|
||||||
for (DroppedItem di : dropped_items) {
|
Map droplistJson = new LinkedHashMap();
|
||||||
if (di.item == oldOne) {
|
droplistJson.put("id", this.id);
|
||||||
oldOne.removeBacklink(this);
|
if (this.dropped_items != null) {
|
||||||
di.item = (Item) newOne;
|
List droppedItemsJson = new ArrayList();
|
||||||
if (newOne != null) newOne.addBacklink(this);
|
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);
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
} else if (droppedItem.item_id != null) {
|
||||||
@Override
|
droppedItemJson.put("itemID", droppedItem.item_id);
|
||||||
public Map toJson() {
|
}
|
||||||
Map droplistJson = new LinkedHashMap();
|
//if (droppedItem.chance != null) droppedItemJson.put("chance", JSONElement.printJsonChance(droppedItem.chance));
|
||||||
droplistJson.put("id", this.id);
|
if (droppedItem.chance != null) droppedItemJson.put("chance", droppedItem.chance);
|
||||||
if (this.dropped_items != null) {
|
if (droppedItem.quantity_min != null || droppedItem.quantity_max != null) {
|
||||||
List droppedItemsJson = new ArrayList();
|
Map quantityJson = new LinkedHashMap();
|
||||||
droplistJson.put("items", droppedItemsJson);
|
droppedItemJson.put("quantity", quantityJson);
|
||||||
for (DroppedItem droppedItem : this.dropped_items) {
|
if (droppedItem.quantity_min != null) quantityJson.put("min", droppedItem.quantity_min);
|
||||||
Map droppedItemJson = new LinkedHashMap();
|
else quantityJson.put("min", 0);
|
||||||
droppedItemsJson.add(droppedItemJson);
|
if (droppedItem.quantity_max != null) quantityJson.put("max", droppedItem.quantity_max);
|
||||||
if (droppedItem.item != null) {
|
else quantityJson.put("max", 0);
|
||||||
droppedItemJson.put("itemID", droppedItem.item.id);
|
}
|
||||||
} else if (droppedItem.item_id != null) {
|
}
|
||||||
droppedItemJson.put("itemID", droppedItem.item_id);
|
}
|
||||||
}
|
return droplistJson;
|
||||||
//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
|
@Override
|
||||||
public String getProjectFilename() {
|
public String getProjectFilename() {
|
||||||
return "droplists_"+getProject().name+".json";
|
return "droplists_" + getProject().name + ".json";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,253 +1,321 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
||||||
|
|
||||||
import java.awt.Image;
|
import com.gpl.rpg.atcontentstudio.Notification;
|
||||||
import java.io.File;
|
import com.gpl.rpg.atcontentstudio.model.*;
|
||||||
import java.io.FileWriter;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
import java.io.IOException;
|
import com.gpl.rpg.atcontentstudio.utils.FileUtils;
|
||||||
import java.io.Serializable;
|
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Enumeration;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import javax.swing.tree.TreeNode;
|
import 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;
|
//endregion
|
||||||
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;
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@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(node);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean getAllowsChildren() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isLeaf() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Enumeration<E> children() {
|
|
||||||
return Collections.enumeration(this);
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
|
||||||
path.add(0, this);
|
|
||||||
parent.childrenAdded(path);
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
|
||||||
path.add(0, this);
|
|
||||||
parent.childrenChanged(path);
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
|
||||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
|
||||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
|
||||||
} else {
|
|
||||||
path.add(0, this);
|
|
||||||
parent.childrenRemoved(path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void notifyCreated() {
|
|
||||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
|
||||||
for (E node : this) {
|
|
||||||
node.notifyCreated();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public String getDesc() {
|
|
||||||
return (needsSaving() ? "*" : "")+this.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
return (o == this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Project getProject() {
|
|
||||||
return parent.getProject();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Image getIcon() {
|
|
||||||
return getOpenIcon();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public Image getClosedIcon() {
|
|
||||||
return DefaultIcons.getJsonClosedIcon();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public Image getLeafIcon() {
|
|
||||||
return DefaultIcons.getJsonClosedIcon();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public Image getOpenIcon() {
|
|
||||||
return DefaultIcons.getJsonOpenIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public GameDataSet getDataSet() {
|
|
||||||
return parent.getDataSet();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Type getDataType() {
|
|
||||||
return parent.getDataType();
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
|
||||||
public void save(File jsonFile) {
|
|
||||||
if (getDataType() != GameSource.Type.created && getDataType() != GameSource.Type.altered) {
|
|
||||||
Notification.addError("Error while trying to write json file "+jsonFile.getAbsolutePath()+" : Game Source type "+getDataType().toString()+" should not be saved.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
List<Map> dataToSave = new ArrayList<Map>();
|
|
||||||
for (E element : this) {
|
|
||||||
if (element.jsonFile.equals(jsonFile)) {
|
|
||||||
dataToSave.add(element.toJson());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (dataToSave.isEmpty() && jsonFile.exists()) {
|
|
||||||
if (jsonFile.delete()) {
|
|
||||||
Notification.addSuccess("File "+jsonFile.getAbsolutePath()+" deleted.");
|
|
||||||
} else {
|
|
||||||
Notification.addError("Error deleting file "+jsonFile.getAbsolutePath());
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
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 List<SaveEvent> attemptSave(boolean checkImpactedCategory, String fileName) {
|
public GameDataSet parent;
|
||||||
List<SaveEvent> events = new ArrayList<SaveEvent>();
|
public String name;
|
||||||
GameDataCategory<? extends JSONElement> impactedCategory = null;
|
|
||||||
String impactedFileName = fileName;
|
|
||||||
Map<String, Integer> containedIds = new LinkedHashMap<String, Integer>();
|
|
||||||
for (JSONElement node : this) {
|
|
||||||
if (node.getDataType() == GameSource.Type.created && getProject().baseContent.gameData.getGameDataElement(node.getClass(), node.id) != null) {
|
|
||||||
if (getProject().alteredContent.gameData.getGameDataElement(node.getClass(), node.id) != null) {
|
|
||||||
events.add(new SaveEvent(SaveEvent.Type.moveToAltered, node, true, "Element ID matches one already present in the altered game content. Change this ID before saving."));
|
|
||||||
} else {
|
|
||||||
events.add(new SaveEvent(SaveEvent.Type.moveToAltered, node));
|
|
||||||
impactedFileName = getProject().baseContent.gameData.getGameDataElement(node.getClass(), node.id).jsonFile.getName();
|
|
||||||
impactedCategory = getProject().alteredContent.gameData.getCategory(node.getClass());
|
|
||||||
}
|
|
||||||
} else if (this.getDataType() == GameSource.Type.altered && getProject().baseContent.gameData.getGameDataElement(node.getClass(), node.id) == null) {
|
|
||||||
if (getProject().createdContent.gameData.getGameDataElement(node.getClass(), node.id) != null) {
|
|
||||||
events.add(new SaveEvent(SaveEvent.Type.moveToCreated, node, true, "Element ID matches one already present in the created game content. Change this ID before saving."));
|
|
||||||
} else {
|
|
||||||
events.add(new SaveEvent(SaveEvent.Type.moveToCreated, node));
|
|
||||||
impactedCategory = getProject().createdContent.gameData.getCategory(node.getClass());
|
|
||||||
impactedFileName = node.getProjectFilename();
|
|
||||||
}
|
|
||||||
} else if (node.needsSaving()) {
|
|
||||||
events.add(new SaveEvent(SaveEvent.Type.alsoSave, node));
|
|
||||||
}
|
|
||||||
if (containedIds.containsKey(node.id)) {
|
|
||||||
containedIds.put(node.id, containedIds.get(node.id) + 1);
|
|
||||||
} else {
|
|
||||||
containedIds.put(node.id, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (String key : containedIds.keySet()) {
|
|
||||||
if (containedIds.get(key) > 1) {
|
|
||||||
E node = null;
|
|
||||||
for (E n : this) {
|
|
||||||
if (key.equals(n.id)) {
|
|
||||||
node = n;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
events.add(new SaveEvent(SaveEvent.Type.alsoSave, node, true, "There are "+containedIds.get(node.id)+" elements with this ID in this category. Change the conflicting IDs before saving."));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (checkImpactedCategory && impactedCategory != null) {
|
|
||||||
events.addAll(impactedCategory.attemptSave(false, impactedFileName));
|
|
||||||
}
|
|
||||||
return events;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean remove(E o) {
|
public GameDataCategory(GameDataSet parent, String name) {
|
||||||
int index = getProject().getNodeIndex(o);
|
this.parent = parent;
|
||||||
boolean result = super.remove(o);
|
this.name = name;
|
||||||
getProject().fireElementRemoved(o, index);
|
}
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
//region Helpers
|
||||||
public boolean needsSaving() {
|
public E get(String key) {
|
||||||
for (E node : this) {
|
return dataMap.get(key);
|
||||||
if (node.needsSaving()) return true;
|
}
|
||||||
}
|
|
||||||
return false;
|
public E get(int index) {
|
||||||
}
|
String key = keyList.get(index);
|
||||||
|
return dataMap.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public E getIgnoreCase(String key) {
|
||||||
|
for (String k : keyList) {
|
||||||
|
if (k.equalsIgnoreCase(key)) {
|
||||||
|
return dataMap.get(k);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public E put(String key, E element) {
|
||||||
|
if (!dataMap.containsKey(key)) {
|
||||||
|
keyList.add(key);
|
||||||
|
}
|
||||||
|
return dataMap.put(key, element);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(E quest) {
|
||||||
|
String key = quest.id;
|
||||||
|
put(key, quest);
|
||||||
|
}
|
||||||
|
|
||||||
|
public E remove(String key) {
|
||||||
|
if (dataMap.containsKey(key)) {
|
||||||
|
keyList.remove(key);
|
||||||
|
}
|
||||||
|
return dataMap.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public E remove(int index) {
|
||||||
|
String key = keyList.get(index);
|
||||||
|
keyList.remove(index);
|
||||||
|
return dataMap.remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 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 : dataMap.values()) {
|
||||||
|
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 : dataMap.values()) {
|
||||||
|
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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,5 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
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.Notification;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||||
@@ -18,456 +9,439 @@ import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
|||||||
import com.gpl.rpg.atcontentstudio.model.SavedSlotCollection;
|
import com.gpl.rpg.atcontentstudio.model.SavedSlotCollection;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
import javax.swing.tree.TreeNode;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class GameDataSet implements ProjectTreeNode, Serializable {
|
public class GameDataSet implements ProjectTreeNode, Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = -8558067213826970968L;
|
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_SOURCE = "res" + File.separator + "raw" + File.separator;
|
||||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "json"+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_AC_ARRAY_NAME = "loadresource_actorconditions";
|
||||||
public static final String GAME_DIALOGUES_ARRAY_NAME = "loadresource_conversationlists";
|
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_DROPLISTS_ARRAY_NAME = "loadresource_droplists";
|
||||||
public static final String GAME_ITEMS_ARRAY_NAME = "loadresource_items";
|
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_ITEMCAT_ARRAY_NAME = "loadresource_itemcategories";
|
||||||
public static final String GAME_NPC_ARRAY_NAME = "loadresource_monsters";
|
public static final String GAME_NPC_ARRAY_NAME = "loadresource_monsters";
|
||||||
public static final String GAME_QUESTS_ARRAY_NAME = "loadresource_quests";
|
public static final String GAME_QUESTS_ARRAY_NAME = "loadresource_quests";
|
||||||
public static final String DEBUG_SUFFIX = "_debug";
|
public static final String DEBUG_SUFFIX = "_debug";
|
||||||
public static final String RESOURCE_PREFIX = "@raw/";
|
public static final String RESOURCE_PREFIX = "@raw/";
|
||||||
public static final String FILENAME_SUFFIX = ".json";
|
public static final String FILENAME_SUFFIX = ".json";
|
||||||
|
|
||||||
public File baseFolder;
|
public File baseFolder;
|
||||||
|
|
||||||
public GameDataCategory<ActorCondition> actorConditions;
|
public GameDataCategory<ActorCondition> actorConditions;
|
||||||
public GameDataCategory<Dialogue> dialogues;
|
public GameDataCategory<Dialogue> dialogues;
|
||||||
public GameDataCategory<Droplist> droplists;
|
public GameDataCategory<Droplist> droplists;
|
||||||
public GameDataCategory<Item> items;
|
public GameDataCategory<Item> items;
|
||||||
public GameDataCategory<ItemCategory> itemCategories;
|
public GameDataCategory<ItemCategory> itemCategories;
|
||||||
public GameDataCategory<NPC> npcs;
|
public GameDataCategory<NPC> npcs;
|
||||||
public GameDataCategory<Quest> quests;
|
public GameDataCategory<Quest> quests;
|
||||||
|
|
||||||
public GameSource parent;
|
public GameSource parent;
|
||||||
public SavedSlotCollection v;
|
public SavedSlotCollection v;
|
||||||
|
|
||||||
public GameDataSet(GameSource source) {
|
public GameDataSet(GameSource source) {
|
||||||
|
|
||||||
this.parent = source;
|
this.parent = source;
|
||||||
v = new SavedSlotCollection();
|
v = new SavedSlotCollection();
|
||||||
|
|
||||||
if (parent.type.equals(GameSource.Type.altered) || parent.type.equals(GameSource.Type.created)) {
|
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);
|
this.baseFolder = new File(parent.baseFolder, GameDataSet.DEFAULT_REL_PATH_IN_PROJECT);
|
||||||
if (!baseFolder.exists()) this.baseFolder.mkdirs();
|
if (!baseFolder.exists()) this.baseFolder.mkdirs();
|
||||||
} else if (parent.type.equals(GameSource.Type.source)) {
|
} else if (parent.type.equals(GameSource.Type.source)) {
|
||||||
this.baseFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
this.baseFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||||
}
|
}
|
||||||
|
|
||||||
actorConditions = new GameDataCategory<ActorCondition>(this, ActorCondition.getStaticDesc());
|
actorConditions = new GameDataCategory<ActorCondition>(this, ActorCondition.getStaticDesc());
|
||||||
dialogues = new GameDataCategory<Dialogue>(this, Dialogue.getStaticDesc());
|
dialogues = new GameDataCategory<Dialogue>(this, Dialogue.getStaticDesc());
|
||||||
droplists = new GameDataCategory<Droplist>(this, Droplist.getStaticDesc());
|
droplists = new GameDataCategory<Droplist>(this, Droplist.getStaticDesc());
|
||||||
items = new GameDataCategory<Item>(this, Item.getStaticDesc());
|
items = new GameDataCategory<Item>(this, Item.getStaticDesc());
|
||||||
itemCategories = new GameDataCategory<ItemCategory>(this, ItemCategory.getStaticDesc());
|
itemCategories = new GameDataCategory<ItemCategory>(this, ItemCategory.getStaticDesc());
|
||||||
npcs = new GameDataCategory<NPC>(this, NPC.getStaticDesc());
|
npcs = new GameDataCategory<NPC>(this, NPC.getStaticDesc());
|
||||||
quests = new GameDataCategory<Quest>(this, Quest.getStaticDesc());
|
quests = new GameDataCategory<>(this, Quest.getStaticDesc());
|
||||||
|
|
||||||
v.add(actorConditions);
|
v.add(actorConditions);
|
||||||
v.add(dialogues);
|
v.add(dialogues);
|
||||||
v.add(droplists);
|
v.add(droplists);
|
||||||
v.add(items);
|
v.add(items);
|
||||||
v.add(itemCategories);
|
v.add(itemCategories);
|
||||||
v.add(npcs);
|
v.add(npcs);
|
||||||
v.add(quests);
|
v.add(quests);
|
||||||
|
|
||||||
//Start parsing to populate categories' content.
|
//Start parsing to populate categories' content.
|
||||||
if (parent.type == GameSource.Type.source && (parent.parent.sourceSetToUse == ResourceSet.debugData || parent.parent.sourceSetToUse == ResourceSet.gameData)) {
|
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 : "";
|
String suffix = (parent.parent.sourceSetToUse == ResourceSet.debugData) ? DEBUG_SUFFIX : "";
|
||||||
|
|
||||||
if (parent.referencedSourceFiles.get(GAME_AC_ARRAY_NAME+suffix) != null) {
|
if (parent.referencedSourceFiles.get(GAME_AC_ARRAY_NAME + suffix) != null) {
|
||||||
for (String resource : parent.referencedSourceFiles.get(GAME_AC_ARRAY_NAME+suffix)) {
|
for (String resource : parent.referencedSourceFiles.get(GAME_AC_ARRAY_NAME + suffix)) {
|
||||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
ActorCondition.fromJson(f, actorConditions);
|
ActorCondition.fromJson(f, actorConditions);
|
||||||
} else {
|
} else {
|
||||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
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) {
|
if (parent.referencedSourceFiles.get(GAME_DIALOGUES_ARRAY_NAME + suffix) != null) {
|
||||||
for (String resource : parent.referencedSourceFiles.get(GAME_DIALOGUES_ARRAY_NAME+suffix)) {
|
for (String resource : parent.referencedSourceFiles.get(GAME_DIALOGUES_ARRAY_NAME + suffix)) {
|
||||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
Dialogue.fromJson(f, dialogues);
|
Dialogue.fromJson(f, dialogues);
|
||||||
} else {
|
} else {
|
||||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
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) {
|
if (parent.referencedSourceFiles.get(GAME_DROPLISTS_ARRAY_NAME + suffix) != null) {
|
||||||
for (String resource : parent.referencedSourceFiles.get(GAME_DROPLISTS_ARRAY_NAME+suffix)) {
|
for (String resource : parent.referencedSourceFiles.get(GAME_DROPLISTS_ARRAY_NAME + suffix)) {
|
||||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
Droplist.fromJson(f, droplists);
|
Droplist.fromJson(f, droplists);
|
||||||
} else {
|
} else {
|
||||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
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) {
|
if (parent.referencedSourceFiles.get(GAME_ITEMS_ARRAY_NAME + suffix) != null) {
|
||||||
for (String resource : parent.referencedSourceFiles.get(GAME_ITEMS_ARRAY_NAME+suffix)) {
|
for (String resource : parent.referencedSourceFiles.get(GAME_ITEMS_ARRAY_NAME + suffix)) {
|
||||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
Item.fromJson(f, items);
|
Item.fromJson(f, items);
|
||||||
} else {
|
} else {
|
||||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
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) {
|
if (parent.referencedSourceFiles.get(GAME_ITEMCAT_ARRAY_NAME + suffix) != null) {
|
||||||
for (String resource : parent.referencedSourceFiles.get(GAME_ITEMCAT_ARRAY_NAME+suffix)) {
|
for (String resource : parent.referencedSourceFiles.get(GAME_ITEMCAT_ARRAY_NAME + suffix)) {
|
||||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
ItemCategory.fromJson(f, itemCategories);
|
ItemCategory.fromJson(f, itemCategories);
|
||||||
} else {
|
} else {
|
||||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
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) {
|
if (parent.referencedSourceFiles.get(GAME_NPC_ARRAY_NAME + suffix) != null) {
|
||||||
for (String resource : parent.referencedSourceFiles.get(GAME_NPC_ARRAY_NAME+suffix)) {
|
for (String resource : parent.referencedSourceFiles.get(GAME_NPC_ARRAY_NAME + suffix)) {
|
||||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
NPC.fromJson(f, npcs);
|
NPC.fromJson(f, npcs);
|
||||||
} else {
|
} else {
|
||||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
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) {
|
if (parent.referencedSourceFiles.get(GAME_QUESTS_ARRAY_NAME + suffix) != null) {
|
||||||
for (String resource : parent.referencedSourceFiles.get(GAME_QUESTS_ARRAY_NAME+suffix)) {
|
for (String resource : parent.referencedSourceFiles.get(GAME_QUESTS_ARRAY_NAME + suffix)) {
|
||||||
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
File f = new File(baseFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
Quest.fromJson(f, quests);
|
Quest.fromJson(f, quests);
|
||||||
} else {
|
} else {
|
||||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
Notification.addWarn("Unable to locate resource " + resource + " in the game source for project " + getProject().name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (parent.type != GameSource.Type.referenced) {
|
} else if (parent.type != GameSource.Type.referenced) {
|
||||||
for (File f : baseFolder.listFiles()) {
|
for (File f : baseFolder.listFiles()) {
|
||||||
if (f.getName().startsWith("actorconditions_")) {
|
if (f.getName().startsWith("actorconditions_")) {
|
||||||
ActorCondition.fromJson(f, actorConditions);
|
ActorCondition.fromJson(f, actorConditions);
|
||||||
} else if (f.getName().startsWith("conversationlist_")) {
|
} else if (f.getName().startsWith("conversationlist_")) {
|
||||||
Dialogue.fromJson(f, dialogues);
|
Dialogue.fromJson(f, dialogues);
|
||||||
} else if (f.getName().startsWith("droplists_")) {
|
} else if (f.getName().startsWith("droplists_")) {
|
||||||
Droplist.fromJson(f, droplists);
|
Droplist.fromJson(f, droplists);
|
||||||
} else if (f.getName().startsWith("itemlist_")) {
|
} else if (f.getName().startsWith("itemlist_")) {
|
||||||
Item.fromJson(f, items);
|
Item.fromJson(f, items);
|
||||||
} else if (f.getName().startsWith("itemcategories_")) {
|
} else if (f.getName().startsWith("itemcategories_")) {
|
||||||
ItemCategory.fromJson(f, itemCategories);
|
ItemCategory.fromJson(f, itemCategories);
|
||||||
} else if (f.getName().startsWith("monsterlist_")) {
|
} else if (f.getName().startsWith("monsterlist_")) {
|
||||||
NPC.fromJson(f, npcs);
|
NPC.fromJson(f, npcs);
|
||||||
} else if (f.getName().startsWith("questlist")) {
|
} else if (f.getName().startsWith("questlist")) {
|
||||||
Quest.fromJson(f, quests);
|
Quest.fromJson(f, quests);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Enumeration<ProjectTreeNode> children() {
|
public Enumeration<ProjectTreeNode> children() {
|
||||||
return v.getNonEmptyElements();
|
return v.getNonEmptyElements();
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public boolean getAllowsChildren() {
|
@Override
|
||||||
return true;
|
public boolean getAllowsChildren() {
|
||||||
}
|
return true;
|
||||||
@Override
|
}
|
||||||
public TreeNode getChildAt(int arg0) {
|
|
||||||
return v.getNonEmptyElementAt(arg0);
|
@Override
|
||||||
}
|
public TreeNode getChildAt(int arg0) {
|
||||||
@Override
|
return v.getNonEmptyElementAt(arg0);
|
||||||
public int getChildCount() {
|
}
|
||||||
return v.getNonEmptySize();
|
|
||||||
}
|
@Override
|
||||||
@Override
|
public int getChildCount() {
|
||||||
public int getIndex(TreeNode arg0) {
|
return v.getNonEmptySize();
|
||||||
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
}
|
||||||
}
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getParent() {
|
public int getIndex(TreeNode arg0) {
|
||||||
return parent;
|
return v.getNonEmptyIndexOf((ProjectTreeNode) arg0);
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public boolean isLeaf() {
|
@Override
|
||||||
return false;
|
public TreeNode getParent() {
|
||||||
}
|
return parent;
|
||||||
@Override
|
}
|
||||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
|
||||||
path.add(0, this);
|
@Override
|
||||||
parent.childrenAdded(path);
|
public boolean isLeaf() {
|
||||||
}
|
return false;
|
||||||
@Override
|
}
|
||||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
|
||||||
path.add(0, this);
|
@Override
|
||||||
parent.childrenChanged(path);
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
}
|
path.add(0, this);
|
||||||
@Override
|
parent.childrenAdded(path);
|
||||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
}
|
||||||
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
|
||||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
@Override
|
||||||
} else {
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
path.add(0, this);
|
path.add(0, this);
|
||||||
parent.childrenRemoved(path);
|
parent.childrenChanged(path);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyCreated() {
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
if (path.size() == 1 && this.v.getNonEmptySize() == 1) {
|
||||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||||
node.notifyCreated();
|
} else {
|
||||||
}
|
path.add(0, this);
|
||||||
}
|
parent.childrenRemoved(path);
|
||||||
@Override
|
}
|
||||||
public String getDesc() {
|
}
|
||||||
return (needsSaving() ? "*" : "")+"JSON data";
|
|
||||||
}
|
@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 void refreshTransients() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ActorCondition getActorCondition(String id) {
|
public ActorCondition getActorCondition(String id) {
|
||||||
if (actorConditions == null) return null;
|
if (actorConditions == null) return null;
|
||||||
for (ActorCondition gde : actorConditions) {
|
return actorConditions.get(id);
|
||||||
if (id.equals(gde.id)){
|
}
|
||||||
return gde;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dialogue getDialogue(String id) {
|
public Dialogue getDialogue(String id) {
|
||||||
if (dialogues == null) return null;
|
if (dialogues == null) return null;
|
||||||
for (Dialogue gde : dialogues) {
|
return dialogues.get(id);
|
||||||
if (id.equals(gde.id)){
|
}
|
||||||
return gde;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Droplist getDroplist(String id) {
|
public Droplist getDroplist(String id) {
|
||||||
if (droplists == null) return null;
|
if (droplists == null) return null;
|
||||||
for (Droplist gde : droplists) {
|
return droplists.get(id);
|
||||||
if (id.equals(gde.id)){
|
}
|
||||||
return gde;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Item getItem(String id) {
|
public Item getItem(String id) {
|
||||||
if (items == null) return null;
|
if (items == null) return null;
|
||||||
for (Item gde : items) {
|
return items.get(id);
|
||||||
if (id.equals(gde.id)){
|
}
|
||||||
return gde;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ItemCategory getItemCategory(String id) {
|
public ItemCategory getItemCategory(String id) {
|
||||||
if (itemCategories == null) return null;
|
if (itemCategories == null) return null;
|
||||||
for (ItemCategory gde : itemCategories) {
|
return itemCategories.get(id);
|
||||||
if (id.equals(gde.id)){
|
}
|
||||||
return gde;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public NPC getNPC(String id) {
|
public NPC getNPC(String id) {
|
||||||
if (npcs == null) return null;
|
if (npcs == null) return null;
|
||||||
for (NPC gde : npcs) {
|
return npcs.get(id);
|
||||||
if (id.equals(gde.id)){
|
}
|
||||||
return gde;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public NPC getNPCIgnoreCase(String id) {
|
public NPC getNPCIgnoreCase(String id) {
|
||||||
if (npcs == null) return null;
|
if (npcs == null) return null;
|
||||||
for (NPC gde : npcs) {
|
return npcs.getIgnoreCase(id);
|
||||||
if (id.equalsIgnoreCase(gde.id)){
|
}
|
||||||
return gde;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Quest getQuest(String id) {
|
public Quest getQuest(String id) {
|
||||||
if (quests == null) return null;
|
if (quests == null) return null;
|
||||||
for (Quest gde : quests) {
|
return quests.get(id);
|
||||||
if (id.equals(gde.id)){
|
}
|
||||||
return gde;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Project getProject() {
|
public Project getProject() {
|
||||||
return parent.getProject();
|
return parent.getProject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return getOpenIcon();
|
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) {
|
@Override
|
||||||
ProjectTreeNode higherEmptyParent = this;
|
public Image getClosedIcon() {
|
||||||
while (higherEmptyParent != null) {
|
return DefaultIcons.getJsonClosedIcon();
|
||||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode)higherEmptyParent.getParent()).isEmpty()) higherEmptyParent = (ProjectTreeNode)higherEmptyParent.getParent();
|
}
|
||||||
else break;
|
|
||||||
}
|
@Override
|
||||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
public Image getLeafIcon() {
|
||||||
if (node instanceof ActorCondition) {
|
return DefaultIcons.getJsonClosedIcon();
|
||||||
if (actorConditions.isEmpty() && higherEmptyParent == null) higherEmptyParent = actorConditions;
|
}
|
||||||
actorConditions.add((ActorCondition) node);
|
|
||||||
node.parent = actorConditions;
|
@Override
|
||||||
} else if (node instanceof Dialogue) {
|
public Image getOpenIcon() {
|
||||||
if (dialogues.isEmpty() && higherEmptyParent == null) higherEmptyParent = dialogues;
|
return DefaultIcons.getJsonOpenIcon();
|
||||||
dialogues.add((Dialogue) node);
|
}
|
||||||
node.parent = dialogues;
|
|
||||||
} else if (node instanceof Droplist) {
|
public void addElement(JSONElement node) {
|
||||||
if (droplists.isEmpty() && higherEmptyParent == null) higherEmptyParent = droplists;
|
ProjectTreeNode higherEmptyParent = this;
|
||||||
droplists.add((Droplist) node);
|
while (higherEmptyParent != null) {
|
||||||
node.parent = droplists;
|
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode) higherEmptyParent.getParent()).isEmpty())
|
||||||
} else if (node instanceof Item) {
|
higherEmptyParent = (ProjectTreeNode) higherEmptyParent.getParent();
|
||||||
if (items.isEmpty() && higherEmptyParent == null) higherEmptyParent = items;
|
else break;
|
||||||
items.add((Item) node);
|
}
|
||||||
node.parent = items;
|
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||||
} else if (node instanceof ItemCategory) {
|
if (node instanceof ActorCondition) {
|
||||||
if (itemCategories.isEmpty() && higherEmptyParent == null) higherEmptyParent = itemCategories;
|
if (actorConditions.isEmpty() && higherEmptyParent == null) higherEmptyParent = actorConditions;
|
||||||
itemCategories.add((ItemCategory) node);
|
actorConditions.add((ActorCondition) node);
|
||||||
node.parent = itemCategories;
|
node.parent = actorConditions;
|
||||||
} else if (node instanceof NPC) {
|
} else if (node instanceof Dialogue) {
|
||||||
if (npcs.isEmpty() && higherEmptyParent == null) higherEmptyParent = npcs;
|
if (dialogues.isEmpty() && higherEmptyParent == null) higherEmptyParent = dialogues;
|
||||||
npcs.add((NPC) node);
|
dialogues.add((Dialogue) node);
|
||||||
node.parent = npcs;
|
node.parent = dialogues;
|
||||||
} else if (node instanceof Quest) {
|
} else if (node instanceof Droplist) {
|
||||||
if (quests.isEmpty() && higherEmptyParent == null) higherEmptyParent = quests;
|
if (droplists.isEmpty() && higherEmptyParent == null) higherEmptyParent = droplists;
|
||||||
quests.add((Quest) node);
|
droplists.add((Droplist) node);
|
||||||
node.parent = quests;
|
node.parent = droplists;
|
||||||
} else {
|
} else if (node instanceof Item) {
|
||||||
Notification.addError("Cannot add "+node.getDesc()+". Unknown data type.");
|
if (items.isEmpty() && higherEmptyParent == null) higherEmptyParent = items;
|
||||||
return;
|
items.add((Item) node);
|
||||||
}
|
node.parent = items;
|
||||||
if (node.jsonFile != null && parent.type == GameSource.Type.altered) {
|
} else if (node instanceof ItemCategory) {
|
||||||
//Altered node.
|
if (itemCategories.isEmpty() && higherEmptyParent == null) higherEmptyParent = itemCategories;
|
||||||
node.jsonFile = new File(this.baseFolder, node.jsonFile.getName());
|
itemCategories.add((ItemCategory) node);
|
||||||
} else {
|
node.parent = itemCategories;
|
||||||
//Created node.
|
} else if (node instanceof NPC) {
|
||||||
node.jsonFile = new File(this.baseFolder, node.getProjectFilename());
|
if (npcs.isEmpty() && higherEmptyParent == null) higherEmptyParent = npcs;
|
||||||
}
|
npcs.add((NPC) node);
|
||||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
node.parent = npcs;
|
||||||
else node.notifyCreated();
|
} 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
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public GameDataSet getDataSet() {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public Type getDataType() {
|
||||||
return parent.getDataType();
|
return parent.getDataType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
return v.isEmpty();
|
return v.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
public JSONElement getGameDataElement(Class<? extends JSONElement> gdeClass, String id) {
|
public JSONElement getGameDataElement(Class<? extends JSONElement> gdeClass, String id) {
|
||||||
if (gdeClass == ActorCondition.class) {
|
if (gdeClass == ActorCondition.class) {
|
||||||
return getActorCondition(id);
|
return getActorCondition(id);
|
||||||
}
|
}
|
||||||
if (gdeClass == Dialogue.class) {
|
if (gdeClass == Dialogue.class) {
|
||||||
return getDialogue(id);
|
return getDialogue(id);
|
||||||
}
|
}
|
||||||
if (gdeClass == Droplist.class) {
|
if (gdeClass == Droplist.class) {
|
||||||
return getDroplist(id);
|
return getDroplist(id);
|
||||||
}
|
}
|
||||||
if (gdeClass == ItemCategory.class) {
|
if (gdeClass == ItemCategory.class) {
|
||||||
return getItemCategory(id);
|
return getItemCategory(id);
|
||||||
}
|
}
|
||||||
if (gdeClass == Item.class) {
|
if (gdeClass == Item.class) {
|
||||||
return getItem(id);
|
return getItem(id);
|
||||||
}
|
}
|
||||||
if (gdeClass == NPC.class) {
|
if (gdeClass == NPC.class) {
|
||||||
return getNPC(id);
|
return getNPC(id);
|
||||||
}
|
}
|
||||||
if (gdeClass == Quest.class) {
|
if (gdeClass == Quest.class) {
|
||||||
return getQuest(id);
|
return getQuest(id);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public GameDataCategory<? extends JSONElement> getCategory(Class<? extends JSONElement> gdeClass) {
|
public GameDataCategory<? extends JSONElement> getCategory(Class<? extends JSONElement> gdeClass) {
|
||||||
if (gdeClass == ActorCondition.class) {
|
if (gdeClass == ActorCondition.class) {
|
||||||
return actorConditions;
|
return actorConditions;
|
||||||
}
|
}
|
||||||
if (gdeClass == Dialogue.class) {
|
if (gdeClass == Dialogue.class) {
|
||||||
return dialogues;
|
return dialogues;
|
||||||
}
|
}
|
||||||
if (gdeClass == Droplist.class) {
|
if (gdeClass == Droplist.class) {
|
||||||
return droplists;
|
return droplists;
|
||||||
}
|
}
|
||||||
if (gdeClass == ItemCategory.class) {
|
if (gdeClass == ItemCategory.class) {
|
||||||
return itemCategories;
|
return itemCategories;
|
||||||
}
|
}
|
||||||
if (gdeClass == Item.class) {
|
if (gdeClass == Item.class) {
|
||||||
return items;
|
return items;
|
||||||
}
|
}
|
||||||
if (gdeClass == NPC.class) {
|
if (gdeClass == NPC.class) {
|
||||||
return npcs;
|
return npcs;
|
||||||
}
|
}
|
||||||
if (gdeClass == Quest.class) {
|
if (gdeClass == Quest.class) {
|
||||||
return quests;
|
return quests;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean needsSaving() {
|
public boolean needsSaving() {
|
||||||
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
for (ProjectTreeNode node : v.getNonEmptyIterable()) {
|
||||||
if (node.needsSaving()) return true;
|
if (node.needsSaving()) return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,13 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
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.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
@@ -9,321 +16,307 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
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 {
|
public class ItemCategory extends JSONElement {
|
||||||
|
|
||||||
private static final long serialVersionUID = -348864002519568300L;
|
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_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_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_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_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_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_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_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_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 final String ICON_WEAPON_RES = "/com/gpl/rpg/atcontentstudio/img/equip_weapon.png";
|
||||||
|
|
||||||
public static Image no_slot_image = null;
|
public static Image no_slot_image = null;
|
||||||
public static Image no_slot_icon = null;
|
public static Image no_slot_icon = null;
|
||||||
|
|
||||||
public static Image body_image = null;
|
public static Image body_image = null;
|
||||||
public static Image body_icon = null;
|
public static Image body_icon = null;
|
||||||
|
|
||||||
public static Image feet_image = null;
|
public static Image feet_image = null;
|
||||||
public static Image feet_icon = null;
|
public static Image feet_icon = null;
|
||||||
|
|
||||||
public static Image hand_image = null;
|
public static Image hand_image = null;
|
||||||
public static Image hand_icon = null;
|
public static Image hand_icon = null;
|
||||||
|
|
||||||
public static Image head_image = null;
|
public static Image head_image = null;
|
||||||
public static Image head_icon = null;
|
public static Image head_icon = null;
|
||||||
|
|
||||||
public static Image neck_image = null;
|
public static Image neck_image = null;
|
||||||
public static Image neck_icon = null;
|
public static Image neck_icon = null;
|
||||||
|
|
||||||
public static Image ring_image = null;
|
public static Image ring_image = null;
|
||||||
public static Image ring_icon = null;
|
public static Image ring_icon = null;
|
||||||
|
|
||||||
public static Image shield_image = null;
|
public static Image shield_image = null;
|
||||||
public static Image shield_icon = null;
|
public static Image shield_icon = null;
|
||||||
|
|
||||||
public static Image weapon_image = null;
|
public static Image weapon_image = null;
|
||||||
public static Image weapon_icon = null;
|
public static Image weapon_icon = null;
|
||||||
|
|
||||||
|
|
||||||
//Available from init state
|
//Available from init state
|
||||||
//public String id = null; inherited.
|
//public String id = null; inherited.
|
||||||
public String name = null;
|
public String name = null;
|
||||||
public InventorySlot slot = null;
|
public InventorySlot slot = null;
|
||||||
|
|
||||||
//Available from parsed state
|
//Available from parsed state
|
||||||
public ActionType action_type = null;
|
public ActionType action_type = null;
|
||||||
public Size size = null;
|
public Size size = null;
|
||||||
|
|
||||||
//Available from linked state
|
//Available from linked state
|
||||||
//None
|
//None
|
||||||
|
|
||||||
public static enum ActionType {
|
public static enum ActionType {
|
||||||
none,
|
none,
|
||||||
use,
|
use,
|
||||||
equip
|
equip
|
||||||
}
|
}
|
||||||
|
|
||||||
public static enum Size {
|
public static enum Size {
|
||||||
none,
|
none,
|
||||||
light,
|
light,
|
||||||
std,
|
std,
|
||||||
large
|
large
|
||||||
}
|
}
|
||||||
|
|
||||||
public static enum InventorySlot {
|
public static enum InventorySlot {
|
||||||
weapon,
|
weapon,
|
||||||
shield,
|
shield,
|
||||||
head,
|
head,
|
||||||
body,
|
body,
|
||||||
hand,
|
hand,
|
||||||
feet,
|
feet,
|
||||||
neck,
|
neck,
|
||||||
leftring,
|
leftring,
|
||||||
rightring
|
rightring
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
return (needsSaving() ? "*" : "")+name+" ("+id+")";
|
return (needsSaving() ? "*" : "") + name + " (" + id + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getStaticDesc() {
|
public static String getStaticDesc() {
|
||||||
return "Item categories";
|
return "Item categories";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static void fromJson(File jsonFile, GameDataCategory<ItemCategory> category) {
|
public static void fromJson(File jsonFile, GameDataCategory<ItemCategory> category) {
|
||||||
JSONParser parser = new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
FileReader reader = null;
|
FileReader reader = null;
|
||||||
try {
|
try {
|
||||||
reader = new FileReader(jsonFile);
|
reader = new FileReader(jsonFile);
|
||||||
List itemCategories = (List) parser.parse(reader);
|
List itemCategories = (List) parser.parse(reader);
|
||||||
for (Object obj : itemCategories) {
|
for (Object obj : itemCategories) {
|
||||||
Map itemCatJson = (Map)obj;
|
Map itemCatJson = (Map) obj;
|
||||||
ItemCategory itemCat = fromJson(itemCatJson);
|
ItemCategory itemCat = fromJson(itemCatJson);
|
||||||
itemCat.jsonFile = jsonFile;
|
itemCat.jsonFile = jsonFile;
|
||||||
itemCat.parent = category;
|
itemCat.parent = category;
|
||||||
if (itemCat.getDataType() == GameSource.Type.created || itemCat.getDataType() == GameSource.Type.altered) {
|
if (itemCat.getDataType() == GameSource.Type.created || itemCat.getDataType() == GameSource.Type.altered) {
|
||||||
itemCat.writable = true;
|
itemCat.writable = true;
|
||||||
}
|
}
|
||||||
category.add(itemCat);
|
category.add(itemCat);
|
||||||
}
|
}
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
if (reader != null)
|
if (reader != null)
|
||||||
try {
|
try {
|
||||||
reader.close();
|
reader.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static ItemCategory fromJson(String jsonString) throws ParseException {
|
public static ItemCategory fromJson(String jsonString) throws ParseException {
|
||||||
Map itemCatJson = (Map) new JSONParser().parse(jsonString);
|
Map itemCatJson = (Map) new JSONParser().parse(jsonString);
|
||||||
ItemCategory item = fromJson(itemCatJson);
|
ItemCategory item = fromJson(itemCatJson);
|
||||||
item.parse(itemCatJson);
|
item.parse(itemCatJson);
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static ItemCategory fromJson(Map itemCatJson) {
|
public static ItemCategory fromJson(Map itemCatJson) {
|
||||||
ItemCategory itemCat = new ItemCategory();
|
ItemCategory itemCat = new ItemCategory();
|
||||||
itemCat.id = (String) itemCatJson.get("id");
|
itemCat.id = (String) itemCatJson.get("id");
|
||||||
itemCat.name = (String) itemCatJson.get("name");
|
itemCat.name = (String) itemCatJson.get("name");
|
||||||
if (itemCatJson.get("inventorySlot") != null) itemCat.slot = InventorySlot.valueOf((String) itemCatJson.get("inventorySlot"));
|
if (itemCatJson.get("inventorySlot") != null)
|
||||||
return itemCat;
|
itemCat.slot = InventorySlot.valueOf((String) itemCatJson.get("inventorySlot"));
|
||||||
}
|
return itemCat;
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
@Override
|
@Override
|
||||||
public void parse(Map itemCatJson) {
|
public void parse(Map itemCatJson) {
|
||||||
if (itemCatJson.get("actionType") != null) action_type = ActionType.valueOf((String) itemCatJson.get("actionType"));
|
if (itemCatJson.get("actionType") != null)
|
||||||
if (itemCatJson.get("size") != null) size = Size.valueOf((String) itemCatJson.get("size"));
|
action_type = ActionType.valueOf((String) itemCatJson.get("actionType"));
|
||||||
this.state = State.parsed;
|
if (itemCatJson.get("size") != null) size = Size.valueOf((String) itemCatJson.get("size"));
|
||||||
|
this.state = State.parsed;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
if (shouldSkipParseOrLink()) {
|
||||||
//This type of state is unrelated to parsing/linking.
|
return;
|
||||||
return;
|
}
|
||||||
}
|
ensureParseIfNeeded();
|
||||||
if (this.state == State.init) {
|
|
||||||
//Not parsed yet.
|
|
||||||
this.parse();
|
|
||||||
} else if (this.state == State.linked) {
|
|
||||||
//Already linked.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Nothing to link to :D
|
//Nothing to link to :D
|
||||||
this.state = State.linked;
|
this.state = State.linked;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return getIcon(this.slot);
|
return getIcon(this.slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Image getImage() {
|
public Image getImage() {
|
||||||
return getImage(this.slot);
|
return getImage(this.slot);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Image getImage(InventorySlot slot) {
|
public static Image getImage(InventorySlot slot) {
|
||||||
if (slot == null) {
|
if (slot == null) {
|
||||||
return getImage(ICON_NO_SLOT_RES, no_slot_image, "no_slot_image");
|
return getImage(ICON_NO_SLOT_RES, no_slot_image, "no_slot_image");
|
||||||
}
|
}
|
||||||
switch (slot) {
|
switch (slot) {
|
||||||
case body:
|
case body:
|
||||||
return getImage(ICON_BODY_RES, body_image, "body_image");
|
return getImage(ICON_BODY_RES, body_image, "body_image");
|
||||||
case feet:
|
case feet:
|
||||||
return getImage(ICON_FEET_RES, feet_image, "feet_image");
|
return getImage(ICON_FEET_RES, feet_image, "feet_image");
|
||||||
case hand:
|
case hand:
|
||||||
return getImage(ICON_HAND_RES, hand_image, "hand_image");
|
return getImage(ICON_HAND_RES, hand_image, "hand_image");
|
||||||
case head:
|
case head:
|
||||||
return getImage(ICON_HEAD_RES, head_image, "head_image");
|
return getImage(ICON_HEAD_RES, head_image, "head_image");
|
||||||
case leftring:
|
case leftring:
|
||||||
case rightring:
|
case rightring:
|
||||||
return getImage(ICON_RING_RES, ring_image, "ring_image");
|
return getImage(ICON_RING_RES, ring_image, "ring_image");
|
||||||
case neck:
|
case neck:
|
||||||
return getImage(ICON_NECK_RES, neck_image, "neck_image");
|
return getImage(ICON_NECK_RES, neck_image, "neck_image");
|
||||||
case shield:
|
case shield:
|
||||||
return getImage(ICON_SHIELD_RES, shield_image, "shield_image");
|
return getImage(ICON_SHIELD_RES, shield_image, "shield_image");
|
||||||
case weapon:
|
case weapon:
|
||||||
return getImage(ICON_WEAPON_RES, weapon_image, "weapon_image");
|
return getImage(ICON_WEAPON_RES, weapon_image, "weapon_image");
|
||||||
default:
|
default:
|
||||||
return getImage(ICON_NO_SLOT_RES, no_slot_image, "no_slot_image");
|
return getImage(ICON_NO_SLOT_RES, no_slot_image, "no_slot_image");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Image getIcon(InventorySlot slot) {
|
public static Image getIcon(InventorySlot slot) {
|
||||||
if (slot == null) {
|
if (slot == null) {
|
||||||
return getIcon(ICON_NO_SLOT_RES, no_slot_image, no_slot_icon, "no_slot_image", "no_slot_icon");
|
return getIcon(ICON_NO_SLOT_RES, no_slot_image, no_slot_icon, "no_slot_image", "no_slot_icon");
|
||||||
}
|
}
|
||||||
switch (slot) {
|
switch (slot) {
|
||||||
case body:
|
case body:
|
||||||
return getIcon(ICON_BODY_RES, body_image, body_icon, "body_image", "body_icon");
|
return getIcon(ICON_BODY_RES, body_image, body_icon, "body_image", "body_icon");
|
||||||
case feet:
|
case feet:
|
||||||
return getIcon(ICON_FEET_RES, feet_image, feet_icon, "feet_image", "feet_icon");
|
return getIcon(ICON_FEET_RES, feet_image, feet_icon, "feet_image", "feet_icon");
|
||||||
case hand:
|
case hand:
|
||||||
return getIcon(ICON_HAND_RES, hand_image, hand_icon, "hand_image", "hand_icon");
|
return getIcon(ICON_HAND_RES, hand_image, hand_icon, "hand_image", "hand_icon");
|
||||||
case head:
|
case head:
|
||||||
return getIcon(ICON_HEAD_RES, head_image, head_icon, "head_image", "head_icon");
|
return getIcon(ICON_HEAD_RES, head_image, head_icon, "head_image", "head_icon");
|
||||||
case leftring:
|
case leftring:
|
||||||
case rightring:
|
case rightring:
|
||||||
return getIcon(ICON_RING_RES, ring_image, ring_icon, "ring_image", "ring_icon");
|
return getIcon(ICON_RING_RES, ring_image, ring_icon, "ring_image", "ring_icon");
|
||||||
case neck:
|
case neck:
|
||||||
return getIcon(ICON_NECK_RES, neck_image, neck_icon, "neck_image", "neck_icon");
|
return getIcon(ICON_NECK_RES, neck_image, neck_icon, "neck_image", "neck_icon");
|
||||||
case shield:
|
case shield:
|
||||||
return getIcon(ICON_SHIELD_RES, shield_image, shield_icon, "shield_image", "shield_icon");
|
return getIcon(ICON_SHIELD_RES, shield_image, shield_icon, "shield_image", "shield_icon");
|
||||||
case weapon:
|
case weapon:
|
||||||
return getIcon(ICON_WEAPON_RES, weapon_image, weapon_icon, "weapon_image", "weapon_icon");
|
return getIcon(ICON_WEAPON_RES, weapon_image, weapon_icon, "weapon_image", "weapon_icon");
|
||||||
default:
|
default:
|
||||||
return getIcon(ICON_NO_SLOT_RES, no_slot_image, no_slot_icon, "no_slot_image", "no_slot_icon");
|
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) {
|
public static Image getImage(String res, Image img, String fieldName) {
|
||||||
if (img == null) {
|
if (img == null) {
|
||||||
try {
|
try {
|
||||||
img = ImageIO.read(ItemCategory.class.getResourceAsStream(res));
|
img = ImageIO.read(ItemCategory.class.getResourceAsStream(res));
|
||||||
ItemCategory.class.getField(fieldName).set(null, img);
|
ItemCategory.class.getField(fieldName).set(null, img);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (NoSuchFieldException e) {
|
} catch (NoSuchFieldException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Notification.addError("Failed to load item category icon "+res);
|
Notification.addError("Failed to load item category icon " + res);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return img;
|
return img;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Image getIcon(String res, Image img, Image icon, String imgFieldName, String iconFieldName) {
|
public static Image getIcon(String res, Image img, Image icon, String imgFieldName, String iconFieldName) {
|
||||||
if (icon == null) {
|
if (icon == null) {
|
||||||
icon = getImage(res, img, imgFieldName).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
|
icon = getImage(res, img, imgFieldName).getScaledInstance(16, 16, Image.SCALE_SMOOTH);
|
||||||
try {
|
try {
|
||||||
ItemCategory.class.getField(iconFieldName).set(null, icon);
|
ItemCategory.class.getField(iconFieldName).set(null, icon);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IllegalAccessException e) {
|
} catch (IllegalAccessException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (NoSuchFieldException e) {
|
} catch (NoSuchFieldException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataElement clone() {
|
public GameDataElement clone() {
|
||||||
ItemCategory clone = new ItemCategory();
|
ItemCategory clone = new ItemCategory();
|
||||||
clone.jsonFile = this.jsonFile;
|
clone.jsonFile = this.jsonFile;
|
||||||
clone.state = this.state;
|
clone.state = this.state;
|
||||||
clone.id = this.id;
|
clone.id = this.id;
|
||||||
clone.name = this.name;
|
clone.name = this.name;
|
||||||
clone.size = this.size;
|
clone.size = this.size;
|
||||||
clone.slot = this.slot;
|
clone.slot = this.slot;
|
||||||
clone.action_type = this.action_type;
|
clone.action_type = this.action_type;
|
||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
// Nothing to link to.
|
// Nothing to link to.
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
@Override
|
@Override
|
||||||
public Map toJson() {
|
public Map toJson() {
|
||||||
Map itemCatJson = new LinkedHashMap();
|
Map itemCatJson = new LinkedHashMap();
|
||||||
itemCatJson.put("id", this.id);
|
itemCatJson.put("id", this.id);
|
||||||
if (this.name != null) itemCatJson.put("name", this.name);
|
if (this.name != null) itemCatJson.put("name", this.name);
|
||||||
if (this.action_type != null) itemCatJson.put("actionType", this.action_type.toString());
|
if (this.action_type != null) itemCatJson.put("actionType", this.action_type.toString());
|
||||||
if (this.size != null) itemCatJson.put("size", this.size.toString());
|
if (this.size != null) itemCatJson.put("size", this.size.toString());
|
||||||
if (this.slot != null) itemCatJson.put("inventorySlot", this.slot.toString());
|
if (this.slot != null) itemCatJson.put("inventorySlot", this.slot.toString());
|
||||||
return itemCatJson;
|
return itemCatJson;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getProjectFilename() {
|
public String getProjectFilename() {
|
||||||
return "itemcategories_"+getProject().name+".json";
|
return "itemcategories_" + getProject().name + ".json";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,132 +1,122 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
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.Notification;
|
||||||
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
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 {
|
public abstract class JSONElement extends GameDataElement {
|
||||||
|
|
||||||
private static final long serialVersionUID = -8015398814080503982L;
|
private static final long serialVersionUID = -8015398814080503982L;
|
||||||
|
|
||||||
//Available from state init.
|
//Available from state init.
|
||||||
public File jsonFile;
|
public File jsonFile;
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public void parse() {
|
public void parse() {
|
||||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
if (shouldSkipParse()) {
|
||||||
//This type of state is unrelated to parsing/linking.
|
return;
|
||||||
return;
|
}
|
||||||
}
|
JSONParser parser = new JSONParser();
|
||||||
JSONParser parser = new JSONParser();
|
FileReader reader = null;
|
||||||
FileReader reader = null;
|
try {
|
||||||
try {
|
reader = new FileReader(jsonFile);
|
||||||
reader = new FileReader(jsonFile);
|
List gameDataElements = (List) parser.parse(reader);
|
||||||
List gameDataElements = (List) parser.parse(reader);
|
for (Object obj : gameDataElements) {
|
||||||
for (Object obj : gameDataElements) {
|
Map jsonObj = (Map) obj;
|
||||||
Map jsonObj = (Map)obj;
|
String id = (String) jsonObj.get("id");
|
||||||
String id = (String) jsonObj.get("id");
|
try {
|
||||||
try {
|
if (id != null && id.equals(this.id)) {
|
||||||
if (id != null && id.equals(this.id )) {
|
this.parse(jsonObj);
|
||||||
this.parse(jsonObj);
|
this.state = State.parsed;
|
||||||
this.state = State.parsed;
|
break;
|
||||||
break;
|
}
|
||||||
}
|
} catch (Exception e) {
|
||||||
}
|
System.out.println("Error in ID: " + id);
|
||||||
catch(Exception e){
|
System.out.println(e.getMessage());
|
||||||
System.out.println("Error in ID: " + id);
|
}
|
||||||
}
|
}
|
||||||
}
|
} catch (FileNotFoundException e) {
|
||||||
} catch (FileNotFoundException e) {
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
e.printStackTrace();
|
||||||
e.printStackTrace();
|
} catch (IOException e) {
|
||||||
} catch (IOException e) {
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
e.printStackTrace();
|
||||||
e.printStackTrace();
|
} catch (ParseException e) {
|
||||||
} catch (ParseException e) {
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
e.printStackTrace();
|
||||||
e.printStackTrace();
|
} catch (IllegalArgumentException e) {
|
||||||
} catch (IllegalArgumentException e) {
|
System.out.println(id);
|
||||||
System.out.println(id);
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
e.printStackTrace();
|
||||||
e.printStackTrace();
|
} finally {
|
||||||
} finally {
|
if (reader != null)
|
||||||
if (reader != null)
|
try {
|
||||||
try {
|
reader.close();
|
||||||
reader.close();
|
} catch (IOException e) {
|
||||||
} catch (IOException e) {
|
e.printStackTrace();
|
||||||
e.printStackTrace();
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void parse(@SuppressWarnings("rawtypes") Map jsonObj);
|
public abstract void parse(@SuppressWarnings("rawtypes") Map jsonObj);
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public abstract Map toJson();
|
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
public String toJsonString() {
|
||||||
|
Map json = this.toJson();
|
||||||
|
return FileUtils.toJsonString(json);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public GameDataSet getDataSet() {
|
||||||
if (parent == null) {
|
if (parent == null) {
|
||||||
System.out.println("blerf.");
|
System.out.println("blerf.");
|
||||||
}
|
}
|
||||||
return parent.getDataSet();
|
return parent.getDataSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save() {
|
public void save() {
|
||||||
if (this.getParent() instanceof GameDataCategory<?> && writable) {
|
if (this.getParent() instanceof GameDataCategory<?> && writable) {
|
||||||
((GameDataCategory<?>)this.getParent()).save(this.jsonFile);
|
((GameDataCategory<?>) this.getParent()).save(this.jsonFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns null if save occurred (no notable events).
|
* Returns null if save occurred (no notable events).
|
||||||
*/
|
*/
|
||||||
public List<SaveEvent> attemptSave() {
|
public List<SaveEvent> attemptSave() {
|
||||||
List<SaveEvent> events = ((GameDataCategory<?>)this.getParent()).attemptSave(true, this.jsonFile.getName());
|
List<SaveEvent> events = ((GameDataCategory<?>) this.getParent()).attemptSave(true, this.jsonFile.getName());
|
||||||
if (events == null || events.isEmpty()) {
|
if (events == null || events.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (events.size() == 1 && events.get(0).type == SaveEvent.Type.alsoSave && events.get(0).target == this) {
|
if (events.size() == 1 && events.get(0).type == SaveEvent.Type.alsoSave && events.get(0).target == this) {
|
||||||
save();
|
save();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return events;
|
return events;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Integer getInteger(Number n) {
|
public static Integer getInteger(Number n) {
|
||||||
return n == null ? null : n.intValue();
|
return n == null ? null : n.intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Double getDouble(Number n) {
|
public static Double getDouble(Number n) {
|
||||||
return n == null ? null : n.doubleValue();
|
return n == null ? null : n.doubleValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Double parseChance(String s) {
|
public static Double parseChance(String s) {
|
||||||
if (s.equals("100")) return 100d;
|
if (s.equals("100")) return 100d;
|
||||||
else if (s.equals("70")) return 70d;
|
else if (s.equals("70")) return 70d;
|
||||||
else if (s.equals("30")) return 30d;
|
else if (s.equals("30")) return 30d;
|
||||||
else if (s.equals("25")) return 25d;
|
else if (s.equals("25")) return 25d;
|
||||||
@@ -137,28 +127,30 @@ public abstract class JSONElement extends GameDataElement {
|
|||||||
else if (s.equals("1/1000")) return 0.1;
|
else if (s.equals("1/1000")) return 0.1;
|
||||||
else if (s.equals("1/10000")) return 0.01;
|
else if (s.equals("1/10000")) return 0.01;
|
||||||
else if (s.indexOf('/') >= 0) {
|
else if (s.indexOf('/') >= 0) {
|
||||||
int c = s.indexOf('/');
|
int c = s.indexOf('/');
|
||||||
double a = 1;
|
double a = 1;
|
||||||
try {
|
try {
|
||||||
a = Integer.parseInt(s.substring(0, c));
|
a = Integer.parseInt(s.substring(0, c));
|
||||||
} catch (NumberFormatException nfe) {}
|
} catch (NumberFormatException nfe) {
|
||||||
double b = 100;
|
}
|
||||||
try {
|
double b = 100;
|
||||||
b = Integer.parseInt(s.substring(c+1));
|
try {
|
||||||
} catch (NumberFormatException nfe) {}
|
b = Integer.parseInt(s.substring(c + 1));
|
||||||
return a/b;
|
} 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) {
|
public static String printJsonChance(Double chance) {
|
||||||
if (chance.equals(100d)) return "100";
|
if (chance.equals(100d)) return "100";
|
||||||
else if (chance.equals(70d)) return "70";
|
else if (chance.equals(70d)) return "70";
|
||||||
else if (chance.equals(30d)) return "30";
|
else if (chance.equals(30d)) return "30";
|
||||||
else if (chance.equals(25d)) return "25";
|
else if (chance.equals(25d)) return "25";
|
||||||
@@ -169,11 +161,11 @@ public abstract class JSONElement extends GameDataElement {
|
|||||||
else if (chance.equals(0.1d)) return "1/1000";
|
else if (chance.equals(0.1d)) return "1/1000";
|
||||||
else if (chance.equals(0.01d)) return "1/10000";
|
else if (chance.equals(0.01d)) return "1/10000";
|
||||||
else {
|
else {
|
||||||
if (chance.intValue() == chance) return Integer.toString(chance.intValue());
|
if (chance.intValue() == chance) return Integer.toString(chance.intValue());
|
||||||
//TODO Better handling of fractions. Chance description need a complete overhaul in AT.
|
//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.
|
//This part does not output the input content of parseDouble(String s) in the case of fractions.
|
||||||
return chance.toString();
|
return chance.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,13 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
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.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
@@ -10,189 +17,173 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
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 {
|
public class Quest extends JSONElement {
|
||||||
|
|
||||||
private static final long serialVersionUID = 2004839647483250099L;
|
private static final long serialVersionUID = 2004839647483250099L;
|
||||||
|
|
||||||
//Available from init state
|
//Available from init state
|
||||||
//public String id = null; inherited.
|
//public String id = null; inherited.
|
||||||
public String name = null;
|
public String name = null;
|
||||||
|
|
||||||
//Available in parsed state
|
//Available in parsed state
|
||||||
public Integer visible_in_log = null;
|
public Integer visible_in_log = null;
|
||||||
public List<QuestStage> stages = null;
|
public List<QuestStage> stages = null;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
return (needsSaving() ? "*" : "")+name+" ("+id+")";
|
return (needsSaving() ? "*" : "") + name + " (" + id + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getStaticDesc() {
|
public static String getStaticDesc() {
|
||||||
return "Quests";
|
return "Quests";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static void fromJson(File jsonFile, GameDataCategory<Quest> category) {
|
public static void fromJson(File jsonFile, GameDataCategory<Quest> category) {
|
||||||
JSONParser parser = new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
FileReader reader = null;
|
FileReader reader = null;
|
||||||
try {
|
try {
|
||||||
reader = new FileReader(jsonFile);
|
reader = new FileReader(jsonFile);
|
||||||
List quests = (List) parser.parse(reader);
|
List quests = (List) parser.parse(reader);
|
||||||
for (Object obj : quests) {
|
for (Object obj : quests) {
|
||||||
Map questJson = (Map)obj;
|
Map questJson = (Map) obj;
|
||||||
Quest quest = fromJson(questJson);
|
Quest quest = fromJson(questJson);
|
||||||
quest.jsonFile = jsonFile;
|
quest.jsonFile = jsonFile;
|
||||||
quest.parent = category;
|
quest.parent = category;
|
||||||
if (quest.getDataType() == GameSource.Type.created || quest.getDataType() == GameSource.Type.altered) {
|
if (quest.getDataType() == GameSource.Type.created || quest.getDataType() == GameSource.Type.altered) {
|
||||||
quest.writable = true;
|
quest.writable = true;
|
||||||
}
|
}
|
||||||
category.add(quest);
|
category.add(quest);
|
||||||
}
|
}
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
Notification.addError("Error while parsing JSON file "+jsonFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while parsing JSON file " + jsonFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} finally {
|
} finally {
|
||||||
if (reader != null)
|
if (reader != null)
|
||||||
try {
|
try {
|
||||||
reader.close();
|
reader.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static Quest fromJson(String jsonString) throws ParseException {
|
public static Quest fromJson(String jsonString) throws ParseException {
|
||||||
Map questJson = (Map) new JSONParser().parse(jsonString);
|
Map questJson = (Map) new JSONParser().parse(jsonString);
|
||||||
Quest quest = fromJson(questJson);
|
Quest quest = fromJson(questJson);
|
||||||
quest.parse(questJson);
|
quest.parse(questJson);
|
||||||
return quest;
|
return quest;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public static Quest fromJson(Map questJson) {
|
public static Quest fromJson(Map questJson) {
|
||||||
Quest quest = new Quest();
|
Quest quest = new Quest();
|
||||||
quest.id = (String) questJson.get("id");
|
quest.id = (String) questJson.get("id");
|
||||||
quest.name = (String) questJson.get("name");
|
quest.name = (String) questJson.get("name");
|
||||||
//Quests have to be parsed to have their stages initialized.
|
//Quests have to be parsed to have their stages initialized.
|
||||||
quest.parse(questJson);
|
quest.parse(questJson);
|
||||||
return quest;
|
return quest;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
@Override
|
@Override
|
||||||
public void parse(Map questJson) {
|
public void parse(Map questJson) {
|
||||||
this.visible_in_log = JSONElement.getInteger((Number) questJson.get("showInLog"));
|
this.visible_in_log = JSONElement.getInteger((Number) questJson.get("showInLog"));
|
||||||
List questStagesJson = (List) questJson.get("stages");
|
List questStagesJson = (List) questJson.get("stages");
|
||||||
this.stages = new ArrayList<QuestStage>();
|
this.stages = new ArrayList<QuestStage>();
|
||||||
if (questStagesJson != null && !questStagesJson.isEmpty()) {
|
if (questStagesJson != null && !questStagesJson.isEmpty()) {
|
||||||
for (Object questStageJsonObj : questStagesJson) {
|
for (Object questStageJsonObj : questStagesJson) {
|
||||||
Map questStageJson = (Map)questStageJsonObj;
|
Map questStageJson = (Map) questStageJsonObj;
|
||||||
QuestStage questStage = new QuestStage(this);
|
QuestStage questStage = new QuestStage(this);
|
||||||
questStage.parse(questStageJson);
|
questStage.parse(questStageJson);
|
||||||
this.stages.add(questStage);
|
this.stages.add(questStage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.state = State.parsed;
|
this.state = State.parsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
if (shouldSkipParseOrLink()) {
|
||||||
//This type of state is unrelated to parsing/linking.
|
return;
|
||||||
return;
|
}
|
||||||
}
|
ensureParseIfNeeded();
|
||||||
if (this.state == State.init) {
|
|
||||||
//Not parsed yet.
|
|
||||||
this.parse();
|
|
||||||
} else if (this.state == State.linked) {
|
|
||||||
//Already linked.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (QuestStage stage : stages) {
|
for (QuestStage stage : stages) {
|
||||||
stage.link();
|
stage.link();
|
||||||
}
|
}
|
||||||
//Nothing to link to :D
|
//Nothing to link to :D
|
||||||
this.state = State.linked;
|
this.state = State.linked;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return DefaultIcons.getQuestIcon();
|
return DefaultIcons.getQuestIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Image getImage() {
|
public Image getImage() {
|
||||||
return DefaultIcons.getQuestImage();
|
return DefaultIcons.getQuestImage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataElement clone() {
|
public GameDataElement clone() {
|
||||||
Quest clone = new Quest();
|
Quest clone = new Quest();
|
||||||
clone.jsonFile = this.jsonFile;
|
clone.jsonFile = this.jsonFile;
|
||||||
clone.state = this.state;
|
clone.state = this.state;
|
||||||
clone.id = this.id;
|
clone.id = this.id;
|
||||||
clone.name = this.name;
|
clone.name = this.name;
|
||||||
clone.visible_in_log = this.visible_in_log;
|
clone.visible_in_log = this.visible_in_log;
|
||||||
if (this.stages != null) {
|
if (this.stages != null) {
|
||||||
clone.stages = new ArrayList<QuestStage>();
|
clone.stages = new ArrayList<QuestStage>();
|
||||||
for (QuestStage stage : this.stages){
|
for (QuestStage stage : this.stages) {
|
||||||
clone.stages.add((QuestStage) stage.clone(clone));
|
clone.stages.add((QuestStage) stage.clone(clone));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
//Nothing to link to.
|
//Nothing to link to.
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
@Override
|
@Override
|
||||||
public Map toJson() {
|
public Map toJson() {
|
||||||
Map questJson = new LinkedHashMap();
|
Map questJson = new LinkedHashMap();
|
||||||
questJson.put("id", this.id);
|
questJson.put("id", this.id);
|
||||||
if (this.name != null) questJson.put("name", this.name);
|
if (this.name != null) questJson.put("name", this.name);
|
||||||
if (this.visible_in_log != null) questJson.put("showInLog", this.visible_in_log);
|
if (this.visible_in_log != null) questJson.put("showInLog", this.visible_in_log);
|
||||||
if (this.stages != null) {
|
if (this.stages != null) {
|
||||||
List stagesJson = new ArrayList();
|
List stagesJson = new ArrayList();
|
||||||
questJson.put("stages", stagesJson);
|
questJson.put("stages", stagesJson);
|
||||||
for (QuestStage stage : this.stages) {
|
for (QuestStage stage : this.stages) {
|
||||||
stagesJson.add(stage.toJson());
|
stagesJson.add(stage.toJson());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return questJson;
|
return questJson;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getProjectFilename() {
|
public String getProjectFilename() {
|
||||||
return "questlist_"+getProject().name+".json";
|
return "questlist_" + getProject().name + ".json";
|
||||||
}
|
}
|
||||||
|
|
||||||
public QuestStage getStage(Integer stageId) {
|
|
||||||
for (QuestStage stage : stages) {
|
|
||||||
if (stage.progress.equals(stageId)) {
|
|
||||||
return stage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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;
|
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.model.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class QuestStage extends JSONElement {
|
public class QuestStage extends JSONElement {
|
||||||
|
|
||||||
private static final long serialVersionUID = 8313645819951513431L;
|
private static final long serialVersionUID = 8313645819951513431L;
|
||||||
|
|
||||||
public Integer progress = null;
|
public Integer progress = null;
|
||||||
public String log_text = null;
|
public String log_text = null;
|
||||||
public Integer exp_reward = null;
|
public Integer exp_reward = null;
|
||||||
public Integer finishes_quest = null;
|
public Integer finishes_quest = null;
|
||||||
|
|
||||||
public QuestStage(Quest parent){
|
public QuestStage(Quest parent) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
public QuestStage clone(Quest cloneParent) {
|
public QuestStage clone(Quest cloneParent) {
|
||||||
QuestStage clone = new QuestStage(cloneParent);
|
QuestStage clone = new QuestStage(cloneParent);
|
||||||
clone.progress = progress != null ? new Integer(progress) : null;
|
clone.progress = progress != null ? new Integer(progress) : null;
|
||||||
clone.log_text = log_text != null ? new String(log_text) : null;
|
clone.log_text = log_text != null ? new String(log_text) : null;
|
||||||
clone.exp_reward = exp_reward != null ? new Integer(exp_reward) : null;
|
clone.exp_reward = exp_reward != null ? new Integer(exp_reward) : null;
|
||||||
clone.finishes_quest = finishes_quest != null ? new Integer(finishes_quest) : null;
|
clone.finishes_quest = finishes_quest != null ? new Integer(finishes_quest) : null;
|
||||||
clone.id = this.id;
|
clone.id = this.id;
|
||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
@Override
|
@Override
|
||||||
public void parse(Map jsonObj) {
|
public void parse(Map jsonObj) {
|
||||||
progress = JSONElement.getInteger((Number) jsonObj.get("progress"));
|
progress = JSONElement.getInteger((Number) jsonObj.get("progress"));
|
||||||
this.id = ((Quest)parent).id+":"+progress;
|
this.id = ((Quest) parent).id + ":" + progress;
|
||||||
log_text = (String) jsonObj.get("logText");
|
log_text = (String) jsonObj.get("logText");
|
||||||
exp_reward = JSONElement.getInteger((Number) jsonObj.get("rewardExperience"));
|
exp_reward = JSONElement.getInteger((Number) jsonObj.get("rewardExperience"));
|
||||||
finishes_quest = JSONElement.getInteger((Number) jsonObj.get("finishesQuest"));
|
finishes_quest = JSONElement.getInteger((Number) jsonObj.get("finishesQuest"));
|
||||||
state = State.parsed;
|
state = State.parsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
@Override
|
@Override
|
||||||
public Map toJson() {
|
public Map toJson() {
|
||||||
Map stageJson = new LinkedHashMap();
|
Map stageJson = new LinkedHashMap();
|
||||||
if (progress != null) stageJson.put("progress", progress);
|
if (progress != null) stageJson.put("progress", progress);
|
||||||
if (log_text != null) stageJson.put("logText", log_text);
|
if (log_text != null) stageJson.put("logText", log_text);
|
||||||
if (exp_reward != null) stageJson.put("rewardExperience", exp_reward);
|
if (exp_reward != null) stageJson.put("rewardExperience", exp_reward);
|
||||||
if (finishes_quest != null) stageJson.put("finishesQuest", finishes_quest);
|
if (finishes_quest != null) stageJson.put("finishesQuest", finishes_quest);
|
||||||
return stageJson;
|
return stageJson;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
return progress+" - "+(exp_reward != null ? "["+exp_reward+"XP]" : "")+((finishes_quest != null) && (finishes_quest == 1) ? "[END]" : "")+log_text;
|
return progress + " - " + (exp_reward != null ? "[" + exp_reward + "XP]" : "") + ((finishes_quest != null) && (finishes_quest == 1) ? "[END]" : "") + log_text;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
if (shouldSkipParseOrLink()) {
|
||||||
//This type of state is unrelated to parsing/linking.
|
return;
|
||||||
return;
|
}
|
||||||
}
|
ensureParseIfNeeded();
|
||||||
if (this.state == State.init) {
|
|
||||||
//Not parsed yet.
|
|
||||||
this.parse();
|
|
||||||
} else if (this.state == State.linked) {
|
|
||||||
//Already linked.
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Nothing to link to :D
|
//Nothing to link to :D
|
||||||
this.state = State.linked;
|
this.state = State.linked;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
// Nothing to link to.
|
// Nothing to link to.
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getProjectFilename() {
|
public String getProjectFilename() {
|
||||||
return ((Quest)parent).getProjectFilename();
|
return ((Quest) parent).getProjectFilename();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataElement clone() {
|
public GameDataElement clone() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return DefaultIcons.getQuestIcon();
|
return DefaultIcons.getQuestIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Image getImage() {
|
public Image getImage() {
|
||||||
return DefaultIcons.getQuestImage();
|
return DefaultIcons.getQuestImage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,260 +1,230 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.gamedata;
|
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.ArrayList;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
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 {
|
public class Requirement extends JSONElement {
|
||||||
|
|
||||||
private static final long serialVersionUID = 7295593297142310955L;
|
private static final long serialVersionUID = 7295593297142310955L;
|
||||||
|
|
||||||
private static Map<RequirementType, List<RequirementType>> COMPATIBLE_TYPES = new LinkedHashMap<RequirementType, List<RequirementType>>();
|
private static Map<RequirementType, List<RequirementType>> COMPATIBLE_TYPES = new LinkedHashMap<RequirementType, List<RequirementType>>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
List<RequirementType> questTypes = new ArrayList<RequirementType>();
|
List<RequirementType> questTypes = new ArrayList<RequirementType>();
|
||||||
questTypes.add(RequirementType.questProgress);
|
questTypes.add(RequirementType.questProgress);
|
||||||
questTypes.add(RequirementType.questLatestProgress);
|
questTypes.add(RequirementType.questLatestProgress);
|
||||||
COMPATIBLE_TYPES.put(RequirementType.questProgress, questTypes);
|
COMPATIBLE_TYPES.put(RequirementType.questProgress, questTypes);
|
||||||
COMPATIBLE_TYPES.put(RequirementType.questLatestProgress, questTypes);
|
COMPATIBLE_TYPES.put(RequirementType.questLatestProgress, questTypes);
|
||||||
|
|
||||||
List<RequirementType> countedItemTypes = new ArrayList<RequirementType>();
|
List<RequirementType> countedItemTypes = new ArrayList<RequirementType>();
|
||||||
countedItemTypes.add(RequirementType.inventoryRemove);
|
countedItemTypes.add(RequirementType.inventoryRemove);
|
||||||
countedItemTypes.add(RequirementType.inventoryKeep);
|
countedItemTypes.add(RequirementType.inventoryKeep);
|
||||||
countedItemTypes.add(RequirementType.usedItem);
|
countedItemTypes.add(RequirementType.usedItem);
|
||||||
countedItemTypes.add(RequirementType.wear);
|
countedItemTypes.add(RequirementType.wear);
|
||||||
countedItemTypes.add(RequirementType.wearRemove);
|
countedItemTypes.add(RequirementType.wearRemove);
|
||||||
COMPATIBLE_TYPES.put(RequirementType.inventoryRemove, countedItemTypes);
|
COMPATIBLE_TYPES.put(RequirementType.inventoryRemove, countedItemTypes);
|
||||||
COMPATIBLE_TYPES.put(RequirementType.inventoryKeep, countedItemTypes);
|
COMPATIBLE_TYPES.put(RequirementType.inventoryKeep, countedItemTypes);
|
||||||
COMPATIBLE_TYPES.put(RequirementType.usedItem, countedItemTypes);
|
COMPATIBLE_TYPES.put(RequirementType.usedItem, countedItemTypes);
|
||||||
COMPATIBLE_TYPES.put(RequirementType.wear, countedItemTypes);
|
COMPATIBLE_TYPES.put(RequirementType.wear, countedItemTypes);
|
||||||
COMPATIBLE_TYPES.put(RequirementType.wearRemove, countedItemTypes);
|
COMPATIBLE_TYPES.put(RequirementType.wearRemove, countedItemTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Available from parsed state
|
//Available from parsed state
|
||||||
public RequirementType type = null;
|
public RequirementType type = null;
|
||||||
public String required_obj_id = null;
|
public String required_obj_id = null;
|
||||||
public Integer required_value = null;
|
public Integer required_value = null;
|
||||||
public Boolean negated = null;
|
public Boolean negated = null;
|
||||||
|
|
||||||
//Available from linked state
|
//Available from linked state
|
||||||
public GameDataElement required_obj = null;
|
public GameDataElement required_obj = null;
|
||||||
|
|
||||||
public enum RequirementType {
|
public enum RequirementType {
|
||||||
questProgress,
|
questProgress,
|
||||||
questLatestProgress,
|
questLatestProgress,
|
||||||
inventoryRemove,
|
inventoryRemove,
|
||||||
inventoryKeep,
|
inventoryKeep,
|
||||||
wear,
|
wear,
|
||||||
skillLevel,
|
skillLevel,
|
||||||
killedMonster,
|
killedMonster,
|
||||||
timerElapsed,
|
timerElapsed,
|
||||||
usedItem,
|
usedItem,
|
||||||
spentGold,
|
spentGold,
|
||||||
consumedBonemeals,
|
consumedBonemeals,
|
||||||
hasActorCondition,
|
hasActorCondition,
|
||||||
factionScore,
|
factionScore,
|
||||||
random,
|
random,
|
||||||
factionScoreEquals,
|
factionScoreEquals,
|
||||||
wearRemove
|
wearRemove,
|
||||||
}
|
date,
|
||||||
|
dateEquals,
|
||||||
|
time,
|
||||||
|
timeEquals
|
||||||
|
}
|
||||||
|
|
||||||
public enum SkillID {
|
public enum SkillID {
|
||||||
weaponChance
|
weaponChance, weaponDmg, barter, dodge, barkSkin, moreCriticals, betterCriticals, speed // Raises max ap
|
||||||
,weaponDmg
|
, coinfinder, moreExp, cleave // +10ap on kill
|
||||||
,barter
|
, eater // +1hp per kill
|
||||||
,dodge
|
, fortitude // +N hp per levelup
|
||||||
,barkSkin
|
, evasion // increase successful flee chance & reduce chance of monster attack
|
||||||
,moreCriticals
|
, regeneration // +N hp per round
|
||||||
,betterCriticals
|
, lowerExploss, magicfinder, resistanceMental // lowers chance to get negative active conditions by monsters (Mental like Dazed)
|
||||||
,speed // Raises max ap
|
, resistancePhysical // lowers chance to get negative active conditions by monsters (Physical Capacity like Minor fatigue)
|
||||||
,coinfinder
|
, resistanceBlood // lowers chance to get negative active conditions by monsters (Blood Disorder like Weak Poison)
|
||||||
,moreExp
|
, shadowBless, sporeImmunity, crit1 // lowers atk ability
|
||||||
,cleave // +10ap on kill
|
, crit2 // lowers def ability ,rejuvenation // Reduces magnitudes of conditions
|
||||||
,eater // +1hp per kill
|
, rejuvenation // Reduces magnitudes of conditions
|
||||||
,fortitude // +N hp per levelup
|
, taunt // Causes AP loss of attackers that miss
|
||||||
,evasion // increase successful flee chance & reduce chance of monster attack
|
, concussion // AC loss for monsters with (AC-BC)>N
|
||||||
,regeneration // +N hp per round
|
, weaponProficiencyDagger, weaponProficiency1hsword, weaponProficiency2hsword, weaponProficiencyAxe, weaponProficiencyBlunt, weaponProficiencyUnarmed, weaponProficiencyPole, armorProficiencyShield, armorProficiencyUnarmored, armorProficiencyLight, armorProficiencyHeavy, fightstyleDualWield, fightstyle2hand, fightstyleWeaponShield, specializationDualWield, specialization2hand, specializationWeaponShield
|
||||||
,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
|
@Override
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
String obj_id = "";
|
String obj_id = "";
|
||||||
if (required_obj_id != null)
|
if (required_obj_id != null) {
|
||||||
{
|
obj_id = required_obj_id;
|
||||||
obj_id = required_obj_id;
|
if (type != null && type == RequirementType.random) {
|
||||||
if (type != null && type == RequirementType.random){
|
obj_id = " Chance " + obj_id + (required_obj_id.contains("/") ? "" : "%");
|
||||||
obj_id = " Chance " + obj_id + (required_obj_id.contains("/") ? "" : "%");
|
} else {
|
||||||
}
|
obj_id += ":";
|
||||||
else {
|
}
|
||||||
obj_id += ":";
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ((negated != null && negated) ? "NOT " : "")
|
return ((negated != null && negated) ? "NOT " : "")
|
||||||
+(type == null ? "" : type.toString()+":")
|
+ (type == null ? "" : type.toString() + ":")
|
||||||
+obj_id
|
+ obj_id
|
||||||
+(required_value == null ? "" : required_value.toString());
|
+ (required_value == null ? "" : required_value.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void parse() {
|
public void parse() {
|
||||||
throw new Error("Thou shalt not reach this method.");
|
throw new Error("Thou shalt not reach this method.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
@Override
|
@Override
|
||||||
public Map toJson() {
|
public Map toJson() {
|
||||||
throw new Error("Thou shalt not reach this method.");
|
throw new Error("Thou shalt not reach this method.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
@Override
|
@Override
|
||||||
public void parse(Map jsonObj) {
|
public void parse(Map jsonObj) {
|
||||||
throw new Error("Thou shalt not reach this method.");
|
throw new Error("Thou shalt not reach this method.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (this.state == State.created || this.state == State.modified || this.state == State.saved) {
|
if (shouldSkipParseOrLink()) {
|
||||||
//This type of state is unrelated to parsing/linking.
|
return;
|
||||||
return;
|
}
|
||||||
}
|
ensureParseIfNeeded();
|
||||||
if (this.state == State.init) {
|
Project proj = getProject();
|
||||||
//Not parsed yet.
|
if (proj == null) {
|
||||||
this.parse();
|
Notification.addError("Error linking requirement " + getDesc() + ". No parent project found.");
|
||||||
} else if (this.state == State.linked) {
|
return;
|
||||||
//Already linked.
|
}
|
||||||
return;
|
switch (type) {
|
||||||
}
|
case hasActorCondition:
|
||||||
Project proj = getProject();
|
this.required_obj = proj.getActorCondition(required_obj_id);
|
||||||
if (proj == null) {
|
break;
|
||||||
Notification.addError("Error linking requirement "+getDesc()+". No parent project found.");
|
case inventoryKeep:
|
||||||
return;
|
case inventoryRemove:
|
||||||
}
|
case usedItem:
|
||||||
switch (type) {
|
case wear:
|
||||||
case hasActorCondition:
|
case wearRemove:
|
||||||
this.required_obj = proj.getActorCondition(required_obj_id);
|
this.required_obj = proj.getItem(required_obj_id);
|
||||||
break;
|
break;
|
||||||
case inventoryKeep:
|
case killedMonster:
|
||||||
case inventoryRemove:
|
this.required_obj = proj.getNPC(required_obj_id);
|
||||||
case usedItem:
|
break;
|
||||||
case wear:
|
case questLatestProgress:
|
||||||
case wearRemove:
|
case questProgress:
|
||||||
this.required_obj = proj.getItem(required_obj_id);
|
this.required_obj = proj.getQuest(required_obj_id);
|
||||||
break;
|
if (this.required_obj != null && this.required_value != null) {
|
||||||
case killedMonster:
|
QuestStage stage = ((Quest) this.required_obj).getStage(this.required_value);
|
||||||
this.required_obj = proj.getNPC(required_obj_id);
|
if (stage != null) {
|
||||||
break;
|
stage.addBacklink((GameDataElement) this.parent);
|
||||||
case questLatestProgress:
|
}
|
||||||
case questProgress:
|
}
|
||||||
this.required_obj = proj.getQuest(required_obj_id);
|
break;
|
||||||
if (this.required_obj != null && this.required_value != null) {
|
case consumedBonemeals:
|
||||||
QuestStage stage = ((Quest)this.required_obj).getStage(this.required_value);
|
case skillLevel:
|
||||||
if (stage != null) {
|
case spentGold:
|
||||||
stage.addBacklink((GameDataElement) this.parent);
|
case timerElapsed:
|
||||||
}
|
case factionScore:
|
||||||
}
|
case factionScoreEquals:
|
||||||
break;
|
case random:
|
||||||
case consumedBonemeals:
|
case date:
|
||||||
case skillLevel:
|
case dateEquals:
|
||||||
case spentGold:
|
case time:
|
||||||
case timerElapsed:
|
case timeEquals:
|
||||||
case factionScore:
|
break;
|
||||||
case factionScoreEquals:
|
}
|
||||||
case random:
|
if (this.required_obj != null) this.required_obj.addBacklink((GameDataElement) this.parent);
|
||||||
break;
|
this.state = State.linked;
|
||||||
}
|
}
|
||||||
if (this.required_obj != null) this.required_obj.addBacklink((GameDataElement) this.parent);
|
|
||||||
this.state = State.linked;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataElement clone() {
|
public GameDataElement clone() {
|
||||||
return clone(null);
|
return clone(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public GameDataElement clone(GameDataElement parent) {
|
public GameDataElement clone(GameDataElement parent) {
|
||||||
Requirement clone = new Requirement();
|
Requirement clone = new Requirement();
|
||||||
clone.parent = parent;
|
clone.parent = parent;
|
||||||
clone.jsonFile = this.jsonFile;
|
clone.jsonFile = this.jsonFile;
|
||||||
clone.state = this.state;
|
clone.state = this.state;
|
||||||
clone.required_obj_id = this.required_obj_id;
|
clone.required_obj_id = this.required_obj_id;
|
||||||
clone.required_value = this.required_value;
|
clone.required_value = this.required_value;
|
||||||
clone.negated = this.negated;
|
clone.negated = this.negated;
|
||||||
clone.required_obj = this.required_obj;
|
clone.required_obj = this.required_obj;
|
||||||
clone.type = this.type;
|
clone.type = this.type;
|
||||||
if (clone.required_obj != null && parent != null) {
|
if (clone.required_obj != null && parent != null) {
|
||||||
clone.required_obj.addBacklink(parent);
|
clone.required_obj.addBacklink(parent);
|
||||||
}
|
}
|
||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
if (this.required_obj == oldOne) {
|
if (this.required_obj == oldOne) {
|
||||||
oldOne.removeBacklink((GameDataElement) this.parent);
|
oldOne.removeBacklink((GameDataElement) this.parent);
|
||||||
this.required_obj = newOne;
|
this.required_obj = newOne;
|
||||||
if (newOne != null) newOne.addBacklink((GameDataElement) this.parent);
|
if (newOne != null) newOne.addBacklink((GameDataElement) this.parent);
|
||||||
}
|
}
|
||||||
if (oldOne instanceof QuestStage) {
|
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)) {
|
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);
|
oldOne.removeBacklink((GameDataElement) this.parent);
|
||||||
if (newOne != null) newOne.addBacklink((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) {
|
@Override
|
||||||
if (COMPATIBLE_TYPES.get(type) == null || !COMPATIBLE_TYPES.get(type).contains(destType)) {
|
public String getProjectFilename() {
|
||||||
required_obj = null;
|
throw new Error("Thou shalt not reach this method.");
|
||||||
required_obj_id = null;
|
}
|
||||||
required_value = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(destType==RequirementType.random)
|
public void changeType(RequirementType destType) {
|
||||||
{
|
if (COMPATIBLE_TYPES.get(type) == null || !COMPATIBLE_TYPES.get(type).contains(destType)) {
|
||||||
required_obj_id = "50/100";
|
required_obj = null;
|
||||||
}
|
required_obj_id = null;
|
||||||
|
required_value = null;
|
||||||
|
}
|
||||||
|
|
||||||
type = destType;
|
if (destType == RequirementType.random) {
|
||||||
}
|
required_obj_id = "50/100";
|
||||||
|
}
|
||||||
|
|
||||||
|
type = destType;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,45 +1,46 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||||
|
|
||||||
import java.awt.Image;
|
|
||||||
|
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Droplist;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
public class ContainerArea extends MapObject {
|
public class ContainerArea extends MapObject {
|
||||||
|
|
||||||
public Droplist droplist = null;
|
public Droplist droplist = null;
|
||||||
|
|
||||||
public ContainerArea(tiled.core.MapObject obj) {}
|
public ContainerArea(tiled.core.MapObject obj) {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
droplist = parentMap.getProject().getDroplist(name);
|
droplist = parentMap.getProject().getDroplist(name);
|
||||||
if (droplist != null) {
|
if (droplist != null) {
|
||||||
droplist.addBacklink(parentMap);
|
droplist.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
if (droplist != null) return DefaultIcons.getContainerIcon();
|
if (droplist != null) return DefaultIcons.getContainerIcon();
|
||||||
else return DefaultIcons.getNullifyIcon();
|
else return DefaultIcons.getNullifyIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
if (oldOne == droplist) {
|
if (oldOne == droplist) {
|
||||||
oldOne.removeBacklink(parentMap);
|
oldOne.removeBacklink(parentMap);
|
||||||
droplist = (Droplist) newOne;
|
droplist = (Droplist) newOne;
|
||||||
if (newOne != null) newOne.addBacklink(parentMap);
|
if (newOne != null) newOne.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||||
if (droplist != null) {
|
if (droplist != null) {
|
||||||
tmxObject.setName(droplist.id);
|
tmxObject.setName(droplist.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,116 +1,117 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||||
|
|
||||||
import java.awt.Image;
|
|
||||||
|
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Requirement;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Requirement;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
public class KeyArea extends MapObject {
|
public class KeyArea extends MapObject {
|
||||||
|
|
||||||
public String dialogue_id = null;
|
public String dialogue_id;
|
||||||
public Dialogue dialogue = null;
|
public Dialogue dialogue = null;
|
||||||
public Requirement requirement = null;
|
public Requirement requirement;
|
||||||
public boolean oldSchoolRequirement = true;
|
public boolean oldSchoolRequirement;
|
||||||
|
|
||||||
public KeyArea(tiled.core.MapObject obj) {
|
public KeyArea(tiled.core.MapObject obj) {
|
||||||
dialogue_id = obj.getProperties().getProperty("phrase");
|
dialogue_id = obj.getProperties().getProperty("phrase");
|
||||||
String requireType = obj.getProperties().getProperty("requireType");
|
String requireType = obj.getProperties().getProperty("requireType");
|
||||||
String requireId = obj.getProperties().getProperty("requireId");
|
String requireId = obj.getProperties().getProperty("requireId");
|
||||||
String requireValue = obj.getProperties().getProperty("requireValue");
|
String requireValue = obj.getProperties().getProperty("requireValue");
|
||||||
String requireNegation = obj.getProperties().getProperty("requireNegation");
|
String requireNegation = obj.getProperties().getProperty("requireNegation");
|
||||||
oldSchoolRequirement = false;
|
oldSchoolRequirement = false;
|
||||||
if (requireType == null) {
|
if (requireType == null) {
|
||||||
String[] fields = obj.getName().split(":");
|
String[] fields = obj.getName().split(":");
|
||||||
if (fields.length == 2) {
|
if (fields.length == 2) {
|
||||||
requireType = Requirement.RequirementType.questProgress.toString();
|
requireType = Requirement.RequirementType.questProgress.toString();
|
||||||
requireValue = fields[1];
|
requireValue = fields[1];
|
||||||
requireId = fields[0];
|
requireId = fields[0];
|
||||||
oldSchoolRequirement = true;
|
oldSchoolRequirement = true;
|
||||||
} else if (fields.length == 3) {
|
} else if (fields.length == 3) {
|
||||||
requireValue = fields[2];
|
requireValue = fields[2];
|
||||||
requireType = fields[0];
|
requireType = fields[0];
|
||||||
requireId = fields[1];
|
requireId = fields[1];
|
||||||
oldSchoolRequirement = true;
|
oldSchoolRequirement = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
requirement = new Requirement();
|
requirement = new Requirement();
|
||||||
if (requireType != null) requirement.type = Requirement.RequirementType.valueOf(requireType);
|
if (requireType != null) requirement.type = Requirement.RequirementType.valueOf(requireType);
|
||||||
requirement.required_obj_id = requireId;
|
requirement.required_obj_id = requireId;
|
||||||
if (requireValue != null) requirement.required_value = Integer.parseInt(requireValue);
|
if (requireValue != null) requirement.required_value = Integer.parseInt(requireValue);
|
||||||
if (requireNegation != null) requirement.negated = Boolean.parseBoolean(requireNegation);
|
if (requireNegation != null) requirement.negated = Boolean.parseBoolean(requireNegation);
|
||||||
requirement.state = GameDataElement.State.parsed;
|
requirement.state = GameDataElement.State.parsed;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (dialogue_id != null) dialogue = parentMap.getProject().getDialogue(dialogue_id);
|
if (dialogue_id != null) dialogue = parentMap.getProject().getDialogue(dialogue_id);
|
||||||
if (dialogue != null) {
|
if (dialogue != null) {
|
||||||
dialogue.addBacklink(parentMap);
|
dialogue.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
requirement.parent = parentMap;
|
requirement.parent = parentMap;
|
||||||
requirement.link();
|
requirement.link();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
if (dialogue != null && requirement != null) return DefaultIcons.getKeyIcon();
|
if (dialogue != null && requirement != null) return DefaultIcons.getKeyIcon();
|
||||||
return DefaultIcons.getNullifyIcon();
|
return DefaultIcons.getNullifyIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
if (oldOne == dialogue) {
|
if (oldOne == dialogue) {
|
||||||
oldOne.removeBacklink(parentMap);
|
oldOne.removeBacklink(parentMap);
|
||||||
dialogue = (Dialogue) newOne;
|
dialogue = (Dialogue) newOne;
|
||||||
if (newOne != null) newOne.addBacklink(parentMap);
|
if (newOne != null) newOne.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
requirement.elementChanged(oldOne, newOne);
|
requirement.elementChanged(oldOne, newOne);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||||
if (dialogue != null) {
|
if (dialogue != null) {
|
||||||
tmxObject.getProperties().setProperty("phrase", dialogue.id);
|
tmxObject.getProperties().setProperty("phrase", dialogue.id);
|
||||||
} else if (dialogue_id != null) {
|
} else if (dialogue_id != null) {
|
||||||
tmxObject.getProperties().setProperty("phrase", dialogue_id);
|
tmxObject.getProperties().setProperty("phrase", dialogue_id);
|
||||||
}
|
}
|
||||||
if (requirement != null) {
|
if (requirement != null) {
|
||||||
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
|
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)));
|
tmxObject.setName(requirement.required_obj_id + ":" + ((requirement.required_value == null) ? "" : Integer.toString(requirement.required_value)));
|
||||||
} else {
|
} else {
|
||||||
if (requirement.type != null) {
|
if (requirement.type != null) {
|
||||||
tmxObject.getProperties().setProperty("requireType", requirement.type.toString());
|
tmxObject.getProperties().setProperty("requireType", requirement.type.toString());
|
||||||
}
|
}
|
||||||
if (requirement.required_obj != null) {
|
if (requirement.required_obj != null) {
|
||||||
tmxObject.getProperties().setProperty("requireId", requirement.required_obj.id);
|
tmxObject.getProperties().setProperty("requireId", requirement.required_obj.id);
|
||||||
} else if (requirement.required_obj_id != null) {
|
} else if (requirement.required_obj_id != null) {
|
||||||
tmxObject.getProperties().setProperty("requireId", requirement.required_obj_id);
|
tmxObject.getProperties().setProperty("requireId", requirement.required_obj_id);
|
||||||
}
|
}
|
||||||
if (requirement.required_value != null) {
|
if (requirement.required_value != null) {
|
||||||
tmxObject.getProperties().setProperty("requireValue", requirement.required_value.toString());
|
tmxObject.getProperties().setProperty("requireValue", requirement.required_value.toString());
|
||||||
}
|
}
|
||||||
if (requirement.negated != null) {
|
if (requirement.negated != null) {
|
||||||
tmxObject.getProperties().setProperty("requireNegation", Boolean.toString(requirement.negated));
|
tmxObject.getProperties().setProperty("requireNegation", Boolean.toString(requirement.negated));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateNameFromRequirementChange() {
|
public void updateNameFromRequirementChange() {
|
||||||
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
|
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));
|
name = (requirement.negated != null && requirement.negated) ? "NOT " : "" + requirement.required_obj_id + ":" + ((requirement.required_value == null) ? "" : Integer.toString(
|
||||||
} else if (oldSchoolRequirement) {
|
requirement.required_value));
|
||||||
int i = 0;
|
} else if (oldSchoolRequirement) {
|
||||||
String futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
int i = 0;
|
||||||
while (parentMap.getMapObject(futureName) != null) {
|
String futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
||||||
i++;
|
while (parentMap.getMapObject(futureName) != null) {
|
||||||
futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
i++;
|
||||||
}
|
futureName = requirement.type.toString() + "#" + Integer.toString(i);
|
||||||
this.name = futureName;
|
}
|
||||||
}
|
this.name = futureName;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,58 +1,57 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||||
|
|
||||||
import java.awt.Image;
|
|
||||||
|
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
|
|
||||||
public class MapChange extends MapObject {
|
public class MapChange extends MapObject {
|
||||||
|
|
||||||
public String map_id = null;
|
public String map_id;
|
||||||
public TMXMap map = null;
|
public TMXMap map = null;
|
||||||
public String place_id = null;
|
public String place_id;
|
||||||
|
|
||||||
public MapChange(tiled.core.MapObject obj) {
|
public MapChange(tiled.core.MapObject obj) {
|
||||||
this.map_id = obj.getProperties().getProperty("map");
|
this.map_id = obj.getProperties().getProperty("map");
|
||||||
this.place_id = obj.getProperties().getProperty("place");
|
this.place_id = obj.getProperties().getProperty("place");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (map_id != null) this.map = parentMap.getProject().getMap(map_id);
|
if (map_id != null) this.map = parentMap.getProject().getMap(map_id);
|
||||||
if (map != null) {
|
if (map != null) {
|
||||||
map.addBacklink(parentMap);
|
map.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
//TODO reinstate this if data validation system ever exist.
|
//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).");
|
// 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
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
if (name != null) return DefaultIcons.getTiledIconIcon();
|
if (name != null) return DefaultIcons.getTiledIconIcon();
|
||||||
else return DefaultIcons.getNullifyIcon();
|
else return DefaultIcons.getNullifyIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
if (oldOne == map) {
|
if (oldOne == map) {
|
||||||
oldOne.removeBacklink(parentMap);
|
oldOne.removeBacklink(parentMap);
|
||||||
map = (TMXMap) newOne;
|
map = (TMXMap) newOne;
|
||||||
if (newOne != null) newOne.addBacklink(parentMap);
|
if (newOne != null) newOne.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||||
if (map != null) {
|
if (map != null) {
|
||||||
tmxObject.getProperties().setProperty("map", map.id);
|
tmxObject.getProperties().setProperty("map", map.id);
|
||||||
} else if (map_id != null) {
|
} else if (map_id != null) {
|
||||||
tmxObject.getProperties().setProperty("map", map_id);
|
tmxObject.getProperties().setProperty("map", map_id);
|
||||||
}
|
}
|
||||||
if (place_id != null) {
|
if (place_id != null) {
|
||||||
tmxObject.getProperties().setProperty("place", place_id);
|
tmxObject.getProperties().setProperty("place", place_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,171 +1,171 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||||
|
|
||||||
import java.awt.Image;
|
|
||||||
|
|
||||||
import com.gpl.rpg.atcontentstudio.Notification;
|
import com.gpl.rpg.atcontentstudio.Notification;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
public abstract class MapObject {
|
public abstract class MapObject {
|
||||||
|
|
||||||
public int x, y, w, h;
|
public int x, y, w, h;
|
||||||
public String name;
|
public String name;
|
||||||
|
|
||||||
public TMXMap parentMap;
|
public TMXMap parentMap;
|
||||||
|
|
||||||
public Types type;
|
public Types type;
|
||||||
|
|
||||||
protected static enum Types {
|
protected static enum Types {
|
||||||
mapchange,
|
mapchange,
|
||||||
spawn,
|
spawn,
|
||||||
rest,
|
rest,
|
||||||
key,
|
key,
|
||||||
replace,
|
replace,
|
||||||
script,
|
script,
|
||||||
container,
|
container,
|
||||||
sign
|
sign
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static MapObject buildObject(tiled.core.MapObject obj, TMXMap parentMap) {
|
public static MapObject buildObject(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||||
MapObject result = null;
|
MapObject result = null;
|
||||||
if (obj.getType() != null && !obj.getType().equals("") && Types.valueOf(obj.getType()) != null) {
|
if (obj.getType() != null && !obj.getType().equals("") && Types.valueOf(obj.getType()) != null) {
|
||||||
switch (Types.valueOf(obj.getType())) {
|
switch (Types.valueOf(obj.getType())) {
|
||||||
case key:
|
case key:
|
||||||
result = new KeyArea(obj);
|
result = new KeyArea(obj);
|
||||||
result.type = Types.key;
|
result.type = Types.key;
|
||||||
break;
|
break;
|
||||||
case mapchange:
|
case mapchange:
|
||||||
result = new MapChange(obj);
|
result = new MapChange(obj);
|
||||||
result.type = Types.mapchange;
|
result.type = Types.mapchange;
|
||||||
break;
|
break;
|
||||||
case replace:
|
case replace:
|
||||||
result = new ReplaceArea(obj);
|
result = new ReplaceArea(obj);
|
||||||
result.type = Types.replace;
|
result.type = Types.replace;
|
||||||
break;
|
break;
|
||||||
case rest:
|
case rest:
|
||||||
result = new RestArea(obj);
|
result = new RestArea(obj);
|
||||||
result.type = Types.rest;
|
result.type = Types.rest;
|
||||||
break;
|
break;
|
||||||
case script:
|
case script:
|
||||||
result = new ScriptArea(obj);
|
result = new ScriptArea(obj);
|
||||||
result.type = Types.script;
|
result.type = Types.script;
|
||||||
break;
|
break;
|
||||||
case sign:
|
case sign:
|
||||||
result = new SignArea(obj);
|
result = new SignArea(obj);
|
||||||
result.type = Types.sign;
|
result.type = Types.sign;
|
||||||
break;
|
break;
|
||||||
case spawn:
|
case spawn:
|
||||||
result = new SpawnArea(obj);
|
result = new SpawnArea(obj);
|
||||||
result.type = Types.spawn;
|
result.type = Types.spawn;
|
||||||
break;
|
break;
|
||||||
case container:
|
case container:
|
||||||
result = new ContainerArea(obj);
|
result = new ContainerArea(obj);
|
||||||
result.type = Types.container;
|
result.type = Types.container;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Notification.addWarn("Unknown map object type: "+obj.getType()+"with name "+obj.getName()+" in map "+parentMap.id);
|
Notification.addWarn("Unknown map object type: " + obj.getType() + "with name " + obj.getName() + " in map " + parentMap.id);
|
||||||
}
|
}
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
result.x = obj.getX();
|
result.x = obj.getX();
|
||||||
result.y = obj.getY();
|
result.y = obj.getY();
|
||||||
result.w = obj.getWidth();
|
result.w = obj.getWidth();
|
||||||
result.h = obj.getHeight();
|
result.h = obj.getHeight();
|
||||||
result.name = obj.getName();
|
result.name = obj.getName();
|
||||||
result.parentMap = parentMap;
|
result.parentMap = parentMap;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void link();
|
public abstract void link();
|
||||||
|
|
||||||
public abstract Image getIcon();
|
public abstract Image getIcon();
|
||||||
|
|
||||||
public abstract void elementChanged(GameDataElement oldOne, GameDataElement newOne);
|
public abstract void elementChanged(GameDataElement oldOne, GameDataElement newOne);
|
||||||
|
|
||||||
public tiled.core.MapObject toTmxObject() {
|
public tiled.core.MapObject toTmxObject() {
|
||||||
tiled.core.MapObject tmxObject = new tiled.core.MapObject(x, y, w, h);
|
tiled.core.MapObject tmxObject = new tiled.core.MapObject(x, y, w, h);
|
||||||
tmxObject.setName(name);
|
tmxObject.setName(name);
|
||||||
tmxObject.setType(type.toString());
|
tmxObject.setType(type.toString());
|
||||||
savePropertiesInTmxObject(tmxObject);
|
savePropertiesInTmxObject(tmxObject);
|
||||||
return tmxObject;
|
return tmxObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void savePropertiesInTmxObject(tiled.core.MapObject tmxObject);
|
public abstract void savePropertiesInTmxObject(tiled.core.MapObject tmxObject);
|
||||||
|
|
||||||
public static MapObject newMapchange(tiled.core.MapObject obj, TMXMap parentMap) {
|
public static MapObject newMapchange(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||||
if (obj.getName() == null) obj.setName("Mapchange");
|
if (obj.getName() == null) obj.setName("Mapchange");
|
||||||
MapObject result = new MapChange(obj);
|
MapObject result = new MapChange(obj);
|
||||||
result.type = Types.mapchange;
|
result.type = Types.mapchange;
|
||||||
initObj(result, obj, parentMap);
|
initObj(result, obj, parentMap);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MapObject newSpawnArea(tiled.core.MapObject obj, TMXMap parentMap) {
|
public static MapObject newSpawnArea(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||||
if (obj.getName() == null) obj.setName("Spawnarea");
|
if (obj.getName() == null) obj.setName("Spawnarea");
|
||||||
MapObject result = new SpawnArea(obj);
|
MapObject result = new SpawnArea(obj);
|
||||||
result.type = Types.spawn;
|
result.type = Types.spawn;
|
||||||
initObj(result, obj, parentMap);
|
initObj(result, obj, parentMap);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MapObject newRest(tiled.core.MapObject obj, TMXMap parentMap) {
|
public static MapObject newRest(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||||
if (obj.getName() == null) obj.setName("Rest");
|
if (obj.getName() == null) obj.setName("Rest");
|
||||||
MapObject result = new RestArea(obj);
|
MapObject result = new RestArea(obj);
|
||||||
result.type = Types.rest;
|
result.type = Types.rest;
|
||||||
initObj(result, obj, parentMap);
|
initObj(result, obj, parentMap);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MapObject newKey(tiled.core.MapObject obj, TMXMap parentMap) {
|
public static MapObject newKey(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||||
if (obj.getName() == null) obj.setName("Key");
|
if (obj.getName() == null) obj.setName("Key");
|
||||||
MapObject result = new KeyArea(obj);
|
MapObject result = new KeyArea(obj);
|
||||||
result.type = Types.key;
|
result.type = Types.key;
|
||||||
initObj(result, obj, parentMap);
|
initObj(result, obj, parentMap);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MapObject newReplace(tiled.core.MapObject obj, TMXMap parentMap) {
|
public static MapObject newReplace(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||||
if (obj.getName() == null) obj.setName("Replace");
|
if (obj.getName() == null) obj.setName("Replace");
|
||||||
MapObject result = new ReplaceArea(obj);
|
MapObject result = new ReplaceArea(obj);
|
||||||
result.type = Types.replace;
|
result.type = Types.replace;
|
||||||
initObj(result, obj, parentMap);
|
initObj(result, obj, parentMap);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MapObject newScript(tiled.core.MapObject obj, TMXMap parentMap) {
|
public static MapObject newScript(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||||
if (obj.getName() == null) obj.setName("Script");
|
if (obj.getName() == null) obj.setName("Script");
|
||||||
MapObject result = new ScriptArea(obj);
|
MapObject result = new ScriptArea(obj);
|
||||||
result.type = Types.script;
|
result.type = Types.script;
|
||||||
initObj(result, obj, parentMap);
|
initObj(result, obj, parentMap);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MapObject newContainer(tiled.core.MapObject obj, TMXMap parentMap) {
|
public static MapObject newContainer(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||||
if (obj.getName() == null) obj.setName("Container");
|
if (obj.getName() == null) obj.setName("Container");
|
||||||
MapObject result = new ContainerArea(obj);
|
MapObject result = new ContainerArea(obj);
|
||||||
result.type = Types.container;
|
result.type = Types.container;
|
||||||
initObj(result, obj, parentMap);
|
initObj(result, obj, parentMap);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MapObject newSign(tiled.core.MapObject obj, TMXMap parentMap) {
|
public static MapObject newSign(tiled.core.MapObject obj, TMXMap parentMap) {
|
||||||
if (obj.getName() == null) obj.setName("Sign");
|
if (obj.getName() == null) obj.setName("Sign");
|
||||||
MapObject result = new SignArea(obj);
|
MapObject result = new SignArea(obj);
|
||||||
result.type = Types.sign;
|
result.type = Types.sign;
|
||||||
initObj(result, obj, parentMap);
|
initObj(result, obj, parentMap);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MapObject initObj(MapObject result, tiled.core.MapObject obj, TMXMap parentMap) {
|
private static MapObject initObj(MapObject result, tiled.core.MapObject obj, TMXMap parentMap) {
|
||||||
result.x = obj.getX();
|
result.x = obj.getX();
|
||||||
result.y = obj.getY();
|
result.y = obj.getY();
|
||||||
result.w = obj.getWidth();
|
result.w = obj.getWidth();
|
||||||
result.h = obj.getHeight();
|
result.h = obj.getHeight();
|
||||||
result.name = obj.getName();
|
result.name = obj.getName();
|
||||||
result.parentMap = parentMap;
|
result.parentMap = parentMap;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,60 +1,60 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||||
|
|
||||||
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
|
||||||
|
|
||||||
public class MapObjectGroup {
|
public class MapObjectGroup {
|
||||||
|
|
||||||
|
|
||||||
public tiled.core.ObjectGroup tmxGroup;
|
public tiled.core.ObjectGroup tmxGroup;
|
||||||
public TMXMap parentMap;
|
public TMXMap parentMap;
|
||||||
public String name;
|
public String name;
|
||||||
public boolean visible;
|
public boolean visible;
|
||||||
public List<MapObject> mapObjects = new ArrayList<MapObject>();
|
public List<MapObject> mapObjects = new ArrayList<MapObject>();
|
||||||
public Boolean active;
|
public Boolean active;
|
||||||
|
|
||||||
public MapObjectGroup(tiled.core.ObjectGroup layer, TMXMap map) {
|
public MapObjectGroup(tiled.core.ObjectGroup layer, TMXMap map) {
|
||||||
this.tmxGroup = layer;
|
this.tmxGroup = layer;
|
||||||
this.name = layer.getName();
|
this.name = layer.getName();
|
||||||
this.visible = layer.isVisible();
|
this.visible = layer.isVisible();
|
||||||
this.parentMap = map;
|
this.parentMap = map;
|
||||||
if (layer.getProperties().get("active") != null) {
|
if (layer.getProperties().get("active") != null) {
|
||||||
active = new Boolean(((String) layer.getProperties().get("active")));
|
active = new Boolean(((String) layer.getProperties().get("active")));
|
||||||
} else {
|
} else {
|
||||||
active = true;
|
active = true;
|
||||||
}
|
}
|
||||||
for (tiled.core.MapObject obj : layer.getObjectsList()) {
|
for (tiled.core.MapObject obj : layer.getObjectsList()) {
|
||||||
mapObjects.add(MapObject.buildObject(obj, map));
|
mapObjects.add(MapObject.buildObject(obj, map));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void link() {
|
public void link() {
|
||||||
for (MapObject obj : mapObjects) {
|
for (MapObject obj : mapObjects) {
|
||||||
obj.link();
|
obj.link();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
for (MapObject object : mapObjects) {
|
for (MapObject object : mapObjects) {
|
||||||
object.elementChanged(oldOne, newOne);
|
object.elementChanged(oldOne, newOne);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void pushBackToTiledProperties() {
|
public void pushBackToTiledProperties() {
|
||||||
if (tmxGroup != null) {
|
if (tmxGroup != null) {
|
||||||
tmxGroup.clear();
|
tmxGroup.clear();
|
||||||
} else {
|
} else {
|
||||||
tmxGroup = new tiled.core.ObjectGroup();
|
tmxGroup = new tiled.core.ObjectGroup();
|
||||||
}
|
}
|
||||||
tmxGroup.setVisible(visible);
|
tmxGroup.setVisible(visible);
|
||||||
tmxGroup.setName(name);
|
tmxGroup.setName(name);
|
||||||
if (!active) {
|
if (!active) {
|
||||||
tmxGroup.getProperties().put("active", Boolean.toString(active));
|
tmxGroup.getProperties().put("active", Boolean.toString(active));
|
||||||
}
|
}
|
||||||
for (MapObject object : mapObjects) {
|
for (MapObject object : mapObjects) {
|
||||||
tmxGroup.addObject(object.toTmxObject());
|
tmxGroup.addObject(object.toTmxObject());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,146 +1,134 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
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.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Requirement;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Requirement;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class ReplaceArea extends MapObject {
|
public class ReplaceArea extends MapObject {
|
||||||
|
|
||||||
public Requirement requirement = null;
|
public Requirement requirement;
|
||||||
public boolean oldSchoolRequirement = false;
|
public boolean oldSchoolRequirement = false;
|
||||||
|
|
||||||
public List<ReplaceArea.Replacement> replacements = null;
|
public List<ReplaceArea.Replacement> replacements = null;
|
||||||
|
|
||||||
public ReplaceArea(tiled.core.MapObject obj) {
|
public ReplaceArea(tiled.core.MapObject obj) {
|
||||||
String requireType = obj.getProperties().getProperty("requireType");
|
String requireType = obj.getProperties().getProperty("requireType");
|
||||||
String requireId = obj.getProperties().getProperty("requireId");
|
String requireId = obj.getProperties().getProperty("requireId");
|
||||||
String requireValue = obj.getProperties().getProperty("requireValue");
|
String requireValue = obj.getProperties().getProperty("requireValue");
|
||||||
String requireNegation = obj.getProperties().getProperty("requireNegation");
|
String requireNegation = obj.getProperties().getProperty("requireNegation");
|
||||||
if (requireType == null) {
|
if (requireType == null) {
|
||||||
String[] fields = obj.getName().split(":");
|
String[] fields = obj.getName().split(":");
|
||||||
if (fields.length == 2) {
|
if (fields.length == 2) {
|
||||||
requireType = Requirement.RequirementType.questProgress.toString();
|
requireType = Requirement.RequirementType.questProgress.toString();
|
||||||
requireValue = fields[1];
|
requireValue = fields[1];
|
||||||
requireId = fields[0];
|
requireId = fields[0];
|
||||||
oldSchoolRequirement = true;
|
oldSchoolRequirement = true;
|
||||||
} /*else if (fields.length == 3) {
|
} /*else if (fields.length == 3) {
|
||||||
requireValue = fields[2];
|
requireValue = fields[2];
|
||||||
requireType = fields[0];
|
requireType = fields[0];
|
||||||
requireId = fields[1];
|
requireId = fields[1];
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
requirement = new Requirement();
|
requirement = new Requirement();
|
||||||
if (requireType != null) requirement.type = Requirement.RequirementType.valueOf(requireType);
|
if (requireType != null) requirement.type = Requirement.RequirementType.valueOf(requireType);
|
||||||
requirement.required_obj_id = requireId;
|
requirement.required_obj_id = requireId;
|
||||||
if (requireValue != null) requirement.required_value = Integer.parseInt(requireValue);
|
if (requireValue != null) requirement.required_value = Integer.parseInt(requireValue);
|
||||||
if (requireNegation != null) requirement.negated = Boolean.parseBoolean(requireNegation);
|
if (requireNegation != null) requirement.negated = Boolean.parseBoolean(requireNegation);
|
||||||
requirement.state = GameDataElement.State.parsed;
|
requirement.state = GameDataElement.State.parsed;
|
||||||
|
|
||||||
|
|
||||||
for (Object s : obj.getProperties().keySet()) {
|
for (Object s : obj.getProperties().keySet()) {
|
||||||
if (!TMXMap.isPaintedLayerName(s.toString())) continue;
|
if (!TMXMap.isPaintedLayerName(s.toString())) continue;
|
||||||
if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>();
|
if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>();
|
||||||
replacements.add(new Replacement(s.toString(), obj.getProperties().getProperty(s.toString())));
|
replacements.add(new Replacement(s.toString(), obj.getProperties().getProperty(s.toString())));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
requirement.parent = parentMap;
|
requirement.parent = parentMap;
|
||||||
requirement.link();
|
requirement.link();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return DefaultIcons.getReplaceIcon();
|
return DefaultIcons.getReplaceIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
requirement.elementChanged(oldOne, newOne);
|
requirement.elementChanged(oldOne, newOne);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ReplaceArea.Replacement addReplacement(String source, String target) {
|
public ReplaceArea.Replacement createReplacement(String source, String target) {
|
||||||
Replacement repl = new Replacement(source, target);
|
Replacement repl = new Replacement(source, target);
|
||||||
addReplacement(repl);
|
return repl;
|
||||||
return repl;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public void addReplacement(ReplaceArea.Replacement repl) {
|
@Override
|
||||||
if (replacements == null) replacements = new ArrayList<ReplaceArea.Replacement>();
|
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||||
replacements.add(repl);
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// public void removeReplacement(String source, String target) {
|
//Don't use yet !
|
||||||
// replacedLayers.remove(source);
|
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 void removeReplacement(Replacement repl) {
|
public class Replacement {
|
||||||
replacements.remove(repl);
|
public String sourceLayer, targetLayer;
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
public Replacement(String source, String target) {
|
||||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
this.sourceLayer = source;
|
||||||
if (replacements != null) {
|
this.targetLayer = target;
|
||||||
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 boolean hasReplacementFor(String name) {
|
||||||
public void updateNameFromRequirementChange() {
|
if (name == null) return false;
|
||||||
if (oldSchoolRequirement && Requirement.RequirementType.questProgress.equals(requirement.type) && (requirement.negated == null || !requirement.negated)) {
|
for (Replacement repl : replacements) {
|
||||||
name = (requirement.negated != null && requirement.negated) ? "NOT " : "" + requirement.required_obj_id+":"+((requirement.required_value == null) ? "" : Integer.toString(requirement.required_value));
|
if (name.equalsIgnoreCase(repl.sourceLayer)) return true;
|
||||||
} else if (oldSchoolRequirement) {
|
}
|
||||||
int i = 0;
|
return false;
|
||||||
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;
|
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||||
|
|
||||||
import java.awt.Image;
|
|
||||||
|
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
|
|
||||||
public class RestArea extends MapObject {
|
public class RestArea extends MapObject {
|
||||||
|
|
||||||
public RestArea(tiled.core.MapObject obj) {}
|
public RestArea(tiled.core.MapObject obj) {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {}
|
public void link() {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return DefaultIcons.getRestIcon();
|
return DefaultIcons.getRestIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,61 +1,61 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||||
|
|
||||||
import java.awt.Image;
|
|
||||||
|
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
public class ScriptArea extends MapObject {
|
public class ScriptArea extends MapObject {
|
||||||
|
|
||||||
public Dialogue dialogue = null;
|
public Dialogue dialogue = null;
|
||||||
public EvaluationTrigger trigger_type = null;
|
public EvaluationTrigger trigger_type = null;
|
||||||
|
|
||||||
public enum EvaluationTrigger {
|
public enum EvaluationTrigger {
|
||||||
enter,
|
enter,
|
||||||
step,
|
step,
|
||||||
round,
|
round,
|
||||||
always
|
always
|
||||||
}
|
}
|
||||||
|
|
||||||
public ScriptArea(tiled.core.MapObject obj) {
|
public ScriptArea(tiled.core.MapObject obj) {
|
||||||
String triggerTypeId = obj.getProperties().getProperty("when");
|
String triggerTypeId = obj.getProperties().getProperty("when");
|
||||||
if (triggerTypeId != null) {
|
if (triggerTypeId != null) {
|
||||||
trigger_type = EvaluationTrigger.valueOf(triggerTypeId);
|
trigger_type = EvaluationTrigger.valueOf(triggerTypeId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (name != null) dialogue = parentMap.getProject().getDialogue(name);
|
if (name != null) dialogue = parentMap.getProject().getDialogue(name);
|
||||||
if (dialogue != null) {
|
if (dialogue != null) {
|
||||||
dialogue.addBacklink(parentMap);
|
dialogue.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
if (dialogue != null) return DefaultIcons.getScriptIcon();
|
if (dialogue != null) return DefaultIcons.getScriptIcon();
|
||||||
else return DefaultIcons.getNullifyIcon();
|
else return DefaultIcons.getNullifyIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
if (oldOne == dialogue) {
|
if (oldOne == dialogue) {
|
||||||
oldOne.removeBacklink(parentMap);
|
oldOne.removeBacklink(parentMap);
|
||||||
dialogue = (Dialogue) newOne;
|
dialogue = (Dialogue) newOne;
|
||||||
if (newOne != null) newOne.addBacklink(parentMap);
|
if (newOne != null) newOne.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||||
if (dialogue != null) {
|
if (dialogue != null) {
|
||||||
tmxObject.setName(dialogue.id);
|
tmxObject.setName(dialogue.id);
|
||||||
}
|
}
|
||||||
if (trigger_type != null) {
|
if (trigger_type != null) {
|
||||||
tmxObject.getProperties().setProperty("when", trigger_type.toString());
|
tmxObject.getProperties().setProperty("when", trigger_type.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,47 +1,47 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
package com.gpl.rpg.atcontentstudio.model.maps;
|
||||||
|
|
||||||
import java.awt.Image;
|
|
||||||
|
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.Dialogue;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
|
||||||
public class SignArea extends MapObject {
|
public class SignArea extends MapObject {
|
||||||
|
|
||||||
public Dialogue dialogue = null;
|
public Dialogue dialogue = null;
|
||||||
|
|
||||||
public SignArea(tiled.core.MapObject obj) {
|
public SignArea(tiled.core.MapObject obj) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (name != null) dialogue = parentMap.getProject().getDialogue(name);
|
if (name != null) dialogue = parentMap.getProject().getDialogue(name);
|
||||||
if (dialogue != null) {
|
if (dialogue != null) {
|
||||||
dialogue.addBacklink(parentMap);
|
dialogue.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
if (dialogue != null) return DefaultIcons.getSignIcon();
|
if (dialogue != null) return DefaultIcons.getSignIcon();
|
||||||
else return DefaultIcons.getNullifyIcon();
|
else return DefaultIcons.getNullifyIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
if (oldOne == dialogue) {
|
if (oldOne == dialogue) {
|
||||||
oldOne.removeBacklink(parentMap);
|
oldOne.removeBacklink(parentMap);
|
||||||
dialogue = (Dialogue) newOne;
|
dialogue = (Dialogue) newOne;
|
||||||
if (newOne != null) newOne.addBacklink(parentMap);
|
if (newOne != null) newOne.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||||
if (dialogue != null) {
|
if (dialogue != null) {
|
||||||
tmxObject.setName(dialogue.id);
|
tmxObject.setName(dialogue.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,95 +1,95 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
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.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class SpawnArea extends MapObject {
|
public class SpawnArea extends MapObject {
|
||||||
|
|
||||||
public int quantity = 1;
|
public int quantity = 1;
|
||||||
public int respawnSpeed = 10;
|
public int respawnSpeed = 10;
|
||||||
public boolean active = true;
|
public boolean active = true;
|
||||||
public boolean ignoreAreas = false;
|
public boolean ignoreAreas = false;
|
||||||
public String spawngroup_id;
|
public String spawngroup_id;
|
||||||
public List<NPC> spawnGroup = new ArrayList<NPC>();
|
public List<NPC> spawnGroup = new ArrayList<NPC>();
|
||||||
|
|
||||||
public SpawnArea(tiled.core.MapObject obj) {
|
public SpawnArea(tiled.core.MapObject obj) {
|
||||||
if (obj.getProperties().getProperty("quantity") != null) {
|
if (obj.getProperties().getProperty("quantity") != null) {
|
||||||
this.quantity = Integer.parseInt(obj.getProperties().getProperty("quantity"));
|
this.quantity = Integer.parseInt(obj.getProperties().getProperty("quantity"));
|
||||||
}
|
}
|
||||||
if (obj.getProperties().getProperty("respawnspeed") != null) {
|
if (obj.getProperties().getProperty("respawnspeed") != null) {
|
||||||
this.respawnSpeed = Integer.parseInt(obj.getProperties().getProperty("respawnspeed"));
|
this.respawnSpeed = Integer.parseInt(obj.getProperties().getProperty("respawnspeed"));
|
||||||
}
|
}
|
||||||
if (obj.getProperties().getProperty("active") != null) {
|
if (obj.getProperties().getProperty("active") != null) {
|
||||||
this.active = Boolean.parseBoolean(obj.getProperties().getProperty("active"));
|
this.active = Boolean.parseBoolean(obj.getProperties().getProperty("active"));
|
||||||
}
|
}
|
||||||
if (obj.getProperties().getProperty("ignoreAreas") != null) {
|
if (obj.getProperties().getProperty("ignoreAreas") != null) {
|
||||||
this.ignoreAreas = Boolean.parseBoolean(obj.getProperties().getProperty("ignoreAreas"));
|
this.ignoreAreas = Boolean.parseBoolean(obj.getProperties().getProperty("ignoreAreas"));
|
||||||
}
|
}
|
||||||
if (obj.getProperties().getProperty("spawngroup") != null) {
|
if (obj.getProperties().getProperty("spawngroup") != null) {
|
||||||
this.spawngroup_id = obj.getProperties().getProperty("spawngroup");
|
this.spawngroup_id = obj.getProperties().getProperty("spawngroup");
|
||||||
} else if (obj.getName() != null ){
|
} else if (obj.getName() != null) {
|
||||||
this.spawngroup_id = obj.getName();
|
this.spawngroup_id = obj.getName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (spawngroup_id != null) {
|
if (spawngroup_id != null) {
|
||||||
spawnGroup = parentMap.getProject().getSpawnGroup(spawngroup_id);
|
spawnGroup = parentMap.getProject().getSpawnGroup(spawngroup_id);
|
||||||
} else {
|
} else {
|
||||||
spawnGroup = new ArrayList<NPC>();
|
spawnGroup = new ArrayList<NPC>();
|
||||||
}
|
}
|
||||||
if (spawnGroup != null) {
|
if (spawnGroup != null) {
|
||||||
for (NPC npc : spawnGroup) {
|
for (NPC npc : spawnGroup) {
|
||||||
npc.addBacklink(parentMap);
|
npc.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
if (spawnGroup != null && !spawnGroup.isEmpty()) {
|
if (spawnGroup != null && !spawnGroup.isEmpty()) {
|
||||||
return spawnGroup.get(0).getIcon();
|
return spawnGroup.get(0).getIcon();
|
||||||
}
|
}
|
||||||
return DefaultIcons.getNullifyIcon();
|
return DefaultIcons.getNullifyIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
int replacedIndex = -1;
|
int replacedIndex = -1;
|
||||||
for (NPC npc : spawnGroup) {
|
for (NPC npc : spawnGroup) {
|
||||||
if (npc == oldOne) {
|
if (npc == oldOne) {
|
||||||
replacedIndex = spawnGroup.indexOf(npc);
|
replacedIndex = spawnGroup.indexOf(npc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (replacedIndex >= 0) {
|
if (replacedIndex >= 0) {
|
||||||
oldOne.removeBacklink(parentMap);
|
oldOne.removeBacklink(parentMap);
|
||||||
spawnGroup.set(replacedIndex, (NPC) newOne);
|
spawnGroup.set(replacedIndex, (NPC) newOne);
|
||||||
if (newOne != null) newOne.addBacklink(parentMap);
|
if (newOne != null) newOne.addBacklink(parentMap);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
public void savePropertiesInTmxObject(tiled.core.MapObject tmxObject) {
|
||||||
if (spawngroup_id != null) {
|
if (spawngroup_id != null) {
|
||||||
tmxObject.getProperties().setProperty("spawngroup", spawngroup_id);
|
tmxObject.getProperties().setProperty("spawngroup", spawngroup_id);
|
||||||
}
|
}
|
||||||
if (quantity != 1) {
|
if (quantity != 1) {
|
||||||
tmxObject.getProperties().setProperty("quantity", Integer.toString(quantity));
|
tmxObject.getProperties().setProperty("quantity", Integer.toString(quantity));
|
||||||
}
|
}
|
||||||
if (respawnSpeed != 10) {
|
if (respawnSpeed != 10) {
|
||||||
tmxObject.getProperties().setProperty("respawnspeed", Integer.toString(respawnSpeed));
|
tmxObject.getProperties().setProperty("respawnspeed", Integer.toString(respawnSpeed));
|
||||||
}
|
}
|
||||||
if (!this.active) {
|
if (!this.active) {
|
||||||
tmxObject.getProperties().setProperty("active", Boolean.toString(active));
|
tmxObject.getProperties().setProperty("active", Boolean.toString(active));
|
||||||
}
|
}
|
||||||
if (this.ignoreAreas) {
|
if (this.ignoreAreas) {
|
||||||
tmxObject.getProperties().setProperty("ignoreAreas", Boolean.toString(ignoreAreas));
|
tmxObject.getProperties().setProperty("ignoreAreas", Boolean.toString(ignoreAreas));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,478 +1,476 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
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.Notification;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.*;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
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.GameDataSet;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.NPC;
|
||||||
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
|
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
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 {
|
public class TMXMap extends GameDataElement {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1609502879500898837L;
|
private static final long serialVersionUID = 1609502879500898837L;
|
||||||
|
|
||||||
public static final String GROUND_LAYER_NAME = "Ground";
|
public static final String GROUND_LAYER_NAME = "Ground";
|
||||||
public static final String OBJECTS_LAYER_NAME = "Objects";
|
public static final String OBJECTS_LAYER_NAME = "Objects";
|
||||||
public static final String ABOVE_LAYER_NAME = "Above";
|
public static final String ABOVE_LAYER_NAME = "Above";
|
||||||
public static final String TOP_LAYER_NAME = "Top";
|
public static final String TOP_LAYER_NAME = "Top";
|
||||||
public static final String WALKABLE_LAYER_NAME = "Walkable";
|
public static final String WALKABLE_LAYER_NAME = "Walkable";
|
||||||
|
|
||||||
public enum ColorFilter {
|
public enum ColorFilter {
|
||||||
none,
|
none,
|
||||||
black20,
|
black20,
|
||||||
black40,
|
black40,
|
||||||
black60,
|
black60,
|
||||||
black80,
|
black80,
|
||||||
invert,
|
invert,
|
||||||
bw,
|
bw,
|
||||||
redtint,
|
redtint,
|
||||||
greentint,
|
greentint,
|
||||||
bluetint
|
bluetint
|
||||||
}
|
}
|
||||||
|
|
||||||
public File tmxFile = null;
|
public File tmxFile;
|
||||||
public tiled.core.Map tmxMap = null;
|
public tiled.core.Map tmxMap = null;
|
||||||
public Set<Spritesheet> usedSpritesheets = null;
|
public Set<Spritesheet> usedSpritesheets = null;
|
||||||
public List<MapObjectGroup> groups = null;
|
public List<MapObjectGroup> groups = null;
|
||||||
|
|
||||||
public ProjectTreeNode parent;
|
public ProjectTreeNode parent;
|
||||||
public Integer outside = null;
|
public Integer outside = null;
|
||||||
public ColorFilter colorFilter = null;
|
public ColorFilter colorFilter = null;
|
||||||
|
|
||||||
public boolean changedOnDisk = false;
|
public boolean changedOnDisk = false;
|
||||||
public int dismissNextChangeNotif = 0;
|
public int dismissNextChangeNotif = 0;
|
||||||
|
|
||||||
public TMXMap(TMXMapSet parent, File f) {
|
public TMXMap(TMXMapSet parent, File f) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.tmxFile = f;
|
this.tmxFile = f;
|
||||||
String name = f.getName();
|
String name = f.getName();
|
||||||
id = name.substring(0, name.length() - 4);
|
id = name.substring(0, name.length() - 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void parse() {
|
public void parse() {
|
||||||
if (this.state == GameDataElement.State.init) {
|
if (this.state == GameDataElement.State.init) {
|
||||||
if (tmxMap != null) return;
|
if (tmxMap != null) return;
|
||||||
usedSpritesheets = new HashSet<Spritesheet>();
|
usedSpritesheets = new HashSet<Spritesheet>();
|
||||||
try {
|
try {
|
||||||
tmxMap = new TMXMapReader().readMap(tmxFile.getAbsolutePath(), this);
|
tmxMap = new TMXMapReader().readMap(tmxFile.getAbsolutePath(), this);
|
||||||
if (tmxMap.getProperties().get("outdoors") != null) {
|
if (tmxMap.getProperties().get("outdoors") != null) {
|
||||||
outside = new Integer(((String) tmxMap.getProperties().get("outdoors")));
|
outside = new Integer(((String) tmxMap.getProperties().get("outdoors")));
|
||||||
}
|
}
|
||||||
if (tmxMap.getProperties().get("colorfilter") != null) {
|
if (tmxMap.getProperties().get("colorfilter") != null) {
|
||||||
colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
|
colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
|
||||||
}
|
}
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
Notification.addError("Impossible to load TMX map file "+tmxFile.getAbsolutePath());
|
Notification.addError("Impossible to load TMX map file " + tmxFile.getAbsolutePath());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Notification.addError("Error while loading TMX map file "+tmxFile.getAbsolutePath()+": "+e.getMessage());
|
Notification.addError("Error while loading TMX map file " + tmxFile.getAbsolutePath() + ": " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
for (tiled.core.MapLayer layer : tmxMap.getLayers()) {
|
for (tiled.core.MapLayer layer : tmxMap.getLayers()) {
|
||||||
if (layer instanceof tiled.core.ObjectGroup) {
|
if (layer instanceof tiled.core.ObjectGroup) {
|
||||||
if (groups == null) {
|
if (groups == null) {
|
||||||
groups = new ArrayList<MapObjectGroup>();
|
groups = new ArrayList<MapObjectGroup>();
|
||||||
}
|
}
|
||||||
MapObjectGroup group = new MapObjectGroup((tiled.core.ObjectGroup) layer, this);
|
MapObjectGroup group = new MapObjectGroup((tiled.core.ObjectGroup) layer, this);
|
||||||
groups.add(group);
|
groups.add(group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (Spritesheet s : usedSpritesheets) {
|
for (Spritesheet s : usedSpritesheets) {
|
||||||
s.addBacklink(this);
|
s.addBacklink(this);
|
||||||
}
|
}
|
||||||
state = State.parsed;
|
state = State.parsed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void create() {
|
public void create() {
|
||||||
if (tmxMap != null) return;
|
if (tmxMap != null) return;
|
||||||
tmxMap = new tiled.core.Map(30, 30);
|
tmxMap = new tiled.core.Map(30, 30);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TMXMap clone() {
|
public TMXMap clone() {
|
||||||
TMXMap clone = new TMXMap((TMXMapSet) this.parent, this.tmxFile);
|
TMXMap clone = new TMXMap((TMXMapSet) this.parent, this.tmxFile);
|
||||||
try {
|
try {
|
||||||
clone.usedSpritesheets = new HashSet<Spritesheet>();
|
clone.usedSpritesheets = new HashSet<Spritesheet>();
|
||||||
clone.tmxMap = new TMXMapReader().readMap(new StringReader(this.toXml()), clone);
|
clone.tmxMap = new TMXMapReader().readMap(new StringReader(this.toXml()), clone);
|
||||||
if (clone.tmxMap.getProperties().get("outdoors") != null) {
|
if (clone.tmxMap.getProperties().get("outdoors") != null) {
|
||||||
clone.outside = new Integer(((String) clone.tmxMap.getProperties().get("outdoors")));
|
clone.outside = new Integer(((String) clone.tmxMap.getProperties().get("outdoors")));
|
||||||
}
|
}
|
||||||
if (clone.tmxMap.getProperties().get("colorfilter") != null) {
|
if (clone.tmxMap.getProperties().get("colorfilter") != null) {
|
||||||
clone.colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
|
clone.colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter")));
|
||||||
}
|
}
|
||||||
for (tiled.core.MapLayer layer : clone.tmxMap.getLayers()) {
|
for (tiled.core.MapLayer layer : clone.tmxMap.getLayers()) {
|
||||||
if (layer instanceof tiled.core.ObjectGroup) {
|
if (layer instanceof tiled.core.ObjectGroup) {
|
||||||
if (clone.groups == null) {
|
if (clone.groups == null) {
|
||||||
clone.groups = new ArrayList<MapObjectGroup>();
|
clone.groups = new ArrayList<MapObjectGroup>();
|
||||||
}
|
}
|
||||||
MapObjectGroup group = new MapObjectGroup((tiled.core.ObjectGroup) layer, this);
|
MapObjectGroup group = new MapObjectGroup((tiled.core.ObjectGroup) layer, this);
|
||||||
group.link();
|
group.link();
|
||||||
clone.groups.add(group);
|
clone.groups.add(group);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (Spritesheet s : usedSpritesheets) {
|
for (Spritesheet s : usedSpritesheets) {
|
||||||
s.addBacklink(clone);
|
s.addBacklink(clone);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Notification.addError("Error while cloning map "+this.id+" : "+e.getMessage());
|
Notification.addError("Error while cloning map " + this.id + " : " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Enumeration<ProjectTreeNode> children() {
|
public Enumeration<ProjectTreeNode> children() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getAllowsChildren() {
|
public boolean getAllowsChildren() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getChildAt(int arg0) {
|
public TreeNode getChildAt(int arg0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getChildCount() {
|
public int getChildCount() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getIndex(TreeNode arg0) {
|
public int getIndex(TreeNode arg0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getParent() {
|
public TreeNode getParent() {
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isLeaf() {
|
public boolean isLeaf() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenAdded(path);
|
parent.childrenAdded(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenChanged(path);
|
parent.childrenChanged(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenRemoved(path);
|
parent.childrenRemoved(path);
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public void notifyCreated() {
|
|
||||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public String getDesc() {
|
|
||||||
return (needsSaving() ? "*" : "")+id;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Project getProject() {
|
public void notifyCreated() {
|
||||||
return parent.getProject();
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public String getDesc() {
|
||||||
return DefaultIcons.getTiledIconIcon();
|
return (needsSaving() ? "*" : "") + id;
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public Image getLeafIcon() {
|
|
||||||
return DefaultIcons.getTiledIconIcon();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public Image getClosedIcon() {return null;}
|
|
||||||
@Override
|
|
||||||
public Image getOpenIcon() {return null;}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public Project getProject() {
|
||||||
return null;
|
return parent.getProject();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public Image getIcon() {
|
||||||
return parent.getDataType();
|
return DefaultIcons.getTiledIconIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toXml() {
|
@Override
|
||||||
if (outside != null && outside == 1) {
|
public Image getLeafIcon() {
|
||||||
tmxMap.getProperties().put("outdoors", Integer.toString(outside));
|
return DefaultIcons.getTiledIconIcon();
|
||||||
} else {
|
}
|
||||||
tmxMap.getProperties().remove("outdoors");
|
|
||||||
}
|
|
||||||
if (colorFilter != null) {
|
|
||||||
tmxMap.getProperties().put("colorfilter", colorFilter.toString());
|
|
||||||
} else {
|
|
||||||
tmxMap.getProperties().remove("colorfilter");
|
|
||||||
}
|
|
||||||
|
|
||||||
for (MapObjectGroup group : groups) {
|
@Override
|
||||||
group.pushBackToTiledProperties();
|
public Image getClosedIcon() {
|
||||||
if (!tmxMap.containsLayer(group.tmxGroup)) {
|
return null;
|
||||||
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
|
@Override
|
||||||
public boolean isEmpty() {
|
public Image getOpenIcon() {
|
||||||
return false;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save() {
|
@Override
|
||||||
if (writable) {
|
public GameDataSet getDataSet() {
|
||||||
String xml = toXml();
|
return null;
|
||||||
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
|
@Override
|
||||||
public List<SaveEvent> attemptSave() {
|
public Type getDataType() {
|
||||||
//TODO check cases where map should be moved from altered/created to created/altered....
|
return parent.getDataType();
|
||||||
save();
|
}
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void delete() {
|
public String toXml() {
|
||||||
if (writable) {
|
if (outside != null && outside == 1) {
|
||||||
if (tmxFile.exists()) {
|
tmxMap.getProperties().put("outdoors", Integer.toString(outside));
|
||||||
if (tmxFile.delete()) {
|
} else {
|
||||||
Notification.addSuccess("TMX file "+tmxFile.getAbsolutePath()+" deleted.");
|
tmxMap.getProperties().remove("outdoors");
|
||||||
} else {
|
}
|
||||||
Notification.addError("Error while deleting TMX file "+tmxFile.getAbsolutePath());
|
if (colorFilter != null) {
|
||||||
}
|
tmxMap.getProperties().put("colorfilter", colorFilter.toString());
|
||||||
}
|
} else {
|
||||||
((TMXMapSet)parent).tmxMaps.remove(this);
|
tmxMap.getProperties().remove("colorfilter");
|
||||||
//TODO clear blacklinks ?
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
for (MapObjectGroup group : groups) {
|
||||||
public void link() {
|
group.pushBackToTiledProperties();
|
||||||
if (this.state == GameDataElement.State.init) {
|
if (!tmxMap.containsLayer(group.tmxGroup)) {
|
||||||
parse();
|
tmxMap.addLayer(group.tmxGroup);
|
||||||
}
|
}
|
||||||
if (this.state == GameDataElement.State.parsed) {
|
}
|
||||||
if (groups != null) {
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
for (MapObjectGroup group : groups) {
|
try {
|
||||||
group.link();
|
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
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public boolean isEmpty() {
|
||||||
for (MapObjectGroup group : groups) {
|
return false;
|
||||||
group.elementChanged(oldOne, newOne);
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
public void save() {
|
||||||
public String getProjectFilename() {
|
if (writable) {
|
||||||
return tmxFile.getName();
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void addLayer(tiled.core.MapLayer layer) {
|
@Override
|
||||||
tmxMap.addLayer(layer);
|
public List<SaveEvent> attemptSave() {
|
||||||
if (layer instanceof tiled.core.ObjectGroup) {
|
//TODO check cases where map should be moved from altered/created to created/altered....
|
||||||
groups.add(new MapObjectGroup((tiled.core.ObjectGroup) layer, this));
|
save();
|
||||||
}
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeLayer(tiled.core.MapLayer layer) {
|
public void delete() {
|
||||||
tmxMap.removeLayer(tmxMap.getLayerIndex(layer));
|
if (writable) {
|
||||||
if (layer instanceof tiled.core.ObjectGroup) {
|
if (tmxFile.exists()) {
|
||||||
MapObjectGroup toRemove = null;
|
if (tmxFile.delete()) {
|
||||||
for (MapObjectGroup group : groups) {
|
Notification.addSuccess("TMX file " + tmxFile.getAbsolutePath() + " deleted.");
|
||||||
if (group.tmxGroup == layer) {
|
} else {
|
||||||
toRemove = group;
|
Notification.addError("Error while deleting TMX file " + tmxFile.getAbsolutePath());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (toRemove != null) {
|
((TMXMapSet) parent).tmxMaps.remove(this);
|
||||||
groups.remove(toRemove);
|
//TODO clear blacklinks ?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public MapObjectGroup getGroup(tiled.core.ObjectGroup selectedLayer) {
|
@Override
|
||||||
for (MapObjectGroup group : groups) {
|
public void link() {
|
||||||
if (group.tmxGroup == selectedLayer) {
|
if (this.state == GameDataElement.State.init) {
|
||||||
return group;
|
parse();
|
||||||
}
|
}
|
||||||
}
|
if (this.state == GameDataElement.State.parsed) {
|
||||||
return null;
|
if (groups != null) {
|
||||||
}
|
for (MapObjectGroup group : groups) {
|
||||||
|
group.link();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public List<String> getMapchangesNames() {
|
@Override
|
||||||
List<String> result = new ArrayList<String>();
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
result.add(null);
|
for (MapObjectGroup group : groups) {
|
||||||
for (MapObjectGroup group : groups) {
|
group.elementChanged(oldOne, newOne);
|
||||||
for (MapObject obj : group.mapObjects) {
|
}
|
||||||
if (obj.type == MapObject.Types.mapchange) {
|
}
|
||||||
result.add(obj.name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MapObject getMapObject(String name) {
|
@Override
|
||||||
MapObject result = null;
|
public String getProjectFilename() {
|
||||||
for (MapObjectGroup group : groups) {
|
return tmxFile.getName();
|
||||||
for (MapObject obj : group.mapObjects) {
|
}
|
||||||
if (obj.name.equals(name)) {
|
|
||||||
result = obj;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isPaintedLayerName(String name) {
|
public void addLayer(tiled.core.MapLayer layer) {
|
||||||
return GROUND_LAYER_NAME.equalsIgnoreCase(name) ||
|
tmxMap.addLayer(layer);
|
||||||
OBJECTS_LAYER_NAME.equalsIgnoreCase(name) ||
|
if (layer instanceof tiled.core.ObjectGroup) {
|
||||||
ABOVE_LAYER_NAME.equalsIgnoreCase(name) ||
|
groups.add(new MapObjectGroup((tiled.core.ObjectGroup) layer, this));
|
||||||
TOP_LAYER_NAME.equalsIgnoreCase(name) ||
|
}
|
||||||
WALKABLE_LAYER_NAME.equalsIgnoreCase(name);
|
}
|
||||||
}
|
|
||||||
|
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() {
|
public void reload() {
|
||||||
tmxMap = null;
|
tmxMap = null;
|
||||||
for (Spritesheet s : usedSpritesheets) {
|
for (Spritesheet s : usedSpritesheets) {
|
||||||
s.elementChanged(this, null);
|
s.elementChanged(this, null);
|
||||||
}
|
}
|
||||||
usedSpritesheets.clear();
|
usedSpritesheets.clear();
|
||||||
for (MapObjectGroup g : groups) {
|
for (MapObjectGroup g : groups) {
|
||||||
for (MapObject o : g.mapObjects) {
|
for (MapObject o : g.mapObjects) {
|
||||||
if (o instanceof ContainerArea) {
|
if (o instanceof ContainerArea) {
|
||||||
if (((ContainerArea)o).droplist != null) ((ContainerArea)o).droplist.elementChanged(this, null);
|
if (((ContainerArea) o).droplist != null) ((ContainerArea) o).droplist.elementChanged(this, null);
|
||||||
} else if (o instanceof KeyArea) {
|
} else if (o instanceof KeyArea) {
|
||||||
if (((KeyArea)o).dialogue != null) ((KeyArea)o).dialogue.elementChanged(this, null);
|
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);
|
if (((KeyArea) o).requirement != null && ((KeyArea) o).requirement.required_obj != null)
|
||||||
} else if (o instanceof MapChange) {
|
((KeyArea) o).requirement.required_obj.elementChanged(this, null);
|
||||||
if (((MapChange)o).map != null) ((MapChange)o).map.elementChanged(this, null);
|
} else if (o instanceof MapChange) {
|
||||||
} else if (o instanceof ReplaceArea) {
|
if (((MapChange) o).map != null) ((MapChange) o).map.elementChanged(this, null);
|
||||||
if (((ReplaceArea)o).requirement != null && ((ReplaceArea)o).requirement.required_obj != null) ((ReplaceArea)o).requirement.required_obj.elementChanged(this, null);
|
} else if (o instanceof ReplaceArea) {
|
||||||
} else if (o instanceof RestArea) {
|
if (((ReplaceArea) o).requirement != null && ((ReplaceArea) o).requirement.required_obj != null)
|
||||||
} else if (o instanceof ScriptArea) {
|
((ReplaceArea) o).requirement.required_obj.elementChanged(this, null);
|
||||||
if (((ScriptArea)o).dialogue != null) ((ScriptArea)o).dialogue.elementChanged(this, null);
|
} else if (o instanceof RestArea) {
|
||||||
} else if (o instanceof SignArea) {
|
} else if (o instanceof ScriptArea) {
|
||||||
if (((SignArea)o).dialogue != null) ((SignArea)o).dialogue.elementChanged(this, null);
|
if (((ScriptArea) o).dialogue != null) ((ScriptArea) o).dialogue.elementChanged(this, null);
|
||||||
} else if (o instanceof SpawnArea) {
|
} else if (o instanceof SignArea) {
|
||||||
if (((SpawnArea)o).spawnGroup != null) {
|
if (((SignArea) o).dialogue != null) ((SignArea) o).dialogue.elementChanged(this, null);
|
||||||
for (NPC n : ((SpawnArea)o).spawnGroup) {
|
} else if (o instanceof SpawnArea) {
|
||||||
n.elementChanged(this, null);
|
if (((SpawnArea) o).spawnGroup != null) {
|
||||||
}
|
for (NPC n : ((SpawnArea) o).spawnGroup) {
|
||||||
}
|
n.elementChanged(this, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
groups.clear();
|
}
|
||||||
outside = null;
|
}
|
||||||
colorFilter = null;
|
groups.clear();
|
||||||
|
outside = null;
|
||||||
|
colorFilter = null;
|
||||||
|
|
||||||
state = GameDataElement.State.init;
|
state = GameDataElement.State.init;
|
||||||
this.link();
|
this.link();
|
||||||
|
|
||||||
changedOnDisk = false;
|
changedOnDisk = false;
|
||||||
for (MapChangedOnDiskListener l : listeners) {
|
for (MapChangedOnDiskListener l : listeners) {
|
||||||
l.mapReloaded();
|
l.mapReloaded();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void mapChangedOnDisk() {
|
public void mapChangedOnDisk() {
|
||||||
if (dismissNextChangeNotif > 0) {
|
if (dismissNextChangeNotif > 0) {
|
||||||
dismissNextChangeNotif--;
|
dismissNextChangeNotif--;
|
||||||
} else {
|
} else {
|
||||||
changedOnDisk = true;
|
changedOnDisk = true;
|
||||||
for (MapChangedOnDiskListener l : listeners) {
|
for (MapChangedOnDiskListener l : listeners) {
|
||||||
l.mapChanged();
|
l.mapChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface MapChangedOnDiskListener {
|
public interface MapChangedOnDiskListener {
|
||||||
public void mapChanged();
|
public void mapChanged();
|
||||||
public void mapReloaded();
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<MapChangedOnDiskListener> listeners = new CopyOnWriteArrayList<TMXMap.MapChangedOnDiskListener>();
|
public void mapReloaded();
|
||||||
|
}
|
||||||
|
|
||||||
public void addMapChangedOnDiskListener(MapChangedOnDiskListener l) {
|
private List<MapChangedOnDiskListener> listeners = new CopyOnWriteArrayList<TMXMap.MapChangedOnDiskListener>();
|
||||||
listeners.add(l);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void removeMapChangedOnDiskListener(MapChangedOnDiskListener l) {
|
public void addMapChangedOnDiskListener(MapChangedOnDiskListener l) {
|
||||||
listeners.remove(l);
|
listeners.add(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void removeMapChangedOnDiskListener(MapChangedOnDiskListener l) {
|
||||||
|
listeners.remove(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,5 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
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.Notification;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
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.ui.DefaultIcons;
|
||||||
import com.gpl.rpg.atcontentstudio.utils.FileUtils;
|
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 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_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_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_TO_DRAWABLE = ".." + File.separator + "drawable" + File.separator;
|
||||||
|
|
||||||
public static final String GAME_MAPS_ARRAY_NAME = "loadresource_maps";
|
public static final String GAME_MAPS_ARRAY_NAME = "loadresource_maps";
|
||||||
public static final String DEBUG_SUFFIX = "_debug";
|
public static final String DEBUG_SUFFIX = "_debug";
|
||||||
public static final String RESOURCE_PREFIX = "@xml/";
|
public static final String RESOURCE_PREFIX = "@xml/";
|
||||||
public static final String FILENAME_SUFFIX = ".tmx";
|
public static final String FILENAME_SUFFIX = ".tmx";
|
||||||
|
|
||||||
public File mapFolder = null;
|
public File mapFolder = null;
|
||||||
public List<TMXMap> tmxMaps;
|
public List<TMXMap> tmxMaps;
|
||||||
|
|
||||||
public ProjectTreeNode parent;
|
public ProjectTreeNode parent;
|
||||||
|
|
||||||
public TMXMapSet(GameSource source) {
|
public TMXMapSet(GameSource source) {
|
||||||
this.parent = source;
|
this.parent = source;
|
||||||
if (source.type == GameSource.Type.source) {
|
if (source.type == GameSource.Type.source) {
|
||||||
this.mapFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
this.mapFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||||
}
|
} else if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||||
else if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
this.mapFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||||
this.mapFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
if (!this.mapFolder.exists()) {
|
||||||
if (!this.mapFolder.exists()) {
|
this.mapFolder.mkdirs();
|
||||||
this.mapFolder.mkdirs();
|
}
|
||||||
}
|
FileUtils.makeSymlink(getProject().baseContent.gameSprites.drawableFolder, new File(mapFolder.getAbsolutePath() + File.separator + DEFAULT_REL_PATH_TO_DRAWABLE));
|
||||||
FileUtils.makeSymlink(getProject().baseContent.gameSprites.drawableFolder, new File(mapFolder.getAbsolutePath()+File.separator+DEFAULT_REL_PATH_TO_DRAWABLE));
|
}
|
||||||
}
|
this.tmxMaps = new ArrayList<TMXMap>();
|
||||||
this.tmxMaps = new ArrayList<TMXMap>();
|
|
||||||
|
|
||||||
if (source.type == GameSource.Type.source && (source.parent.sourceSetToUse == ResourceSet.debugData || source.parent.sourceSetToUse == ResourceSet.gameData)) {
|
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 : "";
|
String suffix = (source.parent.sourceSetToUse == ResourceSet.debugData) ? DEBUG_SUFFIX : "";
|
||||||
|
|
||||||
if (source.referencedSourceFiles.get(GAME_MAPS_ARRAY_NAME+suffix) != null) {
|
if (source.referencedSourceFiles.get(GAME_MAPS_ARRAY_NAME + suffix) != null) {
|
||||||
for (String resource : source.referencedSourceFiles.get(GAME_MAPS_ARRAY_NAME+suffix)) {
|
for (String resource : source.referencedSourceFiles.get(GAME_MAPS_ARRAY_NAME + suffix)) {
|
||||||
File f = new File(mapFolder, resource.replaceAll(RESOURCE_PREFIX, "")+FILENAME_SUFFIX);
|
File f = new File(mapFolder, resource.replaceAll(RESOURCE_PREFIX, "") + FILENAME_SUFFIX);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
TMXMap map = new TMXMap(this, f);
|
TMXMap map = new TMXMap(this, f);
|
||||||
tmxMaps.add(map);
|
tmxMaps.add(map);
|
||||||
} else {
|
} else {
|
||||||
Notification.addWarn("Unable to locate resource "+resource+" in the game source for project "+getProject().name);
|
Notification.addWarn("Unable to locate resource " + resource + " in the game source for project " + getProject().name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (this.mapFolder != null) {
|
} else if (this.mapFolder != null) {
|
||||||
for (File f : this.mapFolder.listFiles()) {
|
for (File f : this.mapFolder.listFiles()) {
|
||||||
if (f.getName().endsWith(".tmx") || f.getName().endsWith(".TMX")) {
|
if (f.getName().endsWith(".tmx") || f.getName().endsWith(".TMX")) {
|
||||||
TMXMap map = new TMXMap(this, f);
|
TMXMap map = new TMXMap(this, f);
|
||||||
if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||||
map.writable = true;
|
map.writable = true;
|
||||||
}
|
}
|
||||||
tmxMaps.add(map);
|
tmxMaps.add(map);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Collections.sort(tmxMaps, new Comparator<TMXMap>() {
|
Collections.sort(tmxMaps, new Comparator<TMXMap>() {
|
||||||
@Override
|
@Override
|
||||||
public int compare(TMXMap o1, TMXMap o2) {
|
public int compare(TMXMap o1, TMXMap o2) {
|
||||||
return o1.id.compareTo(o2.id);
|
return o1.id.compareTo(o2.id);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||||
final Path folderPath = Paths.get(mapFolder.getAbsolutePath());
|
final Path folderPath = Paths.get(mapFolder.getAbsolutePath());
|
||||||
Thread watcher = new Thread("Map folder watcher for "+getProject().name+"/"+source.type) {
|
Thread watcher = new Thread("Map folder watcher for " + getProject().name + "/" + source.type) {
|
||||||
public void run() {
|
public void run() {
|
||||||
WatchService watchService;
|
WatchService watchService;
|
||||||
|
|
||||||
while(getProject().open) {
|
while (getProject().open) {
|
||||||
try {
|
try {
|
||||||
watchService = FileSystems.getDefault().newWatchService();
|
watchService = FileSystems.getDefault().newWatchService();
|
||||||
/*WatchKey watchKey = */folderPath.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE);
|
/*WatchKey watchKey = */
|
||||||
WatchKey wk;
|
folderPath.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_CREATE);
|
||||||
validService: while(getProject().open) {
|
WatchKey wk;
|
||||||
wk = watchService.poll(10, TimeUnit.SECONDS);
|
validService:
|
||||||
if (wk != null) {
|
while (getProject().open) {
|
||||||
for (WatchEvent<?> event : wk.pollEvents()) {
|
wk = watchService.poll(10, TimeUnit.SECONDS);
|
||||||
Path changed = (Path) event.context();
|
if (wk != null) {
|
||||||
String name = changed.getFileName().toString();
|
for (WatchEvent<?> event : wk.pollEvents()) {
|
||||||
String id = name.substring(0, name.length() - 4);
|
Path changed = (Path) event.context();
|
||||||
TMXMap map = getMap(id);
|
String name = changed.getFileName().toString();
|
||||||
if (map != null) {
|
String id = name.substring(0, name.length() - 4);
|
||||||
map.mapChangedOnDisk();
|
TMXMap map = getMap(id);
|
||||||
}
|
if (map != null) {
|
||||||
}
|
map.mapChangedOnDisk();
|
||||||
if(!wk.reset()) {
|
}
|
||||||
watchService.close();
|
}
|
||||||
break validService;
|
if (!wk.reset()) {
|
||||||
}
|
watchService.close();
|
||||||
}
|
break validService;
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
}
|
||||||
e.printStackTrace();
|
}
|
||||||
} catch (InterruptedException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
} catch (InterruptedException e) {
|
||||||
}
|
e.printStackTrace();
|
||||||
};
|
}
|
||||||
};
|
}
|
||||||
watcher.start();
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
};
|
||||||
public Enumeration<TMXMap> children() {
|
watcher.start();
|
||||||
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
|
@Override
|
||||||
public Project getProject() {
|
public Enumeration<TMXMap> children() {
|
||||||
return parent.getProject();
|
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
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return getOpenIcon();
|
return getOpenIcon();
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public Image getClosedIcon() {
|
|
||||||
return DefaultIcons.getTmxClosedIcon();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public Image getLeafIcon() {
|
|
||||||
return DefaultIcons.getTmxClosedIcon();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public Image getOpenIcon() {
|
|
||||||
return DefaultIcons.getTmxOpenIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public Image getClosedIcon() {
|
||||||
return null;
|
return DefaultIcons.getTmxClosedIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public Image getLeafIcon() {
|
||||||
return parent.getDataType();
|
return DefaultIcons.getTmxClosedIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public Image getOpenIcon() {
|
||||||
return tmxMaps.isEmpty();
|
return DefaultIcons.getTmxOpenIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
public TMXMap getMap(String id) {
|
@Override
|
||||||
if (tmxMaps == null) return null;
|
public GameDataSet getDataSet() {
|
||||||
for (TMXMap map : tmxMaps) {
|
return null;
|
||||||
if (id.equals(map.id)){
|
}
|
||||||
return map;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addMap(TMXMap node) {
|
@Override
|
||||||
ProjectTreeNode higherEmptyParent = this;
|
public Type getDataType() {
|
||||||
while (higherEmptyParent != null) {
|
return parent.getDataType();
|
||||||
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) {
|
@Override
|
||||||
return tmxMaps.get(index);
|
public boolean isEmpty() {
|
||||||
}
|
return tmxMaps.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
public TMXMap getMap(String id) {
|
||||||
public boolean needsSaving() {
|
if (tmxMaps == null) return null;
|
||||||
for (ProjectTreeNode node : tmxMaps) {
|
for (TMXMap map : tmxMaps) {
|
||||||
if (node.needsSaving()) return true;
|
if (id.equals(map.id)) {
|
||||||
}
|
return map;
|
||||||
return false;
|
}
|
||||||
}
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,5 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
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.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
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.ProjectTreeNode;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
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 {
|
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_SOURCE = "res/xml/worldmap.xml";
|
||||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "maps"+File.separator+"worldmap.xml";
|
public static final String DEFAULT_REL_PATH_IN_PROJECT = "maps" + File.separator + "worldmap.xml";
|
||||||
|
|
||||||
public File worldmapFile;
|
public File worldmapFile;
|
||||||
public GameSource parent;
|
public GameSource parent;
|
||||||
|
|
||||||
public Map<String, Map<String, Point>> segments = new LinkedHashMap<String, Map<String,Point>>();
|
public Map<String, Map<String, Point>> segments = new LinkedHashMap<String, Map<String, Point>>();
|
||||||
|
|
||||||
public Worldmap(GameSource gameSource) {
|
public Worldmap(GameSource gameSource) {
|
||||||
this.parent = gameSource;
|
this.parent = gameSource;
|
||||||
if (getDataType() == Type.source) {
|
if (getDataType() == Type.source) {
|
||||||
worldmapFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
worldmapFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||||
} else {
|
} else {
|
||||||
worldmapFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
worldmapFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||||
}
|
}
|
||||||
if (worldmapFile.exists()) {
|
if (worldmapFile.exists()) {
|
||||||
loadFromFile(worldmapFile);
|
loadFromFile(worldmapFile);
|
||||||
}
|
}
|
||||||
if (getDataType() == Type.source) {
|
if (getDataType() == Type.source) {
|
||||||
for (WorldmapSegment segment : this) {
|
for (WorldmapSegment segment : this) {
|
||||||
segment.writable = false;
|
segment.writable = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (WorldmapSegment segment : this) {
|
for (WorldmapSegment segment : this) {
|
||||||
segment.writable = true;
|
segment.writable = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadFromFile(File file) {
|
private void loadFromFile(File file) {
|
||||||
if (!file.exists()) return;
|
if (!file.exists()) return;
|
||||||
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
|
||||||
Document doc;
|
Document doc;
|
||||||
try {
|
try {
|
||||||
factory.setIgnoringComments(true);
|
factory.setIgnoringComments(true);
|
||||||
factory.setIgnoringElementContentWhitespace(true);
|
factory.setIgnoringElementContentWhitespace(true);
|
||||||
factory.setExpandEntityReferences(false);
|
factory.setExpandEntityReferences(false);
|
||||||
DocumentBuilder builder = factory.newDocumentBuilder();
|
DocumentBuilder builder = factory.newDocumentBuilder();
|
||||||
InputSource insrc = new InputSource(new FileInputStream(file));
|
InputSource insrc = new InputSource(new FileInputStream(file));
|
||||||
insrc.setSystemId("http://worldmap/");
|
insrc.setSystemId("http://worldmap/");
|
||||||
insrc.setEncoding("UTF-8");
|
insrc.setEncoding("UTF-8");
|
||||||
doc = builder.parse(insrc);
|
doc = builder.parse(insrc);
|
||||||
|
|
||||||
Element root = (Element) doc.getElementsByTagName("worldmap").item(0);
|
Element root = (Element) doc.getElementsByTagName("worldmap").item(0);
|
||||||
if (root != null) {
|
if (root != null) {
|
||||||
NodeList segmentsList = root.getElementsByTagName("segment");
|
NodeList segmentsList = root.getElementsByTagName("segment");
|
||||||
if (segmentsList != null) {
|
if (segmentsList != null) {
|
||||||
for (int i = 0; i < segmentsList.getLength(); i++) {
|
for (int i = 0; i < segmentsList.getLength(); i++) {
|
||||||
Element segmentNode = (Element) segmentsList.item(i);
|
Element segmentNode = (Element) segmentsList.item(i);
|
||||||
String name = segmentNode.getAttribute("id");
|
String name = segmentNode.getAttribute("id");
|
||||||
add(new WorldmapSegment(this, name, segmentNode));
|
add(new WorldmapSegment(this, name, segmentNode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (SAXException e) {
|
} catch (SAXException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (ParserConfigurationException e) {
|
} catch (ParserConfigurationException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Enumeration<WorldmapSegment> children() {
|
public Enumeration<WorldmapSegment> children() {
|
||||||
return Collections.enumeration(this);
|
return Collections.enumeration(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getAllowsChildren() {
|
public boolean getAllowsChildren() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getChildAt(int arg0) {
|
public TreeNode getChildAt(int arg0) {
|
||||||
return get(arg0);
|
return get(arg0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getChildCount() {
|
public int getChildCount() {
|
||||||
return size();
|
return size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getIndex(TreeNode arg0) {
|
public int getIndex(TreeNode arg0) {
|
||||||
return indexOf(arg0);
|
return indexOf(arg0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getParent() {
|
public TreeNode getParent() {
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isLeaf() {
|
public boolean isLeaf() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenAdded(path);
|
parent.childrenAdded(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenChanged(path);
|
parent.childrenChanged(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
if (path.size() == 1 && this.getChildCount() == 1) {
|
if (path.size() == 1 && this.getChildCount() == 1) {
|
||||||
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
childrenRemoved(new ArrayList<ProjectTreeNode>());
|
||||||
} else {
|
} else {
|
||||||
path.add(0, this);
|
path.add(0, this);
|
||||||
parent.childrenRemoved(path);
|
parent.childrenRemoved(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
return (needsSaving() ? "*" : "")+"Worldmap";
|
return (needsSaving() ? "*" : "") + "Worldmap";
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public void notifyCreated() {
|
|
||||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Project getProject() {
|
public void notifyCreated() {
|
||||||
return parent.getProject();
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Project getProject() {
|
||||||
return DefaultIcons.getMapClosedIcon();
|
return parent.getProject();
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public Image getLeafIcon() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public Image getClosedIcon() {
|
|
||||||
return DefaultIcons.getMapClosedIcon();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public Image getOpenIcon() {
|
|
||||||
return DefaultIcons.getMapOpenIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public Image getIcon() {
|
||||||
return null;
|
return DefaultIcons.getMapClosedIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public Image getLeafIcon() {
|
||||||
return parent.getDataType();
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save() {
|
@Override
|
||||||
|
public Image getClosedIcon() {
|
||||||
|
return DefaultIcons.getMapClosedIcon();
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
@Override
|
||||||
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
public Image getOpenIcon() {
|
||||||
doc.setXmlVersion("1.0");
|
return DefaultIcons.getMapOpenIcon();
|
||||||
Element root = doc.createElement("worldmap");
|
}
|
||||||
doc.appendChild(root);
|
|
||||||
|
|
||||||
for (WorldmapSegment segment : this) {
|
@Override
|
||||||
root.appendChild(segment.toXmlElement(doc));
|
public GameDataSet getDataSet() {
|
||||||
segment.state = GameDataElement.State.saved;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
saveDocToFile(doc, worldmapFile);
|
@Override
|
||||||
} catch (ParserConfigurationException e) {
|
public Type getDataType() {
|
||||||
// TODO Auto-generated catch block
|
return parent.getDataType();
|
||||||
e.printStackTrace();
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public WorldmapSegment getWorldmapSegment(String id) {
|
public void save() {
|
||||||
for (WorldmapSegment s : this) {
|
|
||||||
if (s.id.equals(id)) {
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addSegment(WorldmapSegment node) {
|
try {
|
||||||
ProjectTreeNode higherEmptyParent = this;
|
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
||||||
while (higherEmptyParent != null) {
|
doc.setXmlVersion("1.0");
|
||||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode)higherEmptyParent.getParent()).isEmpty()) higherEmptyParent = (ProjectTreeNode)higherEmptyParent.getParent();
|
Element root = doc.createElement("worldmap");
|
||||||
else break;
|
doc.appendChild(root);
|
||||||
}
|
|
||||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
for (WorldmapSegment segment : this) {
|
||||||
add(node);
|
root.appendChild(segment.toXmlElement(doc));
|
||||||
node.parent = this;
|
segment.state = GameDataElement.State.saved;
|
||||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
}
|
||||||
else node.notifyCreated();
|
|
||||||
}
|
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) {
|
public static void saveDocToFile(Document doc, File f) {
|
||||||
try {
|
try {
|
||||||
Transformer transformer = TransformerFactory.newInstance().newTransformer();
|
Transformer transformer = TransformerFactory.newInstance().newTransformer();
|
||||||
Result output = new StreamResult(new FileOutputStream(f));
|
Result output = new StreamResult(new FileOutputStream(f));
|
||||||
Source input = new DOMSource(doc);
|
Source input = new DOMSource(doc);
|
||||||
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
|
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
|
||||||
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||||
transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
|
transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
|
||||||
transformer.transform(input, output);
|
transformer.transform(input, output);
|
||||||
} catch (TransformerConfigurationException e) {
|
} catch (TransformerConfigurationException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (TransformerFactoryConfigurationError e) {
|
} catch (TransformerFactoryConfigurationError e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (TransformerException e) {
|
} catch (TransformerException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean needsSaving() {
|
public boolean needsSaving() {
|
||||||
for (ProjectTreeNode node : this) {
|
for (ProjectTreeNode node : this) {
|
||||||
if (node.needsSaving()) return true;
|
if (node.needsSaving()) return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,240 +1,233 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.maps;
|
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.ATContentStudio;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode;
|
||||||
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
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 {
|
public class WorldmapSegment extends GameDataElement {
|
||||||
|
|
||||||
private static final long serialVersionUID = 2658610076889592723L;
|
private static final long serialVersionUID = 2658610076889592723L;
|
||||||
|
|
||||||
public static final String TEMP_LABEL_KEY = "ATCS_INTERNAL_TEMPORARY_KEY_FOR_LABEL";
|
public static final String TEMP_LABEL_KEY = "ATCS_INTERNAL_TEMPORARY_KEY_FOR_LABEL";
|
||||||
|
|
||||||
public int segmentX;
|
public int segmentX;
|
||||||
public int segmentY;
|
public int segmentY;
|
||||||
public Map<String, Point> mapLocations = new LinkedHashMap<String, Point>();
|
public Map<String, Point> mapLocations = new LinkedHashMap<String, Point>();
|
||||||
public Map<String, List<String>> labelledMaps = new LinkedHashMap<String, List<String>>();
|
public Map<String, List<String>> labelledMaps = new LinkedHashMap<String, List<String>>();
|
||||||
public Map<String, NamedArea> labels = new LinkedHashMap<String, NamedArea>();
|
public Map<String, NamedArea> labels = new LinkedHashMap<String, NamedArea>();
|
||||||
public Element xmlNode;
|
public Element xmlNode;
|
||||||
|
|
||||||
public WorldmapSegment(Worldmap parent, String name, Element xmlNode) {
|
public WorldmapSegment(Worldmap parent, String name, Element xmlNode) {
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
this.id = name;
|
this.id = name;
|
||||||
this.xmlNode = xmlNode;
|
this.xmlNode = xmlNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public GameDataSet getDataSet() {
|
||||||
return parent.getDataSet();
|
return parent.getDataSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
return (needsSaving() ? "*" : "")+id;
|
return (needsSaving() ? "*" : "") + id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void parse() {
|
public void parse() {
|
||||||
segmentX = Integer.parseInt(xmlNode.getAttribute("x"));
|
segmentX = Integer.parseInt(xmlNode.getAttribute("x"));
|
||||||
segmentY = Integer.parseInt(xmlNode.getAttribute("y"));
|
segmentY = Integer.parseInt(xmlNode.getAttribute("y"));
|
||||||
NodeList mapsList = xmlNode.getElementsByTagName("map");
|
NodeList mapsList = xmlNode.getElementsByTagName("map");
|
||||||
for (int j = 0; j < mapsList.getLength(); j++) {
|
for (int j = 0; j < mapsList.getLength(); j++) {
|
||||||
Element mapNode = (Element) mapsList.item(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));
|
mapLocations.put(mapNode.getAttribute("id"), new Point(Integer.parseInt(mapNode.getAttribute("x")) - segmentX, Integer.parseInt(mapNode.getAttribute("y")) - segmentY));
|
||||||
String area;
|
String area;
|
||||||
if ((area = mapNode.getAttribute("area")) != null && !"".equals(area)) {
|
if ((area = mapNode.getAttribute("area")) != null && !"".equals(area)) {
|
||||||
if (labelledMaps.get(area) == null) {
|
if (labelledMaps.get(area) == null) {
|
||||||
labelledMaps.put(area, new ArrayList<String>());
|
labelledMaps.put(area, new ArrayList<String>());
|
||||||
}
|
}
|
||||||
labelledMaps.get(area).add(mapNode.getAttribute("id"));
|
labelledMaps.get(area).add(mapNode.getAttribute("id"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NodeList namedAreasNodeList = xmlNode.getElementsByTagName("namedarea");
|
NodeList namedAreasNodeList = xmlNode.getElementsByTagName("namedarea");
|
||||||
for (int j = 0; j < namedAreasNodeList.getLength(); j++) {
|
for (int j = 0; j < namedAreasNodeList.getLength(); j++) {
|
||||||
Element namedAreaNode = (Element) namedAreasNodeList.item(j);
|
Element namedAreaNode = (Element) namedAreasNodeList.item(j);
|
||||||
labels.put(namedAreaNode.getAttribute("id"), new NamedArea(namedAreaNode.getAttribute("id"), namedAreaNode.getAttribute("name"), namedAreaNode.getAttribute("type")));
|
labels.put(namedAreaNode.getAttribute("id"), new NamedArea(namedAreaNode.getAttribute("id"), namedAreaNode.getAttribute("name"), namedAreaNode.getAttribute("type")));
|
||||||
}
|
}
|
||||||
this.state = State.parsed;
|
this.state = State.parsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (this.state == State.init) {
|
if (this.state == State.init) {
|
||||||
this.parse();
|
this.parse();
|
||||||
} else if (this.state == State.linked) {
|
} else if (this.state == State.linked) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (String mapName : mapLocations.keySet()) {
|
for (String mapName : mapLocations.keySet()) {
|
||||||
if (getProject().getMap(mapName) != null) {
|
if (getProject().getMap(mapName) != null) {
|
||||||
getProject().getMap(mapName).addBacklink(this);
|
getProject().getMap(mapName).addBacklink(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WorldmapSegment clone() {
|
public WorldmapSegment clone() {
|
||||||
WorldmapSegment clone = new WorldmapSegment((Worldmap)parent, id, (Element) xmlNode.cloneNode(true));
|
WorldmapSegment clone = new WorldmapSegment((Worldmap) parent, id, (Element) xmlNode.cloneNode(true));
|
||||||
|
|
||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
boolean modified = false;
|
boolean modified = false;
|
||||||
if (newOne == null && writable) {
|
if (newOne == null && writable) {
|
||||||
//A referenced map may have been deleted.
|
//A referenced map may have been deleted.
|
||||||
if (mapLocations.containsKey(oldOne.id)) {
|
if (mapLocations.containsKey(oldOne.id)) {
|
||||||
mapLocations.remove(oldOne.id);
|
mapLocations.remove(oldOne.id);
|
||||||
modified = true;
|
modified = true;
|
||||||
}
|
}
|
||||||
List<String> deprecatedLabels = new ArrayList<String>();
|
List<String> deprecatedLabels = new ArrayList<String>();
|
||||||
for (String label : labelledMaps.keySet()) {
|
for (String label : labelledMaps.keySet()) {
|
||||||
if (labelledMaps.get(label).contains(oldOne.id)) {
|
if (labelledMaps.get(label).contains(oldOne.id)) {
|
||||||
labelledMaps.get(label).remove(oldOne.id);
|
labelledMaps.get(label).remove(oldOne.id);
|
||||||
modified = true;
|
modified = true;
|
||||||
if (labelledMaps.get(label).isEmpty()) {
|
if (labelledMaps.get(label).isEmpty()) {
|
||||||
deprecatedLabels.add(label);
|
deprecatedLabels.add(label);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (String label : deprecatedLabels) {
|
for (String label : deprecatedLabels) {
|
||||||
labelledMaps.remove(label);
|
labelledMaps.remove(label);
|
||||||
labels.remove(label);
|
labels.remove(label);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
oldOne.removeBacklink(this);
|
oldOne.removeBacklink(this);
|
||||||
if(newOne != null) newOne.addBacklink(this);
|
if (newOne != null) newOne.addBacklink(this);
|
||||||
|
|
||||||
if (modified) {
|
if (modified) {
|
||||||
this.state = GameDataElement.State.modified;
|
this.state = GameDataElement.State.modified;
|
||||||
childrenChanged(new ArrayList<ProjectTreeNode>());
|
childrenChanged(new ArrayList<ProjectTreeNode>());
|
||||||
ATContentStudio.frame.editorChanged(this);
|
ATContentStudio.frame.editorChanged(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getProjectFilename() {
|
public String getProjectFilename() {
|
||||||
return "worldmap.xml";
|
return "worldmap.xml";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void save() {
|
public void save() {
|
||||||
((Worldmap)parent).save();
|
((Worldmap) parent).save();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toXml() {
|
public String toXml() {
|
||||||
Document doc;
|
Document doc;
|
||||||
try {
|
try {
|
||||||
doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
|
||||||
doc.setXmlVersion("1.0");
|
doc.setXmlVersion("1.0");
|
||||||
Element root = doc.createElement("worldmap");
|
Element root = doc.createElement("worldmap");
|
||||||
doc.appendChild(root);
|
doc.appendChild(root);
|
||||||
root.appendChild(this.toXmlElement(doc));
|
root.appendChild(this.toXmlElement(doc));
|
||||||
Transformer transformer = TransformerFactory.newInstance().newTransformer();
|
Transformer transformer = TransformerFactory.newInstance().newTransformer();
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
Result output = new StreamResult(baos);
|
Result output = new StreamResult(baos);
|
||||||
Source input = new DOMSource(doc);
|
Source input = new DOMSource(doc);
|
||||||
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
|
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
|
||||||
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||||
transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
|
transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
|
||||||
transformer.transform(input, output);
|
transformer.transform(input, output);
|
||||||
return baos.toString();
|
return baos.toString();
|
||||||
} catch (ParserConfigurationException e) {
|
} catch (ParserConfigurationException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (TransformerException e) {
|
} catch (TransformerException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Element toXmlElement(Document doc) {
|
public Element toXmlElement(Document doc) {
|
||||||
Element element = doc.createElement("segment");
|
Element element = doc.createElement("segment");
|
||||||
element.setAttribute("id", id);
|
element.setAttribute("id", id);
|
||||||
element.setAttribute("x", Integer.toString(segmentX));
|
element.setAttribute("x", Integer.toString(segmentX));
|
||||||
element.setAttribute("y", Integer.toString(segmentY));
|
element.setAttribute("y", Integer.toString(segmentY));
|
||||||
|
|
||||||
for (String s : mapLocations.keySet()) {
|
for (String s : mapLocations.keySet()) {
|
||||||
Element map = doc.createElement("map");
|
Element map = doc.createElement("map");
|
||||||
map.setAttribute("id", s);
|
map.setAttribute("id", s);
|
||||||
map.setAttribute("x", Integer.toString(mapLocations.get(s).x + segmentX));
|
map.setAttribute("x", Integer.toString(mapLocations.get(s).x + segmentX));
|
||||||
map.setAttribute("y", Integer.toString(mapLocations.get(s).y + segmentY));
|
map.setAttribute("y", Integer.toString(mapLocations.get(s).y + segmentY));
|
||||||
for (String label : labelledMaps.keySet()) {
|
for (String label : labelledMaps.keySet()) {
|
||||||
if (TEMP_LABEL_KEY.equals(label)) continue;
|
if (TEMP_LABEL_KEY.equals(label)) continue;
|
||||||
if (labelledMaps.get(label).contains(s)) {
|
if (labelledMaps.get(label).contains(s)) {
|
||||||
map.setAttribute("area", label);
|
map.setAttribute("area", label);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
element.appendChild(map);
|
element.appendChild(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (String key : labels.keySet()) {
|
for (String key : labels.keySet()) {
|
||||||
if (TEMP_LABEL_KEY.equals(key)) continue;
|
if (TEMP_LABEL_KEY.equals(key)) continue;
|
||||||
NamedArea area = labels.get(key);
|
NamedArea area = labels.get(key);
|
||||||
Element namedArea = doc.createElement("namedarea");
|
Element namedArea = doc.createElement("namedarea");
|
||||||
namedArea.setAttribute("id", area.id);
|
namedArea.setAttribute("id", area.id);
|
||||||
namedArea.setAttribute("name", area.name);
|
namedArea.setAttribute("name", area.name);
|
||||||
namedArea.setAttribute("type", area.type);
|
namedArea.setAttribute("type", area.type);
|
||||||
element.appendChild(namedArea);
|
element.appendChild(namedArea);
|
||||||
}
|
}
|
||||||
|
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SaveEvent> attemptSave() {
|
public List<SaveEvent> attemptSave() {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
save();
|
save();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class NamedArea {
|
public static class NamedArea {
|
||||||
public String id;
|
public String id;
|
||||||
public String name;
|
public String name;
|
||||||
public String type;
|
public String type;
|
||||||
|
|
||||||
public NamedArea(String id, String name, String type) {
|
public NamedArea(String id, String name, String type) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return DefaultIcons.getUIMapIcon();
|
return DefaultIcons.getUIMapIcon();
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public Image getLeafIcon() {
|
@Override
|
||||||
return DefaultIcons.getUIMapIcon();
|
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;
|
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;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||||
import com.gpl.rpg.atcontentstudio.model.Project;
|
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.model.gamedata.GameDataSet;
|
||||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
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 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_SOURCE = "res" + File.separator + "drawable" + File.separator;
|
||||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "spritesheets"+File.separator;
|
public static final String DEFAULT_REL_PATH_IN_PROJECT = "spritesheets" + File.separator;
|
||||||
|
|
||||||
public File drawableFolder = null;
|
public File drawableFolder = null;
|
||||||
|
|
||||||
public transient List<Spritesheet> spritesheets;
|
public transient List<Spritesheet> spritesheets;
|
||||||
|
|
||||||
public GameSource parent;
|
public GameSource parent;
|
||||||
|
|
||||||
public SpriteSheetSet(GameSource source) {
|
public SpriteSheetSet(GameSource source) {
|
||||||
this.parent = source;
|
this.parent = source;
|
||||||
if (source.type == GameSource.Type.source) this.drawableFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
if (source.type == GameSource.Type.source)
|
||||||
else if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
this.drawableFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_SOURCE);
|
||||||
this.drawableFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
else if (source.type == GameSource.Type.created | source.type == GameSource.Type.altered) {
|
||||||
if (!this.drawableFolder.exists()) {
|
this.drawableFolder = new File(source.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||||
this.drawableFolder.mkdirs();
|
if (!this.drawableFolder.exists()) {
|
||||||
}
|
this.drawableFolder.mkdirs();
|
||||||
}
|
}
|
||||||
spritesheets = new ArrayList<Spritesheet>();
|
}
|
||||||
if (this.drawableFolder != null) {
|
spritesheets = new ArrayList<Spritesheet>();
|
||||||
for (File f : this.drawableFolder.listFiles()) {
|
if (this.drawableFolder != null) {
|
||||||
if (f.getName().endsWith(".png") || f.getName().endsWith(".PNG")) {
|
for (File f : this.drawableFolder.listFiles()) {
|
||||||
spritesheets.add(new Spritesheet(this, f));
|
if (f.getName().endsWith(".png") || f.getName().endsWith(".PNG")) {
|
||||||
}
|
spritesheets.add(new Spritesheet(this, f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
spritesheets.sort(Comparator.comparing(s -> s.id));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Enumeration<Spritesheet> children() {
|
public Enumeration<Spritesheet> children() {
|
||||||
return Collections.enumeration(spritesheets);
|
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
|
@Override
|
||||||
public Project getProject() {
|
public boolean getAllowsChildren() {
|
||||||
return parent.getProject();
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public TreeNode getChildAt(int arg0) {
|
||||||
return getOpenIcon();
|
return spritesheets.get(arg0);
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public Image getClosedIcon() {
|
|
||||||
return DefaultIcons.getSpriteClosedIcon();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public Image getLeafIcon() {
|
|
||||||
return DefaultIcons.getSpriteClosedIcon();
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public Image getOpenIcon() {
|
|
||||||
return DefaultIcons.getSpriteOpenIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public int getChildCount() {
|
||||||
return null;
|
return spritesheets.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public int getIndex(TreeNode arg0) {
|
||||||
return parent.getDataType();
|
return spritesheets.indexOf(arg0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public TreeNode getParent() {
|
||||||
return spritesheets.isEmpty();
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Spritesheet getSpritesheet(String id) {
|
@Override
|
||||||
if (spritesheets == null) return null;
|
public boolean isLeaf() {
|
||||||
for (Spritesheet sheet : spritesheets) {
|
return false;
|
||||||
if (id.equals(sheet.id)){
|
}
|
||||||
return sheet;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean needsSaving() {
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
for (ProjectTreeNode node : spritesheets) {
|
path.add(0, this);
|
||||||
if (node.needsSaving()) return true;
|
parent.childrenAdded(path);
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
@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;
|
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.ATContentStudio;
|
||||||
import com.gpl.rpg.atcontentstudio.Notification;
|
import com.gpl.rpg.atcontentstudio.Notification;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
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.SaveEvent;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
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 {
|
public class Spritesheet extends GameDataElement {
|
||||||
|
|
||||||
private static final long serialVersionUID = -5981708088278528586L;
|
private static final long serialVersionUID = -5981708088278528586L;
|
||||||
|
|
||||||
public SpriteSheetSet parent;
|
public SpriteSheetSet parent;
|
||||||
public File spritesheetFile;
|
public File spritesheetFile;
|
||||||
public int spriteWidth = 32;
|
public int spriteWidth = 32;
|
||||||
public int spriteHeight = 32;
|
public int spriteHeight = 32;
|
||||||
public String id;
|
public String id;
|
||||||
public Category category = Category.none;
|
public Category category = Category.none;
|
||||||
public boolean animated = false;
|
public boolean animated = false;
|
||||||
|
|
||||||
public enum Category {
|
public enum Category {
|
||||||
none,
|
none,
|
||||||
monster,
|
monster,
|
||||||
item,
|
item,
|
||||||
actorcondition
|
actorcondition
|
||||||
};
|
}
|
||||||
|
|
||||||
//Lazy initialization.
|
//Lazy initialization.
|
||||||
public BufferedImage spritesheet = null;
|
public BufferedImage spritesheet = null;
|
||||||
public Map<Integer, BufferedImage> cache_full_size = new LinkedHashMap<Integer, BufferedImage>();
|
public Map<Integer, BufferedImage> cache_full_size = new LinkedHashMap<Integer, BufferedImage>();
|
||||||
public Map<Integer, Image> cache_icon = new LinkedHashMap<Integer, Image>();
|
public Map<Integer, Image> cache_icon = new LinkedHashMap<Integer, Image>();
|
||||||
|
|
||||||
public Spritesheet(SpriteSheetSet parent, File f) {
|
public Spritesheet(SpriteSheetSet parent, File f) {
|
||||||
this.spritesheetFile = f;
|
this.spritesheetFile = f;
|
||||||
this.id = f.getName().substring(0, f.getName().lastIndexOf("."));
|
this.id = f.getName().substring(0, f.getName().lastIndexOf("."));
|
||||||
this.parent = parent;
|
this.parent = parent;
|
||||||
|
|
||||||
String cat = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".category");
|
String cat = getProject().getSpritesheetsProperty("atcs.spritesheet." + this.id + ".category");
|
||||||
if (cat != null) {
|
if (cat != null) {
|
||||||
this.category = Category.valueOf(cat);
|
this.category = Category.valueOf(cat);
|
||||||
}
|
}
|
||||||
String sizex = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".sizex");
|
String sizex = getProject().getSpritesheetsProperty("atcs.spritesheet." + this.id + ".sizex");
|
||||||
if (sizex != null) {
|
if (sizex != null) {
|
||||||
this.spriteWidth = Integer.parseInt(sizex);
|
this.spriteWidth = Integer.parseInt(sizex);
|
||||||
}
|
}
|
||||||
String sizey = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".sizey");
|
String sizey = getProject().getSpritesheetsProperty("atcs.spritesheet." + this.id + ".sizey");
|
||||||
if (sizey != null) {
|
if (sizey != null) {
|
||||||
this.spriteHeight = Integer.parseInt(sizey);
|
this.spriteHeight = Integer.parseInt(sizey);
|
||||||
}
|
}
|
||||||
String anim = getProject().getSpritesheetsProperty("atcs.spritesheet."+this.id+".animate");
|
String anim = getProject().getSpritesheetsProperty("atcs.spritesheet." + this.id + ".animate");
|
||||||
if (anim != null) {
|
if (anim != null) {
|
||||||
this.animated = Boolean.parseBoolean(anim);
|
this.animated = Boolean.parseBoolean(anim);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Enumeration<ProjectTreeNode> children() {
|
public Enumeration<ProjectTreeNode> children() {
|
||||||
return null;
|
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
|
@Override
|
||||||
public Project getProject() {
|
public boolean getAllowsChildren() {
|
||||||
return parent.getProject();
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getSpriteCount() {
|
@Override
|
||||||
if (spritesheet == null) {
|
public TreeNode getChildAt(int arg0) {
|
||||||
try {
|
return null;
|
||||||
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) {
|
@Override
|
||||||
if (spritesheet == null) {
|
public int getChildCount() {
|
||||||
try {
|
return 0;
|
||||||
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) {
|
@Override
|
||||||
if (cache_icon.get(index) != null) {
|
public int getIndex(TreeNode arg0) {
|
||||||
return cache_icon.get(index);
|
return 0;
|
||||||
}
|
}
|
||||||
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() {
|
@Override
|
||||||
cache_full_size.clear();
|
public TreeNode getParent() {
|
||||||
cache_icon.clear();
|
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
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return getIcon(0);
|
return getIcon(0);
|
||||||
}
|
}
|
||||||
@Override
|
|
||||||
public Image getLeafIcon() {
|
@Override
|
||||||
return getIcon();
|
public Image getLeafIcon() {
|
||||||
}
|
return getIcon();
|
||||||
@Override
|
}
|
||||||
public Image getClosedIcon() {return null;}
|
|
||||||
@Override
|
@Override
|
||||||
public Image getOpenIcon() {return null;}
|
public Image getClosedIcon() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Image getOpenIcon() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public GameDataSet getDataSet() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public Type getDataType() {
|
||||||
return parent.getDataType();
|
return parent.getDataType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void parse() {
|
public void parse() {
|
||||||
if(this.state == GameDataElement.State.init){
|
if (this.state == GameDataElement.State.init) {
|
||||||
this.state = GameDataElement.State.parsed;
|
this.state = GameDataElement.State.parsed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void link() {
|
public void link() {
|
||||||
if (this.state == GameDataElement.State.init) {
|
if (this.state == GameDataElement.State.init) {
|
||||||
this.parse();
|
this.parse();
|
||||||
}
|
}
|
||||||
if(this.state == GameDataElement.State.parsed) {
|
if (this.state == GameDataElement.State.parsed) {
|
||||||
this.state = GameDataElement.State.linked;
|
this.state = GameDataElement.State.linked;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataElement clone() {
|
public GameDataElement clone() {
|
||||||
Spritesheet clone = new Spritesheet((SpriteSheetSet) getParent(), new File(spritesheetFile.getAbsolutePath()));
|
Spritesheet clone = new Spritesheet((SpriteSheetSet) getParent(), new File(spritesheetFile.getAbsolutePath()));
|
||||||
clone.id = this.id;
|
clone.id = this.id;
|
||||||
clone.animated = this.animated;
|
clone.animated = this.animated;
|
||||||
clone.category = this.category;
|
clone.category = this.category;
|
||||||
clone.spriteWidth = this.spriteWidth;
|
clone.spriteWidth = this.spriteWidth;
|
||||||
clone.spriteHeight = this.spriteHeight;
|
clone.spriteHeight = this.spriteHeight;
|
||||||
return clone;
|
return clone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
//nothing linked.
|
//nothing linked.
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getProjectFilename() {
|
public String getProjectFilename() {
|
||||||
return spritesheetFile.getName();
|
return spritesheetFile.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void save() {
|
public void save() {
|
||||||
if (this.category != null) getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".category", this.category.toString());
|
if (this.category != null)
|
||||||
if (this.spriteWidth != 32) getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".sizex", Integer.toString(this.spriteWidth));
|
getProject().setSpritesheetsProperty("atcs.spritesheet." + this.id + ".category", this.category.toString());
|
||||||
if (this.spriteHeight != 32) getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".sizey", Integer.toString(this.spriteHeight));
|
if (this.spriteWidth != 32)
|
||||||
if (this.animated)getProject().setSpritesheetsProperty("atcs.spritesheet."+this.id+".animate", Boolean.toString(this.animated));
|
getProject().setSpritesheetsProperty("atcs.spritesheet." + this.id + ".sizex", Integer.toString(this.spriteWidth));
|
||||||
getProject().save();
|
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;
|
this.state = GameDataElement.State.saved;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SaveEvent> attemptSave() {
|
public List<SaveEvent> attemptSave() {
|
||||||
save();
|
save();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.tools.i18n;
|
package com.gpl.rpg.atcontentstudio.model.tools.i18n;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.*;
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.FileWriter;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.OutputStreamWriter;
|
|
||||||
import java.io.Writer;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
@@ -14,76 +9,76 @@ import java.util.Map;
|
|||||||
|
|
||||||
public class PoPotWriter {
|
public class PoPotWriter {
|
||||||
|
|
||||||
Map<String, List<String>> stringsResources = new LinkedHashMap<String, List<String>>();
|
Map<String, List<String>> stringsResources = new LinkedHashMap<String, List<String>>();
|
||||||
Map<String, String> translations = new LinkedHashMap<String, String>();
|
Map<String, String> translations = new LinkedHashMap<String, String>();
|
||||||
File f;
|
File f;
|
||||||
|
|
||||||
public static void writePoFile(Map<String, List<String>> stringsResources, Map<String, String> translations, File destination) {
|
public static void writePoFile(Map<String, List<String>> stringsResources, Map<String, String> translations, File destination) {
|
||||||
try {
|
try {
|
||||||
Writer fw = new OutputStreamWriter(new FileOutputStream(destination), StandardCharsets.UTF_8);
|
Writer fw = new OutputStreamWriter(new FileOutputStream(destination), StandardCharsets.UTF_8);
|
||||||
if (translations.get("") != null) {
|
if (translations.get("") != null) {
|
||||||
fw.write(translations.get(""));
|
fw.write(translations.get(""));
|
||||||
writeEndOfEntry(fw);
|
writeEndOfEntry(fw);
|
||||||
}
|
}
|
||||||
if (translations.get("translator-credits") != null) {
|
if (translations.get("translator-credits") != null) {
|
||||||
List<String> refs = new LinkedList<String>();
|
List<String> refs = new LinkedList<String>();
|
||||||
refs.add("[none]");
|
refs.add("[none]");
|
||||||
writeReferences(fw, refs);
|
writeReferences(fw, refs);
|
||||||
writeMsgId(fw, "translator-credits");
|
writeMsgId(fw, "translator-credits");
|
||||||
writeMsgStr(fw, translations.get("translator-credits"));
|
writeMsgStr(fw, translations.get("translator-credits"));
|
||||||
writeEndOfEntry(fw);
|
writeEndOfEntry(fw);
|
||||||
}
|
}
|
||||||
for (String msg : stringsResources.keySet()) {
|
for (String msg : stringsResources.keySet()) {
|
||||||
writeReferences(fw, stringsResources.get(msg));
|
writeReferences(fw, stringsResources.get(msg));
|
||||||
writeMsgId(fw, msg);
|
writeMsgId(fw, msg);
|
||||||
writeMsgStr(fw, translations.get(msg));
|
writeMsgStr(fw, translations.get(msg));
|
||||||
writeEndOfEntry(fw);
|
writeEndOfEntry(fw);
|
||||||
}
|
}
|
||||||
fw.flush();
|
fw.flush();
|
||||||
fw.close();
|
fw.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writePotFile(Map<String, List<String>> stringsResources, File destination) {
|
public static void writePotFile(Map<String, List<String>> stringsResources, File destination) {
|
||||||
try {
|
try {
|
||||||
FileWriter fw = new FileWriter(destination);
|
FileWriter fw = new FileWriter(destination);
|
||||||
for (String msg : stringsResources.keySet()) {
|
for (String msg : stringsResources.keySet()) {
|
||||||
writeReferences(fw, stringsResources.get(msg));
|
writeReferences(fw, stringsResources.get(msg));
|
||||||
writeMsgId(fw, msg);
|
writeMsgId(fw, msg);
|
||||||
writeMsgStr(fw, "");
|
writeMsgStr(fw, "");
|
||||||
writeEndOfEntry(fw);
|
writeEndOfEntry(fw);
|
||||||
}
|
}
|
||||||
fw.flush();
|
fw.flush();
|
||||||
fw.close();
|
fw.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void writeReferences(Writer w, List<String> references) throws IOException {
|
private static void writeReferences(Writer w, List<String> references) throws IOException {
|
||||||
for (String ref : references) {
|
for (String ref : references) {
|
||||||
w.write("#: ");
|
w.write("#: ");
|
||||||
w.write(ref);
|
w.write(ref);
|
||||||
w.write("\n");
|
w.write("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void writeMsgId(Writer w, String msg) throws IOException {
|
private static void writeMsgId(Writer w, String msg) throws IOException {
|
||||||
w.write("msgid \"");
|
w.write("msgid \"");
|
||||||
w.write(msg);
|
w.write(msg);
|
||||||
w.write("\"\n");
|
w.write("\"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void writeMsgStr(Writer w, String translation) throws IOException {
|
private static void writeMsgStr(Writer w, String translation) throws IOException {
|
||||||
w.write("msgstr \"");
|
w.write("msgstr \"");
|
||||||
w.write(translation == null ? "" : translation);
|
w.write(translation == null ? "" : translation);
|
||||||
w.write("\"\n");
|
w.write("\"\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void writeEndOfEntry(Writer w) throws IOException {
|
private static void writeEndOfEntry(Writer w) throws IOException {
|
||||||
w.write("\n");
|
w.write("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,310 +1,304 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.tools.i18n;
|
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 com.gpl.rpg.atcontentstudio.model.Project;
|
||||||
|
|
||||||
import net.launchpad.tobal.poparser.POEntry;
|
import net.launchpad.tobal.poparser.POEntry;
|
||||||
import net.launchpad.tobal.poparser.POFile;
|
import net.launchpad.tobal.poparser.POFile;
|
||||||
import net.launchpad.tobal.poparser.POParser;
|
import net.launchpad.tobal.poparser.POParser;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileFilter;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* @author Kevin
|
* @author Kevin
|
||||||
*
|
* <p>
|
||||||
* To use this, paste the following script in the beanshell console of ATCS.
|
* 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.
|
* Don't forget to change the project number to suit your needs.
|
||||||
|
* <p>
|
||||||
|
* <code>
|
||||||
*
|
*
|
||||||
import com.gpl.rpg.atcontentstudio.model.Workspace;
|
* import com.gpl.rpg.atcontentstudio.model.Workspace;
|
||||||
import com.gpl.rpg.atcontentstudio.model.tools.i18n.PotGenerator;
|
* import com.gpl.rpg.atcontentstudio.model.tools.i18n.PotGenerator;
|
||||||
import com.gpl.rpg.atcontentstudio.model.tools.i18n.PotComparator;
|
* 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);
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
*
|
||||||
|
* proj = Workspace.activeWorkspace.projects.get(7);
|
||||||
|
* PotGenerator.generatePotFileForProject(proj);
|
||||||
|
* comp = new PotComparator(proj);
|
||||||
|
* comp.compare();
|
||||||
|
* comp.updatePoFiles(proj);
|
||||||
|
* </code>
|
||||||
*/
|
*/
|
||||||
public class PotComparator {
|
public class PotComparator {
|
||||||
|
|
||||||
Map<String, List<String>> stringsResourcesNew = new LinkedHashMap<String, List<String>>();
|
Map<String, List<String>> stringsResourcesNew = new LinkedHashMap<String, List<String>>();
|
||||||
Map<String, String> resourcesStringsNew = new LinkedHashMap<String, String>();
|
Map<String, String> resourcesStringsNew = new LinkedHashMap<String, String>();
|
||||||
|
|
||||||
Map<String, List<String>> stringsResourcesOld = new LinkedHashMap<String, List<String>>();
|
Map<String, List<String>> stringsResourcesOld = new LinkedHashMap<String, List<String>>();
|
||||||
Map<String, String> resourcesStringsOld = new LinkedHashMap<String, String>();
|
Map<String, String> resourcesStringsOld = new LinkedHashMap<String, String>();
|
||||||
|
|
||||||
Map<String, String> msgIdToReplace = new LinkedHashMap<String, String>();
|
Map<String, String> msgIdToReplace = new LinkedHashMap<String, String>();
|
||||||
List<String> msgIdToReview = new LinkedList<String>();
|
List<String> msgIdToReview = new LinkedList<String>();
|
||||||
List<String> msgIdOutdated = new LinkedList<String>();
|
List<String> msgIdOutdated = new LinkedList<String>();
|
||||||
|
|
||||||
|
|
||||||
public PotComparator(Project proj) {
|
public PotComparator(Project proj) {
|
||||||
POParser parser = new POParser();
|
POParser parser = new POParser();
|
||||||
|
|
||||||
POFile newPot = parser.parseFile(new File(proj.alteredContent.baseFolder.getAbsolutePath()+File.separator+"english.pot"));
|
POFile newPot = parser.parseFile(new File(proj.alteredContent.baseFolder.getAbsolutePath() + File.separator + "english.pot"));
|
||||||
if (newPot == null) {
|
if (newPot == null) {
|
||||||
System.err.println("Cannot locate new english.pot file at "+proj.alteredContent.baseFolder.getAbsolutePath()+File.separator);
|
System.err.println("Cannot locate new english.pot file at " + proj.alteredContent.baseFolder.getAbsolutePath() + File.separator);
|
||||||
}
|
}
|
||||||
extractFromPoFile(newPot, stringsResourcesNew, resourcesStringsNew);
|
extractFromPoFile(newPot, stringsResourcesNew, resourcesStringsNew);
|
||||||
|
|
||||||
POFile oldPot = parser.parseFile(new File(proj.baseContent.baseFolder.getAbsolutePath()+File.separator+"assets"+File.separator+"translation"+File.separator+"english.pot"));
|
POFile oldPot = parser.parseFile(new File(proj.baseContent.baseFolder.getAbsolutePath() + File.separator + "assets" + File.separator + "translation" + File.separator + "english.pot"));
|
||||||
if (oldPot == null) {
|
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);
|
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);
|
extractFromPoFile(oldPot, stringsResourcesOld, resourcesStringsOld);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void extractFromPoFile(POFile po, Map<String, List<String>> stringsResources, Map<String, String> resourcesStrings) {
|
private void extractFromPoFile(POFile po, Map<String, List<String>> stringsResources, Map<String, String> resourcesStrings) {
|
||||||
for (POEntry entry : po.getEntryArray()) {
|
for (POEntry entry : po.getEntryArray()) {
|
||||||
Vector<String> resources = entry.getStringsByType(POEntry.StringType.REFERENCE);
|
Vector<String> resources = entry.getStringsByType(POEntry.StringType.REFERENCE);
|
||||||
Vector<String> msgids = entry.getStringsByType(POEntry.StringType.MSGID);
|
Vector<String> msgids = entry.getStringsByType(POEntry.StringType.MSGID);
|
||||||
if (resources == null || resources.size() == 0 || msgids == null || msgids.size() == 0) continue;
|
if (resources == null || resources.size() == 0 || msgids == null || msgids.size() == 0) continue;
|
||||||
String msgid = msgids.get(0);
|
String msgid = msgids.get(0);
|
||||||
if (msgids.size() > 1) {
|
if (msgids.size() > 1) {
|
||||||
for (int i = 1; i < msgids.size(); i++) {
|
for (int i = 1; i < msgids.size(); i++) {
|
||||||
msgid += msgids.get(i);
|
msgid += msgids.get(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (msgid.contains("\\n")) {
|
if (msgid.contains("\\n")) {
|
||||||
msgid = msgid.replaceAll("\\\\n", "\\\\n\"\n\"");
|
msgid = msgid.replaceAll("\\\\n", "\\\\n\"\n\"");
|
||||||
msgid = "\"\n\""+msgid;
|
msgid = "\"\n\"" + msgid;
|
||||||
}
|
}
|
||||||
for (String resLine : resources) {
|
for (String resLine : resources) {
|
||||||
String[] resArray = resLine.split(" ");
|
String[] resArray = resLine.split(" ");
|
||||||
for (String res : resArray) {
|
for (String res : resArray) {
|
||||||
resourcesStrings.put(res, msgid);
|
resourcesStrings.put(res, msgid);
|
||||||
if (stringsResources.get(msgid) == null) {
|
if (stringsResources.get(msgid) == null) {
|
||||||
stringsResources.put(msgid, new LinkedList<String>());
|
stringsResources.put(msgid, new LinkedList<String>());
|
||||||
}
|
}
|
||||||
stringsResources.get(msgid).add(res);
|
stringsResources.get(msgid).add(res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void compare() {
|
public void compare() {
|
||||||
for (String oldRes : resourcesStringsOld.keySet()) {
|
for (String oldRes : resourcesStringsOld.keySet()) {
|
||||||
String newString = resourcesStringsNew.get(oldRes);
|
String newString = resourcesStringsNew.get(oldRes);
|
||||||
String oldString = resourcesStringsOld.get(oldRes);
|
String oldString = resourcesStringsOld.get(oldRes);
|
||||||
if (newString != null) {
|
if (newString != null) {
|
||||||
if (!newString.equals(oldString)) {
|
if (!newString.equals(oldString)) {
|
||||||
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
||||||
List<String> allNewResources = stringsResourcesNew.get(oldString);
|
List<String> allNewResources = stringsResourcesNew.get(oldString);
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
sb.append("---------------------------------------------\n");
|
sb.append("---------------------------------------------\n");
|
||||||
sb.append("--- TYPO CHECK ------------------------------\n");
|
sb.append("--- TYPO CHECK ------------------------------\n");
|
||||||
sb.append("---------------------------------------------\n");
|
sb.append("---------------------------------------------\n");
|
||||||
sb.append("String at: "+oldRes+"\n");
|
sb.append("String at: " + oldRes + "\n");
|
||||||
if (allOldResources.size() > 1) {
|
if (allOldResources.size() > 1) {
|
||||||
sb.append("Also present at:\n");
|
sb.append("Also present at:\n");
|
||||||
for (String res : allOldResources) {
|
for (String res : allOldResources) {
|
||||||
if (!res.equals(oldRes)) {
|
if (!res.equals(oldRes)) {
|
||||||
sb.append("- "+res+"\n");
|
sb.append("- " + res + "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (allNewResources != null) {
|
if (allNewResources != null) {
|
||||||
sb.append("Still present at: \n");
|
sb.append("Still present at: \n");
|
||||||
for (String res : allNewResources) {
|
for (String res : allNewResources) {
|
||||||
sb.append("- "+res+"\n");
|
sb.append("- " + res + "\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sb.append("Was : \""+oldString+"\"\n");
|
sb.append("Was : \"" + oldString + "\"\n");
|
||||||
sb.append("Now : \""+newString+"\"\n");
|
sb.append("Now : \"" + newString + "\"\n");
|
||||||
System.out.println(sb.toString());
|
System.out.println(sb.toString());
|
||||||
showTypoDialog(oldString, newString, sb.toString());
|
showTypoDialog(oldString, newString, sb.toString());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
||||||
List<String> allNewResources = stringsResourcesNew.get(oldString);
|
List<String> allNewResources = stringsResourcesNew.get(oldString);
|
||||||
if (allOldResources.size() >= 1) {
|
if (allOldResources.size() >= 1) {
|
||||||
System.out.println("---------------------------------------------");
|
System.out.println("---------------------------------------------");
|
||||||
System.out.println("--- REMOVED RESOURCE ------------------------");
|
System.out.println("--- REMOVED RESOURCE ------------------------");
|
||||||
System.out.println("---------------------------------------------");
|
System.out.println("---------------------------------------------");
|
||||||
System.out.println("String at: "+oldRes);
|
System.out.println("String at: " + oldRes);
|
||||||
if (allOldResources.size() > 1) {
|
if (allOldResources.size() > 1) {
|
||||||
System.out.println("And also at:");
|
System.out.println("And also at:");
|
||||||
for (String res : allOldResources) {
|
for (String res : allOldResources) {
|
||||||
if (!res.equals(oldRes)) {
|
if (!res.equals(oldRes)) {
|
||||||
System.out.println("- "+res);
|
System.out.println("- " + res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.out.println("Was: \""+oldString+"\"");
|
System.out.println("Was: \"" + oldString + "\"");
|
||||||
if (allNewResources == null) {
|
if (allNewResources == null) {
|
||||||
System.out.println("Absent from new.");
|
System.out.println("Absent from new.");
|
||||||
} else {
|
} else {
|
||||||
System.out.println("Still present at: ");
|
System.out.println("Still present at: ");
|
||||||
for (String res : allNewResources) {
|
for (String res : allNewResources) {
|
||||||
System.out.println("- "+res);
|
System.out.println("- " + res);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
removedStrings: for (String oldString : stringsResourcesOld.keySet()) {
|
removedStrings:
|
||||||
if (stringsResourcesNew.get(oldString) == null) {
|
for (String oldString : stringsResourcesOld.keySet()) {
|
||||||
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
if (stringsResourcesNew.get(oldString) == null) {
|
||||||
if (allOldResources.size() >= 1) {
|
List<String> allOldResources = stringsResourcesOld.get(oldString);
|
||||||
if (allOldResources.size() > 0) {
|
if (allOldResources.size() >= 1) {
|
||||||
for (String res : allOldResources) {
|
if (allOldResources.size() > 0) {
|
||||||
String newString = resourcesStringsNew.get(res);
|
for (String res : allOldResources) {
|
||||||
if (newString != null) {
|
String newString = resourcesStringsNew.get(res);
|
||||||
continue removedStrings;
|
if (newString != null) {
|
||||||
}
|
continue removedStrings;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.out.println("---------------------------------------------");
|
}
|
||||||
System.out.println("--- REMOVED STRING --------------------------");
|
System.out.println("---------------------------------------------");
|
||||||
System.out.println("---------------------------------------------");
|
System.out.println("--- REMOVED STRING --------------------------");
|
||||||
System.out.println("String: \""+oldString+"\"");
|
System.out.println("---------------------------------------------");
|
||||||
if (allOldResources.size() > 0) {
|
System.out.println("String: \"" + oldString + "\"");
|
||||||
System.out.println("Was at:");
|
if (allOldResources.size() > 0) {
|
||||||
for (String res : allOldResources) {
|
System.out.println("Was at:");
|
||||||
System.out.println("- "+res);
|
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.");
|
}
|
||||||
}
|
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) {
|
private void showTypoDialog(String oldMsg, String newMsg, String checkReport) {
|
||||||
String typo = "Typo";
|
String typo = "Typo";
|
||||||
String review = "Review";
|
String review = "Review";
|
||||||
String outdated = "Outdated";
|
String outdated = "Outdated";
|
||||||
String none = "None";
|
String none = "None";
|
||||||
Object[] options = new Object[] {typo, review, outdated, 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);
|
int result = JOptionPane.showOptionDialog(null, checkReport, "Choose action", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, typo);
|
||||||
|
|
||||||
if (result < 0 || result >= options.length) {
|
if (result < 0 || result >= options.length) {
|
||||||
System.out.println("No decision");
|
System.out.println("No decision");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
System.out.println("Decision: "+options[result]);
|
System.out.println("Decision: " + options[result]);
|
||||||
|
|
||||||
if (options[result] != none) {
|
if (options[result] != none) {
|
||||||
msgIdToReplace.put(oldMsg, newMsg);
|
msgIdToReplace.put(oldMsg, newMsg);
|
||||||
if (options[result] == review) {
|
if (options[result] == review) {
|
||||||
msgIdToReview.add(newMsg);
|
msgIdToReview.add(newMsg);
|
||||||
} else if (options[result] == outdated) {
|
} else if (options[result] == outdated) {
|
||||||
msgIdOutdated.add(newMsg);
|
msgIdOutdated.add(newMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void updatePoFiles(Project proj) {
|
public void updatePoFiles(Project proj) {
|
||||||
File poFolder = new File(proj.baseContent.baseFolder.getAbsolutePath()+File.separator+"assets"+File.separator+"translation");
|
File poFolder = new File(proj.baseContent.baseFolder.getAbsolutePath() + File.separator + "assets" + File.separator + "translation");
|
||||||
File[] poFiles = poFolder.listFiles(new FileFilter() {
|
File[] poFiles = poFolder.listFiles(new FileFilter() {
|
||||||
@Override
|
@Override
|
||||||
public boolean accept(File arg0) {
|
public boolean accept(File arg0) {
|
||||||
return arg0.isFile() && arg0.getName().endsWith(".po");
|
return arg0.isFile() && arg0.getName().endsWith(".po");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
for (File f : poFiles) {
|
for (File f : poFiles) {
|
||||||
updatePoFile(proj, f);
|
updatePoFile(proj, f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updatePoFile(Project proj, File f) {
|
private void updatePoFile(Project proj, File f) {
|
||||||
POParser parser = new POParser();
|
POParser parser = new POParser();
|
||||||
POFile poFile = parser.parseFile(f);
|
POFile poFile = parser.parseFile(f);
|
||||||
|
|
||||||
Map<String, String> translations = new LinkedHashMap<String, String>();
|
Map<String, String> translations = new LinkedHashMap<String, String>();
|
||||||
|
|
||||||
//Collect existing translations
|
//Collect existing translations
|
||||||
if (poFile.getHeader() != null) {
|
if (poFile.getHeader() != null) {
|
||||||
Vector<String> msgstrs = poFile.getHeader().getStringsByType(POEntry.StringType.HEADER);
|
Vector<String> msgstrs = poFile.getHeader().getStringsByType(POEntry.StringType.HEADER);
|
||||||
String header = "";
|
String header = "";
|
||||||
if (!msgstrs.isEmpty()) {
|
if (!msgstrs.isEmpty()) {
|
||||||
if (msgstrs.size() == 1) {
|
if (msgstrs.size() == 1) {
|
||||||
header = msgstrs.get(0);
|
header = msgstrs.get(0);
|
||||||
} else {
|
} else {
|
||||||
for (String msgstr : msgstrs) {
|
for (String msgstr : msgstrs) {
|
||||||
header += msgstr;
|
header += msgstr;
|
||||||
header += "\n";
|
header += "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
translations.put("", header);
|
translations.put("", header);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (POEntry entry : poFile.getEntryArray()) {
|
for (POEntry entry : poFile.getEntryArray()) {
|
||||||
Vector<String> msgids = entry.getStringsByType(POEntry.StringType.MSGID);
|
Vector<String> msgids = entry.getStringsByType(POEntry.StringType.MSGID);
|
||||||
Vector<String> msgstrs = entry.getStringsByType(POEntry.StringType.MSGSTR);
|
Vector<String> msgstrs = entry.getStringsByType(POEntry.StringType.MSGSTR);
|
||||||
if (msgids == null || msgids.size() == 0) continue;
|
if (msgids == null || msgids.size() == 0) continue;
|
||||||
String msgid = msgids.get(0);
|
String msgid = msgids.get(0);
|
||||||
if (msgids.size() > 1) {
|
if (msgids.size() > 1) {
|
||||||
for (int i = 1; i < msgids.size(); i++) {
|
for (int i = 1; i < msgids.size(); i++) {
|
||||||
msgid += msgids.get(i);
|
msgid += msgids.get(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (msgid.contains("\\n")) {
|
if (msgid.contains("\\n")) {
|
||||||
msgid = msgid.replaceAll("\\\\n", "\\\\n\"\n\"");
|
msgid = msgid.replaceAll("\\\\n", "\\\\n\"\n\"");
|
||||||
msgid = "\"\n\""+msgid;
|
msgid = "\"\n\"" + msgid;
|
||||||
}
|
}
|
||||||
String translation = "";
|
String translation = "";
|
||||||
if (!msgstrs.isEmpty()) {
|
if (!msgstrs.isEmpty()) {
|
||||||
if (msgstrs.size() == 1) {
|
if (msgstrs.size() == 1) {
|
||||||
translation = msgstrs.get(0);
|
translation = msgstrs.get(0);
|
||||||
} else {
|
} else {
|
||||||
for (String msgstr : msgstrs) {
|
for (String msgstr : msgstrs) {
|
||||||
translation += msgstr;
|
translation += msgstr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (translation.contains("\\n")) {
|
if (translation.contains("\\n")) {
|
||||||
translation = translation.replaceAll("\\\\n", "\\\\n\"\n\"");
|
translation = translation.replaceAll("\\\\n", "\\\\n\"\n\"");
|
||||||
translation = "\"\n\""+translation;
|
translation = "\"\n\"" + translation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
translations.put(msgid, translation);
|
translations.put(msgid, translation);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Patch data
|
//Patch data
|
||||||
for (String oldId : msgIdToReplace.keySet()) {
|
for (String oldId : msgIdToReplace.keySet()) {
|
||||||
String newId = msgIdToReplace.get(oldId);
|
String newId = msgIdToReplace.get(oldId);
|
||||||
if (translations.containsKey(oldId)) {
|
if (translations.containsKey(oldId)) {
|
||||||
String trans = translations.get(oldId);
|
String trans = translations.get(oldId);
|
||||||
translations.remove(oldId);
|
translations.remove(oldId);
|
||||||
translations.put(newId, trans);
|
translations.put(newId, trans);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (String msgid : msgIdToReview) {
|
for (String msgid : msgIdToReview) {
|
||||||
if (translations.containsKey(msgid)) {
|
if (translations.containsKey(msgid)) {
|
||||||
String trans = translations.get(msgid);
|
String trans = translations.get(msgid);
|
||||||
if (trans != null && trans.length() >= 1) translations.put(msgid, "[REVIEW]"+trans);
|
if (trans != null && trans.length() >= 1) translations.put(msgid, "[REVIEW]" + trans);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (String msgid : msgIdOutdated) {
|
for (String msgid : msgIdOutdated) {
|
||||||
if (translations.containsKey(msgid)) {
|
if (translations.containsKey(msgid)) {
|
||||||
String trans = translations.get(msgid);
|
String trans = translations.get(msgid);
|
||||||
if (trans != null && trans.length() >= 1) translations.put(msgid, "[OUTDATED]"+trans);
|
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()));
|
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;
|
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.io.File;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
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 class PotGenerator {
|
||||||
|
|
||||||
public static void generatePotFileForProject(Project proj) {
|
public static void generatePotFileForProject(Project proj) {
|
||||||
Map<String, List<String>> stringsResources = new LinkedHashMap<String, List<String>>();
|
Map<String, List<String>> stringsResources = new LinkedHashMap<String, List<String>>();
|
||||||
Map<String, String> resourcesStrings = new LinkedHashMap<String, String>();
|
Map<String, String> resourcesStrings = new LinkedHashMap<String, String>();
|
||||||
|
|
||||||
GameSource gsrc = proj.baseContent;
|
GameSource gsrc = proj.baseContent;
|
||||||
|
|
||||||
for (ActorCondition ac : gsrc.gameData.actorConditions) {
|
for (ActorCondition ac : gsrc.gameData.actorConditions.toList()) {
|
||||||
pushString(stringsResources, resourcesStrings, ac.display_name, getPotContextComment(ac));
|
pushString(stringsResources, resourcesStrings, ac.display_name, getPotContextComment(ac));
|
||||||
}
|
pushString(stringsResources, resourcesStrings, ac.description, getPotContextComment(ac) + ":description");
|
||||||
|
}
|
||||||
|
|
||||||
for (Dialogue d : gsrc.gameData.dialogues ) {
|
for (Dialogue d : gsrc.gameData.dialogues.toList()) {
|
||||||
pushString(stringsResources, resourcesStrings, d.message, getPotContextComment(d));
|
pushString(stringsResources, resourcesStrings, d.message, getPotContextComment(d));
|
||||||
if (d.replies == null) continue;
|
if (d.replies == null) continue;
|
||||||
for (Dialogue.Reply r : d.replies) {
|
for (Dialogue.Reply r : d.replies) {
|
||||||
if (r.text != null && !r.text.equals(Dialogue.Reply.GO_NEXT_TEXT) ) {
|
if (r.text != null && !r.text.equals(Dialogue.Reply.GO_NEXT_TEXT)) {
|
||||||
pushString(stringsResources, resourcesStrings, r.text, getPotContextComment(d)+":"+d.replies.indexOf(r));
|
pushString(stringsResources, resourcesStrings, r.text, getPotContextComment(d) + ":" + d.replies.indexOf(r));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ItemCategory ic : gsrc.gameData.itemCategories) {
|
for (ItemCategory ic : gsrc.gameData.itemCategories.toList()) {
|
||||||
pushString(stringsResources, resourcesStrings, ic.name, getPotContextComment(ic));
|
pushString(stringsResources, resourcesStrings, ic.name, getPotContextComment(ic));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Item i : gsrc.gameData.items) {
|
for (Item i : gsrc.gameData.items.toList()) {
|
||||||
pushString(stringsResources, resourcesStrings, i.name, getPotContextComment(i));
|
pushString(stringsResources, resourcesStrings, i.name, getPotContextComment(i));
|
||||||
pushString(stringsResources, resourcesStrings, i.description, getPotContextComment(i)+":description");
|
pushString(stringsResources, resourcesStrings, i.description, getPotContextComment(i) + ":description");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (NPC npc : gsrc.gameData.npcs ) {
|
for (NPC npc : gsrc.gameData.npcs.toList()) {
|
||||||
pushString(stringsResources, resourcesStrings, npc.name, getPotContextComment(npc));
|
pushString(stringsResources, resourcesStrings, npc.name, getPotContextComment(npc));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Quest q : gsrc.gameData.quests) {
|
for (Quest q : gsrc.gameData.quests.toList()) {
|
||||||
if (q.visible_in_log != null && q.visible_in_log != 0) {
|
if (q.visible_in_log != null && q.visible_in_log != 0) {
|
||||||
pushString(stringsResources, resourcesStrings, q.name, getPotContextComment(q));
|
pushString(stringsResources, resourcesStrings, q.name, getPotContextComment(q));
|
||||||
for (QuestStage qs : q.stages) {
|
for (QuestStage qs : q.stages) {
|
||||||
pushString(stringsResources, resourcesStrings, qs.log_text, getPotContextComment(q)+":"+Integer.toString(qs.progress));
|
pushString(stringsResources, resourcesStrings, qs.log_text, getPotContextComment(q) + ":" + Integer.toString(qs.progress));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (WorldmapSegment ws : gsrc.worldmap) {
|
for (WorldmapSegment ws : gsrc.worldmap) {
|
||||||
for (WorldmapSegment.NamedArea area : ws.labels.values()) {
|
for (WorldmapSegment.NamedArea area : ws.labels.values()) {
|
||||||
pushString(stringsResources, resourcesStrings, area.name, gsrc.worldmap.worldmapFile.getName()+":"+ws.id+":"+area.id);
|
pushString(stringsResources, resourcesStrings, area.name, gsrc.worldmap.worldmapFile.getName() + ":" + ws.id + ":" + area.id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
File f = new File(proj.alteredContent.baseFolder, "english.pot");
|
File f = new File(proj.alteredContent.baseFolder, "english.pot");
|
||||||
PoPotWriter.writePotFile(stringsResources, f);
|
PoPotWriter.writePotFile(stringsResources, f);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void pushString (Map<String, List<String>> stringsResources, Map<String, String> resourcesStrings, String translatableString, String resourceIdentifier) {
|
private static void pushString(Map<String, List<String>> stringsResources, Map<String, String> resourcesStrings, String translatableString, String resourceIdentifier) {
|
||||||
if (translatableString == null) return;
|
if (translatableString == null) return;
|
||||||
if (translatableString.length() == 0) return;
|
if (translatableString.length() == 0) return;
|
||||||
if (translatableString.contains("\"")) {
|
if (translatableString.contains("\"")) {
|
||||||
translatableString = translatableString.replaceAll("\"", "\\\\\"");
|
translatableString = translatableString.replaceAll("\"", "\\\\\"");
|
||||||
}
|
}
|
||||||
if (translatableString.contains("\n")) {
|
if (translatableString.contains("\n")) {
|
||||||
translatableString = translatableString.replaceAll("\n", "\\\\n\"\n\"");
|
translatableString = translatableString.replaceAll("\n", "\\\\n\"\n\"");
|
||||||
translatableString = "\"\n\""+translatableString;
|
translatableString = "\"\n\"" + translatableString;
|
||||||
}
|
}
|
||||||
resourcesStrings.put(resourceIdentifier, translatableString);
|
resourcesStrings.put(resourceIdentifier, translatableString);
|
||||||
List<String> resourceIdentifiers = stringsResources.get(translatableString);
|
List<String> resourceIdentifiers = stringsResources.get(translatableString);
|
||||||
if (resourceIdentifiers == null) {
|
if (resourceIdentifiers == null) {
|
||||||
resourceIdentifiers = new LinkedList<String>();
|
resourceIdentifiers = new LinkedList<String>();
|
||||||
stringsResources.put(translatableString, resourceIdentifiers);
|
stringsResources.put(translatableString, resourceIdentifiers);
|
||||||
}
|
}
|
||||||
resourceIdentifiers.add(resourceIdentifier);
|
resourceIdentifiers.add(resourceIdentifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getPotContextComment(JSONElement e) {
|
private static String getPotContextComment(JSONElement e) {
|
||||||
return e.jsonFile.getName()+":"+e.id;
|
return e.jsonFile.getName() + ":" + e.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,35 +1,9 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.model.tools.resoptimizer;
|
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.io.JsonPrettyWriter;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
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.Project;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.ActorCondition;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.*;
|
||||||
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.maps.TMXMap;
|
import com.gpl.rpg.atcontentstudio.model.maps.TMXMap;
|
||||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
|
import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
|
||||||
import com.gpl.rpg.atcontentstudio.model.sprites.SpriteSheetSet;
|
import com.gpl.rpg.atcontentstudio.model.sprites.SpriteSheetSet;
|
||||||
@@ -38,343 +12,349 @@ import com.whoischarles.util.json.Minify;
|
|||||||
import com.whoischarles.util.json.Minify.UnterminatedCommentException;
|
import com.whoischarles.util.json.Minify.UnterminatedCommentException;
|
||||||
import com.whoischarles.util.json.Minify.UnterminatedRegExpLiteralException;
|
import com.whoischarles.util.json.Minify.UnterminatedRegExpLiteralException;
|
||||||
import com.whoischarles.util.json.Minify.UnterminatedStringLiteralException;
|
import com.whoischarles.util.json.Minify.UnterminatedStringLiteralException;
|
||||||
|
import org.json.simple.JSONArray;
|
||||||
import tiled.core.TileSet;
|
import tiled.core.TileSet;
|
||||||
import tiled.io.TMXMapWriter;
|
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
|
* @author Kevin
|
||||||
*
|
* <p>
|
||||||
* To use this, paste the following script in the beanshell console of ATCS.
|
* 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.
|
* Don't forget to change the project number to suit your needs.
|
||||||
|
* <p>
|
||||||
|
* <code>
|
||||||
|
* import com.gpl.rpg.atcontentstudio.model.tools.resoptimizer.ResourcesCompactor;
|
||||||
|
* import com.gpl.rpg.atcontentstudio.model.Workspace;
|
||||||
*
|
*
|
||||||
import com.gpl.rpg.atcontentstudio.model.tools.resoptimizer.ResourcesCompactor;
|
* proj = Workspace.activeWorkspace.projects.get(0);
|
||||||
import com.gpl.rpg.atcontentstudio.model.Workspace;
|
* new ResourcesCompactor(proj).compactData();
|
||||||
|
* </code>
|
||||||
proj = Workspace.activeWorkspace.projects.get(0);
|
|
||||||
new ResourcesCompactor(proj).compactData();
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ResourcesCompactor {
|
public class ResourcesCompactor {
|
||||||
|
|
||||||
public static String DEFAULT_REL_PATH_IN_PROJECT = "compressed"+File.separator;
|
public static String DEFAULT_REL_PATH_IN_PROJECT = "compressed" + File.separator;
|
||||||
|
|
||||||
private Project proj;
|
private Project proj;
|
||||||
private File baseFolder;
|
private File baseFolder;
|
||||||
private List<CompressedSpritesheet> compressedSpritesheets = new LinkedList<CompressedSpritesheet>();
|
private List<CompressedSpritesheet> compressedSpritesheets = new LinkedList<CompressedSpritesheet>();
|
||||||
private List<File> preservedSpritesheets = new LinkedList<File>();
|
private List<File> preservedSpritesheets = new LinkedList<File>();
|
||||||
|
|
||||||
private Map<SpritesheetId, SpritesheetId> spritesRelocationForObjects = new LinkedHashMap<SpritesheetId, SpritesheetId>();
|
private Map<SpritesheetId, SpritesheetId> spritesRelocationForObjects = new LinkedHashMap<SpritesheetId, SpritesheetId>();
|
||||||
private Integer currentSpritesheetIndexForObjects = 0;
|
private Integer currentSpritesheetIndexForObjects = 0;
|
||||||
private CompressedSpritesheet currentSpritesheetForObjects = null;
|
private CompressedSpritesheet currentSpritesheetForObjects = null;
|
||||||
|
|
||||||
private Map<SpritesheetId, SpritesheetId> spritesRelocationForMaps = new LinkedHashMap<SpritesheetId, SpritesheetId>();
|
private Map<SpritesheetId, SpritesheetId> spritesRelocationForMaps = new LinkedHashMap<SpritesheetId, SpritesheetId>();
|
||||||
private Map<SpritesheetId, CompressedSpritesheet> spritesheetsBySidForMaps = new LinkedHashMap<SpritesheetId, CompressedSpritesheet>();
|
private Map<SpritesheetId, CompressedSpritesheet> spritesheetsBySidForMaps = new LinkedHashMap<SpritesheetId, CompressedSpritesheet>();
|
||||||
private Integer currentSpritesheetIndexForMaps = 0;
|
private Integer currentSpritesheetIndexForMaps = 0;
|
||||||
private CompressedSpritesheet currentSpritesheetForMaps = null;
|
private CompressedSpritesheet currentSpritesheetForMaps = null;
|
||||||
|
|
||||||
public ResourcesCompactor(Project proj) {
|
public ResourcesCompactor(Project proj) {
|
||||||
this.proj = proj;
|
this.proj = proj;
|
||||||
this.baseFolder = new File(proj.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
this.baseFolder = new File(proj.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||||
if (!baseFolder.exists()) baseFolder.mkdirs();
|
if (!baseFolder.exists()) baseFolder.mkdirs();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void compactData() {
|
public void compactData() {
|
||||||
compactJsonData();
|
compactJsonData();
|
||||||
for(CompressedSpritesheet cs : compressedSpritesheets) {
|
for (CompressedSpritesheet cs : compressedSpritesheets) {
|
||||||
cs.drawFile();
|
cs.drawFile();
|
||||||
}
|
}
|
||||||
for (File preserved : preservedSpritesheets) {
|
for (File preserved : preservedSpritesheets) {
|
||||||
FileUtils.copyFile(preserved, new File(baseFolder.getAbsolutePath()+File.separator+DEFAULT_DRAWABLE_REL_PATH+File.separator+preserved.getName()));
|
FileUtils.copyFile(preserved, new File(baseFolder.getAbsolutePath() + File.separator + DEFAULT_DRAWABLE_REL_PATH + File.separator + preserved.getName()));
|
||||||
}
|
}
|
||||||
compactMaps();
|
compactMaps();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void compactJsonData() {
|
public void compactJsonData() {
|
||||||
final List<File> filesCovered = new LinkedList<File>();
|
final List<File> filesCovered = new LinkedList<File>();
|
||||||
|
|
||||||
File folder = new File(baseFolder.getAbsolutePath()+File.separator+GameDataSet.DEFAULT_REL_PATH_IN_SOURCE);
|
File folder = new File(baseFolder.getAbsolutePath() + File.separator + GameDataSet.DEFAULT_REL_PATH_IN_SOURCE);
|
||||||
if (!folder.exists()) folder.mkdirs();
|
if (!folder.exists()) folder.mkdirs();
|
||||||
|
|
||||||
for (ActorCondition ac : proj.baseContent.gameData.actorConditions) {
|
ArrayList<ActorCondition> actorConditions = proj.baseContent.gameData.actorConditions.toList();
|
||||||
if (filesCovered.contains(ac.jsonFile)) continue;
|
for (ActorCondition ac : actorConditions) {
|
||||||
File currentFile = ac.jsonFile;
|
if (filesCovered.contains(ac.jsonFile)) continue;
|
||||||
filesCovered.add(currentFile);
|
File currentFile = ac.jsonFile;
|
||||||
List<Map> dataToSave = new ArrayList<Map>();
|
filesCovered.add(currentFile);
|
||||||
for (ActorCondition acond : proj.baseContent.gameData.actorConditions) {
|
List<Map> dataToSave = new ArrayList<Map>();
|
||||||
if (!acond.jsonFile.equals(currentFile)) continue;
|
for (ActorCondition acond : actorConditions) {
|
||||||
Map json = acond.toJson();
|
if (!acond.jsonFile.equals(currentFile)) continue;
|
||||||
json.put("iconID", convertObjectSprite(acond.icon_id).toStringID());
|
Map json = acond.toJson();
|
||||||
dataToSave.add(json);
|
json.put("iconID", convertObjectSprite(acond.icon_id).toStringID());
|
||||||
}
|
dataToSave.add(json);
|
||||||
File target = new File(folder, ac.jsonFile.getName());
|
}
|
||||||
writeJson(dataToSave, target);
|
File target = new File(folder, ac.jsonFile.getName());
|
||||||
}
|
writeJson(dataToSave, target);
|
||||||
|
}
|
||||||
|
|
||||||
for (Item it : proj.baseContent.gameData.items) {
|
ArrayList<Item> items = proj.baseContent.gameData.items.toList();
|
||||||
if (filesCovered.contains(it.jsonFile)) continue;
|
for (Item it : items) {
|
||||||
File currentFile = it.jsonFile;
|
if (filesCovered.contains(it.jsonFile)) continue;
|
||||||
filesCovered.add(currentFile);
|
File currentFile = it.jsonFile;
|
||||||
List<Map> dataToSave = new ArrayList<Map>();
|
filesCovered.add(currentFile);
|
||||||
for (Item item : proj.baseContent.gameData.items) {
|
List<Map> dataToSave = new ArrayList<Map>();
|
||||||
if (!item.jsonFile.equals(currentFile)) continue;
|
for (Item item : items) {
|
||||||
Map json = item.toJson();
|
if (!item.jsonFile.equals(currentFile)) continue;
|
||||||
json.put("iconID", convertObjectSprite(item.icon_id).toStringID());
|
Map json = item.toJson();
|
||||||
dataToSave.add(json);
|
json.put("iconID", convertObjectSprite(item.icon_id).toStringID());
|
||||||
}
|
dataToSave.add(json);
|
||||||
File target = new File(folder, it.jsonFile.getName());
|
}
|
||||||
writeJson(dataToSave, target);
|
File target = new File(folder, it.jsonFile.getName());
|
||||||
}
|
writeJson(dataToSave, target);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
for (NPC np : proj.baseContent.gameData.npcs) {
|
ArrayList<NPC> npcs = proj.baseContent.gameData.npcs.toList();
|
||||||
if (filesCovered.contains(np.jsonFile)) continue;
|
for (NPC np : npcs) {
|
||||||
File currentFile = np.jsonFile;
|
if (filesCovered.contains(np.jsonFile)) continue;
|
||||||
filesCovered.add(currentFile);
|
File currentFile = np.jsonFile;
|
||||||
List<Map> dataToSave = new ArrayList<Map>();
|
filesCovered.add(currentFile);
|
||||||
for (NPC npc : proj.baseContent.gameData.npcs) {
|
List<Map> dataToSave = new ArrayList<Map>();
|
||||||
if (!npc.jsonFile.equals(currentFile)) continue;
|
for (NPC npc : npcs) {
|
||||||
Map json = npc.toJson();
|
if (!npc.jsonFile.equals(currentFile)) continue;
|
||||||
if (proj.getImage(npc.icon_id).getWidth(null) == TILE_WIDTH_IN_PIXELS || proj.getImage(npc.icon_id).getHeight(null) == TILE_HEIGHT_IN_PIXELS) {
|
Map json = npc.toJson();
|
||||||
json.put("iconID", convertObjectSprite(npc.icon_id).toStringID());
|
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);
|
}
|
||||||
}
|
dataToSave.add(json);
|
||||||
File target = new File(folder, np.jsonFile.getName());
|
}
|
||||||
writeJson(dataToSave, target);
|
File target = new File(folder, np.jsonFile.getName());
|
||||||
}
|
writeJson(dataToSave, target);
|
||||||
|
}
|
||||||
|
|
||||||
File[] remainingFiles = proj.baseContent.gameData.baseFolder.listFiles(new FileFilter() {
|
File[] remainingFiles = proj.baseContent.gameData.baseFolder.listFiles(new FileFilter() {
|
||||||
@Override
|
@Override
|
||||||
public boolean accept(File arg0) {
|
public boolean accept(File arg0) {
|
||||||
return arg0.getName().endsWith(".json") && !filesCovered.contains(arg0);
|
return arg0.getName().endsWith(".json") && !filesCovered.contains(arg0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
for (File source : remainingFiles) {
|
for (File source : remainingFiles) {
|
||||||
File target = new File(folder, source.getName());
|
File target = new File(folder, source.getName());
|
||||||
minifyJson(source, target);
|
minifyJson(source, target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Minify jsonMinifier = new Minify();
|
private Minify jsonMinifier = new Minify();
|
||||||
|
|
||||||
private void writeJson(List<Map> dataToSave, File target) {
|
private void writeJson(List<Map> dataToSave, File target) {
|
||||||
StringWriter writer = new JsonPrettyWriter();
|
String toWrite = FileUtils.toJsonString(dataToSave);
|
||||||
try {
|
toWrite = jsonMinifier.minify(toWrite);
|
||||||
JSONArray.writeJSONString(dataToSave, writer);
|
FileUtils.writeStringToFile(toWrite, target, null);
|
||||||
} catch (IOException e) {
|
try {
|
||||||
//Impossible with a StringWriter
|
FileWriter w = new FileWriter(target);
|
||||||
}
|
w.write(toWrite);
|
||||||
String toWrite = writer.toString();
|
w.close();
|
||||||
try {
|
} catch (IOException e) {
|
||||||
FileWriter w = new FileWriter(target);
|
e.printStackTrace();
|
||||||
w.write(jsonMinifier.minify(toWrite));
|
}
|
||||||
w.close();
|
}
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void minifyJson(File source, File target) {
|
private void minifyJson(File source, File target) {
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
try {
|
try {
|
||||||
FileInputStream fis = new FileInputStream(source);
|
FileInputStream fis = new FileInputStream(source);
|
||||||
jsonMinifier.minify(fis, baos);
|
jsonMinifier.minify(fis, baos);
|
||||||
FileWriter w = new FileWriter(target);
|
FileWriter w = new FileWriter(target);
|
||||||
w.write(baos.toString());
|
w.write(baos.toString());
|
||||||
w.close();
|
w.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (UnterminatedRegExpLiteralException e) {
|
} catch (UnterminatedRegExpLiteralException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (UnterminatedCommentException e) {
|
} catch (UnterminatedCommentException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (UnterminatedStringLiteralException e) {
|
} catch (UnterminatedStringLiteralException e) {
|
||||||
e.printStackTrace();
|
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) {
|
private void compactMaps() {
|
||||||
File target = new File(baseFolder.getAbsolutePath()+File.separator+TMXMapSet.DEFAULT_REL_PATH_IN_SOURCE+File.separator+name+".tmx");
|
for (TMXMap map : proj.baseContent.gameMaps.tmxMaps) {
|
||||||
if (!target.getParentFile().exists()) target.getParentFile().mkdirs();
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Map<tiled.core.Tile, SpritesheetId> localConvertions = new LinkedHashMap<tiled.core.Tile, SpritesheetId>();
|
private void compactMap(tiled.core.Map tmx, String name) {
|
||||||
List<CompressedSpritesheet> usedSpritesheets = new LinkedList<CompressedSpritesheet>();
|
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();
|
||||||
|
|
||||||
List<tiled.core.TileSet> toRemove = new LinkedList<TileSet>();
|
Map<tiled.core.Tile, SpritesheetId> localConvertions = new LinkedHashMap<tiled.core.Tile, SpritesheetId>();
|
||||||
|
List<CompressedSpritesheet> usedSpritesheets = new LinkedList<CompressedSpritesheet>();
|
||||||
|
|
||||||
for (tiled.core.TileSet ts : tmx.getTileSets()) {
|
List<tiled.core.TileSet> toRemove = new LinkedList<TileSet>();
|
||||||
if (!ts.getName().equalsIgnoreCase("map_dynamic_placeholders")) {
|
|
||||||
toRemove.add(ts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (tiled.core.TileLayer layer : tmx.getTileLayers()) {
|
for (tiled.core.TileSet ts : tmx.getTileSets()) {
|
||||||
for (int x = 0; x < layer.getWidth(); x++) {
|
if (!ts.getName().equalsIgnoreCase("map_dynamic_placeholders")) {
|
||||||
for (int y = 0; y < layer.getHeight(); y++) {
|
toRemove.add(ts);
|
||||||
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 (tiled.core.TileLayer layer : tmx.getTileLayers()) {
|
||||||
for (CompressedSpritesheet cs : usedSpritesheets) {
|
for (int x = 0; x < layer.getWidth(); x++) {
|
||||||
cs.drawFile();
|
for (int y = 0; y < layer.getHeight(); y++) {
|
||||||
tiled.core.TileSet ts = new tiled.core.TileSet();
|
tiled.core.Tile tile = layer.getTileAt(x, y);
|
||||||
csToTs.put(cs, ts);
|
if (tile != null && !tile.getTileSet().getName().equalsIgnoreCase("map_dynamic_placeholders")) {
|
||||||
tiled.util.BasicTileCutter cutter = new tiled.util.BasicTileCutter(TILE_WIDTH_IN_PIXELS, TILE_HEIGHT_IN_PIXELS, 0, 0);
|
SpritesheetId sid = convertMapSprite(SpritesheetId.toStringID(tile.getTileSet().getName(), tile.getId()));
|
||||||
try {
|
localConvertions.put(tile, sid);
|
||||||
ts.importTileBitmap(cs.f.getAbsolutePath(), cutter);
|
if (!usedSpritesheets.contains(spritesheetsBySidForMaps.get(sid))) {
|
||||||
} catch (IOException e) {
|
usedSpritesheets.add(spritesheetsBySidForMaps.get(sid));
|
||||||
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()) {
|
Map<CompressedSpritesheet, tiled.core.TileSet> csToTs = new LinkedHashMap<CompressedSpritesheet, tiled.core.TileSet>();
|
||||||
for (tiled.core.Tile tile : localConvertions.keySet()) {
|
for (CompressedSpritesheet cs : usedSpritesheets) {
|
||||||
SpritesheetId sid = localConvertions.get(tile);
|
cs.drawFile();
|
||||||
layer.replaceTile(tile, csToTs.get(spritesheetsBySidForMaps.get(sid)).getTile(sid.offset));
|
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.TileSet ts : toRemove) {
|
for (tiled.core.TileLayer layer : tmx.getTileLayers()) {
|
||||||
tmx.removeTileset(ts);
|
for (tiled.core.Tile tile : localConvertions.keySet()) {
|
||||||
}
|
SpritesheetId sid = localConvertions.get(tile);
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
layer.replaceTile(tile, csToTs.get(spritesheetsBySidForMaps.get(sid)).getTile(sid.offset));
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
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) {
|
private SpritesheetId convertObjectSprite(String originalSpriteId) {
|
||||||
if (spritesRelocationForMaps.containsKey(SpritesheetId.getInstance(originalSpriteId))) {
|
if (spritesRelocationForObjects.containsKey(SpritesheetId.getInstance(originalSpriteId))) {
|
||||||
return spritesRelocationForMaps.get(SpritesheetId.getInstance(originalSpriteId));
|
return spritesRelocationForObjects.get(SpritesheetId.getInstance(originalSpriteId));
|
||||||
} else if (currentSpritesheetForMaps == null || !currentSpritesheetForMaps.hasFreeSlot()) {
|
} else if (currentSpritesheetForObjects == null || !currentSpritesheetForObjects.hasFreeSlot()) {
|
||||||
currentSpritesheetForMaps = new CompressedSpritesheet(TILESHEET_PREFIX_FOR_MAPS, currentSpritesheetIndexForMaps);
|
currentSpritesheetForObjects = new CompressedSpritesheet(TILESHEET_PREFIX_FOR_OBJECTS, currentSpritesheetIndexForObjects);
|
||||||
compressedSpritesheets.add(currentSpritesheetForMaps);
|
compressedSpritesheets.add(currentSpritesheetForObjects);
|
||||||
currentSpritesheetIndexForMaps++;
|
currentSpritesheetIndexForObjects++;
|
||||||
}
|
}
|
||||||
SpritesheetId sid = currentSpritesheetForMaps.addSprite(originalSpriteId);
|
SpritesheetId sid = currentSpritesheetForObjects.addSprite(originalSpriteId);
|
||||||
spritesRelocationForMaps.put(SpritesheetId.getInstance(originalSpriteId), sid);
|
spritesRelocationForObjects.put(SpritesheetId.getInstance(originalSpriteId), sid);
|
||||||
spritesheetsBySidForMaps.put(sid, currentSpritesheetForMaps);
|
return 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_WIDTH_IN_SPRITES = 8;
|
||||||
private static final int TILESHEET_HEIGHT_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_WIDTH_IN_PIXELS = 32;
|
||||||
private static final int TILE_HEIGHT_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_OBJECTS = "obj_";
|
||||||
private static final String TILESHEET_PREFIX_FOR_MAPS = "map_";
|
private static final String TILESHEET_PREFIX_FOR_MAPS = "map_";
|
||||||
private static final String TILESHEET_SUFFIX = ".png";
|
private static final String TILESHEET_SUFFIX = ".png";
|
||||||
|
|
||||||
private static final String DEFAULT_DRAWABLE_REL_PATH = SpriteSheetSet.DEFAULT_REL_PATH_IN_SOURCE;
|
private static final String DEFAULT_DRAWABLE_REL_PATH = SpriteSheetSet.DEFAULT_REL_PATH_IN_SOURCE;
|
||||||
|
|
||||||
private class CompressedSpritesheet {
|
private class CompressedSpritesheet {
|
||||||
String prefix;
|
String prefix;
|
||||||
int index;
|
int index;
|
||||||
File f;
|
File f;
|
||||||
|
|
||||||
|
|
||||||
boolean mustDraw = true;
|
boolean mustDraw = true;
|
||||||
int nextFreeSlot = 0;
|
int nextFreeSlot = 0;
|
||||||
String[] originalSpritesId = new String[TILESHEET_WIDTH_IN_SPRITES * TILESHEET_HEIGHT_IN_SPRITES];
|
String[] originalSpritesId = new String[TILESHEET_WIDTH_IN_SPRITES * TILESHEET_HEIGHT_IN_SPRITES];
|
||||||
|
|
||||||
public CompressedSpritesheet(String prefix, int index) {
|
public CompressedSpritesheet(String prefix, int index) {
|
||||||
this.prefix = prefix;
|
this.prefix = prefix;
|
||||||
this.index = index;
|
this.index = index;
|
||||||
|
|
||||||
File folder = new File(ResourcesCompactor.this.baseFolder.getAbsolutePath()+File.separator+DEFAULT_DRAWABLE_REL_PATH);
|
File folder = new File(ResourcesCompactor.this.baseFolder.getAbsolutePath() + File.separator + DEFAULT_DRAWABLE_REL_PATH);
|
||||||
if (!folder.exists()) folder.mkdirs();
|
if (!folder.exists()) folder.mkdirs();
|
||||||
this.f = new File(folder, prefix+Integer.toString(index)+TILESHEET_SUFFIX);
|
this.f = new File(folder, prefix + Integer.toString(index) + TILESHEET_SUFFIX);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasFreeSlot() {
|
public boolean hasFreeSlot() {
|
||||||
return nextFreeSlot < TILESHEET_WIDTH_IN_SPRITES * TILESHEET_HEIGHT_IN_SPRITES;
|
return nextFreeSlot < TILESHEET_WIDTH_IN_SPRITES * TILESHEET_HEIGHT_IN_SPRITES;
|
||||||
}
|
}
|
||||||
|
|
||||||
public SpritesheetId addSprite(String spriteId) {
|
public SpritesheetId addSprite(String spriteId) {
|
||||||
mustDraw = true;
|
mustDraw = true;
|
||||||
originalSpritesId[nextFreeSlot] = spriteId;
|
originalSpritesId[nextFreeSlot] = spriteId;
|
||||||
nextFreeSlot++;
|
nextFreeSlot++;
|
||||||
return SpritesheetId.getInstance(prefix+Integer.toString(index), nextFreeSlot - 1);
|
return SpritesheetId.getInstance(prefix + Integer.toString(index), nextFreeSlot - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void drawFile() {
|
public void drawFile() {
|
||||||
if (!mustDraw) return;
|
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);
|
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();
|
Graphics2D g = (Graphics2D) img.getGraphics();
|
||||||
Color transparent = new Color(0, 0, 0, 0);
|
Color transparent = new Color(0, 0, 0, 0);
|
||||||
g.setColor(transparent);
|
g.setColor(transparent);
|
||||||
g.fillRect(0, 0, img.getWidth(), img.getHeight());
|
g.fillRect(0, 0, img.getWidth(), img.getHeight());
|
||||||
for (int i = 0; i < nextFreeSlot; i++) {
|
for (int i = 0; i < nextFreeSlot; i++) {
|
||||||
g.drawImage(
|
g.drawImage(
|
||||||
proj.getImage(originalSpritesId[i]),
|
proj.getImage(originalSpritesId[i]),
|
||||||
(i % TILESHEET_WIDTH_IN_SPRITES) * TILE_WIDTH_IN_PIXELS,
|
(i % TILESHEET_WIDTH_IN_SPRITES) * TILE_WIDTH_IN_PIXELS,
|
||||||
(i / TILESHEET_WIDTH_IN_SPRITES) * TILE_HEIGHT_IN_PIXELS,
|
(i / TILESHEET_WIDTH_IN_SPRITES) * TILE_HEIGHT_IN_PIXELS,
|
||||||
TILE_WIDTH_IN_PIXELS,
|
TILE_WIDTH_IN_PIXELS,
|
||||||
TILE_HEIGHT_IN_PIXELS,
|
TILE_HEIGHT_IN_PIXELS,
|
||||||
null);
|
null);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
ImageIO.write(img, "png", f);
|
ImageIO.write(img, "png", f);
|
||||||
mustDraw = false;
|
mustDraw = false;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,35 +4,35 @@ import java.util.LinkedHashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class SpritesheetId {
|
public class SpritesheetId {
|
||||||
static Map<String, SpritesheetId> instancesCache = new LinkedHashMap<String, SpritesheetId>();
|
static Map<String, SpritesheetId> instancesCache = new LinkedHashMap<String, SpritesheetId>();
|
||||||
|
|
||||||
String tileset;
|
String tileset;
|
||||||
int offset;
|
int offset;
|
||||||
|
|
||||||
static SpritesheetId getInstance(String id) {
|
static SpritesheetId getInstance(String id) {
|
||||||
String[] values = id.split(":");
|
String[] values = id.split(":");
|
||||||
return getInstance(values[0], Integer.parseInt(values[1]));
|
return getInstance(values[0], Integer.parseInt(values[1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
static SpritesheetId getInstance(String tilesetId, int offset) {
|
static SpritesheetId getInstance(String tilesetId, int offset) {
|
||||||
if (!instancesCache.containsKey(toStringID(tilesetId, offset))) {
|
if (!instancesCache.containsKey(toStringID(tilesetId, offset))) {
|
||||||
SpritesheetId instance = new SpritesheetId(tilesetId, offset);
|
SpritesheetId instance = new SpritesheetId(tilesetId, offset);
|
||||||
instancesCache.put(instance.toStringID(), instance);
|
instancesCache.put(instance.toStringID(), instance);
|
||||||
}
|
}
|
||||||
return instancesCache.get(toStringID(tilesetId, offset));
|
return instancesCache.get(toStringID(tilesetId, offset));
|
||||||
}
|
}
|
||||||
|
|
||||||
private SpritesheetId(String tileset, int offset) {
|
private SpritesheetId(String tileset, int offset) {
|
||||||
this.tileset = tileset;
|
this.tileset = tileset;
|
||||||
this.offset = offset;
|
this.offset = offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toStringID() {
|
public String toStringID() {
|
||||||
return toStringID(tileset, offset);
|
return toStringID(tileset, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static String toStringID(String tileset, int offset) {
|
static String toStringID(String tileset, int offset) {
|
||||||
return tileset+":"+Integer.toString(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;
|
package com.gpl.rpg.atcontentstudio.model.tools.writermode;
|
||||||
|
|
||||||
import java.awt.Image;
|
import com.gpl.rpg.atcontentstudio.Notification;
|
||||||
import java.io.File;
|
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
||||||
import java.io.FileNotFoundException;
|
import com.gpl.rpg.atcontentstudio.model.*;
|
||||||
import java.io.FileReader;
|
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||||
import java.io.FileWriter;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||||
import java.io.IOException;
|
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||||
import java.io.Serializable;
|
import com.gpl.rpg.atcontentstudio.utils.FileUtils;
|
||||||
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 org.json.simple.JSONArray;
|
import org.json.simple.JSONArray;
|
||||||
import org.json.simple.parser.JSONParser;
|
import org.json.simple.parser.JSONParser;
|
||||||
import org.json.simple.parser.ParseException;
|
import org.json.simple.parser.ParseException;
|
||||||
|
|
||||||
import com.gpl.rpg.atcontentstudio.Notification;
|
import javax.swing.tree.TreeNode;
|
||||||
import com.gpl.rpg.atcontentstudio.io.JsonPrettyWriter;
|
import java.awt.*;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import java.io.*;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource;
|
import java.util.List;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
import java.util.*;
|
||||||
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 WriterModeDataSet implements ProjectTreeNode, Serializable {
|
public class WriterModeDataSet implements ProjectTreeNode, Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 5434504851883441971L;
|
private static final long serialVersionUID = 5434504851883441971L;
|
||||||
public static final String DEFAULT_REL_PATH_IN_PROJECT = "writer.json";
|
public static final String DEFAULT_REL_PATH_IN_PROJECT = "writer.json";
|
||||||
|
|
||||||
|
|
||||||
public GameSource parent;
|
public GameSource parent;
|
||||||
public File writerFile;
|
public File writerFile;
|
||||||
|
|
||||||
public List<WriterModeData> writerModeDataList = new ArrayList<WriterModeData>();
|
public List<WriterModeData> writerModeDataList = new ArrayList<WriterModeData>();
|
||||||
|
|
||||||
public WriterModeDataSet(GameSource gameSource) {
|
public WriterModeDataSet(GameSource gameSource) {
|
||||||
this.parent = gameSource;
|
this.parent = gameSource;
|
||||||
writerFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
writerFile = new File(parent.baseFolder, DEFAULT_REL_PATH_IN_PROJECT);
|
||||||
parse();
|
parse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getChildAt(int childIndex) {
|
public TreeNode getChildAt(int childIndex) {
|
||||||
return writerModeDataList.get(childIndex);
|
return writerModeDataList.get(childIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getChildCount() {
|
public int getChildCount() {
|
||||||
return writerModeDataList.size();
|
return writerModeDataList.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TreeNode getParent() {
|
public TreeNode getParent() {
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getIndex(TreeNode node) {
|
public int getIndex(TreeNode node) {
|
||||||
return writerModeDataList.indexOf(node);
|
return writerModeDataList.indexOf(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getAllowsChildren() {
|
public boolean getAllowsChildren() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isLeaf() {
|
public boolean isLeaf() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
@Override
|
@Override
|
||||||
public Enumeration children() {
|
public Enumeration children() {
|
||||||
return Collections.enumeration(writerModeDataList);
|
return Collections.enumeration(writerModeDataList);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenAdded(path);
|
parent.childrenAdded(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenChanged(path);
|
parent.childrenChanged(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||||
path.add(0,this);
|
path.add(0, this);
|
||||||
parent.childrenRemoved(path);
|
parent.childrenRemoved(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyCreated() {
|
public void notifyCreated() {
|
||||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
return (needsSaving() ? "*" : "")+"Dialogue sketches";
|
return (needsSaving() ? "*" : "") + "Dialogue sketches";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Project getProject() {
|
public Project getProject() {
|
||||||
return parent.getProject();
|
return parent.getProject();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GameDataSet getDataSet() {
|
public GameDataSet getDataSet() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getIcon() {
|
public Image getIcon() {
|
||||||
return DefaultIcons.getStdClosedIcon();
|
return DefaultIcons.getStdClosedIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getOpenIcon() {
|
public Image getOpenIcon() {
|
||||||
return DefaultIcons.getStdOpenIcon();
|
return DefaultIcons.getStdOpenIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getClosedIcon() {
|
public Image getClosedIcon() {
|
||||||
return DefaultIcons.getStdClosedIcon();
|
return DefaultIcons.getStdClosedIcon();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image getLeafIcon() {
|
public Image getLeafIcon() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type getDataType() {
|
public Type getDataType() {
|
||||||
return parent.getDataType();
|
return parent.getDataType();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
return writerModeDataList.isEmpty();
|
return writerModeDataList.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
@SuppressWarnings("rawtypes")
|
||||||
public void save(File jsonFile) {
|
public void save(File jsonFile) {
|
||||||
List<Map> dataToSave = new ArrayList<Map>();
|
List<Map> dataToSave = new ArrayList<Map>();
|
||||||
for (WriterModeData data : writerModeDataList) {
|
for (WriterModeData data : writerModeDataList) {
|
||||||
if (data.jsonFile.equals(jsonFile)) {
|
if (data.jsonFile.equals(jsonFile)) {
|
||||||
dataToSave.add(data.toJson());
|
dataToSave.add(data.toJson());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (dataToSave.isEmpty() && writerFile.exists()) {
|
if (dataToSave.isEmpty() && writerFile.exists()) {
|
||||||
if (writerFile.delete()) {
|
if (writerFile.delete()) {
|
||||||
Notification.addSuccess("File "+writerFile.getAbsolutePath()+" deleted.");
|
Notification.addSuccess("File " + writerFile.getAbsolutePath() + " deleted.");
|
||||||
} else {
|
} else {
|
||||||
Notification.addError("Error deleting file "+writerFile.getAbsolutePath());
|
Notification.addError("Error deleting file " + writerFile.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
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() {
|
String toWrite = FileUtils.toJsonString(dataToSave);
|
||||||
List<SaveEvent> events = new ArrayList<SaveEvent>();
|
if(FileUtils.writeStringToFile(toWrite, writerFile, "Json file " + writerFile.getAbsolutePath())) {
|
||||||
for (WriterModeData data : writerModeDataList) {
|
for (WriterModeData element : writerModeDataList) {
|
||||||
if (data.needsSaving()) {
|
element.state = GameDataElement.State.saved;
|
||||||
events.add(new SaveEvent(SaveEvent.Type.alsoSave, data));
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return events;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("rawtypes")
|
public List<SaveEvent> attemptSave() {
|
||||||
public void parse() {
|
List<SaveEvent> events = new ArrayList<SaveEvent>();
|
||||||
if (!writerFile.exists()) return;
|
for (WriterModeData data : writerModeDataList) {
|
||||||
JSONParser parser = new JSONParser();
|
if (data.needsSaving()) {
|
||||||
FileReader reader = null;
|
events.add(new SaveEvent(SaveEvent.Type.alsoSave, data));
|
||||||
try {
|
}
|
||||||
reader = new FileReader(writerFile);
|
}
|
||||||
List writerDataListJson = (List) parser.parse(reader);
|
return events;
|
||||||
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) {
|
@SuppressWarnings("rawtypes")
|
||||||
for (WriterModeData sketch : writerModeDataList) {
|
public void parse() {
|
||||||
if (id.equals(sketch.id)){
|
if (!writerFile.exists()) return;
|
||||||
return sketch;
|
JSONParser parser = new JSONParser();
|
||||||
}
|
FileReader reader = null;
|
||||||
}
|
try {
|
||||||
return null;
|
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 get(int index) {
|
public WriterModeData getWriterSketch(String id) {
|
||||||
return writerModeDataList.get(index);
|
for (WriterModeData sketch : writerModeDataList) {
|
||||||
}
|
if (id.equals(sketch.id)) {
|
||||||
|
return sketch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public void add(WriterModeData node) {
|
public WriterModeData get(int index) {
|
||||||
ProjectTreeNode higherEmptyParent = this;
|
return writerModeDataList.get(index);
|
||||||
while (higherEmptyParent != null) {
|
}
|
||||||
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode)higherEmptyParent.getParent()).isEmpty()) higherEmptyParent = (ProjectTreeNode)higherEmptyParent.getParent();
|
|
||||||
else break;
|
public void add(WriterModeData node) {
|
||||||
}
|
ProjectTreeNode higherEmptyParent = this;
|
||||||
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
while (higherEmptyParent != null) {
|
||||||
writerModeDataList.add(node);
|
if (higherEmptyParent.getParent() != null && ((ProjectTreeNode) higherEmptyParent.getParent()).isEmpty())
|
||||||
node.writable = true;
|
higherEmptyParent = (ProjectTreeNode) higherEmptyParent.getParent();
|
||||||
if (node.jsonFile == null) node.jsonFile = this.writerFile;
|
else break;
|
||||||
node.parent = this;
|
}
|
||||||
if (higherEmptyParent != null) higherEmptyParent.notifyCreated();
|
if (higherEmptyParent == this && !this.isEmpty()) higherEmptyParent = null;
|
||||||
else node.notifyCreated();
|
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
|
@Override
|
||||||
public boolean needsSaving() {
|
public boolean needsSaving() {
|
||||||
for (ProjectTreeNode node : writerModeDataList) {
|
for (ProjectTreeNode node : writerModeDataList) {
|
||||||
if (node.needsSaving()) return true;
|
if (node.needsSaving()) return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,180 +1,203 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.ui;
|
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.ATContentStudio;
|
||||||
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
import com.gpl.rpg.atcontentstudio.model.GameDataElement;
|
||||||
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
import com.gpl.rpg.atcontentstudio.model.SaveEvent;
|
||||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||||
import com.jidesoft.swing.JideTabbedPane;
|
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 {
|
public class AboutEditor extends Editor {
|
||||||
|
|
||||||
private static final long serialVersionUID = 6230549148222457139L;
|
private static final long serialVersionUID = 6230549148222457139L;
|
||||||
|
|
||||||
public static final String WELCOME_STRING =
|
public static final String WELCOME_STRING =
|
||||||
"<html><head>" +
|
"<html><head>" +
|
||||||
"<meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html; charset=UTF-8\\\" />" +
|
"<meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html; charset=UTF-8\\\" />" +
|
||||||
"</head><body>" +
|
"</head><body>" +
|
||||||
"<table><tr valign=\"top\">" +
|
"<table><tr valign=\"top\">" +
|
||||||
"<td><img src=\""+ATContentStudio.class.getResource("/com/gpl/rpg/atcontentstudio/img/atcs_border_banner.png")+"\"/></td>" +
|
"<td><img src=\"" + ATContentStudio.class.getResource("/com/gpl/rpg/atcontentstudio/img/atcs_border_banner.png") + "\"/></td>" +
|
||||||
"<td><font size=+1>Welcome to "+ATContentStudio.APP_NAME+" "+ATContentStudio.APP_VERSION+"</font><br/>" +
|
"<td><font size=+1>Welcome to " + ATContentStudio.APP_NAME + " " + ATContentStudio.APP_VERSION + "</font><br/>" +
|
||||||
"<br/>" +
|
"<br/>" +
|
||||||
"This is a content editor for Andor's Trail.<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/>" +
|
"<b>Right click on the left area or use the \"File\" menu to create a project.</b><br/>" +
|
||||||
"<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/>" +
|
"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/>" +
|
"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/>" +
|
"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/>" +
|
"<br/>" +
|
||||||
"For content creation help, make sure to use the following resources:<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/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://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/>" +
|
"<a href=\"https://docs.google.com/document/d/1BwWD1tLgPcmA2bwudrVnOc6f2dkPLFCjWdn7tXlIp5g\">The design outline document on Google Drive/Docs</a><br/>" +
|
||||||
"<br/>" +
|
"<br/>" +
|
||||||
"<font size=+1>Credits:</font><br/>" +
|
"<font size=+1>Credits:</font><br/>" +
|
||||||
"<br/>" +
|
"<br/>" +
|
||||||
"Author: <a href=\"https://andorstrail.com/memberlist.php?mode=viewprofile&u=2875\">Zukero</a><br/>" +
|
"Author: <a href=\"https://andorstrail.com/memberlist.php?mode=viewprofile&u=2875\">Zukero</a><br/>" +
|
||||||
"Licence: <a href=\"http://www.gnu.org/licenses/gpl-3.0.html\">GPL v3</a><br/>" +
|
"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/>" +
|
"Sources are included in this package and on <a href=\"https://github.com/Zukero/ATCS\">GitHub</a>.<br/>" +
|
||||||
"<br/>" +
|
"<br/>" +
|
||||||
"Contributors: <br/>" +
|
"Contributors: <br/>" +
|
||||||
"Quentin Delvallet<br/>" +
|
"Quentin Delvallet<br/>" +
|
||||||
"Žižkin<br/>" +
|
"Žižkin<br/>" +
|
||||||
"Gonk<br/>" +
|
"Gonk<br/>" +
|
||||||
"<br/>" +
|
"<a href=\"https://github.com/OMGeeky\">OMGeeky</a><br/>" +
|
||||||
"This project uses the following libraries:<br/>" +
|
"<br/>" +
|
||||||
"<a href=\"http://code.google.com/p/json-simple/\">JSON.simple</a> by Yidong Fang & Chris Nokleberg.<br/>" +
|
"This project uses the following libraries:<br/>" +
|
||||||
"License: <a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache License 2.0</a><br/>" +
|
"<a href=\"http://code.google.com/p/json-simple/\">JSON.simple</a> by Yidong Fang & Chris Nokleberg.<br/>" +
|
||||||
"<br/>" +
|
"License: <a href=\"http://www.apache.org/licenses/LICENSE-2.0\">Apache License 2.0</a><br/>" +
|
||||||
"<a href=\"http://fifesoft.com/rsyntaxtextarea/\">RSyntaxTextArea</a> by Robert Futrell.<br/>" +
|
"<br/>" +
|
||||||
"License: <a href=\"http://fifesoft.com/rsyntaxtextarea/RSyntaxTextArea.License.txt\">Modified BSD License (a.k.a. 3-Clause BSD)</a><br/>" +
|
"<a href=\"http://fifesoft.com/rsyntaxtextarea/\">RSyntaxTextArea</a> by Robert Futrell.<br/>" +
|
||||||
"<br/>" +
|
"License: <a href=\"http://fifesoft.com/rsyntaxtextarea/RSyntaxTextArea.License.txt\">Modified BSD License (a.k.a. 3-Clause BSD)</a><br/>" +
|
||||||
"<a href=\"http://www.jidesoft.com/products/oss.htm\">JIDE Common Layer</a> by JIDE Software.<br/>" +
|
"<br/>" +
|
||||||
"License: <a href=\"http://openjdk.java.net/legal/gplv2+ce.html\">GPL v2 with classpath exception</a><br/>" +
|
"<a href=\"http://www.jidesoft.com/products/oss.htm\">JIDE Common Layer</a> by JIDE Software.<br/>" +
|
||||||
"<br/>" +
|
"License: <a href=\"http://openjdk.java.net/legal/gplv2+ce.html\">GPL v2 with classpath exception</a><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/>" +
|
"<br/>" +
|
||||||
"License: <a href=\"https://github.com/bjorn/tiled/blob/master/LICENSE.BSD\">Simplified BSD License (a.k.a 2-Clause BSD)</a><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/>" +
|
||||||
"Sources of the modified version are included in this package.<br/>" +
|
"License: <a href=\"https://github.com/bjorn/tiled/blob/master/LICENSE.BSD\">Simplified BSD License (a.k.a 2-Clause BSD)</a><br/>" +
|
||||||
"<br/>" +
|
"Sources of the modified version are included in this package.<br/>" +
|
||||||
"<a href=\"http://prefuse.org/\">Prefuse</a> by the Berkeley Institue of Design.<br/>" +
|
"<br/>" +
|
||||||
"License: <a href=\"http://prefuse.org/license-prefuse.txt\">Modified BSD License (a.k.a 3-Clause BSD)</a><br/>" +
|
"<a href=\"http://prefuse.org/\">Prefuse</a> by the Berkeley Institue of Design.<br/>" +
|
||||||
"<br/>" +
|
"License: <a href=\"http://prefuse.org/license-prefuse.txt\">Modified BSD License (a.k.a 3-Clause BSD)</a><br/>" +
|
||||||
"<a href=\"http://www.beanshell.org/\">BeanShell</a> by Pat Niemeyer.<br/>" +
|
"<br/>" +
|
||||||
"License: <a href=\"http://www.beanshell.org/license.html\">LGPL v3</a><br/>" +
|
"<a href=\"http://www.beanshell.org/\">BeanShell</a> by Pat Niemeyer.<br/>" +
|
||||||
"<br/>" +
|
"License: <a href=\"http://www.beanshell.org/license.html\">LGPL v3</a><br/>" +
|
||||||
"A slightly modified version of <a href=\"https://github.com/zackehh/siphash-java\">SipHash for Java</a> by Isaac Whitfield.<br/>" +
|
"<br/>" +
|
||||||
"License: <a href=\"https://github.com/zackehh/siphash-java/blob/master/LICENSE\">MIT License</a><br/>" +
|
"A slightly modified version of <a href=\"https://github.com/zackehh/siphash-java\">SipHash for Java</a> by Isaac Whitfield.<br/>" +
|
||||||
"<br/>" +
|
"License: <a href=\"https://github.com/zackehh/siphash-java/blob/master/LICENSE\">MIT License</a><br/>" +
|
||||||
"<a href=\"https://jsoup.org/\">jsoup</a> by Jonathan Hedley<br/>" +
|
"<br/>" +
|
||||||
"License: <a href=\"https://jsoup.org/license\">MIT License</a><br/>" +
|
"<a href=\"https://jsoup.org/\">jsoup</a> by Jonathan Hedley<br/>" +
|
||||||
"<br/>" +
|
"License: <a href=\"https://jsoup.org/license\">MIT License</a><br/>" +
|
||||||
"A slightly modified version of <a href=\"https://launchpad.net/po-parser\">General PO Parser</a> by Bal<61>zs T<>th<br/>" +
|
"<br/>" +
|
||||||
"License: <a href=\"http://www.gnu.org/licenses/gpl-3.0.html\">GPL v3</a><br/>" +
|
"A slightly modified version of <a href=\"https://launchpad.net/po-parser\">General PO Parser</a> by Bal<61>zs T<>th<br/>" +
|
||||||
"<br/>" +
|
"License: <a href=\"http://www.gnu.org/licenses/gpl-3.0.html\">GPL v3</a><br/>" +
|
||||||
"A slightly modified version of <a href=\"www.whoischarles.com\">Minify.java</a> by Charles Bihis<br/>" +
|
"<br/>" +
|
||||||
"License: <a href=\"https://github.com/charlesbihis/minify#license\">Douglas Crockford variant of MIT License</a><br/>" +
|
"A slightly modified version of <a href=\"www.whoischarles.com\">Minify.java</a> by Charles Bihis<br/>" +
|
||||||
"<br/>" +
|
"License: <a href=\"https://github.com/charlesbihis/minify#license\">Douglas Crockford variant of MIT License</a><br/>" +
|
||||||
"See the tabs below to find the full license text for each of these.<br/>" +
|
"<br/>" +
|
||||||
"<br/>" +
|
"See the tabs below to find the full license text for each of these.<br/>" +
|
||||||
"The Windows installer was created with:<br/>" +
|
"<br/>" +
|
||||||
"<a href=\"http://nsis.sourceforge.net/Main_Page\">NSIS (Nullsoft Scriptable Install System) v2.46</a>" +
|
"The Windows installer was created with:<br/>" +
|
||||||
"</td></tr></table>" +
|
"<a href=\"http://nsis.sourceforge.net/Main_Page\">NSIS (Nullsoft Scriptable Install System) v2.46</a>" +
|
||||||
"</body></html>";
|
"</td></tr></table>" +
|
||||||
|
"</body></html>";
|
||||||
|
|
||||||
|
|
||||||
public static final AboutEditor instance = new AboutEditor();
|
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());
|
@SuppressWarnings("resource")
|
||||||
JideTabbedPane editorTabsHolder = new JideTabbedPane(JideTabbedPane.BOTTOM);
|
private AboutEditor() {
|
||||||
editorTabsHolder.setTabShape(JideTabbedPane.SHAPE_FLAT);
|
this.name = "About " + ATContentStudio.APP_NAME;
|
||||||
editorTabsHolder.setUseDefaultShowCloseButtonOnTab(false);
|
this.icon = new ImageIcon(DefaultIcons.getMainIconIcon());
|
||||||
editorTabsHolder.setShowCloseButtonOnTab(false);
|
this.target = new GameDataElement() {
|
||||||
add(editorTabsHolder, BorderLayout.CENTER);
|
private static final long serialVersionUID = -227480102288529682L;
|
||||||
|
|
||||||
editorTabsHolder.add("Welcome", getInfoPane(WELCOME_STRING, "text/html"));
|
@Override
|
||||||
editorTabsHolder.add("JSON.simple License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/LICENSE.JSON.simple.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
public GameDataSet getDataSet() {
|
||||||
editorTabsHolder.add("RSyntaxTextArea License", getInfoPane(new Scanner(ATContentStudio.class.getResourceAsStream("/RSyntaxTextArea.License.txt"), "UTF-8").useDelimiter("\\A").next(), "text/text"));
|
return null;
|
||||||
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"));
|
|
||||||
|
|
||||||
}
|
@Override
|
||||||
|
public String getDesc() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private JPanel getInfoPane(String content, String mime) {
|
@Override
|
||||||
JEditorPane welcome = new JEditorPane();
|
public void parse() {
|
||||||
welcome.setContentType(mime);
|
}
|
||||||
welcome.setText(content);
|
|
||||||
welcome.setEditable(false);
|
@Override
|
||||||
welcome.addHyperlinkListener(new HyperlinkListener() {
|
public void link() {
|
||||||
@Override
|
}
|
||||||
public void hyperlinkUpdate(HyperlinkEvent arg0) {
|
|
||||||
arg0.getEventType();
|
@Override
|
||||||
if (arg0.getEventType() == EventType.ACTIVATED) {
|
public GameDataElement clone() {
|
||||||
if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
|
return null;
|
||||||
try {
|
}
|
||||||
Desktop.getDesktop().browse(arg0.getURL().toURI());
|
|
||||||
} catch (IOException e) {
|
@Override
|
||||||
e.printStackTrace();
|
public void elementChanged(GameDataElement oldOne, GameDataElement newOne) {
|
||||||
} catch (URISyntaxException e) {
|
}
|
||||||
e.printStackTrace();
|
|
||||||
}
|
@Override
|
||||||
}
|
public String getProjectFilename() {
|
||||||
}
|
return null;
|
||||||
}
|
}
|
||||||
});
|
|
||||||
JPanel pane = new JPanel();
|
@Override
|
||||||
pane.setLayout(new BorderLayout());
|
public void save() {
|
||||||
pane.add(new JScrollPane(welcome), BorderLayout.CENTER);
|
}
|
||||||
return pane;
|
|
||||||
}
|
@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
|
@Override
|
||||||
public void targetUpdated() {}
|
public void targetUpdated() {
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.ui;
|
package com.gpl.rpg.atcontentstudio.ui;
|
||||||
|
|
||||||
import javax.swing.JCheckBox;
|
import javax.swing.*;
|
||||||
|
|
||||||
public class BooleanBasedCheckBox extends JCheckBox {
|
public class BooleanBasedCheckBox extends JCheckBox {
|
||||||
|
|
||||||
private static final long serialVersionUID = 3941646360487399554L;
|
private static final long serialVersionUID = 3941646360487399554L;
|
||||||
|
|
||||||
public Boolean getBooleanValue() {
|
public Boolean getBooleanValue() {
|
||||||
return isSelected() ? Boolean.TRUE : null;
|
return isSelected() ? Boolean.TRUE : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBooleanValue(Boolean val) {
|
public void setBooleanValue(Boolean val) {
|
||||||
setSelected(val != null && val);
|
setSelected(val != null && val);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +1,20 @@
|
|||||||
package com.gpl.rpg.atcontentstudio.ui;
|
package com.gpl.rpg.atcontentstudio.ui;
|
||||||
|
|
||||||
import java.awt.BorderLayout;
|
import javax.swing.*;
|
||||||
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.border.TitledBorder;
|
import javax.swing.border.TitledBorder;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.*;
|
||||||
|
|
||||||
public class CollapsiblePanel extends JPanel {
|
public class CollapsiblePanel extends JPanel {
|
||||||
|
|
||||||
private static final long serialVersionUID = 319384990345722150L;
|
private static final long serialVersionUID = 319384990345722150L;
|
||||||
|
|
||||||
String title;
|
String title;
|
||||||
TitledBorder border;
|
TitledBorder border;
|
||||||
|
|
||||||
public CollapsiblePanel(String title) {
|
public CollapsiblePanel(String title) {
|
||||||
super();
|
super();
|
||||||
this.title = title;
|
this.title = title;
|
||||||
border = BorderFactory.createTitledBorder(title);
|
border = BorderFactory.createTitledBorder(title);
|
||||||
setBorder(border);
|
setBorder(border);
|
||||||
BorderLayout borderLayout = new BorderLayout();
|
BorderLayout borderLayout = new BorderLayout();
|
||||||
@@ -42,6 +34,7 @@ public class CollapsiblePanel extends JPanel {
|
|||||||
public void componentShown(ComponentEvent e) {
|
public void componentShown(ComponentEvent e) {
|
||||||
updateBorderTitle();
|
updateBorderTitle();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void componentHidden(ComponentEvent e) {
|
public void componentHidden(ComponentEvent e) {
|
||||||
updateBorderTitle();
|
updateBorderTitle();
|
||||||
@@ -53,8 +46,8 @@ public class CollapsiblePanel extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setTitle(String title) {
|
public void setTitle(String title) {
|
||||||
String oldTitle = this.title;
|
String oldTitle = this.title;
|
||||||
this.title = title;
|
this.title = title;
|
||||||
firePropertyChange("title", oldTitle, this.title);
|
firePropertyChange("title", oldTitle, this.title);
|
||||||
updateBorderTitle();
|
updateBorderTitle();
|
||||||
}
|
}
|
||||||
@@ -132,9 +125,9 @@ public class CollapsiblePanel extends JPanel {
|
|||||||
protected void updateBorderTitle() {
|
protected void updateBorderTitle() {
|
||||||
String arrow = "";
|
String arrow = "";
|
||||||
if (getComponentCount() > 0) {
|
if (getComponentCount() > 0) {
|
||||||
arrow = (hasInvisibleComponent()?"[+] ":"[-] ");
|
arrow = (hasInvisibleComponent() ? "[+] " : "[-] ");
|
||||||
}
|
}
|
||||||
border.setTitle(arrow+title);
|
border.setTitle(arrow + title);
|
||||||
repaint();
|
repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,13 +141,15 @@ public class CollapsiblePanel extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void collapse() {
|
public void collapse() {
|
||||||
toggleVisibility(false);
|
toggleVisibility(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void expand() {
|
public void expand() {
|
||||||
toggleVisibility(true);
|
toggleVisibility(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setExpanded(boolean expand) {
|
public void setExpanded(boolean expand) {
|
||||||
toggleVisibility(expand);
|
toggleVisibility(expand);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user