Compare commits
402 Commits
v0.4.7
...
v0.6.24-be
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
69c031d28e | ||
|
|
6ec4cbf83d | ||
|
|
5b2480920e | ||
|
|
e6f89b8802 | ||
|
|
f2008de3e2 | ||
|
|
0df961c8d3 | ||
|
|
15b98eedcf | ||
|
|
8399ae60ee | ||
|
|
1b643f4aa1 | ||
|
|
4293095e8e | ||
|
|
5f2927e00c | ||
|
|
79eddde155 | ||
|
|
c94c5fb41b | ||
|
|
be040a74bd | ||
|
|
31cbdcabab | ||
|
|
7e5c8d05ab | ||
|
|
b2003bfc38 | ||
|
|
3b99a94654 | ||
|
|
806f0b10e6 | ||
|
|
29241f18b8 | ||
|
|
7df75482eb | ||
|
|
f93d865da7 | ||
|
|
bad86eec93 | ||
|
|
ef9a2a628d | ||
|
|
9dfd217a27 | ||
|
|
6f10e5b94a | ||
|
|
7cbce8e4d7 | ||
|
|
364bf8ee11 | ||
|
|
e2b0b0e81e | ||
|
|
703b723322 | ||
|
|
297bff84db | ||
|
|
67724f5124 | ||
|
|
09d23c8cdf | ||
|
|
749e64e09e | ||
|
|
998560a6ff | ||
|
|
2bf64c417f | ||
|
|
120ed02a69 | ||
|
|
f308580deb | ||
|
|
fd41013ade | ||
|
|
114e09597e | ||
|
|
3ceee2e9e6 | ||
|
|
83cc57515d | ||
|
|
06d4131582 | ||
|
|
60205d54de | ||
|
|
f6fbb0f5a3 | ||
|
|
af48341439 | ||
|
|
7b7218ad4e | ||
|
|
1ddf1c5051 | ||
|
|
f9a9ab97de | ||
|
|
b37d32b5c2 | ||
|
|
3c5ed1d6f6 | ||
|
|
bc3333bd0e | ||
|
|
e6d9d8fbda | ||
|
|
32ff1b57fa | ||
|
|
090584dbcc | ||
|
|
e858e436c6 | ||
|
|
4b2aa77cb6 | ||
|
|
24e1e526ce | ||
|
|
861c4c3bb1 | ||
|
|
c18fcfc667 | ||
|
|
9b1ac0d3e1 | ||
|
|
782d436681 | ||
|
|
397d1ded8c | ||
|
|
aef6429dbc | ||
|
|
c43b8464a2 | ||
|
|
7929ffe2a7 | ||
|
|
a3ffecfd23 | ||
|
|
1cbcd5b661 | ||
|
|
0eddd25292 | ||
|
|
1c83eedd80 | ||
|
|
6c296868c0 | ||
|
|
8f5452b487 | ||
|
|
f9f1caafc6 | ||
|
|
c0e24b4cf5 | ||
|
|
cd36813050 | ||
|
|
358d855eec | ||
|
|
281e314815 | ||
|
|
3f19ca959b | ||
|
|
6b74ad5cbe | ||
|
|
93e44a2b50 | ||
|
|
652da07cc8 | ||
|
|
2dbe881dd7 | ||
|
|
b7e9bf0582 | ||
|
|
6dcd8599b3 | ||
|
|
62ed795fed | ||
|
|
ec04b810d9 | ||
|
|
18b92a3921 | ||
|
|
127ed76006 | ||
|
|
56242e85f2 | ||
|
|
de2b47821b | ||
|
|
7eb60117c4 | ||
|
|
0c69438a33 | ||
|
|
380bb1de17 | ||
|
|
9ae9914dde | ||
|
|
c78fcde633 | ||
|
|
270c613f66 | ||
|
|
ebafae7503 | ||
|
|
572c658b43 | ||
|
|
5031fa3c72 | ||
|
|
7f0b55a71c | ||
|
|
ab91d330bd | ||
|
|
27a86ee654 | ||
|
|
ad15063dcc | ||
|
|
2ea425dda6 | ||
|
|
f22052525c | ||
|
|
63e381a804 | ||
|
|
488dd92893 | ||
|
|
f04f062723 | ||
|
|
e91f770975 | ||
|
|
7018703ba6 | ||
|
|
93f0a902ba | ||
|
|
1ca2b9068e | ||
|
|
a7f214a1cb | ||
|
|
b2c05037e5 | ||
|
|
517a798b6f | ||
|
|
e9fecee876 | ||
|
|
967bbf918b | ||
|
|
5ce84dc1b1 | ||
|
|
0a18309bfe | ||
|
|
edc4634cbe | ||
|
|
1e25eabb50 | ||
|
|
1c7de2b97f | ||
|
|
e40fe058dd | ||
|
|
919e65187f | ||
|
|
7b780462ea | ||
|
|
00147c2708 | ||
|
|
70cc945010 | ||
|
|
21005f1ba6 | ||
|
|
b5a6aa6706 | ||
|
|
3cc6eb9edb | ||
|
|
d166e49f4d | ||
|
|
d1568cd2ed | ||
|
|
685ce223da | ||
|
|
18cb73385f | ||
|
|
90359bf285 | ||
|
|
bb187621b7 | ||
|
|
a4b431efdd | ||
|
|
cffbf973e1 | ||
|
|
979a7bc43f | ||
|
|
6b049d3b7b | ||
|
|
edd0160c9d | ||
|
|
fdcc4fab55 | ||
|
|
d030e11019 | ||
|
|
333100b19b | ||
|
|
cfb906736d | ||
|
|
cf8c0497bc | ||
|
|
355bb2bc54 | ||
|
|
e1e85d7a90 | ||
|
|
9ed9393b16 | ||
|
|
8c42b498b0 | ||
|
|
8561415574 | ||
|
|
185f168b19 | ||
|
|
70055be6d2 | ||
|
|
286d95d83d | ||
|
|
04b704daf0 | ||
|
|
3f1f988808 | ||
|
|
e232c33339 | ||
|
|
4239beb825 | ||
|
|
eb6377a983 | ||
|
|
2fb16c9213 | ||
|
|
6741100a4f | ||
|
|
dbff7fb571 | ||
|
|
dfb3e31a7a | ||
|
|
022c9ad229 | ||
|
|
38a3d4082b | ||
|
|
cd78ee3ad0 | ||
|
|
7b30cc6355 | ||
|
|
9a6c5ecf6e | ||
|
|
ed81c2382f | ||
|
|
ed2ad56b76 | ||
|
|
becf45f249 | ||
|
|
c950324cd9 | ||
|
|
b58d080f4d | ||
|
|
a2640c2da0 | ||
|
|
4fe7e71a43 | ||
|
|
9a162ac58d | ||
|
|
93718230a5 | ||
|
|
4fbf7de85a | ||
|
|
f0be1a8135 | ||
|
|
104d3db5ad | ||
|
|
f154efcecc | ||
|
|
00e9e3b2a7 | ||
|
|
92436d3ce9 | ||
|
|
b6cfe349c0 | ||
|
|
1e2daa56a4 | ||
|
|
2caaaeb474 | ||
|
|
0e8ed1a25d | ||
|
|
e2fdf08fec | ||
|
|
b5dceb9fd1 | ||
|
|
1555bd63db | ||
|
|
56fff8a730 | ||
|
|
dd7b3d5300 | ||
|
|
68affdde8c | ||
|
|
6cec8b835e | ||
|
|
aa43382296 | ||
|
|
ec346e9c98 | ||
|
|
61d5af822c | ||
|
|
c2d05b2bff | ||
|
|
e60378ab64 | ||
|
|
6578236775 | ||
|
|
4fa2409c24 | ||
|
|
b5aa453fd6 | ||
|
|
42f1c87278 | ||
|
|
9097b97316 | ||
|
|
7965ecb4f1 | ||
|
|
01963517ba | ||
|
|
30bef443d5 | ||
|
|
8d01716d93 | ||
|
|
fce5cd71ff | ||
|
|
0cddbb04e9 | ||
|
|
00ec5fe49f | ||
|
|
5cdb42ae07 | ||
|
|
c98f51744b | ||
|
|
5550b257ca | ||
|
|
619aa1075f | ||
|
|
38a3ad85c8 | ||
|
|
89f764b62b | ||
|
|
d81233d470 | ||
|
|
e1685aa625 | ||
|
|
ae3ca5d50a | ||
|
|
a00b8fbc66 | ||
|
|
4d03c15e08 | ||
|
|
4571bea429 | ||
|
|
ecc9a35c69 | ||
|
|
c4d71df4b1 | ||
|
|
a13dac467a | ||
|
|
e305dfd7bf | ||
|
|
80984a43af | ||
|
|
2bc8b65264 | ||
|
|
b2584a24cc | ||
|
|
1626a8340f | ||
|
|
5fe2dfe148 | ||
|
|
abc1e7c912 | ||
|
|
317d6d4216 | ||
|
|
3628386019 | ||
|
|
ada352a02c | ||
|
|
fc0d97aa2f | ||
|
|
7451f582ce | ||
|
|
7b80bf5768 | ||
|
|
ddd98c5a8f | ||
|
|
0ef703d82e | ||
|
|
2339a9307c | ||
|
|
7dcdb90750 | ||
|
|
b638c31ebe | ||
|
|
862f4b7366 | ||
|
|
693de98212 | ||
|
|
3f4bf58375 | ||
|
|
7ae4d9d3f6 | ||
|
|
0f20f0cd6d | ||
|
|
481956cfa5 | ||
|
|
7c282aae53 | ||
|
|
1fd3e6253e | ||
|
|
70f61f0281 | ||
|
|
2f82fd13a6 | ||
|
|
f7e5785970 | ||
|
|
084b23f641 | ||
|
|
ff4d8a6b6c | ||
|
|
45aff3d25b | ||
|
|
28a1d0b09e | ||
|
|
b96568049f | ||
|
|
e125b0339c | ||
|
|
65456a110b | ||
|
|
a9bd84b9f2 | ||
|
|
1bab8dc42f | ||
|
|
7863b73eda | ||
|
|
32e1b87e09 | ||
|
|
4b6be99d98 | ||
|
|
13847bb8cd | ||
|
|
2d92a97689 | ||
|
|
9c21c7cd02 | ||
|
|
f4fd8ad5bb | ||
|
|
63acc5bf2c | ||
|
|
4c51353e93 | ||
|
|
7bf6bbfcd1 | ||
|
|
7d40d56430 | ||
|
|
d7e83575e3 | ||
|
|
811870184b | ||
|
|
7297f47b67 | ||
|
|
20877f7850 | ||
|
|
b3c8879be1 | ||
|
|
ac68006a69 | ||
|
|
92e07e76d2 | ||
|
|
5a3315da1a | ||
|
|
e12c6bcc25 | ||
|
|
44c4e1f998 | ||
|
|
450b0de02a | ||
|
|
57702a3a4a | ||
|
|
3e5f732f82 | ||
|
|
b497493853 | ||
|
|
00c05e7507 | ||
|
|
1b01ecd37d | ||
|
|
da5b686672 | ||
|
|
0a3da17d47 | ||
|
|
bf42f86408 | ||
|
|
aa543bc111 | ||
|
|
f4041ee2c7 | ||
|
|
3e8d578474 | ||
|
|
67b8acd20b | ||
|
|
d1612269c0 | ||
|
|
f95327bd12 | ||
|
|
e0425e335d | ||
|
|
3800bf8ff0 | ||
|
|
84e46ffd20 | ||
|
|
9f5666ea6d | ||
|
|
ae5822703a | ||
|
|
9b68ef6679 | ||
|
|
75d6f8e98f | ||
|
|
38c206cbaf | ||
|
|
b12ed1802f | ||
|
|
0b8bc8448a | ||
|
|
221a031c2b | ||
|
|
f2e4767eb0 | ||
|
|
78ceacb0ce | ||
|
|
1604373e6c | ||
|
|
6e2ee13da7 | ||
|
|
ea28b7475a | ||
|
|
ffe6a14cd9 | ||
|
|
3ab233761f | ||
|
|
e5bb59b876 | ||
|
|
1fb22ab73f | ||
|
|
6b834e0f0e | ||
|
|
9e6e1d936d | ||
|
|
c3144db751 | ||
|
|
daeb394373 | ||
|
|
e697f93cf5 | ||
|
|
407d50a01e | ||
|
|
a475180bb5 | ||
|
|
259442710b | ||
|
|
3c63ace6c1 | ||
|
|
1786860a3b | ||
|
|
cbc101b3b1 | ||
|
|
33260137d9 | ||
|
|
5a1d8637f9 | ||
|
|
97119b7101 | ||
|
|
104029124b | ||
|
|
2aad37549c | ||
|
|
8dc05bd26a | ||
|
|
de0274a5be | ||
|
|
3d2dbb9f51 | ||
|
|
f53302cb18 | ||
|
|
8d6a40eb13 | ||
|
|
0199bcfb4c | ||
|
|
3fe895a668 | ||
|
|
025a63af28 | ||
|
|
528ac7a7e3 | ||
|
|
506afb95ed | ||
|
|
5d802ed0e3 | ||
|
|
33cbd059ec | ||
|
|
6cb0941ca6 | ||
|
|
cfb38c33d6 | ||
|
|
ec3afaaf36 | ||
|
|
9f978591ff | ||
|
|
7fff58d8f9 | ||
|
|
6192bd8dce | ||
|
|
be43a2a5d4 | ||
|
|
99524bf043 | ||
|
|
f2144ab446 | ||
|
|
ada045a13b | ||
|
|
4c4f7e5b92 | ||
|
|
ef521207de | ||
|
|
3ef0f7e0f1 | ||
|
|
74808cdd3a | ||
|
|
1e8d08ee3a | ||
|
|
8d8a1e122e | ||
|
|
fe62c05b4b | ||
|
|
f93d03dbd3 | ||
|
|
7eb5c7c208 | ||
|
|
e04c3ee2fd | ||
|
|
38a1e90aad | ||
|
|
83d459021b | ||
|
|
fb8dcb9fb4 | ||
|
|
5e73b59d06 | ||
|
|
bca28781bd | ||
|
|
899e94c5bc | ||
|
|
0a7cb40dbc | ||
|
|
bd8576df0c | ||
|
|
49f19abb91 | ||
|
|
300b7bbbdd | ||
|
|
bbee5bef25 | ||
|
|
1fc1cef233 | ||
|
|
ae9a6695b0 | ||
|
|
572704fd73 | ||
|
|
dfe3cc8480 | ||
|
|
97ae63693a | ||
|
|
940996aa30 | ||
|
|
2a4cfb0684 | ||
|
|
061a0fa11b | ||
|
|
41462137d6 | ||
|
|
9888dfe678 | ||
|
|
baa027bc41 | ||
|
|
8f2e835e9c | ||
|
|
8333fe3621 | ||
|
|
291808a564 | ||
|
|
900d0bc9b5 | ||
|
|
6fe4d2a171 | ||
|
|
1076693322 | ||
|
|
5a9e66b7c9 | ||
|
|
b1d0175a9d | ||
|
|
6ac332834d | ||
|
|
32711449b2 | ||
|
|
c18ff9d2b4 | ||
|
|
ce908f0033 |
35
.classpath
@@ -1,16 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="res"/>
|
||||
<classpathentry kind="src" path="hacked-libtiled"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="lib" path="lib/jide-oss.jar"/>
|
||||
<classpathentry kind="lib" path="lib/json_simple-1.1.jar"/>
|
||||
<classpathentry kind="lib" path="lib/junit-4.10.jar"/>
|
||||
<classpathentry kind="lib" path="lib/prefuse.jar"/>
|
||||
<classpathentry kind="lib" path="lib/rsyntaxtextarea.jar"/>
|
||||
<classpathentry kind="lib" path="lib/ui.jar"/>
|
||||
<classpathentry kind="lib" path="lib/bsh-2.0b4.jar"/>
|
||||
<classpathentry kind="lib" path="lib/AndorsTrainer_v0.1.2.jar"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="res"/>
|
||||
<classpathentry kind="src" path="hacked-libtiled"/>
|
||||
<classpathentry kind="src" path="siphash-zackehh/src/main/java"/>
|
||||
<classpathentry kind="src" path="minify"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry kind="lib" path="lib/jide-oss.jar"/>
|
||||
<classpathentry kind="lib" path="lib/json_simple-1.1.jar"/>
|
||||
<classpathentry kind="lib" path="lib/junit-4.10.jar"/>
|
||||
<classpathentry kind="lib" path="lib/prefuse.jar"/>
|
||||
<classpathentry kind="lib" path="lib/rsyntaxtextarea.jar"/>
|
||||
<classpathentry kind="lib" path="lib/ui.jar"/>
|
||||
<classpathentry kind="lib" path="lib/bsh-2.0b4.jar"/>
|
||||
<classpathentry kind="lib" path="lib/jsoup-1.10.2.jar" sourcepath="lib/jsoup-1.10.2-sources.jar"/>
|
||||
<classpathentry kind="lib" path="lib/AndorsTrainer_v0.1.5.jar"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
||||
|
||||
6
.gitattributes
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
* text=auto
|
||||
|
||||
# Force bash scripts to always use LF line endings so that if a repo is accessed
|
||||
# in Unix via a file share from Windows, the scripts will work.
|
||||
*.sh text eol=lf
|
||||
69
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
name: Release Build
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [ created ]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Get Version
|
||||
id: get_version
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Reading version from file:"
|
||||
cat res/ATCS_latest
|
||||
echo ""
|
||||
VERSION=$(tr -d '[:space:]' < "res/ATCS_latest")
|
||||
echo "Processed version: $VERSION"
|
||||
echo "VERSION=$VERSION" >> $GITHUB_ENV
|
||||
echo "Environment variable set to: $VERSION"
|
||||
|
||||
- name: Set up JDK
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'temurin'
|
||||
|
||||
- name: Build JAR
|
||||
shell: bash
|
||||
run: |
|
||||
cd packaging
|
||||
chmod +x package.sh
|
||||
echo "Building JAR and ZIP for version: ${{ env.VERSION }}"
|
||||
./package.sh
|
||||
echo "Created artifacts:"
|
||||
ls -la common/ATCS.jar
|
||||
ls -la ATCS_${{ env.VERSION }}.zip
|
||||
|
||||
- name: Upload Release Assets (zip)
|
||||
uses: softprops/action-gh-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
files: |
|
||||
./packaging/ATCS_${{ env.VERSION }}.zip
|
||||
|
||||
- name: 'Install makensis (apt)'
|
||||
run: sudo apt update && sudo apt install -y nsis nsis-pluginapi
|
||||
continue-on-error: true
|
||||
|
||||
- name: Create Windows-Installer with NSIS
|
||||
uses: joncloud/makensis-action@v4
|
||||
with:
|
||||
script-file: packaging/Windows/ATCS_Installer.nsi
|
||||
arguments: -DVERSION="${{ env.VERSION }}"
|
||||
continue-on-error: true
|
||||
|
||||
- name: Upload Release Assets (exe)
|
||||
uses: softprops/action-gh-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
files: ./packaging/ATCS_${{ env.VERSION }}_Setup.exe
|
||||
continue-on-error: true
|
||||
10
.gitignore
vendored
@@ -1,3 +1,13 @@
|
||||
/ATCS_v*.jar
|
||||
/Project
|
||||
/bin
|
||||
/packaging/tmp/
|
||||
/out
|
||||
packaging/common/lib
|
||||
packaging/common/ATCS.jar
|
||||
packaging/ATCS_*.zip
|
||||
ATCS_v*.tar.gz
|
||||
ATCS.jar
|
||||
/packaging/common/ATCS.env.bat
|
||||
/packaging/common/ATCS.env
|
||||
/packaging/common/ATCS_v*.zip
|
||||
|
||||
8
.idea/.gitignore
generated
vendored
Normal file
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
19
ATCS_JAR.jardesc
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<jardesc>
|
||||
<jar path="ATContentStudio/ATCS_v0.6.20.jar"/>
|
||||
<options buildIfNeeded="true" compress="true" descriptionLocation="/ATContentStudio/ATCS_JAR.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
|
||||
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
|
||||
<selectedProjects/>
|
||||
<manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
|
||||
<sealing sealJar="false">
|
||||
<packagesToSeal/>
|
||||
<packagesToUnSeal/>
|
||||
</sealing>
|
||||
</manifest>
|
||||
<selectedElements exportClassFiles="true" exportJavaFiles="true" exportOutputFolder="false">
|
||||
<javaElement handleIdentifier="=ATContentStudio/hacked-libtiled"/>
|
||||
<javaElement handleIdentifier="=ATContentStudio/siphash-zackehh\/src\/main\/java"/>
|
||||
<javaElement handleIdentifier="=ATContentStudio/src"/>
|
||||
<javaElement handleIdentifier="=ATContentStudio/res"/>
|
||||
</selectedElements>
|
||||
</jardesc>
|
||||
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
@@ -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
|
||||
@@ -29,7 +29,9 @@
|
||||
package tiled.core;
|
||||
|
||||
import java.awt.Rectangle;
|
||||
import java.util.*;
|
||||
import java.util.Iterator;
|
||||
import java.util.Properties;
|
||||
import java.util.Vector;
|
||||
|
||||
/**
|
||||
* The Map class is the focal point of the <code>tiled.core</code> package.
|
||||
@@ -109,11 +111,14 @@ public class Map implements Iterable<MapLayer>
|
||||
|
||||
public MapLayer addLayer(MapLayer layer) {
|
||||
layer.setMap(this);
|
||||
layers.add(layer);
|
||||
if (layer instanceof TileLayer) {
|
||||
tileLayers.add((TileLayer) layer);
|
||||
layers.add(layer);
|
||||
} else if (layer instanceof ObjectGroup) {
|
||||
layers.insertElementAt(layer, objectGroups.size());
|
||||
objectGroups.add((ObjectGroup) layer);
|
||||
} else {
|
||||
layers.add(layer);
|
||||
}
|
||||
return layer;
|
||||
}
|
||||
|
||||
@@ -28,10 +28,12 @@
|
||||
|
||||
package tiled.core;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.Properties;
|
||||
import java.awt.Image;
|
||||
import java.awt.Rectangle;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
/**
|
||||
@@ -41,7 +43,7 @@ public class MapObject implements Cloneable
|
||||
{
|
||||
private Properties properties = new Properties();
|
||||
private ObjectGroup objectGroup;
|
||||
private Rectangle bounds = new Rectangle();
|
||||
private Rectangle bounds;
|
||||
private String name = "Object";
|
||||
private String type = "";
|
||||
private String imageSource = "";
|
||||
|
||||
@@ -33,8 +33,8 @@ import java.awt.Shape;
|
||||
import java.awt.geom.Area;
|
||||
import java.awt.geom.Ellipse2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
|
||||
@@ -57,7 +57,7 @@ public class Sprite
|
||||
|
||||
private String name = null;
|
||||
private int id = -1;
|
||||
private int flags = KEY_LOOP;
|
||||
private int flags;
|
||||
private float frameRate = 1.0f; //one fps
|
||||
private Tile[] frames;
|
||||
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
|
||||
package tiled.core;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.util.Properties;
|
||||
|
||||
|
||||
@@ -98,27 +98,46 @@ public class TileSet implements Iterable<Tile>
|
||||
|
||||
File f = new File(imgFilename);
|
||||
|
||||
Image image = ImageIO.read(f.getCanonicalFile());
|
||||
BufferedImage image;
|
||||
try {
|
||||
image = ImageIO.read(f.getCanonicalFile());
|
||||
} catch (IOException e) { throw new IOException("Failed to load " + imgFilename);
|
||||
}
|
||||
if (image == null) {
|
||||
throw new IOException("Failed to load " + tilebmpFile);
|
||||
throw new IOException("Failed to load " + imgFilename);
|
||||
}
|
||||
|
||||
Toolkit tk = Toolkit.getDefaultToolkit();
|
||||
tilebmpFile = f;
|
||||
tileDimensions = new Rectangle(cutter.getTileDimensions());
|
||||
|
||||
// Toolkit tk = Toolkit.getDefaultToolkit();
|
||||
//
|
||||
// if (transparentColor != null) {
|
||||
// int rgb = transparentColor.getRGB();
|
||||
// image = tk.createImage(
|
||||
// new FilteredImageSource(image.getSource(),
|
||||
// new TransparentImageFilter(rgb)));
|
||||
// }
|
||||
//
|
||||
// BufferedImage buffered = new BufferedImage(
|
||||
// image.getWidth(null),
|
||||
// image.getHeight(null),
|
||||
// BufferedImage.TYPE_INT_ARGB);
|
||||
// buffered.getGraphics().drawImage(image, 0, 0, null);
|
||||
|
||||
if (transparentColor != null) {
|
||||
int rgb = transparentColor.getRGB();
|
||||
image = tk.createImage(
|
||||
new FilteredImageSource(image.getSource(),
|
||||
new TransparentImageFilter(rgb)));
|
||||
}
|
||||
importTileBitmap(image, cutter);
|
||||
}
|
||||
|
||||
public void weakImportTileBitmap(String imgFilename, TileCutter cutter)
|
||||
throws IOException
|
||||
{
|
||||
setTilesetImageFilename(imgFilename);
|
||||
|
||||
File f = new File(imgFilename);
|
||||
|
||||
BufferedImage buffered = new BufferedImage(
|
||||
image.getWidth(null),
|
||||
image.getHeight(null),
|
||||
BufferedImage.TYPE_INT_ARGB);
|
||||
buffered.getGraphics().drawImage(image, 0, 0, null);
|
||||
tilebmpFile = f;
|
||||
tileDimensions = new Rectangle(cutter.getTileDimensions());
|
||||
|
||||
importTileBitmap(buffered, cutter);
|
||||
}
|
||||
|
||||
public void loadFromProject(String name, TMXMap tmxMap, int tileWidth, int tileHeight) {
|
||||
|
||||
@@ -38,7 +38,6 @@ import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
import java.io.StringReader;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
@@ -914,7 +913,8 @@ public class TMXMapReader
|
||||
private class MapEntityResolver implements EntityResolver
|
||||
{
|
||||
public InputSource resolveEntity(String publicId, String systemId) {
|
||||
if (systemId.equals("http://mapeditor.org/dtd/1.0/map.dtd")) {
|
||||
if (systemId.equals("http://mapeditor.org/dtd/1.0/map.dtd") ||
|
||||
systemId.equals("https://mapeditor.org/dtd/1.0/map.dtd")) {
|
||||
return new InputSource(TMXMapReader.class.getResourceAsStream(
|
||||
"resources/map.dtd"));
|
||||
}
|
||||
|
||||
@@ -30,14 +30,35 @@ package tiled.io;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Rectangle;
|
||||
import java.io.*;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Writer;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Properties;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
import java.util.Vector;
|
||||
import java.util.zip.DeflaterOutputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
import tiled.core.*;
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.maps.TMXMapSet;
|
||||
|
||||
import tiled.core.AnimatedTile;
|
||||
import tiled.core.Map;
|
||||
import tiled.core.MapLayer;
|
||||
import tiled.core.MapObject;
|
||||
import tiled.core.ObjectGroup;
|
||||
import tiled.core.Sprite;
|
||||
import tiled.core.Tile;
|
||||
import tiled.core.TileLayer;
|
||||
import tiled.core.TileSet;
|
||||
import tiled.io.xml.XMLWriter;
|
||||
import tiled.util.Base64;
|
||||
|
||||
@@ -132,7 +153,7 @@ public class TMXMapWriter
|
||||
}
|
||||
|
||||
private void writeMap(Map map, XMLWriter w, String wp) throws IOException {
|
||||
w.writeDocType("map", null, "http://mapeditor.org/dtd/1.0/map.dtd");
|
||||
w.writeDocType("map", null, "https://mapeditor.org/dtd/1.0/map.dtd");
|
||||
w.startElement("map");
|
||||
|
||||
w.writeAttribute("version", "1.0");
|
||||
@@ -163,7 +184,12 @@ public class TMXMapWriter
|
||||
firstgid += tileset.getMaxTileId() + 1;
|
||||
}
|
||||
|
||||
for (MapLayer layer : map) {
|
||||
for (MapLayer layer : map.getTileLayers()) {
|
||||
writeMapLayer(layer, w, wp);
|
||||
}
|
||||
|
||||
for (MapLayer layer : map.getObjectGroup()) {
|
||||
if (map.getTileLayers().contains(layer)) continue;
|
||||
writeMapLayer(layer, w, wp);
|
||||
}
|
||||
firstGidPerTileset = null;
|
||||
@@ -215,7 +241,15 @@ public class TMXMapWriter
|
||||
} else {
|
||||
w.startElement("tileset");
|
||||
w.writeAttribute("firstgid", getFirstGidForTileset(set));
|
||||
w.writeAttribute("source", getRelativePath(wp, source));
|
||||
if (set.sheet != null && set.sheet.parent.getDataType() == Type.source) {
|
||||
String fileName = set.getName();
|
||||
if (fileName.length() > 3 && !(fileName.substring(fileName.length() - 4).equalsIgnoreCase(".png"))) {
|
||||
fileName += ".png";
|
||||
}
|
||||
w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + fileName).replace("\\", "/"));
|
||||
} else {
|
||||
w.writeAttribute("source", getRelativePath(wp, source));
|
||||
}
|
||||
if (set.getBaseDir() != null) {
|
||||
w.writeAttribute("basedir", set.getBaseDir());
|
||||
}
|
||||
@@ -256,7 +290,15 @@ public class TMXMapWriter
|
||||
|
||||
if (tileBitmapFile != null) {
|
||||
w.startElement("image");
|
||||
w.writeAttribute("source", getRelativePath(wp, tileBitmapFile));
|
||||
if (set.sheet != null && set.sheet.parent.getDataType() == Type.source) {
|
||||
String fileName = set.getName();
|
||||
if (fileName.length() > 3 && !(fileName.substring(fileName.length() - 4).equalsIgnoreCase(".png"))) {
|
||||
fileName += ".png";
|
||||
}
|
||||
w.writeAttribute("source", (TMXMapSet.DEFAULT_REL_PATH_TO_DRAWABLE + fileName).replace("\\", "/"));
|
||||
} else {
|
||||
w.writeAttribute("source", getRelativePath(wp, tileBitmapFile));
|
||||
}
|
||||
if (set.sheetDimensions != null) {
|
||||
w.writeAttribute("width", set.sheetDimensions.width);
|
||||
w.writeAttribute("height", set.sheetDimensions.height);
|
||||
@@ -546,7 +588,7 @@ public class TMXMapWriter
|
||||
}
|
||||
|
||||
// Iterate while parents are the same
|
||||
int shared = 0;
|
||||
int shared;
|
||||
int maxShared = Math.min(fromParents.size(), toParents.size());
|
||||
for (shared = 0; shared < maxShared; shared++) {
|
||||
String fromParent = fromParents.get(shared);
|
||||
|
||||
@@ -28,9 +28,8 @@
|
||||
|
||||
package tiled.io.xml;
|
||||
|
||||
import java.lang.String;
|
||||
import java.io.Writer;
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.Stack;
|
||||
|
||||
/**
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
package tiled.util;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Image;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
/**
|
||||
|
||||
@@ -33,6 +33,7 @@ import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
/**
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
package tiled.util;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Image;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
/**
|
||||
|
||||
@@ -27,10 +27,10 @@
|
||||
|
||||
package tiled.view;
|
||||
|
||||
import tiled.core.TileLayer;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics2D;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImageOp;
|
||||
import tiled.core.TileLayer;
|
||||
|
||||
/**
|
||||
* An interface defining methods to render a map.
|
||||
@@ -51,5 +51,5 @@ public interface MapRenderer
|
||||
* @param g the graphics context to paint to
|
||||
* @param layer the layer to paint
|
||||
*/
|
||||
public void paintTileLayer(Graphics2D g, TileLayer layer, BufferedImageOp filter);
|
||||
public void paintTileLayer(Graphics2D g, TileLayer layer);
|
||||
}
|
||||
|
||||
@@ -27,14 +27,15 @@
|
||||
|
||||
package tiled.view;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import tiled.core.Map;
|
||||
import tiled.core.Tile;
|
||||
import tiled.core.TileLayer;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.BufferedImageOp;
|
||||
|
||||
/**
|
||||
* The orthogonal map renderer. This is the most basic map renderer, dealing
|
||||
* with maps that use rectangular tiles.
|
||||
@@ -53,7 +54,7 @@ public class OrthogonalRenderer implements MapRenderer
|
||||
map.getHeight() * map.getTileHeight());
|
||||
}
|
||||
|
||||
public void paintTileLayer(Graphics2D g, TileLayer layer, BufferedImageOp filter ) {
|
||||
public void paintTileLayer(Graphics2D g, TileLayer layer) {
|
||||
final Rectangle clip = g.getClipBounds();
|
||||
final int tileWidth = map.getTileWidth();
|
||||
final int tileHeight = map.getTileHeight();
|
||||
@@ -84,9 +85,9 @@ public class OrthogonalRenderer implements MapRenderer
|
||||
|
||||
g.drawImage(
|
||||
image,
|
||||
filter,
|
||||
x * tileWidth,
|
||||
(y + 1) * tileHeight - image.getHeight(null));
|
||||
(y + 1) * tileHeight - image.getHeight(null),
|
||||
null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
BIN
itemScroll.xcf
Normal file
BIN
lib/jide-oss.jar
BIN
lib/jsoup-1.10.2-sources.jar
Normal file
BIN
lib/jsoup-1.10.2.jar
Normal file
405
minify/com/whoischarles/util/json/Minify.java
Normal file
@@ -0,0 +1,405 @@
|
||||
/**
|
||||
* ----------------------
|
||||
* Minify.java 2015-10-04
|
||||
* ----------------------
|
||||
*
|
||||
* Copyright (c) 2015 Charles Bihis (www.whoischarles.com)
|
||||
*
|
||||
* This work is an adaptation of JSMin.java published by John Reilly which is a translation from C to Java of jsmin.c
|
||||
* published by Douglas Crockford. Permission is hereby granted to use this Java version under the same conditions as
|
||||
* the original jsmin.c on which all of these derivatives are based.
|
||||
*
|
||||
*
|
||||
*
|
||||
* ---------------------
|
||||
* JSMin.java 2006-02-13
|
||||
* ---------------------
|
||||
*
|
||||
* Copyright (c) 2006 John Reilly (www.inconspicuous.org)
|
||||
*
|
||||
* This work is a translation from C to Java of jsmin.c published by Douglas Crockford. Permission is hereby granted to
|
||||
* use the Java version under the same conditions as the jsmin.c on which it is based.
|
||||
*
|
||||
*
|
||||
*
|
||||
* ------------------
|
||||
* jsmin.c 2003-04-21
|
||||
* ------------------
|
||||
*
|
||||
* Copyright (c) 2002 Douglas Crockford (www.crockford.com)
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* The Software shall be used for Good, not Evil.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
package com.whoischarles.util.json;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PushbackInputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
* Minify.java is written by Charles Bihis (www.whoischarles.com) and is adapted from JSMin.java written by John Reilly
|
||||
* (www.inconspicuous.org) which is itself a translation of jsmin.c written by Douglas Crockford (www.crockford.com).
|
||||
*
|
||||
* @see <a href="http://www.unl.edu/ucomm/templatedependents/JSMin.java">http://www.unl.edu/ucomm/templatedependents/JSMin.java</a>
|
||||
* @see <a href="http://www.crockford.com/javascript/jsmin.c">http://www.crockford.com/javascript/jsmin.c</a>
|
||||
*/
|
||||
public class Minify {
|
||||
|
||||
private static final int EOF = -1;
|
||||
|
||||
private PushbackInputStream in;
|
||||
private OutputStream out;
|
||||
private int currChar;
|
||||
private int nextChar;
|
||||
private int line;
|
||||
private int column;
|
||||
|
||||
public static enum Action {
|
||||
OUTPUT_CURR, DELETE_CURR, DELETE_NEXT
|
||||
}
|
||||
|
||||
public Minify() {
|
||||
this.in = null;
|
||||
this.out = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Minifies the input JSON string.
|
||||
*
|
||||
* Takes the input JSON string and deletes the characters which are insignificant to JavaScipt. Comments will be
|
||||
* removed, tabs will be replaced with spaces, carriage returns will be replaced with line feeds, and most spaces
|
||||
* and line feeds will be removed. The result will be returned.
|
||||
*
|
||||
* @param json The JSON string for which to minify
|
||||
* @return A minified, yet functionally identical, version of the input JSON string
|
||||
*/
|
||||
public String minify(String json) {
|
||||
InputStream in = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
|
||||
try {
|
||||
minify(in, out);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
return out.toString().trim();
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes an input stream to a JSON string and outputs minified JSON to the output stream.
|
||||
*
|
||||
* Takes the input JSON via the input stream and deletes the characters which are insignificant to JavaScript.
|
||||
* Comments will be removed, tabs will be replaced with spaaces, carriage returns will be replaced with line feeds,
|
||||
* and most spaces and line feeds will be removed. The result is streamed to the output stream.
|
||||
*
|
||||
* @param in The <code>InputStream</code> from which to get the un-minified JSON
|
||||
* @param out The <code>OutputStream</code> where the resulting minified JSON will be streamed to
|
||||
* @throws IOException
|
||||
* @throws UnterminatedRegExpLiteralException
|
||||
* @throws UnterminatedCommentException
|
||||
* @throws UnterminatedStringLiteralException
|
||||
*/
|
||||
public void minify(InputStream in, OutputStream out) throws IOException, UnterminatedRegExpLiteralException,
|
||||
UnterminatedCommentException,
|
||||
UnterminatedStringLiteralException {
|
||||
|
||||
// Initialize
|
||||
this.in = new PushbackInputStream(in);
|
||||
this.out = out;
|
||||
this.line = 0;
|
||||
this.column = 0;
|
||||
// currChar = '\n';
|
||||
// action(Action.DELETE_NEXT);
|
||||
currChar = get();
|
||||
nextChar = peek();
|
||||
|
||||
// Process input
|
||||
while (currChar != EOF) {
|
||||
switch (currChar) {
|
||||
|
||||
case ' ':
|
||||
if (isAlphanum(nextChar)) {
|
||||
action(Action.OUTPUT_CURR);
|
||||
} else {
|
||||
action(Action.DELETE_CURR);
|
||||
}
|
||||
break;
|
||||
|
||||
case '\n':
|
||||
switch (nextChar) {
|
||||
case '{':
|
||||
case '[':
|
||||
case '(':
|
||||
case '+':
|
||||
case '-':
|
||||
action(Action.OUTPUT_CURR);
|
||||
break;
|
||||
case ' ':
|
||||
action(Action.DELETE_NEXT);
|
||||
break;
|
||||
default:
|
||||
if (isAlphanum(nextChar)) {
|
||||
action(Action.OUTPUT_CURR);
|
||||
} else {
|
||||
action(Action.DELETE_CURR);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
switch (nextChar) {
|
||||
case ' ':
|
||||
if (isAlphanum(currChar)) {
|
||||
action(Action.OUTPUT_CURR);
|
||||
break;
|
||||
}
|
||||
action(Action.DELETE_NEXT);
|
||||
break;
|
||||
case '\n':
|
||||
switch (currChar) {
|
||||
case '}':
|
||||
case ']':
|
||||
case ')':
|
||||
case '+':
|
||||
case '-':
|
||||
case '"':
|
||||
case '\'':
|
||||
action(Action.OUTPUT_CURR);
|
||||
break;
|
||||
default:
|
||||
if (isAlphanum(currChar)) {
|
||||
action(Action.OUTPUT_CURR);
|
||||
} else {
|
||||
action(Action.DELETE_NEXT);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
action(Action.OUTPUT_CURR);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
out.flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* Process the current character with an appropriate action.
|
||||
*
|
||||
* The action that occurs is determined by the current character. The options are:
|
||||
*
|
||||
* 1. Output currChar: output currChar, copy nextChar to currChar, get the next character and save it to nextChar
|
||||
* 2. Delete currChar: copy nextChar to currChar, get the next character and save it to nextChar
|
||||
* 3. Delete nextChar: get the next character and save it to nextChar
|
||||
*
|
||||
* This method essentially treats a string as a single character. Also recognizes regular expressions if they are
|
||||
* preceded by '(', ',', or '='.
|
||||
*
|
||||
* @param action The action to perform
|
||||
* @throws IOException
|
||||
* @throws UnterminatedRegExpLiteralException
|
||||
* @throws UnterminatedCommentException
|
||||
* @throws UnterminatedStringLiteralException
|
||||
*/
|
||||
private void action(Action action) throws IOException, UnterminatedRegExpLiteralException, UnterminatedCommentException,
|
||||
UnterminatedStringLiteralException {
|
||||
|
||||
// Process action
|
||||
switch (action) {
|
||||
|
||||
case OUTPUT_CURR:
|
||||
out.write(currChar);
|
||||
|
||||
case DELETE_CURR:
|
||||
currChar = nextChar;
|
||||
|
||||
if (currChar == '\'' || currChar == '"') {
|
||||
for ( ; ; ) {
|
||||
out.write(currChar);
|
||||
currChar = get();
|
||||
if (currChar == nextChar) {
|
||||
break;
|
||||
}
|
||||
if (currChar <= '\n') {
|
||||
throw new UnterminatedStringLiteralException(line,
|
||||
column);
|
||||
}
|
||||
if (currChar == '\\') {
|
||||
out.write(currChar);
|
||||
currChar = get();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case DELETE_NEXT:
|
||||
nextChar = next();
|
||||
if (nextChar == '/'
|
||||
&& (currChar == '(' || currChar == ',' || currChar == '=' || currChar == ':')) {
|
||||
out.write(currChar);
|
||||
out.write(nextChar);
|
||||
for ( ; ; ) {
|
||||
currChar = get();
|
||||
if (currChar == '/') {
|
||||
break;
|
||||
} else if (currChar == '\\') {
|
||||
out.write(currChar);
|
||||
currChar = get();
|
||||
} else if (currChar <= '\n') {
|
||||
throw new UnterminatedRegExpLiteralException(line,
|
||||
column);
|
||||
}
|
||||
out.write(currChar);
|
||||
}
|
||||
nextChar = next();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether a given character is a letter, digit, underscore, dollar sign, or non-ASCII character.
|
||||
*
|
||||
* @param c The character to compare
|
||||
* @return True if the character is a letter, digit, underscore, dollar sign, or non-ASCII character. False otherwise.
|
||||
*/
|
||||
private boolean isAlphanum(int c) {
|
||||
return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z')
|
||||
|| c == '_' || c == '$' || c == '\\' || c > 126);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next character from the input stream.
|
||||
*
|
||||
* Will pop the next character from the input stack. If the character is a control character, translate it to a space
|
||||
* or line feed.
|
||||
*
|
||||
* @return The next character from the input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
private int get() throws IOException {
|
||||
int c = in.read();
|
||||
|
||||
if (c == '\n') {
|
||||
line++;
|
||||
column = 0;
|
||||
} else {
|
||||
column++;
|
||||
}
|
||||
|
||||
if (c >= ' ' || c == '\n' || c == EOF) {
|
||||
return c;
|
||||
}
|
||||
|
||||
if (c == '\r') {
|
||||
column = 0;
|
||||
return '\n';
|
||||
}
|
||||
|
||||
return ' ';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next character from the input stream without popping it from the stack.
|
||||
*
|
||||
* @return The next character from the input stream
|
||||
* @throws IOException
|
||||
*/
|
||||
private int peek() throws IOException {
|
||||
int lookaheadChar = in.read();
|
||||
in.unread(lookaheadChar);
|
||||
return lookaheadChar;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the next character from the input stream, excluding comments.
|
||||
*
|
||||
* Will read from the input stream via the <code>get()</code> method. Will exclude characters that are part of
|
||||
* comments. <code>peek()</code> is used to se if a '/' is followed by a '/' or a '*' for the purpose of identifying
|
||||
* comments.
|
||||
*
|
||||
* @return The next character from the input stream, excluding characters from comments
|
||||
* @throws IOException
|
||||
* @throws UnterminatedCommentException
|
||||
*/
|
||||
private int next() throws IOException, UnterminatedCommentException {
|
||||
int c = get();
|
||||
|
||||
if (c == '/') {
|
||||
switch (peek()) {
|
||||
|
||||
case '/':
|
||||
for ( ; ; ) {
|
||||
c = get();
|
||||
if (c <= '\n') {
|
||||
return c;
|
||||
}
|
||||
}
|
||||
|
||||
case '*':
|
||||
get();
|
||||
for ( ; ; ) {
|
||||
switch (get()) {
|
||||
case '*':
|
||||
if (peek() == '/') {
|
||||
get();
|
||||
return ' ';
|
||||
}
|
||||
break;
|
||||
case EOF:
|
||||
throw new UnterminatedCommentException(line, column);
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
return c;
|
||||
}
|
||||
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* Exception to be thrown when an unterminated comment appears in the input.
|
||||
*/
|
||||
public static class UnterminatedCommentException extends Exception {
|
||||
public UnterminatedCommentException(int line, int column) {
|
||||
super("Unterminated comment at line " + line + " and column " + column);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Exception to be thrown when an unterminated string literal appears in the input.
|
||||
*/
|
||||
public static class UnterminatedStringLiteralException extends Exception {
|
||||
public UnterminatedStringLiteralException(int line, int column) {
|
||||
super("Unterminated string literal at line " + line + " and column " + column);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Exception to be thrown when an unterminated regular expression literal appears in the input.
|
||||
*/
|
||||
public static class UnterminatedRegExpLiteralException extends Exception {
|
||||
public UnterminatedRegExpLiteralException(int line, int column) {
|
||||
super("Unterminated regular expression at line " + line + " and column " + column);
|
||||
}
|
||||
}
|
||||
}
|
||||
2
packaging/Linux/.gitignore
vendored
@@ -1,2 +0,0 @@
|
||||
/ATCS_v*.zip
|
||||
/ATCS_v*.zip.rename
|
||||
@@ -1 +0,0 @@
|
||||
start "" "javaw.exe" -Xmx512M -cp "lib\ATCS_v0.4.7.jar;lib\jide-oss.jar;lib\ui.jar;lib\junit-4.10.jar;lib\json_simple-1.1.jar;lib\rsyntaxtextarea.jar;lib\prefuse.jar;lib\AndorsTrainer_v0.1.2.jar;lib\bsh-2.0b4.jar" com.gpl.rpg.atcontentstudio.ATContentStudio
|
||||
@@ -1,2 +0,0 @@
|
||||
#!/bin/bash
|
||||
java -Xmx512M -cp lib/AndorsTrainer_v0.1.2.jar:lib/ATCS_v0.4.7.jar:lib/prefuse.jar:lib/json_simple-1.1.jar:lib/jide-oss.jar:lib/ui.jar:lib/junit-4.10.jar:lib/rsyntaxtextarea.jar:lib/bsh-2.0b4.jar com.gpl.rpg.atcontentstudio.ATContentStudio
|
||||
1
packaging/Linux/ATCS/lib/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
/*.jar
|
||||
2
packaging/Manifest.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Manifest-Version: 1.0
|
||||
Main-Class: com.gpl.rpg.atcontentstudio.ATContentStudio
|
||||
@@ -1 +1,20 @@
|
||||
start "" "javaw.exe" -Xmx512M -cp "lib\ATCS_v0.4.6.jar;lib\jide-oss.jar;lib\ui.jar;lib\junit-4.10.jar;lib\json_simple-1.1.jar;lib\rsyntaxtextarea.jar;lib\prefuse.jar;lib\AndorsTrainer_v0.1.2.jar;lib\bsh-2.0b4.jar" com.gpl.rpg.atcontentstudio.ATContentStudio
|
||||
@echo off
|
||||
|
||||
set "ATCS_DIR=%~dp0"
|
||||
set "MAX_MEM=512M"
|
||||
set "CP=%ATCS_DIR%lib\*"
|
||||
set "JAVA=javaw.exe"
|
||||
set "JAVA_OPTS=-DFONT_SCALE=1.0 -Dswing.aatext=true"
|
||||
set "ENV_FILE=%ATCS_DIR%ATCS.env.bat"
|
||||
set "MAIN_CLASS=com.gpl.rpg.atcontentstudio.ATContentStudio"
|
||||
|
||||
if exist "%ENV_FILE%" (
|
||||
call "%ENV_FILE%"
|
||||
) else (
|
||||
echo REM set "MAX_MEM=%MAX_MEM%">"%ENV_FILE%"
|
||||
echo REM set "JAVA=%JAVA%">>"%ENV_FILE%"
|
||||
echo REM set "JAVA_OPTS=%JAVA_OPTS%">>"%ENV_FILE%"
|
||||
echo.>>"%ENV_FILE%"
|
||||
)
|
||||
|
||||
start "" "%JAVA%" %JAVA_OPTS% -Xmx%MAX_MEM% -cp "%CP%" %MAIN_CLASS%
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
!include MUI2.nsh
|
||||
|
||||
!define VERSION "0.4.7"
|
||||
; Version will be passed as /DVERSION=vx.x.x
|
||||
!define TRAINER_VERSION "0.1.5"
|
||||
!define JAVA_BIN "java"
|
||||
!define ATCS_SOURCE_DIR "..\..\"
|
||||
|
||||
Name "Andor's Trail Content Studio v${VERSION}"
|
||||
OutFile "ATCS_v${VERSION}_Setup.exe"
|
||||
Name "Andor's Trail Content Studio ${VERSION}"
|
||||
OutFile "..\ATCS_${VERSION}_Setup.exe"
|
||||
InstallDir "$PROGRAMFILES\ATCS\"
|
||||
|
||||
;SetCompressor /SOLID /FINAL lzma
|
||||
@@ -12,10 +14,10 @@ InstallDir "$PROGRAMFILES\ATCS\"
|
||||
Var StartMenuFolder
|
||||
|
||||
!define MUI_WELCOMEPAGE_TITLE "Welcome to Andor's Trail Content Studio installer"
|
||||
!define MUI_WELCOMEPAGE_TEXT "This will install Andor's Trail Content Studio v${VERSION} installer"
|
||||
!define MUI_FINISHPAGE_TEXT "Andor's Trail Content Studio v${VERSION} install completed !"
|
||||
!define MUI_WELCOMEPAGE_TEXT "This will install Andor's Trail Content Studio ${VERSION}"
|
||||
!define MUI_FINISHPAGE_TEXT "Andor's Trail Content Studio ${VERSION} - Install completed !"
|
||||
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Andor's Trail Content Studio"
|
||||
!define MUI_PAGE_HEADER_TEXT "Installing Andor's Trail Content Studio v${VERSION}"
|
||||
!define MUI_PAGE_HEADER_TEXT "Installing Andor's Trail Content Studio ${VERSION}"
|
||||
|
||||
|
||||
;Start Menu Folder Page Configuration
|
||||
@@ -45,105 +47,120 @@ Var StartMenuFolder
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
|
||||
|
||||
!insertmacro MUI_LANGUAGE "English"
|
||||
|
||||
|
||||
;------------------------------------------------------------------------------------
|
||||
Section install
|
||||
|
||||
|
||||
;--- Create in ...\packaging\common\ ATCS.cmd ATCT.ico ATCS.jar
|
||||
SetOutPath $INSTDIR
|
||||
file "ATCS.ico"
|
||||
|
||||
file "${ATCS_SOURCE_DIR}\packaging\common\ATCS.jar"
|
||||
|
||||
Call GetJRE
|
||||
Pop $R0
|
||||
; file "${ATCS_SOURCE_DIR}\packaging\common\ATCS.cmd"
|
||||
; !insertmacro _ReplaceInFile "ATCS.cmd" "java.exe" "$R0" (It was too much work this way)
|
||||
FileOpen $9 "ATCS.cmd" w
|
||||
FileWrite $9 'start "" "$R0" -Xmx512M -cp "lib\AndorsTrainer_v0.1.1.jar;lib\jide-oss.jar;lib\ui.jar;lib\junit-4.10.jar;lib\json_simple-1.1.jar;lib\rsyntaxtextarea.jar;lib\prefuse.jar;lib\bsh-2.0b4.jar;lib\ATCS_v${VERSION}.jar" com.gpl.rpg.atcontentstudio.ATContentStudio'
|
||||
FileWrite $9 '@echo off$\r$\n'
|
||||
FileWrite $9 '$\r$\n'
|
||||
FileWrite $9 'set "ATCS_DIR=%~dp0"$\r$\n'
|
||||
FileWrite $9 'set "MAX_MEM=1024M"$\r$\n'
|
||||
FileWrite $9 'REM required minimum java version is 11$\r$\n'
|
||||
FileWrite $9 'set "JAVA=$R0"$\r$\n'
|
||||
FileWrite $9 'set "JAVA_OPTS=-DFONT_SCALE=1.0 -Dswing.aatext=true"$\r$\n'
|
||||
FileWrite $9 'set "ENV_FILE=%ATCS_DIR%ATCS.env.bat"$\r$\n'
|
||||
FileWrite $9 '$\r$\n'
|
||||
FileWrite $9 'if exist "%ENV_FILE%" ($\r$\n'
|
||||
FileWrite $9 ' call "%ENV_FILE%"$\r$\n'
|
||||
FileWrite $9 ') else ($\r$\n'
|
||||
FileWrite $9 ' echo REM set "MAX_MEM=%MAX_MEM%">"%ENV_FILE%"$\r$\n'
|
||||
FileWrite $9 ' echo REM required minimum java version is 11$\r$\n'
|
||||
FileWrite $9 ' echo REM set "JAVA=%JAVA%">>"%ENV_FILE%"$\r$\n'
|
||||
FileWrite $9 ' echo REM set "JAVA_OPTS=%JAVA_OPTS%">>"%ENV_FILE%"$\r$\n'
|
||||
FileWrite $9 ' echo.>>"%ENV_FILE%"$\r$\n'
|
||||
FileWrite $9 ')$\r$\n'
|
||||
FileWrite $9 '$\r$\n'
|
||||
FileWrite $9 'start "" "%JAVA%" %JAVA_OPTS% -Xmx%MAX_MEM% -jar "%ATCS_DIR%\ATCS.jar"$\r$\n'
|
||||
FileClose $9
|
||||
|
||||
SetOutPath "$INSTDIR\lib\"
|
||||
file "jide-oss.jar"
|
||||
file "ui.jar"
|
||||
file "AndorsTrainer_v0.1.2.jar"
|
||||
file "junit-4.10.jar"
|
||||
file "json_simple-1.1.jar"
|
||||
file "ATCS_v${VERSION}.jar"
|
||||
file "rsyntaxtextarea.jar"
|
||||
file "prefuse.jar"
|
||||
file "bsh-2.0b4.jar"
|
||||
|
||||
SetOutPath $INSTDIR
|
||||
|
||||
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
||||
|
||||
|
||||
|
||||
|
||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN "ATCS"
|
||||
|
||||
;Create shortcuts
|
||||
|
||||
;--- Create shortcuts
|
||||
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
|
||||
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Andor's Trail Content Studio.lnk" "$INSTDIR\ATCS.cmd" "" "$INSTDIR\ATCS.ico"
|
||||
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
||||
|
||||
|
||||
!insertmacro MUI_STARTMENU_WRITE_END
|
||||
|
||||
|
||||
SectionEnd
|
||||
|
||||
|
||||
;------------------------------------------------------------------------------------
|
||||
Section uninstall
|
||||
|
||||
|
||||
Delete "$INSTDIR\lib\jide-oss.jar"
|
||||
Delete "$INSTDIR\lib\ui.jar"
|
||||
Delete "$INSTDIR\lib\junit-4.10.jar"
|
||||
Delete "$INSTDIR\lib\json_simple-1.1.jar"
|
||||
Delete "$INSTDIR\lib\AndorsTrainer_v0.1.2.jar"
|
||||
Delete "$INSTDIR\lib\ATCS_v${VERSION}.jar"
|
||||
Delete "$INSTDIR\lib\AndorsTrainer_v${TRAINER_VERSION}.jar"
|
||||
Delete "$INSTDIR\lib\rsyntaxtextarea.jar"
|
||||
Delete "$INSTDIR\lib\prefuse.jar"
|
||||
Delete "$INSTDIR\lib\bsh-2.0b4.jar"
|
||||
Delete "$INSTDIR\lib\jsoup-1.10.2.jar"
|
||||
RMDir "$INSTDIR\lib\"
|
||||
|
||||
Delete "$INSTDIR\ATCS.ico"
|
||||
Delete "$INSTDIR\ATCS.cmd"
|
||||
|
||||
Delete "$INSTDIR\ATCS.env.bat"
|
||||
Delete "$INSTDIR\ATCS.jar"
|
||||
Delete "$INSTDIR\Uninstall.exe"
|
||||
|
||||
RMDir "$INSTDIR"
|
||||
|
||||
|
||||
!insertmacro MUI_STARTMENU_GETFOLDER "ATCS" $StartMenuFolder
|
||||
|
||||
|
||||
Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk"
|
||||
Delete "$SMPROGRAMS\$StartMenuFolder\Andor's Trail Content Studio.lnk"
|
||||
RMDir "$SMPROGRAMS\$StartMenuFolder"
|
||||
|
||||
|
||||
SectionEnd
|
||||
|
||||
|
||||
;------------------------------------------------------------------------------------
|
||||
Function GetJRE
|
||||
;
|
||||
; Find JRE (javaw.exe)
|
||||
; Find JRE (java.exe)
|
||||
; DISABLED 1 - in .\jre directory (JRE Installed with application)
|
||||
; 2 - in JAVA_HOME environment variable
|
||||
; 3 - in the registry
|
||||
; 4 - assume javaw.exe in current dir or PATH
|
||||
|
||||
; 4 - assume java.exe in current dir or PATH
|
||||
|
||||
Push $R0
|
||||
Push $R1
|
||||
|
||||
|
||||
;ClearErrors
|
||||
;StrCpy $R0 "$EXEDIR\jre\bin\javaw.exe"
|
||||
;StrCpy $R0 "$EXEDIR\jre\bin\java.exe"
|
||||
;IfFileExists $R0 JreFound
|
||||
;StrCpy $R0 ""
|
||||
|
||||
|
||||
ClearErrors
|
||||
ReadEnvStr $R0 "JAVA_HOME"
|
||||
StrCpy $R0 "$R0\bin\${JAVA_BIN}.exe"
|
||||
IfErrors 0 JreFound
|
||||
|
||||
|
||||
ClearErrors
|
||||
ReadRegStr $R1 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion"
|
||||
ReadRegStr $R0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment\$R1" "JavaHome"
|
||||
StrCpy $R0 "$R0\bin\${JAVA_BIN}.exe"
|
||||
|
||||
|
||||
IfErrors 0 JreFound
|
||||
StrCpy $R0 "${JAVA_BIN}.exe"
|
||||
|
||||
|
||||
JreFound:
|
||||
Pop $R1
|
||||
Exch $R0
|
||||
FunctionEnd
|
||||
FunctionEnd
|
||||
|
||||
20
packaging/common/ATCS.cmd
Normal file
@@ -0,0 +1,20 @@
|
||||
@echo off
|
||||
|
||||
set "ATCS_DIR=%~dp0"
|
||||
set "MAX_MEM=1024M"
|
||||
REM required minimum java version is 11
|
||||
set "JAVA=java.exe"
|
||||
set "JAVA_OPTS=-DFONT_SCALE=1.0 -Dswing.aatext=true"
|
||||
set "ENV_FILE=%ATCS_DIR%ATCS.env.bat"
|
||||
|
||||
if exist "%ENV_FILE%" (
|
||||
call "%ENV_FILE%"
|
||||
) else (
|
||||
echo REM set "MAX_MEM=%MAX_MEM%">"%ENV_FILE%"
|
||||
echo REM required minimum java version is 11
|
||||
echo REM set "JAVA=%JAVA%">>"%ENV_FILE%"
|
||||
echo REM set "JAVA_OPTS=%JAVA_OPTS%">>"%ENV_FILE%"
|
||||
echo.>>"%ENV_FILE%"
|
||||
)
|
||||
|
||||
start "" "%JAVA%" %JAVA_OPTS% -Xmx%MAX_MEM% -jar "%ATCS_DIR%\ATCS.jar"
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
28
packaging/common/ATCS.sh
Executable file
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# get the directory of this script
|
||||
ATCS_DIR="$(dirname "$(readlink -f "$0" || greadlink -f "$0" || stat -f "$0")")"
|
||||
echo "ATCS_DIR: '${ATCS_DIR}'"
|
||||
|
||||
MAX_MEM="512M"
|
||||
JAVA="java" # minimum required version is Java 11
|
||||
JAVA_OPTS='-DFONT_SCALE=1.0 -Dswing.aatext=true'
|
||||
|
||||
ENV_FILE="${ATCS_DIR}/ATCS.env"
|
||||
|
||||
if [ -f "${ENV_FILE}" ]; then
|
||||
source "${ENV_FILE}"
|
||||
else
|
||||
{
|
||||
echo "#MAX_MEM=\"${MAX_MEM}\""
|
||||
echo "#JAVA=\"${JAVA}\" # minimum required version is Java 11"
|
||||
echo "#JAVA_OPTS=\"${JAVA_OPTS}\""
|
||||
echo ""
|
||||
}>"${ENV_FILE}"
|
||||
fi
|
||||
|
||||
export ENV_FILE
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
# (spellchecker is disabled for this line, because we want it to be split into multiple arguments)
|
||||
$JAVA ${JAVA_OPTS} -Xmx${MAX_MEM} -jar "${ATCS_DIR}/ATCS.jar"
|
||||
1
packaging/package-windows.sh
Normal file
@@ -0,0 +1 @@
|
||||
sh ./package.sh -windows
|
||||
125
packaging/package.sh
Executable file
@@ -0,0 +1,125 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script to build ATCS.jar, replicating IntelliJ artifact definition
|
||||
# Linux and Windows compatible
|
||||
|
||||
# --- Platform Detection ---
|
||||
if [ "$1" = "-windows" ]; then
|
||||
echo "Got '-windows' flag. Running Windows version"
|
||||
PLATFORM="WINDOWS"
|
||||
else
|
||||
echo "No '-windows' flag. Running Linux version"
|
||||
PLATFORM="LINUX"
|
||||
fi
|
||||
|
||||
# --- Configuration ---
|
||||
PACKAGING_DIR=$(dirname "$(readlink -f "$0" || greadlink -f "$0" || stat -f "$0")") # Directory of this script
|
||||
ATCS_SOURCE_DIR=$(dirname "${PACKAGING_DIR}") # Parent directory of this script, assumed to be ATCS source root
|
||||
TEMP_DIR="${PACKAGING_DIR}/tmp"
|
||||
JAR_LOCATION="${PACKAGING_DIR}/ATCS.jar" # Output JAR location as per script
|
||||
MANIFEST_LOCATION="${PACKAGING_DIR}/Manifest.txt"
|
||||
VERSION_FILE="${ATCS_SOURCE_DIR}/res/ATCS_latest"
|
||||
SOURCE_BASE_DIR="${ATCS_SOURCE_DIR}/src" # Base directory for standard source code
|
||||
LIB_BASE_DIR="${ATCS_SOURCE_DIR}/lib" # Base directory for libraries
|
||||
|
||||
# --- **ADDITIONAL SOURCE CODE FOLDERS** ---
|
||||
EXTRA_SOURCE_DIRS=(
|
||||
"hacked-libtiled"
|
||||
"minify"
|
||||
"siphash-zackehh/src/main/java"
|
||||
)
|
||||
|
||||
# --- Libraries to include ---
|
||||
LIBRARIES=(
|
||||
"bsh-2.0b4.jar"
|
||||
"jide-oss.jar"
|
||||
"json_simple-1.1.jar"
|
||||
"jsoup-1.10.2.jar"
|
||||
"junit-4.10.jar"
|
||||
"prefuse.jar"
|
||||
"rsyntaxtextarea.jar"
|
||||
"ui.jar"
|
||||
)
|
||||
|
||||
# --- Get version ---
|
||||
echo "Getting version"
|
||||
VERSION=$(tr -d '[:space:]' < "${VERSION_FILE}")
|
||||
echo "Got version ${VERSION}"
|
||||
|
||||
# --- Prepare temporary directory ---
|
||||
echo "Removing tmp folder"
|
||||
rm -rf "${TEMP_DIR}"
|
||||
echo "Recreating tmp folder"
|
||||
mkdir -p "${TEMP_DIR}"
|
||||
|
||||
# --- **EXTRACT lib files directly to TEMP_DIR** ---
|
||||
echo 'Extracting lib files to TEMP_DIR'
|
||||
for LIB in "${LIBRARIES[@]}"; do
|
||||
echo "Extracting library: ${LIB}"
|
||||
unzip -qo "${LIB_BASE_DIR}/${LIB}" -d "${TEMP_DIR}" # Extract JAR contents to TEMP_DIR root
|
||||
done
|
||||
|
||||
# --- Set ClassPath ---
|
||||
echo "Getting source files"
|
||||
# Find all java files in source directories
|
||||
SOURCE_FILES=$(find "${SOURCE_BASE_DIR}" "${EXTRA_SOURCE_DIRS[@]/#/${ATCS_SOURCE_DIR}/}" -name "*.java" -print)
|
||||
#echo "SourceFiles: ${SOURCE_FILES}"
|
||||
echo ""
|
||||
|
||||
# --- Build Java classes ---
|
||||
echo 'Building java classes'
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
# (we need word splitting here to pass multiple files)
|
||||
javac -cp "${TEMP_DIR}" -d "${TEMP_DIR}" ${SOURCE_FILES}
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Compilation failed. Please check errors above."
|
||||
exit 1
|
||||
fi
|
||||
echo "Compilation successful"
|
||||
|
||||
# --- Copy res stuff to temp folder ---
|
||||
echo "Copying some stuff to temp folder"
|
||||
cp -r "${ATCS_SOURCE_DIR}"/res/* "${TEMP_DIR}/"
|
||||
mkdir -p "${TEMP_DIR}/com/gpl/rpg/atcontentstudio/img"
|
||||
mkdir -p "${TEMP_DIR}/tiled/io/resources/"
|
||||
cp -r "${ATCS_SOURCE_DIR}"/src/com/gpl/rpg/atcontentstudio/img/* "${TEMP_DIR}/com/gpl/rpg/atcontentstudio/img/" # some icons
|
||||
cp -r "${ATCS_SOURCE_DIR}"/hacked-libtiled/tiled/io/resources/* "${TEMP_DIR}/tiled/io/resources/" # dtd file for tmx maps
|
||||
cp "${VERSION_FILE}" "${TEMP_DIR}/" # Copy version file
|
||||
|
||||
# --- Create JAR file ---
|
||||
echo ""
|
||||
echo "Creating jar at location: ${JAR_LOCATION}"
|
||||
|
||||
cd "${TEMP_DIR}" || exit # Change to temp dir for JAR command
|
||||
|
||||
# JAR command WITHOUT lib directory
|
||||
jar cfm "${JAR_LOCATION}" "${MANIFEST_LOCATION}" -C . .
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "JAR creation failed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "${PACKAGING_DIR}" || exit # Go back to packaging dir
|
||||
|
||||
echo ''
|
||||
echo "Done creating jar at ${JAR_LOCATION}"
|
||||
cp -f "${JAR_LOCATION}" "${PACKAGING_DIR}/common/ATCS.jar" # Copy JAR to versioned name
|
||||
|
||||
# --- Create archive ---
|
||||
cd "${PACKAGING_DIR}" || exit
|
||||
echo "Creating archive"
|
||||
if [ "$PLATFORM" = "WINDOWS" ]; then
|
||||
# Use PowerShell's Compress-Archive which is available by default on Windows
|
||||
powershell.exe -Command "Compress-Archive -Path './common/*' -DestinationPath './ATCS_${VERSION}.zip' -Force"
|
||||
else
|
||||
# Use zip command on Linux
|
||||
zip -r "ATCS_${VERSION}.zip" common/* # archive the 'common' folder which now contains the JAR and libs
|
||||
fi
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Archive creation failed."
|
||||
exit 1
|
||||
fi
|
||||
echo "Created archive at ${PACKAGING_DIR}/ATCS_${VERSION}.zip"
|
||||
|
||||
echo "Script finished."
|
||||
1
res/ATCS_latest
Normal file
@@ -0,0 +1 @@
|
||||
v0.6.24
|
||||
21
res/LICENSE.jsoup.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License
|
||||
|
||||
© 2009-2017, Jonathan Hedley <jonathan@hedley.net>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
43
res/LICENSE.minify.txt
Normal file
@@ -0,0 +1,43 @@
|
||||
|
||||
----------------------
|
||||
Minify.java 2015-10-04
|
||||
----------------------
|
||||
|
||||
Copyright (c) 2015 Charles Bihis (www.whoischarles.com)
|
||||
|
||||
This work is an adaptation of JSMin.java published by John Reilly which is a translation from C to Java of jsmin.c
|
||||
published by Douglas Crockford. Permission is hereby granted to use this Java version under the same conditions as
|
||||
the original jsmin.c on which all of these derivatives are based.
|
||||
|
||||
|
||||
---------------------
|
||||
JSMin.java 2006-02-13
|
||||
---------------------
|
||||
|
||||
Copyright (c) 2006 John Reilly (www.inconspicuous.org)
|
||||
|
||||
This work is a translation from C to Java of jsmin.c published by Douglas Crockford. Permission is hereby granted to
|
||||
use the Java version under the same conditions as the jsmin.c on which it is based.
|
||||
|
||||
|
||||
|
||||
------------------
|
||||
jsmin.c 2003-04-21
|
||||
------------------
|
||||
|
||||
Copyright (c) 2002 Douglas Crockford (www.crockford.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
The Software shall be used for Good, not Evil.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
21
res/LICENSE.siphash-zackehh.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Isaac Whitfield
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,62 +1,94 @@
|
||||
atcs.spritesheet.actorconditions_1.category=actorcondition
|
||||
atcs.spritesheet.actorconditions_2.category=actorcondition
|
||||
atcs.spritesheet.actorconditions_japozero.category=actorcondition
|
||||
atcs.spritesheet.actorconditions_newb.category=actorcondition
|
||||
atcs.spritesheet.actorconditions_omi1.category=actorcondition
|
||||
atcs.spritesheet.actorconditions_omi2.category=actorcondition
|
||||
|
||||
atcs.spritesheet.effect_blood3.animate=true
|
||||
atcs.spritesheet.effect_blood4.animate=true
|
||||
atcs.spritesheet.effect_bluetentacle.animate=true
|
||||
atcs.spritesheet.effect_heal2.animate=true
|
||||
atcs.spritesheet.effect_miss1.animate=true
|
||||
atcs.spritesheet.effect_poison1.animate=true
|
||||
atcs.spritesheet.effect_tometik1.animate=true
|
||||
atcs.spritesheet.effect_tometik2.animate=true
|
||||
|
||||
atcs.spritesheet.items_armours.category=item
|
||||
atcs.spritesheet.items_armours_2.category=item
|
||||
atcs.spritesheet.items_armours_3.category=item
|
||||
atcs.spritesheet.items_weapons.category=item
|
||||
atcs.spritesheet.items_weapons_2.category=item
|
||||
atcs.spritesheet.items_weapons_3.category=item
|
||||
atcs.spritesheet.items_jewelry.category=item
|
||||
atcs.spritesheet.items_rings_1.category=item
|
||||
atcs.spritesheet.items_necklaces_1.category=item
|
||||
atcs.spritesheet.items_consumables.category=item
|
||||
atcs.spritesheet.items_books.category=item
|
||||
atcs.spritesheet.items_consumables.category=item
|
||||
atcs.spritesheet.items_consumables_omi1.category=item
|
||||
atcs.spritesheet.items_feygard1.category=item
|
||||
atcs.spritesheet.items_g03_package_omi1.category=item
|
||||
atcs.spritesheet.items_japozero.category=item
|
||||
atcs.spritesheet.items_jewelry.category=item
|
||||
atcs.spritesheet.items_misc.category=item
|
||||
atcs.spritesheet.items_misc_2.category=item
|
||||
atcs.spritesheet.items_misc_3.category=item
|
||||
atcs.spritesheet.items_misc_4.category=item
|
||||
atcs.spritesheet.items_misc_5.category=item
|
||||
atcs.spritesheet.items_misc_6.category=item
|
||||
atcs.spritesheet.items_necklaces_1.category=item
|
||||
atcs.spritesheet.items_newb.category=item
|
||||
atcs.spritesheet.items_omgeeky.category=item
|
||||
atcs.spritesheet.items_omi2.category=item
|
||||
atcs.spritesheet.items_phoenix01.category=item
|
||||
atcs.spritesheet.items_reterski_1.category=item
|
||||
atcs.spritesheet.items_rijackson_1.category=item
|
||||
atcs.spritesheet.items_rings_1.category=item
|
||||
atcs.spritesheet.items_tometik1.category=item
|
||||
atcs.spritesheet.items_tometik2.category=item
|
||||
atcs.spritesheet.items_tometik3.category=item
|
||||
atcs.spritesheet.items_weapons.category=item
|
||||
atcs.spritesheet.items_weapons_2.category=item
|
||||
atcs.spritesheet.items_weapons_3.category=item
|
||||
|
||||
atcs.spritesheet.monsters_armor1.category=monster
|
||||
atcs.spritesheet.monsters_arulirs.category=monster
|
||||
|
||||
atcs.spritesheet.monsters_cats.category=monster
|
||||
atcs.spritesheet.monsters_dogs.category=monster
|
||||
atcs.spritesheet.monsters_eye1.category=monster
|
||||
atcs.spritesheet.monsters_eye2.category=monster
|
||||
atcs.spritesheet.monsters_eye3.category=monster
|
||||
atcs.spritesheet.monsters_eye4.category=monster
|
||||
atcs.spritesheet.monsters_fatboy73.category=monster
|
||||
atcs.spritesheet.monsters_ghost1.category=monster
|
||||
atcs.spritesheet.monsters_hydra1.category=monster
|
||||
atcs.spritesheet.monsters_hydra1.sizex=64
|
||||
atcs.spritesheet.monsters_hydra1.sizey=64
|
||||
|
||||
atcs.spritesheet.monsters_gisons.category=monster
|
||||
atcs.spritesheet.monsters_guynmart.category=monster
|
||||
|
||||
atcs.spritesheet.monsters_insects.category=monster
|
||||
atcs.spritesheet.monsters_johny.category=monster
|
||||
atcs.spritesheet.monsters_karvis1.category=monster
|
||||
atcs.spritesheet.monsters_karvis2.category=monster
|
||||
atcs.spritesheet.monsters_ld1.category=monster
|
||||
atcs.spritesheet.monsters_ld2.category=monster
|
||||
atcs.spritesheet.monsters_liches.category=monster
|
||||
atcs.spritesheet.monsters_mage.category=monster
|
||||
atcs.spritesheet.monsters_mage2.category=monster
|
||||
atcs.spritesheet.monsters_maksiu1.category=monster
|
||||
atcs.spritesheet.monsters_man1.category=monster
|
||||
atcs.spritesheet.monsters_men.category=monster
|
||||
atcs.spritesheet.monsters_men2.category=monster
|
||||
atcs.spritesheet.monsters_misc.category=monster
|
||||
atcs.spritesheet.monsters_newb_1.category=monster
|
||||
atcs.spritesheet.monsters_omi1.category=monster
|
||||
atcs.spritesheet.monsters_omi1_b.category=monster
|
||||
atcs.spritesheet.monsters_omi2.category=monster
|
||||
atcs.spritesheet.monsters_phoenix01.category=monster
|
||||
atcs.spritesheet.monsters_rats.category=monster
|
||||
atcs.spritesheet.monsters_rogue1.category=monster
|
||||
atcs.spritesheet.monsters_skeleton1.category=monster
|
||||
atcs.spritesheet.monsters_skeleton2.category=monster
|
||||
atcs.spritesheet.monsters_snakes.category=monster
|
||||
atcs.spritesheet.monsters_warrior1.category=monster
|
||||
atcs.spritesheet.monsters_wraiths.category=monster
|
||||
atcs.spritesheet.monsters_zombie1.category=monster
|
||||
atcs.spritesheet.monsters_zombie2.category=monster
|
||||
atcs.spritesheet.monsters_karvis1.category=monster
|
||||
atcs.spritesheet.monsters_karvis2.category=monster
|
||||
atcs.spritesheet.monsters_redshrike1.category=monster
|
||||
atcs.spritesheet.monsters_rltiles1.category=monster
|
||||
atcs.spritesheet.monsters_rltiles2.category=monster
|
||||
atcs.spritesheet.monsters_rltiles3.category=monster
|
||||
atcs.spritesheet.monsters_rltiles4.category=monster
|
||||
atcs.spritesheet.monsters_redshrike1.category=monster
|
||||
atcs.spritesheet.monsters_ld1.category=monster
|
||||
atcs.spritesheet.monsters_ld2.category=monster
|
||||
atcs.spritesheet.monsters_rogue1.category=monster
|
||||
atcs.spritesheet.monsters_skeleton1.category=monster
|
||||
atcs.spritesheet.monsters_skeleton2.category=monster
|
||||
atcs.spritesheet.monsters_snakes.category=monster
|
||||
atcs.spritesheet.monsters_tometik1.category=monster
|
||||
atcs.spritesheet.monsters_tometik2.category=monster
|
||||
atcs.spritesheet.monsters_tometik3.category=monster
|
||||
@@ -67,19 +99,36 @@ atcs.spritesheet.monsters_tometik7.category=monster
|
||||
atcs.spritesheet.monsters_tometik8.category=monster
|
||||
atcs.spritesheet.monsters_tometik9.category=monster
|
||||
atcs.spritesheet.monsters_tometik10.category=monster
|
||||
atcs.spritesheet.monsters_warrior1.category=monster
|
||||
atcs.spritesheet.monsters_unknown.category=monster
|
||||
atcs.spritesheet.monsters_wraiths.category=monster
|
||||
atcs.spritesheet.monsters_zombie1.category=monster
|
||||
atcs.spritesheet.monsters_zombie2.category=monster
|
||||
|
||||
atcs.spritesheet.monsters_bosses_2x2.category=monster
|
||||
atcs.spritesheet.monsters_bosses_2x2.sizex=64
|
||||
atcs.spritesheet.monsters_bosses_2x2.sizey=64
|
||||
atcs.spritesheet.monsters_cyclops.category=monster
|
||||
atcs.spritesheet.monsters_cyclops.sizex=64
|
||||
atcs.spritesheet.monsters_cyclops.sizey=96
|
||||
atcs.spritesheet.monsters_demon1.category=monster
|
||||
atcs.spritesheet.monsters_demon1.sizex=64
|
||||
atcs.spritesheet.monsters_demon1.sizey=64
|
||||
atcs.spritesheet.monsters_demon2.category=monster
|
||||
atcs.spritesheet.monsters_demon2.sizex=64
|
||||
atcs.spritesheet.monsters_demon2.sizey=64
|
||||
atcs.spritesheet.monsters_cyclops.category=monster
|
||||
atcs.spritesheet.monsters_cyclops.sizex=64
|
||||
atcs.spritesheet.monsters_cyclops.sizey=96
|
||||
atcs.spritesheet.effect_blood3.animate=true
|
||||
atcs.spritesheet.effect_blood4.animate=true
|
||||
atcs.spritesheet.effect_bluetentacle.animate=true
|
||||
atcs.spritesheet.effect_heal2.animate=true
|
||||
atcs.spritesheet.effect_poison1.animate=true
|
||||
atcs.spritesheet.effect_tometik1.animate=true
|
||||
atcs.spritesheet.effect_tometik2.animate=true
|
||||
atcs.spritesheet.monsters_giantbasilisk.category=monster
|
||||
atcs.spritesheet.monsters_giantbasilisk.sizex=64
|
||||
atcs.spritesheet.monsters_giantbasilisk.sizey=64
|
||||
atcs.spritesheet.monsters_hydra1.category=monster
|
||||
atcs.spritesheet.monsters_hydra1.sizex=64
|
||||
atcs.spritesheet.monsters_hydra1.sizey=64
|
||||
atcs.spritesheet.monsters_newb_2.category=monster
|
||||
atcs.spritesheet.monsters_newb_2.sizex=64
|
||||
atcs.spritesheet.monsters_newb_2.sizey=32
|
||||
atcs.spritesheet.monsters_newb_3.category=monster
|
||||
atcs.spritesheet.monsters_newb_3.sizex=64
|
||||
atcs.spritesheet.monsters_newb_3.sizey=64
|
||||
atcs.spritesheet.monsters_newb_4.category=monster
|
||||
atcs.spritesheet.monsters_newb_4.sizex=32
|
||||
atcs.spritesheet.monsters_newb_4.sizey=64
|
||||
|
||||
19
siphash-zackehh/.gitignore
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
*.class
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.ear
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
|
||||
# IntelliJ
|
||||
.idea
|
||||
*.iml
|
||||
|
||||
# build
|
||||
target
|
||||
3
siphash-zackehh/.travis.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
language: java
|
||||
script:
|
||||
- mvn clean test jacoco:report coveralls:report
|
||||
21
siphash-zackehh/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Isaac Whitfield
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
77
siphash-zackehh/README.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# SipHash
|
||||
|
||||
[](https://travis-ci.org/zackehh/siphash-java) [](https://coveralls.io/github/zackehh/siphash-java?branch=master)
|
||||
|
||||
A Java implementation of the SipHash cryptographic hash family. Supports any variation, although defaults to the widely used SipHash-2-4. Can be used with either full input, or used as a streaming digest.
|
||||
|
||||
This library was heavily influenced by [veorq's C implementation](https://github.com/veorq/siphash) and [Forward C&C's reference implementation](http://www.forward.com.au/pfod/SipHashJavaLibrary/) - I just decided it was time a Java implementation of SipHash made it onto Maven :).
|
||||
|
||||
## Setup
|
||||
|
||||
`siphash` is available on Maven central, via Sonatype OSS:
|
||||
|
||||
```
|
||||
<dependency>
|
||||
<groupId>com.zackehh</groupId>
|
||||
<artifactId>siphash</artifactId>
|
||||
<version>1.0.0</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
There are two ways of using SipHash (see below). Both return a `SipHashResult` which can be used to retrieve the result in various forms. All constructors can take arguments to specify the compression rounds. For further usage, please visit the [documentation](http://www.javadoc.io/doc/com.zackehh/siphash).
|
||||
|
||||
#### Full Input Hash
|
||||
|
||||
The first is to simple create a `SipHash` instance and use it to repeatedly hash using the same key.
|
||||
|
||||
The internal state is immutable, so you can hash many inputs without having to recreate a new `SipHash` instance (unless you want a new key).
|
||||
|
||||
```java
|
||||
SipHash hasher = new SipHash("0123456789ABCDEF".getBytes());
|
||||
|
||||
SipHashResult result = hasher.hash("my-input".getBytes());
|
||||
|
||||
System.out.println(result.get()); // 182795880124085484 <-- this can overflow
|
||||
System.out.println(result.getHex()); // "2896be26d3374ec"
|
||||
System.out.println(result.getHex(true)); // "02896be26d3374ec"
|
||||
System.out.println(result.getHex(SipHashCase.UPPER)); // "2896BE26D3374EC"
|
||||
System.out.println(result.getHex(true, SipHashCase.UPPER)); // "02896BE26D3374EC"
|
||||
```
|
||||
|
||||
#### Streaming Hash
|
||||
|
||||
The second is to use the library as a streaming hash, meaning you can apply chunks of bytes to the hash as they become available.
|
||||
|
||||
Using this method you must create a new digest every time you want to hash a different input as the internal state is mutable.
|
||||
|
||||
```java
|
||||
SipHashDigest digest = new SipHashDigest("0123456789ABCDEF".getBytes());
|
||||
|
||||
digest.update("chu".getBytes());
|
||||
digest.update("nked".getBytes());
|
||||
digest.update(" string".getBytes());
|
||||
|
||||
SipHashResult result = digest.finish();
|
||||
|
||||
System.out.println(result.get()); // 3502906798476177428 <-- this can overflow
|
||||
System.out.println(result.getHex()); // "309cd32c8c793014"
|
||||
System.out.println(result.getHex(true)); // "309cd32c8c793014"
|
||||
System.out.println(result.getHex(SipHashCase.UPPER)); // "309CD32C8C793014"
|
||||
System.out.println(result.getHex(true, SipHashCase.UPPER)); // "309CD32C8C793014"
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
If you wish to contribute (awesome!), please file an issue first! All PRs should pass `mvn clean verify` and maintain 100% test coverage.
|
||||
|
||||
## Testing
|
||||
|
||||
Tests are run using `mvn`. I aim to maintain 100% coverage where possible (both line and branch).
|
||||
|
||||
Tests can be run as follows:
|
||||
|
||||
```bash
|
||||
$ mvn clean verify
|
||||
```
|
||||
171
siphash-zackehh/pom.xml
Normal file
@@ -0,0 +1,171 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.zackehh</groupId>
|
||||
<artifactId>siphash</artifactId>
|
||||
<version>1.1.0-SNAPSHOT</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>SipHash</name>
|
||||
<description>
|
||||
A SipHash implementation in Java.
|
||||
</description>
|
||||
<url>https://github.com/zackehh/siphash-java</url>
|
||||
|
||||
<properties>
|
||||
<jacoco.version>0.7.5.201505241946</jacoco.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<developers>
|
||||
<developer>
|
||||
<id>iwhitfield</id>
|
||||
<name>Isaac Whitfield</name>
|
||||
<email>iw@zackehh.com</email>
|
||||
<organization>Appcelerator, Inc.</organization>
|
||||
<organizationUrl>http://www.appcelerator.com</organizationUrl>
|
||||
</developer>
|
||||
</developers>
|
||||
|
||||
<scm>
|
||||
<connection>scm:git:git@github.com:zackehh/siphash-java.git</connection>
|
||||
<developerConnection>scm:git:git@github.com:zackehh/siphash-java.git</developerConnection>
|
||||
<url>git@github.com:zackehh/siphash-java.git</url>
|
||||
</scm>
|
||||
|
||||
<licenses>
|
||||
<license>
|
||||
<name>MIT License</name>
|
||||
<url>http://www.opensource.org/licenses/mit-license.php</url>
|
||||
</license>
|
||||
</licenses>
|
||||
|
||||
<distributionManagement>
|
||||
<snapshotRepository>
|
||||
<id>ossrh</id>
|
||||
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||
</snapshotRepository>
|
||||
<repository>
|
||||
<id>ossrh</id>
|
||||
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
|
||||
</repository>
|
||||
</distributionManagement>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.testng</groupId>
|
||||
<artifactId>testng</artifactId>
|
||||
<version>6.8.7</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>release</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<version>2.2.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-sources</id>
|
||||
<goals>
|
||||
<goal>jar-no-fork</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>2.9.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-javadocs</id>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-gpg-plugin</artifactId>
|
||||
<version>1.5</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>sign-artifacts</id>
|
||||
<phase>verify</phase>
|
||||
<goals>
|
||||
<goal>sign</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.sonatype.plugins</groupId>
|
||||
<artifactId>nexus-staging-maven-plugin</artifactId>
|
||||
<version>1.6.3</version>
|
||||
<extensions>true</extensions>
|
||||
<configuration>
|
||||
<serverId>ossrh</serverId>
|
||||
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
|
||||
<autoReleaseAfterClose>false</autoReleaseAfterClose>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.3</version>
|
||||
<configuration>
|
||||
<source>1.7</source>
|
||||
<target>1.7</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
<version>${jacoco.version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>prepare-agent</id>
|
||||
<goals>
|
||||
<goal>prepare-agent</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>report</id>
|
||||
<phase>prepare-package</phase>
|
||||
<goals>
|
||||
<goal>report</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.eluder.coveralls</groupId>
|
||||
<artifactId>coveralls-maven-plugin</artifactId>
|
||||
<version>4.1.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
111
siphash-zackehh/src/main/java/com/zackehh/siphash/SipHash.java
Normal file
@@ -0,0 +1,111 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
import static com.zackehh.siphash.SipHashConstants.DEFAULT_C;
|
||||
import static com.zackehh.siphash.SipHashConstants.DEFAULT_D;
|
||||
import static com.zackehh.siphash.SipHashConstants.INITIAL_V0;
|
||||
import static com.zackehh.siphash.SipHashConstants.INITIAL_V1;
|
||||
import static com.zackehh.siphash.SipHashConstants.INITIAL_V2;
|
||||
import static com.zackehh.siphash.SipHashConstants.INITIAL_V3;
|
||||
|
||||
/**
|
||||
* Main entry point for SipHash, providing a basic hash
|
||||
* interface. Assuming you have your full String to hash,
|
||||
* you can simply provide it to ${@link SipHash#hash(byte[])}.
|
||||
*
|
||||
* This class can be initialized and stored in case the
|
||||
* developer wishes to use the same key over and over again.
|
||||
*
|
||||
* This avoids the overhead of having to create the initial
|
||||
* key over and over again.
|
||||
*
|
||||
* <pre>
|
||||
* {@code
|
||||
* List<String> inputs = Arrays.asList("input1", "input2", "input3");
|
||||
* SipHash hasher = new SipHash("this key is mine".getBytes());
|
||||
* for (int i = 0; i < inputs.size(); i++) {
|
||||
* hasher.hash(inputs.get(i));
|
||||
* }
|
||||
* }
|
||||
* </pre>
|
||||
*/
|
||||
public class SipHash {
|
||||
|
||||
/**
|
||||
* The values of SipHash-c-d, to determine which of the SipHash
|
||||
* family we're using for this hash.
|
||||
*/
|
||||
private final int c, d;
|
||||
|
||||
/**
|
||||
* Initial seeded value of v0.
|
||||
*/
|
||||
private final long v0;
|
||||
|
||||
/**
|
||||
* Initial seeded value of v1.
|
||||
*/
|
||||
private final long v1;
|
||||
|
||||
/**
|
||||
* Initial seeded value of v2.
|
||||
*/
|
||||
private final long v2;
|
||||
|
||||
/**
|
||||
* Initial seeded value of v3.
|
||||
*/
|
||||
private final long v3;
|
||||
|
||||
/**
|
||||
* Accepts a 16 byte key input, and uses it to initialize
|
||||
* the state of the hash. This uses the default values of
|
||||
* c/d, meaning that we default to SipHash-2-4.
|
||||
*
|
||||
* @param key a 16 byte key input
|
||||
*/
|
||||
public SipHash(byte[] key){
|
||||
this(key, DEFAULT_C, DEFAULT_D);
|
||||
}
|
||||
|
||||
/**
|
||||
* Accepts a 16 byte key input, and uses it to initialize
|
||||
* the state of the hash. This constructor allows for
|
||||
* providing the c/d values, allowing the developer to
|
||||
* select any of the SipHash family to use for hashing.
|
||||
*
|
||||
* @param key a 16 byte key input
|
||||
* @param c the number of compression rounds
|
||||
* @param d the number of finalization rounds
|
||||
*/
|
||||
public SipHash(byte[] key, int c, int d){
|
||||
this.c = c;
|
||||
this.d = d;
|
||||
|
||||
SipHashKey hashKey = new SipHashKey(key);
|
||||
|
||||
this.v0 = (INITIAL_V0 ^ hashKey.k0);
|
||||
this.v1 = (INITIAL_V1 ^ hashKey.k1);
|
||||
this.v2 = (INITIAL_V2 ^ hashKey.k0);
|
||||
this.v3 = (INITIAL_V3 ^ hashKey.k1);
|
||||
}
|
||||
|
||||
/**
|
||||
* The basic hash implementation provided in the library.
|
||||
* Assuming you have your full input, you can provide it and
|
||||
* it will be hashed based on the values which were provided
|
||||
* to the constructor of this class.
|
||||
*
|
||||
* @param data the bytes to hash
|
||||
* @return a ${@link SipHashResult} instance
|
||||
*/
|
||||
public SipHashResult hash(byte[] data) {
|
||||
SipHashDigest digest = new SipHashDigest(v0, v1, v2, v3, c, d);
|
||||
|
||||
for (byte aData : data) {
|
||||
digest.update(aData);
|
||||
}
|
||||
|
||||
return digest.finish();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
/**
|
||||
* A basic enum to determine the case of a String.
|
||||
*
|
||||
* A String can either be UPPER or LOWER case.
|
||||
*/
|
||||
public enum SipHashCase { UPPER, LOWER }
|
||||
@@ -0,0 +1,63 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
/**
|
||||
* Class containing several constants for use alongside
|
||||
* hashing. Fields such as initial states and defaults,
|
||||
* as they will not change throughout hashing.
|
||||
*/
|
||||
class SipHashConstants {
|
||||
|
||||
/**
|
||||
* This constructor is private, nobody should be
|
||||
* accessing it!
|
||||
*
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
private SipHashConstants() throws IllegalAccessException {
|
||||
throw new IllegalAccessException();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initial magic number for v0.
|
||||
*/
|
||||
static final long INITIAL_V0 = 0x736f6d6570736575L;
|
||||
|
||||
/**
|
||||
* Initial magic number for v1.
|
||||
*/
|
||||
static final long INITIAL_V1 = 0x646f72616e646f6dL;
|
||||
|
||||
/**
|
||||
* Initial magic number for v2.
|
||||
*/
|
||||
static final long INITIAL_V2 = 0x6c7967656e657261L;
|
||||
|
||||
/**
|
||||
* Initial magic number for v3.
|
||||
*/
|
||||
static final long INITIAL_V3 = 0x7465646279746573L;
|
||||
|
||||
/**
|
||||
* The default number of rounds of compression during per block.
|
||||
* This defaults to 2 as the default implementation is SipHash-2-4.
|
||||
*/
|
||||
static final int DEFAULT_C = 2;
|
||||
|
||||
/**
|
||||
* The default number of rounds of compression during finalization.
|
||||
* This defaults to 4 as the default implementation is SipHash-2-4.
|
||||
*/
|
||||
static final int DEFAULT_D = 4;
|
||||
|
||||
/**
|
||||
* Whether or not we should pad any hashes by default.
|
||||
*/
|
||||
static final boolean DEFAULT_PADDING = false;
|
||||
|
||||
/**
|
||||
* The default String casing for any output Hex Strings. We default
|
||||
* to lower case as it's the least expensive path.
|
||||
*/
|
||||
static final SipHashCase DEFAULT_CASE = SipHashCase.LOWER;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,225 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
import static com.zackehh.siphash.SipHashConstants.DEFAULT_C;
|
||||
import static com.zackehh.siphash.SipHashConstants.DEFAULT_D;
|
||||
|
||||
/**
|
||||
* A streaming implementation of SipHash, to be used when
|
||||
* you don't have all input available at the same time. Chunks
|
||||
* of bytes can be applied as they're received, and will be hashed
|
||||
* accordingly.
|
||||
*
|
||||
* As with ${@link SipHash}, the compression and finalization rounds
|
||||
* can be customized.
|
||||
*/
|
||||
public class SipHashDigest {
|
||||
|
||||
/**
|
||||
* The values of SipHash-c-d, to determine which of the SipHash
|
||||
* family we're using for this hash.
|
||||
*/
|
||||
private final int c, d;
|
||||
|
||||
/**
|
||||
* Initial seeded value of v0.
|
||||
*/
|
||||
private long v0;
|
||||
|
||||
/**
|
||||
* Initial seeded value of v1.
|
||||
*/
|
||||
private long v1;
|
||||
|
||||
/**
|
||||
* Initial seeded value of v2.
|
||||
*/
|
||||
private long v2;
|
||||
|
||||
/**
|
||||
* Initial seeded value of v3.
|
||||
*/
|
||||
private long v3;
|
||||
|
||||
/**
|
||||
* A counter to keep track of the length of the input.
|
||||
*/
|
||||
private byte input_len = 0;
|
||||
|
||||
/**
|
||||
* A counter to keep track of the current position inside
|
||||
* of a chunk of bytes. Seeing as bytes are applied in chunks
|
||||
* of 8, this is necessary.
|
||||
*/
|
||||
private int m_idx = 0;
|
||||
|
||||
/**
|
||||
* The `m` value from the SipHash algorithm. Every 8 bytes, this
|
||||
* value will be applied to the current state of the hash.
|
||||
*/
|
||||
private long m;
|
||||
|
||||
/**
|
||||
* Accepts a 16 byte key input, and uses it to initialize
|
||||
* the state of the hash. This uses the default values of
|
||||
* c/d, meaning that we default to SipHash-2-4.
|
||||
*
|
||||
* @param key a 16 byte key input
|
||||
*/
|
||||
public SipHashDigest(byte[] key) {
|
||||
this(key, DEFAULT_C, DEFAULT_D);
|
||||
}
|
||||
|
||||
/**
|
||||
* Accepts a 16 byte key input, and uses it to initialize
|
||||
* the state of the hash. This constructor allows for
|
||||
* providing the c/d values, allowing the developer to
|
||||
* select any of the SipHash family to use for hashing.
|
||||
*
|
||||
* @param key a 16 byte key input
|
||||
* @param c the number of compression rounds
|
||||
* @param d the number of finalization rounds
|
||||
*/
|
||||
public SipHashDigest(byte[] key, int c, int d) {
|
||||
this.c = c;
|
||||
this.d = d;
|
||||
|
||||
SipHashKey hashKey = new SipHashKey(key);
|
||||
|
||||
this.v0 = SipHashConstants.INITIAL_V0 ^ hashKey.k0;
|
||||
this.v1 = SipHashConstants.INITIAL_V1 ^ hashKey.k1;
|
||||
this.v2 = SipHashConstants.INITIAL_V2 ^ hashKey.k0;
|
||||
this.v3 = SipHashConstants.INITIAL_V3 ^ hashKey.k1;
|
||||
}
|
||||
|
||||
/**
|
||||
* This constructor is used by the ${@link SipHash} implementation,
|
||||
* and takes an initial (seeded) value of v0/v1/v2/v3. This is used
|
||||
* when the key has been pre-calculated. This constructor also
|
||||
* receives the values of `c` and `d` to use in this hash.
|
||||
*
|
||||
* @param v0 an initial seeded v0
|
||||
* @param v1 an initial seeded v1
|
||||
* @param v2 an initial seeded v2
|
||||
* @param v3 an initial seeded v3
|
||||
* @param c the number of compression rounds
|
||||
* @param d the number of finalization rounds
|
||||
*/
|
||||
SipHashDigest(long v0, long v1, long v2, long v3, int c, int d) {
|
||||
this.c = c;
|
||||
this.d = d;
|
||||
|
||||
this.v0 = v0;
|
||||
this.v1 = v1;
|
||||
this.v2 = v2;
|
||||
this.v3 = v3;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the current state of the hash with a single byte. This
|
||||
* is the streaming implementation which shifts as required to ensure
|
||||
* we can take an arbitrary number of bytes at any given time. We only
|
||||
* apply the block once the index (`m_idx`) has reached 8. The number
|
||||
* of compression rounds is determined by the `c` value passed in by
|
||||
* the developer.
|
||||
*
|
||||
* This method returns this instance, as a way of allowing the developer
|
||||
* to chain.
|
||||
*
|
||||
* @return a ${@link SipHashDigest} instance
|
||||
*/
|
||||
public SipHashDigest update(byte b) {
|
||||
input_len++;
|
||||
m |= (((long) b & 0xff) << (m_idx * 8));
|
||||
m_idx++;
|
||||
if (m_idx >= 8) {
|
||||
v3 ^= m;
|
||||
for (int i = 0; i < c; i++) {
|
||||
round();
|
||||
}
|
||||
v0 ^= m;
|
||||
m_idx = 0;
|
||||
m = 0;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* A convenience method to allow passing a chunk of bytes at once, rather
|
||||
* than a byte at a time.
|
||||
*
|
||||
* @return a ${@link SipHashDigest} instance
|
||||
*/
|
||||
public SipHashDigest update(byte[] bytes) {
|
||||
for (byte b : bytes) {
|
||||
update(b);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finalizes the hash by padding 0s until the next multiple of
|
||||
* 8 (as we operate in 8 byte chunks). The last byte added to
|
||||
* the hash is the length of the input, which we keep inside the
|
||||
* `input_len` counter. The number of rounds is based on the value
|
||||
* of `d` as specified by the developer.
|
||||
*
|
||||
* This method returns a ${@link SipHashResult}, as no further updates
|
||||
* should occur (i.e. the lack of chaining here shows we're done).
|
||||
*
|
||||
* @return a ${@link SipHashResult} instance
|
||||
*/
|
||||
public SipHashResult finish() {
|
||||
byte msgLenMod256 = input_len;
|
||||
|
||||
while (m_idx < 7) {
|
||||
update((byte) 0);
|
||||
}
|
||||
update(msgLenMod256);
|
||||
|
||||
v2 ^= 0xff;
|
||||
for (int i = 0; i < d; i++) {
|
||||
round();
|
||||
}
|
||||
|
||||
return new SipHashResult(v0 ^ v1 ^ v2 ^ v3);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs the equivalent of SipRound on the provided state.
|
||||
* This method affects the state of this digest, in that it
|
||||
* mutates the v states directly.
|
||||
*/
|
||||
private void round() {
|
||||
v0 += v1;
|
||||
v2 += v3;
|
||||
v1 = rotateLeft(v1, 13);
|
||||
v3 = rotateLeft(v3, 16);
|
||||
|
||||
v1 ^= v0;
|
||||
v3 ^= v2;
|
||||
v0 = rotateLeft(v0, 32);
|
||||
|
||||
v2 += v1;
|
||||
v0 += v3;
|
||||
v1 = rotateLeft(v1, 17);
|
||||
v3 = rotateLeft(v3, 21);
|
||||
|
||||
v1 ^= v2;
|
||||
v3 ^= v0;
|
||||
v2 = rotateLeft(v2, 32);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rotates an input number `val` left by `shift` number of bits. Bits which are
|
||||
* pushed off to the left are rotated back onto the right, making this a left
|
||||
* rotation (a circular shift).
|
||||
*
|
||||
* @param val the value to be shifted
|
||||
* @param shift how far left to shift
|
||||
* @return a long value once shifted
|
||||
*/
|
||||
private long rotateLeft(long val, int shift) {
|
||||
return (val << shift) | val >>> (64 - shift);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
/**
|
||||
* A container class to store both k0 and k1. These
|
||||
* values are created from a 16 byte key passed into
|
||||
* the constructor. This isn't ideal as it's another
|
||||
* alloc, but it'll do for now.
|
||||
*/
|
||||
class SipHashKey {
|
||||
|
||||
/**
|
||||
* The value of k0.
|
||||
*/
|
||||
final long k0;
|
||||
|
||||
/**
|
||||
* The value of k1.
|
||||
*/
|
||||
final long k1;
|
||||
|
||||
/**
|
||||
* Accepts a 16 byte input key and converts the
|
||||
* first and last 8 byte chunks to little-endian.
|
||||
* These values become k0 and k1.
|
||||
*
|
||||
* @param key the 16 byte key input
|
||||
*/
|
||||
public SipHashKey(byte[] key) {
|
||||
if (key.length != 16) {
|
||||
throw new IllegalArgumentException("Key must be exactly 16 bytes!");
|
||||
}
|
||||
this.k0 = bytesToLong(key, 0);
|
||||
this.k1 = bytesToLong(key, 8);
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a chunk of 8 bytes to a number in little-endian
|
||||
* format. Accepts an offset to determine where the chunk
|
||||
* begins in the byte array.
|
||||
*
|
||||
* @param b our byte array
|
||||
* @param offset the index to start at
|
||||
* @return a little-endian long representation
|
||||
*/
|
||||
private static long bytesToLong(byte[] b, int offset) {
|
||||
long m = 0;
|
||||
for (int i = 0; i < 8; i++) {
|
||||
m |= ((((long) b[i + offset]) & 0xff) << (8 * i));
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
import static com.zackehh.siphash.SipHashConstants.DEFAULT_CASE;
|
||||
import static com.zackehh.siphash.SipHashConstants.DEFAULT_PADDING;
|
||||
|
||||
/**
|
||||
* A container class of the result of a hash. This class exists
|
||||
* to allow the developer to retrieve the result in any format
|
||||
* they like. Currently available formats are `long` and ${@link java.lang.String}.
|
||||
* When retrieving as a String, the developer can specify the case
|
||||
* they want it in, and whether or not we should pad the left side
|
||||
* to 16 characters with 0s.
|
||||
*/
|
||||
public class SipHashResult {
|
||||
|
||||
/**
|
||||
* The internal hash result.
|
||||
*/
|
||||
private final long result;
|
||||
|
||||
/**
|
||||
* A package-private constructor, as only
|
||||
* SipHash should be creating results.
|
||||
*
|
||||
* @param result the result of a hash
|
||||
*/
|
||||
SipHashResult(long result){
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Simply returns the hash result as a long.
|
||||
*
|
||||
* @return the hash value as a long
|
||||
*/
|
||||
public long get(){
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the result as a Hex String, using
|
||||
* the default padding and casing values.
|
||||
*
|
||||
* @return the hash value as a Hex String
|
||||
*/
|
||||
public String getHex(){
|
||||
return getHex(DEFAULT_PADDING, DEFAULT_CASE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the result as a Hex String, using
|
||||
* a custom padding value and default casing value.
|
||||
*
|
||||
* @param padding whether or not to pad the string
|
||||
* @return the hash value as a Hex String
|
||||
*/
|
||||
public String getHex(boolean padding){
|
||||
return getHex(padding, DEFAULT_CASE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the result as a Hex String, using
|
||||
* a default padding value and custom casing value.
|
||||
*
|
||||
* @param s_case the case to convert the output to
|
||||
* @return the hash value as a Hex String
|
||||
*/
|
||||
public String getHex(SipHashCase s_case){
|
||||
return getHex(DEFAULT_PADDING, s_case);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the result as a Hex String, taking in
|
||||
* various arguments to customize the output further,
|
||||
* such as casing and padding.
|
||||
*
|
||||
* @param padding whether or not to pad the string
|
||||
* @param s_case the case to convert the output to
|
||||
* @return a Hex String in the custom format
|
||||
*/
|
||||
public String getHex(boolean padding, SipHashCase s_case){
|
||||
String str = Long.toHexString(get());
|
||||
if (padding) {
|
||||
str = leftPad(str, 16, "0");
|
||||
}
|
||||
if (s_case == SipHashCase.UPPER) {
|
||||
str = str.toUpperCase();
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modified for https://github.com/Zukero/ATCS
|
||||
* Replaces the StringUtils.leftPad from apache commons, to remove dependency.
|
||||
*
|
||||
* @param str the string to pad
|
||||
* @param len the total desired length
|
||||
* @param pad the padding string
|
||||
* @return str prefixed with enough repetitions of the pad to have a total length matching len
|
||||
*/
|
||||
public String leftPad(String str, int len, String pad) {
|
||||
StringBuilder sb = new StringBuilder(len);
|
||||
|
||||
int padlen = len - str.length();
|
||||
int partialPadLen = padlen % pad.length();
|
||||
int padCount = padlen / pad.length();
|
||||
|
||||
while (padCount >= 0) {
|
||||
sb.append(pad);
|
||||
padCount--;
|
||||
}
|
||||
|
||||
if (partialPadLen > 0) {
|
||||
sb.append(pad.substring(0, partialPadLen));
|
||||
}
|
||||
|
||||
sb.append(str);
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
public class SipHashCaseTest {
|
||||
|
||||
@Test
|
||||
public void ensureAllValues() throws Exception {
|
||||
SipHashCase[] cases = SipHashCase.values();
|
||||
|
||||
Assert.assertEquals(cases[0], SipHashCase.UPPER);
|
||||
Assert.assertEquals(cases[1], SipHashCase.LOWER);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void ensureValueOf() throws Exception {
|
||||
Assert.assertEquals(SipHashCase.valueOf("UPPER"), SipHashCase.UPPER);
|
||||
Assert.assertEquals(SipHashCase.valueOf("LOWER"), SipHashCase.LOWER);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||
public void invalidCaseValueOf() throws Exception {
|
||||
SipHashCase.valueOf("invalid");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
public class SipHashConstantsTest {
|
||||
|
||||
@Test
|
||||
public void ensureAllConstants() throws Exception {
|
||||
Assert.assertEquals(SipHashConstants.INITIAL_V0, 0x736f6d6570736575L);
|
||||
Assert.assertEquals(SipHashConstants.INITIAL_V1, 0x646f72616e646f6dL);
|
||||
Assert.assertEquals(SipHashConstants.INITIAL_V2, 0x6c7967656e657261L);
|
||||
Assert.assertEquals(SipHashConstants.INITIAL_V3, 0x7465646279746573L);
|
||||
Assert.assertEquals(SipHashConstants.DEFAULT_C, 2);
|
||||
Assert.assertEquals(SipHashConstants.DEFAULT_D, 4);
|
||||
Assert.assertEquals(SipHashConstants.DEFAULT_CASE, SipHashCase.LOWER);
|
||||
Assert.assertEquals(SipHashConstants.DEFAULT_PADDING, false);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = InvocationTargetException.class)
|
||||
public void ensureCannotInstance() throws Exception {
|
||||
Constructor<SipHashConstants> ctor = SipHashConstants.class.getDeclaredConstructor();
|
||||
ctor.setAccessible(true);
|
||||
Assert.assertTrue(Modifier.isPrivate(ctor.getModifiers()));
|
||||
ctor.newInstance();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
public class SipHashDigestTest {
|
||||
|
||||
@Test
|
||||
public void initializeDigestWithKey() throws Exception {
|
||||
SipHashDigest sipHash = new SipHashDigest("0123456789ABCDEF".getBytes());
|
||||
|
||||
long v0 = SipHashTestUtils.getPrivateField(sipHash, "v0", Long.class);
|
||||
long v1 = SipHashTestUtils.getPrivateField(sipHash, "v1", Long.class);
|
||||
long v2 = SipHashTestUtils.getPrivateField(sipHash, "v2", Long.class);
|
||||
long v3 = SipHashTestUtils.getPrivateField(sipHash, "v3", Long.class);
|
||||
|
||||
Assert.assertEquals(v0, 4925064773550298181L);
|
||||
Assert.assertEquals(v1, 2461839666708829781L);
|
||||
Assert.assertEquals(v2, 6579568090023412561L);
|
||||
Assert.assertEquals(v3, 3611922228250500171L);
|
||||
|
||||
int c = SipHashTestUtils.getPrivateField(sipHash, "c", Integer.class);
|
||||
int d = SipHashTestUtils.getPrivateField(sipHash, "d", Integer.class);
|
||||
|
||||
Assert.assertEquals(c, SipHashConstants.DEFAULT_C);
|
||||
Assert.assertEquals(d, SipHashConstants.DEFAULT_D);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void initializeDigestWithKeyAndCD() throws Exception {
|
||||
SipHashDigest sipHash = new SipHashDigest("0123456789ABCDEF".getBytes(), 4, 8);
|
||||
|
||||
long v0 = SipHashTestUtils.getPrivateField(sipHash, "v0", Long.class);
|
||||
long v1 = SipHashTestUtils.getPrivateField(sipHash, "v1", Long.class);
|
||||
long v2 = SipHashTestUtils.getPrivateField(sipHash, "v2", Long.class);
|
||||
long v3 = SipHashTestUtils.getPrivateField(sipHash, "v3", Long.class);
|
||||
|
||||
Assert.assertEquals(v0, 4925064773550298181L);
|
||||
Assert.assertEquals(v1, 2461839666708829781L);
|
||||
Assert.assertEquals(v2, 6579568090023412561L);
|
||||
Assert.assertEquals(v3, 3611922228250500171L);
|
||||
|
||||
int c = SipHashTestUtils.getPrivateField(sipHash, "c", Integer.class);
|
||||
int d = SipHashTestUtils.getPrivateField(sipHash, "d", Integer.class);
|
||||
|
||||
Assert.assertEquals(c, 4);
|
||||
Assert.assertEquals(d, 8);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void initializeDigestWithKeyThenHash() throws Exception {
|
||||
SipHashDigest sipHash = new SipHashDigest("0123456789ABCDEF".getBytes());
|
||||
|
||||
long v0 = SipHashTestUtils.getPrivateField(sipHash, "v0", Long.class);
|
||||
long v1 = SipHashTestUtils.getPrivateField(sipHash, "v1", Long.class);
|
||||
long v2 = SipHashTestUtils.getPrivateField(sipHash, "v2", Long.class);
|
||||
long v3 = SipHashTestUtils.getPrivateField(sipHash, "v3", Long.class);
|
||||
|
||||
Assert.assertEquals(v0, 4925064773550298181L);
|
||||
Assert.assertEquals(v1, 2461839666708829781L);
|
||||
Assert.assertEquals(v2, 6579568090023412561L);
|
||||
Assert.assertEquals(v3, 3611922228250500171L);
|
||||
|
||||
int c = SipHashTestUtils.getPrivateField(sipHash, "c", Integer.class);
|
||||
int d = SipHashTestUtils.getPrivateField(sipHash, "d", Integer.class);
|
||||
|
||||
Assert.assertEquals(c, SipHashConstants.DEFAULT_C);
|
||||
Assert.assertEquals(d, SipHashConstants.DEFAULT_D);
|
||||
|
||||
for(byte b : "zymotechnics".getBytes()){
|
||||
sipHash.update(b);
|
||||
}
|
||||
|
||||
SipHashResult hashResult = sipHash.finish();
|
||||
|
||||
Assert.assertEquals(hashResult.get(), 699588702094987020L);
|
||||
Assert.assertEquals(hashResult.getHex(), "9b57037cd3f8f0c");
|
||||
Assert.assertEquals(hashResult.getHex(true), "09b57037cd3f8f0c");
|
||||
Assert.assertEquals(hashResult.getHex(SipHashCase.UPPER), "9B57037CD3F8F0C");
|
||||
Assert.assertEquals(hashResult.getHex(true, SipHashCase.UPPER), "09B57037CD3F8F0C");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void initializeStateWithKeyAndCDThenHash() throws Exception {
|
||||
SipHashDigest sipHash = new SipHashDigest("0123456789ABCDEF".getBytes(), 4, 8);
|
||||
|
||||
long v0 = SipHashTestUtils.getPrivateField(sipHash, "v0", Long.class);
|
||||
long v1 = SipHashTestUtils.getPrivateField(sipHash, "v1", Long.class);
|
||||
long v2 = SipHashTestUtils.getPrivateField(sipHash, "v2", Long.class);
|
||||
long v3 = SipHashTestUtils.getPrivateField(sipHash, "v3", Long.class);
|
||||
|
||||
Assert.assertEquals(v0, 4925064773550298181L);
|
||||
Assert.assertEquals(v1, 2461839666708829781L);
|
||||
Assert.assertEquals(v2, 6579568090023412561L);
|
||||
Assert.assertEquals(v3, 3611922228250500171L);
|
||||
|
||||
int c = SipHashTestUtils.getPrivateField(sipHash, "c", Integer.class);
|
||||
int d = SipHashTestUtils.getPrivateField(sipHash, "d", Integer.class);
|
||||
|
||||
Assert.assertEquals(c, 4);
|
||||
Assert.assertEquals(d, 8);
|
||||
|
||||
for(byte b : "zymotechnics".getBytes()){
|
||||
sipHash.update(b);
|
||||
}
|
||||
|
||||
SipHashResult hashResult = sipHash.finish();
|
||||
|
||||
Assert.assertEquals(hashResult.get(), -3891084581787974112L); // overflow
|
||||
Assert.assertEquals(hashResult.getHex(), "ca0017304f874620");
|
||||
Assert.assertEquals(hashResult.getHex(true), "ca0017304f874620");
|
||||
Assert.assertEquals(hashResult.getHex(SipHashCase.UPPER), "CA0017304F874620");
|
||||
Assert.assertEquals(hashResult.getHex(true, SipHashCase.UPPER), "CA0017304F874620");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateWithAByteArrayChunk() throws Exception {
|
||||
SipHashDigest sipHash = new SipHashDigest("0123456789ABCDEF".getBytes());
|
||||
|
||||
long v0 = SipHashTestUtils.getPrivateField(sipHash, "v0", Long.class);
|
||||
long v1 = SipHashTestUtils.getPrivateField(sipHash, "v1", Long.class);
|
||||
long v2 = SipHashTestUtils.getPrivateField(sipHash, "v2", Long.class);
|
||||
long v3 = SipHashTestUtils.getPrivateField(sipHash, "v3", Long.class);
|
||||
|
||||
Assert.assertEquals(v0, 4925064773550298181L);
|
||||
Assert.assertEquals(v1, 2461839666708829781L);
|
||||
Assert.assertEquals(v2, 6579568090023412561L);
|
||||
Assert.assertEquals(v3, 3611922228250500171L);
|
||||
|
||||
int c = SipHashTestUtils.getPrivateField(sipHash, "c", Integer.class);
|
||||
int d = SipHashTestUtils.getPrivateField(sipHash, "d", Integer.class);
|
||||
|
||||
Assert.assertEquals(c, SipHashConstants.DEFAULT_C);
|
||||
Assert.assertEquals(d, SipHashConstants.DEFAULT_D);
|
||||
|
||||
sipHash.update("zymo".getBytes());
|
||||
sipHash.update("techni".getBytes());
|
||||
sipHash.update("cs".getBytes());
|
||||
|
||||
SipHashResult hashResult = sipHash.finish();
|
||||
|
||||
Assert.assertEquals(hashResult.get(), 699588702094987020L);
|
||||
Assert.assertEquals(hashResult.getHex(), "9b57037cd3f8f0c");
|
||||
Assert.assertEquals(hashResult.getHex(true), "09b57037cd3f8f0c");
|
||||
Assert.assertEquals(hashResult.getHex(SipHashCase.UPPER), "9B57037CD3F8F0C");
|
||||
Assert.assertEquals(hashResult.getHex(true, SipHashCase.UPPER), "09B57037CD3F8F0C");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
public class SipHashKeyTest {
|
||||
|
||||
@Test
|
||||
public void initializeWithKey() throws Exception {
|
||||
SipHashKey key = new SipHashKey("0123456789ABCDEF".getBytes());
|
||||
|
||||
long k0 = SipHashTestUtils.getPrivateField(key, "k0", Long.class);
|
||||
long k1 = SipHashTestUtils.getPrivateField(key, "k1", Long.class);
|
||||
|
||||
Assert.assertEquals(k0, 3978425819141910832L);
|
||||
Assert.assertEquals(k1, 5063528411713059128L);
|
||||
}
|
||||
|
||||
@Test(
|
||||
expectedExceptions = IllegalArgumentException.class,
|
||||
expectedExceptionsMessageRegExp = "Key must be exactly 16 bytes!"
|
||||
)
|
||||
public void initializeWithKeyTooLong() throws Exception {
|
||||
new SipHashKey("0123456789ABCDEFG".getBytes()); // 17 bytes
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
public class SipHashTest {
|
||||
|
||||
@Test
|
||||
public void initializeStateWithKey() throws Exception {
|
||||
SipHash sipHash = new SipHash("0123456789ABCDEF".getBytes());
|
||||
|
||||
long v0 = SipHashTestUtils.getPrivateField(sipHash, "v0", Long.class);
|
||||
long v1 = SipHashTestUtils.getPrivateField(sipHash, "v1", Long.class);
|
||||
long v2 = SipHashTestUtils.getPrivateField(sipHash, "v2", Long.class);
|
||||
long v3 = SipHashTestUtils.getPrivateField(sipHash, "v3", Long.class);
|
||||
|
||||
Assert.assertEquals(v0, 4925064773550298181L);
|
||||
Assert.assertEquals(v1, 2461839666708829781L);
|
||||
Assert.assertEquals(v2, 6579568090023412561L);
|
||||
Assert.assertEquals(v3, 3611922228250500171L);
|
||||
|
||||
int c = SipHashTestUtils.getPrivateField(sipHash, "c", Integer.class);
|
||||
int d = SipHashTestUtils.getPrivateField(sipHash, "d", Integer.class);
|
||||
|
||||
Assert.assertEquals(c, SipHashConstants.DEFAULT_C);
|
||||
Assert.assertEquals(d, SipHashConstants.DEFAULT_D);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void initializeStateWithKeyAndCD() throws Exception {
|
||||
SipHash sipHash = new SipHash("0123456789ABCDEF".getBytes(), 4, 8);
|
||||
|
||||
long v0 = SipHashTestUtils.getPrivateField(sipHash, "v0", Long.class);
|
||||
long v1 = SipHashTestUtils.getPrivateField(sipHash, "v1", Long.class);
|
||||
long v2 = SipHashTestUtils.getPrivateField(sipHash, "v2", Long.class);
|
||||
long v3 = SipHashTestUtils.getPrivateField(sipHash, "v3", Long.class);
|
||||
|
||||
Assert.assertEquals(v0, 4925064773550298181L);
|
||||
Assert.assertEquals(v1, 2461839666708829781L);
|
||||
Assert.assertEquals(v2, 6579568090023412561L);
|
||||
Assert.assertEquals(v3, 3611922228250500171L);
|
||||
|
||||
int c = SipHashTestUtils.getPrivateField(sipHash, "c", Integer.class);
|
||||
int d = SipHashTestUtils.getPrivateField(sipHash, "d", Integer.class);
|
||||
|
||||
Assert.assertEquals(c, 4);
|
||||
Assert.assertEquals(d, 8);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void initializeStateWithKeyThenHash() throws Exception {
|
||||
SipHash sipHash = new SipHash("0123456789ABCDEF".getBytes());
|
||||
|
||||
long v0 = SipHashTestUtils.getPrivateField(sipHash, "v0", Long.class);
|
||||
long v1 = SipHashTestUtils.getPrivateField(sipHash, "v1", Long.class);
|
||||
long v2 = SipHashTestUtils.getPrivateField(sipHash, "v2", Long.class);
|
||||
long v3 = SipHashTestUtils.getPrivateField(sipHash, "v3", Long.class);
|
||||
|
||||
Assert.assertEquals(v0, 4925064773550298181L);
|
||||
Assert.assertEquals(v1, 2461839666708829781L);
|
||||
Assert.assertEquals(v2, 6579568090023412561L);
|
||||
Assert.assertEquals(v3, 3611922228250500171L);
|
||||
|
||||
int c = SipHashTestUtils.getPrivateField(sipHash, "c", Integer.class);
|
||||
int d = SipHashTestUtils.getPrivateField(sipHash, "d", Integer.class);
|
||||
|
||||
Assert.assertEquals(c, SipHashConstants.DEFAULT_C);
|
||||
Assert.assertEquals(d, SipHashConstants.DEFAULT_D);
|
||||
|
||||
SipHashResult hashResult = sipHash.hash("zymotechnics".getBytes());
|
||||
|
||||
Assert.assertEquals(hashResult.get(), 699588702094987020L);
|
||||
Assert.assertEquals(hashResult.getHex(), "9b57037cd3f8f0c");
|
||||
Assert.assertEquals(hashResult.getHex(true), "09b57037cd3f8f0c");
|
||||
Assert.assertEquals(hashResult.getHex(SipHashCase.UPPER), "9B57037CD3F8F0C");
|
||||
Assert.assertEquals(hashResult.getHex(true, SipHashCase.UPPER), "09B57037CD3F8F0C");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void initializeStateWithKeyAndCDThenHash() throws Exception {
|
||||
SipHash sipHash = new SipHash("0123456789ABCDEF".getBytes(), 4, 8);
|
||||
|
||||
long v0 = SipHashTestUtils.getPrivateField(sipHash, "v0", Long.class);
|
||||
long v1 = SipHashTestUtils.getPrivateField(sipHash, "v1", Long.class);
|
||||
long v2 = SipHashTestUtils.getPrivateField(sipHash, "v2", Long.class);
|
||||
long v3 = SipHashTestUtils.getPrivateField(sipHash, "v3", Long.class);
|
||||
|
||||
Assert.assertEquals(v0, 4925064773550298181L);
|
||||
Assert.assertEquals(v1, 2461839666708829781L);
|
||||
Assert.assertEquals(v2, 6579568090023412561L);
|
||||
Assert.assertEquals(v3, 3611922228250500171L);
|
||||
|
||||
int c = SipHashTestUtils.getPrivateField(sipHash, "c", Integer.class);
|
||||
int d = SipHashTestUtils.getPrivateField(sipHash, "d", Integer.class);
|
||||
|
||||
Assert.assertEquals(c, 4);
|
||||
Assert.assertEquals(d, 8);
|
||||
|
||||
SipHashResult hashResult = sipHash.hash("zymotechnics".getBytes());
|
||||
|
||||
Assert.assertEquals(hashResult.get(), -3891084581787974112L); // overflow
|
||||
Assert.assertEquals(hashResult.getHex(), "ca0017304f874620");
|
||||
Assert.assertEquals(hashResult.getHex(true), "ca0017304f874620");
|
||||
Assert.assertEquals(hashResult.getHex(SipHashCase.UPPER), "CA0017304F874620");
|
||||
Assert.assertEquals(hashResult.getHex(true, SipHashCase.UPPER), "CA0017304F874620");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.zackehh.siphash;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class SipHashTestUtils {
|
||||
|
||||
static <T> T getPrivateField(Object obj, String name, Class<T> clazz) throws Exception {
|
||||
Field f = obj.getClass().getDeclaredField(name);
|
||||
f.setAccessible(true);
|
||||
return clazz.cast(f.get(obj));
|
||||
}
|
||||
|
||||
}
|
||||
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,85 +1,254 @@
|
||||
package com.gpl.rpg.atcontentstudio;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.io.File;
|
||||
|
||||
import javax.swing.UIManager;
|
||||
import javax.swing.UnsupportedLookAndFeelException;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.Workspace;
|
||||
import com.gpl.rpg.atcontentstudio.ui.StudioFrame;
|
||||
import com.gpl.rpg.atcontentstudio.ui.WorkerDialog;
|
||||
import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector;
|
||||
|
||||
|
||||
public class ATContentStudio {
|
||||
|
||||
public static final String APP_NAME = "Andor's Trail Content Studio";
|
||||
public static final String APP_VERSION = "v0.4.7";
|
||||
|
||||
public static boolean STARTED = false;
|
||||
public static StudioFrame frame = null;
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
|
||||
ConfigCache.init();
|
||||
|
||||
try {
|
||||
String laf = ConfigCache.getFavoriteLaFClassName();
|
||||
if (laf == null) laf = UIManager.getSystemLookAndFeelClassName();
|
||||
UIManager.setLookAndFeel(laf);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InstantiationException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
} catch (UnsupportedLookAndFeelException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
final WorkspaceSelector wsSelect = new WorkspaceSelector();
|
||||
wsSelect.pack();
|
||||
Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
Dimension wdim = wsSelect.getSize();
|
||||
wsSelect.setLocation((sdim.width - wdim.width)/2, (sdim.height - wdim.height)/2);
|
||||
wsSelect.setVisible(true);
|
||||
|
||||
wsSelect.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public synchronized void windowClosed(WindowEvent e) {
|
||||
if (wsSelect.selected != null && !STARTED) {
|
||||
ATContentStudio.STARTED = true;
|
||||
final File workspaceRoot = new File(wsSelect.selected);
|
||||
WorkerDialog.showTaskMessage("Loading your workspace...", null, new Runnable(){
|
||||
public void run() {
|
||||
Workspace.setActive(workspaceRoot);
|
||||
frame = new StudioFrame(APP_NAME+" "+APP_VERSION);
|
||||
frame.setVisible(true);
|
||||
frame.setDefaultCloseOperation(StudioFrame.EXIT_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);
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
package com.gpl.rpg.atcontentstudio;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.Workspace;
|
||||
import com.gpl.rpg.atcontentstudio.ui.StudioFrame;
|
||||
import com.gpl.rpg.atcontentstudio.ui.WorkerDialog;
|
||||
import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector;
|
||||
import prefuse.data.expression.parser.ExpressionParser;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.HyperlinkEvent;
|
||||
import javax.swing.event.HyperlinkListener;
|
||||
import javax.swing.plaf.FontUIResource;
|
||||
import java.awt.*;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.net.http.HttpTimeoutException;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class ATContentStudio {
|
||||
|
||||
public static final String APP_NAME = "Andor's Trail Content Studio";
|
||||
public static final String APP_VERSION = readVersionFromFile();
|
||||
|
||||
public static final String CHECK_UPDATE_URL = "https://andorstrail.com/static/ATCS_latest";
|
||||
public static final String DOWNLOAD_URL = "https://andorstrail.com/viewtopic.php?f=6&t=4806";
|
||||
|
||||
public static final String FONT_SCALE_ENV_VAR_NAME = "FONT_SCALE";
|
||||
|
||||
public static boolean STARTED = false;
|
||||
public static float SCALING = 1.0f;
|
||||
public static StudioFrame frame = null;
|
||||
|
||||
// Need to keep a strong reference to it, to avoid garbage collection that'll
|
||||
// reset these loggers.
|
||||
public static final List<Logger> configuredLoggers = new LinkedList<Logger>();
|
||||
|
||||
/**
|
||||
* @param args
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
String fontScaling = System.getProperty(FONT_SCALE_ENV_VAR_NAME);
|
||||
Float fontScale;
|
||||
if (fontScaling != null) {
|
||||
try {
|
||||
fontScale = Float.parseFloat(fontScaling);
|
||||
SCALING = fontScale;
|
||||
} catch (NumberFormatException e) {
|
||||
System.err.println("Failed to parse font scaling parameter. Using default.");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
ConfigCache.init();
|
||||
|
||||
String laf = ConfigCache.getFavoriteLaFClassName();
|
||||
setLookAndFeel(laf);
|
||||
|
||||
// Need to keep a strong reference to it, to avoid garbage collection that'll
|
||||
// reset this setting.
|
||||
Logger l = Logger.getLogger(ExpressionParser.class.getName());
|
||||
l.setLevel(Level.OFF);
|
||||
configuredLoggers.add(l);
|
||||
|
||||
final WorkspaceSelector wsSelect = new WorkspaceSelector();
|
||||
wsSelect.pack();
|
||||
Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize();
|
||||
Dimension wdim = wsSelect.getSize();
|
||||
wsSelect.setLocation((sdim.width - wdim.width) / 2, (sdim.height - wdim.height) / 2);
|
||||
wsSelect.setVisible(true);
|
||||
|
||||
wsSelect.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public synchronized void windowClosed(WindowEvent e) {
|
||||
if (wsSelect.selected != null && !STARTED) {
|
||||
ATContentStudio.STARTED = true;
|
||||
final File workspaceRoot = new File(wsSelect.selected);
|
||||
WorkerDialog.showTaskMessage("Loading your workspace...", null, new Runnable() {
|
||||
public void run() {
|
||||
Workspace.setActive(workspaceRoot);
|
||||
if (Workspace.activeWorkspace.settings.useInternet.getCurrentValue()
|
||||
&& Workspace.activeWorkspace.settings.checkUpdates.getCurrentValue()) {
|
||||
new Thread() {
|
||||
public void run() {
|
||||
checkUpdate();
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
frame = new StudioFrame(APP_NAME + " " + APP_VERSION);
|
||||
frame.setVisible(true);
|
||||
frame.setDefaultCloseOperation(StudioFrame.DO_NOTHING_ON_CLOSE);
|
||||
}
|
||||
});
|
||||
for (File f : ConfigCache.getKnownWorkspaces()) {
|
||||
if (workspaceRoot.equals(f)) {
|
||||
if (!workspaceRoot.equals(ConfigCache.getLatestWorkspace())) {
|
||||
ConfigCache.setLatestWorkspace(f);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
ConfigCache.addWorkspace(workspaceRoot);
|
||||
ConfigCache.setLatestWorkspace(workspaceRoot);
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public static void setLookAndFeel(String laf) {
|
||||
if (laf == null)
|
||||
{
|
||||
System.out.println("No look and feel specified, using system default.");
|
||||
laf = UIManager.getSystemLookAndFeelClassName();
|
||||
}
|
||||
System.out.println("Info: Setting look and feel to: " + laf);
|
||||
|
||||
try {
|
||||
UIManager.setLookAndFeel(laf);
|
||||
} catch (ClassNotFoundException e) {
|
||||
System.err.println("Failed to load system look and feel. ");
|
||||
System.err.println("Installed look and feel classes: ");
|
||||
for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
|
||||
System.err.println(" " + info.getName() + " (" + info.getClassName() + ")");
|
||||
}
|
||||
System.err.println("Tried to load: " + laf + " but got this error:");
|
||||
|
||||
e.printStackTrace();
|
||||
} catch (InstantiationException | UnsupportedLookAndFeelException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
var newLaF = UIManager.getLookAndFeel();
|
||||
System.out.println("Using look and feel: " + newLaF.getName() + " (" + newLaF.getClass().getName() + ")");
|
||||
|
||||
scaleUIFont();
|
||||
}
|
||||
|
||||
private static void checkUpdate() {
|
||||
BufferedReader in = null;
|
||||
try {
|
||||
URL url = new URL(CHECK_UPDATE_URL);
|
||||
in = new BufferedReader(new InputStreamReader(url.openStream()));
|
||||
|
||||
String inputLine, lastLine = null;
|
||||
while ((inputLine = in.readLine()) != null) {
|
||||
lastLine = inputLine;
|
||||
}
|
||||
if (lastLine != null && !lastLine.equals(APP_VERSION)) {
|
||||
|
||||
// for copying style
|
||||
JLabel label = new JLabel();
|
||||
Font font = label.getFont();
|
||||
Color color = label.getBackground();
|
||||
|
||||
// create some css from the label's font
|
||||
StringBuffer style = new StringBuffer("font-family:" + font.getFamily() + ";");
|
||||
style.append("font-weight:" + (font.isBold() ? "bold" : "normal") + ";");
|
||||
style.append("font-size:" + font.getSize() + "pt;");
|
||||
style.append("background-color: rgb(" + color.getRed() + "," + color.getGreen() + "," + color.getBlue()
|
||||
+ ");");
|
||||
|
||||
JEditorPane ep = new JEditorPane("text/html",
|
||||
"<html><body style=\"" + style + "\">" + "You are not running the latest ATCS version.<br/>"
|
||||
+ "You can get the latest version (" + lastLine + ") by clicking the link below.<br/>"
|
||||
+ "<a href=\"" + DOWNLOAD_URL + "\">" + DOWNLOAD_URL + "</a><br/>" + "<br/>"
|
||||
+ "</body></html>");
|
||||
|
||||
ep.setEditable(false);
|
||||
ep.setBorder(null);
|
||||
|
||||
ep.addHyperlinkListener(new HyperlinkListener() {
|
||||
|
||||
@Override
|
||||
public void hyperlinkUpdate(HyperlinkEvent e) {
|
||||
try {
|
||||
if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) {
|
||||
Desktop.getDesktop().browse(e.getURL().toURI());
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
e1.printStackTrace();
|
||||
} catch (URISyntaxException e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
JOptionPane.showMessageDialog(null, ep, "Update available", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
} catch (MalformedURLException e) {
|
||||
e.printStackTrace();
|
||||
} catch (HttpTimeoutException e) {
|
||||
System.out.println("Could not connect to url to check for updates (timeout): " + CHECK_UPDATE_URL);
|
||||
} catch (IOException e) {
|
||||
if (e.getMessage() != null && e.getMessage().startsWith("Server returned HTTP response code:")) {
|
||||
System.out.println("Could not fetch current version from server to check for updates (non-success-status): " + e.getMessage());
|
||||
} else {
|
||||
System.out.println("Could not check for updates: '" + CHECK_UPDATE_URL + "' - " + e.getMessage());
|
||||
}
|
||||
} finally {
|
||||
try {
|
||||
if (in != null)
|
||||
in.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void scaleUIFont() {
|
||||
if (SCALING != 1.0f) {
|
||||
System.out.println("Scaling fonts to " + SCALING);
|
||||
UIDefaults defaults = UIManager.getLookAndFeelDefaults();
|
||||
Map<Object, Object> newDefaults = new HashMap<Object, Object>();
|
||||
for (Enumeration<Object> e = defaults.keys(); e.hasMoreElements(); ) {
|
||||
Object key = e.nextElement();
|
||||
Object value = defaults.get(key);
|
||||
if (value instanceof Font) {
|
||||
Font font = (Font) value;
|
||||
int newSize = (int) (font.getSize() * SCALING);
|
||||
if (value instanceof FontUIResource) {
|
||||
newDefaults.put(key, new FontUIResource(font.getName(), font.getStyle(), newSize));
|
||||
} else {
|
||||
newDefaults.put(key, new Font(font.getName(), font.getStyle(), newSize));
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Object key : newDefaults.keySet()) {
|
||||
defaults.put(key, newDefaults.get(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String readVersionFromFile() {
|
||||
try (BufferedReader reader = new BufferedReader(new InputStreamReader(
|
||||
Objects.requireNonNull(ATContentStudio.class.getResourceAsStream("/ATCS_latest"))))) {
|
||||
return reader.readLine();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,103 +1,104 @@
|
||||
package com.gpl.rpg.atcontentstudio;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.io.SettingsSave;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.io.SettingsSave;
|
||||
|
||||
public class ConfigCache implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 4584324644282843961L;
|
||||
|
||||
private static final File CONFIG_CACHE_STORAGE;
|
||||
|
||||
private static ConfigCache instance = null;
|
||||
private static final long serialVersionUID = 4584324644282843961L;
|
||||
|
||||
private static final File CONFIG_CACHE_STORAGE;
|
||||
|
||||
private static ConfigCache instance = null;
|
||||
|
||||
|
||||
static {
|
||||
if (System.getenv("APPDATA") != null) {
|
||||
CONFIG_CACHE_STORAGE = new File(System.getenv("APPDATA")+File.separator+ATContentStudio.APP_NAME+File.separator+"configCache" );
|
||||
} else {
|
||||
CONFIG_CACHE_STORAGE = new File(System.getenv("HOME")+File.separator+"."+ATContentStudio.APP_NAME+File.separator+"configCache" );
|
||||
}
|
||||
CONFIG_CACHE_STORAGE.getParentFile().mkdirs();
|
||||
if (CONFIG_CACHE_STORAGE.exists()) {
|
||||
ConfigCache.instance = (ConfigCache) SettingsSave.loadInstance(CONFIG_CACHE_STORAGE, "Configuration cache");
|
||||
if (ConfigCache.instance == null) {
|
||||
ConfigCache.instance = new ConfigCache();
|
||||
}
|
||||
} else {
|
||||
ConfigCache.instance = new ConfigCache();
|
||||
}
|
||||
}
|
||||
static {
|
||||
if (System.getenv("APPDATA") != null) {
|
||||
CONFIG_CACHE_STORAGE = new File(System.getenv("APPDATA") + File.separator + ATContentStudio.APP_NAME + File.separator + "configCache");
|
||||
} else {
|
||||
CONFIG_CACHE_STORAGE = new File(System.getenv("HOME") + File.separator + "." + ATContentStudio.APP_NAME + File.separator + "configCache");
|
||||
}
|
||||
CONFIG_CACHE_STORAGE.getParentFile().mkdirs();
|
||||
if (CONFIG_CACHE_STORAGE.exists()) {
|
||||
ConfigCache.instance = (ConfigCache) SettingsSave.loadInstance(CONFIG_CACHE_STORAGE, "Configuration cache");
|
||||
if (ConfigCache.instance == null) {
|
||||
ConfigCache.instance = new ConfigCache();
|
||||
}
|
||||
} else {
|
||||
ConfigCache.instance = new ConfigCache();
|
||||
}
|
||||
}
|
||||
|
||||
private void save() {
|
||||
SettingsSave.saveInstance(instance, ConfigCache.CONFIG_CACHE_STORAGE, "Configuration cache");
|
||||
}
|
||||
private void save() {
|
||||
SettingsSave.saveInstance(instance, ConfigCache.CONFIG_CACHE_STORAGE, "Configuration cache");
|
||||
}
|
||||
|
||||
|
||||
private List<File> knownWorkspaces = new ArrayList<File>();
|
||||
private File latestWorkspace = null;
|
||||
private String favoriteLaFClassName = null;
|
||||
private boolean[] notifConfig = new boolean[]{true, true, true, true};
|
||||
private List<File> knownWorkspaces = new ArrayList<File>();
|
||||
private File latestWorkspace = null;
|
||||
private String favoriteLaFClassName = null;
|
||||
private boolean[] notifConfig = new boolean[]{true, true, true, true};
|
||||
|
||||
|
||||
public static List<File> getKnownWorkspaces() {
|
||||
return instance.knownWorkspaces;
|
||||
}
|
||||
|
||||
public static void addWorkspace(File w) {
|
||||
instance.knownWorkspaces.add(w);
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static void removeWorkspace(File w) {
|
||||
instance.knownWorkspaces.remove(w);
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static File getLatestWorkspace() {
|
||||
return instance.latestWorkspace;
|
||||
}
|
||||
|
||||
public static void setLatestWorkspace(File latestWorkspace) {
|
||||
instance.latestWorkspace = latestWorkspace;
|
||||
instance.save();
|
||||
}
|
||||
public static List<File> getKnownWorkspaces() {
|
||||
return instance.knownWorkspaces;
|
||||
}
|
||||
|
||||
public static String getFavoriteLaFClassName() {
|
||||
return instance.favoriteLaFClassName;
|
||||
}
|
||||
|
||||
public static void setFavoriteLaFClassName(String favoriteLaFClassName) {
|
||||
instance.favoriteLaFClassName = favoriteLaFClassName;
|
||||
instance.save();
|
||||
}
|
||||
public static void addWorkspace(File w) {
|
||||
instance.knownWorkspaces.add(w);
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static void putNotifViewConfig(boolean[] view) {
|
||||
for (int i=instance.notifConfig.length; i<0; --i) {
|
||||
instance.notifConfig[i] = view[i];
|
||||
}
|
||||
instance.save();
|
||||
}
|
||||
public static void removeWorkspace(File w) {
|
||||
instance.knownWorkspaces.remove(w);
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static boolean[] getNotifViewConfig() {
|
||||
if (instance == null || instance.notifConfig == null) {
|
||||
//Not yet initialized. All flags on to help corner out init issues.
|
||||
return new boolean[]{true, true, true, true};
|
||||
}
|
||||
return instance.notifConfig;
|
||||
}
|
||||
public static File getLatestWorkspace() {
|
||||
return instance.latestWorkspace;
|
||||
}
|
||||
|
||||
public static void init() {}
|
||||
public static void setLatestWorkspace(File latestWorkspace) {
|
||||
instance.latestWorkspace = latestWorkspace;
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
instance.knownWorkspaces.clear();
|
||||
setFavoriteLaFClassName(null);
|
||||
instance.notifConfig = new boolean[]{true, true, true, true};
|
||||
instance.save();
|
||||
}
|
||||
public static String getFavoriteLaFClassName() {
|
||||
return instance.favoriteLaFClassName;
|
||||
}
|
||||
|
||||
public static void setFavoriteLaFClassName(String favoriteLaFClassName) {
|
||||
instance.favoriteLaFClassName = favoriteLaFClassName;
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static void putNotifViewConfig(boolean[] view) {
|
||||
for (int i = instance.notifConfig.length; i < 0; --i) {
|
||||
instance.notifConfig[i] = view[i];
|
||||
}
|
||||
instance.save();
|
||||
}
|
||||
|
||||
public static boolean[] getNotifViewConfig() {
|
||||
if (instance == null || instance.notifConfig == null) {
|
||||
//Not yet initialized. All flags on to help corner out init issues.
|
||||
return new boolean[]{true, true, true, true};
|
||||
}
|
||||
return instance.notifConfig;
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
instance.knownWorkspaces.clear();
|
||||
setFavoriteLaFClassName(null);
|
||||
instance.notifConfig = new boolean[]{true, true, true, true};
|
||||
instance.save();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,90 +2,91 @@ package com.gpl.rpg.atcontentstudio;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
public class Notification {
|
||||
|
||||
public static List<Notification> notifs = new ArrayList<Notification>();
|
||||
private static List<NotificationListener> listeners = new ArrayList<NotificationListener>();
|
||||
public static boolean showS = true, showI = true, showW = true, showE = true;
|
||||
|
||||
static {
|
||||
boolean[] config = ConfigCache.getNotifViewConfig();
|
||||
showS = config[0];
|
||||
showI = config[1];
|
||||
showW = config[2];
|
||||
showE = config[3];
|
||||
}
|
||||
|
||||
public static enum Type {
|
||||
SUCCESS,
|
||||
INFO,
|
||||
WARN,
|
||||
ERROR
|
||||
}
|
||||
|
||||
public Type type;
|
||||
public String text;
|
||||
|
||||
public Notification(Type type, String text) {
|
||||
this.type = type;
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "["+type.toString()+"] "+text;
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
int i = notifs.size();
|
||||
notifs.clear();
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onListCleared(i);
|
||||
}
|
||||
}
|
||||
public static List<Notification> notifs = new ArrayList<Notification>();
|
||||
private static List<NotificationListener> listeners = new CopyOnWriteArrayList<NotificationListener>();
|
||||
public static boolean showS, showI, showW, showE;
|
||||
|
||||
static {
|
||||
boolean[] config = ConfigCache.getNotifViewConfig();
|
||||
showS = config[0];
|
||||
showI = config[1];
|
||||
showW = config[2];
|
||||
showE = config[3];
|
||||
}
|
||||
|
||||
public static enum Type {
|
||||
SUCCESS,
|
||||
INFO,
|
||||
WARN,
|
||||
ERROR
|
||||
}
|
||||
|
||||
public Type type;
|
||||
public String text;
|
||||
|
||||
public Notification(Type type, String text) {
|
||||
this.type = type;
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "[" + type.toString() + "] " + text;
|
||||
}
|
||||
|
||||
public static void clear() {
|
||||
int i = notifs.size();
|
||||
notifs.clear();
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onListCleared(i);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addSuccess(String text) {
|
||||
if (!showS) return;
|
||||
Notification n = new Notification(Notification.Type.SUCCESS, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addInfo(String text) {
|
||||
if (!showI) return;
|
||||
Notification n = new Notification(Notification.Type.INFO, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addWarn(String text) {
|
||||
if (!showW) return;
|
||||
Notification n = new Notification(Notification.Type.WARN, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addError(String text) {
|
||||
if (!showE) return;
|
||||
Notification n = new Notification(Notification.Type.ERROR, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addNotificationListener(NotificationListener l) {
|
||||
listeners.add(l);
|
||||
}
|
||||
|
||||
public static void removeNotificationListener(NotificationListener l) {
|
||||
listeners.remove(l);
|
||||
}
|
||||
|
||||
public static void addSuccess(String text) {
|
||||
if (!showS) return;
|
||||
Notification n = new Notification(Notification.Type.SUCCESS, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addInfo(String text) {
|
||||
if (!showI) return;
|
||||
Notification n = new Notification(Notification.Type.INFO, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addWarn(String text) {
|
||||
if (!showW) return;
|
||||
Notification n = new Notification(Notification.Type.WARN, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addError(String text) {
|
||||
if (!showE) return;
|
||||
Notification n = new Notification(Notification.Type.ERROR, text);
|
||||
notifs.add(n);
|
||||
for (NotificationListener l : listeners) {
|
||||
l.onNewNotification(n);
|
||||
}
|
||||
}
|
||||
|
||||
public static void addNotificationListener(NotificationListener l) {
|
||||
listeners.add(l);
|
||||
}
|
||||
|
||||
public static void removeNotificationListener(NotificationListener l) {
|
||||
listeners.remove(l);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,7 +2,8 @@ package com.gpl.rpg.atcontentstudio;
|
||||
|
||||
public interface NotificationListener {
|
||||
|
||||
public void onNewNotification(Notification n);
|
||||
public void onListCleared(int i);
|
||||
|
||||
public void onNewNotification(Notification n);
|
||||
|
||||
public void onListCleared(int i);
|
||||
|
||||
}
|
||||
BIN
src/com/gpl/rpg/atcontentstudio/img/alignment.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
src/com/gpl/rpg/atcontentstudio/img/bonemeal.png
Normal file
|
After Width: | Height: | Size: 607 B |
BIN
src/com/gpl/rpg/atcontentstudio/img/bookmark_active.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
src/com/gpl/rpg/atcontentstudio/img/bookmark_inactive.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
src/com/gpl/rpg/atcontentstudio/img/date.png
Normal file
|
After Width: | Height: | Size: 275 B |
|
Before Width: | Height: | Size: 566 B |
BIN
src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_closed.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
src/com/gpl/rpg/atcontentstudio/img/folder_bookmark_open.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 278 B |
BIN
src/com/gpl/rpg/atcontentstudio/img/label.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/com/gpl/rpg/atcontentstudio/img/status_blue.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/com/gpl/rpg/atcontentstudio/img/status_green.png
Normal file
|
After Width: | Height: | Size: 1013 B |
BIN
src/com/gpl/rpg/atcontentstudio/img/status_orange.png
Normal file
|
After Width: | Height: | Size: 1023 B |
BIN
src/com/gpl/rpg/atcontentstudio/img/status_red.png
Normal file
|
After Width: | Height: | Size: 880 B |
BIN
src/com/gpl/rpg/atcontentstudio/img/status_unknown.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/com/gpl/rpg/atcontentstudio/img/time.png
Normal file
|
After Width: | Height: | Size: 703 B |
BIN
src/com/gpl/rpg/atcontentstudio/img/timer.png
Normal file
|
After Width: | Height: | Size: 881 B |
BIN
src/com/gpl/rpg/atcontentstudio/img/ui_icon_immunity.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/com/gpl/rpg/atcontentstudio/img/ui_icon_skill.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 481 B |
@@ -4,50 +4,50 @@ import java.io.StringWriter;
|
||||
|
||||
public class JsonPrettyWriter extends StringWriter {
|
||||
|
||||
private int indentLevel = 0;
|
||||
private String indentText = " ";
|
||||
|
||||
public JsonPrettyWriter() {
|
||||
super();
|
||||
}
|
||||
|
||||
public JsonPrettyWriter(String indent) {
|
||||
super();
|
||||
this.indentText = indent;
|
||||
}
|
||||
private int indentLevel = 0;
|
||||
private String indentText = " ";
|
||||
|
||||
@Override
|
||||
public void write(int c) {
|
||||
if (((char) c) == '[' || ((char) c) == '{') {
|
||||
super.write(c);
|
||||
super.write('\n');
|
||||
indentLevel++;
|
||||
writeIndentation();
|
||||
} else if (((char) c) == ',') {
|
||||
super.write(c);
|
||||
super.write('\n');
|
||||
writeIndentation();
|
||||
} else if (((char) c) == ']' || ((char) c) == '}') {
|
||||
super.write('\n');
|
||||
indentLevel--;
|
||||
writeIndentation();
|
||||
super.write(c);
|
||||
} else {
|
||||
super.write(c);
|
||||
}
|
||||
public JsonPrettyWriter() {
|
||||
super();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Horrible hack to remove the horrible escaping of slashes in json-simple....
|
||||
@Override
|
||||
public void write(String str) {
|
||||
super.write(str.replaceAll("\\\\/", "/"));
|
||||
}
|
||||
public JsonPrettyWriter(String indent) {
|
||||
super();
|
||||
this.indentText = indent;
|
||||
}
|
||||
|
||||
private void writeIndentation() {
|
||||
for (int i = 0; i < indentLevel; i++) {
|
||||
super.write(indentText);
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void write(int c) {
|
||||
if (((char) c) == '[' || ((char) c) == '{') {
|
||||
super.write(c);
|
||||
super.write('\n');
|
||||
indentLevel++;
|
||||
writeIndentation();
|
||||
} else if (((char) c) == ',') {
|
||||
super.write(c);
|
||||
super.write('\n');
|
||||
writeIndentation();
|
||||
} else if (((char) c) == ']' || ((char) c) == '}') {
|
||||
super.write('\n');
|
||||
indentLevel--;
|
||||
writeIndentation();
|
||||
super.write(c);
|
||||
} else {
|
||||
super.write(c);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Horrible hack to remove the horrible escaping of slashes in json-simple....
|
||||
@Override
|
||||
public void write(String str) {
|
||||
super.write(str.replaceAll("\\\\/", "/"));
|
||||
}
|
||||
|
||||
private void writeIndentation() {
|
||||
for (int i = 0; i < indentLevel; i++) {
|
||||
super.write(indentText);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
8
src/com/gpl/rpg/atcontentstudio/io/JsonSerializable.java
Normal file
@@ -0,0 +1,8 @@
|
||||
package com.gpl.rpg.atcontentstudio.io;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public interface JsonSerializable {
|
||||
Map toMap();
|
||||
void fromMap(Map map);
|
||||
}
|
||||
@@ -1,76 +1,70 @@
|
||||
package com.gpl.rpg.atcontentstudio.io;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.Notification;
|
||||
|
||||
import java.io.*;
|
||||
|
||||
public class SettingsSave {
|
||||
|
||||
public static void saveInstance(Object obj, File f, String type) {
|
||||
try {
|
||||
FileOutputStream fos = new FileOutputStream(f);
|
||||
try {
|
||||
ObjectOutputStream oos = new ObjectOutputStream(fos);
|
||||
oos.writeObject(obj);
|
||||
oos.flush();
|
||||
oos.close();
|
||||
Notification.addSuccess(type+" successfully saved.");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" saving error: "+e.getMessage());
|
||||
} finally {
|
||||
try {
|
||||
fos.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" saving error: "+e.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" saving error: "+e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static Object loadInstance(File f, String type) {
|
||||
FileInputStream fis;
|
||||
Object result = null;
|
||||
try {
|
||||
fis = new FileInputStream(f);
|
||||
ObjectInputStream ois;
|
||||
try {
|
||||
ois = new ObjectInputStream(fis);
|
||||
try {
|
||||
result = ois.readObject();
|
||||
Notification.addSuccess(type+" successfully loaded.");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" loading error: "+e.getMessage());
|
||||
} finally {
|
||||
ois.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" loading error: "+e.getMessage());
|
||||
} finally {
|
||||
try {
|
||||
fis.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" loading error: "+e.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type+" loading error: "+e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static void saveInstance(Object obj, File f, String type) {
|
||||
try {
|
||||
FileOutputStream fos = new FileOutputStream(f);
|
||||
try {
|
||||
ObjectOutputStream oos = new ObjectOutputStream(fos);
|
||||
oos.writeObject(obj);
|
||||
oos.flush();
|
||||
oos.close();
|
||||
Notification.addSuccess(type + " successfully saved.");
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " saving error: " + e.getMessage());
|
||||
} finally {
|
||||
try {
|
||||
fos.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " saving error: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " saving error: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static Object loadInstance(File f, String type) {
|
||||
FileInputStream fis;
|
||||
Object result = null;
|
||||
try {
|
||||
fis = new FileInputStream(f);
|
||||
ObjectInputStream ois;
|
||||
try {
|
||||
ois = new ObjectInputStream(fis);
|
||||
try {
|
||||
result = ois.readObject();
|
||||
Notification.addSuccess(type + " successfully loaded.");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " loading error: " + e.getMessage());
|
||||
} finally {
|
||||
ois.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " loading error: " + e.getMessage());
|
||||
} finally {
|
||||
try {
|
||||
fis.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " loading error: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
Notification.addError(type + " loading error: " + e.getMessage());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,119 +1,135 @@
|
||||
package com.gpl.rpg.atcontentstudio.model;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
|
||||
import com.gpl.rpg.atcontentstudio.model.GameSource.Type;
|
||||
import com.gpl.rpg.atcontentstudio.model.gamedata.GameDataSet;
|
||||
import com.gpl.rpg.atcontentstudio.ui.DefaultIcons;
|
||||
|
||||
import javax.swing.tree.TreeNode;
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
|
||||
public class ClosedProject implements ProjectTreeNode {
|
||||
|
||||
String name;
|
||||
Workspace parent;
|
||||
|
||||
public ClosedProject(Workspace w, String name) {
|
||||
this.parent = w;
|
||||
this.name = name;
|
||||
}
|
||||
String name;
|
||||
Workspace parent;
|
||||
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return 0;
|
||||
}
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0,this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
public ClosedProject(Workspace w, String name) {
|
||||
this.parent = w;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return name+" [closed]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public TreeNode getChildAt(int childIndex) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TreeNode getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIndex(TreeNode node) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getAllowsChildren() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enumeration<ProjectTreeNode> children() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenAdded(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenAdded(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenChanged(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenChanged(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void childrenRemoved(List<ProjectTreeNode> path) {
|
||||
path.add(0, this);
|
||||
parent.childrenRemoved(path);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void notifyCreated() {
|
||||
childrenAdded(new ArrayList<ProjectTreeNode>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDesc() {
|
||||
return name + " [closed]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Project getProject() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
@Override
|
||||
public Image getIcon() {
|
||||
return getOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getClosedIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getLeafIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdClosedIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Image getOpenIcon() {
|
||||
//TODO Create a cool Project icon.
|
||||
return DefaultIcons.getStdOpenIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameDataSet getDataSet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsSaving() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type getDataType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||