EasyRPG Player for WiiU

Our last homebrew port of EasyRPG Player was 6 years ago for the Nintendo Switch. Now there’s finally a new one for its predecessor: we’re releasing EasyRPG Player for the WiiU. You can get the wuhb file in our download section (under Continuous builds Other).

Compatibility is better than on the Wii because the WiiU has more memory (2 GB instead of only 64 MB) and most crash reports we get for the Wii are related to running out of memory because the games are too demanding (and load too many assets).

Please do not get the version available in the Homebrew App Store. This version is outdated and does not work.

Unfortunately, compared to the Wii and Switch, there is very little homebrew available for the WiiU. Except for RetroArch there is a lack of emulators and engine reimplementations (in our case it is the latter) for this platform. Therefore: Port your software to the WiiU! Developing for this platform works really well. Thanks to Aroma, Homebrew is also perfectly integrated into the system menu and several iterations of your homebrew can be tested quickly via FTP.

The game Ipomoea by Cachi Córdova running on the WiiU. This game uses the Maniac patch with a custom widescreen resolution. That’s why it has no black bars.

Authors

The initial port was done by carstene1ns but he was unable to test it due to lacking a WiiU. Ghabry has dusted off his WiiU to finish the port.

As this is not an external contribution: For the authors please simply state EasyRPG Team.

Installation

For running homebrew on the WiiU you need the Aroma environment. We do not support any older environments such as Tiramisu.

We recommend that you put the wuhb file from our download section (under Continuous builds Other) into a subdirectory of /wiiu/apps on your SD card.

Place the games (valid games have a RPG_RT.ldb file) in directories right next to the wuhb file. Besides game folders we also support games inside ZIP archives and LZH archives. The LZH support is new and was added after the 0.8 release. LZH is popular for RPG Maker 2000/2003 games because the editor can create game bundles using this format.

The RTP (RPG Maker 2000/2003 Runtime Package), which is a collection of common assets used by games, is searched for in /wiiu/data/easyrpg-player/rtp/2000 and /2003.

The game ゆめにっき (Yume Nikki) running on the WiiU. To get rid of the black bars the widescreen hack available in the EasyRPG Player settings was enabled.

Technology

The porting was made quite easy because there is a port of SDL2 for the WiiU. SDL2 is an abstraction layer for things such as video, audio and game controllers. So you can run a program (with minor modifications) on any platform that has a port of SDL2.

The Wii port uses SDL1, but there is now an SDL2 port for the Wii. We already played around with and the results were really promising. There will probably soon be an improved Wii port with much better image quality and more features.

Performance issues resolved

For the WiiU port we noticed that it has awful loading times. This is a longstanding problem we have in many of our homebrew ports. The good news: We finally fixed it. We do our own caching now when doing file IO (input/output) on the homebrew platforms. This means the IO performance was also improved on 3DS, Wii, PS Vita and the Switch.

Known issues

The WiiU crashes when launching Yume2kki (ゆめ2っき) from a ZIP archive. We have no idea why that happens and the game works fine when extracted. Note that the game is more than 2 GB in size by now. If you want to play it, attach the WiU’s SD card to your PC and transfer it this way. Sending it via FTP takes several hours!

Splash screen shown on the WiiU gamepad when starting EasyRPG Player. It shows various characters from our OpenRTP project (assets by VictorSena (CC-BY), splash created by Jetrotal)

Reporting bugs

We provide official support for this port. If you think you found a bug please also check the official versions (e.g. in the continuous build of Windows or Linux). Afterwards please report an issue and state whether the bug is WiiU exclusive or a general EasyRPG Player bug.

When can we expect a new EasyRPG Player release?

The last official release of EasyRPG Player was in April 2023. The Player is still under active development, we just have not prepared any official release since then. To enjoy all the new features added since then, you can use our continuous build. The blog post for the new release is currently being prepared. Depending on our free time the release will happen in December or in January but hopefully not later…

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)

EasyRPG Player 0.7.0 “Sword”

After more than one year we are finally reporting back with a new release. This was a special year for all of us. Though it was not only the pandemic holding the release back. Instead the main issue was: Many of the new features / enhancements were under development for months and have been gradually integrated in our main code base. Therefore, the Player was quite unstable at times and making a new release was simply not feasible. We are only a small team of developers, so it was easier to wait until everything complicated was finished and then we could test and eliminate the last bugs. Now all bugs are removed (hopefully) and we can release.

