CATATAN
Riset Penggantian Label Nama pada Summon Night: Sword Craft Story 2 (GBA)
Daftar isi

Ringkasan Eksekutif
Modifikasi label nama karakter “Edgar” menjadi “Nan” dan “Dinah” menjadi “Yui” pada textbox dialog Summon Night: Sword Craft Story 2 (versi terjemahan Bahasa Indonesia) berhasil dilakukan menggunakan perangkat Android murni. Analisis menunjukkan bahwa label nama tersebut bukan berupa teks standar yang diatur lewat tabel karakter, melainkan data grafis sprite mentah berukuran 64x16 piksel yang tersimpan langsung di dalam ROM. Proses identifikasi dan penyisipan ulang dilakukan melalui analisis save state emulator Linkboy serta otomatisasi script Python di lingkungan Termux.
Latar Belakang dan Permasalahan
Dalam pelokalan game ini, nama “Edgar” dan “Dinah” (bawaan saat pembuatan karakter pemain dan guardian beast) perlu disesuaikan menjadi “Nan” dan “Yui”. Upaya penggantian string teks secara langsung di ROM tidak mengubah tampilan visual pada textbox, yang mengindikasikan bahwa label tersebut berupa aset grafis (tile).
Kendala utama adalah keterbatasan perangkat, di mana seluruh pengerjaan dilakukan di ponsel Android tanpa dukungan perangkat debugging tingkat lanjut, penampil VRAM, atau tile viewer seperti pada emulator PC.
Alat dan Bahan
Seluruh proses pengembangan dan modifikasi dijalankan menggunakan perangkat Android dengan toolchain berikut:
-
Lingkungan Eksekusi: Termux, Python, pustaka Pillow.
-
Emulator: Linkboy (berkas save state berformat
.sst, yang memuat salinan memoristatedan tangkapan layar). -
Aset: ROM game terjemahan Bahasa Indonesia, serta save state referensi saat karakter berbicara (
edgar.sstdandinah.sst).
Ringkasan script pendukung yang digunakan:
| Script | Fungsi Utama |
|---|---|
gba_match.py |
Dekompresi LZ77 dan pencocokan pola tile. |
gba_sst.py |
Pembacaan berkas .sst untuk melacak tile aktif di memori. |
gba_vram.py |
Pencarian rentang VRAM secara byte-by-byte pada ROM. |
gba_label.py |
Modul utama untuk locate, show, dan patch label nama. |
Metodologi
Karena ketiadaan debugger visual secara langsung, analisis dilakukan melalui pemanfaatan save state emulator yang merekam data VRAM terdekompresi:
-
Analisis Memori (Save State): Berkas
.sstdiekstrak untuk menemukan struktur VRAM (berawal pada offset0x47FF8). -
Pemetaan Sprite (OAM): Membaca tabel OAM untuk mendeteksi koordinat sprite label pada posisi vertikal y=88.
-
Korelasi Visual: Mencocokkan piksel label pada tangkapan layar dengan blok tile VRAM untuk mempersempit area target ke rentang
0x12CE0–0x13080. -
Pencarian Offset ROM: Melacak byte unik dari rentang VRAM tersebut ke dalam ROM utama, yang terletak pada rentang
0xA23E0C–0xA2B70C.
Temuan Teknis
-
Format Aset: Setiap label nama merupakan aset grafis berukuran 64x16 piksel dengan kedalaman warna 4 bpp (bits per pixel), tersusun dari dua sprite 32x16 berurutan (4x2 tile per sprite, total 16 tile atau 512 byte).
-
Palet Warna Tile:
-
Indeks 0: Transparan (Latar belakang)
-
Indeks 1:
RGB(248, 248, 248)(Isi huruf) -
Indeks 2–4: Gradasi abu-abu (
192,160,128) untuk efek sorot tepi dalam -
Indeks 5:
RGB(80, 80, 80)(Garis tepi luar)
-
-
Struktur Huruf: Ketebalan isi huruf 2 piksel dengan garis tepi gelap 1 piksel; tinggi huruf kapital 12 baris dan huruf kecil 7 baris pada garis dasar yang seragam.
Implementasi Penggantian Label
Label baru dibentuk melalui penggabungan karakter yang sudah tersedia pada font asli (D, i, n, a, h, E, d, g, r) serta pembuatan karakter baru (N, Y, u) menggunakan fungsi generator script dengan pembuatan garis tepi otomatis.
Pengujian visual pada huruf “N” melalui beberapa iterasi ukuran (lebar 7, 9, hingga standar lebar 8 dengan tinggi yang dapat disesuaikan lewat opsi --nh) menghasilkan keterbacaan yang optimal pada textbox.
Panduan Penggunaan Script (gba_label.py)
Untuk mereplikasi atau mengulang proses modifikasi secara mandiri:
-
Letakkan ROM bersih, save state (
dinah.sst,edgar.sst), dan script dalam satu direktori kerja. -
Verifikasi lokasi label pada ROM:
python gba_label.py locate game.gba dinah.sst --label dinah python gba_label.py locate game.gba edgar.sst --label edgar -
Lakukan patching teks baru ke salinan ROM:
python gba_label.py patch game.gba edgar.sst --label edgar --text Nan --out game_baru.gba python gba_label.py patch game_baru.gba dinah.sst --label dinah --text Yui --out game_baru2.gba -
Jalankan berkas hasil patch (
game_baru2.gba) pada emulator untuk verifikasi visual. Gunakan argumen--at 0xOFFSETapabila melakukan patching berulang pada ROM yang sudah dimodifikasi.
Catatan dan Keterbatasan
Metode ini bergantung pada format save state emulator Linkboy dan struktur ROM spesifik yang digunakan. Batas maksimal lebar label adalah 64 piksel, dan karakter di luar set yang tersedia memerlukan penambahan definisi manual pada script.