commit 03a60da816a9f9469b058d803707cc8d555bc0c1 Author: Reproog Date: Mon Jul 21 12:20:41 2025 +0200 Initial Commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..67df35c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# https://editorconfig.org +root = true + +[*] +indent_style = space +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.{java,scala,groovy,kt,kts}] +indent_size = 4 + +[*.gradle] +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..6c84be0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +* text=auto eol=lf +*.bat text=auto eol=crlf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..df81d1d --- /dev/null +++ b/.gitignore @@ -0,0 +1,154 @@ +## Gradle: +.gradle/ +gradle-app.setting +/build/ +/android/build/ +/core/build/ +/lwjgl2/build/ +/lwjgl3/build/ +/html/build/ +/teavm/build/ +/ios/build/ +/ios-moe/build/ +/headless/build/ +/server/build/ +/shared/build/ + +## Java: +*.class +*.war +*.ear +hs_err_pid* +.attach_pid* + +## Android: +/android/libs/armeabi-v7a/ +/android/libs/arm64-v8a/ +/android/libs/x86/ +/android/libs/x86_64/ +/android/gen/ +/android/out/ +local.properties +com_crashlytics_export_strings.xml + +## Robovm: +/ios/robovm-build/ + +## iOS: +/ios/xcode/*.xcodeproj/* +!/ios/xcode/*.xcodeproj/xcshareddata +!/ios/xcode/*.xcodeproj/project.pbxproj +/ios/xcode/native/ +/ios/IOSLauncher.app +/ios/IOSLauncher.app.dSYM + +## GWT: +/html/war/ +/html/gwt-unitCache/ +.apt_generated/ +/html/war/WEB-INF/deploy/ +/html/war/WEB-INF/classes/ +.gwt/ +gwt-unitCache/ +www-test/ +.gwt-tmp/ + +## TeaVM: +# Not sure yet... + +## IntelliJ, Android Studio: +.idea/ +*.ipr +*.iws +*.iml + +## Eclipse: +.classpath +.project +.metadata/ +/android/bin/ +/core/bin/ +/lwjgl2/bin/ +/lwjgl3/bin/ +/html/bin/ +/teavm/bin/ +/ios/bin/ +/ios-moe/bin/ +/headless/bin/ +/server/bin/ +/shared/bin/ +*.tmp +*.bak +*.swp +*~.nib +.settings/ +.loadpath +.externalToolBuilders/ +*.launch + + +## NetBeans: + +/nbproject/private/ +/android/nbproject/private/ +/core/nbproject/private/ +/lwjgl2/nbproject/private/ +/lwjgl3/nbproject/private/ +/html/nbproject/private/ +/teavm/nbproject/private/ +/ios/nbproject/private/ +/ios-moe/nbproject/private/ +/headless/nbproject/private/ +/server/nbproject/private/ +/shared/nbproject/private/ + +/nbbuild/ +/android/nbbuild/ +/core/nbbuild/ +/lwjgl2/nbbuild/ +/lwjgl3/nbbuild/ +/html/nbbuild/ +/teavm/nbbuild/ +/ios/nbbuild/ +/ios-moe/nbbuild/ +/headless/nbbuild/ +/server/nbbuild/ +/shared/nbbuild/ + +/dist/ +/android/dist/ +/core/dist/ +/lwjgl2/dist/ +/lwjgl3/dist/ +/html/dist/ +/teavm/dist/ +/ios/dist/ +/ios-moe/dist/ +/headless/dist/ +/server/dist/ +/shared/dist/ + +/nbdist/ +/android/nbdist/ +/core/nbdist/ +/lwjgl2/nbdist/ +/lwjgl3/nbdist/ +/html/nbdist/ +/teavm/nbdist/ +/ios/nbdist/ +/ios-moe/nbdist/ +/headless/nbdist/ +/server/nbdist/ +/shared/nbdist/ + +nbactions.xml +nb-configuration.xml + +## OS-Specific: +.DS_Store +Thumbs.db + +## Miscellaneous: +*~ +*.*# +*#*# diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eed9d18 --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ + + +main: + clear + gradle lwjgl3:run + + +build: + gradle lwjgl3:dist + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..725dc67 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# Doppelspalt + +A [libGDX](https://libgdx.com/) project generated with [gdx-liftoff](https://github.com/tommyettinger/gdx-liftoff). + +This project was generated with a template including simple application launchers and a main class extending `Game` that sets the first screen. + +## Platforms + +- `core`: Main module with the application logic shared by all platforms. +- `lwjgl3`: Primary desktop platform using LWJGL3. +- `html`: Web platform using GWT and WebGL. Supports only Java projects. + +## Gradle + +This project uses [Gradle](http://gradle.org/) to manage dependencies. +The Gradle wrapper was included, so you can run Gradle tasks using `gradlew.bat` or `./gradlew` commands. +Useful Gradle tasks and flags: + +- `--continue`: when using this flag, errors will not stop the tasks from running. +- `--daemon`: thanks to this flag, Gradle daemon will be used to run chosen tasks. +- `--offline`: when using this flag, cached dependency archives will be used. +- `--refresh-dependencies`: this flag forces validation of all dependencies. Useful for snapshot versions. +- `build`: builds sources and archives of every project. +- `cleanEclipse`: removes Eclipse project data. +- `cleanIdea`: removes IntelliJ project data. +- `clean`: removes `build` folders, which store compiled classes and built archives. +- `eclipse`: generates Eclipse project data. +- `html:dist`: compiles GWT sources. The compiled application can be found at `html/build/dist`: you can use any HTTP server to deploy it. +- `html:superDev`: compiles GWT sources and runs the application in SuperDev mode. It will be available at [localhost:8080/html](http://localhost:8080/html). Use only during development. +- `idea`: generates IntelliJ project data. +- `lwjgl3:jar`: builds application's runnable jar, which can be found at `lwjgl3/build/lib`. +- `lwjgl3:run`: starts the application. +- `test`: runs unit tests (if any). + +Note that most tasks that are not specific to a single project can be run with `name:` prefix, where the `name` should be replaced with the ID of a specific project. +For example, `core:clean` removes `build` folder only from the `core` project. diff --git a/assets/.gitkeep b/assets/.gitkeep new file mode 100644 index 0000000..944e008 --- /dev/null +++ b/assets/.gitkeep @@ -0,0 +1,3 @@ +This file can be deleted if there are any other files present in this folder. +It is only here to ensure this folder is added to Git, instead of being +ignored because it is empty. \ No newline at end of file diff --git a/assets/bitmap/c059.fnt b/assets/bitmap/c059.fnt new file mode 100644 index 0000000..3bface1 --- /dev/null +++ b/assets/bitmap/c059.fnt @@ -0,0 +1,894 @@ +info face="C059-Roman" size=42 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=1,1,1,1 spacing=-2,-2 +common lineHeight=51 base=31 scaleW=512 scaleH=512 pages=1 packed=0 +page id=0 file="c059.png" +chars count=97 +char id=0 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=10 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=0 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=0 xadvance=12 page=0 chnl=0 +char id=33 x=351 y=0 width=8 height=34 xoffset=2 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=34 x=87 y=140 width=14 height=12 xoffset=1 yoffset=-1 xadvance=16 page=0 chnl=0 +char id=35 x=92 y=108 width=23 height=31 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=36 x=39 y=0 width=23 height=42 xoffset=0 yoffset=-5 xadvance=23 page=0 chnl=0 +char id=37 x=23 y=108 width=35 height=32 xoffset=0 yoffset=0 xadvance=35 page=0 chnl=0 +char id=38 x=425 y=0 width=33 height=34 xoffset=1 yoffset=-1 xadvance=34 page=0 chnl=0 +char id=39 x=101 y=140 width=7 height=12 xoffset=1 yoffset=-1 xadvance=9 page=0 chnl=0 +char id=40 x=81 y=0 width=13 height=39 xoffset=0 yoffset=-1 xadvance=14 page=0 chnl=0 +char id=41 x=94 y=0 width=13 height=39 xoffset=1 yoffset=-1 xadvance=14 page=0 chnl=0 +char id=42 x=20 y=140 width=19 height=21 xoffset=1 yoffset=-1 xadvance=21 page=0 chnl=0 +char id=43 x=274 y=108 width=24 height=24 xoffset=1 yoffset=8 xadvance=25 page=0 chnl=0 +char id=44 x=496 y=108 width=10 height=15 xoffset=1 yoffset=26 xadvance=12 page=0 chnl=0 +char id=45 x=153 y=140 width=14 height=6 xoffset=0 yoffset=18 xadvance=14 page=0 chnl=0 +char id=46 x=145 y=140 width=8 height=8 xoffset=2 yoffset=25 xadvance=12 page=0 chnl=0 +char id=47 x=378 y=0 width=16 height=34 xoffset=-2 yoffset=-1 xadvance=12 page=0 chnl=0 +char id=48 x=0 y=108 width=23 height=32 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=49 x=376 y=76 width=19 height=32 xoffset=3 yoffset=0 xadvance=23 page=0 chnl=0 +char id=50 x=395 y=76 width=23 height=32 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=0 +char id=51 x=329 y=0 width=22 height=34 xoffset=0 yoffset=-1 xadvance=23 page=0 chnl=0 +char id=52 x=418 y=76 width=24 height=32 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=0 +char id=53 x=309 y=43 width=23 height=33 xoffset=0 yoffset=0 xadvance=23 page=0 chnl=0 +char id=54 x=442 y=76 width=23 height=32 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=55 x=332 y=43 width=22 height=33 xoffset=1 yoffset=0 xadvance=23 page=0 chnl=0 +char id=56 x=465 y=76 width=23 height=32 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=57 x=488 y=76 width=23 height=32 xoffset=0 yoffset=1 xadvance=23 page=0 chnl=0 +char id=58 x=266 y=108 width=8 height=24 xoffset=2 yoffset=9 xadvance=12 page=0 chnl=0 +char id=59 x=83 y=108 width=9 height=31 xoffset=2 yoffset=10 xadvance=12 page=0 chnl=0 +char id=60 x=115 y=108 width=24 height=26 xoffset=1 yoffset=4 xadvance=25 page=0 chnl=0 +char id=61 x=63 y=140 width=24 height=15 xoffset=1 yoffset=13 xadvance=25 page=0 chnl=0 +char id=62 x=139 y=108 width=24 height=26 xoffset=1 yoffset=4 xadvance=25 page=0 chnl=0 +char id=63 x=359 y=0 width=19 height=34 xoffset=0 yoffset=-1 xadvance=19 page=0 chnl=0 +char id=64 x=394 y=0 width=31 height=34 xoffset=0 yoffset=-1 xadvance=31 page=0 chnl=0 +char id=65 x=458 y=0 width=34 height=33 xoffset=-2 yoffset=-1 xadvance=30 page=0 chnl=0 +char id=66 x=376 y=43 width=30 height=32 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=0 +char id=67 x=159 y=0 width=30 height=34 xoffset=0 yoffset=-1 xadvance=30 page=0 chnl=0 +char id=68 x=406 y=43 width=32 height=32 xoffset=0 yoffset=0 xadvance=33 page=0 chnl=0 +char id=69 x=438 y=43 width=29 height=32 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=0 +char id=70 x=467 y=43 width=28 height=32 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0 +char id=71 x=189 y=0 width=34 height=34 xoffset=0 yoffset=-1 xadvance=33 page=0 chnl=0 +char id=72 x=0 y=76 width=35 height=32 xoffset=0 yoffset=0 xadvance=35 page=0 chnl=0 +char id=73 x=35 y=76 width=17 height=32 xoffset=0 yoffset=0 xadvance=17 page=0 chnl=0 +char id=74 x=0 y=43 width=25 height=33 xoffset=-1 yoffset=0 xadvance=23 page=0 chnl=0 +char id=75 x=52 y=76 width=35 height=32 xoffset=0 yoffset=0 xadvance=33 page=0 chnl=0 +char id=76 x=87 y=76 width=29 height=32 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0 +char id=77 x=116 y=76 width=41 height=32 xoffset=-1 yoffset=0 xadvance=40 page=0 chnl=0 +char id=78 x=25 y=43 width=36 height=33 xoffset=-1 yoffset=0 xadvance=34 page=0 chnl=0 +char id=79 x=223 y=0 width=32 height=34 xoffset=0 yoffset=-1 xadvance=33 page=0 chnl=0 +char id=80 x=157 y=76 width=29 height=32 xoffset=0 yoffset=0 xadvance=28 page=0 chnl=0 +char id=81 x=6 y=0 width=33 height=42 xoffset=0 yoffset=-1 xadvance=33 page=0 chnl=0 +char id=82 x=61 y=43 width=31 height=33 xoffset=0 yoffset=0 xadvance=30 page=0 chnl=0 +char id=83 x=255 y=0 width=25 height=34 xoffset=1 yoffset=-1 xadvance=26 page=0 chnl=0 +char id=84 x=186 y=76 width=30 height=32 xoffset=-1 yoffset=0 xadvance=28 page=0 chnl=0 +char id=85 x=92 y=43 width=36 height=33 xoffset=-1 yoffset=0 xadvance=34 page=0 chnl=0 +char id=86 x=128 y=43 width=34 height=33 xoffset=-2 yoffset=0 xadvance=30 page=0 chnl=0 +char id=87 x=162 y=43 width=43 height=33 xoffset=-1 yoffset=0 xadvance=41 page=0 chnl=0 +char id=88 x=216 y=76 width=34 height=32 xoffset=-2 yoffset=0 xadvance=30 page=0 chnl=0 +char id=89 x=250 y=76 width=33 height=32 xoffset=-2 yoffset=0 xadvance=30 page=0 chnl=0 +char id=90 x=283 y=76 width=26 height=32 xoffset=0 yoffset=0 xadvance=26 page=0 chnl=0 +char id=91 x=107 y=0 width=13 height=37 xoffset=1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=92 x=354 y=43 width=22 height=33 xoffset=2 yoffset=-1 xadvance=25 page=0 chnl=0 +char id=93 x=120 y=0 width=13 height=37 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=94 x=39 y=140 width=24 height=19 xoffset=1 yoffset=0 xadvance=25 page=0 chnl=0 +char id=95 x=167 y=140 width=23 height=5 xoffset=-1 yoffset=33 xadvance=21 page=0 chnl=0 +char id=96 x=108 y=140 width=13 height=10 xoffset=-1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=97 x=163 y=108 width=24 height=24 xoffset=0 yoffset=9 xadvance=23 page=0 chnl=0 +char id=98 x=280 y=0 width=24 height=34 xoffset=-1 yoffset=-1 xadvance=23 page=0 chnl=0 +char id=99 x=187 y=108 width=19 height=24 xoffset=0 yoffset=9 xadvance=19 page=0 chnl=0 +char id=100 x=304 y=0 width=25 height=34 xoffset=0 yoffset=-1 xadvance=24 page=0 chnl=0 +char id=101 x=206 y=108 width=21 height=24 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=0 +char id=102 x=205 y=43 width=25 height=33 xoffset=-1 yoffset=-1 xadvance=14 page=0 chnl=0 +char id=103 x=230 y=43 width=25 height=33 xoffset=-1 yoffset=8 xadvance=23 page=0 chnl=0 +char id=104 x=255 y=43 width=27 height=33 xoffset=-1 yoffset=-1 xadvance=26 page=0 chnl=0 +char id=105 x=495 y=43 width=15 height=32 xoffset=-1 yoffset=0 xadvance=13 page=0 chnl=0 +char id=106 x=62 y=0 width=19 height=41 xoffset=-5 yoffset=0 xadvance=12 page=0 chnl=0 +char id=107 x=282 y=43 width=27 height=33 xoffset=-1 yoffset=-1 xadvance=25 page=0 chnl=0 +char id=108 x=492 y=0 width=15 height=33 xoffset=-1 yoffset=-1 xadvance=13 page=0 chnl=0 +char id=109 x=298 y=108 width=39 height=23 xoffset=-1 yoffset=9 xadvance=37 page=0 chnl=0 +char id=110 x=337 y=108 width=26 height=23 xoffset=0 yoffset=9 xadvance=26 page=0 chnl=0 +char id=111 x=227 y=108 width=21 height=24 xoffset=0 yoffset=9 xadvance=21 page=0 chnl=0 +char id=112 x=309 y=76 width=24 height=32 xoffset=0 yoffset=9 xadvance=24 page=0 chnl=0 +char id=113 x=333 y=76 width=25 height=32 xoffset=0 yoffset=9 xadvance=23 page=0 chnl=0 +char id=114 x=363 y=108 width=21 height=23 xoffset=-1 yoffset=9 xadvance=19 page=0 chnl=0 +char id=115 x=248 y=108 width=18 height=24 xoffset=1 yoffset=9 xadvance=19 page=0 chnl=0 +char id=116 x=358 y=76 width=18 height=32 xoffset=-1 yoffset=1 xadvance=16 page=0 chnl=0 +char id=117 x=384 y=108 width=27 height=23 xoffset=-1 yoffset=10 xadvance=26 page=0 chnl=0 +char id=118 x=411 y=108 width=25 height=23 xoffset=-1 yoffset=10 xadvance=23 page=0 chnl=0 +char id=119 x=436 y=108 width=35 height=23 xoffset=-1 yoffset=10 xadvance=33 page=0 chnl=0 +char id=120 x=471 y=108 width=25 height=22 xoffset=-1 yoffset=10 xadvance=23 page=0 chnl=0 +char id=121 x=58 y=108 width=25 height=31 xoffset=-1 yoffset=10 xadvance=23 page=0 chnl=0 +char id=122 x=0 y=140 width=20 height=22 xoffset=0 yoffset=10 xadvance=20 page=0 chnl=0 +char id=123 x=133 y=0 width=13 height=37 xoffset=1 yoffset=0 xadvance=14 page=0 chnl=0 +char id=124 x=0 y=0 width=6 height=43 xoffset=10 yoffset=0 xadvance=25 page=0 chnl=0 +char id=125 x=146 y=0 width=13 height=37 xoffset=0 yoffset=0 xadvance=14 page=0 chnl=0 +char id=126 x=121 y=140 width=24 height=10 xoffset=1 yoffset=16 xadvance=25 page=0 chnl=0 +kernings count=792 +kerning first=87 second=85 amount=1 +kerning first=115 second=112 amount=-1 +kerning first=103 second=118 amount=1 +kerning first=88 second=81 amount=-2 +kerning first=97 second=121 amount=-2 +kerning first=76 second=87 amount=-3 +kerning first=71 second=86 amount=-1 +kerning first=65 second=89 amount=-2 +kerning first=78 second=79 amount=-1 +kerning first=47 second=98 amount=2 +kerning first=75 second=125 amount=1 +kerning first=107 second=102 amount=1 +kerning first=76 second=121 amount=-1 +kerning first=99 second=58 amount=1 +kerning first=118 second=45 amount=-1 +kerning first=89 second=111 amount=-4 +kerning first=102 second=101 amount=-1 +kerning first=75 second=70 amount=2 +kerning first=85 second=106 amount=-1 +kerning first=121 second=33 amount=-1 +kerning first=102 second=46 amount=-1 +kerning first=80 second=105 amount=1 +kerning first=103 second=42 amount=1 +kerning first=102 second=39 amount=2 +kerning first=47 second=77 amount=2 +kerning first=75 second=104 amount=2 +kerning first=69 second=107 amount=-1 +kerning first=89 second=90 amount=1 +kerning first=45 second=119 amount=-1 +kerning first=111 second=120 amount=-1 +kerning first=84 second=89 amount=1 +kerning first=112 second=116 amount=-1 +kerning first=76 second=45 amount=2 +kerning first=79 second=88 amount=-2 +kerning first=101 second=118 amount=-1 +kerning first=114 second=108 amount=-1 +kerning first=80 second=84 amount=1 +kerning first=121 second=101 amount=-1 +kerning first=87 second=77 amount=1 +kerning first=75 second=83 amount=1 +kerning first=122 second=97 amount=-1 +kerning first=39 second=87 amount=1 +kerning first=101 second=63 amount=-2 +kerning first=82 second=76 amount=1 +kerning first=85 second=119 amount=-1 +kerning first=79 second=122 amount=-1 +kerning first=121 second=46 amount=-3 +kerning first=90 second=65 amount=1 +kerning first=84 second=68 amount=1 +kerning first=65 second=81 amount=-2 +kerning first=122 second=42 amount=-1 +kerning first=116 second=45 amount=1 +kerning first=74 second=121 amount=-1 +kerning first=78 second=71 amount=-1 +kerning first=87 second=111 amount=-3 +kerning first=47 second=90 amount=2 +kerning first=111 second=44 amount=-1 +kerning first=89 second=103 amount=-3 +kerning first=102 second=93 amount=3 +kerning first=68 second=69 amount=-1 +kerning first=119 second=33 amount=-1 +kerning first=65 second=115 amount=1 +kerning first=113 second=125 amount=1 +kerning first=90 second=44 amount=1 +kerning first=114 second=121 amount=1 +kerning first=80 second=97 amount=-1 +kerning first=47 second=69 amount=2 +kerning first=79 second=46 amount=-1 +kerning first=120 second=63 amount=-1 +kerning first=82 second=89 amount=-1 +kerning first=123 second=106 amount=3 +kerning first=98 second=122 amount=-1 +kerning first=121 second=59 amount=-1 +kerning first=118 second=105 amount=1 +kerning first=78 second=84 amount=1 +kerning first=91 second=74 amount=-1 +kerning first=119 second=101 amount=-1 +kerning first=47 second=103 amount=1 +kerning first=79 second=80 amount=-1 +kerning first=107 second=107 amount=1 +kerning first=86 second=73 amount=1 +kerning first=99 second=63 amount=-2 +kerning first=80 second=76 amount=-1 +kerning first=102 second=106 amount=1 +kerning first=87 second=69 amount=1 +kerning first=119 second=46 amount=-3 +kerning first=103 second=102 amount=1 +kerning first=84 second=115 amount=-1 +kerning first=88 second=65 amount=2 +kerning first=82 second=68 amount=1 +kerning first=114 second=45 amount=-3 +kerning first=72 second=121 amount=-2 +kerning first=119 second=39 amount=-1 +kerning first=70 second=74 amount=-2 +kerning first=40 second=89 amount=1 +kerning first=87 second=103 amount=-3 +kerning first=47 second=82 amount=2 +kerning first=98 second=46 amount=-1 +kerning first=79 second=59 amount=1 +kerning first=67 second=65 amount=-1 +kerning first=65 second=107 amount=1 +kerning first=112 second=121 amount=-1 +kerning first=78 second=97 amount=-1 +kerning first=91 second=87 amount=1 +kerning first=119 second=114 amount=1 +kerning first=113 second=117 amount=-1 +kerning first=107 second=120 amount=1 +kerning first=92 second=83 amount=-1 +kerning first=121 second=106 amount=1 +kerning first=102 second=119 amount=1 +kerning first=87 second=82 amount=1 +kerning first=81 second=85 amount=-1 +kerning first=90 second=125 amount=2 +kerning first=109 second=112 amount=-1 +kerning first=75 second=88 amount=2 +kerning first=97 second=118 amount=-1 +kerning first=91 second=121 amount=1 +kerning first=76 second=84 amount=-2 +kerning first=123 second=98 amount=1 +kerning first=89 second=74 amount=-2 +kerning first=70 second=87 amount=1 +kerning first=71 second=83 amount=1 +kerning first=118 second=97 amount=-1 +kerning first=65 second=86 amount=-4 +kerning first=100 second=106 amount=-1 +kerning first=98 second=59 amount=1 +kerning first=107 second=99 amount=-1 +kerning first=101 second=102 amount=-1 +kerning first=86 second=65 amount=-4 +kerning first=70 second=121 amount=1 +kerning first=75 second=67 amount=-1 +kerning first=115 second=33 amount=-1 +kerning first=86 second=99 amount=-3 +kerning first=80 second=102 amount=1 +kerning first=65 second=65 amount=2 +kerning first=115 second=122 amount=-1 +kerning first=47 second=74 amount=1 +kerning first=69 second=104 amount=-1 +kerning first=86 second=44 amount=-4 +kerning first=110 second=121 amount=-2 +kerning first=89 second=87 amount=2 +kerning first=84 second=86 amount=1 +kerning first=116 second=63 amount=-1 +kerning first=78 second=89 amount=2 +kerning first=100 second=119 amount=-1 +kerning first=47 second=108 amount=2 +kerning first=70 second=45 amount=-2 +kerning first=119 second=106 amount=1 +kerning first=88 second=125 amount=1 +kerning first=73 second=88 amount=1 +kerning first=114 second=105 amount=1 +kerning first=65 second=44 amount=1 +kerning first=102 second=111 amount=-1 +kerning first=87 second=74 amount=-3 +kerning first=68 second=87 amount=-2 +kerning first=75 second=80 amount=2 +kerning first=39 second=84 amount=2 +kerning first=82 second=73 amount=1 +kerning first=123 second=90 amount=1 +kerning first=98 second=106 amount=-1 +kerning first=84 second=65 amount=-1 +kerning first=116 second=42 amount=-1 +kerning first=87 second=108 amount=1 +kerning first=66 second=74 amount=1 +kerning first=47 second=87 amount=2 +kerning first=89 second=100 amount=-4 +kerning first=77 second=106 amount=-1 +kerning first=84 second=99 amount=-1 +kerning first=89 second=45 amount=-3 +kerning first=45 second=74 amount=2 +kerning first=90 second=41 amount=1 +kerning first=114 second=118 amount=1 +kerning first=84 second=44 amount=-3 +kerning first=108 second=121 amount=-1 +kerning first=121 second=111 amount=-1 +kerning first=87 second=87 amount=2 +kerning first=47 second=66 amount=2 +kerning first=75 second=93 amount=1 +kerning first=82 second=86 amount=-1 +kerning first=114 second=63 amount=-1 +kerning first=76 second=89 amount=-3 +kerning first=123 second=103 amount=1 +kerning first=89 second=79 amount=-2 +kerning first=98 second=119 amount=-1 +kerning first=117 second=106 amount=-1 +kerning first=68 second=45 amount=1 +kerning first=115 second=59 amount=1 +kerning first=86 second=125 amount=1 +kerning first=84 second=78 amount=1 +kerning first=87 second=121 amount=-2 +kerning first=72 second=84 amount=1 +kerning first=66 second=87 amount=-1 +kerning first=107 second=104 amount=1 +kerning first=88 second=117 amount=-1 +kerning first=92 second=67 amount=-2 +kerning first=101 second=107 amount=-1 +kerning first=80 second=73 amount=-1 +kerning first=89 second=113 amount=-4 +kerning first=102 second=103 amount=-1 +kerning first=87 second=66 amount=1 +kerning first=75 second=72 amount=2 +kerning first=82 second=65 amount=1 +kerning first=66 second=121 amount=-1 +kerning first=89 second=58 amount=-2 +kerning first=45 second=87 amount=-2 +kerning first=86 second=104 amount=2 +kerning first=103 second=44 amount=-1 +kerning first=40 second=86 amount=1 +kerning first=70 second=105 amount=1 +kerning first=117 second=119 amount=-1 +kerning first=87 second=45 amount=-2 +kerning first=45 second=121 amount=-2 +kerning first=111 second=122 amount=-1 +kerning first=105 second=125 amount=1 +kerning first=71 second=101 amount=1 +kerning first=112 second=118 amount=-1 +kerning first=106 second=121 amount=-1 +kerning first=119 second=111 amount=-1 +kerning first=85 second=87 amount=1 +kerning first=101 second=120 amount=-1 +kerning first=114 second=110 amount=1 +kerning first=74 second=89 amount=2 +kerning first=102 second=116 amount=1 +kerning first=40 second=65 amount=-1 +kerning first=87 second=79 amount=-2 +kerning first=121 second=103 amount=-1 +kerning first=81 second=82 amount=-1 +kerning first=75 second=85 amount=1 +kerning first=103 second=112 amount=1 +kerning first=39 second=89 amount=1 +kerning first=82 second=78 amount=1 +kerning first=85 second=121 amount=-1 +kerning first=70 second=84 amount=1 +kerning first=89 second=71 amount=-2 +kerning first=83 second=74 amount=1 +kerning first=86 second=117 amount=-2 +kerning first=99 second=107 amount=-1 +kerning first=84 second=70 amount=1 +kerning first=65 second=83 amount=1 +kerning first=75 second=119 amount=-2 +kerning first=111 second=46 amount=-1 +kerning first=69 second=122 amount=-1 +kerning first=80 second=65 amount=-3 +kerning first=87 second=58 amount=-1 +kerning first=84 second=104 amount=1 +kerning first=65 second=117 amount=-1 +kerning first=110 second=84 amount=-2 +kerning first=123 second=74 amount=1 +kerning first=45 second=79 amount=1 +kerning first=71 second=59 amount=2 +kerning first=90 second=46 amount=1 +kerning first=86 second=41 amount=1 +kerning first=110 second=118 amount=-1 +kerning first=80 second=44 amount=-4 +kerning first=104 second=121 amount=-2 +kerning first=123 second=108 amount=1 +kerning first=70 second=97 amount=-1 +kerning first=89 second=84 amount=1 +kerning first=77 second=90 amount=1 +kerning first=40 second=112 amount=-1 +kerning first=72 second=89 amount=2 +kerning first=119 second=103 amount=-1 +kerning first=107 second=109 amount=1 +kerning first=111 second=59 amount=1 +kerning first=120 second=99 amount=-1 +kerning first=82 second=125 amount=1 +kerning first=114 second=102 amount=1 +kerning first=65 second=41 amount=-1 +kerning first=89 second=118 amount=-3 +kerning first=102 second=108 amount=3 +kerning first=87 second=71 amount=-2 +kerning first=75 second=77 amount=2 +kerning first=84 second=117 amount=1 +kerning first=88 second=67 amount=-1 +kerning first=82 second=70 amount=1 +kerning first=123 second=87 amount=1 +kerning first=92 second=106 amount=-1 +kerning first=71 second=72 amount=-1 +kerning first=90 second=59 amount=1 +kerning first=78 second=65 amount=-1 +kerning first=87 second=105 amount=-1 +kerning first=47 second=84 amount=2 +kerning first=105 second=41 amount=-1 +kerning first=123 second=121 amount=1 +kerning first=89 second=97 amount=-3 +kerning first=90 second=93 amount=1 +kerning first=91 second=89 amount=1 +kerning first=119 second=116 amount=1 +kerning first=45 second=71 amount=1 +kerning first=83 second=45 amount=2 +kerning first=92 second=85 amount=-2 +kerning first=108 second=118 amount=-1 +kerning first=78 second=44 amount=-1 +kerning first=121 second=108 amount=-1 +kerning first=102 second=121 amount=1 +kerning first=87 second=84 amount=1 +kerning first=75 second=90 amount=2 +kerning first=97 second=120 amount=1 +kerning first=82 second=83 amount=1 +kerning first=76 second=86 amount=-3 +kerning first=70 second=89 amount=1 +kerning first=111 second=106 amount=-1 +kerning first=67 second=39 amount=1 +kerning first=118 second=99 amount=-1 +kerning first=65 second=88 amount=2 +kerning first=84 second=75 amount=1 +kerning first=66 second=84 amount=-1 +kerning first=107 second=101 amount=-1 +kerning first=101 second=104 amount=-1 +kerning first=82 second=117 amount=-1 +kerning first=86 second=67 amount=-2 +kerning first=118 second=44 amount=-3 +kerning first=89 second=110 amount=-3 +kerning first=102 second=100 amount=-1 +kerning first=71 second=119 amount=-1 +kerning first=75 second=69 amount=2 +kerning first=65 second=122 amount=1 +kerning first=46 second=39 amount=-2 +kerning first=76 second=65 amount=1 +kerning first=102 second=45 amount=-1 +kerning first=45 second=84 amount=-3 +kerning first=86 second=101 amount=-3 +kerning first=80 second=104 amount=-1 +kerning first=103 second=41 amount=-1 +kerning first=65 second=67 amount=-1 +kerning first=87 second=97 amount=-3 +kerning first=47 second=76 amount=2 +kerning first=88 second=93 amount=1 +kerning first=86 second=46 amount=-4 +kerning first=67 second=59 amount=1 +kerning first=45 second=118 amount=-1 +kerning first=111 second=119 amount=-1 +kerning first=81 second=45 amount=1 +kerning first=90 second=85 amount=1 +kerning first=84 second=88 amount=1 +kerning first=82 second=41 amount=1 +kerning first=119 second=108 amount=-1 +kerning first=100 second=121 amount=-1 +kerning first=85 second=84 amount=1 +kerning first=79 second=87 amount=-2 +kerning first=107 second=114 amount=1 +kerning first=73 second=90 amount=1 +kerning first=114 second=107 amount=-1 +kerning first=65 second=46 amount=1 +kerning first=87 second=76 amount=1 +kerning first=68 second=89 amount=-1 +kerning first=90 second=119 amount=-1 +kerning first=75 second=82 amount=2 +kerning first=109 second=106 amount=-1 +kerning first=65 second=39 amount=-4 +kerning first=39 second=86 amount=1 +kerning first=82 second=75 amount=1 +kerning first=85 second=118 amount=-1 +kerning first=121 second=45 amount=-1 +kerning first=86 second=114 amount=-2 +kerning first=47 second=89 amount=3 +kerning first=69 second=119 amount=-1 +kerning first=86 second=59 amount=-2 +kerning first=74 second=65 amount=-2 +kerning first=106 second=42 amount=-1 +kerning first=71 second=111 amount=1 +kerning first=84 second=101 amount=-1 +kerning first=39 second=65 amount=-4 +kerning first=119 second=121 amount=1 +kerning first=86 second=93 amount=1 +kerning first=114 second=120 amount=1 +kerning first=103 second=33 amount=-1 +kerning first=84 second=46 amount=-3 +kerning first=87 second=89 amount=2 +kerning first=115 second=116 amount=-1 +kerning first=47 second=68 amount=2 +kerning first=109 second=119 amount=-2 +kerning first=79 second=45 amount=1 +kerning first=84 second=39 amount=2 +kerning first=82 second=88 amount=1 +kerning first=104 second=118 amount=-1 +kerning first=123 second=105 amount=1 +kerning first=89 second=81 amount=-2 +kerning first=98 second=121 amount=-1 +kerning first=121 second=58 amount=-1 +kerning first=77 second=87 amount=1 +kerning first=84 second=80 amount=1 +kerning first=65 second=93 amount=-1 +kerning first=66 second=89 amount=-1 +kerning first=63 second=39 amount=1 +kerning first=86 second=72 amount=1 +kerning first=76 second=125 amount=1 +kerning first=89 second=115 amount=-3 +kerning first=102 second=105 amount=1 +kerning first=87 second=68 amount=1 +kerning first=119 second=45 amount=-1 +kerning first=77 second=121 amount=-2 +kerning first=47 second=47 amount=1 +kerning first=75 second=74 amount=2 +kerning first=84 second=114 amount=1 +kerning first=78 second=117 amount=-2 +kerning first=91 second=107 amount=1 +kerning first=114 second=44 amount=-3 +kerning first=42 second=46 amount=-1 +kerning first=85 second=110 amount=-2 +kerning first=45 second=89 amount=-4 +kerning first=105 second=93 amount=-1 +kerning first=122 second=33 amount=-1 +kerning first=103 second=46 amount=-1 +kerning first=84 second=59 amount=-1 +kerning first=40 second=88 amount=1 +kerning first=72 second=65 amount=1 +kerning first=104 second=42 amount=-1 +kerning first=75 second=108 amount=2 +kerning first=79 second=58 amount=1 +kerning first=82 second=101 amount=1 +kerning first=117 second=121 amount=-1 +kerning first=118 second=117 amount=1 +kerning first=101 second=33 amount=-1 +kerning first=91 second=86 amount=1 +kerning first=85 second=89 amount=2 +kerning first=101 second=122 amount=-1 +kerning first=86 second=85 amount=2 +kerning first=114 second=112 amount=1 +kerning first=119 second=58 amount=-1 +kerning first=75 second=87 amount=1 +kerning first=103 second=114 amount=1 +kerning first=82 second=80 amount=1 +kerning first=102 second=63 amount=3 +kerning first=105 second=106 amount=-1 +kerning first=84 second=72 amount=1 +kerning first=65 second=85 amount=-2 +kerning first=91 second=65 amount=-1 +kerning first=75 second=121 amount=-3 +kerning first=98 second=58 amount=1 +kerning first=102 second=97 amount=-1 +kerning first=75 second=66 amount=2 +kerning first=84 second=106 amount=1 +kerning first=65 second=119 amount=-2 +kerning first=70 second=65 amount=-3 +kerning first=102 second=42 amount=2 +kerning first=45 second=81 amount=1 +kerning first=80 second=101 amount=-1 +kerning first=47 second=73 amount=2 +kerning first=99 second=33 amount=-1 +kerning first=80 second=46 amount=-4 +kerning first=89 second=86 amount=2 +kerning first=121 second=63 amount=-1 +kerning first=111 second=116 amount=-1 +kerning first=105 second=119 amount=-1 +kerning first=75 second=45 amount=-1 +kerning first=80 second=39 amount=1 +kerning first=84 second=85 amount=1 +kerning first=122 second=59 amount=1 +kerning first=119 second=105 amount=1 +kerning first=100 second=118 amount=-1 +kerning first=47 second=107 amount=2 +kerning first=70 second=44 amount=-4 +kerning first=107 second=111 amount=-1 +kerning first=92 second=74 amount=-1 +kerning first=73 second=87 amount=1 +kerning first=120 second=101 amount=-1 +kerning first=114 second=104 amount=-1 +kerning first=121 second=97 amount=-1 +kerning first=87 second=73 amount=1 +kerning first=68 second=86 amount=-2 +kerning first=75 second=79 amount=-1 +kerning first=84 second=119 amount=1 +kerning first=103 second=106 amount=2 +kerning first=101 second=59 amount=1 +kerning first=82 second=72 amount=1 +kerning first=91 second=112 amount=-1 +kerning first=123 second=89 amount=1 +kerning first=89 second=65 amount=-2 +kerning first=73 second=121 amount=-2 +kerning first=92 second=108 amount=-1 +kerning first=86 second=111 amount=-3 +kerning first=78 second=67 amount=-1 +kerning first=47 second=86 amount=3 +kerning first=89 second=99 amount=-4 +kerning first=68 second=65 amount=-2 +kerning first=78 second=101 amount=-1 +kerning first=89 second=44 amount=-3 +kerning first=92 second=87 amount=-3 +kerning first=114 second=117 amount=1 +kerning first=78 second=46 amount=-1 +kerning first=121 second=110 amount=1 +kerning first=87 second=86 amount=2 +kerning first=119 second=63 amount=-1 +kerning first=103 second=119 amount=1 +kerning first=82 second=85 amount=-1 +kerning first=110 second=112 amount=-1 +kerning first=123 second=102 amount=1 +kerning first=98 second=118 amount=-1 +kerning first=115 second=58 amount=1 +kerning first=77 second=84 amount=1 +kerning first=71 second=87 amount=-1 +kerning first=118 second=101 amount=-1 +kerning first=84 second=77 amount=1 +kerning first=65 second=90 amount=2 +kerning first=40 second=106 amount=2 +kerning first=119 second=97 amount=-1 +kerning first=66 second=86 amount=-1 +kerning first=101 second=106 amount=-1 +kerning first=86 second=69 amount=1 +kerning first=118 second=46 amount=-3 +kerning first=99 second=59 amount=1 +kerning first=89 second=112 amount=-3 +kerning first=74 second=75 amount=1 +kerning first=102 second=102 amount=1 +kerning first=87 second=65 amount=-3 +kerning first=71 second=121 amount=-1 +kerning first=75 second=71 amount=-1 +kerning first=84 second=111 amount=-1 +kerning first=91 second=104 amount=1 +kerning first=45 second=86 amount=-2 +kerning first=86 second=103 amount=-3 +kerning first=80 second=106 amount=1 +kerning first=116 second=33 amount=-1 +kerning first=87 second=99 amount=-3 +kerning first=47 second=78 amount=2 +kerning first=75 second=105 amount=2 +kerning first=69 second=108 amount=-1 +kerning first=76 second=101 amount=1 +kerning first=117 second=118 amount=-1 +kerning first=45 second=120 amount=-2 +kerning first=87 second=44 amount=-3 +kerning first=111 second=121 amount=-1 +kerning first=90 second=87 amount=1 +kerning first=118 second=114 amount=1 +kerning first=65 second=103 amount=1 +kerning first=85 second=86 amount=2 +kerning first=79 second=89 amount=-2 +kerning first=92 second=79 amount=-2 +kerning first=101 second=119 amount=-1 +kerning first=86 second=82 amount=2 +kerning first=71 second=45 amount=2 +kerning first=114 second=109 amount=1 +kerning first=76 second=39 amount=-4 +kerning first=89 second=125 amount=1 +kerning first=87 second=78 amount=1 +kerning first=90 second=121 amount=-2 +kerning first=75 second=84 amount=1 +kerning first=39 second=88 amount=1 +kerning first=82 second=77 amount=1 +kerning first=85 second=120 amount=-1 +kerning first=80 second=119 amount=1 +kerning first=84 second=69 amount=1 +kerning first=85 second=65 amount=-2 +kerning first=101 second=98 amount=-1 +kerning first=82 second=111 amount=1 +kerning first=70 second=117 amount=1 +kerning first=84 second=103 amount=-1 +kerning first=78 second=106 amount=-1 +kerning first=114 second=33 amount=-1 +kerning first=90 second=45 amount=2 +kerning first=71 second=58 amount=1 +kerning first=121 second=115 amount=-1 +kerning first=85 second=44 amount=-2 +kerning first=47 second=70 amount=2 +kerning first=109 second=121 amount=-2 +kerning first=75 second=97 amount=1 +kerning first=88 second=87 amount=1 +kerning first=82 second=90 amount=1 +kerning first=76 second=93 amount=-1 +kerning first=123 second=107 amount=1 +kerning first=115 second=63 amount=-2 +kerning first=77 second=89 amount=1 +kerning first=118 second=106 amount=1 +kerning first=84 second=82 amount=1 +kerning first=69 second=45 amount=1 +kerning first=116 second=59 amount=1 +kerning first=87 second=125 amount=1 +kerning first=119 second=102 amount=1 +kerning first=47 second=104 amount=2 +kerning first=88 second=121 amount=-3 +kerning first=92 second=71 amount=-2 +kerning first=107 second=108 amount=1 +kerning first=111 second=58 amount=1 +kerning first=86 second=74 amount=-2 +kerning first=89 second=117 amount=-3 +kerning first=87 second=70 amount=1 +kerning first=75 second=76 amount=2 +kerning first=97 second=106 amount=-1 +kerning first=82 second=69 amount=1 +kerning first=114 second=46 amount=-3 +kerning first=123 second=86 amount=1 +kerning first=85 second=112 amount=-2 +kerning first=92 second=105 amount=-1 +kerning first=86 second=108 amount=1 +kerning first=90 second=58 amount=1 +kerning first=80 second=111 amount=-1 +kerning first=65 second=74 amount=1 +kerning first=40 second=90 amount=1 +kerning first=87 second=104 amount=1 +kerning first=88 second=45 amount=-1 +kerning first=112 second=122 amount=-1 +kerning first=106 second=125 amount=1 +kerning first=91 second=88 amount=1 +kerning first=119 second=115 amount=-1 +kerning first=89 second=41 amount=1 +kerning first=92 second=84 amount=-3 +kerning first=120 second=111 amount=-1 +kerning first=114 second=114 amount=1 +kerning first=87 second=83 amount=-1 +kerning first=75 second=89 amount=2 +kerning first=103 second=116 amount=1 +kerning first=88 second=79 amount=-2 +kerning first=97 second=119 amount=-1 +kerning first=82 second=82 amount=1 +kerning first=67 second=45 amount=1 +kerning first=76 second=85 amount=-1 +kerning first=86 second=121 amount=-2 +kerning first=71 second=84 amount=-1 +kerning first=84 second=74 amount=-2 +kerning first=65 second=87 amount=-4 +kerning first=87 second=117 amount=-2 +kerning first=107 second=100 amount=-1 +kerning first=89 second=109 amount=-3 +kerning first=102 second=99 amount=-1 +kerning first=75 second=68 amount=2 +kerning first=84 second=108 amount=1 +kerning first=65 second=121 amount=-3 +kerning first=107 second=45 amount=-2 +kerning first=78 second=111 amount=-1 +kerning first=102 second=44 amount=-1 +kerning first=45 second=83 amount=2 +kerning first=111 second=84 amount=-1 +kerning first=65 second=66 amount=1 +kerning first=47 second=75 amount=2 +kerning first=69 second=105 amount=-1 +kerning first=67 second=58 amount=1 +kerning first=86 second=45 amount=-2 +kerning first=70 second=101 amount=-2 +kerning first=89 second=88 amount=2 +kerning first=87 second=41 amount=1 +kerning first=111 second=118 amount=-1 +kerning first=118 second=111 amount=-1 +kerning first=84 second=87 amount=1 +kerning first=85 second=83 amount=-1 +kerning first=70 second=46 amount=-4 +kerning first=79 second=86 amount=-2 +kerning first=107 second=113 amount=-1 +kerning first=73 second=89 amount=1 +kerning first=101 second=116 amount=-1 +kerning first=86 second=79 amount=-2 +kerning first=114 second=106 amount=1 +kerning first=89 second=122 amount=-3 +kerning first=70 second=39 amount=1 +kerning first=121 second=99 amount=-1 +kerning first=87 second=75 amount=1 +kerning first=68 second=88 amount=-2 +kerning first=115 second=102 amount=-1 +kerning first=90 second=118 amount=-1 +kerning first=75 second=81 amount=-1 +kerning first=84 second=121 amount=1 +kerning first=82 second=74 amount=2 +kerning first=76 second=77 amount=1 +kerning first=89 second=67 amount=-2 +kerning first=121 second=44 amount=-3 +kerning first=80 second=116 amount=1 +kerning first=84 second=66 amount=1 +kerning first=65 second=79 amount=-2 +kerning first=47 second=88 amount=2 +kerning first=79 second=65 amount=-2 +kerning first=86 second=58 amount=-2 +kerning first=76 second=111 amount=1 +kerning first=70 second=114 amount=1 +kerning first=89 second=101 amount=-4 +kerning first=89 second=46 amount=-3 +kerning first=92 second=89 amount=-4 +kerning first=114 second=119 amount=1 +kerning first=84 second=45 amount=-3 +kerning first=89 second=39 amount=1 +kerning first=102 second=125 amount=3 +kerning first=109 second=118 amount=-1 +kerning first=79 second=44 amount=-1 +kerning first=103 second=121 amount=1 +kerning first=88 second=84 amount=1 +kerning first=82 second=87 amount=-1 +kerning first=76 second=90 amount=1 +kerning first=123 second=104 amount=1 +kerning first=83 second=83 amount=1 +kerning first=118 second=103 amount=-1 +kerning first=112 second=106 amount=-1 +kerning first=119 second=99 amount=-1 +kerning first=81 second=125 amount=1 +kerning first=107 second=105 amount=1 +kerning first=101 second=108 amount=-1 +kerning first=82 second=121 amount=-1 +kerning first=86 second=71 amount=-2 +kerning first=114 second=98 amount=-1 +kerning first=80 second=74 amount=-2 +kerning first=89 second=114 amount=-2 +kerning first=87 second=67 amount=-2 +kerning first=119 second=44 amount=-3 +kerning first=75 second=73 amount=2 +kerning first=82 second=66 amount=1 +kerning first=91 second=106 amount=3 +kerning first=85 second=109 amount=-2 +kerning first=89 second=59 amount=-2 +kerning first=108 second=46 amount=-1 +kerning first=45 second=88 amount=-2 +kerning first=92 second=102 amount=-1 +kerning first=77 second=65 amount=1 +kerning first=80 second=108 amount=-1 +kerning first=65 second=71 amount=-1 +kerning first=84 second=58 amount=-1 +kerning first=103 second=45 amount=-1 +kerning first=40 second=87 amount=1 +kerning first=87 second=101 amount=-3 +kerning first=98 second=44 amount=-1 +kerning first=88 second=97 amount=1 +kerning first=89 second=93 amount=1 +kerning first=70 second=106 amount=1 +kerning first=117 second=120 amount=1 +kerning first=45 second=122 amount=-1 +kerning first=87 second=46 amount=-3 +kerning first=90 second=89 amount=1 +kerning first=112 second=119 amount=-1 +kerning first=82 second=45 amount=1 +kerning first=87 second=39 amount=1 +kerning first=100 second=125 amount=1 +kerning first=119 second=112 amount=1 +kerning first=85 second=88 amount=2 +kerning first=45 second=67 amount=1 +kerning first=92 second=81 amount=-2 +kerning first=101 second=121 amount=-1 +kerning first=86 second=84 amount=1 +kerning first=67 second=97 amount=-1 +kerning first=99 second=74 amount=1 +kerning first=102 second=117 amount=1 +kerning first=87 second=80 amount=1 +kerning first=115 second=107 amount=-1 +kerning first=75 second=86 amount=2 +kerning first=107 second=63 amount=-1 +kerning first=39 second=90 amount=1 +kerning first=97 second=116 amount=-1 +kerning first=110 second=106 amount=-1 +kerning first=85 second=122 amount=-2 +kerning first=77 second=78 amount=1 +kerning first=99 second=108 amount=-1 +kerning first=80 second=121 amount=1 +kerning first=65 second=84 amount=-1 +kerning first=87 second=114 amount=-2 +kerning first=46 second=42 amount=-1 +kerning first=87 second=59 amount=-1 +kerning first=75 second=65 amount=3 +kerning first=65 second=118 amount=-3 +kerning first=84 second=105 amount=1 +kerning first=107 second=42 amount=-1 +kerning first=101 second=45 amount=1 +kerning first=91 second=98 amount=1 +kerning first=102 second=41 amount=2 +kerning first=120 second=121 amount=1 +kerning first=105 second=84 amount=-1 +kerning first=86 second=97 amount=-4 +kerning first=87 second=93 amount=1 +kerning first=85 second=46 amount=-2 +kerning first=47 second=72 amount=2 +kerning first=88 second=89 amount=2 +kerning first=110 second=119 amount=-2 +kerning first=80 second=45 amount=-2 +kerning first=105 second=118 amount=-1 +kerning first=118 second=108 amount=-1 +kerning first=122 second=58 amount=1 +kerning first=84 second=84 amount=1 +kerning first=65 second=97 amount=1 +kerning first=78 second=87 amount=1 +kerning first=107 second=110 amount=1 +kerning first=92 second=73 amount=-1 +kerning first=73 second=86 amount=1 +kerning first=86 second=76 amount=1 +kerning first=89 second=119 amount=-3 +kerning first=108 second=106 amount=-1 +kerning first=87 second=72 amount=1 +kerning first=75 second=78 amount=2 +kerning first=84 second=118 amount=1 +kerning first=78 second=121 amount=-2 +kerning first=101 second=58 amount=1 +kerning first=120 second=45 amount=-2 +kerning first=123 second=88 amount=1 +kerning first=85 second=114 amount=-2 +kerning first=87 second=106 amount=-1 +kerning first=47 second=85 amount=2 +kerning first=73 second=65 amount=1 +kerning first=105 second=42 amount=-1 +kerning first=70 second=111 amount=-2 +kerning first=118 second=121 amount=1 +kerning first=84 second=97 amount=-1 +kerning first=119 second=117 amount=1 +kerning first=102 second=33 amount=2 +kerning first=92 second=86 amount=-4 +kerning first=120 second=113 amount=-1 +kerning first=86 second=89 amount=2 +kerning first=114 second=116 amount=1 +kerning first=108 second=119 amount=-1 diff --git a/assets/bitmap/c059.png b/assets/bitmap/c059.png new file mode 100644 index 0000000..4dfe109 Binary files /dev/null and b/assets/bitmap/c059.png differ diff --git a/assets/fullscreen-1.png b/assets/fullscreen-1.png new file mode 100644 index 0000000..02a228b Binary files /dev/null and b/assets/fullscreen-1.png differ diff --git a/assets/ui/font-list.fnt b/assets/ui/font-list.fnt new file mode 100644 index 0000000..5fd54da --- /dev/null +++ b/assets/ui/font-list.fnt @@ -0,0 +1,198 @@ +info face="font-list" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=15 base=11 scaleW=505 scaleH=30 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="font-list.png" +chars count=193 +char id=0 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=11 xadvance=3 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=33 x=391 y=14 width=2 height=7 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=34 x=248 y=23 width=3 height=3 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=35 x=466 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=36 x=9 y=2 width=5 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=37 x=490 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=38 x=450 y=14 width=7 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=39 x=267 y=23 width=2 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=40 x=126 y=2 width=3 height=9 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=41 x=131 y=2 width=2 height=9 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=42 x=46 y=23 width=4 height=5 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=43 x=73 y=23 width=6 height=5 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=44 x=263 y=23 width=2 height=3 xoffset=-1 yoffset=9 xadvance=3 page=0 chnl=0 +char id=45 x=306 y=23 width=4 height=1 xoffset=-1 yoffset=8 xadvance=5 page=0 chnl=0 +char id=46 x=296 y=23 width=2 height=1 xoffset=-1 yoffset=10 xadvance=3 page=0 chnl=0 +char id=47 x=354 y=2 width=4 height=8 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=48 x=383 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=49 x=317 y=14 width=3 height=7 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=50 x=322 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=51 x=329 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=52 x=336 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=53 x=344 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=54 x=352 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=55 x=360 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=56 x=367 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=57 x=375 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=58 x=201 y=23 width=2 height=4 xoffset=-1 yoffset=7 xadvance=3 page=0 chnl=0 +char id=59 x=118 y=23 width=2 height=5 xoffset=-1 yoffset=7 xadvance=3 page=0 chnl=0 +char id=60 x=59 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=61 x=271 y=23 width=5 height=3 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=62 x=52 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=63 x=395 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=64 x=161 y=2 width=10 height=9 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=65 x=443 y=2 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=66 x=494 y=2 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=67 x=0 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=68 x=8 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=69 x=16 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=70 x=24 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=71 x=31 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=72 x=54 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=73 x=502 y=2 width=2 height=7 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=74 x=332 y=2 width=3 height=8 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=75 x=69 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=76 x=77 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=77 x=84 y=14 width=8 height=7 xoffset=-1 yoffset=4 xadvance=9 page=0 chnl=0 +char id=78 x=94 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=79 x=102 y=14 width=7 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=80 x=111 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=81 x=117 y=2 width=7 height=9 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=82 x=126 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=83 x=134 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=84 x=141 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=85 x=174 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=86 x=199 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=87 x=207 y=14 width=9 height=7 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=88 x=218 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=89 x=226 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=90 x=234 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=91 x=135 y=2 width=3 height=9 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=92 x=367 y=2 width=4 height=8 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=93 x=140 y=2 width=3 height=9 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=94 x=187 y=23 width=5 height=4 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=95 x=285 y=23 width=5 height=1 xoffset=0 yoffset=12 xadvance=7 page=0 chnl=0 +char id=96 x=258 y=23 width=3 height=3 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=97 x=88 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=98 x=241 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=99 x=95 y=23 width=4 height=5 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=100 x=248 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=101 x=101 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=102 x=255 y=14 width=4 height=7 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=103 x=261 y=14 width=5 height=7 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=104 x=268 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=105 x=275 y=14 width=2 height=7 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=106 x=4 y=2 width=3 height=10 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=107 x=279 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=108 x=286 y=14 width=2 height=7 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=109 x=108 y=23 width=8 height=5 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 +char id=110 x=122 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=111 x=129 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=112 x=290 y=14 width=5 height=7 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=113 x=297 y=14 width=5 height=7 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=114 x=15 y=23 width=4 height=6 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=115 x=136 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=116 x=304 y=14 width=4 height=7 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=117 x=143 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=118 x=150 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=119 x=157 y=23 width=8 height=5 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 +char id=120 x=167 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=121 x=310 y=14 width=5 height=7 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=122 x=174 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=123 x=145 y=2 width=4 height=9 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=124 x=157 y=2 width=2 height=9 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=125 x=151 y=2 width=4 height=9 xoffset=-1 yoffset=3 xadvance=5 page=0 chnl=0 +char id=126 x=278 y=23 width=5 height=2 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=11 xadvance=3 page=0 chnl=0 +char id=161 x=195 y=14 width=2 height=7 xoffset=-1 yoffset=6 xadvance=3 page=0 chnl=0 +char id=162 x=189 y=14 width=4 height=7 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=163 x=182 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=164 x=8 y=23 width=5 height=6 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=165 x=166 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=166 x=180 y=2 width=2 height=9 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=167 x=415 y=2 width=5 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=168 x=312 y=23 width=4 height=1 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=169 x=0 y=23 width=6 height=6 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=170 x=181 y=23 width=4 height=4 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=171 x=66 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=172 x=241 y=23 width=5 height=3 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=174 x=498 y=14 width=6 height=6 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=175 x=300 y=23 width=4 height=1 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=176 x=235 y=23 width=4 height=3 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=177 x=38 y=23 width=6 height=5 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=178 x=230 y=23 width=3 height=3 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=179 x=225 y=23 width=3 height=3 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=180 x=220 y=23 width=3 height=3 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=181 x=47 y=14 width=5 height=7 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=182 x=39 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=183 x=292 y=23 width=2 height=1 xoffset=-1 yoffset=8 xadvance=3 page=0 chnl=0 +char id=184 x=215 y=23 width=3 height=3 xoffset=-1 yoffset=10 xadvance=4 page=0 chnl=0 +char id=185 x=211 y=23 width=2 height=3 xoffset=-1 yoffset=3 xadvance=4 page=0 chnl=0 +char id=186 x=205 y=23 width=4 height=3 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=187 x=31 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=6 page=0 chnl=0 +char id=188 x=184 y=2 width=5 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=189 x=191 y=2 width=5 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=190 x=198 y=2 width=6 height=9 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=191 x=472 y=2 width=5 height=7 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=192 x=16 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=193 x=24 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=194 x=213 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=195 x=221 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=196 x=229 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=197 x=237 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=198 x=149 y=14 width=9 height=7 xoffset=-1 yoffset=4 xadvance=10 page=0 chnl=0 +char id=199 x=245 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=200 x=39 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=201 x=47 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=202 x=253 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=203 x=261 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=204 x=55 y=2 width=4 height=10 xoffset=-2 yoffset=1 xadvance=3 page=0 chnl=0 +char id=205 x=61 y=2 width=3 height=10 xoffset=-1 yoffset=1 xadvance=3 page=0 chnl=0 +char id=206 x=285 y=2 width=4 height=9 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=207 x=291 y=2 width=4 height=9 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=208 x=414 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=209 x=297 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=210 x=66 y=2 width=7 height=10 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=211 x=75 y=2 width=7 height=10 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=212 x=305 y=2 width=7 height=9 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=213 x=323 y=2 width=7 height=9 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=214 x=314 y=2 width=7 height=9 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=215 x=81 y=23 width=5 height=5 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=216 x=84 y=2 width=7 height=10 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=217 x=93 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=218 x=101 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=7 page=0 chnl=0 +char id=219 x=277 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=220 x=269 y=2 width=6 height=9 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=221 x=109 y=2 width=6 height=10 xoffset=-1 yoffset=1 xadvance=6 page=0 chnl=0 +char id=222 x=474 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=223 x=486 y=2 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=224 x=436 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=225 x=429 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=226 x=451 y=2 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=227 x=465 y=2 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=228 x=479 y=2 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=229 x=422 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=230 x=21 y=23 width=8 height=5 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 +char id=231 x=160 y=14 width=4 height=7 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=232 x=408 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=233 x=360 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=234 x=429 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=235 x=422 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=236 x=349 y=2 width=3 height=8 xoffset=-2 yoffset=3 xadvance=3 page=0 chnl=0 +char id=237 x=344 y=2 width=3 height=8 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=238 x=408 y=14 width=4 height=7 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=239 x=402 y=14 width=4 height=7 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=240 x=337 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=241 x=119 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=242 x=394 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=243 x=387 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=244 x=443 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=245 x=436 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=246 x=62 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=247 x=194 y=23 width=5 height=4 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=248 x=373 y=2 width=5 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=249 x=380 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=250 x=401 y=2 width=5 height=8 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=251 x=459 y=14 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=252 x=458 y=2 width=5 height=7 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=253 x=32 y=2 width=5 height=10 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=254 x=206 y=2 width=5 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=255 x=173 y=2 width=5 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=8226 x=253 y=23 width=3 height=3 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=0 +char id=8364 x=482 y=14 width=6 height=7 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +kernings count=0 diff --git a/assets/ui/font-subtitle.fnt b/assets/ui/font-subtitle.fnt new file mode 100644 index 0000000..4351cfc --- /dev/null +++ b/assets/ui/font-subtitle.fnt @@ -0,0 +1,198 @@ +info face="font-subtitle" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=18 base=13 scaleW=505 scaleH=36 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="font-subtitle.png" +chars count=193 +char id=0 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=13 xadvance=3 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=33 x=9 y=27 width=1 height=8 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=34 x=351 y=27 width=4 height=3 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=35 x=46 y=27 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=36 x=7 y=2 width=6 height=12 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=37 x=117 y=16 width=7 height=9 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=38 x=28 y=27 width=8 height=8 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=39 x=370 y=27 width=2 height=3 xoffset=-1 yoffset=5 xadvance=2 page=0 chnl=0 +char id=40 x=39 y=2 width=3 height=11 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=41 x=44 y=2 width=3 height=11 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=42 x=270 y=27 width=5 height=5 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=43 x=164 y=27 width=7 height=6 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=44 x=379 y=27 width=2 height=3 xoffset=-1 yoffset=11 xadvance=2 page=0 chnl=0 +char id=45 x=410 y=27 width=5 height=1 xoffset=-1 yoffset=9 xadvance=6 page=0 chnl=0 +char id=46 x=436 y=27 width=2 height=1 xoffset=-1 yoffset=12 xadvance=2 page=0 chnl=0 +char id=47 x=341 y=2 width=5 height=10 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=48 x=0 y=27 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=49 x=441 y=16 width=4 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=50 x=447 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=51 x=455 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=52 x=463 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=53 x=472 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=54 x=480 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=55 x=55 y=16 width=5 height=9 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=56 x=489 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=57 x=498 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=58 x=277 y=27 width=2 height=5 xoffset=-1 yoffset=8 xadvance=2 page=0 chnl=0 +char id=59 x=112 y=27 width=2 height=7 xoffset=-1 yoffset=8 xadvance=3 page=0 chnl=0 +char id=60 x=148 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=61 x=362 y=27 width=6 height=3 xoffset=-1 yoffset=9 xadvance=7 page=0 chnl=0 +char id=62 x=139 y=27 width=7 height=6 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=63 x=12 y=27 width=5 height=8 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=64 x=348 y=2 width=12 height=10 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=0 +char id=65 x=145 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=66 x=154 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=67 x=162 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=68 x=171 y=16 width=7 height=8 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=69 x=180 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=70 x=188 y=16 width=5 height=8 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=0 +char id=71 x=212 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=72 x=228 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=73 x=236 y=16 width=1 height=8 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=74 x=379 y=2 width=3 height=9 xoffset=-1 yoffset=5 xadvance=3 page=0 chnl=0 +char id=75 x=249 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=76 x=257 y=16 width=5 height=8 xoffset=0 yoffset=5 xadvance=6 page=0 chnl=0 +char id=77 x=264 y=16 width=8 height=8 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=78 x=274 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=79 x=282 y=16 width=8 height=8 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=80 x=292 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=81 x=323 y=2 width=8 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=82 x=300 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=83 x=308 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=84 x=316 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=85 x=325 y=16 width=6 height=8 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=86 x=333 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=87 x=342 y=16 width=10 height=8 xoffset=-1 yoffset=5 xadvance=10 page=0 chnl=0 +char id=88 x=354 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=89 x=363 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=90 x=372 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=91 x=49 y=2 width=3 height=11 xoffset=0 yoffset=4 xadvance=4 page=0 chnl=0 +char id=92 x=102 y=16 width=5 height=9 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=93 x=54 y=2 width=3 height=11 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=94 x=310 y=27 width=6 height=4 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=95 x=417 y=27 width=6 height=1 xoffset=0 yoffset=14 xadvance=8 page=0 chnl=0 +char id=96 x=388 y=27 width=3 height=2 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=97 x=124 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=98 x=384 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=99 x=132 y=27 width=5 height=6 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=100 x=392 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=101 x=156 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=102 x=400 y=2 width=4 height=9 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=103 x=414 y=2 width=6 height=9 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=104 x=453 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=105 x=416 y=16 width=2 height=8 xoffset=-1 yoffset=5 xadvance=2 page=0 chnl=0 +char id=106 x=34 y=2 width=3 height=11 xoffset=-2 yoffset=5 xadvance=2 page=0 chnl=0 +char id=107 x=494 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=5 page=0 chnl=0 +char id=108 x=502 y=2 width=1 height=9 xoffset=0 yoffset=4 xadvance=2 page=0 chnl=0 +char id=109 x=185 y=27 width=10 height=6 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=110 x=197 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=111 x=205 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=112 x=31 y=16 width=6 height=9 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=113 x=39 y=16 width=6 height=9 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=114 x=106 y=27 width=4 height=7 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=115 x=213 y=27 width=5 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=116 x=434 y=16 width=5 height=8 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=117 x=220 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=118 x=228 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=119 x=236 y=27 width=9 height=6 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=120 x=247 y=27 width=5 height=6 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=121 x=47 y=16 width=6 height=9 xoffset=-1 yoffset=7 xadvance=6 page=0 chnl=0 +char id=122 x=254 y=27 width=5 height=6 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=123 x=59 y=2 width=4 height=11 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=124 x=4 y=2 width=1 height=12 xoffset=0 yoffset=4 xadvance=2 page=0 chnl=0 +char id=125 x=65 y=2 width=4 height=11 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=126 x=393 y=27 width=6 height=2 xoffset=-1 yoffset=9 xadvance=7 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=13 xadvance=3 page=0 chnl=0 +char id=161 x=126 y=16 width=2 height=9 xoffset=-1 yoffset=7 xadvance=2 page=0 chnl=0 +char id=162 x=130 y=16 width=5 height=9 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=0 +char id=163 x=221 y=16 width=5 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=164 x=89 y=27 width=6 height=7 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=165 x=203 y=16 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=166 x=15 y=2 width=1 height=12 xoffset=0 yoffset=4 xadvance=3 page=0 chnl=0 +char id=167 x=362 y=2 width=6 height=10 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=168 x=425 y=27 width=3 height=1 xoffset=-1 yoffset=5 xadvance=3 page=0 chnl=0 +char id=169 x=80 y=27 width=7 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=170 x=298 y=27 width=4 height=4 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=171 x=290 y=27 width=6 height=4 xoffset=-1 yoffset=8 xadvance=6 page=0 chnl=0 +char id=172 x=338 y=27 width=6 height=3 xoffset=-1 yoffset=9 xadvance=7 page=0 chnl=0 +char id=174 x=97 y=27 width=7 height=7 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=175 x=430 y=27 width=4 height=1 xoffset=-2 yoffset=5 xadvance=3 page=0 chnl=0 +char id=176 x=304 y=27 width=4 height=4 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=177 x=281 y=27 width=7 height=5 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=178 x=383 y=27 width=3 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=179 x=346 y=27 width=3 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=180 x=401 y=27 width=3 height=2 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=181 x=78 y=16 width=5 height=9 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=182 x=19 y=27 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=183 x=406 y=27 width=2 height=1 xoffset=-1 yoffset=9 xadvance=2 page=0 chnl=0 +char id=184 x=357 y=27 width=3 height=3 xoffset=-1 yoffset=13 xadvance=3 page=0 chnl=0 +char id=185 x=374 y=27 width=3 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=186 x=332 y=27 width=4 height=4 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=187 x=324 y=27 width=6 height=4 xoffset=-1 yoffset=8 xadvance=6 page=0 chnl=0 +char id=188 x=79 y=2 width=6 height=11 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=189 x=87 y=2 width=6 height=11 xoffset=-1 yoffset=3 xadvance=6 page=0 chnl=0 +char id=190 x=95 y=2 width=7 height=11 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=191 x=8 y=16 width=5 height=9 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=192 x=104 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=193 x=113 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=194 x=122 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=195 x=131 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=196 x=140 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=7 page=0 chnl=0 +char id=197 x=370 y=2 width=7 height=10 xoffset=-1 yoffset=3 xadvance=7 page=0 chnl=0 +char id=198 x=404 y=16 width=10 height=8 xoffset=-1 yoffset=5 xadvance=11 page=0 chnl=0 +char id=199 x=149 y=2 width=7 height=11 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=200 x=158 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0 +char id=201 x=166 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0 +char id=202 x=174 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0 +char id=203 x=182 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=7 page=0 chnl=0 +char id=204 x=190 y=2 width=4 height=11 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=205 x=196 y=2 width=3 height=11 xoffset=-1 yoffset=2 xadvance=3 page=0 chnl=0 +char id=206 x=201 y=2 width=5 height=11 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=207 x=208 y=2 width=4 height=11 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=208 x=239 y=16 width=8 height=8 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=209 x=214 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=210 x=222 y=2 width=8 height=11 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=211 x=232 y=2 width=8 height=11 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=212 x=242 y=2 width=8 height=11 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=213 x=252 y=2 width=8 height=11 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=214 x=262 y=2 width=8 height=11 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=215 x=116 y=27 width=6 height=6 xoffset=-1 yoffset=7 xadvance=7 page=0 chnl=0 +char id=216 x=313 y=2 width=8 height=11 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=217 x=305 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=218 x=297 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=219 x=289 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=220 x=281 y=2 width=6 height=11 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=221 x=272 y=2 width=7 height=11 xoffset=-1 yoffset=2 xadvance=6 page=0 chnl=0 +char id=222 x=38 y=27 width=6 height=8 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=223 x=85 y=16 width=7 height=9 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=224 x=94 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=225 x=137 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=226 x=469 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=227 x=380 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=228 x=388 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=229 x=406 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=230 x=173 y=27 width=10 height=6 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=231 x=422 y=2 width=5 height=9 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=232 x=429 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=233 x=437 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=234 x=445 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=235 x=396 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=236 x=477 y=2 width=3 height=9 xoffset=-2 yoffset=4 xadvance=2 page=0 chnl=0 +char id=237 x=482 y=2 width=4 height=9 xoffset=-1 yoffset=4 xadvance=2 page=0 chnl=0 +char id=238 x=488 y=2 width=4 height=9 xoffset=-2 yoffset=4 xadvance=2 page=0 chnl=0 +char id=239 x=420 y=16 width=4 height=8 xoffset=-2 yoffset=5 xadvance=2 page=0 chnl=0 +char id=240 x=0 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=241 x=426 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=242 x=15 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=243 x=23 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=244 x=109 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=245 x=63 y=27 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=246 x=55 y=27 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=247 x=261 y=27 width=7 height=5 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=248 x=333 y=2 width=6 height=10 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=249 x=70 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=250 x=62 y=16 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=251 x=461 y=2 width=6 height=9 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=252 x=195 y=16 width=6 height=8 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=253 x=26 y=2 width=6 height=12 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=254 x=18 y=2 width=6 height=12 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=255 x=71 y=2 width=6 height=11 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=8226 x=318 y=27 width=4 height=4 xoffset=0 yoffset=8 xadvance=6 page=0 chnl=0 +char id=8364 x=71 y=27 width=7 height=8 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +kernings count=0 diff --git a/assets/ui/font-window.fnt b/assets/ui/font-window.fnt new file mode 100644 index 0000000..763811f --- /dev/null +++ b/assets/ui/font-window.fnt @@ -0,0 +1,198 @@ +info face="font-window" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=27 base=20 scaleW=506 scaleH=62 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="font-window.png" +chars count=193 +char id=0 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=20 xadvance=4 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=4 page=0 chnl=0 +char id=33 x=276 y=38 width=2 height=12 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=34 x=293 y=52 width=5 height=4 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=35 x=370 y=38 width=10 height=12 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=36 x=175 y=2 width=8 height=16 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=37 x=62 y=22 width=10 height=14 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=0 +char id=38 x=343 y=38 width=13 height=12 xoffset=0 yoffset=8 xadvance=13 page=0 chnl=0 +char id=39 x=306 y=52 width=2 height=4 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=40 x=392 y=2 width=4 height=15 xoffset=0 yoffset=7 xadvance=5 page=0 chnl=0 +char id=41 x=398 y=2 width=4 height=15 xoffset=-1 yoffset=7 xadvance=5 page=0 chnl=0 +char id=42 x=172 y=52 width=7 height=8 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=43 x=465 y=38 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=44 x=300 y=52 width=4 height=4 xoffset=-1 yoffset=18 xadvance=5 page=0 chnl=0 +char id=45 x=359 y=52 width=5 height=2 xoffset=0 yoffset=14 xadvance=7 page=0 chnl=0 +char id=46 x=330 y=52 width=2 height=3 xoffset=0 yoffset=17 xadvance=4 page=0 chnl=0 +char id=47 x=0 y=22 width=8 height=14 xoffset=-1 yoffset=7 xadvance=8 page=0 chnl=0 +char id=48 x=265 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=49 x=174 y=38 width=6 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=50 x=182 y=38 width=7 height=12 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=0 +char id=51 x=191 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=52 x=201 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=53 x=212 y=38 width=9 height=12 xoffset=-1 yoffset=8 xadvance=10 page=0 chnl=0 +char id=54 x=223 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=55 x=234 y=38 width=7 height=12 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=0 +char id=56 x=243 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=57 x=254 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=58 x=192 y=52 width=2 height=8 xoffset=0 yoffset=12 xadvance=4 page=0 chnl=0 +char id=59 x=444 y=38 width=4 height=10 xoffset=-1 yoffset=12 xadvance=4 page=0 chnl=0 +char id=60 x=0 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=61 x=204 y=52 width=8 height=6 xoffset=0 yoffset=12 xadvance=10 page=0 chnl=0 +char id=62 x=495 y=38 width=8 height=9 xoffset=1 yoffset=11 xadvance=11 page=0 chnl=0 +char id=63 x=280 y=38 width=7 height=12 xoffset=-1 yoffset=8 xadvance=8 page=0 chnl=0 +char id=64 x=157 y=2 width=16 height=16 xoffset=0 yoffset=8 xadvance=18 page=0 chnl=0 +char id=65 x=303 y=22 width=11 height=12 xoffset=-1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=66 x=316 y=22 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=67 x=326 y=22 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=68 x=336 y=22 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=69 x=347 y=22 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=70 x=357 y=22 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=71 x=367 y=22 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=72 x=378 y=22 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=73 x=389 y=22 width=2 height=12 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=74 x=122 y=22 width=4 height=13 xoffset=-1 yoffset=8 xadvance=5 page=0 chnl=0 +char id=75 x=393 y=22 width=9 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=76 x=404 y=22 width=7 height=12 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=0 +char id=77 x=413 y=22 width=13 height=12 xoffset=0 yoffset=8 xadvance=15 page=0 chnl=0 +char id=78 x=440 y=22 width=10 height=12 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=79 x=462 y=22 width=10 height=12 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=80 x=478 y=22 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=81 x=380 y=2 width=10 height=15 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=82 x=0 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=83 x=11 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=84 x=21 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=85 x=32 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=86 x=43 y=38 width=11 height=12 xoffset=-1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=87 x=56 y=38 width=17 height=12 xoffset=-1 yoffset=8 xadvance=17 page=0 chnl=0 +char id=88 x=75 y=38 width=11 height=12 xoffset=-1 yoffset=8 xadvance=10 page=0 chnl=0 +char id=89 x=88 y=38 width=10 height=12 xoffset=-1 yoffset=8 xadvance=10 page=0 chnl=0 +char id=90 x=100 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=91 x=404 y=2 width=5 height=15 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=0 +char id=92 x=10 y=22 width=9 height=14 xoffset=-1 yoffset=7 xadvance=9 page=0 chnl=0 +char id=93 x=411 y=2 width=4 height=15 xoffset=0 yoffset=7 xadvance=6 page=0 chnl=0 +char id=94 x=222 y=52 width=10 height=6 xoffset=-1 yoffset=8 xadvance=10 page=0 chnl=0 +char id=95 x=349 y=52 width=8 height=2 xoffset=1 yoffset=21 xadvance=12 page=0 chnl=0 +char id=96 x=279 y=52 width=6 height=5 xoffset=-2 yoffset=6 xadvance=5 page=0 chnl=0 +char id=97 x=32 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=98 x=110 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=99 x=42 y=52 width=7 height=9 xoffset=0 yoffset=11 xadvance=8 page=0 chnl=0 +char id=100 x=120 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=101 x=51 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=102 x=130 y=38 width=6 height=12 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=103 x=158 y=22 width=8 height=13 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=104 x=138 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=105 x=148 y=38 width=2 height=12 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=106 x=147 y=2 width=4 height=16 xoffset=-2 yoffset=8 xadvance=4 page=0 chnl=0 +char id=107 x=152 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=9 page=0 chnl=0 +char id=108 x=162 y=38 width=2 height=12 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=109 x=61 y=52 width=12 height=9 xoffset=0 yoffset=11 xadvance=14 page=0 chnl=0 +char id=110 x=75 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=111 x=85 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=112 x=215 y=22 width=8 height=13 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=113 x=225 y=22 width=8 height=13 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=114 x=436 y=38 width=6 height=10 xoffset=0 yoffset=10 xadvance=7 page=0 chnl=0 +char id=115 x=95 y=52 width=7 height=9 xoffset=0 yoffset=11 xadvance=9 page=0 chnl=0 +char id=116 x=166 y=38 width=6 height=12 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=117 x=104 y=52 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=118 x=114 y=52 width=9 height=9 xoffset=-1 yoffset=11 xadvance=9 page=0 chnl=0 +char id=119 x=125 y=52 width=14 height=9 xoffset=-1 yoffset=11 xadvance=14 page=0 chnl=0 +char id=120 x=141 y=52 width=9 height=9 xoffset=-1 yoffset=11 xadvance=9 page=0 chnl=0 +char id=121 x=235 y=22 width=9 height=13 xoffset=-1 yoffset=11 xadvance=9 page=0 chnl=0 +char id=122 x=152 y=52 width=7 height=9 xoffset=0 yoffset=11 xadvance=9 page=0 chnl=0 +char id=123 x=417 y=2 width=6 height=15 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=124 x=153 y=2 width=2 height=16 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=125 x=425 y=2 width=6 height=15 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=126 x=320 y=52 width=8 height=3 xoffset=0 yoffset=14 xadvance=10 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=20 xadvance=4 page=0 chnl=0 +char id=161 x=474 y=22 width=2 height=12 xoffset=0 yoffset=11 xadvance=4 page=0 chnl=0 +char id=162 x=403 y=38 width=7 height=11 xoffset=1 yoffset=10 xadvance=10 page=0 chnl=0 +char id=163 x=452 y=22 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=164 x=21 y=52 width=9 height=9 xoffset=-1 yoffset=11 xadvance=9 page=0 chnl=0 +char id=165 x=428 y=22 width=10 height=12 xoffset=-1 yoffset=8 xadvance=10 page=0 chnl=0 +char id=166 x=185 y=2 width=2 height=16 xoffset=0 yoffset=8 xadvance=4 page=0 chnl=0 +char id=167 x=433 y=2 width=8 height=15 xoffset=0 yoffset=9 xadvance=10 page=0 chnl=0 +char id=168 x=341 y=52 width=6 height=2 xoffset=-1 yoffset=8 xadvance=5 page=0 chnl=0 +char id=169 x=424 y=38 width=10 height=10 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=0 +char id=170 x=250 y=52 width=6 height=5 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=171 x=161 y=52 width=9 height=8 xoffset=0 yoffset=12 xadvance=11 page=0 chnl=0 +char id=172 x=240 y=52 width=8 height=5 xoffset=0 yoffset=14 xadvance=10 page=0 chnl=0 +char id=174 x=412 y=38 width=10 height=10 xoffset=0 yoffset=7 xadvance=12 page=0 chnl=0 +char id=175 x=334 y=52 width=5 height=2 xoffset=-1 yoffset=8 xadvance=5 page=0 chnl=0 +char id=176 x=196 y=52 width=6 height=6 xoffset=1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=177 x=485 y=38 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=178 x=265 y=52 width=4 height=5 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=0 +char id=179 x=234 y=52 width=4 height=5 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=0 +char id=180 x=271 y=52 width=6 height=5 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=181 x=266 y=22 width=8 height=13 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=182 x=321 y=38 width=10 height=12 xoffset=-1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=183 x=316 y=52 width=2 height=3 xoffset=0 yoffset=14 xadvance=4 page=0 chnl=0 +char id=184 x=310 y=52 width=4 height=4 xoffset=-1 yoffset=20 xadvance=5 page=0 chnl=0 +char id=185 x=287 y=52 width=4 height=5 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=186 x=214 y=52 width=6 height=6 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=187 x=181 y=52 width=9 height=8 xoffset=0 yoffset=12 xadvance=11 page=0 chnl=0 +char id=188 x=443 y=2 width=9 height=15 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=189 x=454 y=2 width=9 height=15 xoffset=-1 yoffset=7 xadvance=10 page=0 chnl=0 +char id=190 x=189 y=2 width=9 height=16 xoffset=-1 yoffset=6 xadvance=10 page=0 chnl=0 +char id=191 x=168 y=22 width=7 height=13 xoffset=0 yoffset=11 xadvance=8 page=0 chnl=0 +char id=192 x=27 y=2 width=11 height=17 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=193 x=40 y=2 width=11 height=17 xoffset=-1 yoffset=3 xadvance=11 page=0 chnl=0 +char id=194 x=222 y=2 width=11 height=16 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=195 x=235 y=2 width=11 height=16 xoffset=-1 yoffset=4 xadvance=11 page=0 chnl=0 +char id=196 x=248 y=2 width=12 height=16 xoffset=-2 yoffset=4 xadvance=10 page=0 chnl=0 +char id=197 x=465 y=2 width=12 height=15 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=0 +char id=198 x=489 y=22 width=15 height=12 xoffset=-1 yoffset=8 xadvance=16 page=0 chnl=0 +char id=199 x=262 y=2 width=8 height=16 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=200 x=53 y=2 width=8 height=17 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=201 x=63 y=2 width=8 height=17 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=202 x=272 y=2 width=8 height=16 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=203 x=282 y=2 width=8 height=16 xoffset=0 yoffset=4 xadvance=10 page=0 chnl=0 +char id=204 x=73 y=2 width=6 height=17 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0 +char id=205 x=81 y=2 width=6 height=17 xoffset=-2 yoffset=3 xadvance=4 page=0 chnl=0 +char id=206 x=292 y=2 width=8 height=16 xoffset=-3 yoffset=4 xadvance=4 page=0 chnl=0 +char id=207 x=302 y=2 width=6 height=16 xoffset=-1 yoffset=4 xadvance=6 page=0 chnl=0 +char id=208 x=358 y=38 width=10 height=12 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=209 x=310 y=2 width=10 height=16 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=210 x=89 y=2 width=10 height=17 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=211 x=101 y=2 width=10 height=17 xoffset=0 yoffset=3 xadvance=12 page=0 chnl=0 +char id=212 x=322 y=2 width=10 height=16 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=213 x=334 y=2 width=10 height=16 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=214 x=346 y=2 width=10 height=16 xoffset=0 yoffset=4 xadvance=12 page=0 chnl=0 +char id=215 x=10 y=52 width=9 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=216 x=4 y=2 width=10 height=18 xoffset=0 yoffset=5 xadvance=12 page=0 chnl=0 +char id=217 x=113 y=2 width=9 height=17 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 +char id=218 x=124 y=2 width=9 height=17 xoffset=0 yoffset=3 xadvance=11 page=0 chnl=0 +char id=219 x=358 y=2 width=9 height=16 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=220 x=369 y=2 width=9 height=16 xoffset=0 yoffset=4 xadvance=11 page=0 chnl=0 +char id=221 x=135 y=2 width=10 height=17 xoffset=-1 yoffset=3 xadvance=10 page=0 chnl=0 +char id=222 x=289 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=223 x=300 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=224 x=74 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=225 x=84 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=226 x=185 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=227 x=333 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=228 x=256 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=229 x=32 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=230 x=450 y=38 width=13 height=9 xoffset=0 yoffset=11 xadvance=15 page=0 chnl=0 +char id=231 x=276 y=22 width=7 height=13 xoffset=0 yoffset=11 xadvance=8 page=0 chnl=0 +char id=232 x=94 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=233 x=112 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=234 x=128 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=235 x=138 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=236 x=104 y=22 width=6 height=14 xoffset=-3 yoffset=6 xadvance=4 page=0 chnl=0 +char id=237 x=499 y=2 width=6 height=14 xoffset=-1 yoffset=6 xadvance=4 page=0 chnl=0 +char id=238 x=177 y=22 width=6 height=13 xoffset=-2 yoffset=7 xadvance=4 page=0 chnl=0 +char id=239 x=285 y=22 width=6 height=13 xoffset=-2 yoffset=7 xadvance=4 page=0 chnl=0 +char id=240 x=21 y=22 width=9 height=14 xoffset=0 yoffset=6 xadvance=11 page=0 chnl=0 +char id=241 x=382 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=242 x=489 y=2 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=243 x=479 y=2 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=244 x=148 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=245 x=311 y=38 width=8 height=12 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=246 x=246 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=247 x=475 y=38 width=8 height=9 xoffset=0 yoffset=11 xadvance=10 page=0 chnl=0 +char id=248 x=205 y=22 width=8 height=13 xoffset=0 yoffset=9 xadvance=10 page=0 chnl=0 +char id=249 x=42 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=250 x=52 y=22 width=8 height=14 xoffset=0 yoffset=6 xadvance=10 page=0 chnl=0 +char id=251 x=293 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=252 x=195 y=22 width=8 height=13 xoffset=0 yoffset=7 xadvance=10 page=0 chnl=0 +char id=253 x=16 y=2 width=9 height=18 xoffset=-1 yoffset=6 xadvance=9 page=0 chnl=0 +char id=254 x=200 y=2 width=8 height=16 xoffset=0 yoffset=8 xadvance=10 page=0 chnl=0 +char id=255 x=210 y=2 width=10 height=16 xoffset=-2 yoffset=8 xadvance=8 page=0 chnl=0 +char id=8226 x=258 y=52 width=5 height=5 xoffset=1 yoffset=13 xadvance=9 page=0 chnl=0 +char id=8364 x=392 y=38 width=9 height=12 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +kernings count=0 diff --git a/assets/ui/font.fnt b/assets/ui/font.fnt new file mode 100644 index 0000000..5fc7350 --- /dev/null +++ b/assets/ui/font.fnt @@ -0,0 +1,198 @@ +info face="font" size=12 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=2 padding=1,1,1,1 spacing=0,0 +common lineHeight=21 base=15 scaleW=504 scaleH=44 pages=1 packed=0 alphaChnl=0 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="font.png" +chars count=193 +char id=0 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=15 xadvance=3 page=0 chnl=0 +char id=32 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=-1 xadvance=3 page=0 chnl=0 +char id=33 x=393 y=18 width=1 height=10 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=34 x=458 y=30 width=3 height=3 xoffset=0 yoffset=5 xadvance=5 page=0 chnl=0 +char id=35 x=101 y=30 width=8 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=36 x=142 y=2 width=6 height=13 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=37 x=496 y=18 width=7 height=10 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=38 x=0 y=30 width=9 height=10 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=39 x=463 y=30 width=1 height=3 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=40 x=272 y=2 width=3 height=12 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=0 +char id=41 x=277 y=2 width=3 height=12 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=42 x=369 y=30 width=6 height=5 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=43 x=315 y=30 width=7 height=7 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=44 x=435 y=30 width=3 height=3 xoffset=-1 yoffset=14 xadvance=3 page=0 chnl=0 +char id=45 x=497 y=30 width=5 height=1 xoffset=0 yoffset=11 xadvance=6 page=0 chnl=0 +char id=46 x=466 y=30 width=1 height=2 xoffset=0 yoffset=13 xadvance=3 page=0 chnl=0 +char id=47 x=446 y=2 width=6 height=11 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=48 x=120 y=30 width=7 height=9 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=0 +char id=49 x=41 y=30 width=4 height=9 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=0 +char id=50 x=47 y=30 width=7 height=9 xoffset=-1 yoffset=6 xadvance=7 page=0 chnl=0 +char id=51 x=56 y=30 width=6 height=9 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=52 x=64 y=30 width=8 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=53 x=74 y=30 width=7 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=54 x=83 y=30 width=7 height=9 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=0 +char id=55 x=385 y=18 width=6 height=10 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=56 x=92 y=30 width=7 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=57 x=111 y=30 width=7 height=9 xoffset=0 yoffset=6 xadvance=9 page=0 chnl=0 +char id=58 x=333 y=30 width=1 height=6 xoffset=0 yoffset=9 xadvance=3 page=0 chnl=0 +char id=59 x=164 y=30 width=3 height=8 xoffset=-1 yoffset=9 xadvance=3 page=0 chnl=0 +char id=60 x=214 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=61 x=449 y=30 width=7 height=3 xoffset=-1 yoffset=10 xadvance=8 page=0 chnl=0 +char id=62 x=206 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=63 x=396 y=18 width=6 height=10 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=64 x=128 y=2 width=12 height=13 xoffset=0 yoffset=5 xadvance=14 page=0 chnl=0 +char id=65 x=0 y=18 width=8 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=66 x=18 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=67 x=27 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=68 x=67 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=69 x=76 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=70 x=84 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=71 x=92 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=72 x=101 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=73 x=128 y=18 width=1 height=10 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=74 x=379 y=2 width=3 height=11 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=75 x=131 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=76 x=140 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=77 x=148 y=18 width=9 height=10 xoffset=0 yoffset=5 xadvance=11 page=0 chnl=0 +char id=78 x=159 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=79 x=168 y=18 width=8 height=10 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=80 x=178 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=81 x=262 y=2 width=8 height=12 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=82 x=195 y=18 width=8 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=83 x=205 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=84 x=213 y=18 width=7 height=10 xoffset=-1 yoffset=5 xadvance=7 page=0 chnl=0 +char id=85 x=222 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=86 x=231 y=18 width=8 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=87 x=241 y=18 width=12 height=10 xoffset=-1 yoffset=5 xadvance=12 page=0 chnl=0 +char id=88 x=260 y=18 width=8 height=10 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=89 x=270 y=18 width=9 height=10 xoffset=-2 yoffset=5 xadvance=7 page=0 chnl=0 +char id=90 x=281 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=91 x=282 y=2 width=3 height=12 xoffset=0 yoffset=5 xadvance=4 page=0 chnl=0 +char id=92 x=462 y=2 width=6 height=11 xoffset=-1 yoffset=5 xadvance=6 page=0 chnl=0 +char id=93 x=287 y=2 width=3 height=12 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=94 x=360 y=30 width=7 height=5 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=95 x=481 y=30 width=7 height=1 xoffset=0 yoffset=16 xadvance=9 page=0 chnl=0 +char id=96 x=423 y=30 width=4 height=3 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=97 x=198 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=98 x=296 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=99 x=222 y=30 width=5 height=7 xoffset=0 yoffset=8 xadvance=6 page=0 chnl=0 +char id=100 x=304 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=101 x=229 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=102 x=312 y=18 width=5 height=10 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=103 x=319 y=18 width=7 height=10 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=104 x=328 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=105 x=336 y=18 width=1 height=10 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=106 x=120 y=2 width=3 height=13 xoffset=-2 yoffset=5 xadvance=3 page=0 chnl=0 +char id=107 x=349 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=108 x=357 y=18 width=1 height=10 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=109 x=237 y=30 width=9 height=7 xoffset=0 yoffset=8 xadvance=11 page=0 chnl=0 +char id=110 x=248 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=111 x=256 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=112 x=360 y=18 width=6 height=10 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=113 x=368 y=18 width=6 height=10 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=114 x=158 y=30 width=4 height=8 xoffset=0 yoffset=7 xadvance=5 page=0 chnl=0 +char id=115 x=264 y=30 width=5 height=7 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=116 x=34 y=30 width=5 height=9 xoffset=-1 yoffset=6 xadvance=5 page=0 chnl=0 +char id=117 x=271 y=30 width=5 height=7 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=118 x=278 y=30 width=7 height=7 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=119 x=287 y=30 width=11 height=7 xoffset=-1 yoffset=8 xadvance=11 page=0 chnl=0 +char id=120 x=300 y=30 width=6 height=7 xoffset=-1 yoffset=8 xadvance=6 page=0 chnl=0 +char id=121 x=376 y=18 width=7 height=10 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=122 x=308 y=30 width=5 height=7 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=123 x=292 y=2 width=5 height=12 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=124 x=125 y=2 width=1 height=13 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=125 x=299 y=2 width=5 height=12 xoffset=-1 yoffset=5 xadvance=5 page=0 chnl=0 +char id=126 x=469 y=30 width=7 height=2 xoffset=-1 yoffset=10 xadvance=8 page=0 chnl=0 +char id=160 x=0 y=0 width=0 height=0 xoffset=-1 yoffset=15 xadvance=3 page=0 chnl=0 +char id=161 x=31 y=30 width=1 height=9 xoffset=0 yoffset=8 xadvance=3 page=0 chnl=0 +char id=162 x=289 y=18 width=5 height=10 xoffset=0 yoffset=7 xadvance=7 page=0 chnl=0 +char id=163 x=22 y=30 width=7 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +char id=164 x=189 y=30 width=7 height=7 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=165 x=11 y=30 width=9 height=9 xoffset=-2 yoffset=6 xadvance=7 page=0 chnl=0 +char id=166 x=150 y=2 width=1 height=13 xoffset=0 yoffset=5 xadvance=3 page=0 chnl=0 +char id=167 x=486 y=2 width=5 height=11 xoffset=0 yoffset=6 xadvance=7 page=0 chnl=0 +char id=168 x=0 y=42 width=4 height=1 xoffset=-1 yoffset=5 xadvance=4 page=0 chnl=0 +char id=169 x=148 y=30 width=8 height=8 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=170 x=416 y=30 width=5 height=4 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=0 +char id=171 x=352 y=30 width=6 height=5 xoffset=0 yoffset=9 xadvance=7 page=0 chnl=0 +char id=172 x=440 y=30 width=7 height=3 xoffset=-1 yoffset=10 xadvance=8 page=0 chnl=0 +char id=174 x=138 y=30 width=8 height=8 xoffset=0 yoffset=5 xadvance=10 page=0 chnl=0 +char id=175 x=490 y=30 width=5 height=1 xoffset=-2 yoffset=6 xadvance=3 page=0 chnl=0 +char id=176 x=410 y=30 width=4 height=4 xoffset=1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=177 x=324 y=30 width=7 height=6 xoffset=-1 yoffset=8 xadvance=7 page=0 chnl=0 +char id=178 x=405 y=30 width=3 height=4 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=179 x=399 y=30 width=4 height=4 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=180 x=429 y=30 width=4 height=3 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=181 x=121 y=18 width=5 height=10 xoffset=0 yoffset=8 xadvance=7 page=0 chnl=0 +char id=182 x=110 y=18 width=9 height=10 xoffset=-1 yoffset=5 xadvance=9 page=0 chnl=0 +char id=183 x=478 y=30 width=1 height=2 xoffset=0 yoffset=10 xadvance=3 page=0 chnl=0 +char id=184 x=394 y=30 width=3 height=4 xoffset=-1 yoffset=14 xadvance=4 page=0 chnl=0 +char id=185 x=389 y=30 width=3 height=4 xoffset=-1 yoffset=4 xadvance=4 page=0 chnl=0 +char id=186 x=383 y=30 width=4 height=4 xoffset=0 yoffset=6 xadvance=6 page=0 chnl=0 +char id=187 x=344 y=30 width=6 height=5 xoffset=0 yoffset=9 xadvance=7 page=0 chnl=0 +char id=188 x=315 y=2 width=8 height=12 xoffset=-1 yoffset=4 xadvance=8 page=0 chnl=0 +char id=189 x=325 y=2 width=7 height=12 xoffset=-1 yoffset=5 xadvance=8 page=0 chnl=0 +char id=190 x=153 y=2 width=8 height=13 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=191 x=36 y=18 width=6 height=10 xoffset=-1 yoffset=8 xadvance=6 page=0 chnl=0 +char id=192 x=4 y=2 width=8 height=14 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=193 x=14 y=2 width=8 height=14 xoffset=-1 yoffset=1 xadvance=8 page=0 chnl=0 +char id=194 x=173 y=2 width=8 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=195 x=183 y=2 width=8 height=13 xoffset=-1 yoffset=2 xadvance=8 page=0 chnl=0 +char id=196 x=334 y=2 width=8 height=12 xoffset=-1 yoffset=3 xadvance=8 page=0 chnl=0 +char id=197 x=344 y=2 width=9 height=12 xoffset=-1 yoffset=3 xadvance=9 page=0 chnl=0 +char id=198 x=482 y=18 width=12 height=10 xoffset=-1 yoffset=5 xadvance=13 page=0 chnl=0 +char id=199 x=193 y=2 width=6 height=13 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=200 x=24 y=2 width=6 height=14 xoffset=0 yoffset=1 xadvance=8 page=0 chnl=0 +char id=201 x=32 y=2 width=6 height=14 xoffset=0 yoffset=1 xadvance=8 page=0 chnl=0 +char id=202 x=209 y=2 width=6 height=13 xoffset=0 yoffset=2 xadvance=8 page=0 chnl=0 +char id=203 x=355 y=2 width=7 height=12 xoffset=0 yoffset=3 xadvance=8 page=0 chnl=0 +char id=204 x=49 y=2 width=4 height=14 xoffset=-2 yoffset=1 xadvance=3 page=0 chnl=0 +char id=205 x=55 y=2 width=4 height=14 xoffset=-1 yoffset=1 xadvance=3 page=0 chnl=0 +char id=206 x=217 y=2 width=5 height=13 xoffset=-2 yoffset=2 xadvance=3 page=0 chnl=0 +char id=207 x=374 y=2 width=3 height=12 xoffset=-1 yoffset=3 xadvance=3 page=0 chnl=0 +char id=208 x=339 y=18 width=8 height=10 xoffset=-1 yoffset=5 xadvance=9 page=0 chnl=0 +char id=209 x=224 y=2 width=7 height=13 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0 +char id=210 x=61 y=2 width=8 height=14 xoffset=0 yoffset=1 xadvance=10 page=0 chnl=0 +char id=211 x=71 y=2 width=8 height=14 xoffset=0 yoffset=1 xadvance=10 page=0 chnl=0 +char id=212 x=233 y=2 width=8 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=213 x=243 y=2 width=8 height=13 xoffset=0 yoffset=2 xadvance=10 page=0 chnl=0 +char id=214 x=364 y=2 width=8 height=12 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=215 x=181 y=30 width=6 height=7 xoffset=0 yoffset=8 xadvance=8 page=0 chnl=0 +char id=216 x=81 y=2 width=8 height=14 xoffset=0 yoffset=3 xadvance=10 page=0 chnl=0 +char id=217 x=91 y=2 width=7 height=14 xoffset=0 yoffset=1 xadvance=9 page=0 chnl=0 +char id=218 x=100 y=2 width=7 height=14 xoffset=0 yoffset=1 xadvance=9 page=0 chnl=0 +char id=219 x=253 y=2 width=7 height=13 xoffset=0 yoffset=2 xadvance=9 page=0 chnl=0 +char id=220 x=306 y=2 width=7 height=12 xoffset=0 yoffset=3 xadvance=9 page=0 chnl=0 +char id=221 x=109 y=2 width=9 height=14 xoffset=-2 yoffset=1 xadvance=7 page=0 chnl=0 +char id=222 x=426 y=18 width=7 height=10 xoffset=0 yoffset=5 xadvance=9 page=0 chnl=0 +char id=223 x=418 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=224 x=423 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=225 x=407 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=226 x=187 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=227 x=443 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=228 x=451 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=229 x=415 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=230 x=169 y=30 width=10 height=7 xoffset=0 yoffset=8 xadvance=12 page=0 chnl=0 +char id=231 x=404 y=18 width=5 height=10 xoffset=0 yoffset=8 xadvance=6 page=0 chnl=0 +char id=232 x=454 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=233 x=470 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=234 x=474 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=235 x=10 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=236 x=499 y=2 width=4 height=11 xoffset=-2 yoffset=4 xadvance=3 page=0 chnl=0 +char id=237 x=493 y=2 width=4 height=11 xoffset=-1 yoffset=4 xadvance=3 page=0 chnl=0 +char id=238 x=44 y=18 width=5 height=10 xoffset=-2 yoffset=5 xadvance=3 page=0 chnl=0 +char id=239 x=255 y=18 width=3 height=10 xoffset=-1 yoffset=5 xadvance=3 page=0 chnl=0 +char id=240 x=478 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=241 x=466 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=242 x=438 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=243 x=399 y=2 width=6 height=11 xoffset=0 yoffset=4 xadvance=8 page=0 chnl=0 +char id=244 x=435 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=245 x=59 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=246 x=51 y=18 width=6 height=10 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=247 x=336 y=30 width=6 height=5 xoffset=0 yoffset=9 xadvance=8 page=0 chnl=0 +char id=248 x=384 y=2 width=6 height=11 xoffset=0 yoffset=6 xadvance=8 page=0 chnl=0 +char id=249 x=392 y=2 width=5 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=250 x=431 y=2 width=5 height=11 xoffset=0 yoffset=4 xadvance=7 page=0 chnl=0 +char id=251 x=411 y=18 width=5 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=252 x=459 y=18 width=5 height=10 xoffset=0 yoffset=5 xadvance=7 page=0 chnl=0 +char id=253 x=40 y=2 width=7 height=14 xoffset=-1 yoffset=4 xadvance=7 page=0 chnl=0 +char id=254 x=201 y=2 width=6 height=13 xoffset=0 yoffset=5 xadvance=8 page=0 chnl=0 +char id=255 x=163 y=2 width=8 height=13 xoffset=-2 yoffset=5 xadvance=7 page=0 chnl=0 +char id=8226 x=377 y=30 width=4 height=4 xoffset=1 yoffset=10 xadvance=8 page=0 chnl=0 +char id=8364 x=129 y=30 width=7 height=9 xoffset=-1 yoffset=6 xadvance=8 page=0 chnl=0 +kernings count=0 diff --git a/assets/ui/uiskin.atlas b/assets/ui/uiskin.atlas new file mode 100644 index 0000000..0c6edf5 --- /dev/null +++ b/assets/ui/uiskin.atlas @@ -0,0 +1,380 @@ + +uiskin.png +size: 512,512 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +button-normal + rotate: false + xy: 2, 111 + size: 41, 42 + orig: 41, 42 + offset: 0, 0 + index: -1 +button-normal-over + rotate: false + xy: 102, 263 + size: 41, 42 + orig: 41, 42 + offset: 0, 0 + index: -1 +button-normal-pressed + rotate: false + xy: 2, 67 + size: 41, 42 + orig: 41, 42 + offset: 0, 0 + index: -1 +check + rotate: false + xy: 290, 306 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +check-on + rotate: false + xy: 316, 306 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +checkbox + rotate: false + xy: 482, 309 + size: 20, 21 + orig: 20, 21 + offset: 0, 0 + index: -1 +checkbox-over + rotate: false + xy: 438, 309 + size: 20, 21 + orig: 20, 21 + offset: 0, 0 + index: -1 +checkbox-selected + rotate: false + xy: 32, 18 + size: 20, 21 + orig: 20, 21 + offset: 0, 0 + index: -1 +checkbox-selected-over + rotate: false + xy: 460, 309 + size: 20, 21 + orig: 20, 21 + offset: 0, 0 + index: -1 +font + rotate: false + xy: 2, 402 + size: 504, 44 + orig: 504, 44 + offset: 0, 0 + index: -1 +font-list + rotate: false + xy: 2, 332 + size: 505, 30 + orig: 505, 30 + offset: 0, 0 + index: -1 +font-subtitle + rotate: false + xy: 2, 364 + size: 505, 36 + orig: 505, 36 + offset: 0, 0 + index: -1 +font-window + rotate: false + xy: 2, 448 + size: 506, 62 + orig: 506, 62 + offset: 0, 0 + index: -1 +knob-h + rotate: false + xy: 188, 268 + size: 24, 1 + orig: 24, 1 + offset: 0, 0 + index: -1 +knob-v + rotate: false + xy: 508, 422 + size: 1, 24 + orig: 1, 24 + offset: 0, 0 + index: -1 +line-h + rotate: false + xy: 102, 260 + size: 24, 1 + orig: 24, 1 + offset: 0, 0 + index: -1 +line-v + rotate: false + xy: 509, 396 + size: 1, 24 + orig: 1, 24 + offset: 0, 0 + index: -1 +list + rotate: false + xy: 188, 271 + size: 43, 34 + orig: 43, 34 + offset: 0, 0 + index: -1 +progress-bar + rotate: false + xy: 2, 307 + size: 252, 5 + orig: 252, 5 + offset: 0, 0 + index: -1 +progress-bar-knob + rotate: false + xy: 2, 314 + size: 252, 5 + orig: 252, 5 + offset: 0, 0 + index: -1 +progress-bar-square + rotate: false + xy: 256, 309 + size: 4, 4 + orig: 4, 4 + offset: 0, 0 + index: -1 +progress-bar-square-knob + rotate: false + xy: 504, 328 + size: 2, 2 + orig: 2, 2 + offset: 0, 0 + index: -1 +radio + rotate: false + xy: 366, 308 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +radio-over + rotate: false + xy: 390, 308 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +radio-selected + rotate: false + xy: 342, 308 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +radio-selected-over + rotate: false + xy: 414, 308 + size: 22, 22 + orig: 22, 22 + offset: 0, 0 + index: -1 +rect + rotate: false + xy: 32, 41 + size: 12, 24 + orig: 12, 24 + offset: 0, 0 + index: -1 +scrollbar + rotate: false + xy: 46, 150 + size: 17, 16 + orig: 17, 16 + offset: 0, 0 + index: -1 +select + rotate: false + xy: 262, 306 + size: 26, 24 + split: 4, 15, 0, 24 + orig: 26, 24 + offset: 0, 0 + index: -1 +select-box + rotate: false + xy: 145, 263 + size: 41, 42 + orig: 41, 42 + offset: 0, 0 + index: -1 +select-box-open + rotate: false + xy: 58, 214 + size: 41, 42 + orig: 41, 42 + offset: 0, 0 + index: -1 +selection + rotate: false + xy: 46, 168 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +slider + rotate: false + xy: 2, 321 + size: 258, 9 + orig: 258, 9 + offset: 0, 0 + index: -1 +slider-knob + rotate: false + xy: 46, 57 + size: 9, 9 + orig: 9, 9 + offset: 0, 0 + index: -1 +slider-knob-over + rotate: false + xy: 46, 46 + size: 9, 9 + orig: 9, 9 + offset: 0, 0 + index: -1 +spinner-down + rotate: false + xy: 45, 100 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +spinner-down-over + rotate: false + xy: 45, 68 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +spinner-down-pressed + rotate: false + xy: 45, 116 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +spinner-textfield + rotate: false + xy: 2, 7 + size: 28, 28 + orig: 28, 28 + offset: 0, 0 + index: -1 +spinner-textfield-selected + rotate: false + xy: 2, 37 + size: 28, 28 + orig: 28, 28 + offset: 0, 0 + index: -1 +spinner-up + rotate: false + xy: 32, 2 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +spinner-up-over + rotate: false + xy: 45, 84 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +spinner-up-pressed + rotate: false + xy: 50, 2 + size: 16, 14 + orig: 16, 14 + offset: 0, 0 + index: -1 +square + rotate: false + xy: 256, 315 + size: 4, 4 + orig: 4, 4 + offset: 0, 0 + index: -1 +textfield + rotate: false + xy: 2, 155 + size: 42, 47 + orig: 42, 47 + offset: 0, 0 + index: -1 +textfield-selected + rotate: false + xy: 58, 258 + size: 42, 47 + orig: 42, 47 + offset: 0, 0 + index: -1 +tree-minus + rotate: false + xy: 46, 186 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +tree-plus + rotate: false + xy: 45, 132 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +white + rotate: false + xy: 509, 393 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +dot + rotate: false + xy: 509, 393 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +window + rotate: false + xy: 2, 204 + size: 54, 101 + orig: 54, 101 + offset: 0, 0 + index: -1 +window-border + rotate: false + xy: 248, 279 + size: 5, 26 + split: 2, 2, 23, 2 + orig: 5, 26 + offset: 0, 0 + index: -1 +window-resize + rotate: false + xy: 233, 271 + size: 13, 34 + split: 2, 10, 23, 10 + orig: 13, 34 + offset: 0, 0 + index: -1 diff --git a/assets/ui/uiskin.json b/assets/ui/uiskin.json new file mode 100644 index 0000000..8658e76 --- /dev/null +++ b/assets/ui/uiskin.json @@ -0,0 +1,438 @@ +{ +com.badlogic.gdx.graphics.g2d.BitmapFont: { + default: { + file: font.fnt + } + font: { + file: font.fnt + } + list: { + file: font-list.fnt + } + subtitle: { + file: font-subtitle.fnt + } + window: { + file: font-window.fnt + } +} +com.badlogic.gdx.graphics.Color: { + black: { + r: 0 + g: 0 + b: 0 + a: 1 + } + disabled: { + r: 0.23137255 + g: 0.24705882 + b: 0.25882354 + a: 1 + } + highlight: { + r: 0.19215687 + g: 0.6627451 + b: 0.95686275 + a: 1 + } + message: { + r: 0.44313726 + g: 0.47843137 + b: 0.5372549 + a: 1 + } + split: { + r: 0.44313726 + g: 0.47843137 + b: 0.5372549 + a: 1 + } + white: { + r: 1 + g: 1 + b: 1 + a: 1 + } +} +com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: { + split: { + name: white + color: split + } + black: { + name: white + color: black + } + highlight: { + name: white + color: highlight + } +} +com.badlogic.gdx.scenes.scene2d.utils.TiledDrawable: { + progress-bar-knob-t: { + region: progress-bar-knob + minWidth: 0 + minHeight: 5 + } +} +com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: { + default: { + up: button-normal + down: button-normal-pressed + over: button-normal-over + focused: button-normal-over + } + spinner-up: { + up: spinner-up + down: spinner-up-pressed + over: spinner-up-over + } + spinner-down: { + up: spinner-down + down: spinner-down-pressed + over: spinner-down-over + } +} +com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle: { + default: { + checkboxOn: checkbox-selected + checkboxOff: checkbox + checkboxOnOver: checkbox-selected-over + checkboxOver: checkbox-over + font: font + } + radio: { + checkboxOn: radio-selected + checkboxOff: radio + checkboxOnOver: radio-selected-over + checkboxOver: radio-over + font: font + } +} +com.badlogic.gdx.scenes.scene2d.ui.ImageButton$ImageButtonStyle: { + default: { + up: button-normal + down: button-normal-pressed + over: button-normal-over + focused: button-normal-over + } +} +com.badlogic.gdx.scenes.scene2d.ui.ImageTextButton$ImageTextButtonStyle: { + default: { + font: font + up: button-normal + down: button-normal-pressed + over: button-normal-over + focused: button-normal-pressed + } +} +com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle: { + default: { + font: font + } + window: { + font: window + } + list: { + font: list + } + subtitle: { + font: subtitle + } +} +com.badlogic.gdx.scenes.scene2d.ui.List$ListStyle: { + default: { + font: list + fontColorSelected: white + fontColorUnselected: white + selection: selection + background: list + } + list-nobg: { + font: list + fontColorSelected: white + fontColorUnselected: white + selection: selection + } +} +com.badlogic.gdx.scenes.scene2d.ui.ProgressBar$ProgressBarStyle: { + default-horizontal: { + background: progress-bar-square + knobBefore: progress-bar-square-knob + } + default-vertical: { + background: progress-bar-square + knobBefore: progress-bar-square-knob + } + curved: { + background: progress-bar + knobBefore: progress-bar-knob-t + } +} +com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: { + default: { + hScrollKnob: scrollbar + vScrollKnob: scrollbar + } + list: { + background: list + hScrollKnob: scrollbar + vScrollKnob: scrollbar + } +} +com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: { + default: { + font: font + fontColor: white + background: select-box + scrollStyle: list + listStyle: list-nobg + backgroundOpen: select-box-open + } +} +com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: { + default-horizontal: { + knobOver: slider-knob-over + knobDown: slider-knob-over + background: progress-bar-square + knob: slider-knob + } + default-vertical: { + knobOver: slider-knob-over + knobDown: slider-knob-over + background: progress-bar-square + knob: slider-knob + } + curved: { + knobOver: slider-knob-over + knobDown: slider-knob-over + background: slider + knob: slider-knob + } +} +com.badlogic.gdx.scenes.scene2d.ui.SplitPane$SplitPaneStyle: { + default-horizontal: { + handle: split + } + default-vertical: { + handle: split + } +} +com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: { + default: { + font: font + up: button-normal + down: button-normal-pressed + over: button-normal-over + focused: button-normal-over + } +} +com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle: { + default: { + font: font + fontColor: white + disabledFontColor: disabled + background: textfield + focusedBackground: textfield-selected + cursor: white + selection: highlight + messageFont: font + messageFontColor: message + } + spinner: { + font: font + fontColor: white + disabledFontColor: disabled + background: spinner-textfield + focusedBackground: spinner-textfield-selected + cursor: white + selection: highlight + messageFont: font + messageFontColor: message + } +} +com.badlogic.gdx.scenes.scene2d.ui.TextTooltip$TextTooltipStyle: { + default: { + label: default + background: list + } +} +com.badlogic.gdx.scenes.scene2d.ui.Touchpad$TouchpadStyle: { + default: { + background: list + knob: slider-knob + } +} +com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle: { + default: { + background: window + titleFont: window + } +}, + + com.badlogic.gdx.graphics.Color: { + white: { r: 1, g: 1, b: 1, a: 1 }, + gray: { r: 0.5, g: 0.5, b: 0.5, a: 1 }, + black: { r: 0, g: 0, b: 0, a: 1 }, + + up: { r: 0.1, g: 0.1, b: 0.1, a: 1 }, + over: { r: 0.3, g: 0.3, b: 0.3, a: 1 }, + down: { r: 0.3, g: 0, b: 0, a: 1 }, + checked: { r: 0.3, g: 0, b: 0, a: 1 }, + checkedOver: { r: 0.4, g: 0, b: 0, a: 1 }, + disabled: { r: 0.4, g: 0.4, b: 0.4, a: 1 }, + background: { r: 0.2, g: 0.2, b: 0.2, a: 1 }, + selection: { r: 0.3, g: 0, b: 0, a: 1 }, + semiTransparent: { r: 0, g: 0, b: 0, a: 0.6 }, + + font: white + fontOver: white + fontDown: gray + fontChecked: white + fontCheckedOver: white + fontDisabled: gray + }, + com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: { + buttonUp: { name: rect, color: up }, + buttonOver: { name: rect, color: over }, + buttonDown: { name: rect, color: down }, + buttonDisabled: { name: rect, color: disabled }, + buttonChecked: { name: rect, color: checked }, + buttonCheckedOver: { name: rect, color: checkedOver }, + checkBoxOn: { name: check-on, color: up }, + checkBoxOff: { name: check, color: up }, + checkBoxOver: { name: check, color: over }, + checkBoxOnDisabled: { name: check-on, color: disabled }, + checkBoxOffDisabled: { name: check, color: disabled }, + icon: { name: check-on, color: font }, + selection: { name: dot, color: selection }, + list: { name: rect, color: background }, + progressHorizontal: { name: line-v, color: up }, + progressHorizontalKnob: { name: line-v, color: down }, + progressHorizontalDisabled: { name: line-v, color: disabled }, + progressHorizontalKnobDisabled: { name: line-v, color: disabled }, + progressVertical: { name: line-h, color: up }, + progressVerticalKnob: { name: line-h, color: down }, + progressVerticalDisabled: { name: line-h, color: disabled }, + progressVerticalKnobDisabled: { name: line-h, color: disabled }, + scrollHorizontal: { name: line-v, color: up }, + scrollVertical: { name: line-h, color: up }, + scrollKnob: { name: knob-v, color: down }, + scrollKnobVertical: { name: knob-h, color: down }, + scrollPane: { name: rect, color: background }, + selectBox: { name: select, color: up }, + selectOver: { name: select, color: over }, + selectDown: { name: select, color: over }, + selectDisabled: { name: select, color: disabled }, + selectList: { name: rect, color: over }, + splitPane: { name: square, color: down }, + sliderHorizontal: { name: square, color: up }, + sliderKnob: { name: rect, color: up }, + sliderKnobOver: { name: rect, color: over }, + sliderKnobDown: { name: rect, color: down }, + sliderKnobDisabled: { name: rect, color: disabled }, + sliderVertical: { name: square, color: up }, + sliderVerticalKnob: { name: rect, color: up }, + sliderVerticalKnobOver: { name: rect, color: over }, + sliderVerticalKnobDown: { name: rect, color: down }, + sliderVerticalKnobDisabled: { name: rect, color: disabled }, + textField: { name: rect, color: up }, + textFieldDown: { name: rect, color: over }, + textFieldDisabled: { name: rect, color: disabled }, + textFieldCursor: { name: dot, color: font }, + tooltip: { name: rect, color: up }, + touchpad: { name: rect, color: over }, + touchpadKnob: { name: check-on, color: down }, + tree: { name: rect, color: background }, + treeOver: { name: dot, color: over }, + treeMinus: { name: tree-minus, color: up }, + treePlus: { name: tree-plus, color: up }, + window: { name: rect, color: background }, + windowResize: { name: window-resize, color: background }, + windowBorder: { name: window-border, color: background }, + alpha: { name: dot, color: semiTransparent } + }, + com.badlogic.gdx.scenes.scene2d.ui.Button$ButtonStyle: { + default: { up: buttonUp, over: buttonOver, down: buttonDown, disabled: buttonDisabled }, + toggle: { up: buttonUp, over: buttonOver, down: buttonDown, checked: buttonChecked, checkedOver: buttonCheckedOver, disabled: buttonDisabled } + }, + com.badlogic.gdx.scenes.scene2d.ui.CheckBox$CheckBoxStyle: { + default: { checkboxOn: checkBoxOn, checkboxOff: checkBoxOff, checkboxOver: checkBoxOver, checkboxOnDisabled: checkBoxOnDisabled, + checkboxOffDisabled: checkBoxOffDisabled, font: default, fontColor: font, overFontColor: fontOver, downFontColor: fontDown, + checkedFontColor: fontChecked, checkedOverFontColor: fontCheckedOver, disabledFontColor: fontDisabled, pressedOffsetY: -1, pressedOffsetX: 1 } + }, + com.badlogic.gdx.scenes.scene2d.ui.ImageButton$ImageButtonStyle: { + default: { up: buttonUp, over: buttonOver, down: buttonDown, disabled: buttonDisabled, imageUp: icon } + }, + com.badlogic.gdx.scenes.scene2d.ui.ImageTextButton$ImageTextButtonStyle: { + default: { up: buttonUp, over: buttonOver, down: buttonDown, disabled: buttonDisabled, font: default, fontColor: font, + overFontColor: fontOver, downFontColor: fontDown, disabledFontColor: fontDisabled, pressedOffsetY: -1, pressedOffsetX: 1, imageUp: icon } + }, + com.badlogic.gdx.scenes.scene2d.ui.Label$LabelStyle: { + default: { font: default, fontColor: font }, + white: { font: default, fontColor: white } + }, + com.badlogic.gdx.scenes.scene2d.ui.List$ListStyle: { + default: { fontColorUnselected: font, selection: selection, fontColorSelected: fontDown, font: default }, + background: { background: list, fontColorUnselected: font, selection: selection, fontColorSelected: fontDown, font: default } + }, + com.badlogic.gdx.scenes.scene2d.ui.ProgressBar$ProgressBarStyle: { + default-horizontal: { background: progressHorizontal, knobBefore: progressHorizontalKnob, + disabledBackground: progressHorizontalDisabled, disabledKnobBefore: progressHorizontalKnobDisabled }, + default-vertical: { background: progressVertical, knobBefore: progressVerticalKnob, + disabledBackground: progressVerticalDisabled, disabledKnobBefore: progressVerticalKnobDisabled } + }, + com.badlogic.gdx.scenes.scene2d.ui.ScrollPane$ScrollPaneStyle: { + default: { hScrollKnob: scrollKnob, vScrollKnob: scrollKnobVertical, hScroll: scrollHorizontal, vScroll: scrollVertical }, + clean: { hScrollKnob: scrollKnob, vScrollKnob: scrollKnobVertical }, + background: { background: scrollPane, hScrollKnob: scrollKnob, vScrollKnob: scrollKnobVertical, hScroll: scrollHorizontal, vScroll: scrollVertical } + }, + com.badlogic.gdx.scenes.scene2d.ui.SelectBox$SelectBoxStyle: { + default: { font: default, fontColor: font, disabledFontColor: fontDisabled, background: selectBox, backgroundOver: selectOver, + backgroundOpen: selectDown, backgroundDisabled: selectDisabled, scrollStyle: default, listStyle: + { background: selectList, fontColorUnselected: font, selection: selection, fontColorSelected: fontDown, font: default } + } + }, + com.badlogic.gdx.scenes.scene2d.ui.Slider$SliderStyle: { + default-horizontal: { background: sliderHorizontal, knob: sliderKnob, knobOver: sliderKnobOver, knobDown: sliderKnobDown, + disabledKnob: sliderKnobDisabled }, + default-vertical: { background: sliderVertical, knob: sliderVerticalKnob, knobOver: sliderVerticalKnobOver, + knobDown: sliderVerticalKnobDown, disabledKnob: sliderVerticalKnobDisabled } + }, + com.badlogic.gdx.scenes.scene2d.ui.SplitPane$SplitPaneStyle: { + default-vertical: { handle: splitPane }, + default-horizontal: { handle: splitPane } + }, + com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: { + default: { up: buttonUp, over: buttonOver, down: buttonDown, disabled: buttonDisabled, font: default, fontColor: font, + overFontColor: fontOver, downFontColor: fontDown, disabledFontColor: fontDisabled, pressedOffsetY: -1, pressedOffsetX: 1 }, + toggle: { up: buttonUp, over: buttonOver, down: buttonDown, checked: buttonChecked, checkedOver: buttonCheckedOver, + disabled: buttonDisabled, font: default, fontColor: font, overFontColor: fontOver, downFontColor: fontDown, disabledFontColor: + fontDisabled, checkedFontColor: fontChecked, checkedOverFontColor: fontCheckedOver, pressedOffsetY: -1, pressedOffsetX: 1 }, + text: { font: default, fontColor: up, overFontColor: over, downFontColor: down, disabledFontColor: disabled, + pressedOffsetY: -1, pressedOffsetX: 1 }, + textToggle: { font: default, fontColor: up, overFontColor: over, downFontColor: down, disabledFontColor: + disabled, checkedFontColor: font, checkedOverFontColor: fontOver, pressedOffsetY: -1, pressedOffsetX: 1 } + }, + com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle: { + default: { font: default, messageFont: default, fontColor: font, focusedFontColor: fontOver, disabledFontColor: fontDisabled, + messageFontColor: fontDown, background: textField, focusedBackground: textFieldDown, disabledBackground: textFieldDisabled, + cursor: textFieldCursor, selection: selection } + }, + com.badlogic.gdx.scenes.scene2d.ui.TextTooltip$TextTooltipStyle: { + default: { label: default, background: tooltip } + }, + com.badlogic.gdx.scenes.scene2d.ui.Touchpad$TouchpadStyle: { + default: { background: touchpad, knob: touchpadKnob } + }, + com.badlogic.gdx.scenes.scene2d.ui.Tree$TreeStyle: { + default: { minus: treeMinus, plus: treePlus, selection: selection, over: treeOver }, + background: { background: tree, minus: treeMinus, plus: treePlus, selection: selection, over: treeOver } + }, + com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle: { + default: { titleFont: default, background: window, titleFontColor: fontDisabled }, + resize: { titleFont: default, background: windowResize, titleFontColor: fontDisabled }, + border: { titleFont: default, background: windowBorder, titleFontColor: fontDisabled }, + dialog: { titleFont: default, background: window, titleFontColor: fontDisabled, stageBackground: alpha } + } +} diff --git a/assets/ui/uiskin.png b/assets/ui/uiskin.png new file mode 100644 index 0000000..170b6ca Binary files /dev/null and b/assets/ui/uiskin.png differ diff --git a/assets/white.png b/assets/white.png new file mode 100644 index 0000000..ff40e71 Binary files /dev/null and b/assets/white.png differ diff --git a/assets/windowed-1.png b/assets/windowed-1.png new file mode 100644 index 0000000..7143678 Binary files /dev/null and b/assets/windowed-1.png differ diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..e14ef5a --- /dev/null +++ b/build.gradle @@ -0,0 +1,44 @@ +buildscript { + repositories { + mavenCentral() + maven { url 'https://s01.oss.sonatype.org' } + mavenLocal() + google() + gradlePluginPortal() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } + maven { url 'https://s01.oss.sonatype.org/content/repositories/snapshots/' } + } + dependencies { + classpath "org.docstr:gwt-gradle-plugin:$gwtPluginVersion" + + } +} + +allprojects { + apply plugin: 'eclipse' + apply plugin: 'idea' +} + +configure(subprojects) { + apply plugin: 'java-library' + sourceCompatibility = 11 + compileJava { + options.incremental = true + } +} + +subprojects { + version = '1.0.0' + ext.appName = 'Doppelspalt' + repositories { + mavenCentral() + maven { url 'https://s01.oss.sonatype.org' } + // You may want to remove the following line if you have errors downloading dependencies. + mavenLocal() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } + maven { url 'https://s01.oss.sonatype.org/content/repositories/snapshots/' } + maven { url 'https://jitpack.io' } + } +} + +eclipse.project.name = 'Doppelspalt' + '-parent' diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 0000000..ad9b435 --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,8 @@ +[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' +eclipse.project.name = appName + '-core' + +dependencies { + api "com.badlogicgames.gdx:gdx:$gdxVersion" + api "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" + +} diff --git a/core/src/main/java/io/doppelspalt/DoppelspaltSimulation.java b/core/src/main/java/io/doppelspalt/DoppelspaltSimulation.java new file mode 100644 index 0000000..f600d20 --- /dev/null +++ b/core/src/main/java/io/doppelspalt/DoppelspaltSimulation.java @@ -0,0 +1,92 @@ +package io.doppelspalt; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Screen; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.utils.viewport.FitViewport; +import com.badlogic.gdx.utils.viewport.Viewport; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; + +public class DoppelspaltSimulation implements Screen { + + private final Main app; + private OrthographicCamera camera; + private Viewport viewport; + private ShapeRenderer shapeRenderer; + + // Physikalische Parameter + private static final float WAVELENGTH = 550e-9f; // Wellenlänge in Metern + private static final float SLIT_DISTANCE = 0.0002f; // Abstand zwischen den Spalten + private static final float SLIT_WIDTH = 0.00005f; // Breite eines Spalts + private static final float SCREEN_DISTANCE = 1.0f; // Abstand zur Projektionsfläche + + private final int screenPixelWidth = 1280; + private final int screenPixelHeight = 720; + + public DoppelspaltSimulation(Main app) { + this.app = app; + camera = new OrthographicCamera(); + viewport = new FitViewport(screenPixelWidth, screenPixelHeight, camera); + shapeRenderer = new ShapeRenderer(); + } + + @Override + public void show() {} + + @Override + public void render(float delta) { + Gdx.gl.glClearColor(0, 0, 0.05f, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + camera.update(); + shapeRenderer.setProjectionMatrix(camera.combined); + + shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); + renderInterferencePattern(); + shapeRenderer.end(); + } + + private void renderInterferencePattern() { + float screenCenterY = screenPixelHeight / 2f; + float scale = 1e6f; // Maßstab für Umrechnung von Metern zu Pixeln + + for (int x = 0; x < screenPixelWidth; x++) { + // Umrechnung der x-Position in Meter (relativ zur Mitte) + float screenX = ((float) x / screenPixelWidth - 0.5f); + float position = screenX * 0.01f; // ca. ±0.005 m auf dem Schirm + + // Berechne Gangunterschied Δs = d * sin(θ) ≈ d * tan(θ) = d * y / L + float deltaS = SLIT_DISTANCE * position / SCREEN_DISTANCE; + + // Interferenz: I ∝ cos²(π Δs / λ) + float intensity = (float) Math.pow(Math.cos(Math.PI * deltaS / WAVELENGTH), 2); + + // Diffraction envelope (Einzelspalt) + float beta = (float) ((Math.PI * SLIT_WIDTH * position) / (WAVELENGTH * SCREEN_DISTANCE)); + float envelope = beta != 0 ? (float) Math.pow(Math.sin(beta) / beta, 2) : 1f; + + float totalIntensity = intensity * envelope; + + // Zeichne vertikale Linie proportional zur Intensität + float lineHeight = totalIntensity * screenPixelHeight; + float y = screenCenterY - lineHeight / 2f; + + shapeRenderer.setColor(totalIntensity, totalIntensity, totalIntensity, 1); + shapeRenderer.rect(x, y, 1, lineHeight); + } + } + + @Override + public void resize(int width, int height) { + viewport.update(width, height, true); + } + + @Override public void pause() {} + @Override public void resume() {} + @Override public void hide() {} + @Override public void dispose() { + shapeRenderer.dispose(); + } +} + diff --git a/core/src/main/java/io/doppelspalt/FirstScreen.java b/core/src/main/java/io/doppelspalt/FirstScreen.java new file mode 100644 index 0000000..4d2e586 --- /dev/null +++ b/core/src/main/java/io/doppelspalt/FirstScreen.java @@ -0,0 +1,41 @@ +package io.doppelspalt; + +import com.badlogic.gdx.Screen; + +/** First screen of the application. Displayed after the application is created. */ +public class FirstScreen implements Screen { + @Override + public void show() { + // Prepare your screen here. + } + + @Override + public void render(float delta) { + // Draw your screen here. "delta" is the time since last render in seconds. + } + + @Override + public void resize(int width, int height) { + // Resize your screen here. The parameters represent the new window size. + } + + @Override + public void pause() { + // Invoked when your application is paused. + } + + @Override + public void resume() { + // Invoked when your application is resumed after pause. + } + + @Override + public void hide() { + // This method is called when another screen replaces this one. + } + + @Override + public void dispose() { + // Destroy screen's assets here. + } +} \ No newline at end of file diff --git a/core/src/main/java/io/doppelspalt/FullscreenButton.java b/core/src/main/java/io/doppelspalt/FullscreenButton.java new file mode 100644 index 0000000..f14ac20 --- /dev/null +++ b/core/src/main/java/io/doppelspalt/FullscreenButton.java @@ -0,0 +1,210 @@ +package io.doppelspalt; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.*; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.graphics.g2d.TextureRegion; + +public class FullscreenButton extends ImageButton { + private ImageButton fullscreenButton; + private boolean isFullscreen; + private Stage stage; + private Skin skin; + private int FULL_BUTTON_SIZE = 50; + + public FullscreenButton(Stage stage, Skin skin) { + super(skin); + this.stage = stage; + this.skin = skin; + this.isFullscreen = false; + + // Statt Icons verwenden wir jetzt farbige Rechtecke aus der Skin: + ImageButton.ImageButtonStyle style = new ImageButton.ImageButtonStyle(); + style.imageUp = skin.newDrawable("rect", Color.RED); // sichtbar in Rot + style.imageDown = skin.newDrawable("rect", Color.DARK_GRAY); // beim Drücken dunkelgrau + + fullscreenButton = new ImageButton(style); + fullscreenButton.addListener(new TextTooltip("Toggle fullscreen", skin)); + + + // Sichtbar positionieren: + fullscreenButton.setSize(100, 100); + fullscreenButton.setPosition(10, 10); + + fullscreenButton.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + toggleFullscreen(); + } + }); + } + + public void addToStage(Stage stage) { + stage.addActor(fullscreenButton); + } + + private void toggleFullscreen() { + if (isFullscreen) { + Gdx.graphics.setWindowedMode(1920, 1080); + } else { + Gdx.graphics.setFullscreenMode(Gdx.graphics.getDisplayMode()); + } + isFullscreen = !isFullscreen; + // Icon-Update entfällt hier, da wir keine Icons verwenden + } + + public void toFront() { + fullscreenButton.toFront(); + } + + public void dispose() { + // keine Texturen zum Entsorgen + } +} + + + + +/* +package io.doppelspalt; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.*; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; + +import com.badlogic.gdx.graphics.g2d.*; +import com.badlogic.gdx.scenes.scene2d.utils.*; + +public class FullscreenButton extends Button { + private ImageButton fullscreenButton; + private boolean isFullscreen; + private Stage stage; + private Skin skin; + private Texture fullscreenIcon; + private Texture windowedIcon; + private static int FULL_BUTTON_SIZE = 50; + + public FullscreenButton(Stage stage, Skin skin) { + super(skin); + this.stage = stage; + this.skin = skin; + this.isFullscreen = false; + + windowedIcon = new Texture(Gdx.files.internal("windowed-1.png")); + fullscreenIcon = new Texture(Gdx.files.internal("fullscreen-1.png")); + + + ImageButton.ImageButtonStyle style = new ImageButton.ImageButtonStyle(); + style.imageUp = new TextureRegionDrawable(new TextureRegion(fullscreenIcon)); + style.imageDown = new TextureRegionDrawable(new TextureRegion(fullscreenIcon)); + + fullscreenButton = new ImageButton(style); + fullscreenButton.addListener(new TextTooltip("Toggle fullscreen", skin)); + + + fullscreenButton.setSize(FULL_BUTTON_SIZE, FULL_BUTTON_SIZE); + fullscreenButton.setPosition(0, 0); + + fullscreenButton.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + toggleFullscreen(); + } + }); + + } + + public void addToStage(Stage stage) { + stage.addActor(fullscreenButton); + } + + private void toggleFullscreen() { + if (isFullscreen) { + Gdx.graphics.setWindowedMode(1920, 1080); + } else { + Gdx.graphics.setFullscreenMode(Gdx.graphics.getDisplayMode()); + } + + isFullscreen = !isFullscreen; + updateButtonIcon(); + } + + private void updateButtonIcon() { + Texture newTexture = isFullscreen ? windowedIcon : fullscreenIcon; + ((TextureRegionDrawable) fullscreenButton.getStyle().imageUp).setRegion(new TextureRegion(newTexture)); + } + + public void dispose() { + fullscreenIcon.dispose(); + windowedIcon.dispose(); + } +} + +public class FullscreenButton extends ImageButton { + private boolean isFullscreen; + private Texture fullscreenIcon; + private Texture windowedIcon; + private static final int FULL_BUTTON_SIZE = 50; + + public FullscreenButton(Stage stage, Skin skin) { + super(createStyle(skin)); + this.isFullscreen = false; + + windowedIcon = new Texture(Gdx.files.internal("windowed-1.png")); + fullscreenIcon = new Texture(Gdx.files.internal("fullscreen-1.png")); + + setSize(FULL_BUTTON_SIZE, FULL_BUTTON_SIZE); + + addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + toggleFullscreen(); + } + }); + } + + private static ImageButtonStyle createStyle(Skin skin) { + Texture fullscreenIcon = new Texture(Gdx.files.internal("fullscreen-1.png")); + ImageButtonStyle style = new ImageButtonStyle(); + style.imageUp = new TextureRegionDrawable(new TextureRegion(fullscreenIcon)); + style.imageDown = new TextureRegionDrawable(new TextureRegion(fullscreenIcon)); + return style; + } + + private void toggleFullscreen() { + if (isFullscreen) { + Gdx.graphics.setWindowedMode(1920, 1080); + } else { + Gdx.graphics.setFullscreenMode(Gdx.graphics.getDisplayMode()); + } + isFullscreen = !isFullscreen; + updateButtonIcon(); + } + + private void updateButtonIcon() { + Texture newTexture = isFullscreen ? windowedIcon : fullscreenIcon; + ((TextureRegionDrawable)getStyle().imageUp).setRegion(new TextureRegion(newTexture)); + ((TextureRegionDrawable)getStyle().imageDown).setRegion(new TextureRegion(newTexture)); + } + + + public void addToStage(Stage stage) { + stage.addActor(this); + } + + public void dispose() { + fullscreenIcon.dispose(); + windowedIcon.dispose(); + } +} +*/ + + diff --git a/core/src/main/java/io/doppelspalt/Main.gwt.xml b/core/src/main/java/io/doppelspalt/Main.gwt.xml new file mode 100644 index 0000000..f98a40a --- /dev/null +++ b/core/src/main/java/io/doppelspalt/Main.gwt.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/core/src/main/java/io/doppelspalt/Main.java b/core/src/main/java/io/doppelspalt/Main.java new file mode 100644 index 0000000..67df6f0 --- /dev/null +++ b/core/src/main/java/io/doppelspalt/Main.java @@ -0,0 +1,445 @@ +package io.doppelspalt; + +import com.badlogic.gdx.ApplicationListener; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Screen; +import com.badlogic.gdx.graphics.GL20; +import com.badlogic.gdx.graphics.OrthographicCamera; +import com.badlogic.gdx.graphics.glutils.ShapeRenderer; +import com.badlogic.gdx.graphics.Color; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; + +import com.badlogic.gdx.utils.viewport.Viewport; +import com.badlogic.gdx.utils.viewport.FitViewport; +import com.badlogic.gdx.utils.viewport.ScreenViewport; + +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.scenes.scene2d.ui.Slider; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.badlogic.gdx.scenes.scene2d.InputEvent; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; + +public class Main implements ApplicationListener { + + private Viewport viewport; + private OrthographicCamera camera; + private ShapeRenderer shapeRenderer; + private BitmapFont font; + + private Stage stage; + private Skin skin; + private Table table; + + private int lambda = 50; + private int gitterD = 75; + private int winkel = 90; + + private Label fpsLabel; + private Slider lambdaSlider, dSlider, winkelSlider; + private Label ratioLabel; + + private FullscreenButton fullButton; + + @Override + public void create() { + font = new BitmapFont(Gdx.files.internal("bitmap/c059.fnt")); + + camera = new OrthographicCamera(); + table = new Table(); + camera.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + + shapeRenderer = new ShapeRenderer(); + + //viewport = new FitViewport(1920, 1080, camera); + viewport = new ScreenViewport(); + stage = new Stage(viewport); + Gdx.input.setInputProcessor(stage); + + skin = new Skin(Gdx.files.internal("ui/uiskin.json")); + + fullButton = new FullscreenButton(stage, skin); + setupUI(); + } + + private void setupUI() { + lambdaSlider = new Slider(10, 85, 1, false, skin); + dSlider = new Slider(0, 150, 1, false, skin); + winkelSlider = new Slider(0, 180, 1, false, skin); + + lambdaSlider.setValue(lambda); + dSlider.setValue(gitterD); + winkelSlider.setValue(winkel); + + Label.LabelStyle style = new Label.LabelStyle(skin.getFont("font"), Color.BLACK); + style.font = font; + + ratioLabel = new Label("d/lambda = " + formatRatio(), style); + + lambdaSlider.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + lambda = (int) lambdaSlider.getValue(); + updateRatio(); + } + }); + + dSlider.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + gitterD = (int) dSlider.getValue(); + updateRatio(); + } + }); + + winkelSlider.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + winkel = (int) winkelSlider.getValue(); + } + }); + + + table.top().left(); + table.pack(); + + table.setPosition(10, viewport.getWorldHeight() - 10); + + if (viewport.getWorldHeight() > viewport.getWorldWidth()) { + table.setWidth(viewport.getWorldWidth() - 20); + } + + fpsLabel = new Label("FPS: 0", style); + + //table.row(); + //table.add(fpsLabel).left().colspan(2).padTop(10); + //table.row(); + + + + Label lambdaLabel = new Label("Lambda", style); + table.add(lambdaLabel).left().pad(5); + + table.add(lambdaSlider).width(300).pad(5); + table.row(); + + //Label dLabel = new Label("Slit distance d", style); + Label dLabel = new Label("D", style); + table.add(dLabel).left().pad(5); + + table.add(dSlider).width(300).pad(5); + table.row(); + + //Label winkelLabel = new Label("Angle of incidence", style); + Label winkelLabel = new Label("Winkel", style); + table.add(winkelLabel).left().pad(5); + + table.add(winkelSlider).width(300).pad(5); + table.row(); + + table.add(ratioLabel).colspan(2).padTop(10); + table.row(); + + TextButton resetButton = new TextButton("Reset", skin); + resetButton.setSize(10, 10); + resetButton.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + lambdaSlider.setValue(50); + dSlider.setValue(75); + winkelSlider.setValue(90); + + lambda = 50; + gitterD = 75; + winkel = 90; + + updateRatio(); + } + }); + + table.add(resetButton) + .colspan(2) + .padTop(10) + .width(100) + .height(30); + table.row(); + + + stage.addActor(table); + //stage.setDebugAll(true); + + + + //fullButton.addToStage(stage); + //fullButton.toFront(); + } + + private void updateRatio() { + ratioLabel.setText("d/lambda = " + formatRatio()); + } + + + private String formatRatio() { + double value = (double) gitterD / lambda; + return formatDouble(value, 2); + } + + private String formatDouble(double value, int decimals) { + double scale = Math.pow(10, decimals); + return String.valueOf(Math.round(value * scale) / scale); + } + + @Override + public void render() { + float delta = Gdx.graphics.getDeltaTime(); + Gdx.gl.glClearColor(1, 1, 1, 1); + Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); + + fpsLabel.setText("FPS: " + Gdx.graphics.getFramesPerSecond()); + + camera.update(); + shapeRenderer.setProjectionMatrix(camera.combined); + + drawInterference(); + + stage.act(delta); + stage.draw(); + } + + private void drawInterference() { + int width = Gdx.graphics.getWidth(); + int height = Gdx.graphics.getHeight(); + int xSpalt = width / 3; + + shapeRenderer.begin(ShapeRenderer.ShapeType.Line); + int y1 = (height - gitterD) / 2; + int y2 = (height + gitterD) / 2; + + drawCircularWaves(xSpalt, y1, width, height); + drawCircularWaves(xSpalt, y2, width, height); + shapeRenderer.end(); + + + + + shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); + drawBackgroundForSinus(xSpalt, height); + drawWallWithSlits(xSpalt, height); + + shapeRenderer.setColor(Color.RED); + drawIntersectionPoints(xSpalt, width, height); + shapeRenderer.end(); + + + shapeRenderer.begin(ShapeRenderer.ShapeType.Line); + + drawSinusWave(xSpalt, height); + drawIncidentWave(xSpalt, height); + shapeRenderer.end(); + } + + private void drawSinusWave(int breite, int hoehe) { + double phi = Math.toRadians(winkel - 90); + double amplitude = hoehe / 12.0; + + int lSinus; + if (Math.abs(phi) < Math.atan(0.5 * hoehe / (double) breite)) { + lSinus = (int) (breite / Math.cos(phi)); + } else { + lSinus = (int) (0.5 * hoehe / Math.abs(Math.sin(phi))); + } + + float[] points = new float[(lSinus - 1) * 4]; + + for (int i = 0; i < lSinus - 1; i++) { + double x0 = (i - lSinus); + double y0 = amplitude * Math.sin(1.5 * Math.PI + 2 * Math.PI * ((i - lSinus) % lambda) / lambda); + double x1 = (i + 1 - lSinus); + double y1 = amplitude * Math.sin(1.5 * Math.PI + 2 * Math.PI * ((i + 1 - lSinus) % lambda) / lambda); + + float xStart = (float) (x0 * Math.cos(phi) + y0 * Math.sin(phi)) + breite; + float yStart = (float) (-x0 * Math.sin(phi) + y0 * Math.cos(phi)) + hoehe / 2f; + + float xEnd = (float) (x1 * Math.cos(phi) + y1 * Math.sin(phi)) + breite; + float yEnd = (float) (-x1 * Math.sin(phi) + y1 * Math.cos(phi)) + hoehe / 2f; + + int idx = i * 4; + points[idx] = xStart; + points[idx + 1] = yStart; + points[idx + 2] = xEnd; + points[idx + 3] = yEnd; + } + + shapeRenderer.setColor(Color.RED); + for (int i = 0; i < points.length; i += 4) { + shapeRenderer.line(points[i], points[i + 1], points[i + 2], points[i + 3]); + } + } + + + private void drawWallWithSlits(int xSpalt, int height) { + int loch = 5; + int ySpalt1 = (height - gitterD) / 2; + int ySpalt2 = (height + gitterD) / 2; + int balkenBreite = 5; + + shapeRenderer.setColor(Color.BLACK); + shapeRenderer.rect(xSpalt - 2, 0, balkenBreite, ySpalt1 - loch); + shapeRenderer.rect(xSpalt - 2, ySpalt1 + loch, balkenBreite, gitterD - 2 * loch); + shapeRenderer.rect(xSpalt - 2, ySpalt2 + loch, balkenBreite, height - ySpalt2 - loch); + } + + + private void drawBackgroundForSinus(int xSpalt, int height) { + shapeRenderer.setColor(Color.WHITE); + shapeRenderer.rect(0, 0, xSpalt - 5, height); + } + + + private void drawIncidentWave(int xSpalt, int height) { + shapeRenderer.setColor(Color.BLACK); + + double phi = Math.toRadians(winkel); + double sinPhi = Math.sin(phi); + double cosPhi = Math.cos(phi); + + if (winkel == 90) { + for (int i = xSpalt; i > 0; i -= lambda) { + shapeRenderer.line(i, 0, i, height); + } + } else if (winkel == 0 || winkel == 180) { + for (int i = (height / 2) % lambda; i <= height; i += lambda) { + shapeRenderer.line(0, i, xSpalt, i); + } + } else { + double dMin, dMax, d0; + + if (winkel < 90) { + dMin = 0.0; + double d1 = xSpalt * sinPhi + (height / 2.0) * cosPhi; + dMax = xSpalt * sinPhi + height * cosPhi; + d0 = dMin + (d1 - dMin) % lambda; + } else { + dMin = height * cosPhi; + double d1 = xSpalt * sinPhi + (height / 2.0) * cosPhi; + dMax = xSpalt * sinPhi; + d0 = dMin + (d1 - dMin) % lambda; + } + + for (double d = d0; d < dMax; d += lambda) { + double schnittY_Achse = d / sinPhi; + double schnittX_Achse = d / cosPhi; + double schnittX_breite = (d - xSpalt * sinPhi) / cosPhi; + double schnittY_hoehe = (d - height * cosPhi) / sinPhi; + + int x0, y0, x1, y1; + + if (schnittY_Achse < 0.0) { + x0 = 0; + y0 = (int) schnittX_Achse; + } else if (schnittY_Achse < xSpalt) { + x0 = (int) schnittY_Achse; + y0 = 0; + } else { + x0 = xSpalt; + y0 = (int) schnittX_breite; + } + + if (schnittY_hoehe < 0.0) { + x1 = 0; + y1 = (int) schnittX_Achse; + } else if (schnittY_hoehe < xSpalt) { + x1 = (int) schnittY_hoehe; + y1 = height; + } else { + x1 = xSpalt; + y1 = (int) schnittX_breite; + } + + shapeRenderer.line(x0, y0, x1, y1); + } + } + } + + private void drawCircularWaves(int x, int y, int width, int height) { + shapeRenderer.setColor(Color.BLACK); + + double phi = Math.toRadians(winkel - 90); + int s0; + + if (y > height / 2) { + s0 = (int) ((gitterD / 2.0) * Math.sin(phi)) % lambda; + } else { + s0 = -(int) ((gitterD / 2.0) * Math.sin(phi)) % lambda; + } + + if (s0 < 0) s0 += lambda; + + for (int i = 0; i * lambda + s0 < Math.max(width, height) * 2; i++) { + int r = i * lambda + s0; + if (r > 0) { + + shapeRenderer.circle(x, y, r, 64); + } + } + } + + + private void drawIntersectionPoints(int x, int width, int height) { + double phi = Math.toRadians(winkel - 90); + double s0 = (gitterD / 2.0) * Math.sin(phi) % lambda; + + int n = (int)(Math.max(width, height) * 1.5 / lambda); + + int radius = 12; + if (lambda <= 20) radius = 9; + if (lambda <= 15) radius = 7; + if (radius < 5) radius = 5; + + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + double r1 = i * lambda - s0; + double r2 = j * lambda + s0; + + if (r1 + r2 > gitterD && r1 <= r2 + gitterD && r2 <= r1 + gitterD) { + if (gitterD != 0) { + double y = (r1 * r1 - r2 * r2 + gitterD * gitterD) / (2.0 * gitterD); + double xRel = Math.sqrt(Math.abs(r1 * r1 - y * y)); + + float drawX = (float) (x + xRel); + float drawY = (float) ((height - gitterD) / 2.0 + y); + + + if (drawY >= 0 && drawY <= height) { + shapeRenderer.circle(drawX, drawY, radius); + } + } + } + } + } + } + + @Override + public void resize(int width, int height) { + + viewport.update(width, height, true); + table.setPosition(10, viewport.getWorldHeight() - 10); + camera.setToOrtho(false, width, height); + } + + @Override + public void dispose() { + stage.dispose(); + shapeRenderer.dispose(); + skin.dispose(); + } + + @Override public void pause() {} + @Override public void resume() {} +} + diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..ab56b50 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,6 @@ +org.gradle.daemon=true +org.gradle.jvmargs=-Xms512M -Xmx1G +org.gradle.configureondemand=false +gwtFrameworkVersion=2.10.0 +gwtPluginVersion=1.1.29 +gdxVersion=1.12.1 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..7f93135 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..3fa8f86 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..1aa94a4 --- /dev/null +++ b/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100755 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/html/build.gradle b/html/build.gradle new file mode 100644 index 0000000..4a86737 --- /dev/null +++ b/html/build.gradle @@ -0,0 +1,153 @@ + +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath 'org.gretty:gretty:3.1.0' + } +} +apply plugin: "gwt" +apply plugin: "war" +apply plugin: "org.gretty" + +gwt { + gwtVersion = "$gwtFrameworkVersion" // Should match the version used for building the GWT backend. See gradle.properties. + maxHeapSize = '1G' // Default 256m is not enough for the GWT compiler. GWT is HUNGRY. + minHeapSize = '1G' + + src = files(file('src/main/java')) // Needs to be in front of "modules" below. + modules 'io.doppelspalt.GdxDefinition' + devModules 'io.doppelspalt.GdxDefinitionSuperdev' + project.webAppDirName = 'webapp' + + compiler.strict = true + compiler.disableCastChecking = true + //// The next line can be useful to uncomment if you want output that hasn't been obfuscated. +// compiler.style = org.docstr.gradle.plugins.gwt.Style.DETAILED + + sourceLevel = 1.11 +} + +dependencies { + implementation "com.badlogicgames.gdx:gdx:$gdxVersion:sources" + implementation "com.github.tommyettinger:gdx-backend-gwt:1.1210.0" + implementation "com.github.tommyettinger:gdx-backend-gwt:1.1210.0:sources" + implementation "com.google.jsinterop:jsinterop-annotations:2.0.0:sources" + implementation project(':core') + +} + +import org.akhikhl.gretty.AppBeforeIntegrationTestTask +import org.docstr.gradle.plugins.gwt.GwtSuperDev + +gretty.httpPort = 8080 +// The line below will need to be changed only if you change the build directory to something other than "build". +gretty.resourceBase = "${project.layout.buildDirectory.asFile.get().absolutePath}/gwt/draftOut" +gretty.contextPath = "/" +gretty.portPropertiesFileName = "TEMP_PORTS.properties" + +task startHttpServer (dependsOn: [draftCompileGwt]) { + doFirst { + copy { + from "webapp" + into gretty.resourceBase + } + copy { + from "war" + into gretty.resourceBase + } + } +} +task beforeRun(type: AppBeforeIntegrationTestTask, dependsOn: startHttpServer) { + // The next line allows ports to be reused instead of + // needing a process to be manually terminated. + file("build/TEMP_PORTS.properties").delete() + // Somewhat of a hack; uses Gretty's support for wrapping a task in + // a start and then stop of a Jetty server that serves files while + // also running the SuperDev code server. + integrationTestTask 'superDev' + + interactive false +} + +task superDev(type: GwtSuperDev) { + doFirst { + gwt.modules = gwt.devModules + } +} + +//// We delete the (temporary) war/ folder because if any extra files get into it, problems occur. +//// The war/ folder shouldn't be committed to version control. +clean.delete += [file("war")] + +// This next line can be changed if you want to, for instance, always build into the +// docs/ folder of a Git repo, which can be set to automatically publish on GitHub Pages. +// This is relative to the html/ folder. +var outputPath = "build/dist/" + +task dist(dependsOn: [clean, compileGwt]) { + doLast { + // Uncomment the next line if you have changed outputPath and know that its contents + // should be replaced by a new dist build. Some large JS files are not cleaned up by + // default unless the outputPath is inside build/ (then the clean task removes them). + // Do not uncomment the next line if you changed outputPath to a folder that has + // non-generated files that you want to keep! + //delete(file(outputPath)) + + file(outputPath).mkdirs() + copy { + from("build/gwt/out"){ + exclude '**/*.symbolMap' // Not used by a dist, and these can be large. + } + into outputPath + } + copy { + from("webapp") { + exclude 'index.html' // We edit this HTML file later. + exclude 'refresh.png' // We don't need this button; this saves some bytes. + } + into outputPath + } + copy { + from("webapp") { + // These next two lines take the index.html page and remove the superdev refresh button. + include 'index.html' + filter { String line -> line.replaceAll(' + + + + + + + + + + + + + \ No newline at end of file diff --git a/html/src/main/java/io/doppelspalt/GdxDefinitionSuperdev.gwt.xml b/html/src/main/java/io/doppelspalt/GdxDefinitionSuperdev.gwt.xml new file mode 100644 index 0000000..dd6c77e --- /dev/null +++ b/html/src/main/java/io/doppelspalt/GdxDefinitionSuperdev.gwt.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/html/src/main/java/io/doppelspalt/gwt/GwtLauncher.java b/html/src/main/java/io/doppelspalt/gwt/GwtLauncher.java new file mode 100644 index 0000000..4385d1b --- /dev/null +++ b/html/src/main/java/io/doppelspalt/gwt/GwtLauncher.java @@ -0,0 +1,26 @@ +package io.doppelspalt.gwt; + +import com.badlogic.gdx.ApplicationListener; +import com.badlogic.gdx.backends.gwt.GwtApplication; +import com.badlogic.gdx.backends.gwt.GwtApplicationConfiguration; +import io.doppelspalt.Main; + +/** Launches the GWT application. */ +public class GwtLauncher extends GwtApplication { + @Override + public GwtApplicationConfiguration getConfig () { + // Resizable application, uses available space in browser with no padding: + GwtApplicationConfiguration cfg = new GwtApplicationConfiguration(true); + cfg.padVertical = 0; + cfg.padHorizontal = 0; + return cfg; + // If you want a fixed size application, comment out the above resizable section, + // and uncomment below: + //return new GwtApplicationConfiguration(640, 480); + } + + @Override + public ApplicationListener createApplicationListener () { + return new Main(); + } +} diff --git a/html/webapp/WEB-INF/web.xml b/html/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..4301df2 --- /dev/null +++ b/html/webapp/WEB-INF/web.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/html/webapp/index.html b/html/webapp/index.html new file mode 100644 index 0000000..502088b --- /dev/null +++ b/html/webapp/index.html @@ -0,0 +1,31 @@ + + + + libGDX application + + + + + + + +
+ + + + + diff --git a/html/webapp/refresh.png b/html/webapp/refresh.png new file mode 100644 index 0000000..aab1e38 Binary files /dev/null and b/html/webapp/refresh.png differ diff --git a/html/webapp/styles.css b/html/webapp/styles.css new file mode 100644 index 0000000..e768a39 --- /dev/null +++ b/html/webapp/styles.css @@ -0,0 +1,53 @@ +canvas { + cursor: default; + outline: none; +} + +body { + background-color: #222222; +} + +p { + text-align: center; + color: #eeeeee; +} + +a { + text-align: center; + color: #bbbbff; +} + +.superdev { + color: rgb(37,37,37); + text-shadow: 0px 1px 1px rgba(250,250,250,0.1); + font-size: 50pt; + display: block; + position: relative; + text-decoration: none; + background-color: rgb(83,87,93); + box-shadow: 0px 3px 0px 0px rgb(34,34,34), + 0px 7px 10px 0px rgb(17,17,17), + inset 0px 1px 1px 0px rgba(250, 250, 250, .2), + inset 0px -12px 35px 0px rgba(0, 0, 0, .5); + width: 70px; + height: 70px; + border: 0; + border-radius: 35px; + text-align: center; + line-height: 68px; +} + +.superdev:active { + box-shadow: 0px 0px 0px 0px rgb(34,34,34), + 0px 3px 7px 0px rgb(17,17,17), + inset 0px 1px 1px 0px rgba(250, 250, 250, .2), + inset 0px -10px 35px 5px rgba(0, 0, 0, .5); + background-color: rgb(83,87,93); + top: 3px; + color: #fff; + text-shadow: 0px 0px 3px rgb(250,250,250); +} + +.superdev:hover { + background-color: rgb(100,100,100); +} diff --git a/lwjgl3/build.gradle b/lwjgl3/build.gradle new file mode 100644 index 0000000..4682a68 --- /dev/null +++ b/lwjgl3/build.gradle @@ -0,0 +1,113 @@ +buildscript { + repositories { + gradlePluginPortal() + } + dependencies { +// using jpackage only works if the JDK version is 14 or higher. +// your JAVA_HOME environment variable may also need to be a JDK with version 14 or higher. + if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_14)) { + classpath "org.beryx:badass-runtime-plugin:1.13.0" + } + } +} +if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_14)) { + apply plugin: 'org.beryx.runtime' +} +else { + apply plugin: 'application' +} + +//sourceSets.main.resources.srcDirs += [ rootProject.file('assets').path ] +sourceSets.main.resources.srcDirs += [ rootProject.file('assets') ] + +mainClassName = 'io.doppelspalt.lwjgl3.Lwjgl3Launcher' +eclipse.project.name = appName + '-lwjgl3' +java.sourceCompatibility = 11 +java.targetCompatibility = 11 + +dependencies { + implementation "com.badlogicgames.gdx:gdx-backend-lwjgl3:$gdxVersion" + implementation "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" + + implementation "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" + implementation project(':core') + + +} + +def os = System.properties['os.name'].toLowerCase() + +run { + workingDir = rootProject.file('assets').path + setIgnoreExitValue(true) + + // This next line could be needed to run LWJGL3 Java apps on macOS, but StartupHelper should make it unnecessary. + //if (os.contains('mac')) jvmArgs += "-XstartOnFirstThread" + // If you encounter issues with the 'lwjgl3:run' task on macOS specifically, try uncommenting the above line, and + // regardless, please report it via the gdx-liftoff issue tracker or just mention it on the libGDX Discord. +} + +jar { +// sets the name of the .jar file this produces to the name of the game or app. + archiveBaseName.set(appName) +// using 'lib' instead of the default 'libs' appears to be needed by jpackageimage. + destinationDirectory = file("${project.layout.buildDirectory.asFile.get().absolutePath}/lib") +// the duplicatesStrategy matters starting in Gradle 7.0; this setting works. + duplicatesStrategy(DuplicatesStrategy.EXCLUDE) + dependsOn configurations.runtimeClasspath + from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } +// these "exclude" lines remove some unnecessary duplicate files in the output JAR. + exclude('META-INF/INDEX.LIST', 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA') + dependencies { + exclude('META-INF/INDEX.LIST', 'META-INF/maven/**') + } +// setting the manifest makes the JAR runnable. + manifest { + attributes 'Main-Class': project.mainClassName + } +// this last step may help on some OSes that need extra instruction to make runnable JARs. + doLast { + file(archiveFile).setExecutable(true, false) + } +} + +if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_14)) { + tasks.jpackageImage.doNotTrackState("This task both reads from and writes to the build folder.") + runtime { + options.set(['--strip-debug', + '--compress', '2', + '--no-header-files', + '--no-man-pages', + '--strip-native-commands', + '--vm', 'server']) +// you could very easily need more modules than this one. +// use the lwjgl3:suggestModules task to see which modules may be needed. + modules.set([ + 'jdk.unsupported' + ]) + distDir.set(file(project.layout.buildDirectory)) + jpackage { + imageName = appName +// you can set this to false if you want to build an installer, or keep it as true to build just an app. + skipInstaller = true +// this may need to be set to a different path if your JAVA_HOME points to a low JDK version. + jpackageHome = javaHome.getOrElse("") + mainJar = jar.archiveFileName.get() + if (os.contains('win')) { + imageOptions = ["--icon", "icons/logo.ico"] + } else if (os.contains('nix') || os.contains('nux') || os.contains('bsd')) { + imageOptions = ["--icon", "icons/logo.png"] + } else if (os.contains('mac')) { +// If you are making a jpackage image on macOS, the below line should work thanks to StartupHelper. + imageOptions = ["--icon", "icons/logo.icns"] +// If the above line doesn't produce a runnable executable, you can try using the below line instead of the above one. +// imageOptions = ["--icon", "icons/logo.icns", "--java-options", "\"-XstartOnFirstThread\""] + } + } + } +} + +// Equivalent to the jar task; here for compatibility with gdx-setup. +tasks.register('dist') { + dependsOn['jar'] +} diff --git a/lwjgl3/icons/logo.icns b/lwjgl3/icons/logo.icns new file mode 100644 index 0000000..5e41ad7 Binary files /dev/null and b/lwjgl3/icons/logo.icns differ diff --git a/lwjgl3/icons/logo.ico b/lwjgl3/icons/logo.ico new file mode 100644 index 0000000..c4f2d5e Binary files /dev/null and b/lwjgl3/icons/logo.ico differ diff --git a/lwjgl3/icons/logo.png b/lwjgl3/icons/logo.png new file mode 100644 index 0000000..788f542 Binary files /dev/null and b/lwjgl3/icons/logo.png differ diff --git a/lwjgl3/src/main/java/io/doppelspalt/lwjgl3/Lwjgl3Launcher.java b/lwjgl3/src/main/java/io/doppelspalt/lwjgl3/Lwjgl3Launcher.java new file mode 100644 index 0000000..5bb1f06 --- /dev/null +++ b/lwjgl3/src/main/java/io/doppelspalt/lwjgl3/Lwjgl3Launcher.java @@ -0,0 +1,31 @@ +package io.doppelspalt.lwjgl3; + +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; +import io.doppelspalt.Main; + +/** Launches the desktop (LWJGL3) application. */ +public class Lwjgl3Launcher { + public static void main(String[] args) { + if (StartupHelper.startNewJvmIfRequired()) return; // This handles macOS support and helps on Windows. + createApplication(); + } + + private static Lwjgl3Application createApplication() { + return new Lwjgl3Application(new Main(), getDefaultConfiguration()); + } + + private static Lwjgl3ApplicationConfiguration getDefaultConfiguration() { + Lwjgl3ApplicationConfiguration configuration = new Lwjgl3ApplicationConfiguration(); + configuration.setTitle("Doppelspalt"); + configuration.useVsync(true); + //// Limits FPS to the refresh rate of the currently active monitor. + configuration.setForegroundFPS(Lwjgl3ApplicationConfiguration.getDisplayMode().refreshRate); + //// If you remove the above line and set Vsync to false, you can get unlimited FPS, which can be + //// useful for testing performance, but can also be very stressful to some hardware. + //// You may also need to configure GPU drivers to fully disable Vsync; this can cause screen tearing. + configuration.setWindowedMode(640, 480); + configuration.setWindowIcon("libgdx128.png", "libgdx64.png", "libgdx32.png", "libgdx16.png"); + return configuration; + } +} \ No newline at end of file diff --git a/lwjgl3/src/main/java/io/doppelspalt/lwjgl3/StartupHelper.java b/lwjgl3/src/main/java/io/doppelspalt/lwjgl3/StartupHelper.java new file mode 100644 index 0000000..79f1b0a --- /dev/null +++ b/lwjgl3/src/main/java/io/doppelspalt/lwjgl3/StartupHelper.java @@ -0,0 +1,179 @@ +/* + * Copyright 2020 damios + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +//Note, the above license and copyright applies to this file only. + +package io.doppelspalt.lwjgl3; + +import org.lwjgl.system.macosx.LibC; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.lang.management.ManagementFactory; +import java.util.ArrayList; + +/** + * Adds some utilities to ensure that the JVM was started with the + * {@code -XstartOnFirstThread} argument, which is required on macOS for LWJGL 3 + * to function. Also helps on Windows when users have names with characters from + * outside the Latin alphabet, a common cause of startup crashes. + *
+ * Based on this java-gaming.org post by kappa + * @author damios + */ +public class StartupHelper { + + private static final String JVM_RESTARTED_ARG = "jvmIsRestarted"; + + private StartupHelper() { + throw new UnsupportedOperationException(); + } + + /** + * Starts a new JVM if the application was started on macOS without the + * {@code -XstartOnFirstThread} argument. This also includes some code for + * Windows, for the case where the user's home directory includes certain + * non-Latin-alphabet characters (without this code, most LWJGL3 apps fail + * immediately for those users). Returns whether a new JVM was started and + * thus no code should be executed. + *

+ * Usage: + * + *


+     * public static void main(String... args) {
+     * 	if (StartupHelper.startNewJvmIfRequired(true)) return; // This handles macOS support and helps on Windows.
+     * 	// after this is the actual main method code
+     * }
+     * 
+ * + * @param redirectOutput + * whether the output of the new JVM should be rerouted to the + * old JVM, so it can be accessed in the same place; keeps the + * old JVM running if enabled + * @return whether a new JVM was started and thus no code should be executed + * in this one + */ + public static boolean startNewJvmIfRequired(boolean redirectOutput) { + String osName = System.getProperty("os.name").toLowerCase(); + if (!osName.contains("mac")) { + if (osName.contains("windows")) { +// Here, we are trying to work around an issue with how LWJGL3 loads its extracted .dll files. +// By default, LWJGL3 extracts to the directory specified by "java.io.tmpdir", which is usually the user's home. +// If the user's name has non-ASCII (or some non-alphanumeric) characters in it, that would fail. +// By extracting to the relevant "ProgramData" folder, which is usually "C:\ProgramData", we avoid this. + System.setProperty("java.io.tmpdir", System.getenv("ProgramData") + "/libGDX-temp"); + } + return false; + } + + // There is no need for -XstartOnFirstThread on Graal native image + if (!System.getProperty("org.graalvm.nativeimage.imagecode", "").isEmpty()) { + return false; + } + + long pid = LibC.getpid(); + + // check whether -XstartOnFirstThread is enabled + if ("1".equals(System.getenv("JAVA_STARTED_ON_FIRST_THREAD_" + pid))) { + return false; + } + + // check whether the JVM was previously restarted + // avoids looping, but most certainly leads to a crash + if ("true".equals(System.getProperty(JVM_RESTARTED_ARG))) { + System.err.println( + "There was a problem evaluating whether the JVM was started with the -XstartOnFirstThread argument."); + return false; + } + + // Restart the JVM with -XstartOnFirstThread + ArrayList jvmArgs = new ArrayList<>(); + String separator = System.getProperty("file.separator"); + // The following line is used assuming you target Java 8, the minimum for LWJGL3. + String javaExecPath = System.getProperty("java.home") + separator + "bin" + separator + "java"; + // If targeting Java 9 or higher, you could use the following instead of the above line: + //String javaExecPath = ProcessHandle.current().info().command().orElseThrow(); + + if (!(new File(javaExecPath)).exists()) { + System.err.println( + "A Java installation could not be found. If you are distributing this app with a bundled JRE, be sure to set the -XstartOnFirstThread argument manually!"); + return false; + } + + jvmArgs.add(javaExecPath); + jvmArgs.add("-XstartOnFirstThread"); + jvmArgs.add("-D" + JVM_RESTARTED_ARG + "=true"); + jvmArgs.addAll(ManagementFactory.getRuntimeMXBean().getInputArguments()); + jvmArgs.add("-cp"); + jvmArgs.add(System.getProperty("java.class.path")); + String mainClass = System.getenv("JAVA_MAIN_CLASS_" + pid); + if (mainClass == null) { + StackTraceElement[] trace = Thread.currentThread().getStackTrace(); + if (trace.length > 0) { + mainClass = trace[trace.length - 1].getClassName(); + } else { + System.err.println("The main class could not be determined."); + return false; + } + } + jvmArgs.add(mainClass); + + try { + if (!redirectOutput) { + ProcessBuilder processBuilder = new ProcessBuilder(jvmArgs); + processBuilder.start(); + } else { + Process process = (new ProcessBuilder(jvmArgs)) + .redirectErrorStream(true).start(); + BufferedReader processOutput = new BufferedReader( + new InputStreamReader(process.getInputStream())); + String line; + + while ((line = processOutput.readLine()) != null) { + System.out.println(line); + } + + process.waitFor(); + } + } catch (Exception e) { + System.err.println("There was a problem restarting the JVM"); + e.printStackTrace(); + } + + return true; + } + + /** + * Starts a new JVM if the application was started on macOS without the + * {@code -XstartOnFirstThread} argument. Returns whether a new JVM was + * started and thus no code should be executed. Redirects the output of the + * new JVM to the old one. + *

+ * Usage: + * + *

+     * public static void main(String... args) {
+     * 	if (StartupHelper.startNewJvmIfRequired()) return; // This handles macOS support and helps on Windows.
+     * 	// the actual main method code
+     * }
+     * 
+ * + * @return whether a new JVM was started and thus no code should be executed + * in this one + */ + public static boolean startNewJvmIfRequired() { + return startNewJvmIfRequired(true); + } +} \ No newline at end of file diff --git a/lwjgl3/src/main/resources/libgdx128.png b/lwjgl3/src/main/resources/libgdx128.png new file mode 100644 index 0000000..788f542 Binary files /dev/null and b/lwjgl3/src/main/resources/libgdx128.png differ diff --git a/lwjgl3/src/main/resources/libgdx16.png b/lwjgl3/src/main/resources/libgdx16.png new file mode 100644 index 0000000..47af189 Binary files /dev/null and b/lwjgl3/src/main/resources/libgdx16.png differ diff --git a/lwjgl3/src/main/resources/libgdx32.png b/lwjgl3/src/main/resources/libgdx32.png new file mode 100644 index 0000000..4cf903a Binary files /dev/null and b/lwjgl3/src/main/resources/libgdx32.png differ diff --git a/lwjgl3/src/main/resources/libgdx64.png b/lwjgl3/src/main/resources/libgdx64.png new file mode 100644 index 0000000..ebcd8f1 Binary files /dev/null and b/lwjgl3/src/main/resources/libgdx64.png differ diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..ee13cda --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +include 'html', 'core', 'lwjgl3'