Lost in Blue di Nintendo DS cukup menarik untuk diterjemahkan karena ceritanya yang menarik dan teksnya bisa dikelola tanpa harus membongkar sistem enkripsi terlebih dahulu. Dari pemeriksaan awal, teks ditemukan dalam berkas .lbt dan dapat diproses menggunakan tools Python. Alur ekstraksi serta penyisipan kembali berkasnya kurang lebih menyerupai cara kerja DSLazy di PC.

Catatan ini merangkum temuan yang sudah diamati, perkiraan yang masih perlu diuji, dan alur kerja yang digunakan untuk menyiapkan teks sebelum diterjemahkan.

Berkas teks dan encoding

Teks yang diperiksa tidak tampak dienkripsi. Salah satu berkas yang ditemukan adalah lv_01_msg_en.lbt, yang berisi teks bahasa Inggris untuk pesan atau dialog dalam game.

Encoding teks pada berkas tersebut adalah UTF-16 Little Endian (UTF-16LE). Agar lebih nyaman dibaca dan disunting dengan editor teks biasa, encoding-nya dapat dikonversi ke UTF-8.

Pergantian encoding ini tidak mengharuskan ekstensi berkas diganti. Berkas tetap menggunakan ekstensi .lbt; yang berubah hanya representasi encoding teksnya.

Ada satu hal yang perlu dibedakan: mengubah encoding bukan berarti mengubah struktur internal berkas. Saat teks selesai diterjemahkan, hasilnya perlu dikonversi kembali ke UTF-16LE sebelum berkas dimasukkan lagi ke ROM.

Contoh isi berkas setelah dikonversi

Berikut sebagian isi lv_01_msg_en.lbt setelah encoding-nya diubah menjadi UTF-8. Teks ini ditampilkan dalam blok kode agar tanda \n, tanda baca, dan spasi tetap terlihat apa adanya.

Where am I?
...the ship...
Is anyone else here?
... \nI'm hungry and thirsty... \nIs there any food around?
Hm? There's \nsomething on the ground
Press A Button to \npick up items
I wonder if there's \nsomething on the ground
Touch the screen to \ncheck the ground.
I wonder if it's ok to \neat this raw...
Press X Button and select \nBackpack menu to see items
There's water inside.
I wonder if this is edible...
I'm getting tired. \nI need to find a place to rest
If it's for a little bit, \nI think I could also sit \non the ground to rest.
Press X Button and select \nRest to rest for a while
It's getting dark... \nI should look for a place \nwhere I can rest and \nlook for people tomorrow
I want to cross the river \nbut it doesn't seem safe to \ndo that now...
I want to drink some water \nbut this water looks bad...
is there anything else \nI can drink?
!
It's a cave... \nI wonder \nwhat the inside is like
Maybe I can make \nsomething with this.
Looks good for firewood.
Hmm... \nThere's some fruit \nup on that tree. \nMaybe if I shake the tree...
Touch the screen while facing \nthe tree to check the tree.
Phew \nThat feels a little better
I hope that mushroom I \njust ate wasn't poisonous...
Oh \nThe river is calm today \nIt seems safe to go across

Contoh tersebut memperlihatkan bahwa satu entri dapat berisi beberapa bagian teks yang dipisahkan oleh \n. Karena itu, \n tidak boleh langsung dianggap sebagai pemisah antar-entri. Dalam proses penerjemahan, pemisah ini perlu dipertahankan sesuai fungsi aslinya.

Membaca pola dialog

Dari pola teks yang ditemukan, jenis dialog bisa diperkirakan melalui panjang kalimat, penggunaan \n, dan tanda baca. Salah satu pola yang menarik adalah kalimat pendek yang memiliki pemisah \n tanpa tanda baca tepat sebelum pemisah tersebut.

Pola seperti itu kemungkinan berasal dari bubble text, yaitu teks singkat yang muncul di atas karakter atau objek, bukan dialog yang ditampilkan dalam textbox biasa.

Contohnya:

Hm? There's \nsomething on the ground

Kalimat ini tetap masuk akal sebagai satu ucapan, tetapi bagian setelah \n dapat menjadi baris lanjutan dalam tampilan bubble text. Tanda tanya pada Hm? tidak berada tepat sebelum \n, sehingga contoh ini sesuai dengan pola yang dimaksud.

Pola tersebut berguna sebagai petunjuk saat memilah teks, tetapi bukan aturan mutlak. Sebaiknya identifikasi dikonfirmasi melalui tampilan dalam game apabila jenis dialognya berpengaruh terhadap batas panjang teks atau cara penerjemahannya.

Perbedaan yang perlu diperhatikan

  • Pemisah antar-entri: menandai berakhirnya satu entri dan dimulainya entri lain dalam berkas.
  • \n literal: dua karakter, yaitu garis miring terbalik dan huruf n, yang dapat digunakan game sebagai penanda baris baru.
  • Baris baru sebenarnya: karakter pemisah baris yang ada di dalam berkas teks.

Ketiganya tidak selalu sama. Pada contoh di atas, \n ditampilkan sebagai teks literal. Saat mengolah berkas dengan skrip, pastikan format aslinya tidak berubah secara tidak sengaja.

Perkiraan batas tampilan teks

Berdasarkan pengamatan awal, textbox dialog dapat menampilkan hingga tiga baris, sedangkan bubble text biasanya hanya menampilkan satu baris. Panjang teks diperkirakan sekitar 28 karakter per baris.

Angka 28 karakter tersebut masih merupakan perkiraan, bukan batas yang sudah dipastikan untuk semua dialog. Jumlah karakter saja belum tentu cukup untuk menentukan apakah teks akan muat, sebab karakter yang berbeda dapat memiliki lebar visual yang berbeda pula.

