EasyRPG Player 0.8 “Paralyze”

18 months without a new release, but the project is not dead! We planned an interim release in early 2022, but we were too burned out and it never happened. However, this new release will make up for the long wait.

This release marks a change in the development team: After 12 years, one of our core developers (Ghabry) will be taking a break from EasyRPG Player development to focus on the EasyRPG Editor (finally!) and other cool side projects not related to EasyRPG. He is one of the most active contributors and our development team is pretty small, so Player development will slow down even more. Do not expect too many gigantic updates in the next few years. We’re an open source project, but let’s face it: Long-term contributors are hard to find. You might be the next one, dear reader ;). To emphasise the current situation, the codename of this release is Paralyze.

You will see a lot of bugfixes mentioning Yume2kki (ゆめ2っき). This game relies on a lot of undocumented behaviour and edge-cases in RPG_RT, and it is very popular. So the test coverage is really good.

This is the most hyped technology at the moment, but this blog post was written without the help of ChatGPT. It is more fun to write the text than to construct prompts. Instead we used the new DeepL Write service, which makes grammar suggestions and fixes spelling errors. A great tool for improving texts from non-native English speakers.

OpenRTP Project

First an intermission to tell you about a different side-project: The OpenRTP project. The Runtime Package (RTP) is a collection of shared assets for RPG Maker games. They can only be used for games created with RPG Maker. We cannot distribute them. Therefore we are working on our own replacement assets. They are layout compatible with the existing RTP (this means they show the same concepts at the same location, making them a drop-in replacement).

The assets will be under CC-BY 4.0. This means you can use them everywhere (outside of EasyRPG) and even modifications are allowed but you must provide attribution.

If you want to help we recommend to read the guide and you can ping Jetrotal in the openrtp channel. Unfortunately we are just a small open source project. All the development you read about in this blog post happened in our freetime. We cannot offer any money to you.

Here are some notable contributions. There are many more, but we cannot show them all here.

A very generous contribution : A replacement for all tilemaps/chipsets (Jason Perry, CC0).
This whole topic is controversial, but yes, our time is limited and most of us are not artists, so we use AI art for prototyping (left). garakuta, a real artist, turned our AI mock-up into beautiful pixel art (right).
Beautiful monster graphics contributed by Seraph Circle.
Looks familiar? Yes. It is the Cloud by the legendary Don Miguel. He provided the first unofficial English translation of RPG Maker 2000. (CC0)

