# Riaslink Port — Android Template RPG Maker MV/MZ web dışa aktarımlarını (`www/` klasörü) saran, minimal bir Android WebView port'u. [Ludens](https://github.com/yoimerdr/ludens) projesinden yalnızca "port yeteneği" fikri esinlenmiştir; bu proje ayrı bir kod tabanıdır, Ludens'in koduna bağımlılığı yoktur (Apache 2.0 lisanslı Ludens'in kodu doğrudan kullanılmamıştır). ## Mimari Bu proje kasıtlı olarak küçük tutulmuştur: - **Kotlin Multiplatform yok** — sadece Android hedefleniyor. - **Dependency injection framework yok** — tek Activity, manuel wiring. - **Üçüncü parti WebView kütüphanesi yok** — `android.webkit.WebView` doğrudan kullanılıyor. ``` app/src/main/java/fun/riaslink/port/ ├── RiaslinkApplication.kt Application sınıfı (boş, kasıtlı) ├── GameActivity.kt Tek Activity: immersive mod, back-press yönetimi └── core/ ├── GameWebView.kt WebView kurulumu + WebViewAssetLoader └── RiaslinkJsBridge.kt JS→native köprü (sadece titreşim + çıkış) ``` `app/src/main/assets/www/` — buraya bir RPG Maker projesinin `www/` klasörü kopyalanır. `js/plugins/RIA_FPSCounter.js` ve `js/plugins/RIA_TavernMenu.js` oyunun kendi eklenti sistemine (`js/plugins.js` üzerinden) kaydolan, saf JavaScript RPG Maker eklentileridir — native Kotlin koduyla hiçbir bağı yoktur, herhangi bir RPG Maker projesine (Android portu olmadan, tarayıcıda bile) tek başına kurulabilirler. ## Native ↔ Web sözleşmesi Native taraf ile menü arasındaki tek bağlantı noktaları: 1. `window.RiaslinkNative.vibrate(ms)` / `.exitApp()` — menüden native'e. 2. `window.RIA_TavernMenu.handleBackPress()` — native'den menüye. Android geri tuşuna basıldığında `GameWebView.handleBackPress()` bunu çağırır; menü açıksa kapatır, değilse taverna temalı bir çıkış onayı gösterir. Bunların dışında native taraf menünün iç mantığına hiç karışmaz. ## Yapılandırma (`riaslink.build.properties`) `applicationId`, uygulama adı, versiyon gibi alanlar `build.gradle.kts`'e sabit yazılı değildir; proje kökündeki `riaslink.build.properties` dosyasından okunur. Bu dosya build'e özgüdür ve git'e eklenmez (`.gitignore`'a bakın). Manuel/lokal build için `riaslink.build.properties.example` dosyasını kopyalayıp doldurun: ```bash cp riaslink.build.properties.example riaslink.build.properties # değerleri düzenle ``` ## Manuel build ```bash ./gradlew assembleDebug # imzasız, hemen kurulup test edilebilir ./gradlew assembleRelease # R8 küçültme uygulanır, imzasızdır ``` APK çıktısı: `app/build/outputs/apk//` `release` build'i imzasız olduğu için cihaza doğrudan kurulamaz — kendi keystore'unla `apksigner` ile imzalaman gerekir. ## Kendi oyununu elle yerleştirme Hugging Face Space pipeline'ını kullanmadan, `www/` klasörünü elle de yerleştirebilirsin: 1. RPG Maker'da projeni web'e dışa aktar (Deploy Masterpiece). 2. Oluşan `www/` klasörünün içeriğini `app/src/main/assets/www/` üzerine kopyala (mevcut placeholder içeriğin üzerine yaz). 3. `RIA_FPSCounter.js` ve `RIA_TavernMenu.js` dosyalarını `app/src/main/assets/www/js/plugins/` altına kopyala (zaten template'te mevcutlarsa atlayabilirsin). 4. Kendi `js/plugins.js` dosyana şu girişleri ekle (RPG Maker editörünün Plugin Manager'ından da ekleyebilirsin): ```js $plugins.push( { "name": "RIA_FPSCounter", "status": true, "description": "", "parameters": { "defaultVisible": "false" } }, { "name": "RIA_TavernMenu", "status": true, "description": "", "parameters": { "accentEmberHex": "#e8a343" } } ); ``` ## Menüyü genişletme `RIA_TavernMenu.js`, gelecekteki eklentilerin kendi sekmelerini eklemesine izin veren bir `registerSection()` API'si sağlar: ```js window.RIA_TavernMenu.registerSection({ id: 'cheats', label: 'Hileler', render: function(container) { // container'ı DOM elemanlarıyla doldur } }); ``` Bu sayede örneğin ileride bir "cheat menu" eklentisi, `RIA_TavernMenu.js` dosyasının kendisine hiç dokunmadan sidebar'a yeni bir sekme ekleyebilir.