Guess you want to know what is new? The major enhancements are:

  • The RPG_RT patch Ineluki’s Key Patch is now supported
  • Many of you asked us for Maniac Patch support. This is another major patch released a few years ago. While we do not plan to support the entire patch we decided to implement selected features.
  • MIDI playback was significantly improved and games that use MIDI Ticks for timing work perfectly now
  • The movement system (Move routes) was completely rewritten. This solved most of the remaining bugs in our map interpreter.
  • The RPG Maker 2003 battle system is now almost feature complete and we verified that all algorithms behave properly
  • All file operations go now through a Virtual Filesystem (VFS) layer. This gives us much more flexibility, e.g. it is now possible to launch games that are inside of ZIP archives.
  • We invented a new way to translate games. See this article for more information.

One feature that did not make the cut for 0.7 is a settings scene and input remapping for game controllers. The code for the configuration dialog and for managing the config file is still missing. Expect this feature in 0.7.1.

If you ignore unofficial RPG_RT patches one can say that our work is finished by 99%. The major missing features are some item animations in battle, the dungeon generator and movie playback (and the last one is unlikely because all games use different video codecs, making this a mess). Well, … and of course the never-ending amount of edge-cases we missed. :)

Why Codename Sword? Because item animations in the RPG Maker 2003 battle system was one of the longest standing issues and nobody wanted to implement them. But a fearless new developer joined and implemented them for us.

Sorry to the developers if one of your contributions is not mentioned here. In this release were 160 issues closed and 260 pull requests merged, making it very hard to mention everything.

Crash fixes

