Neden bugüne kadar yapılmamıştı?
- 35 yıl önce çıkan point-and-click macera serisi The Legend of Kyrandia. Seride yalnızca ikinci oyun Hand of Fate Koreceye çevrilmemişti
- ScummVM’de uygulanmış motorlar arasında Lucas’ın SCUMM’u ya da Sierra’nın SCI’si için epey hayran çevirisi varken, Westwood’un Kyra motorunda hayran çevirisi yapılmış oyun çok az
- Kendine özgü ikili biçim, yalnızca 1 byte dikkate alan font işleme ve gerekli fontların eksik olması
- Koreceleştirme için basitçe metni çıkarıp çevirmek yetmiyor; ScummVM’in Kyra motorundaki metin işleme kodlarının da değiştirilmesi gerekiyor
Çeviri
- Çeviri kısmı başlı başına çok zor değildi; çıkarılan betikleri bir LLM’e verip çevirdim
- Oyunun tonunu korumak için yalnızca basit bir prompt girdim ve şimdilik büyük bir sorun görünmüyor
- Kelime oyunları ve dil şakaları gibi ince nüanslar ise pek iyi çevrilemiyor gibi görünüyor
Tersine mühendislik
- Westwood’un kendine özgü oyun biçimleri: PAK (paket), EMC (sahne betiği), DLG (diyalog), ENG (UI metni)
- Her biçimi tersine mühendislikle çözüp Python araçları yaptım
- EMC -> KMC, DLG -> DLK, ENG -> KOR olarak çevirip oluşturduktan sonra OTHER.PAK içine kaydettim
- ScummVM kodunu değiştirerek hayran çevirilerinde çevrilmiş dosyaların OTHER.PAK içinden yüklenmesini sağladım
- Dış bağımlılık olmadan sadece
$ python tools/build_korean.py komutuyla her şey derleniyor, .zip dosyası oluşuyor ve bunu orijinal oyunun üstüne kopyalamak yeterli oluyor
Font
- Temel olarak Korece font yoktu, bu yüzden bulmam gerekiyordu
- Kore’de resmi olarak yayımlanan klasik oyun The Dig içinde Korece font vardı; önceden edinmiş olduğum bir kopya vardı
- Font yapısı biraz farklıydı, bu yüzden başlığını kaldırdım
- ScummVM’e Korece font renderer eklendi
- Neyse ki Çince hayran çevirileri için yapılmış font sisteminde bitmap yükleme, 1bpp rendering, dış çizgi işleme ve 1 byte + 2 byte birleştirme (
MultiSubsetFont) zaten vardı
- Kyrandia 1 içinde bulunan Korece birleşik font sistemi sayesinde 2 byte okuma mantığı da mevcuttu
- Sadece EUC-KR byte çiftlerini glyph indeksine dönüştüren mantığı ekledim
- FM-Towns sürümünde Japonca font vardı; bunu bir şekilde kullanmayı düşünüyordum ama sorun daha kolay çözüldü
Hatalarla savaş
- "gagagaga" hatası
- Uzun replikleri ekran genişliğine göre düzenleyen
preprocessString() fonksiyonu 1 byte font temel alınarak yazılmış
- 2 byte karakterin ortasına
\r girdiği için sonraki metnin tamamı bozulup "gagagaga" olarak görünüyordu
- Sahne betiği yüklenirken
_scriptLangExt başvurusu yapılan yerde hata oluşunca bunun yerine Japonca yükleniyordu
- Yine ilgili font olmadığı için ekranda "gagagaga" görünüyordu
- İki durumda da sorun,
getFontOffset içinde ilgili karakter bulunamazsa 0 dönmesinden kaynaklanıyordu; düzgün çalışması için bunu düzeltmek epey uğraştırdı
- Game data not found
- İkinci çalıştırmadan itibaren garip şekilde çöküyordu
- ScummVM oyun kapanırken dili Korece olarak kaydettiği için algılama yapılamıyordu
- Şimdilik algılamayı İngilizce olarak yapıp
KOREAN.FNT varsa bunu fanLang içine kaydedip işliyorum. Doğru yaklaşım da bu gibi görünüyor
- Chunk overread hatası
- Koreceleştirilmiş sahne betiği KMC’yi ScummVM
IFFParser ile ayrıştırırken Chunk overread hatası oluşuyordu
- IFF standardına göre KMC paketlenirken
form_size = file_size - 8 olarak kaydetmiştim, ama yalnızca Westwood form_size = file_size şeklinde kaydediyormuş
- Ofsetler tutmayınca hata oluşuyordu
ScummVM’e katkı yapmak
- Hayran çevirileri ScummVM tarafından resmî olarak
FLAGS_FAN(KO_KOR, EN_ANY) biçiminde destekleniyor
- İlki hayran çevirisi, ikincisi orijinal dil
- Motor başladıktan sonra
kyra_hof.cpp içinde geçiş yapılarak gerçek Korece modu desteklenir hale geldi ve çeviri dosyaları yüklenmeye başladı
- Dosya uzantısı sistemi dillere göre farklı; örneğin DOS’ta DLG dosyasında İngilizce
DLE, Almanca ise DLG
- FM Towns tabanlı çalışırken sonra DOS üzerinde de uğraşınca bir anda Almanca ortaya çıkıyordu
- KMC yoksa EMC kullanılsın diye ayarladım; böylece çeviri tamamlanmamış olsa bile çalışabiliyor
- PR gönderdim; düşündüğüm kadar tepki gelmedi, sadece commit’leri düzenledim
Yapay zekanın potansiyeli
- Aslında bunların büyük kısmını OpenCode ile Opus / Sonnet yaptı
- Benim yaptığım daha çok proje lideri gibi yönlendirmek, test etmek, debug etmek ve cesaret vermekti (yani prompt girmek)
- Gerekli malzemelerin hepsini toplamıştım ve istersem kendim de yapabilirdim, ama nereden başlayacağımı kestirmek muhtemelen gözümü korkuturdu
- Python ve C++ kodunu neredeyse bir satır bile yazmadım; bu gerçekten yapay zekayla birlikte mühendislik mi diye düşündürdü
- Bu sayede yapay zeka ile kod yazma konusunda biraz daha olumlu düşünmeye başladım
3 yorum
Vay be, oyun ekranından eski günlerin kokusu geliyor;;
Görünüşe göre The Secret of Monkey Island gibi bir oyun. Eğlenceli görünüyor.
Doğru. Rakip demek biraz zor ama, The Legend of Kyrandia da Korece yerelleştirme sayesinde kendince epey popülerdi. haha