====== 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 implementation * ''src/fdroid/java/com/nyrds/platform/EventCollector.java'' - Empty stub implementation * ''src/ruStore/java/com/nyrds/platform/EventCollector.java'' - Minimal logging implementation * ''src/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.