Leer en Español | Build Guide | Web Docs
Ludens is a Compose Multiplatform wrapper built in Kotlin to port RPG Maker MV/MZ games to mobile devices. It embeds your HTML5 export inside a native app and provides configurable mobile controls and settings.
- Optimized WebView integration for RPG Maker MV/MZ.
- On-screen controls (overlay):
- Virtual joystick.
- Configurable buttons (A, B, X, Y).
- Complete settings screen:
- System: Theme (Light/Dark/System), Language (System/English/Spanish).
- Tools: Mute Audio, Show FPS, Toggle WebGL.
- Controls: Enable/Disable, Opacity, Button Positions, Key Mapping.
- Actions: Configurable quick actions menu (Order, Enable/Disable).
- Easy app/build configuration from
ludens.properties. - Efficient asset management in
composeResources/files.
Note
This project does not include a built-in native save system. Save files are managed by RPG Maker inside WebView (LocalStorage/IndexedDB).
Warning
iOS build is not fully configured yet (currently template defaults). This guide focuses on Android.
Tip
Always validate on emulator or physical device. Some RPG Maker plugins may not behave correctly on mobile WebView.
- Android Studio Otter 2 Feature Drop (2025.2.2) or higher.
- JDK 17 or higher.
- RPG Maker MV/MZ project exported for web.
- Optional: enable
YDP_Ludens.jsfor extra compatibility/features in the client. - Get latest plugin and related plugins in rpgm-plugins.
- Recommendation: place it as the first plugin in your plugin manager.
- Compatibility: useful for older WebView font-loading issues.
- Important: verify mobile compatibility for all plugins used by your game.
- Optional: enable
Export from RPG Maker using Android / iOS (recommended). If unavailable, use Web Browsers.
Depending on MV/MZ version, you may get either a game folder containing www or only the www folder. In both cases, index.html is required.
Move the full www folder to:
composeApp/src/commonMain/composeResources/files
Warning
Case Sensitivity: Windows file system is case-insensitive (/Path/Example = /path/example), but Android and iOS use case-sensitive file systems. Ensure that all file references in your game's code (images, audio, data files) use exact matching names. If a file is named MyImage.png, you must reference it as MyImage.png, not myimage.png. This is a common source of silent failures on mobile.
Tip: You can use the plugin YDP_CrossAssets from the rpgm-plugins repository to automatically normalize file paths and avoid this issue.
Required structure:
files/
└── www/
├── audio/
├── img/
├── js/
├── ...
└── index.html
Edit ludens.properties:
# Unique application identifier
ludens.android.id=com.yourorganization.sample
# Version visible to users
ludens.android.version=1.0.0
# Internal integer version code
ludens.android.versionCode=1
# App name in settings
ludens.android.name=Game Name
# Launcher label
ludens.android.launcherName=Gamegradle.properties is still used for Gradle/Kotlin build options. Ludens app identity/settings are configured in ludens.properties.
For the full build flow with screenshots and release-signing details, see BUILD.md.
- Debug:
./gradlew assembleDebug- Output:
composeApp/build/outputs/apk/debug/
- Output:
- Release:
./gradlew assembleRelease- Create
keystore.propertiesfirst (seekeystore.properties.template). - Output:
composeApp/build/outputs/apk/release/
- Create
Coming soon. Current setup follows default Compose Multiplatform template configuration.
Contributions are welcome. For major changes, open an issue first.
- Fork the repository.
- Create your branch (
git checkout -b feature/AmazingFeature). - Commit your changes (
git commit -m 'Add some AmazingFeature'). - Push the branch (
git push origin feature/AmazingFeature). - Open a Pull Request.
Apache 2.0. See LICENSE.
If this project helps you, consider giving it a star.
