Compare commits

...

40 Commits

Author SHA1 Message Date
OMGeeky
5d5ca15669 sample 2024-01-10 19:16:12 +01:00
OMGeeky
4571bea429 fix missing " 2024-01-09 00:18:36 +01:00
OMGeeky
ecc9a35c69 Allow it to be ran on windows
(via Git-Bash)
2024-01-01 10:47:50 -08:00
OMGeeky
c4d71df4b1 Create a packaging script
This should create the zip file to distribute it
2023-12-31 14:06:31 +01:00
Nut.andor
a13dac467a Merge branch 'v0.6.20' 2023-12-26 00:43:43 +01:00
Nut.andor
e305dfd7bf new cats sprite 2023-12-26 00:35:59 +01:00
Nut.andor
80984a43af new Sprites (engine PR 59) 2023-10-03 21:20:32 +02:00
Nut.andor
2bc8b65264 version nbr 6.20
new requirements: date, dateEquals, time, timeEquals
new rewards: mapchange
2023-10-03 21:20:32 +02:00
Nut.andor
b2584a24cc export default 2023-09-24 00:25:29 +02:00
Nut.andor
1626a8340f Merge branch 'v0.6.19' 2023-09-10 19:32:25 +02:00
Nut.andor
5fe2dfe148 Merge branch 'pulls/1195352/4' into v0.6.19
Remove empty sprites from selection panel
2023-09-10 19:28:14 +02:00
Nut.andor
abc1e7c912 Ignore empty sprites in SpriteChooser 2023-09-10 19:23:30 +02:00
Nut.andor
317d6d4216 Let console open on start 2023-09-10 19:22:18 +02:00
Nut.andor
3628386019 Pull Request #4: Ignore empty sprites in SpriteChooser 2023-09-10 17:25:03 +02:00
OMGeeky
ada352a02c implement ignoring fully transparent sprites 2023-09-10 17:15:28 +02:00
OMGeeky
fc0d97aa2f reformat file & optimize usings 2023-09-10 16:11:02 +02:00
Nut.andor
7451f582ce bugfix sprite 2023-09-09 22:51:21 +02:00
Nut.andor
7b80bf5768 new png 2023-09-01 00:08:33 +02:00
Nut
ddd98c5a8f respawnspeed (originally spawnchance) renamed & added to UI
respawnspeed (originally spawnchance) renamed & added to UI
2023-08-31 23:55:14 +02:00
OMGeeky
0ef703d82e Merge remote-tracking branch 'omgeeky/spawnchance' into spawnchance 2023-08-31 23:50:15 +02:00
OMGeeky
2339a9307c respawnspeed (originally spawnchance) renamed & added to UI 2023-08-31 23:49:03 +02:00
Nut.andor
7dcdb90750 new version 2023-08-31 23:28:32 +02:00
OMGeeky
b638c31ebe update latest 2023-08-30 15:01:04 +02:00
OMGeeky
862f4b7366 respawnspeed (originally spawnchance) renamed & added to UI 2023-08-30 14:40:50 +02:00
Nut.andor
693de98212 Revert "v0.6.19"
This reverts commit 3f4bf58375.
2023-02-04 20:41:21 +01:00
Nut.andor
3f4bf58375 v0.6.19
png names
2023-02-04 03:09:18 +01:00
Nut.andor
7ae4d9d3f6 v0.6.18:
- https:
2022-09-03 23:16:48 +02:00
Nut.andor
0f20f0cd6d Sprites sorted
Missing sprites added (actorconditions, items, monster, effect)
monsters_warrior1 too much

monsters_arulir   makes ATCS crash??

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

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

4
.gitignore vendored
View File

@@ -1,3 +1,7 @@
/ATCS_v*.jar /ATCS_v*.jar
/Project /Project
/bin /bin
/packaging/tmp/
packaging/common/lib
packaging/common/ATCS.jar
packaging/ATCS_*.zip

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<jardesc> <jardesc>
<jar path="ATContentStudio/ATCS_v0.6.16.jar"/> <jar path="ATContentStudio/ATCS_v0.6.20.jar"/>
<options buildIfNeeded="true" compress="true" descriptionLocation="/ATContentStudio/ATCS_JAR.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/> <options buildIfNeeded="true" compress="true" descriptionLocation="/ATContentStudio/ATCS_JAR.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
<storedRefactorings deprecationInfo="true" structuralOnly="false"/> <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
<selectedProjects/> <selectedProjects/>

4
build-and-run.sh Executable file
View File

@@ -0,0 +1,4 @@
export MAIN_CLASS=com.gpl.rpg.atcontentstudio.ATContentStudio
export CP="lib/*:src:res:hacked-libtiled:siphash-zackehh/src/main/java/:."
javac -cp $CP ./src/com/gpl/rpg/atcontentstudio/ATContentStudio.java
java -cp $CP $MAIN_CLASS

View File

@@ -913,7 +913,8 @@ public class TMXMapReader
private class MapEntityResolver implements EntityResolver private class MapEntityResolver implements EntityResolver
{ {
public InputSource resolveEntity(String publicId, String systemId) { 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( return new InputSource(TMXMapReader.class.getResourceAsStream(
"resources/map.dtd")); "resources/map.dtd"));
} }

View File

