Ada proyek yang selesai dikerjakan, tetapi masih menyisakan sesuatu yang mengganjal. Bukan karena hasilnya sepenuhnya buruk, melainkan karena aku tahu masih ada banyak hal yang bisa diperbaiki.

Salah satunya adalah proyek penerjemahan Harvest Moon: Hero of Leaf Valley.

Pada 2019, aku mulai menerjemahkan game ini menggunakan tool yang saat itu tersedia. Prosesnya berjalan dengan segala keterbatasan yang ada. Hasil terjemahan tersebut akhirnya menjadi bagian dari perjalanan panjangku mengenal ROM hacking, pengolahan file game, dan penerjemahan game secara mandiri.

Namun, seiring berjalannya waktu, aku menyadari bahwa hasil tersebut belum memuaskan. Ada bagian yang dikerjakan terlalu asal-asalan, ada pilihan kata yang seharusnya bisa diperbaiki, dan ada kualitas yang belum sesuai dengan harapanku sendiri.

Karena itu, aku memutuskan untuk menerjemahkannya kembali dari awal dengan menggunakan teks bahasa Inggris sebagai acuan.

Kali ini, aku ingin mengerjakannya dengan lebih baik. Bukan hanya dari sisi terjemahan, tetapi juga dari sisi proses pengerjaan.

Salah satu hasil pengembangan yang paling aku banggakan dari proyek ini adalah SeedBin, sebuah tool yang kubuat untuk membantu mengolah file game Harvest Moon: Hero of Leaf Valley.

Mengapa membuat tool sendiri?

Salah satu hambatan dalam penerjemahan game bukanlah menerjemahkan kalimatnya, melainkan bagaimana cara mengambil teks dari game, mengolahnya, kemudian memasukkannya kembali tanpa merusak struktur file.

Tool lama yang kugunakan sebelumnya sudah usang untuk kebutuhan pengerjaan kali ini. Beberapa proses masih harus dilakukan satu per satu. File .bin perlu diekstrak terlebih dahulu, kemudian file .txb dikonversi menjadi .txt. Setelah diterjemahkan, prosesnya harus dilakukan kembali secara berurutan.

Jika jumlah file yang dikerjakan cukup banyak, pekerjaan semacam ini bisa menghabiskan waktu hanya untuk urusan teknis.

Aku kemudian mengembangkan tool baru yang menyatukan beberapa proses tersebut dalam satu program berbasis Python. Tujuannya bukan sekadar membuat proses lebih praktis, tetapi juga mengurangi pekerjaan berulang yang sebenarnya bisa diotomatisasi.

Dari situlah SeedBin berkembang menjadi tool dengan beberapa menu untuk pengolahan arsip, teks, dan gambar.

SeedBin dan fitur utamanya

SeedBin menyediakan delapan menu yang mencakup ekstraksi, konversi, dan pengemasan ulang file. Setiap menu menangani kebutuhan yang berbeda, tetapi beberapa di antaranya saling terhubung dalam satu alur kerja.

1. Ekstraksi dan pengemasan ulang resource.bin

Menu pertama digunakan untuk mengekstrak resource.bin. File-file di dalamnya dikeluarkan ke folder terpisah, sedangkan informasi struktur arsip disimpan dalam file pendamping .lkp.

File .lkp tersebut diperlukan ketika arsip akan dikemas kembali. Dengan demikian, proses ekstraksi tidak hanya menghasilkan kumpulan file, tetapi juga menyimpan informasi yang dibutuhkan untuk membangun ulang arsip.

Menu keenam menangani proses sebaliknya, yaitu mengemas kembali hasil ekstraksi menjadi file .bin baru.

File asli tetap perlu disimpan sebagai cadangan. Hasil pengemasan ulang sebaiknya diperiksa sebelum digunakan dalam game.

2. Ekstraksi teks dari event

Bagian ini menjadi salah satu fitur penting SeedBin.

Pada folder event/jp, file .bin dapat diekstrak, kemudian file .txb yang ditemukan di dalamnya dikonversi menjadi .txt. Kedua proses tersebut dapat dijalankan secara massal.

Setelah penerjemahan selesai, menu berikutnya mengonversi teks kembali menjadi .txb dan memasukkannya ke dalam arsip .bin baru.

Perbedaan utamanya dibandingkan tool lama adalah proses yang sebelumnya harus dijalankan secara terpisah kini dapat dirangkai dalam satu alur kerja. Pengguna tidak perlu mengulangi langkah ekstraksi dan konversi satu per satu untuk setiap file.

3. Pengolahan teks pada folder talk

SeedBin juga menyediakan alur khusus untuk file .txb di folder talk/jp.

Menu keempat mengekspor teks menjadi .txt, sedangkan menu kelima mengonversinya kembali menjadi .txb. Keduanya mendukung pemrosesan massal dengan mempertahankan struktur subfolder pada hasil konversi.

Pemisahan menu ini membuat pengolahan teks event dan talk lebih mudah dikelola. Keduanya sama-sama menggunakan format teks perantara, tetapi memiliki alur pengemasan yang berbeda.