The Player crashed when an enemy killed themselves due to a reflected spell in battle. (#2394)

Yume2kki (ゆめ2っき) sometimes uses an Instant Scroll feature by using a patched Pan Screen event command with a very high speed number. This crashed on certain Android devices due to a divide by 0. The Yume2kki developers really love abusing undefined RPG_RT behaviours. We already fixed so many of them over the last years…

Regressions fixed

When using a Speicherstein item (saves the game) in Vampires Dawn 2 an endless loop of save dialogs occurred, because the save count was not updated anymore. (#2450)

When using a healing spell in Vampires Dawn 2, it was impossible to tell which actor is currently targeted. (#2479)

Audio glitches happened when a sound effect was playing without an active background music. (#2427, #2501)

When the state Death is configured as Ends after Battle, the state was removed but the HP were not increased to 1 anymore. Resulting in an instant game over still. (#2521)

Patch support

RPG_RT is infamously known for the huge amount of custom patches applied to it in order to get custom functionality.

EasyRPG Player cannot support all of them because many are game specific or launch other programs on Windows but we add support for the most common ones such as the Pic Pointer Patch.

Ineluki’s Key Patch

In 0.7 we added support for a popular patch in the German community: Ineluki’s Key Patch: This patch is a replacement for Harmony.dll (the sound engine used by RPG Maker 2000/2003) that allows running scripts by “playing” music and reading the return values through the GetMidiTicks function. The major additions are full keyboard and mouse support. (#1181)

Harvest Moon – A new Life and likely other games invoke a program called LS.dat through Ineluki’s Key Patch. This program puts a script in the Sound directory that contains the current save count. The games use this in custom title scene to decide whether load shall be displayed. This functionality is now emulated. (#1367)

Games that use the mouse like Jumping cubes are playable now but for new games better use the mouse functionality of Maniac Patch because it has a better integration through event commands.

DynRPG

Even more complex than Inelukis Patch is a plugin system by Cherry called DynRPG. DynRPG provides a C++ API for accessing and modifying RPG_RT behavior.  This is highly RPG_RT specific and we will never be able to support this properly, but we added a parser for DynRPG commands. This means we can now reimplement the most popular plugins and integrate them directly in the Player but as of now the parser is useless for users, except for better error reporting that the game will likely not run properly. (#2282) Currently planned for a later release of Player are DynTextPlugin and DynPEC.

Maniac Patch

In August 2018 a user called BingShan from the Japanese community released the first version of Maniac Patch. This is the first major patch for the official English RPG Maker 2003 release and it extended certain event commands and added new commands. The patch was extended over the years and recently BingShan released an entire new RPG Maker 2003 compatible engine. We can already say that we do not intend to implement all of the patch functionality, especially not TPC (That is a built in script engine that generates event commands). We will cherry-pick the features based on demand.

Right now EasyRPG Player detects the patch and warns in most cases about unsupported commands. (#2486)

Though we started to implement some functionality:

  • The unarmed battle animation for enemies can now be configured (#2498)
  • The new event commands Load, Save, Get Save Info and Get Mouse Position are supported (#2623)
  • The Key Input Proc event command learned how to read from mouse buttons (#2623)
  • Show Picture, Move Picture and Erase Picture event commands were enhanced with Maniac Patch functionality. This includes features like Blend Mode and Flip (#2628)
  • Certain event commands gained the functionality, besides constant value and Variable, to read indirectly through a variable, e.g. when in Var 1 is a 5 the value in Variable number 5 is used. Because all event commands go through the same lookup logic here and Maniac Patch sometimes differ from it we cannot give a full list where it works.
Create interesting effects with the blend modes “Addition”, “Multiply” and “Overlay”

Launching protected games

Some games use patched files to ensure that it is not easily possible to view them in the editor.

The most simple protection we defeat since a decade is replacing the header of the files, e.g. instead of LcfDataBase the LDB uses a custom string such as EasyGameABC.

More sophisticated is changing all file extensions. Laxius Power e.g. changes:

  • RPG_RT.ldb to RPG_RT.set
  • RPG_RT.lmt to RPG_RT.lxb
  • MapXXXX.lmu to MapXXXX.ont

This protection is now defeated by EasyRPG Player and the game launches: The LDB and the LMT is determined based on the size (the database is larger) and the maps based on the Map-prefix. (#1920, #2271)

No challenge for EasyRPG Player anymore: The extensions of Laxius Power

Sometimes you will encounter games that only consist of a single RPG_RT.exe: These are usually protected by Molebox or Enigma. EasyRPG Player is unable to run them directly but there are unpackers available in the internet.

Translating games

Games can be translated now. Please see our previous blog post and the linked guide in it for further information. (#797, #2287)

It is now possible to translate certain, until now untranslatable terms. These are implemented in terms of new database chunks. Unfortunately our editor is not ready yet so editing them requires a tool like lcf2xml. (#2362, #2473). Also see the related liblcf commits. (#414, #419)

The now translatable terms include:

  • Status Scene: Name, Class, Title, Condition, Front, Back, Confirm, Redo
  • In RPG Maker 2003 battle the messages displayed when monsters to Double Attack, Defend, Observe, Charge, Self-Destruct and Escape

Support for games from ZIP archives (VFS) (#2189, #2277, #2460, #2471)

In 0.7 we replaced all chunks of code that were responsible for reading files with an abstraction layer called VFS (Virtual Filesystem). We wanted to do this since years and it was a huge amount of work.

Basically this works through Filesystem classes that offer functions like File exists, Open & Read file or List directory and all Input/Output goes through this abstraction layer.

In 0.7 their is one new feature powered by VFS which also proofs that it works: The Player can now launch games directly from ZIP archives! Only archives with compression method Store or Deflate (not Deflate64) are supported. When you use this feature the savegame is put in a folder next to the ZIP archive. You can either launch them through our Game Browser (who learned to navigate into subdirectories by now) or by providing them as --project-path on the command line. As for games the encoding of the ZIP archive is auto-detected, so if you are unable to extract a ZIP on Windows: Try launching it through EasyRPG Player instead. (#1085, #2562)

The main motivation for this change however was supporting platforms where normal input/output functions by the standard library are unusable. This affects Windows Store Apps (UWP) where the security model forbids normal file access outside of the app directory and as of November 2021 also Android: All updated apps must use the Storage Access Framework (SAF), this also enforces such security checks.

By now UWP or SAF are not supported by us but our VFS code makes it very easy for us to hook them in later.

Also we are asked alot about offering RPG Maker games directly in the Play store: We are very close to supporting this use case (Game files directly in the APK and launching them without using the Game browser). Please wait for our announcement!

Audio

A new Audio system for MIDI (#2250, #2302)

MIDI is not like your typical audio format: Contrary to WAV or MP3 that encode a waveform, MIDI files are event based: They contain which instruments and notes are played. This also means that they sound different depending on the library used. Most of you are used to Windows MIDI (Roland General MIDI). Additionally RPG Maker 2000/2003 has special features for MIDI files:

  • Pitch (playback speed) changes
  • Volume changes
  • Loop Event (Control Change with Event 111)
  • Obtaining the current playback position (MIDI Ticks)

The first two features work by injecting MIDI events and for the Loop event case to send MIDI events from the start of the loop again.

Until recently we used SDL Mixer on Windows and macOS for this and on all other platforms WildMidi or FmMidi. SDL Mixer ensured that we sound like RPG_RT by using the native API on Windows. Except for FmMidi, which is not very popular among users because it sounds “wrong” to them, none of these libraries allows injecting of events meaning that we were unable to implement the harmony.dll (The audio engine of RPG_RT) behaviour.

But with 0.7 this is finally solved! How does it work: Almost all MIDI libraries (except WildMidi, we will talk about this alter) support processing of external events and then converting them to audio.

For this we use the FmMidi sequencer to play all MIDI files. FmMidi is split into two parts: A sequencer that processes MIDI events and a synthesizer that converts these events into audio. Note that we use the sequencer here, so the component that handles events.

We forward these events to the native MIDI interface on Windows, Linux and macOS or to our libraries FluidSynth (to play SF2 files / soundfonts) and FmMidi (for the fans of electronical sounding music, it sounds like a Yamaha YM2608). Additionally for volume or pitch control we inject additional events (that we traced by observing harmony.dll). In short: This works excellent and all our MIDI problems are solved… except WildMidi.

WildMidi is a “fire-and-forget” library: You pass the MIDI file and it plays it. No way to control the behaviour. To ensure that everything still works we count how many samples WildMidi must have played by now relative to the MIDI tempo and this way we still got MIDI ticks and looping to work. It feels like a giant hack but it is not stupid when it works. Unfortunately getting the Pitch right is impossible, this will still sound incorrect.

Why so many MIDI libraries? Well, MIDI are special: Everybody likes them different. Some like the Windows default MIDI (known from RPG_RT), some have a favourite soundfont (FluidSynth), others want GUS patches (Wildmidi) and others love the electronical version offered by FmMidi.

Problems solved by our new MIDI interface:

  • Embric of Wulfhammer’s Castle: Sound effect repeating incorrectly (MIDI loop point) (#834)
  • MIDI synth restarts every time the music changes, giving a short lag on some systems (#951)
  • FluidSynth/FluidLite MIDI playback support (SF2/SF3 files) (#1322)
  • Improve consistency in MIDI sound (#1434)
  • Helen’s Mysterious Castle had inaccurate BGM playback (#1556, #2587)
  • Return of Touhou Mother: MIDI-Tick Regression (#1733). This game uses a MIDI-tick based combo system meaning this never worked correctly anywhere except when using FmMidi.
  • Tempo changes the Tone of MIDI songs (#2029). This bug is not solvable in WildMidi but it works for all other libraries.
  • Dの冒険Ⅶ: Hang after investigating the grave (#2106). Needed MIDI tick support.
  • Implement Ticks for: libsndfile, FmMidi and Wildmidi (#2118)
  • Return of Touhou Mother softlocked in the Battle System on Android (#2241)
  • FmMidi: naive harmony-like loop support (#2245)
  • Improve MIDI playback accuracy (#2478)
  • RTP Shop 3.mid plays noisy (#2588)

But all this was at a cost: Before our MIDI fix the vending machine in the Bathhouse of Yume2kki (ゆめ2っき) only gave you tasty chocolate milk. Now you can also get boring whole milk (3.5% fat) and skimmed milk (1.5% fat) besides tasty chocolate milk. How sad!

We are not completely finished here: We plan to offer an interface to configure MIDI in 0.7.1. The soundfont used by FluidSynth is not configurable right now. Currently a easyrpg.soundfont in the game directory is used.

More Audio improvements

Because RPG_RT uses DirectSound it uses a logarithmic volume scale instead of a linear volume scale. This means until now all sound effects and most music were played too loud compared to RPG_RT. This is now fixed.(#2236, #2551)

For certain platforms we used a custom implementation to play WAV files because libsndfile was too slow on them. Our custom implementation was severely limited and we finally replaced it with dr_wav. dr_wav is a single-file-library that can be directly embedded and it supports all relevant WAV formats. dr_wav is now the default for all platforms. The only issue we found is that dr_wav crashes when playing certain sound effects on the Wii but we were able to solve this. (#2571)

The quasi-standard for looping in OGG and OPUS files are the tags LOOPSTART and LOOPEND or how RPG Maker VX calls them: LOOPSTART and LOOPLENGTH. After implementing looping for MIDI we knew about all technical difficulties, making it easy for us to add this functionality. (#2618)

Event/Interpreter

The vehicle is not rendered in the custom battle of Dragon Fantasy II anymore. Fix unclear, but it works. (#2235)

The vehicle is disembarked when a Teleport or Escape skill is invoked. (#2316)

Wadanohara does not display warnings about invalid equipment anymore on startup. The invalid equipment is now removed silently. (#2506)

Multiple bugfixes for Key Input Proc:

  • In the legacy Steam version (not the Unity port) of Ara Fell crouching with Shift was not working because we forgot to enable the “Engine is updated” flag when enabling the features for RPG Maker 2003 English release. This update flag is used in Key Input for certain keys. (#2531)
  • In Zelda LA it was impossible to input a name because the direction keys were not working. This game uses the RPG Maker 2003 translation by RPG advocate. Such old versions only supported “All Directions” for Key Input. This is now properly handled. (#2546)

Movement / Move Routes (#2208)

Another huge refactor was the behavior in terms of character movement and move routes. This fixed again tons of edge cases where we were previously clueless what was going on here. We are even bug compatible now. You can decide if this is good or not but it is needed for perfect game compatibility.

  • Multiple accuracy improvements for Move Type Random (#1638)
  • Boarding an airship is a few frames slower when it has a move route assigned. Do not ask us why. (#1645)
  • Support for some funny vehicle glitches. (#1852)
  • When talking to a character in Saint Seiya -Il Mito- it disappeared. This was caused by incorrect handling of diagonal movement. (#2196)
  • Barrels did not roll in the Donkey Kong minigame available in Saint Seiya -Il Mito-: When changing between move routes that have exactly the same move commands the new move route continues at the exact same position instead of restarting. (#2197)
  • Incorrect handling of move routes when a switch disabled the route. (#2255)
  • A Change Graphic event will change the vehicle instead of the player when boarded. (#2286)

Battle

After refactoring most of the RPG Maker 2000 battle system, the RPG Maker 2003 battle system received the same treatment: Almost everything should work now, even the enemies attack you now while you navigate the menu (ATB / Active Time Battle). Some of us hate this, but it is how RPG Maker 2003 does it. (#2399)

This was again a fairly complex change so it is hard to write it down. Just try it and you will see what we are talking about.

This fixes the following issues:

  • Correct placement of battlers in their specific battle row. (#278)
  • The Row battle command is now implemented (#680). This command is pretty useless, it changes the defense multiplier of the actors and that’s it.
  • Minor battle bugs in OFF (#1277). The message Purification in progress was not displayed.
  • Final Tear 3: Multiple minor bugs in the battle system (#1314). This game had multiple graphical issues, e.g. wrong background graphic and the battler placement was wrong.
  • New feature: The editor of RPG Maker 2003 English release allows specifying of negative E rate values but this was never implemented in RPG_RT. We added this feature (#1391)
  • Mother: Cognitive Dissonance (#1414). Multiple rendering issues and Dual Wield (using two weapons) was not supported (#1727).
  • Support for special battle types in RPG Maker 2003 (Surprise, Back, Pincer and Surround attack) (#1454)
All the great battle styles RPG Maker 2003 offers
  • The battle animations in Alter A.I.L.A. Genesis work  (#1496)
  • Assets are now flipped to ensure they always look at the hero/the enemy (#1564)
  • Death animations were rendered incorrectly (#1681)
  • The game Memory of Moshimo uses a modified database with a Monster called Turn End Processing (ターン終了処理) that has 0 HP and is used for scripting. This quirk is now supported. (#2153)
  • Legend of Tank: Fix softlock in the battle against Battleship Mikasa (戦艦三笠) (#2154)
  • The behavior when an actor receives a state that results in provoke is now correct (#2169)
  • Actors that are killed and revived in the same turn do not execute their battle action anymore (#2169)
  • Reflecting of spells is now properly implemented (#2251)
  • It is possible to alter the color of monsters. In some cases the calculation was incorrect. (#2266)
  • Flipped battle animations are now supported (#2310)
  • Many UI improvements to ensure we are pixel perfect when compared to RPG_RT (#2354, #2483)
  • The Battle start message is now supported (#2357)
  • Proper timing and wait frames between actions (#2357)
  • Support for ATB active mode (#2360)
  • The Change Monster HP event command has an option that decides whether the HP reduction can be lethal (#2370)
  • Monster sprites were not rendered anymore after revive (#2372)
  • Fix Skill and Item usability (#2380)
  • The runaway animation is now supported ( #2383)
  • When a battler receives a restriction such as sleep the current action is now cancelled. Before it was possible to sleep and revive the battler in the same turn and still doing an action. (#2385)
  • Enemies do not flash anymore when it is time for a turn but they have a no move restriction such as sleep. (#2388)
  • Support for simultaneous battle animations on enemies and actors (#2409)
  • Battlers were incorrectly positioned when the party was changed through an event command. (#2418)
  • The Gauge is not rendered as full anymore when the maximum SP value is 0. (Reported for Shyouzen 2, #2443)
  • Death animations do not loop anymore. (#2481)
  • Sprites are rendered at the correct position and support flipping. (#2482)
  • When highlighting an enemy in battle, up to five active states are displayed in the help box, until now we only displayed one. Ara Fell uses this a lot in boss battles. (#2487)
  • Flash and shake effects are now properly handled for battle animation sprites (#2505)
  • In Grimm’s Hollow the damage is decided based on the position of a swing meter you have to stop at the right moment. This was appearing even when no attack was executed. (#2535)
  • In battle RPG_RT is more tolerant than on the map: When an image is missing the battle will continue without showing the image. This is fixed now because it broke the final battle in Unterwegs in Düsterburg: The pictures were deleted and instead integrated into the backdrop (stuff like Left Hand, Right Hand, Main Part of the boss…). In our Player the missing pictures rendered as lots of checkerboards. (#2561)
  • The small battle system of RPG Maker 2003 is now supported (#2575)
This battle in Final Tear 3 looks perfect now
Character Battle Animation (CBA) (#1269, #2484)

Another feature of the RPG Maker 2003 battle system is Character Battle Animation or CBA. With CBA actors can swing swords and throw spears or boomerangs. Additionally an Afterimage can be configured (the previous movement frames are shown with increased transparency) and the attack behavior of weapons can be altered. CBA is fully supported, except for the following Ranged attacks: Boomerang (this is just visual) and Attack in Sequence (this means such attacks deal less damage). But we are happy that one of our longest standing issues is almost resolved.

Afterimage go brrrrrr
  • Dragon Ball Z: The Legend of Z: Wrong pose displayed for CBA skill animations (#1708)
  • Enemies in OFF did not charge at the heroes (#1277)
  • Afterimage not displayed in Final Fantasy: Blackmoon Prophecy (#2538)
  • This affected many, many more games but we did not track bugs for all of them
Algorithms

In short: The algorithms are now perfect or close to perfect.

  • RPG_RT Autobattle algorithm is now supported properly (#1586). Previously we used a very naive algorithm: Attack a random chosen monster with a normal attack but this broke many scripted battle systems that relied on Autobattle behaviour.
  • The Agility calculation for the attack order in RPG Maker 2003 was incorrect (Reported for King of Grayscale, #1820)
  • The enemy AI algorithm is now compatible with RPG_RT. Games that heavily really on a certain AI behaviour work now properly. (#1831)
  • Correct escape chance calculation (#2150)
  • Proper variance calculation for damage (#2157)
  • Correct hit rate calculation (#2320)
  • Support for the row command and the implications on the damage based on the row of the battler (#2321, #2322)
  • Support for negative attribute modifiers (#2329)
  • Fixes for skills that do Absorb when the target is killed by it (#2351)
  • Hidden enemies are not targeted anymore by skills that target the entire party (#2373)
  • When both ally and enemy have the same agility the enemy gets the turn first (#2382)

Savegames

In some cases the Player failed to correctly load picture and spritesheet data. (Reported for La Leyenda Heroen, #2262)

Close enough

When saving and loading in LunarLux the Player was not visible anymore. (#2419)

When saving on the Shogi Board map in Yume2kki (ゆめ2っき) and loading this save in RPG_RT the events looked glitched. (#2207) Note that saving here is only possible through the debug save functionality of EasyRPG Player.

Hero transparency was not saved or loaded properly. (#2224)

For better savegame compatibility the scene ID is now saved as part of the savegame. This value is not used at all by RPG_RT or the Player when loading. (#2298)

Scenes and Windows

The game data was not properly reset when returning to the title screen with F12. (#1524)

Lots of minor visual adjustments across scenes such as the menu to ensure we are pixel perfect in rendering. (#1617, #2216) Also all text offsets were checked and adjusted (#2264).

Window and Message timing were improved even further to match RPG_RT. This is too complex to fully explain it in a blog post, see the linked pull request for more information. (#2026)

We took the first steps for adding a configuration scene but it is still not in a state that is suitable for the user. (#2108, #2112)

The encoding detection (guessing how the filenames of a certain game are encoded to ensure it starts properly) was improved (#2641) and even supports now problematic games like the English translation of .flow (#2554). It still uses Japanese filenames but contains English strings, so the game was incorrectly detected as Western European and the assets failed to load.

In the debug scene it is now possible to invoke map and battle events (#2210) and the level of actors can be changed (#2645). Happy cheating ;)

RPG_RT supports animated down and up arrows on windows to indicate that the window can scroll. The debug scene got now left and right arrows to indicate that the pages are scrollable this way. (#2248)

When states were above 1000 (because of equipment) the rendering was incorrect: They must be clamped to 999. This also affected the shop scene: An equipment that resulted in 1050 was considered equal to equipment that resulted in 1040. (#2453)

The system graphic of the load scene is not replaced anymore right after loading a savegame. (#2456)

It is not possible anymore to buy more items than would fit in the inventory. (#2464)

The ExFont (Symbol font) of Grimm’s Hollow was incorrectly rendered. (#2512)

Much nicer symbols now

When the equipment is not changeable (fixed) the equipment scene does not display the other available equipment in the inventory anymore. (#2576)

When equipping an accessory in Monster World RPG everything else was unequipped. Even for non-weapons the two handed flag was considered. This is now fixed. (#2603)

The transparency of the message window was not perfect. (#2626)

Negative terrain damage is now supported. (#2632)

The menu cursor scrolling speed is now closer to RPG_RT. (#2634)

The window does now a smooth scrolling when the cursor scrolls the text in a window. (#2659)

In Test Play Mode the Abort Event hotkey (F10) is now supported. This hotkey cancels the current event and active move routes. Very useful if the game hangs due to a bug. The Screenshot hotkey was moved to F7. (#2660)

Pictures

When launching a battle through the debug scene pictures and weather effects were not shown. (#2120)

When a rotation is cancelled the rotation will continue until it reaches the normal position. Reported for Saint Seiya -Il Mito- (#2198)

Yume2kki (ゆめ2っき) is known for abusing RPG_RT implementation specific behaviour that is not exposed through the editor. This time they used Show Picture to display a picture with an empty filename. In this case RPG_RT will preserve the old image but overwrite all options with the new ones. This was used to achieve a transparency effect. Do not ask us why they did not use Move Picture for this like normal people do (#2523)

Android

On Android 11 accessing games is possible again. Though starting November 2021 Google requires the usage of a new API for file access (Storage Access Framework, SAF). To submit any further updates to the Play Store we must rewrite our app first. Very annoying… (#2415)

EasyRPG Player is now available on f-droid.org. A store providing only open source software. Note that updates on f-droid are not under our control meaning 0.7 will be released later. (#1222)

The support library was upgraded to AndroidX. This solves some visual issues in the game browser on newer versions of Android. (#2018)

When bundling a game with EasyRPG Player (so-called standalone mode) the audio was disabled after running the game once and there was no way to reenable it. Note that the standalone mode is experimental, please wait for an official announcement. (#2524)

Emscripten (EasyRPG Web Player)

The HTML shell file was updated to the latest release. (#804)

The format of index.json was updated to be more compact and it supports normalization of filenames. Depending on the operating system a file can appear to have the same characters but uses a different byte sequence. Normalization solves this issue. (#1729)

The Web Player does not freeze anymore when switching the tab. This was solved by updating SDL2 to the latest version. (#2228)

Basic touch input (Only Confirm and Cancel) was added (#2426).

The minification of the shell file was disabled because the result was invalid HTML. (#2446)

The character + is now URL encoded when it appears in filenames. When not encoded + is interpreted as a space and the files failed to download. (#2514)

RPG Maker 2003 English release, Maniac Patch and DynRPG are now automatically detected by the web player. This means spritesheets finally work without passing an engine parameter. The web player has a hard time with detections that involve scanning of the game directory because all files are downloaded on demand. (#2520, #2526)

libretro / RetroArch core

As a service for the community we offer now our own libretro cores for Windows and macOS. This includes continuous builds who will not be available on the libretro buildbot which means you will be able to profit from the latest developments (at your own risk). This will not replace the libretro buildbot, you will still be able to download 0.7.0 through the core updater on all supported platforms.

Some core options did not load because the configuration key contained spaces. (#2493)

The ending .easyrpg was added to the supported file extensions. You can put a file GAME_NAME.easyrpg in the game directory and have individual game options configured this way. Using RPG_RT.ldb did not work here because RetroArch maps configurations to filenames and they were the same for all games.

Consoles

Nintendo Switch

Unfortunately Nintendo messed up the filesystem driver making anything that contains e.g. umlauts or Japanese unable to be loaded. We cannot solve this but workaround it: Simply put the game in a ZIP archive and launch the ZIP through our game browser (see Support for games from ZIP archives) (#1747, #2205)

The most recent version of libnx is now supported (#2454, #2566)

Nintendo 3DS

When you do not need the numpad you can turn now the bottom screen off by touching a button. (#2617)

The new bottom screen of the 3DS
PlayStation Vita

VSync is now enabled by default. (#2507)

The on-screen numpad of our Switch port was ported over to the PS Vita. Now you can properly play Yume Nikki and other games. (#2635)

Other

Finally a solution for laptops without a numpad: Both numpad and the normal number keys work now in key input. Additionally +, -, *, and / are now also mapped to additional keys. Though we do not know any game that uses them. (#1121, #2567)

Some games use increased limits for hp, mp, atk, def, exp… These games are still not supported but we added custom chunks to the database to support them in the future. (#1375)

The recording format used for --record-input was significantly improved. Playing back the old format is still supported. (#2301)

The key for x10 fast forward is changed from CTRL-+ to G. (#2544)

The licenses of our fonts are now mentioned in the Readme file (#2580).

Terminal output is now colored. (#2608)

Even developers love eye candy :)

A new command line option --rtp-path was added for specifying an additional RTP path (#2448)

We added support for certain new database settings that could be useful in your next game. Unfortunately setting them is hard until our editor is finished. If you are curious what they are click the issue links. (liblcf #421, #2564)

For Developers

Do not forget to update liblcf to 0.7.

This is the last version supporting C++14. Right after this release we will move to C++17. The compiler support is good enough by now.

libfmt is a new required dependency that makes it much easier for us to fulfill all our text formatting needs. Every ancient version down to 5.0 will work. (#2181)

SDL2_mixer was removed and is not supported anymore because the API was too limited for our audio requirements.

libxmp (a recommended dependency for playing MOD/Tracker files) requires now 4.5.0 or newer because the previous versions did not support providing custom IO callback functions. (#2595)

For native MIDI playback on Linux (through a MIDI daemon) the recommended dependency ALSA/libasound is required.

For playing custom soundfonts (SF2) libfluidsynth is a new, recommended dependency.

Deprecation of Makefiles: Except for 3DS, Wii and Switch we build now all supported platforms using autotools or CMake. We will completely drop building through custom Makefiles with 0.7.1. We ask all maintainers using custom Makefiles to migrate to a supported buildsystem. Right now there are still some Makefiles e.g. for Amiga or Dingoo in the repository that are not maintained by us: These will be deleted before 0.7.1!

Building for Android is always a bit special because of Gradle. Instead of using the deprecated ndk-build, Gradle invokes now CMake making building much easier. (#621, #2475)

Further CMake improvements:

  • The minimum supported CMake version was increased to 3.10 (#2532)
  • The unit tests compile now when targeting Emscripten or macOS (#2303)
  • The bash completion scripts were not installed on Linux when using CMake. (#2396)
  • Multiple fixes for CMake to ensure the libretro core builds on all platforms. (#2400)

EasyRPG Player is now available on the snap store. This package is not maintained by us. Use at your own risk! (#2413)

liblcf (RPG Maker File parser)

Parsing LCF files is now much faster and takes less memory. This means games start faster and on devices with limited memory (handhelds, old smartphones, etc.) more games launch.

Game Database size Memory usage in 0.6.2.3 Optimized memory usage
HH3 16 MB 135.7 MB 68.5 MB
Hero’s Realm 27 MB 301.6 MB 143.3 MB
Violated Heroine 11 MB 75.9 MB 40.6 MB
Yume 2kki 1.4 MB 8.0 MB 4.8 MB

The database size is just for information and does not always correlate with the memory usage. The database is smaller because all data is stored in a compact way that is not efficient to read from when running the game. The largest amount of memory is consumed by battle and common events. As you can see we were able to (almost) half the memory usage. (#379, #390) More optimizations are planned to reduce the memory usage even further.

New features in C++17 and C++20 are std::string_view and std::span. std::string_view reduces the amount of copying required when using a string and span does the same for vectors and other types of containers. We implemented these classes for our compiler version (C++14) and this gives nice, small speedups everywhere. (#384)

lcf2xml, a tool to convert LCF binary files to XML and back was moved from our Tools repository to the liblcf repository. (#302)

All data can now be printed on the terminal for debug purposes. (#368)

When you modify liblcf code the whitespace configuration (tabs vs. spaces) is now correct because we added a .editorconfig file. (#376)

More Maniac Patch event commands and chunks were added. This is just for documentation or later use in Player and does not improve compatibility. (#381, #417, #432). Note that how we save flip and blend mode of pictures is incompatible with Maniac Patch because the patch recycled an unrelated chunk (bottom transparency) for this. We decided to implement this in a cleaner way. (#434)

A new feature called ForEachString was added that makes it possible to enumerate through all strings in the database. This is used by the translation feature. (#388)

Database and MapTree are not stored as global data anymore. This makes it possible now to load multiple database and map trees at once – useful for the editor. (#405)

Missing chunks for Character Battle Animation (CBA) were added. (#406, #424)

For Developers

The entire liblcf repository was restructured and everything moved into namespaces. E.g. instead of Actor the class is now called lcf::rpg::Actor. This also improves the error reporting because you can see directly where the error occured from. (#342, #361)

The GNU compiler extensions are enabled now if supported. These are required by certain ports such as AmigaOS. (#366)

Building with gcc5 works again. (#374)

Expat 2.2.10 and newer are now supported by the CMake build system (#385)

The supported versions of CMake are now 3.10 and newer (#422)

Using liblcf from CMake does not require pkg-config anymore. (#431)