Contohnya, dua kalimat dengan jumlah karakter sama belum tentu membutuhkan ruang layar yang sama. Oleh karena itu, batas teks sebaiknya diperiksa berdasarkan tampilan sebenarnya, bukan hanya hitungan karakter.

Contoh berikut memiliki beberapa pemisah \n:

It's getting dark... \nI should look for a place \nwhere I can rest and \nlook for people tomorrow

Teks tersebut memuat empat bagian baris. Jika textbox normal hanya menampilkan tiga baris sekaligus, perlu diperhatikan bagaimana game menangani bagian keempat: apakah bagian itu muncul setelah dialog dilanjutkan atau menggunakan mekanisme tampilan lain. Pengamatan seperti ini membantu menentukan aturan pemenggalan teks terjemahan.

Spasi dan tanda baca

Spasi sebelum atau sesudah \n juga perlu diperhatikan. Misalnya:

Hm? There's \nsomething on the ground

Spasi setelah There's muncul sebelum penanda \n. Jangan menghapus, memindahkan, atau menambah spasi secara otomatis sebelum perilakunya dipahami. Perubahan kecil semacam ini dapat memengaruhi hasil tampilan atau membuat pola teks sulit dibandingkan dengan sumber aslinya.

Tools ekstraksi, UTF Convert, dan repacking

Proses ekstraksi, pack, dan repack menggunakan tools Python dengan alur kerja yang kurang lebih mirip DSLazy di PC. Fitur pack dan repack sudah tersedia dalam satu rangkaian tools, jadi tidak perlu memakai aplikasi terpisah hanya untuk memasukkan kembali berkas ke ROM.

Selain fungsi tersebut, aku menambahkan fitur UTF Convert untuk mengubah encoding berkas teks dari UTF-16LE ke UTF-8, lalu mengembalikannya ke UTF-16LE setelah penyuntingan selesai.

Ada alasan mengapa berkas bahasa Inggris dipisahkan terlebih dahulu sebelum konversi. Berkas teks bahasa lain tidak perlu ikut dikonversi jika yang sedang dikerjakan hanya terjemahan bahasa Inggris. Dengan pemisahan manual ini, UTF Convert dapat dijalankan hanya pada berkas yang memang akan disunting sehingga encoding berkas lain tetap tidak tersentuh.

Alur kerja penerjemahan

  1. Ekstrak ROM menggunakan tools Python.
  2. Pisahkan berkas teks bahasa Inggris yang akan diterjemahkan.
  3. Jalankan UTF Convert untuk mengubah encoding berkas terpilih dari UTF-16LE menjadi UTF-8.
  4. Sunting dan terjemahkan teks dengan tetap menjaga pemisah baris, tanda baca, spasi, serta kode kontrol.
  5. Konversi kembali ke UTF-16LE setelah penyuntingan selesai.
  6. Pack/repack berkas menggunakan tools yang sama.
  7. Uji ROM hasil modifikasi di emulator atau perangkat NDS untuk memeriksa tampilan dialog dan memastikan game berjalan sebagaimana mestinya.

Konversi encoding dan repacking adalah dua proses berbeda. UTF Convert menyiapkan teks agar mudah disunting, sedangkan pack/repack menangani pengembalian berkas ke dalam ROM. Hasil konversi yang tampak benar di editor belum otomatis menjamin teks akan tampil benar di dalam game.

Hal yang perlu diperiksa saat pengujian

Beberapa hal yang layak diperiksa setelah teks diterjemahkan:

  • Apakah teks masih terbaca dengan benar setelah dikonversi kembali ke UTF-16LE?
  • Apakah \n dan pemisah antar-entri tetap dipertahankan?
  • Apakah spasi dan tanda baca masih berada pada posisi yang sesuai?
  • Apakah teks muat dalam bubble text atau textbox?
  • Apakah semua berkas yang tidak diterjemahkan tetap menggunakan encoding aslinya?
  • Apakah ROM hasil repack dapat dijalankan tanpa masalah yang sebelumnya tidak muncul?

Pemeriksaan ini membantu membedakan kesalahan terjemahan, masalah panjang teks, perubahan encoding, dan masalah pada proses repacking.

Apakah metode ini bisa dipakai untuk Lost in Blue 2 dan 3?

Metode ini bisa dijadikan titik awal riset untuk Lost in Blue 2 dan Lost in Blue 3. Kesamaan seri membuat pendekatan yang sama layak dicoba, terutama untuk memeriksa berkas ROM, mencari teks, mengidentifikasi encoding, dan menguji proses ekstraksi serta penyisipan kembali.

Namun, belum ada dasar untuk menyatakan bahwa kedua sekuel tersebut menggunakan struktur .lbt, encoding, atau mekanisme repacking yang persis sama. Setiap game tetap perlu diperiksa secara terpisah sebelum alur kerja ini digunakan tanpa perubahan.

Penutup

Untuk Lost in Blue NDS, proses penerjemahan dapat dimulai dengan mengekstrak berkas .lbt, memisahkan teks bahasa Inggris, mengonversi encoding-nya ke UTF-8, lalu menyunting teks sebelum mengembalikannya ke UTF-16LE dan melakukan repacking.

Bagian yang paling membutuhkan pengujian lanjutan adalah batas tampilan teks—terutama perkiraan 28 karakter per baris—serta identifikasi bubble text berdasarkan pola \n. Setelah kedua hal tersebut dipastikan melalui gameplay, aturan penerjemahan dan pemeriksaan teks bisa dibuat lebih konsisten.