11 puan yazan colus001 2026-03-26 | 3 yorum | WhatsApp'ta paylaş

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

 
roxie 29 일 전

Vay be, oyun ekranından eski günlerin kokusu geliyor;;

 
computerphilosopher 2026-03-26

Görünüşe göre The Secret of Monkey Island gibi bir oyun. Eğlenceli görünüyor.

 
colus001 2026-03-26

Doğru. Rakip demek biraz zor ama, The Legend of Kyrandia da Korece yerelleştirme sayesinde kendince epey popülerdi. haha