@@ -153,7 +153,7 @@ public class TMXMapWriter
} }
private void writeMap(Map map, XMLWriter w, String wp) throws IOException { 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.startElement("map");
w.writeAttribute("version", "1.0"); w.writeAttribute("version", "1.0");

View File

@@ -1 +1 @@
v0.6.16 v0.6.19

2
packaging/Manifest.txt Normal file
View File

@@ -0,0 +1,2 @@
Manifest-Version: 1.0
Main-Class: com.gpl.rpg.atcontentstudio.ATContentStudio

View File

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

18
packaging/common/ATCS.cmd Normal file
View File

@@ -0,0 +1,18 @@
@echo off
set "ATCS_DIR=%~dp0"
set "MAX_MEM=512M"
set "JAVA=javaw.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 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"

View File

@@ -0,0 +1,4 @@
#MAX_MEM=512M
#JAVA=java
#JAVA_OPTS=-DFONT_SCALE=1.0 -Dswing.aatext=true

BIN
packaging/common/ATCS.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

21
packaging/common/ATCS.sh Executable file
View File

@@ -0,0 +1,21 @@
#!/bin/bash
ATCS_DIR=$(dirname $(readlink -f "$0" || greadlink -f "$0" || stat -f "$0"))
MAX_MEM=512M
JAVA=java
JAVA_OPTS='-DFONT_SCALE=1.0 -Dswing.aatext=true'
ENV_FILE=${ATCS_DIR}/ATCS.env
if [ -f ${ENV_FILE} ]; then
source ${ENV_FILE}
else
echo "#MAX_MEM=${MAX_MEM}" >${ENV_FILE}
echo "#JAVA=${JAVA}" >>${ENV_FILE}
echo "#JAVA_OPTS=${JAVA_OPTS}" >>${ENV_FILE}
echo "" >>${ENV_FILE}
fi
export ENV_FILE
$JAVA ${JAVA_OPTS} -Xmx${MAX_MEM} -jar ${ATCS_DIR}/ATCS.jar

View File

@@ -0,0 +1 @@
sh ./package.sh -windows

84
packaging/package.sh Executable file
View File

@@ -0,0 +1,84 @@
#windows or linux
if [ "$1" = "-windows" ] ; then
echo "Got '-windows' flag. Running Windows version"
LINUX=false
else
echo "No '-windows' flag. Running linux version"
LINUX=true
fi
#read the folder this script should be in (should be the packaging folder inside the ATCS source)
PACKAGING_DIR=$(dirname $(readlink -f "$0" || greadlink -f "$0" || stat -f "$0"))
ATCS_SOURCE_DIR=$(dirname "${PACKAGING_DIR}")
TEMP_DIR=${PACKAGING_DIR}/tmp
echo "Packaging dir: ${PACKAGING_DIR}"
echo "ATCS_SOURCE_DIR: ${ATCS_SOURCE_DIR}"
#ATContentStudio
JAR_LOCATION="${PACKAGING_DIR}/common/ATCS.jar"
MANIFEST_LOCATION=${PACKAGING_DIR}/Manifest.txt
echo ""
echo "Getting version"
VERSION=$(cat ${PACKAGING_DIR}/ATCS_latest)
echo "Got version ${VERSION}"
echo "Removing tmp folder"
rm -rf ${PACKAGING_DIR}/tmp/
echo "recreating tmp folder"
mkdir ${PACKAGING_DIR}/tmp/
#ATCS_SOURCE_DIR="${PACKAGING_DIR}/.."
echo ""
#copy manifest to temp folder for editing
cp ${MANIFEST_LOCATION} ${TEMP_DIR}
MANIFEST_LOCATION=${TEMP_DIR}/Manifest.txt
#copy lib files to packaged folder?
echo 'copying lib files'
mkdir -p ${PACKAGING_DIR}/common/lib/
cp ${ATCS_SOURCE_DIR}/lib/* ${PACKAGING_DIR}/common/lib/
cd $ATCS_SOURCE_DIR
#set ClassPath variable to use in the building etc.
echo 'setting class path'
#linux needs a : as seperator while windows needs ;
if [ "$LINUX" = true ] ; then
CP="lib/*:src:hacked-libtiled:siphash-zackehh/src/main/java"
else
CP="lib/*;src;hacked-libtiled;siphash-zackehh/src/main/java"
fi
echo "ClassPath: "
echo ${CP}
echo ""
#set build the classes
echo 'building java classes'
#javac -cp $CP *.java
javac -cp $CP ${ATCS_SOURCE_DIR}/src/com/gpl/rpg/atcontentstudio/*.java -d ${TEMP_DIR}
echo javac -cp $CP ${ATCS_SOURCE_DIR}/src/com/gpl/rpg/atcontentstudio/*.java -d ${TEMP_DIR}
echo ""
LIB_PATHS=$(find lib -name '*.jar' | paste -sd' ')
echo "LIB_PATHS: ${LIB_PATHS}"
# add all lib files to the class path in the temp Manifest
echo "Class-Path: . lib/* ${LIB_PATHS}" >>${MANIFEST_LOCATION}
echo ""
echo "creating jar at location: ${JAR_LOCATION}"
# create the jar file
# the command with those parameters requires this format:
# jar vmfc <Manifest file> <Jar file (target location)> <all things to add to the jar file>
# the things to add always use the whole relative path from the current dir,
# so when that is not wanted, the -C <location> thing will change to that dir
jar mfc ${MANIFEST_LOCATION} ${JAR_LOCATION} -C ${PACKAGING_DIR}/tmp/ com/gpl/rpg/atcontentstudio/ -C res . -C ${ATCS_SOURCE_DIR}/src .
echo ''
echo "Done creating jar"
if [ "$LINUX" = true ] ; then
cd ${PACKAGING_DIR}
echo "Creating archive"
tar caf "ATCS_${VERSION}.tar.gz" "common"
echo "Created archive at ${PACKAGING_DIR}/ATCS_${VERSION}.tar.gz"
else
echo "Can't create zip files on windows yet. Please pack the content of the '${PACKAGING_DIR}/common/' folder yourself"
fi

View File

@@ -1,64 +1,92 @@
atcs.spritesheet.actorconditions_1.category=actorcondition atcs.spritesheet.actorconditions_1.category=actorcondition
atcs.spritesheet.actorconditions_2.category=actorcondition atcs.spritesheet.actorconditions_2.category=actorcondition
atcs.spritesheet.actorconditions_japozero.category=actorcondition atcs.spritesheet.actorconditions_japozero.category=actorcondition
atcs.spritesheet.actorconditions_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.category=item
atcs.spritesheet.items_armours_2.category=item atcs.spritesheet.items_armours_2.category=item
atcs.spritesheet.items_armours_3.category=item atcs.spritesheet.items_armours_3.category=item
atcs.spritesheet.items_weapons.category=item
atcs.spritesheet.items_weapons_2.category=item
atcs.spritesheet.items_weapons_3.category=item
atcs.spritesheet.items_jewelry.category=item
atcs.spritesheet.items_rings_1.category=item
atcs.spritesheet.items_necklaces_1.category=item
atcs.spritesheet.items_consumables.category=item
atcs.spritesheet.items_japozero.category=item
atcs.spritesheet.items_books.category=item atcs.spritesheet.items_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.category=item
atcs.spritesheet.items_misc_2.category=item atcs.spritesheet.items_misc_2.category=item
atcs.spritesheet.items_misc_3.category=item atcs.spritesheet.items_misc_3.category=item
atcs.spritesheet.items_misc_4.category=item atcs.spritesheet.items_misc_4.category=item
atcs.spritesheet.items_misc_5.category=item atcs.spritesheet.items_misc_5.category=item
atcs.spritesheet.items_misc_6.category=item atcs.spritesheet.items_misc_6.category=item
atcs.spritesheet.items_necklaces_1.category=item
atcs.spritesheet.items_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_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_tometik1.category=item
atcs.spritesheet.items_tometik2.category=item atcs.spritesheet.items_tometik2.category=item
atcs.spritesheet.items_tometik3.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_armor1.category=monster
atcs.spritesheet.monsters_arulirs.category=monster
atcs.spritesheet.monsters_cats.category=monster
atcs.spritesheet.monsters_dogs.category=monster atcs.spritesheet.monsters_dogs.category=monster
atcs.spritesheet.monsters_eye1.category=monster atcs.spritesheet.monsters_eye1.category=monster
atcs.spritesheet.monsters_eye2.category=monster atcs.spritesheet.monsters_eye2.category=monster
atcs.spritesheet.monsters_eye3.category=monster atcs.spritesheet.monsters_eye3.category=monster
atcs.spritesheet.monsters_eye4.category=monster atcs.spritesheet.monsters_eye4.category=monster
atcs.spritesheet.monsters_fatboy73.category=monster
atcs.spritesheet.monsters_ghost1.category=monster atcs.spritesheet.monsters_ghost1.category=monster
atcs.spritesheet.monsters_hydra1.category=monster
atcs.spritesheet.monsters_hydra1.sizex=64 atcs.spritesheet.monsters_gisons.category=monster
atcs.spritesheet.monsters_hydra1.sizey=64 atcs.spritesheet.monsters_guynmart.category=monster
atcs.spritesheet.monsters_insects.category=monster atcs.spritesheet.monsters_insects.category=monster
atcs.spritesheet.monsters_karvis1.category=monster
atcs.spritesheet.monsters_karvis2.category=monster
atcs.spritesheet.monsters_ld1.category=monster
atcs.spritesheet.monsters_ld2.category=monster
atcs.spritesheet.monsters_liches.category=monster atcs.spritesheet.monsters_liches.category=monster
atcs.spritesheet.monsters_mage.category=monster atcs.spritesheet.monsters_mage.category=monster
atcs.spritesheet.monsters_mage2.category=monster atcs.spritesheet.monsters_mage2.category=monster
atcs.spritesheet.monsters_maksiu1.category=monster
atcs.spritesheet.monsters_man1.category=monster atcs.spritesheet.monsters_man1.category=monster
atcs.spritesheet.monsters_men.category=monster atcs.spritesheet.monsters_men.category=monster
atcs.spritesheet.monsters_men2.category=monster atcs.spritesheet.monsters_men2.category=monster
atcs.spritesheet.monsters_misc.category=monster atcs.spritesheet.monsters_misc.category=monster
atcs.spritesheet.monsters_newb_1.category=monster
atcs.spritesheet.monsters_omi1.category=monster
atcs.spritesheet.monsters_omi1_b.category=monster
atcs.spritesheet.monsters_omi2.category=monster
atcs.spritesheet.monsters_phoenix01.category=monster
atcs.spritesheet.monsters_rats.category=monster atcs.spritesheet.monsters_rats.category=monster
atcs.spritesheet.monsters_rogue1.category=monster atcs.spritesheet.monsters_redshrike1.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_rltiles1.category=monster atcs.spritesheet.monsters_rltiles1.category=monster
atcs.spritesheet.monsters_rltiles2.category=monster atcs.spritesheet.monsters_rltiles2.category=monster
atcs.spritesheet.monsters_rltiles3.category=monster atcs.spritesheet.monsters_rltiles3.category=monster
atcs.spritesheet.monsters_rltiles4.category=monster atcs.spritesheet.monsters_rltiles4.category=monster
atcs.spritesheet.monsters_redshrike1.category=monster atcs.spritesheet.monsters_rogue1.category=monster
atcs.spritesheet.monsters_ld1.category=monster atcs.spritesheet.monsters_skeleton1.category=monster
atcs.spritesheet.monsters_ld2.category=monster atcs.spritesheet.monsters_skeleton2.category=monster
atcs.spritesheet.monsters_snakes.category=monster
atcs.spritesheet.monsters_tometik1.category=monster atcs.spritesheet.monsters_tometik1.category=monster
atcs.spritesheet.monsters_tometik2.category=monster atcs.spritesheet.monsters_tometik2.category=monster
atcs.spritesheet.monsters_tometik3.category=monster atcs.spritesheet.monsters_tometik3.category=monster
@@ -69,20 +97,36 @@ atcs.spritesheet.monsters_tometik7.category=monster
atcs.spritesheet.monsters_tometik8.category=monster atcs.spritesheet.monsters_tometik8.category=monster
atcs.spritesheet.monsters_tometik9.category=monster atcs.spritesheet.monsters_tometik9.category=monster
atcs.spritesheet.monsters_tometik10.category=monster atcs.spritesheet.monsters_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.category=monster
atcs.spritesheet.monsters_demon1.sizex=64 atcs.spritesheet.monsters_demon1.sizex=64
atcs.spritesheet.monsters_demon1.sizey=64 atcs.spritesheet.monsters_demon1.sizey=64
atcs.spritesheet.monsters_demon2.category=monster atcs.spritesheet.monsters_demon2.category=monster
atcs.spritesheet.monsters_demon2.sizex=64 atcs.spritesheet.monsters_demon2.sizex=64
atcs.spritesheet.monsters_demon2.sizey=64 atcs.spritesheet.monsters_demon2.sizey=64
atcs.spritesheet.monsters_cyclops.category=monster atcs.spritesheet.monsters_giantbasilisk.category=monster
atcs.spritesheet.monsters_cyclops.sizex=64 atcs.spritesheet.monsters_giantbasilisk.sizex=64
atcs.spritesheet.monsters_cyclops.sizey=96 atcs.spritesheet.monsters_giantbasilisk.sizey=64
atcs.spritesheet.effect_blood3.animate=true atcs.spritesheet.monsters_hydra1.category=monster
atcs.spritesheet.effect_blood4.animate=true atcs.spritesheet.monsters_hydra1.sizex=64
atcs.spritesheet.effect_bluetentacle.animate=true atcs.spritesheet.monsters_hydra1.sizey=64
atcs.spritesheet.effect_heal2.animate=true atcs.spritesheet.monsters_newb_2.category=monster
atcs.spritesheet.effect_poison1.animate=true atcs.spritesheet.monsters_newb_2.sizex=64
atcs.spritesheet.effect_tometik1.animate=true atcs.spritesheet.monsters_newb_2.sizey=32
atcs.spritesheet.effect_tometik2.animate=true atcs.spritesheet.monsters_newb_3.category=monster
atcs.spritesheet.monsters_guynmart.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

View File

@@ -39,11 +39,10 @@ import com.gpl.rpg.atcontentstudio.ui.StudioFrame;
import com.gpl.rpg.atcontentstudio.ui.WorkerDialog; import com.gpl.rpg.atcontentstudio.ui.WorkerDialog;
import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector; import com.gpl.rpg.atcontentstudio.ui.WorkspaceSelector;
public class ATContentStudio { public class ATContentStudio {
public static final String APP_NAME = "Andor's Trail Content Studio"; public static final String APP_NAME = "Andor's Trail Content Studio";
public static final String APP_VERSION = "v0.6.16"; public static final String APP_VERSION = "v0.6.20";
public static final String CHECK_UPDATE_URL = "https://andorstrail.com/static/ATCS_latest"; public static final String CHECK_UPDATE_URL = "https://andorstrail.com/static/ATCS_latest";
public static final String DOWNLOAD_URL = "https://andorstrail.com/viewtopic.php?f=6&t=4806"; public static final String DOWNLOAD_URL = "https://andorstrail.com/viewtopic.php?f=6&t=4806";
@@ -51,10 +50,11 @@ public class ATContentStudio {
public static final String FONT_SCALE_ENV_VAR_NAME = "FONT_SCALE"; public static final String FONT_SCALE_ENV_VAR_NAME = "FONT_SCALE";
public static boolean STARTED = false; public static boolean STARTED = false;
public static float SCALING=1.0f; public static float SCALING = 1.0f;
public static StudioFrame frame = null; public static StudioFrame frame = null;
//Need to keep a strong reference to it, to avoid garbage collection that'll reset these loggers. // Need to keep a strong reference to it, to avoid garbage collection that'll
// reset these loggers.
public static final List<Logger> configuredLoggers = new LinkedList<Logger>(); public static final List<Logger> configuredLoggers = new LinkedList<Logger>();
/** /**
@@ -66,7 +66,7 @@ public class ATContentStudio {
if (fontScaling != null) { if (fontScaling != null) {
try { try {
fontScale = Float.parseFloat(fontScaling); fontScale = Float.parseFloat(fontScaling);
SCALING=fontScale; SCALING = fontScale;
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
System.err.println("Failed to parse font scaling parameter. Using default."); System.err.println("Failed to parse font scaling parameter. Using default.");
e.printStackTrace(); e.printStackTrace();
@@ -77,7 +77,8 @@ public class ATContentStudio {
try { try {
String laf = ConfigCache.getFavoriteLaFClassName(); String laf = ConfigCache.getFavoriteLaFClassName();
if (laf == null) laf = UIManager.getSystemLookAndFeelClassName(); if (laf == null)
laf = UIManager.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel(laf); UIManager.setLookAndFeel(laf);
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
@@ -89,10 +90,10 @@ public class ATContentStudio {
e.printStackTrace(); e.printStackTrace();
} }
scaleUIFont(); scaleUIFont();
//Need to keep a strong reference to it, to avoid garbage collection that'll reset this setting. // Need to keep a strong reference to it, to avoid garbage collection that'll
// reset this setting.
Logger l = Logger.getLogger(ExpressionParser.class.getName()); Logger l = Logger.getLogger(ExpressionParser.class.getName());
l.setLevel(Level.OFF); l.setLevel(Level.OFF);
configuredLoggers.add(l); configuredLoggers.add(l);
@@ -101,7 +102,7 @@ public class ATContentStudio {
wsSelect.pack(); wsSelect.pack();
Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize(); Dimension sdim = Toolkit.getDefaultToolkit().getScreenSize();
Dimension wdim = wsSelect.getSize(); Dimension wdim = wsSelect.getSize();
wsSelect.setLocation((sdim.width - wdim.width)/2, (sdim.height - wdim.height)/2); wsSelect.setLocation((sdim.width - wdim.width) / 2, (sdim.height - wdim.height) / 2);
wsSelect.setVisible(true); wsSelect.setVisible(true);
wsSelect.addWindowListener(new WindowAdapter() { wsSelect.addWindowListener(new WindowAdapter() {
@@ -110,15 +111,18 @@ public class ATContentStudio {
if (wsSelect.selected != null && !STARTED) { if (wsSelect.selected != null && !STARTED) {
ATContentStudio.STARTED = true; ATContentStudio.STARTED = true;
final File workspaceRoot = new File(wsSelect.selected); final File workspaceRoot = new File(wsSelect.selected);
WorkerDialog.showTaskMessage("Loading your workspace...", null, new Runnable(){ WorkerDialog.showTaskMessage("Loading your workspace...", null, new Runnable() {
public void run() { public void run() {
Workspace.setActive(workspaceRoot); Workspace.setActive(workspaceRoot);
if (Workspace.activeWorkspace.settings.useInternet.getCurrentValue() && Workspace.activeWorkspace.settings.checkUpdates.getCurrentValue()) { if (Workspace.activeWorkspace.settings.useInternet.getCurrentValue()
&& Workspace.activeWorkspace.settings.checkUpdates.getCurrentValue()) {
new Thread() { new Thread() {
public void run() {checkUpdate();} public void run() {
checkUpdate();
}
}.start(); }.start();
} }
frame = new StudioFrame(APP_NAME+" "+APP_VERSION); frame = new StudioFrame(APP_NAME + " " + APP_VERSION);
frame.setVisible(true); frame.setVisible(true);
frame.setDefaultCloseOperation(StudioFrame.DO_NOTHING_ON_CLOSE); frame.setDefaultCloseOperation(StudioFrame.DO_NOTHING_ON_CLOSE);
}; };
@@ -146,26 +150,28 @@ public class ATContentStudio {
in = new BufferedReader(new InputStreamReader(url.openStream())); in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine, lastLine = null; String inputLine, lastLine = null;
while ((inputLine = in.readLine()) != null) {lastLine = inputLine;} while ((inputLine = in.readLine()) != null) {
lastLine = inputLine;
}
if (lastLine != null && !lastLine.equals(APP_VERSION)) { if (lastLine != null && !lastLine.equals(APP_VERSION)) {
// for copying style // for copying style
JLabel label = new JLabel(); JLabel label = new JLabel();
Font font = label.getFont(); Font font = label.getFont();
Color color = label.getBackground(); Color color = label.getBackground();
// create some css from the label's font // create some css from the label's font
StringBuffer style = new StringBuffer("font-family:" + font.getFamily() + ";"); StringBuffer style = new StringBuffer("font-family:" + font.getFamily() + ";");
style.append("font-weight:" + (font.isBold() ? "bold" : "normal") + ";"); style.append("font-weight:" + (font.isBold() ? "bold" : "normal") + ";");
style.append("font-size:" + font.getSize() + "pt;"); style.append("font-size:" + font.getSize() + "pt;");
style.append("background-color: rgb("+color.getRed()+","+color.getGreen()+","+color.getBlue()+");"); style.append("background-color: rgb(" + color.getRed() + "," + color.getGreen() + "," + color.getBlue()
+ ");");
JEditorPane ep = new JEditorPane("text/html", "<html><body style=\"" + style + "\">" JEditorPane ep = new JEditorPane("text/html",
+ "You are not running the latest ATCS version.<br/>" "<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/>" + "You can get the latest version (" + lastLine + ") by clicking the link below.<br/>"
+ "<a href=\""+DOWNLOAD_URL+"\">"+DOWNLOAD_URL+"</a><br/>" + "<a href=\"" + DOWNLOAD_URL + "\">" + DOWNLOAD_URL + "</a><br/>" + "<br/>"
+ "<br/>" + "</body></html>");
+ "</body></html>");
ep.setEditable(false); ep.setEditable(false);
ep.setBorder(null); ep.setBorder(null);
@@ -194,7 +200,8 @@ public class ATContentStudio {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
try { try {
if (in != null) in.close(); if (in != null)
in.close();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@@ -203,7 +210,7 @@ public class ATContentStudio {
public static void scaleUIFont() { public static void scaleUIFont() {
if (SCALING != 1.0f) { if (SCALING != 1.0f) {
System.out.println("Scaling fonts to "+SCALING); System.out.println("Scaling fonts to " + SCALING);
UIDefaults defaults = UIManager.getLookAndFeelDefaults(); UIDefaults defaults = UIManager.getLookAndFeelDefaults();
Map<Object, Object> newDefaults = new HashMap<Object, Object>(); Map<Object, Object> newDefaults = new HashMap<Object, Object>();
for (Enumeration<Object> e = defaults.keys(); e.hasMoreElements();) { for (Enumeration<Object> e = defaults.keys(); e.hasMoreElements();) {
@@ -211,7 +218,7 @@ public class ATContentStudio {
Object value = defaults.get(key); Object value = defaults.get(key);
if (value instanceof Font) { if (value instanceof Font) {
Font font = (Font) value; Font font = (Font) value;
int newSize = (int)(font.getSize() * SCALING); int newSize = (int) (font.getSize() * SCALING);
if (value instanceof FontUIResource) { if (value instanceof FontUIResource) {
newDefaults.put(key, new FontUIResource(font.getName(), font.getStyle(), newSize)); newDefaults.put(key, new FontUIResource(font.getName(), font.getStyle(), newSize));
} else { } else {

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 703 B

View File

@@ -68,7 +68,8 @@ public class Dialogue extends JSONElement {
deactivateSpawnArea, deactivateSpawnArea,
activateMapObjectGroup, activateMapObjectGroup,
deactivateMapObjectGroup, deactivateMapObjectGroup,
changeMapFilter changeMapFilter,
mapchange
} }
} }
@@ -249,6 +250,7 @@ public class Dialogue extends JSONElement {
case removeSpawnArea: case removeSpawnArea:
case deactivateSpawnArea: case deactivateSpawnArea:
case changeMapFilter: case changeMapFilter:
case mapchange:
reward.map = reward.map_name != null ? proj.getMap(reward.map_name) : null; reward.map = reward.map_name != null ? proj.getMap(reward.map_name) : null;
break; break;
case actorCondition: case actorCondition:

View File

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

View File

@@ -60,7 +60,11 @@ public class Requirement extends JSONElement {
factionScore, factionScore,
random, random,
factionScoreEquals, factionScoreEquals,
wearRemove wearRemove,
date,
dateEquals,
time,
timeEquals
} }
public enum SkillID { public enum SkillID {
@@ -85,6 +89,7 @@ public class Requirement extends JSONElement {
,resistancePhysical // lowers chance to get negative active conditions by monsters (Physical Capacity like Minor fatigue) ,resistancePhysical // lowers chance to get negative active conditions by monsters (Physical Capacity like Minor fatigue)
,resistanceBlood // lowers chance to get negative active conditions by monsters (Blood Disorder like Weak Poison) ,resistanceBlood // lowers chance to get negative active conditions by monsters (Blood Disorder like Weak Poison)
,shadowBless ,shadowBless
,sporeImmunity
,crit1 // lowers atk ability ,crit1 // lowers atk ability
,crit2 // lowers def ability ,rejuvenation // Reduces magnitudes of conditions ,crit2 // lowers def ability ,rejuvenation // Reduces magnitudes of conditions
,rejuvenation // Reduces magnitudes of conditions ,rejuvenation // Reduces magnitudes of conditions
@@ -195,6 +200,10 @@ public class Requirement extends JSONElement {
case factionScore: case factionScore:
case factionScoreEquals: case factionScoreEquals:
case random: case random:
case date:
case dateEquals:
case time:
case timeEquals:
break; break;
} }
if (this.required_obj != null) this.required_obj.addBacklink((GameDataElement) this.parent); if (this.required_obj != null) this.required_obj.addBacklink((GameDataElement) this.parent);

View File

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

View File

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

View File

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

View File

@@ -260,6 +260,14 @@ public class DefaultIcons {
public static Image getTimerImage() { return getImage(TIMER_RES); } public static Image getTimerImage() { return getImage(TIMER_RES); }
public static Image getTimerIcon() { return getIcon(TIMER_RES); } public static Image getTimerIcon() { return getIcon(TIMER_RES); }
private static String DATE_RES = "/com/gpl/rpg/atcontentstudio/img/date.png";
public static Image getDateImage() { return getImage(DATE_RES); }
public static Image getDateIcon() { return getIcon(DATE_RES); }
private static String TIME_RES = "/com/gpl/rpg/atcontentstudio/img/date.png";
public static Image getTimeImage() { return getImage(TIME_RES); }
public static Image getTimeIcon() { return getIcon(TIME_RES); }
private static String ALIGNMENT_RES = "/com/gpl/rpg/atcontentstudio/img/alignment.png"; private static String ALIGNMENT_RES = "/com/gpl/rpg/atcontentstudio/img/alignment.png";
public static Image getAlignmentImage() { return getImage(ALIGNMENT_RES); } public static Image getAlignmentImage() { return getImage(ALIGNMENT_RES); }
public static Image getAlignmentIcon() { return getIcon(ALIGNMENT_RES); } public static Image getAlignmentIcon() { return getIcon(ALIGNMENT_RES); }

View File

@@ -57,7 +57,7 @@ public class ExportProjectWizard extends JDialog {
radioGroup.add(asZip); radioGroup.add(asZip);
overSources = new JRadioButton("... into a game source folder"); overSources = new JRadioButton("... into a game source folder");
radioGroup.add(overSources); radioGroup.add(overSources);
asZip.setSelected(true); overSources.setSelected(true);
pane.add(asZip, JideBoxLayout.FIX); pane.add(asZip, JideBoxLayout.FIX);
pane.add(overSources, JideBoxLayout.FIX); pane.add(overSources, JideBoxLayout.FIX);

View File

@@ -384,6 +384,13 @@ public class DialogueEditor extends JSONElementEditor {
rewardObj = null; rewardObj = null;
rewardValue = null; rewardValue = null;
break; break;
case mapchange:
rewardMap = addMapBox(pane, ((Dialogue)target).getProject(), "Map Name: ", reward.map, writable, listener);
rewardObjId = addTextField(pane, "Place: ", reward.reward_obj_id, writable, listener);
rewardObjIdCombo = null;
rewardObj = null;
rewardValue = null;
break;
case deactivateSpawnArea: case deactivateSpawnArea:
case removeSpawnArea: case removeSpawnArea:
case spawnAll: case spawnAll:
@@ -777,6 +784,26 @@ public class DialogueEditor extends JSONElementEditor {
requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener); requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Exact value: ", requirement.required_value, true, writable, listener); requirementValue = addIntegerField(pane, "Exact value: ", requirement.required_value, true, writable, listener);
break; break;
case date:
requirementObj = null;
requirementObjId = addTextField(pane, "Date type YYYYMMTT:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Minimum date value: ", requirement.required_value, true, writable, listener);
break;
case dateEquals:
requirementObj = null;
requirementObjId = addTextField(pane, "Date type YYYYMMTT:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Exact date value: ", requirement.required_value, true, writable, listener);
break;
case time:
requirementObj = null;
requirementObjId = addTextField(pane, "Time type HHMMSS:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Minimum time value: ", requirement.required_value, true, writable, listener);
break;
case timeEquals:
requirementObj = null;
requirementObjId = addTextField(pane, "Time type HHMMSS:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Exact time value: ", requirement.required_value, true, writable, listener);
break;
} }
requirementNegated = addBooleanBasedCheckBox(pane, "Negate this requirement.", requirement.negated, writable, listener); requirementNegated = addBooleanBasedCheckBox(pane, "Negate this requirement.", requirement.negated, writable, listener);
} }
@@ -943,6 +970,10 @@ public class DialogueEditor extends JSONElementEditor {
label.setText("Change map filter to "+rewardObjDesc+" on map "+reward.map_name); label.setText("Change map filter to "+rewardObjDesc+" on map "+reward.map_name);
label.setIcon(new ImageIcon(DefaultIcons.getReplaceIcon())); label.setIcon(new ImageIcon(DefaultIcons.getReplaceIcon()));
break; break;
case mapchange:
label.setText("Teleport to "+rewardObjDesc+" on map "+reward.map_name);
label.setIcon(new ImageIcon(DefaultIcons.getMapchangeIcon()));
break;
} }
} else { } else {
label.setText("New, undefined reward"); label.setText("New, undefined reward");
@@ -1178,6 +1209,9 @@ public class DialogueEditor extends JSONElementEditor {
label.setIcon(new ImageIcon(DefaultIcons.getTimerIcon())); label.setIcon(new ImageIcon(DefaultIcons.getTimerIcon()));
} else if (req.type == Requirement.RequirementType.factionScore || req.type == Requirement.RequirementType.factionScoreEquals) { } else if (req.type == Requirement.RequirementType.factionScore || req.type == Requirement.RequirementType.factionScoreEquals) {
label.setIcon(new ImageIcon(DefaultIcons.getAlignmentIcon())); label.setIcon(new ImageIcon(DefaultIcons.getAlignmentIcon()));
} else if (req.type == Requirement.RequirementType.date || req.type == Requirement.RequirementType.dateEquals ||
req.type == Requirement.RequirementType.time || req.type == Requirement.RequirementType.timeEquals) {
label.setIcon(new ImageIcon(DefaultIcons.getDateIcon()));
} }
if (req.type == null) { if (req.type == null) {
label.setText("New, undefined requirement."); label.setText("New, undefined requirement.");

View File

@@ -161,6 +161,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
private JComboBox evaluateTriggerBox; private JComboBox evaluateTriggerBox;
private JSpinner quantityField; private JSpinner quantityField;
private JSpinner respawnSpeedField;
private JCheckBox spawnActiveForNewGame; private JCheckBox spawnActiveForNewGame;
private JCheckBox spawnIgnoreAreas; private JCheckBox spawnIgnoreAreas;
private JTextField spawngroupField; private JTextField spawngroupField;
@@ -629,6 +630,7 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
areaField = addTextField(pane, "Spawn area ID: ", ((SpawnArea)selected).name, ((TMXMap)target).writable, listener); areaField = addTextField(pane, "Spawn area ID: ", ((SpawnArea)selected).name, ((TMXMap)target).writable, listener);
spawngroupField = addTextField(pane, "Spawn group ID: ", ((SpawnArea)selected).spawngroup_id, ((TMXMap)target).writable, listener); spawngroupField = addTextField(pane, "Spawn group ID: ", ((SpawnArea)selected).spawngroup_id, ((TMXMap)target).writable, listener);
quantityField = addIntegerField(pane, "Number of spawned NPCs: ", ((SpawnArea)selected).quantity, false, ((TMXMap)target).writable, listener); quantityField = addIntegerField(pane, "Number of spawned NPCs: ", ((SpawnArea)selected).quantity, false, ((TMXMap)target).writable, listener);
respawnSpeedField = addIntegerField(pane, "Respawn-Speed of NPCs: ", ((SpawnArea)selected).respawnSpeed, false, ((TMXMap)target).writable, listener);
spawnActiveForNewGame = addBooleanBasedCheckBox(pane, "Active in a new game: ", ((SpawnArea)selected).active, ((TMXMap)target).writable, listener); spawnActiveForNewGame = addBooleanBasedCheckBox(pane, "Active in a new game: ", ((SpawnArea)selected).active, ((TMXMap)target).writable, listener);
spawnIgnoreAreas = addBooleanBasedCheckBox(pane, "Monsters can walk on other game objects: ", ((SpawnArea)selected).ignoreAreas, ((TMXMap)target).writable, listener); spawnIgnoreAreas = addBooleanBasedCheckBox(pane, "Monsters can walk on other game objects: ", ((SpawnArea)selected).ignoreAreas, ((TMXMap)target).writable, listener);
npcListModel = new SpawnGroupNpcListModel((SpawnArea) selected); npcListModel = new SpawnGroupNpcListModel((SpawnArea) selected);
@@ -729,6 +731,26 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener); requirementObjId = addTextField(pane, "Faction ID:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Exact value: ", requirement.required_value, true, writable, listener); requirementValue = addIntegerField(pane, "Exact value: ", requirement.required_value, true, writable, listener);
break; break;
case date:
requirementObj = null;
requirementObjId = addTextField(pane, "Date type YYYYMMTT:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Minimum date value: ", requirement.required_value, true, writable, listener);
break;
case dateEquals:
requirementObj = null;
requirementObjId = addTextField(pane, "Date type YYYYMMTT:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Exact date value: ", requirement.required_value, true, writable, listener);
break;
case time:
requirementObj = null;
requirementObjId = addTextField(pane, "Time type HHMMSS:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Minimum time value: ", requirement.required_value, true, writable, listener);
break;
case timeEquals:
requirementObj = null;
requirementObjId = addTextField(pane, "Time type HHMMSS:", requirement.required_obj_id, writable, listener);
requirementValue = addIntegerField(pane, "Exact time value: ", requirement.required_value, true, writable, listener);
break;
} }
} }
requirementNegated = addBooleanBasedCheckBox(pane, "Negate this requirement.", requirement.negated, writable, listener); requirementNegated = addBooleanBasedCheckBox(pane, "Negate this requirement.", requirement.negated, writable, listener);
@@ -2049,6 +2071,11 @@ public class TMXMapEditor extends Editor implements TMXMap.MapChangedOnDiskListe
SpawnArea area = (SpawnArea) selectedMapObject; SpawnArea area = (SpawnArea) selectedMapObject;
area.quantity = (Integer) value; area.quantity = (Integer) value;
} }
} else if (source == respawnSpeedField) {
if (selectedMapObject instanceof SpawnArea) {
SpawnArea area = (SpawnArea) selectedMapObject;
area.respawnSpeed = (Integer) value;
}
} else if (source == spawnActiveForNewGame) { } else if (source == spawnActiveForNewGame) {
if (selectedMapObject instanceof SpawnArea) { if (selectedMapObject instanceof SpawnArea) {
SpawnArea area = (SpawnArea) selectedMapObject; SpawnArea area = (SpawnArea) selectedMapObject;

View File

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

View File

@@ -1,29 +1,20 @@
package com.gpl.rpg.atcontentstudio.ui.sprites; package com.gpl.rpg.atcontentstudio.ui.sprites;
import java.awt.BorderLayout; import java.awt.*;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.swing.*;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToggleButton;
import javax.swing.ScrollPaneConstants;
import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.ATContentStudio;
import com.gpl.rpg.atcontentstudio.model.Project; import com.gpl.rpg.atcontentstudio.model.Project;
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet; import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet;
import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet.Category; import com.gpl.rpg.atcontentstudio.model.sprites.Spritesheet.Category;
import com.gpl.rpg.atcontentstudio.utils.SpriteUtils;
public class SpriteChooser extends JDialog { public class SpriteChooser extends JDialog {
@@ -34,8 +25,8 @@ public class SpriteChooser extends JDialog {
private static final int STD_HEIGHT = 32; private static final int STD_HEIGHT = 32;
private static final int MAX_PER_ROW = 10; private static final int MAX_PER_ROW = 10;
public static Map<Project, Map<Spritesheet.Category, SpriteChooser>> cache = new LinkedHashMap<Project, Map<Spritesheet.Category,SpriteChooser>>(); public static Map<Project, Map<Spritesheet.Category, SpriteChooser>> cache = new LinkedHashMap<Project, Map<Spritesheet.Category, SpriteChooser>>();
public static Map<Project, Map<Spritesheet.Category, List<Spritesheet>>> cacheValidator = new LinkedHashMap<Project, Map<Category,List<Spritesheet>>>(); public static Map<Project, Map<Spritesheet.Category, List<Spritesheet>>> cacheValidator = new LinkedHashMap<Project, Map<Category, List<Spritesheet>>>();
public static SpriteChooser getChooser(Project proj, Spritesheet.Category category) { public static SpriteChooser getChooser(Project proj, Spritesheet.Category category) {
@@ -46,13 +37,13 @@ public class SpriteChooser extends JDialog {
cache.get(proj).put(category, new SpriteChooser(proj, category)); cache.get(proj).put(category, new SpriteChooser(proj, category));
} else { } else {
List<Spritesheet> spritesheets = new ArrayList<Spritesheet>(); List<Spritesheet> spritesheets = new ArrayList<Spritesheet>();
for (int i=0; i<proj.getSpritesheetCount(); i++) { for (int i = 0; i < proj.getSpritesheetCount(); i++) {
Spritesheet sheet = proj.getSpritesheet(i); Spritesheet sheet = proj.getSpritesheet(i);
if (sheet.category == category) { if (sheet.category == category) {
spritesheets.add(sheet); spritesheets.add(sheet);
} }
} }
if ( !spritesheets.equals(cacheValidator.get(proj).get(category)) ) { if (!spritesheets.equals(cacheValidator.get(proj).get(category))) {
cache.get(proj).put(category, new SpriteChooser(proj, category)); cache.get(proj).put(category, new SpriteChooser(proj, category));
} }
} }
@@ -78,7 +69,7 @@ public class SpriteChooser extends JDialog {
setTitle("Select a sprite"); setTitle("Select a sprite");
setModalityType(ModalityType.APPLICATION_MODAL); setModalityType(ModalityType.APPLICATION_MODAL);
List<Spritesheet> spritesheets = new ArrayList<Spritesheet>(); List<Spritesheet> spritesheets = new ArrayList<Spritesheet>();
for (int i=0; i<proj.getSpritesheetCount(); i++) { for (int i = 0; i < proj.getSpritesheetCount(); i++) {
Spritesheet sheet = proj.getSpritesheet(i); Spritesheet sheet = proj.getSpritesheet(i);
if (sheet.category == category) { if (sheet.category == category) {
spritesheets.add(sheet); spritesheets.add(sheet);
@@ -106,11 +97,15 @@ public class SpriteChooser extends JDialog {
Point nextFreeSlot = new Point(0, 0); Point nextFreeSlot = new Point(0, 0);
int i; int i;
Image img; BufferedImage img;
group = new ButtonGroup(); group = new ButtonGroup();
//For every sprite find a free space in panel:
for (Spritesheet sheet : spritesheets) { for (Spritesheet sheet : spritesheets) {
i = 0; i = -1;
while ((img = sheet.getImage(i)) != null) { while ((img = sheet.getImage(++i)) != null) {
if (SpriteUtils.checkIsImageEmpty(img)) {
continue;
}
IconButton button = new IconButton(img, sheet.id, i); IconButton button = new IconButton(img, sheet.id, i);
group.add(button); group.add(button);
if (sheet.spriteWidth == STD_WIDTH && sheet.spriteHeight == STD_HEIGHT) { if (sheet.spriteWidth == STD_WIDTH && sheet.spriteHeight == STD_HEIGHT) {
@@ -120,7 +115,7 @@ public class SpriteChooser extends JDialog {
c.gridx = 0; c.gridx = 0;
c.gridy++; c.gridy++;
} }
nextFreeSlot.setLocation(c.gridx, c.gridy); nextFreeSlot.setLocation(c.gridx, c.gridy);
} else { } else {
c.gridwidth = (sheet.spriteWidth / STD_WIDTH) + (sheet.spriteWidth % STD_WIDTH == 0 ? 0 : 1); c.gridwidth = (sheet.spriteWidth / STD_WIDTH) + (sheet.spriteWidth % STD_WIDTH == 0 ? 0 : 1);
c.gridheight = (sheet.spriteHeight / STD_HEIGHT) + (sheet.spriteHeight % STD_HEIGHT == 0 ? 0 : 1); c.gridheight = (sheet.spriteHeight / STD_HEIGHT) + (sheet.spriteHeight % STD_HEIGHT == 0 ? 0 : 1);
@@ -131,13 +126,19 @@ public class SpriteChooser extends JDialog {
for (int y = c.gridy; y < c.gridy + c.gridwidth; y++) { for (int y = c.gridy; y < c.gridy + c.gridwidth; y++) {
if (reservedSlots.contains(new Point(x, y))) { if (reservedSlots.contains(new Point(x, y))) {
slotOk = false; slotOk = false;
break;
} }
} }
if (!slotOk) {
break;
}
} }
if (slotOk && c.gridx + c.gridwidth > MAX_PER_ROW) { if (c.gridx + c.gridwidth > MAX_PER_ROW) {
c.gridx = 0; c.gridx = 0;
c.gridy++; c.gridy++;
slotOk = false; slotOk = false;
} else if (!slotOk) {
c.gridx++;
} }
} }
pane.add(button, c); pane.add(button, c);
@@ -157,9 +158,8 @@ public class SpriteChooser extends JDialog {
c.gridx = 0; c.gridx = 0;
c.gridy++; c.gridy++;
} }
nextFreeSlot.setLocation(c.gridx, c.gridy); nextFreeSlot.setLocation(c.gridx, c.gridy);
} }
i++;
} }
} }
@@ -232,12 +232,12 @@ public class SpriteChooser extends JDialog {
super(new ImageIcon(img)); super(new ImageIcon(img));
this.sheetId = sheetId; this.sheetId = sheetId;
this.spriteIndex = spriteIndex; this.spriteIndex = spriteIndex;
setToolTipText(sheetId+":"+spriteIndex); setToolTipText(sheetId + ":" + spriteIndex);
addActionListener(new ActionListener() { addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
if (IconButton.this.isSelected()) { if (IconButton.this.isSelected()) {
selectedIconId = IconButton.this.sheetId+":"+IconButton.this.spriteIndex; selectedIconId = IconButton.this.sheetId + ":" + IconButton.this.spriteIndex;
SpriteChooser.this.setVisible(false); SpriteChooser.this.setVisible(false);
SpriteChooser.this.dispose(); SpriteChooser.this.dispose();
if (listener != null) listener.iconSelected(selectedIconId); if (listener != null) listener.iconSelected(selectedIconId);

View File

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