4. Konversi gambar

Selain teks, SeedBin menyediakan konversi gambar antara format .g3t dan .png.

Gambar dapat diekspor menjadi PNG agar lebih mudah diperiksa atau diedit menggunakan aplikasi pengolah gambar. Setelah diedit, PNG dapat dikonversi kembali menjadi G3T.

Konversi PNG ke G3T yang tersedia menggunakan mode indexed 8-bit dengan palet 256 warna. Transparansi diperlakukan secara biner, sehingga piksel dengan tingkat alpha di bawah ambang yang ditentukan menjadi transparan.

Ada batasan yang perlu diperhatikan. Ukuran gambar yang tidak sesuai dengan pola penyusunan data tertentu dapat memengaruhi hasil konversi. Karena itu, hasil PNG yang sudah dikonversi kembali menjadi G3T tetap perlu diperiksa, bukan langsung dianggap kompatibel dengan game.

Fitur gambar juga memerlukan modul Pillow. Sementara itu, menu pengolahan arsip dan teks tidak bergantung pada modul tersebut.

Sedikit catatan tentang implementasi

Aku tidak bermaksud menjadikan artikel ini sebagai dokumentasi lengkap atau membahas seluruh isi kode SeedBin. Namun, ada beberapa bagian kecil yang menarik untuk dicatat karena menunjukkan pendekatan yang kugunakan.

Salah satunya adalah penggunaan tabel karakter FIN.

Tabel karakter sebagai bagian dari proses penerjemahan

SeedBin memerlukan file English.FIN untuk mengonversi teks antara bentuk yang dapat dibaca manusia dan kode karakter yang digunakan dalam file game.

Tabel yang kugunakan sekarang sama dengan tabel yang kugunakan pada 2019, ketika pertama kali menerjemahkan game ini menggunakan tool lama.

Artinya, meskipun tool-nya sudah berkembang, salah satu komponen penting dari proses penerjemahan tetap berasal dari pekerjaan sebelumnya.

Sebagai gambaran kecil, kode untuk mengambil karakter berdasarkan nomor kodenya cukup sederhana:

def char_for_code(self, code):
    if 0 <= code < self.num_chars:
        return self.chars[code]
    return None

Potongan tersebut hanya memperlihatkan salah satu bagian dari pembacaan tabel karakter. Proses konversi secara keseluruhan juga perlu menangani kode khusus, pergantian baris, dan karakter yang tidak tersedia dalam tabel.

SeedBin mencatat karakter yang tidak ditemukan agar masalah tersebut dapat diperiksa setelah proses konversi. Ini penting karena teks yang berhasil diproses belum tentu berarti seluruh karakter di dalamnya berhasil dipertahankan.

Pemrosesan massal dan pemeriksaan hasil

Fitur pemrosesan massal bukan hanya tentang menjalankan banyak file sekaligus. Aku juga ingin mengetahui ketika ada file yang gagal diproses atau ketika jumlah entri teks berubah.

Salah satu bagian kode yang digunakan untuk mencari file dengan ekstensi tertentu adalah:

for dirpath, _dirs, files in os.walk(root_dir):
    for fname in sorted(files):
        if not fname.lower().endswith(".txb"):
            continue

Ini hanyalah gambaran kecil dari proses pencarian file. Pengolahan sebenarnya juga mencakup pembacaan data, konversi, penanganan kesalahan, dan pencatatan hasil.

SeedBin menyediakan ringkasan peringatan untuk beberapa kondisi, termasuk perbedaan jumlah entri, kegagalan pemrosesan, serta karakter yang tidak tersedia pada tabel FIN.

Pemeriksaan tersebut tidak menjamin hasil terjemahan pasti berjalan dengan benar di dalam game. Namun, setidaknya ada informasi yang dapat digunakan untuk menemukan masalah sebelum file hasil dimasukkan kembali ke game.

Script pendukung di luar SeedBin

SeedBin bukan satu-satunya tool yang kugunakan selama proses penerjemahan ulang.

Ada pekerjaan lain yang membutuhkan script tersendiri, terutama ketika berhubungan dengan pencarian teks, pemeriksaan baris, dan pengemasan ulang file ISO PSP.

Salah satu script yang kugunakan adalah repack-iso.py.

Script ini menangani penyusunan kembali folder hasil ekstraksi ISO PSP menjadi file ISO baru. Selain menulis struktur ISO9660 dan menyalin data file, script tersebut juga memeriksa beberapa bagian hasil ISO setelah proses penulisan selesai.

Secara sederhana, alurnya adalah membaca struktur folder, menyiapkan informasi direktori, menulis data ke dalam ISO, lalu melakukan verifikasi terhadap hasilnya.

Potongan kecil berikut menunjukkan salah satu pemeriksaan yang dilakukan:

if pvd[1:6] != b"CD001":
    raise ValueError("PVD tidak valid")

