Table of Contents
Platform Abstraction System for Modders
The Remixed Dungeon project uses a sophisticated platform abstraction system that allows the game to run on multiple platforms (Android, Desktop, Web) and distribution channels (Google Play, F-Droid, ruStore, etc.) while sharing the majority of core game logic. Understanding this system is crucial for developing cross-platform mods.
Overview
The platform abstraction system separates platform-specific functionality from the core game code using:
- Interface-based abstraction - Common interfaces and base classes that define contracts for platform-specific functionality
- Class replacement - Different implementations of the same class for different platforms
- Build system integration - Platform-specific code inclusion at build time
Key Concepts for Modders
Market Separation
The game uses product flavors to support different markets:
- Google Play - Full analytics and crash reporting through Firebase
- F-Droid - No analytics, stub implementations to meet F-Droid requirements
- ruStore - Russian market specific features
- Desktop - No analytics, file-based storage
- Web - Browser-based functionality
EventCollector Example
One of the most important examples for modders is the EventCollector class, which handles analytics and crash reporting:
- Core Usage (in your mod code):
import com.nyrds.platform.EventCollector; // Used throughout your mod EventCollector.logEvent("mod_started"); EventCollector.logException(e);
- Market-Specific Implementations:
src/googlePlay/java/com/nyrds/platform/EventCollector.java- Full Firebase implementationsrc/fdroid/java/com/nyrds/platform/EventCollector.java- Empty stub implementationsrc/ruStore/java/com/nyrds/platform/EventCollector.java- Minimal logging implementationsrc/libgdx/java/com/nyrds/platform/EventCollector.java- Desktop implementation
The build system automatically selects the correct implementation based on the selected flavor.
Preferences System
The preferences system is another important abstraction:
- Android - Uses encrypted SharedPreferences
- Desktop - Uses HJSON file-based storage
- Web - Uses browser localStorage
Creating Platform-Aware Mods
When creating mods that need platform-specific features:
1. Use Platform Abstractions
Always use the existing platform abstraction classes rather than platform-specific APIs directly:
// Good - uses platform abstraction import com.nyrds.platform.storage.Preferences; Preferences.INSTANCE.put("music_volume", 0.8); float volume = Preferences.INSTANCE.getFloat("music_volume", 1.0f); // Avoid - platform-specific APIs SharedPreferences prefs = context.getSharedPreferences(...); // Android-only
2. Check Platform Capabilities
For complex platform-specific functionality, you can check which platform you're on:
import com.nyrds.platform.PlatformSupport; if(PlatformSupport.isAndroid()) { // Android-specific code } else if(PlatformSupport.isDesktop()) { // Desktop-specific code }
3. Add Platform-Specific Implementations
If your mod needs platform-specific functionality, create the abstraction in your mod the same way the main game does:
1. Define the interface or abstract class in your shared code 2. Implement platform-specific versions in respective flavor directories 3. Use the same fully-qualified class name for all implementations
Cross-Platform Testing
When developing mods, test on multiple platforms if possible, particularly:
- Android Google Play - Full feature set
- Android F-Droid - No analytics, may have different feature restrictions
- Desktop - Different storage and input methods
Common Platform Abstractions
Storage
- Preferences - Key-value storage
- FileSystem - File operations with SAF support on Android
Audio
- MusicManager - Background music
- Sample - Sound effects
Analytics
- EventCollector - Logging events and exceptions
Input
- Touchscreen - Touch and mouse input abstraction
- Keys - Keyboard input abstraction
Best Practices for Modders
- Always use the existing platform abstraction classes
- Test your mod on different platform flavors when possible
- Use stub implementations in F-Droid flavor to comply with privacy requirements
- Follow the package structure used by the main game
- Don't make assumptions about platform-specific behavior
Understanding the platform abstraction system will help you create mods that work across all platforms and distribution channels where Remixed Dungeon is available.
