Releases: gurkenlabs/litiengine
0.11.1
What's Changed
This release brings major improvements across the engine, editor (utiLITI), input system, file I/O, iconography, documentation, build tooling, and overall stability.
The most notable change is our migration towards our own custom input framework: Say goodbye to JInput, say hello to Input4j, improving the cross platform support and eliminating the need to deploy native third party binaries along the engine by utilizing the new(ish) Java FFM API.
We've also migrated the engine to Java 25 and Gradle 9, improved the release pipeline, and resolved some reported bugs.
After 1 year of not publishing a release, the improvements to our build and release pipelines guarantee that we can build releases with less manual effort in the future - and we've solved the problem of not being able to publish artifacts to Maven Central via the OSSRH anymore.
Please don't be confused about the versioning of this release: There was a 0.11.0 artifact published to Maven Central that is functionally identical, but our build pipeline had uploaded the utiLITI artifacts to itch.io with the wrong version tag, which we've addressed with the 0.11.1 patch.
🔧 Engine & Core Improvements
- Rewrote the input system to use Input4J instead of JInput.
- Significantly improved JavaDocs coverage
- Improved physics and collision handling; engine is now more resilient to invalid collision types.
- Added copy constructors (#154)
- Attribute system improvements:
- Clarified attribute events, listeners, and modifier documentation
- Added event support for value and modifier changes
- Fixed NullPointerException in AttributeEffect
- Added a fixed targeting strategy with immutable entity lists.
- Added a new transparency image effect.
- Improved state machine behavior to prevent repeated enter/exit calls.
- Creature animation type parameters
- Improved tests, including camera clamp tests and stability fixes for GameWorldTests.
- Fixed several gameplay issues, including:
- Force effect behavior
- Align/Valign clamping
- Mouse location exceptions
- Cursor jumping issue (#810)
🎨 utiLITI Enhancements
- Major File I/O overhaul:
- Unified use of Path/Paths
- Removed legacy utilities such as FileUtilities and ImageSerializer
- Simplified game file saving
- Proper file deletion using modern APIs
- Refactored utiLITI package structure toward MVC.
- Improved selector logic for spritesheets and asset trees.
- Replaced edit mode constants with TransformMode.
- UI fixes and improvements:
- Asset panel buttons
- Vertical asset scrolling
- Replaced all raster icons with scalable vector icons.
- Added light and dark icon theme variants.
🏗️ Build Updates
- Migrated to Java 25, producing artifacts compatible with JDK 17.
- Updated Gradle wrapper to 9.2.1.
- Adopted the Reckon plugin for versioning.
- Configured Gradle Maven Publish plugin to publish to Sonatype Central Portal (reaction to OSSRH sunset).
- Improved workflow and release automation:
- Updated citation handling (fixes #815)
- Improved parameter descriptions
- Ensured tags are fetched in matrix builds
- Run Sonar scan only in base repo; skipped in forks
- Added repository code ownership rules.
Dependency Updates
org.sonarqubeupdated to version7.1.0.6387actions/checkoutupdated to version6com.diffplug.spotlessupdated to version8.1.0com.vanniktech.maven.publishupdated to version0.35.0junitupdated to version6.0.1org.beryx.runtimeupdated to version2.0.1actions/upload-artifactupdated to version5gradle/actionsupdated to version5jakarta.activation:jakarta.activation-apiupdated to version2.1.4jaxbupdated to version4.0.6jakarta.xml.bind:jakarta.xml.bind-apiupdated to version4.0.4org.mockito:mockito-coreupdated to version5.20.0darklafupdated to version3.1.1actions/first-interactionupdated to version3actions/setup-javaupdated to version5dorny/test-reporterupdated to version2
New Contributors
- @concurrent-recursion made their first contribution in #874
Full Changelog: 0.10.7...0.11.1
0.10.7
What's Changed
- Bump actions/setup-java from 4.2.2 to 4.3.0 by @dependabot in #842
- Bump actions/setup-java from 4.3.0 to 4.4.0 by @dependabot in #846
- Bump org.mockito:mockito-core from 5.13.0 to 5.14.1 by @dependabot in #845
- Bump junit from 5.11.0 to 5.11.1 by @dependabot in #844
- Bump junit from 5.11.1 to 5.11.2 by @dependabot in #847
- Bump org.ajoberstar.grgit from 5.2.2 to 5.3.0 by @dependabot in #848
- Bump org.mockito:mockito-core from 5.14.1 to 5.14.2 by @dependabot in #849
- Bump actions/setup-java from 4.4.0 to 4.5.0 by @dependabot in #850
- Bump junit from 5.11.2 to 5.11.3 by @dependabot in #851
- Fix memory leak in SoundEngine by @Gamebuster19901 in #853
- Bump org.sonarqube from 5.1.0.4882 to 6.0.0.5145 by @dependabot in #854
- Implemented automatic itch.io deployment for linux & windows (mac doesn't work currently because butler is incompatible with ARM64)
- Upgrade to Java 23
Full Changelog: 0.9.0...0.10.7
0.9.0
What's Changed
- Made the changes to "Fixed the name field in Sprite import panel #778" by @iamllcoolray in #814
- Add spritesheet import logic by @Hades948 in #813
- Fix alignment of text that overflows the boundaries by @hedfol in #816
- Refactor the color decode test by using a nested class by @Josef-Friedrich in #819
- Fix the URL to the forum in the README file by @Josef-Friedrich in #820
- Fix NullPointerException in TextRenderer#renderWithLinebreaks by @Mshnik in #822
- Bump gradle/wrapper-validation-action from 1 to 3 by @dependabot in #827
- Bump org.mockito:mockito-core from 5.11.0 to 5.12.0 by @dependabot in #830
- Bump org.sonarqube from 4.4.1.3373 to 5.1.0.4882 by @dependabot in #828
- Bump junit from 5.10.2 to 5.10.3 by @dependabot in #826
- Bump io.github.gradle-nexus.publish-plugin from 2.0.0-rc-1 to 2.0.0 by @dependabot in #831
- Add horizontal Menus. by @nightm4re94 in #833
- Bump org.mockito:mockito-core from 5.12.0 to 5.13.0 by @dependabot in #835
- Bump junit from 5.10.3 to 5.11.0 by @dependabot in #834
- Updated Java version for the development environment in CONTRIBUTING.md by @SushmitaGoswami in #837
- Adjust Creature sprite naming conventions by @SushmitaGoswami in #839
- Synchronizing maps throws an exception when there is no maps directory in the project root by @SushmitaGoswami in #840
New Contributors
- @iamllcoolray made their first contribution in #814
- @Hades948 made their first contribution in #813
- @hedfol made their first contribution in #816
- @Josef-Friedrich made their first contribution in #819
- @Mshnik made their first contribution in #822
- @SushmitaGoswami made their first contribution in #837
Full Changelog: 0.8.0...0.9.0
0.8.0
You might wonder why we've skipped version 0.7.x. This has been due to tests on our automated release pipeline that have created some release versions with 0.6.x and 0.7.x tags. We wanted to make sure that these test versions remain as hidden as possible and thus have decided to continue with 0.8.0.
What's Changed
- Feat : Enhance sprite dimension determination in sprite import panel #779 by @Maxime91680 in #795
- Upgrade gradle wrapper from 8.4 to 8.5 by @steffen-wilke in #799
- Fix utiLITI artifact upload. by @nightm4re94 in #800
- Fix Sonar issues. by @nightm4re94 in #801
- Add release note generation workflow. by @nightm4re94 in #802
- Create auto-releases as drafts. by @nightm4re94 in #804
- Tmx 1.10 by @steffen-wilke in #803
- Improve test coverage by @nightm4re94 in #805
- Automate release announcements. by @nightm4re94 in #807
New Contributors
- @Maxime91680 made their first contribution in #795
Full Changelog: 0.6.1...0.8.0
0.6.0 - "Trick or Treat!"
Surprise! After a quiet period of not releasing a new engine version since January 2022, we proudly present LITIENGINE 0.6.0. This is a release packed mostly with invisible infrastructure changes and refactorings, but also enhanced documentation, tests, and important bugfixes.
There had been some crucial problems in our build and deploy toolchain, which prevented us from releasing new versions for quite a while, but these problems have been resolved and now we are even releasing nightly snapshot builds for you to test out the latest changes!
You may have noticed the versioning of LITIENGINE has changed too.
Instead of e.g. v0.5.2-beta, we are now using plain semantic versions for stable releases (starting with this release 0.6.0) and a modified git describe variant (e.g. 0.5.2-166-gb2e597fe-SNAPSHOT/) for snapshot versions.
Since the last release, we have updated to a more recent Java version several times, and recently we have finally moved to the new LTS version Java 21. That means you can now use all the new cutting-edge Java features in your LITIENGINE games!
Of course, we want to thank all our contributors, sponsors, users, and community members for keeping LITIENGINE alive even when we maintainers get lazy. You are the heart of this project!
The LITIENGINE library 0.6.0 is ready for consumption already, please stand by while we get the utiLITI packages for windows, mac, and linux ready.
The LITIENGINE library is available through Maven Central:
Gradle (Groovy)
implementation 'de.gurkenlabs:litiengine:0.6.0'Gradle (Kotlin)
implementation("de.gurkenlabs:litiengine:0.6.0")Maven
<dependency>
<groupId>de.gurkenlabs</groupId>
<artifactId>litiengine</artifactId>
<version>0.6.0</version>
</dependency>"Java 17 Migration" Release v0.5.2-beta
Just in time for making your new year's resolution of creating amazing games with LITIENGINE, we proudly present our latest update, packed with 250 commits over the last ten months!
Let's talk about the elephant in the room: LITIENGINE is now fully running on Java 17! In the future, we plan to keep the library updated to the latest stable jdk versions for you to utilize all the juicy new features Java has to offer.
To make building ingame UI more pleasant, the Slider, TextFieldComponent, and SpeechBubble components have seen massive updates.
Bugfixes and UX improvements for utiLITI will ensure a more smooth experience when handling the editor.
Apart from that, a lot has changed in our build and deployment pipeline and the repository is now utilizing GitHub actions instead of Travis CI. This goes along with a completely revised directory structure and proper separation of submodules. The way we bundle native libraries has been adapted and the dependency on steamworks4j has been removed. Please also take note of our changed contribution guidelines: it is now required to comply with the Java code style conventions we provide in the repository (see CONTRIBUTING.md).
Finally, a huge THANK YOU is in order: To all our tireless code contributors, to the community involved in discussing issues, to everyone providing help in our forum and on Discord, and lastly:
Thank you to our new Sponsors RajBet, Trust My Paper, CasinoHex Canada, and ej-technologies (in chronological order of sponsorships)!
What are you waiting for? Start the new year the right way: making games with LITIENGINE.
Visit litiengine.com
Download LITIENGINE v0.5.2-beta
LITIENGINE is available through Maven Central:
Gradle (Groovy)
implementation 'de.gurkenlabs:litiengine:0.5.2'Gradle (Kotlin)
implementation("de.gurkenlabs:litiengine:0.5.2")Maven
<dependency>
<groupId>de.gurkenlabs</groupId>
<artifactId>litiengine</artifactId>
<version>0.5.2</version>
</dependency>"No more Netcode" Release v0.5.1-beta
This release brings tons of bugfixes and quality-of-life improvements. Feature-wise, the highlight of this version is the addition of a Tweening framework that lets you interpolate values over time, e.g. to let your GuiComponents bounce or your Entities wiggle.
As the engine's networking code had been an unmaintained, untested, and even unsafe mess, we have decided to remove the networking package entirely.
Our Discord server has seen some upgrades and we gladly welcome our first community moderator, Conifer! In order to give back some of your love, we have introduced some special roles for our forum and the Discord server:
@Supporter: Members that have supported us with donations.@Contributor: Members that have contributed to our open source code repositories@Early Bird: Members that have been part of our community since the Alpha days of LITIENGINE.
We try to assign these roles to the best of our knowledge, but if we forgot you - please don't hesitate to complain. :)
Apart from that, we've updated the sponsoring tiers in the LITIENGINE Open Collective, allowing you to support our work financially and with full transparency. We have also started a spreadshirt shop where you can buy all kinds of LITIENGINE related swag and promote the cause (feel free to suggest additional motives)!
As always, huge thanks to all contributors and fans! This is an exciting journey for us and we are grateful to share it with you.
Visit litiengine.com
"Farewell, Alpha!" Release v0.5.0-beta
Finally!
As of today, we end the four year-long LITIENGINE alpha, spanning a total of 17 feature-packed releases. Simultaneously, LITIENGINE hits its first beta release v0.5.0-beta, marking a magnificent milestone for us.
What once started as an overly ambitious hobby project of two naive brothers seeking to create their own video game, is now one of the most successful Java 2D game engines on the market - despite being in early access! Our hearts are filled with joy seeing how popular LITIENGINE has become and we want to thank you from the bottom of our heart.
To celebrate the prosperity of LITIENGINE and as a big thank you to our supporters, we have completely remade the LITIENGINE website from scratch. It is now a well-designed, streamlined experience that guides users to the most important points of interest more naturally. With everything designed to be maximally self-contained, we are also no longer hosting the documentation, JavaDocs, and Download page externally: The LITIENGINE website thus has become a purposeful and holistic hub for everything related to our favourite software.
We are convinced that LITIENGINE's user base and relevance will keep growing and there are some thrilling years ahead of us. If you're not already part of the LITIENGINE family, join our lovely community and explore the exciting features of our new website and LITIENGINE's first beta release.
Visit litiengine.com
"Stay-At-Home-And-Code" Release v0.4.20-alpha
Fixes
- 0d269f4 Fixed importing map nested tile layers
- #304 Excluded module-info.class from external lib from the LITIengine jar files
- 204a153 Fixed bug when loading Resource bundles with Spritesheets missing the image format attribute.
- 4be7ae1 Fixed issue with sprite sheets not being reloaded when replacing them at runtime
- 1065757 Fixed image string serialization by returning a compatible image for the current
GraphicsEnvironment - 019a410 Fixed issue with random point implementation in circles
- b640d3e Don't use URLs as keys for resources (this had major performance drawbacks)
Features / Improvements
- Improved the visibility of APIs that are not intended to be used publically
- Added test coverage to many utility classes
- 470b402 Streamlined the
ListFieldconstructors. - bd6faeb Added explicit listeners for the GamepadManager's events
- 368669d Added a dedicated
ResolutionChangedListenerfor theGameWindow - b3b5037 Add debug option to render the sprite bounds in addition to the
Entitybounds - 3cc9187 make shadow offset configurable in the
ShadowImageEffect - 5af6f4d Allow custom
Creatureimplementations to override the parents controllers - #322 Enhanced
TextRendererAPI - a1ea04c Implemented
EntitySpawnersupport for providing spawn points via callback - d4207f8 Make use of
Spawnpoint.spawnin theEntitySpawnerto support events - 5d8a575 Added pivot support to
Spawnpointto align spawning entities - 8ea0151 Load
CustomEmitterresources fromResourceBundles - 8113566 Properly support resolution scaling at runtime
Added a unified Random API for the engine
4217403 Previously the extension methods were spread around the utility classes. With these changes, all additions that provide pseudo-random values have been unified and aggregated into one API: Game.random() Some prominent examples of API changes:
ArrayUtilities.getRandom(...)->Game.random().choose(...)CollectionUtilities.random(...)->Game.random().choose(...)MathUtilities.randomSign()->Game.random().nextSign()MathUtilities.getRandomIndex(...)->Game.random().getIndex(...)- ...
Changes
- 56a123e Use
java.nio.charsetinstead of constants strings for charsets - eef04d2 Consulted entity AI related namespaces under
de.gurkenlabs.litiengine.entities.behavior - 9a78dc4 Unified some event names:
ICombatEntity.addHitListener->ICombatEntity.onHitICombatEntity.addDeathListener->ICombatEntity.onDeath
utiLITI
- #314 #315 Added the possibility to export all sprite sheet information
- #313 Added additional console feedback for common operations
- #312 Placed status-bar directly under the map view
- 319c32f Fixed potential exception when clearing color controls
- 67aa299 Make components and font sizes aware of the configurable UI scale
- #320 Fixed silent startup exception when last game file was empty
- 7ca746f Improved the
AssetPanelItemvisuals
Misc
- Added a ton of Javadoc to the public API
- Added GitHub sponsoring button to the repository
- Replaced deprecated Gradle configuration elements
- 509d749 Updated Gradle wrapper
6.0.1->6.2.2 - ae8f102 Updated JUnit version
5.4.+->5.6.0 - ae8f102 Updated Mockito version
2.25.+->3.3.3
Contributors in this release
@Phlosioneer
@Gamebuster19901
@YannikSchoeberl
@hyler
Also, thanks to all the contributors to the LITIENGINE community in the forum and our discord! All your comments and thoughts help us to shape the engine towards a stable release.
"Docs moar docs, throw more docs!!!" Release v0.4.19-alpha
Fixes
- bf31e15 Fixed
ArgumentNullExceptionthat could be thrown if an entity hit event was not related to anAbility. - 7c25cb2 Fixed bug that made
XmlUtilities.readnot work for files within a jar. - 69afe69 Don't ignore minimal location updates on entities
- 680ce0b Fixed issue which caused the Camera hotfix for certain renderscales not to work.
- ca5cfa2 Fixed null pointer check in
TmxMap - 59360c4 Fixed issue with the GameWorld.reset overload
Features / Improvements
- Added and improve the Javadocs of many APIs
- aeccaa4 Added possibility to remove timed actions.
- #301 28f1036 Added entity render events for individual entities.
- adb2bfc Extend the ReflectionUtilities with a few helpful methods
- 9fde70d Added events for changes on
ConfigurationGroups - c8ca4b1 Added events for layer rendering on the
MapRenderer - 70c598a Added
onMovedevent forIMobileEntity - 41679ed Added
spawnedevent forSpawnpoint - 87c339d Added updatable count to the
GameMetrics - a7a7637 Don't modify layer visibility when serializing maps.
- #297 Re-Added shortcut API for finding tile bounds
Changes
- 5ddf044 Drop the
Game.loop().getUpdateRate()method in favor ofGame.loop().getTickRate(). - 30cd2c1 Improve visibility modifies of the
SoundEngine - 6d92e25 Rework the default mouse cursor behavior
- Use the default cursor if no virtual cursor is set and the mouse is not being grabbed by the window.
- Move the debug cursor handling to the MouseCursor implementation
- Don't grab the mouse by default.
- c950d55 Replace some explicitly thrown exceptions by log messages.
- d715f2f Drop the
de.gurkenlabs.litiengine.annotationpackage. - 39f365e Change Entity collections from the
Environmentto be immutable
Revamp of several event methods and listeners
- 3747d8c 080afea Streamline rendering events and API
- 59b4b3d Reworked the
ScreenManagerevents - 1c41e83 Reworked the
Mouseevents - 537b5d7 Reworked the
Keyboardevents - 480a259 Reworked the
GamepadandGamepadManagerevents - 111d81d Reworked the
Cameraevents - 4204d8a Reworked the
Emitterevents - e438fc8 Reworked the
Abilityevents - Marked many listeners as
FunctionalInterface
utiLITI
Misc
- Updated SonarQube plugin
2.7->2.8 - Updated Gradle
5.3.1->6.0.1- d4d35a7 Print Gradle warnings in the build log.
- 7340f5b Prevent duplicated resources in the .jar files.
- 94b46dc Exclude duplicate files from the jar.
Contributors in this release
Also, thanks to all the contributors to the LITIENGINE community in the forum and our discord! All your comments and thoughts help us to shape the engine towards a stable release.