Pemeriksaan ini berkaitan dengan identitas Primary Volume Descriptor pada ISO9660. Ini bukan satu-satunya pemeriksaan yang dilakukan script tersebut, tetapi cukup menggambarkan bahwa pengemasan ulang tidak berhenti setelah file selesai ditulis.

Script pencarian teks dan pemeriksaan baris juga memiliki peran tersendiri. SeedBin menangani pengolahan file pada tingkat arsip dan konversi format, sedangkan script pendukung membantu pekerjaan lain yang tidak secara khusus ditangani oleh SeedBin.

Dengan memisahkan tugas-tugas tersebut, aku bisa menggunakan alat yang sesuai dengan kebutuhan tanpa memaksakan semua fungsi masuk ke dalam satu program.

Dari tool lama menuju SeedBin

Salah satu perubahan terbesar dalam proses ini bukan hanya bertambahnya fitur, melainkan cara pekerjaan dilakukan.

Sebelumnya, proses ekstraksi dan konversi membutuhkan beberapa langkah terpisah. Sekarang, sejumlah langkah tersebut sudah dirangkai menjadi menu yang lebih praktis.

SeedBin juga dilengkapi dengan beberapa pengaman, seperti konfirmasi sebelum hasil tertentu ditimpa, penyimpanan pilihan terakhir, serta laporan peringatan setelah konversi.

Meski begitu, otomatisasi tidak berarti semua risiko hilang. File hasil tetap perlu diperiksa, terutama jika jumlah entri berubah, ada karakter yang dibuang, atau format gambar belum sepenuhnya terverifikasi.

Aku juga tidak ingin menyamakan keberhasilan sebuah script berjalan dengan keberhasilan modifikasi game. Keduanya merupakan hal yang berbeda. File dapat berhasil dikonversi, tetapi kompatibilitasnya tetap perlu dipastikan melalui pemeriksaan lanjutan dan pengujian di dalam game.

Bagi proyek ini, SeedBin adalah alat bantu untuk membuat pekerjaan lebih teratur dan mengurangi hambatan teknis, bukan pengganti proses pemeriksaan.

Catatan pribadi: tidak ingin mengulangi kesalahan yang sama

Ada alasan pribadi di balik semua pekerjaan ini.

Aku ingin memperbaiki hasil terjemahan yang pernah kubuat pada 2019. Saat itu, aku mengerjakannya dengan tool yang masih terbatas dan belum memiliki pengalaman sebanyak sekarang. Hasilnya mungkin sudah cukup untuk menyelesaikan sebuah proyek, tetapi setelah melihatnya kembali, aku merasa masih banyak hal yang seharusnya bisa dikerjakan dengan lebih baik.

Menerjemahkan ulang game ini menjadi kesempatan untuk memperbaiki bagian tersebut. Aku bisa meninjau kembali pilihan kata, memperhatikan konteks dialog, dan mengerjakan proses teknis dengan lebih terstruktur.

Namun, aku juga menyadari bahwa keterbatasan tool tidak bisa terus-menerus dijadikan alasan.

Jika proses yang berulang dapat diotomatisasi, aku bisa membuat alat untuk mengerjakannya. Jika ada masalah pada format file, aku bisa meneliti strukturnya dan mencoba mencari solusi. Jika hasilnya belum sesuai harapan, aku bisa memeriksanya kembali.

Itulah salah satu alasan SeedBin menjadi pencapaian yang cukup berarti bagiku. Tool ini bukan hanya kumpulan fungsi Python, melainkan hasil dari kebutuhan nyata selama pengerjaan proyek penerjemahan ulang.

Ada kepuasan tersendiri ketika sesuatu yang sebelumnya terasa merepotkan akhirnya bisa dikerjakan melalui alur yang lebih sederhana.

Penutup

SeedBin lahir dari kebutuhan untuk mengolah file Harvest Moon: Hero of Leaf Valley secara lebih praktis. Fitur ekstraksi arsip, konversi teks secara massal, pengemasan ulang, dan konversi gambar membuatnya menjadi salah satu alat utama dalam proses penerjemahan ulang ini.

Di sisi lain, script pendukung seperti repack-iso.py membantu menangani pekerjaan yang berada di luar cakupan SeedBin. Keduanya memiliki fungsi berbeda, tetapi sama-sama menjadi bagian dari proses yang lebih besar.

Bagiku, proyek ini bukan sekadar tentang menghasilkan terjemahan baru. Ada pekerjaan lama yang ingin kuperbaiki, ada pengetahuan teknis yang ingin kudokumentasikan, dan ada tool yang ingin kubuat sebagai bagian dari proses tersebut.

Dulu, aku menerjemahkan game ini dengan kemampuan dan alat yang kumiliki saat itu. Sekarang, aku punya kesempatan untuk mengerjakannya kembali dengan pendekatan yang lebih baik.

SeedBin menjadi salah satu bukti perkembangan itu.

Dan artikel ini kutulis sebagai catatan: tentang proses yang pernah kulalui, masalah yang kucoba selesaikan, serta alasan mengapa kali ini aku ingin mengerjakannya dengan lebih serius.