A new logo (#2701)

Now back to EasyRPG Player.

We are changing our startup logo for the third time. The new logo is less detailed and looks less blurry when scaled up.

The logo is licensed under CC-BY-SA 4.0 if you wish to use it (same as the OpenRTP license with the additional restriction that modifications must be under the same license). All the logo files are available in the download directory.

All our logos. Top-left shows the first logo. In 2019 with the release of 0.6 we moved to a simpler logo (top-right). Now with 0.8 we have two new logos (bottom).

Settings (#666, #2730)

EasyRPG Player has finally a settings scene. This scene took almost two years to develop, with several month-long breaks, because it was just really annoying to program. It wasn’t really challenging, but it was tedious: a huge amount of player code had to be rewritten to read the configuration settings, and we had to make sure that all the features worked properly on most of the platforms we support. If a setting is completely unsupported on a particular platform, it is hidden. But the effort was worth it, and adding more settings is now pretty easy because the boring foundation is there.

The settings can be accessed via the Open Video Options event command, the game browser, or by pressing F1. If you have a game controller, try the Start button.

Next to the settings there is an option to exit the current game. This is useful for games that do not use the built-in title screen. Previously, there was no good way to exit these games. (#1335)

Video settings

In the video settings the initial window layout on startup (Fullscreen or Window and the zoom factor) can be configured. The window position is also retained (there is no user interface for this, just move the window).

V-Sync can be toggled. If it is off, you can set a custom frame limit instead. Note that disabling V-Sync can cause tearing. When V-Sync toggling does not work for you it is likely a problem with your GPU driver.

We offer now three scaling modes: (#720, #1366)

  • Nearest does a nearest neighbour scaling to the full size of the screen. This was the default until now and causes ugly scaling artefacts when the target resolution is not a multiple of the game resolution. No idea why you would want to use this, unless you are nostalgic for our old implementation.
  • Integer is like nearest, but it only scales to multiples of the game resolution. This looks better but you get large black borders depending on your screen resolution.
  • Bilinear is the default and in our opinion the best of both: First we scale up with nearest neighbour to a suitable resolution that is slightly higher than your screen resolution and afterwards we do a bilinear downscale. The end result fits the whole screen and has no artefacts. The disadvantage is that it loses a bit of sharpness. If you really want perfect sharpness, you have to use Integer.
From top to bottom the three scaling algorithms: Nearest, Integer and Bilinear. The differences are hard to see in the embedded image. Click on it to see it in full size. Due to an editing error, the images are missing some pixels at the bottom.

The Game Resolution setting is very special. This allows you to force games to render in widescreen (16:9) or ultra-widescreen (21:9) resolution. Be warned that this will break games because they do not expect to run at such high resolutions. See the Custom Resolution / Widescreen section below for more information.

Audio settings

In the audio settings you can control the volume of the background music and of the sound effects (#794). The volume settings will currently not work correctly for MIDI playback, as MIDI volume is handled by sending MIDI events to a MIDI device. This will be fixed later.

Input settings

The input settings allow you to remap all the buttons supported by our engine. If you want the Numpad 0 mapped to F or Gamepad X you can do that now. The input UI looks a bit cluttered because RPG Maker has a ridiculous amount of keys mapped for certain actions, especially confirm and cancel. (#713)

You likely won’t have to enter these settings a lot because the default button mapping for the gamepad is now much better and every relevant key is available by default. Even games like Yume Nikki that require the numpad are already playable: By default the right analog stick represents the Numpad from 1-9 (5 is right stick press, 0 is left stick press). If you prefer the buttons used on Nintendo’s controllers there is even a direct setting to swap AB and XY.

It is possible to make such bad mappings that the Player becomes uncontrollable. In this case, you can request an emergency mapping reset by holding down any four buttons in the settings and waiting a few seconds.

More settings

In the engine settings you can currently configure where the settings menu item appears. You can choose to display it on the title screen or in the menu scene. By default, the configuration is not saved on exit. You must save it manually. You can enable automatic saving of settings here.

Under license you can see the open source libraries that EasyRPG Player is based on.

Engine settings (left) and license information (right)

Custom resolution / Widescreen (#2872, #2897, #2922)

The Player now supports custom resolutions, and there are two ways to enable this feature:

The first way is to use the resolution setting in the video settings. This works for all games. You can choose from three resolutions: 320×240 (4:3, Original), 416×240 (16:9, Widescreen), 560×240 (21:9, Ultrawide). The height of 240 remains, and we had to make sure that the width is an even number when divided by 16 (size of a tile). This worked best for positioning the camera, and while experimenting we noticed that many games started to look bad when the height was increased. Increasing the width, however, usually worked fine. To ensure that not too many games break, the x-coordinate and camera position are changed to ensure that everything is still rendered in the centre. Have a look at this picture to see what we are talking about:

Comparison of the different resolution in Aedemphia and Zerra’s Adventure. From top to bottom: Ultrawide, Widescreen, Normal. You can see that the images and the camera are centered to ensure a good compatibility. However you can already see inaccuracies when you look at the clouds in Zerra’s Adventure: The position is different.

Of course, the first solution is more of a compatibility hack and will not work for all games. What about new games? For new games, you probably do not want hacks. Here you can choose any game resolution. The camera will still be centred, but the coordinates will be in the top left corner. This uses the same configuration as Maniac Patch: In RPG_RT.ini create the values WinW=Value and WinH=Value. These are processed on startup to change the resolution of the engine. If you want to know more, read the manual page.

Here is an example of the dynamic switching of the resolution between the games:

Font rendering

Over the last years we have received so many complaints that our fonts are ugly. We are really sorry, but the fonts RPG_RT uses are from Microsoft and we are not allowed to distribute them on other platforms. Instead, we use open source fonts that have the glyphs we need, but they look different. This is similar to the problem MIDI sounds wrong because we cannot use Roland’s copyrighted soundfont from Windows. The wrong MIDI was fixed in 0.7 because you can provide a custom soundfont, and with 0.8 we solve the font problem because you can finally provide custom fonts. (#1669, #2855, #2859)

The fonts must be placed in the Font folder of the game directory and must be named Font.ttf or Font2.ttf. Which font file is used depends on the system graphic font setting. Besides ttf, fon and many other fonts are supported (anything supported by FreeType, the best open source library available for font rendering).

The only true way to play is with the font Don Miguel uses: Matisse ITC.

Font support goes much further than in RPG_RT: The old engine only supports monospace fonts. They can be either in 6px (half-width) or 12px (full-width) wide. Anything else will render incorrectly. We support all types of fonts and respect the metrics when rendering them. Though, only fonts optimized for a small height of 12px will look good.

Examples for different fonts

Did you know that the fonts RM2000 and RM2000G bundled with the RPG Maker translation by Don Miguel have incorrect metrics? All glyphs have a width of 12px but RPG_RT renders them with 6px so this went unnoticed. We added a compatibility hack that forces the expected metrics.

Broken metrics (left) and proper metrics with compatibility hack (right).

A custom ExFont placed in the Font folder can now contain colour.

Some colourful effects you can achieve with a colour ExFont

Our font renderer includes support for the HarfBuzz shaping library. Shaping is required for languages with complex scripts such as Thai. Without a shaping engine, the text will look incorrect or, in some languages, be completely unreadable. Shaping is required for all scripts where the appearance of the glyph depends on the context (e.g. on what the previous glyph was). However it is also useful for European scripts. The shaping engine can insert ligatures (if the font has them). A typical ligature is the combination of ffi to ffi. Thai games already exist, but they usually work with custom fonts that contain pre-composed Thai glyphs. Our solution eliminates the need for this hack. (#492, #748)

The rendering itself looks terrible, as the font lacks good low-resolution glyphs, but Times New Bastard is great for showing that shaping works. This font renders every 7th character as a sans serif, thanks to the magic of ligatures. If you count the glyphs, you can see that it works.
This is an accurate rendering of Thai text in sans serif (top) and serif (bottom). Just believe us.
Even Arabic renders fine (the top is rendered with LibreOffice Write for comparison). A lot of detail is lost at such low resolutions, and our Player itself does not support right-to-left rendering.

You are probably familiar with Emoji😜. Emoji are part of the font but something is different: they are not black and white. They have colour. Such colour glyphs are now supported. At least in theory: Unfortunately all colour fonts we found were designed for much higher resolutions and there are no user friendly tools available for creating colour fonts. Look at the pictures here to see what is possible: It is like a spritesheet encoded in a font. Using ligatures you can do things like “When 100HP is encountered in the text, draw a health bar”. We want to offer a tool to generate them but currently we have no time to finish it. Sorry. We will let you know when there is any further progress. (#2857)

Here is an example of a possible effect: The heart health bar is a single glyph, and the following glyphs are rendered on top of it.

And finally, something simple: Japanese and Chinese have the problem that they use the same internal value (codepoint) to reference glyphs. This is called CJK-unification. This causes problems if the wrong font is used because visually different glyphs are displayed. To solve this, a Chinese font (WQY) is now prioritized, when a running a Chinese game. (#2724)

More Maniac Patch commands

Maniac Patch is a complex patch for RPG Maker 2003 that adds many new event commands to the engine. In EasyRPG Player you can also use these commands in RPG Maker 2000 games.

We have added support for a lot of additional Maniac Patch commands. In short, almost everything except the battle system features, because the battle system is very fragile and every time we touch anything in the battle system, something breaks. The battle system has to be bug-compatible with RPG Maker, and changing anything in it is just extremely risky.

Note that with almost all of them we mean commands up to version 210414. Newer versions of Maniac patch are no longer direct patches to RPG_RT, but a complete rewrite of the engine. Unlike EasyRPG Player, this rewrite is not open source and we do not have the resources to reimplement the features. Therefore we have decided not to support anything post 210414. If you require all features feel free to use the latest version of Maniac patch, but if you do, you will not be able to play your games on other platforms with EasyRPG Player.

However, you can submit patches that add further support and we will review them. Except if they target the battle system, as explained above.

Changes & Fixes

  • The warning that appears when Maniac Patch is detected is now disabled. (#2777)
  • The savegame-related event commands were reading from the wrong directory. (#2737)

New event commands

  • Control Var Array for operations on ranges of variables (#2733)
  • Get Picture Info for obtaining information from active pictures (#2735)
  • Control Global Save for managing of global savedata. (#2797)
  • Show String Picture for displaying text on the screen outside of message boxes. This feature is pretty cool, but was no fun to implement. There are still a lot of inaccuracies because Maniac Patch simply outsources it to the Windows font API. We cannot do this because we support more than just Windows and have to implement it from scratch using the open source FreeType library. (#2870)

Here a funny showcase of the String Picture feature. You can now stop asking for it! Play it by yourself.

Extensions to existing commands

  • Control Variables supports now almost all the new features, including expressions. (#2797) Array operations on expressions are not supported, and we decided not to implement expressions that mutate multiple variables. E.g. V[4] = 3 + V[5] += 4, here the V[5] += 4 is disallowed. This feature is already confusing in most programming languages. Create two Control Variable commands for V[5] += 4 and V[4] = 3 + V[5] instead.
  • New conditions in Conditional Branch except for Was loaded this frame (#2797)
  • While loops and foreach loops as an extension to the Loop event command. (#2649)
  • Pictures support now the origin specifier (origin defines the location x/y coordinates are based on, very useful), a fixed rotation angle and using frames for animation duration instead of milliseconds. (#2741)
  • This is actually a post-210414 feature but it was easy to add: Music and sound effect commands now support variables and Wait now supports variables and waiting by a specific number of frames (instead of milliseconds). These were added because the awesome EasyRPG dev simulator requires them. (#2914)

Android and SAF

Starting with Android 10, updated apps must use the Storage Access Framework (SAF). SAF was introduced a long time ago in Android 4.4, but starting with Android 11, Google is enforcing its use. Instead of accessing files and directories directly, all access must go through SAF. From a privacy point of view, this is a great idea because the user can decide which folders are accessible by the app. There can also be different content providers in the SAF. Google Drive is a content provider and through the SAF, applications can read from and write to Google Drive directly. The idea is good, but the design is terrible: it is extremely slow and it is no longer possible to use the normal file interface. Instead, everything has to be sent through the SAF functions provided by Android. Fortunately, in EasyRPG Player 0.7 we added support for ZIP archives. For ZIP support, we rewrote a large part of EasyRPG Player to centralise where file and directory access happens. This made it possible to easily reuse most of that interface for SAF interaction. This nice abstraction made it pretty easy to hook SAF in. In the process we found many annoying problems, e.g. the high level abstraction (DocumentFile) takes minutes (no joke. It takes minutes!) to enumerate directories, making it completely useless, but we were able to solve this. We will be releasing another blog post later that talks about all the issues we had to work around to still have a pleasant user experience on Android. (#2434, #2699)

One SAF issue we want to talk about now is CVE-2023-21036 (aCropalypse). You have probably read about it: The cropping function of the Android screenshot tool kept old image data from the uncropped image that could be recovered. The reason is a very questionable change since Android 10: Opening a file for writing with SAF no longer truncates the file. Instead, it simply writes from the beginning, and if the data you write is less than the existing file, the old data remains. This is unlike any other file API and completely unexpected. It is likely that there are many other applications out there that have a similar vulnerability. After reading about this CVE we had to have a look at it and, yes, EasyRPG Player is affected. When writing savegames and the new savegame data is shorter than the old savegame data, the old savegame data is left at the end of the file. We now truncate savegame data before writing it, which mitigates this problem. (#2936)

The Android app can now launch a game embedded in the APK directly. This is for standalone mode, a mode that allows you to distribute your own games via the Play Store. There has been an experimental standalone mode for years, but it worked by extracting the game and then launching it. This doubled the size and took a long time to extract. Not something we can recommend. Now the game is launched directly from the ZIP archive. We have not yet managed to write a Guide explaining how to unzip. We will provide a guide later that will explain the steps needed to bundle and publish your own games. Sorry about that. (#995)

A long-standing issue is the inability to change the button layout in portrait mode. This has now been implemented: Both portrait and landscape button layouts can be modified. (#1041)

To make the app much more responsive, the game browser now checks for games in a background thread. If the games have not changed since the last start, the games are fetched from a cache. This makes the app start almost instantly. (#1330)

It is now possible to launch games in debug (test play) mode, and you can add two new buttons to the touch interface: Open debug menu and Walk through walls. (#2244)

The Android app can now launch games that are inside ZIP archives. Previously, this feature was only available for Player versions that used the built-in game browser. (#2760)

The Android game browser now lists folders and zip archives.

We are not sure when this started happening, but on newer versions of Android, the navigation drawer (that sliding menu that appears from the left) would sometimes appear behind the game window. This took a long time to fix. We tried many different solutions on the internet with varying degrees of success. If you ever encounter this in your project: Here is the solution.  (#2885)

Some of the new settings are accessible via the Android interface. For the other settings, the built-in settings interface is still available.

Broken Multi-Touch on Android when using a device by Samsung

We are aware of an issue with touch input on Samsung devices running Android 11 and later. The cause of this issue appears to be the Game Booster bundled with the operating system.

Game Booster works by reducing the resolution of games to increase their frame rate. In order not to break any games, it has to translate touch coordinates so that they still fit into the coordinate system of the downscaled game.

Unfortunately, Game Booster has a bug: If there is anything on top of the game, such as touchable buttons created through the Android UI, these buttons will also get the modified touch coordinates, which is incorrect because the buttons use the native resolution for the position. It is not possible to detect the Game Booster and as a result all calculations within our touch interface are wrong.

This bug has been known for two years. They do not care. Here is a nice forum post about this bug in the Samsung forum. It has three replies: All from spambots. Please stop buying Samsung phones. This is not the first time they have introduced bugs into their version of Android. We already wasted so many hours over the last years solving bugs that only happened on Samsung devices. The main problem here is Samsung’s huge market share: When they break something, we get a lot of one-star reviews because the app developers get the blame. We cannot ignore the bugs as it hurts the rating.

Also we have no Samsung devices and no money to buy them. If you are a developer with an affected device: Please submit a patch with a workaround to us!

Crash fixes

Setting the FPS limit to 0 from the command line (--fps-limit 0) no longer crashes with a floating point exception (divide by zero) anymore. Setting the limit to 0 now removes the frame limit. Besides the fps limit is now available in the new settings scene. (#2679)

Loading ZIP archives no longer crashes on some of our homebrew platforms. (#2682)

The Load event command does not crash anymore because of a use-after-free bug: Old tilemap data was still referenced and used. (#2695)

Regressions fixed

In this section, we list issues that worked in older versions of the EasyRPG Player, but were broken in the 0.7 release.

In Emscripten we had an Easter egg when selecting Exit Game: The text “It’s now safe to turn off your browser” was displayed. This is a message similar to the one Windows 95 and 98 display after shutting down the PC. This feature was broken for some time, but is now working again. (#1899)

To understand this reference, you must be quite old.

When moving down, the characters no longer overlap. (#2550)

A performance optimisation in our renderer was a bit too agressive: When a picture was rotating the transparent parts were rendered in black while fading out. (#2667)

Language / Translation

The translation feature we introduced in the last release has become increasingly popular and we have added a lot of features to make it more usable. If you want to use it we recommend that you read the translation guide.

Breaking change: The Languages folder has been renamed to Language to match the naming convention of other game folders. Due to many limitations, our translation feature was not used much in 0.7 and the continuous build has had this change for a year making this a low-risk change.

Notable new features that we have added in the meantime (for a detailed explanation, see the aforementioned guide):

Because RPG Maker 2003 is very old software, it uses the system’s local encoding. EasyRPG Player is compatible with this (plus some heuristics to automatically detect the correct encoding). Now, with the translation feature this, has resulted in data loss in savegames because if text cannot be displayed in the encoding, the text is deleted. When a translation is active, the text in the savegame is now stored in Unicode to prevent data loss. (#2887)

The translation feature is now available in the web player. (#2723)

  • Loading translations now works when the current game is launched from the game browser or is inside a ZIP archive. (#2715)
  • The name of the Actor in the condition Actor name is is now translatable. (#2831)
  • Text displayed by Show String Picture is translatable.You can specify a language code for each language. This will display the correct characters in the Enter Hero Name scene and use the correct fonts for rendering. This also helps with the CJK unification issue mentioned earlier. (#2825)
  • Some changes are simple: The help window that appears when you select a language on the title screen now respects the transparency setting. (#2690)
  • The language selection will no longer overflow when more than 9 languages are available. This may sound like an obscure edge case, but the Yume Nikki Online Project, which uses a fork of our web player, reaches this limit for certain games.
Who would have expected that Yume2kki can be enjoyed in so many languages thanks to EasyRPG Player?

Audio

When playing a WAV file the BGM completed a loop condition will now always return false (this is a RPG_RT bug and we have to reimplement bugs). This bug was abused in Yume2kki (ゆめ2っき) 0.120 patch 8 to detect EasyRPG Player and teleport to different maps compared to RPG_RT. Please do not do such engine detection. It changes the experience across different platforms and can lead to faulty bug reports.

While we were at it, we checked other edge cases here and noticed that this check must also return false if no BGM is currently being played.

Yume2kki (ゆめ2っき) uses hacked playback speeds for music and sound effects that are higher than what is normally supported. The limit has been increased to play them correctly. (#2590, #2706)

We attempted to fix audio glitches (crackling and pops) when music loops in Yume2kki (ゆめ2っき). It is now better than before but still not ideal. Our audio code is really showing its age. (#2666)

Playing very short wav files will not break the audio of the Player anymore. (#2950)

Mod/Tracker files play again on the Windows version.

MIDI

FluidSynth looks now in more places for soundfonts (besides easyrpg.soundfont in the game directory): Via --soundfont command line, through the environment variable SDL_SOUNDFONTS and we also check now the default operating system search path. (#2300)

Music played when sleeping in an Inn is now stopped after 10 seconds (#2611) and when using the native MIDI device (e.g. Windows MIDI without a soundfont) the Inn music plays now. (#2689)

When using a native MIDI device it was possible to corrupt the playback between songs because the device was not properly reset. To fix this we are sending now a SysEx GM On event. (#2824) However this does not fix all games. We are aware of more problematic MIDI files in Toilet in Wonderland that have a different issue.

Map & Interpreter

In Yume2kki (ゆめ2っき) it was not possible to move when going from Christmas World to Exhibition. The problem here is that the target coordinates of the teleport are out of bounds. Well, not really out of bounds because the map is looping but they way how we handle looping is a bit different to RPG_RT. We added code that ensures movement on looping maps works correctly even when being technically out of bounds. (#2716)

When doing calculations with variables, RPG_RT clamps the values in variables into a range of -9.999.999 to 9.999.999. We did the same but when multiplying two large numbers it was possible to overflow them. Also Maniac Patch lifted the range limit and you can use the full 32 bit integer range now. This made it even more obvious that we have overflow problems. We use special compiler features like __builtin_add_overflow now to detect overflow and clamp the result correctly when it happens. (#2650, #2734)

We fixed a minor difference in the rendering logic: When two events are on the same y-coordinate we rendered them by creation order. However RPG_RT renders them from right to left. This logic is now implemented. While we were at it we also changed the rendering behaviour for overlapping events (same x- and y-coordinate): Here the order is now by the ID. This prevents flickering. (#2816)

The shake screen event command moved the viewport into the wrong direction. (#2826)

Teleport targets are now sorted when they are added. The teleport targets were already sorted on save. Now we just sort them a bit earlier to provide a consistent ordering. (#2913)

When using commands that alter the facing in a move route, the movement direction was not updated. (#2790)

We are now more strict about separation of engine features: When a RPG Maker 2000 engine is used it will never execute RPG Maker 2003 event commands. This prevents issues in games that were initially created in 2003 but moved later to 2000. (#2945)

You can now configure various patches to improve game compatibility. With Common This Event you can use This Event references in common events. By default this was only possible RPG Maker 2003 English Release games but there existed inofficial patches that added this to older engines aswell. With Unlock Pics you can use picture commands while a message box is shown. Here the same applies: Enabled in English releases by default but unofficial patches existed for the others. While we were at it we disabled the support for Ineluki Key Patch by default except when a harmony.dll is found or you opt-in through the same configuration. See the manual page for all the settings.

To improve engine detection, the number of logos and version information are now extracted from RPG_RT.exe. (#2923) An incorrectly detected engine breaks the key input event command because it changes between versions. This fixes the games Pocket Quest (#2221), Grave Spirit (#2606) and 세포신곡 (Cell of Empireo, #2614) and probably many more. These auto-detection improvements will not work when running in the web player, as RPG_RT.exe is not available. As a minor regression, this also breaks the engine detected for .flow in the web player. This engine has the wrong engine version in the database file, and the heuristic for using the correct engine has broken other games. However, everything works fine locally. For the web player, you can override the engine with the --engine command line parameter or the engine setting in EasyRPG.ini.

Some transitions, such as Show Inward, are now rendered correctly. The alpha channel was processed incorrectly, so instead of a fade, the image was completely black. (#2901)

Battle system

Our implementation of the battle system is now pretty solid, but there is still room for improvement.

When multiple actors are ready in the RPG Maker 2003 battle system, the order in which they are ready is now remembered. (#2775)

In Despoina the game would softlock when the action Blind Strike was used. Blind Strike used the idle animation as the attack animation and this animation was never marked as finished. (#2896)

In El Heredero del Rey, battle events did not trigger properly, and in Wolfenhain it was not possible to beat the so-called Tor in the so-called Zyklopenberge via so-called Wuchtattacke. This was a bug in how we triggered events that depended on the number of turns: Events that depend on actor turns are only triggered when the actor has taken a turn, and the same goes for enemies. (#2753)

A lot of new combat features have been added. They will be useful when our editor is ready. They are too many to discuss. To name a few:

  • RPG Maker 2003 row command can be disabled
  • Actors and enemies can be immune to critical hits or attribute debuffs
  • The hit rate for normal/unarmed attacks can be configured and they can inflict states
  • Enemies can have strong defense and the normal attack can attack the entire party
  • Enemies: Normal attack targets entire player party
  • The RPG Maker 2000 battle system can be used in RPG Maker 2003 games
  • Support for RPG2kE placeholder strings in RPG Maker 2003 games

For the complete list click on the issue number: #2697

FileFinder

The FileFinder’s data structure has been optimised, making parsing large directories a bit faster and less memory hungry. (#2306)

Drive letters (and things that look like drive letters) are now handled in a better way: We have only tested the handling of drives on Windows and Windows considers both C: and C:\ to be valid drive letters. This is not the case on other systems. As an example lets use romfs:/ on the Nintendo 3DS. romfs: is not considered a valid path but romfs:/ is. To solve this, our code no longer removes the / after the :. (#2256, #2668, #2787)

When a folder is missing, the RTP detection code will not check for assets in that missing folder. This wasn’t really a problem before, but checking for files is now so extremely slow on Android (thanks to the Storage Access Framework) that it delays the start of games by 30 seconds! (#2804)

Missing directories are now cached to make lookups faster. (#2817)

ZIP archives

As of 0.7, loading ZIP archives is supported, but the format is very old, so we encountered several problematic ZIP files:

  • ZIP archives using backslash (\) as the internal path delimiter are now supported. (#2739)
  • “Compressed folders” created by Windows Explorer do not store the file size in the local file header, only in the central directory. The file size is now read correctly, adding support for such archives. (#2836)

To reduce memory usage, the ZIP handler no longer caches all decompressed files in memory. Decompression is fast enough to make this cache unnecessary. (#2788)

Savegames

When changing maps, our Player did not delete old battle animation data, and when saving, this incorrect data was retained. Our Player would display a warning when loading and continue, but loading the same savegame in RPG_RT would only generate an error message. The data is now cleared correctly. (#2431, #2597)

We do not know how this is possible but we received a savegame where the actor ID list was not sequential. As we rely on these IDs, this broke a lot of functionality. Non-sequential IDs are now detected and corrected when the save is loaded. (#2913)

When loading the Load function from the debug scene, old event data was not completely cleared. (#2817)

Pictures & Panoramas

Walking simulators like Yume2kki (ゆめ2っき) have a large community and make use of panoramas for various effects. The technical details of panorama positioning are difficult to explain (and do not make much sense), but most panoramas should now be correctly positioned. (#2195)

The Maiden Outlook was one of the affected areas.
The Garden of Treachery looked completely broken.

When a picture had both the map and battle layer disabled, it would not be displayed at all. RPG_RT however displays them on the default map layer instead. (#2874)

Tone effects look now correct when graphics on the screen use a semi-transparent alpha channel. This bug only affected you if you were using 32-bit images, which are an extension of our engine, or the blend modes provided by Maniac Patch. (#2755)

Platform specific

Parts of SDL1.2 have been rewritten even though it has been obsolete for years. SDL is an abstraction layer that provides video output and more across operating systems. SDL2 has been available since 2013 (yes, 10 years), but there are still cheap handheld devices that use SDL1.2. The reason is mostly that they use the cheapest hardware available without even hardware accelerated rendering. Without hardware acceleration, SDL2 is slower than SDL1.2. We are talking about Anbernic devices like the RG-300 or older revisions of the Bittboy PocketGo. (#1640, #2864)

3DS

The audio system has been rewritten to fix some audio glitches. (#2827)

The bottom screen now shows a battery indicator. (#2827)

Emscripten (Web Player)

Games that support mouse input (and there aren’t many, because there are only two ways to do it: Ineluki’s Key Patch, which was only known to the German community at the time, and the more recent Maniac Patch) can now be played using touch input, making them playable on smartphones and similar devices. (#2694)

Yume2kki (ゆめ2っき) failed to load some assets when being played on Turkish systems. The problem here is casefolding: Windows filenames are not case-sensitive, but on all other systems they are, so we lowercase everything. Also, the web player has a separate filename database (index.json) because there is no way to enumerate directories on the web. How lowercase is handled depends on the locale of the system, and Turkish has some interesting behaviour: The lowercase version of the letter I is not i but ı, and this mismatch made the filename lookup fail. We solved this by using the root locale, which has casefolding independent of the system language. (#2786, liblcf #442)

The beautiful battle backgrounds in Mother: Cognitive Dissonance did not load properly. In RPG Maker 2003, you can specify two battle backgrounds at the same time. On the web player, they cancelled each other out during download, so only one was shown. (#2893) Just to show the moving background again:

Here to illustrate how the animations in the game work: It uses two layers: A background graphic and a mask and the background is moving (here in the video the mask is moving):

The Touch Screen gamepad buttons are now visible when your browser is in full screen mode. (#2900)

The Web Player is now DPI aware which gets rid of the ugly scaling artifacts. (#2900)

Game controllers now work in the web player, at least in most cases. We have noticed that in Firefox on Linux the mapping is completely messed up. This seems to be a browser issue though, as it works fine in Chromium. (#1156)

Keyboard keys are now independent of the keyboard layout. Key presses are usually registered using scancodes. E.g. the scancode “Y” is always sent when the key is pressed that has “Y” on a US-keyboard, even on German keyboards where “Y” and “Z” are swapped. Due to a limitation in the SDL2 library, the keyboard keys were not layout independent in the web player. This has now been fixed so that it is feature parity with the other versions. (#2841)

The title bar of the browser would display corrupted game titles if they contained non-ASCII characters. This was also a bug in SDL2. Updating the library fixed it, as they switched to Unicode, which can display all the world’s characters. (#2727)

When using the Javascript console some versions of Chrome generated exceptions that broke the Player execution. (#2806)

libretro

When using the libretro core all the input is now passed through RetroPad. We used to support the keyboard directly, but we noticed that RetroArch hooks a lot of keyboard keys that are not passed to us. As this could confuse the user, we decided to remove the keyboard mappings. You can still map them to RetroPad keys. (#2752)

RetroArch has a small database of known RPG Maker 2000 games. When such a game is loaded from inside a ZIP the path sent to the Player was incorrectly processed. Such games inside ZIP archives are now loadable. (#2955)

macOS

Our Player binary now runs natively on ARM64 macOS devices instead of using the x64 emulation.

PS Vita

The coordinates of the touch screen are now correctly calculated. (#2683)

Boot parameters provided by the psgm:play service are now processed. This allows launchers to to run games directly through the Player. (#2789)

The latest version of vita2dlib is now being used. This breaks shader support, but the fork with shader support has not been updated in 8 years. (#2791)

Switch

The Switch port now handles events sent by the operating system, such as docking and undocking, or switching to the home menu and back. (#2698)

Wii

After a compiler upgrade, loading savegames on the Wii version broke because the compiler decided to optimise away some byte-swapping code required on the Wii (a big endian system). (#2672, liblcf #438)

Windows

This is the last release supporting Windows Vista. We will update the compiler to Visual Studio 2022 afterwards, making the lowest supported version Windows 7.

The Windows version is now a bit DPI aware. This means that the Player no longer looks blurry on high resolution displays. However, the window itself does not increase in size. This will change when SDL3 is released, which has proper support for high DPI on Windows. (#2958)

Debug text in the Windows Terminal is now displayed correctly. (#2715)

Building / For maintainers

Do not forget to update liblcf to 0.8.

Because of the new font support, it is highly recommended to link against FreeType now. For optional shaping support FreeType must be linked against HarfBuzz. We have supported FreeType before, but now we are fully using its potential.

Our version number is now without trailing zeros. Instead of 0.8.0 it is now 0.8. We will change this policy again later in 1.0 ;).

When using CMake the minimum supported version is now 3.13.

Building of the manual page requires now asciidoctor. (#2840)

Our code now compiles when using the g++13 compiler. g++13 cleaned up the system headers a bit and they no longer pull in other system headers indirectly. This was fixed by manually adding the missing headers includes. (#2881)

Autotools no longer fails the configure step if ALSA is missing. (#2676)

This did not make the cut for this release as we still need to get some stuff sorted out but we are currently working on Flatpak and AppImage Linux packages. We also plan to submit to FlatHub soon. When this all works (likely later in May/June) we will tell you about it. (#2192)

All our platforms now compile using the autotools or CMake build systems. Autotools will only work reliably if you are targeting a Unix-based system. For everything else, please use CMake. By all platforms we mean even the homebrew platforms (Wii, 3DS, Switch and PS Vita). If you have a fork of EasyRPG Player, please stop using the Makefiles. Migrate to one of the supported build systems! (#296, #2627) This change finally made it possible to move platform-specific files to a subdirectory. We plan to move even more files in a later release. (#2781)

CMake:

  • OBJECT libraries are now used in CMake to make linking faster. (#2913)
  • We fixed a build error in CMake with SDL2 when targeting the Raspberry Pi. (#2719)
  • CMake presets are now supported to make building of the Player on our different platforms easier. No need to remember long build lines anymore. (liblcf #447, #2878)

Most compiler warnings reported by -Wall -Wextra are now resolved. We resolve the remaining ones after switching to C++17 and upgrading to the Visual Studio 2022 compiler. (#2913) For liblcf there are still many warnings about anonymous structs generated when -pedantic is used. We will resolve them in a later version.

When building from the git repository, version information is automatically embedded in the Player. (#87#2774)

Our code now compiles when using C++17. We still target C++14. This just means that enabling the C++17 standard after this release will no longer cause compiler errors. (#2745)

On Windows we support now mpg123 1.28.1 and newer. (#2749)

Newer versions of SDL2 are now supported when building for emscripten. (#2856)

liblcf now generates a proper CMake config file. This has been difficult to get right on all platforms, as you can see from this embarrassingly long pull request list:  #446, #448, #449, #450, #451.

liblcf

liblcf is our library for reading and writing files created by RPG Maker.

Some chunks have been renamed for better consistency with EasyRPG Player. (#265, #378)

We have added custom chunks for storing String pictures in savegames. The structure is incompatible with Maniac Patch, but the new chunks give us more flexibility for further improvements. (#440) During implementation, we noticed that certain font attributes were not loading correctly. The underlying problem was that certain flags were never unset when the savegame was loaded. The same bug affected images: All of them were flagged for deletion on map change, even if this flag was unset before saving. (#445)

Dumping of string picture text with lcf2xml no longer adds extra whitespace when converting the data back into binary. (#453)

Arrays of strings can now be stored in the savegame in a Maniac Patch compatible way and lcf2xml can read them. This does not mean that we support string variables, but it is a necessary first step towards implementation of string operations. (#455)