File size: 4,230 Bytes
d02ad4f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# 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/<debug|release>/`

`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.