3 puan yazan GN⁺ 2024-02-27 | 1 yorum | WhatsApp'ta paylaş
  • 1992 tarihli Wolfenstein 3D özgün kaynak kodu modern sistemlerle doğrudan uyumlu değil, ancak DosBox ve Borland C++ 3.1 ortamı yeniden oluşturulursa tekrar derlenebiliyor
  • Gereken bileşenler Wolfenstein 3D kaynak kodu, DosBox, Borland C++ 3.1 ve çalıştırma için shareware varlıkları olarak özetleniyor
  • Derleme sürecinde Borland C++ proje ayarlarının yanı sıra PATH, SIGNON.OBJ, GAMEPAL.OBJ yollarını elle düzeltmek gerekiyor
  • İlk çalıştırmada grafiklerin bozulmasının nedeni, motora derlenmiş grafik indeksleri ile varlık dosyalarının iç konumlarının birbirinden sapmış olması
  • Yeniden oluşturulmuş VGA varlıkları kopyalanıp DosBox’ın aspect correction özelliği açıldığında, 1992’deki CRT ekran oranına yakın bir biçimde çalıştırılabiliyor

1992 derleme ortamını yeniden oluşturma

  • Wolfenstein 3D’nin 1992 tarihli özgün kaynak kodunu, aradan 20 yıldan fazla geçmiş modern sistemlerde olduğu gibi kullanmak zor; ancak dönemin araçları ve çalışma ortamı eşleştirilirse derlenebiliyor
  • Gereken bileşenler şu dört şey
    • Wolfenstein 3D kaynak kodu
    • DosBox
    • Borland C++ 3.1
    • Wolfenstein 3D shareware varlıkları

DOS sürücüsü gibi kullanılacak dizini hazırlama

  • Yerelde DOS sürücüsü gibi kullanılacak 2 dizin oluşturulur
    • system/c
    • system/a
  • system/a içine Borland C++ 3.1 sıkıştırılmış dosyası alınır
  • system/c içine Wolfenstein 3D kaynak kodu ve VGA dosyaları alınır
  • Arşivler açıldıktan sonra dosya yerleşimi şöyle düzenlenir
    • system/a: BCPP31.zip
    • system/c: wolfsrc.zip, vgafiles.zip

DosBox’ta derleyici ve kaynak kodu kurma

  • DosBox çalıştırıldıktan sonra yerel klasörler DOS sürücüsü olarak bağlanır
    • ~/system/c, C: olarak bağlanır
    • ~/system/a, A: olarak bağlanır
  • A:\BCPP31 içinde install çalıştırılarak Borland C++ 3.1 kurulur
    • Varsayılan ayarlar korunur ve kurulum başlatılır
    • Microsoft Windows klasörünün bulunamadığına dair uyarı gerekli olmadığından Enter ile geçilir
  • C:\ içinde Wolfenstein 3D kaynak kurulum programı çalıştırılır ve varsayılan yol \WOLFSRC kullanılır

Borland C++ projesini derleme

  • C:\BORLANDC\BIN\BC.EXE ile Borland C++ 3.1 çalıştırılır
  • ..\..\WOLFSRC\WOLF3D.PRJ projesi açılır ve dizinler şöyle ayarlanır
    • Include Directories: C:\BORLANDC\INCLUDE
    • Library Directories: C:\BORLANDC\LIB
    • Output Directories: OBJ
    • Source Directories: C:\WOLFSRC
  • İlk derlemede Cannot find executable TASM hatası oluşur
    • Borland C++ kapatılır, PATH=C:\BORLANDC\BIN ayarlanır ve yeniden çalıştırılır
  • Sonraki derlemede bağlama aşamasında Unable to find OBJ file hatası oluşur
    • SIGNON.OBJ ve GAMEPAL.OBJ, projede yanlış biçimde C:\SOURCE\WOLF\ yolu olarak belirtilmiştir
    • İki öğe projeden silinir ve WOLFSRC\OBJ\SIGNON.OBJ, WOLFSRC\OBJ\GAMEPAL.OBJ olarak yeniden eklenir
  • Ardından Compile -> Build All çalıştırıldığında derleme başarılı olur

Çalıştırma varlıkları ve grafik bozulmasının nedeni

  • Derlenmiş çalıştırılabilir dosyayı çalıştırmak için Wolfenstein 3D shareware veya tam sürüm varlıkları gerekir
  • Shareware kurulumundan sonra derlenmiş .EXE oyun klasörüne kopyalanıp çalıştırıldığında ekran garip görünür
  • Bunun nedeni grafik dosyalarını oluşturan üretim hattı ile motorun varlıklara erişim biçimidir
    • Adrian Carmack ve Kevin Cloud grafik dosyalarını oluşturduktan sonra bunları IGRABed aracıyla paketledi
    • Çıktı, VGAHEAD.WL1, VGAGRAPH.WL1, VGADICT.WL1 adlı 3 dosya ve GRE.H, GRE.EQU adlı 2 dosyadan oluşur
  • VGAHEAD.WL1, VGAGRAPH.WL1 içindeki veri konumlarını gösteren bir indekstir
    • VGAGRAPH.WL1 içinde Huffman sıkıştırmalı veriler saklanır
    • VGADICT.WL1 içinde sıkıştırma açma için Huffman sözlüğü bulunur
  • GRE.H ve GRE.EQU, motorun varlıklara adlarıyla erişmesini sağlayan dosyalardır
    • Örneğin L_GUYPIC gibi mantıksal bir ad gerçek indeks değeriyle ilişkilendirilir
    • Motor, görüntü indeksleri hard-coded olacak şekilde derlenir
  • Wolfenstein 3D shareware yayımlandıktan sonra varlıklar ve kod tabanı Spears of Destiny ile birlikte değiştiği için, yeni derlenen oyunun indeksleri mevcut varlık dosyalarının konumlarıyla uyuşmaz hâle geldi

VGA varlıklarını değiştirme ve ekran oranı düzeltmesi

  • Çözüm, kaynak kodda yer alan .H, .EQU indeksleriyle uyumlu olacak şekilde yeniden oluşturulmuş VGA varlıklarını oyun klasörüne kopyalamaktır
  • Shareware varlıkları kullanılıyorsa dosya uzantıları .WL6 yerine .WL1 olacak şekilde değiştirilerek kopyalanmalıdır
    • VGADICT.WL6VGADICT.WL1
    • VGAGRAPH.WL6VGAGRAPH.WL1
    • VGAHEAD.WL6VGAHEAD.WL1
  • Değişimden sonra WOLF3D.EXE yeniden çalıştırıldığında oyun normal biçimde çalışır
  • DosBox’ın varsayılan ekranı, insanların 1992’de gördüğü özgün ekrandan farklıdır
    • VGA framebuffer 320x200’dür
    • CRT monitörler 4:3 ekran oranına sahip olduğundan çıktı dikey olarak uzamış görünürdü
  • DosBox ayarlarında [render] altındaki aspect=false, aspect=true olarak değiştirilirse ekran oranı düzeltmesi uygulanır
  • Ekran oranı düzeltmesi de uygulandığında Wolfenstein 3D, dönemin CRT görüntüleme biçimine yakın bir görünümle çalışır

1 yorum

 
GN⁺ 2024-02-27
Hacker News yorumları
  • Yazının sonunda adı geçen Wolfenstein 3D kitabını şiddetle tavsiye ederim. Teknik bir içerik olmasına rağmen kuru ya da sıkıcı değil; duvar dokusu ölçekleme için açılmış 64 fonksiyon, sprite’ları “yana doğru” saklama yöntemi, tuhaf ekran kartlarıyla uğraşma, baştan oyun gibi görünsün diye grafik modunu hack’leme gibi eski usul optimizasyonlardan bolca bahsediyor

    • Öneri için teşekkürler. Oyun motoruyla ilgili 431 sayfalık PDF’i az önce indirdim; içinde John Carmack’ın önsözü de var
    • Şu kitaptan mı bahsediyorsun? https://fabiensanglard.net/Game_Engine_Black_Book/index.php
      Henüz çıkmamış gibi görünüyor, doğru mu?
    • Tamamen katılıyorum. Böyle bir kitap olduğundan bile haberim yoktu ama hem Wolfenstein 3D hem de Doom kitaplarını gerçekten keyifle okudum. Quake/i586 kitabını yazmayacak olması üzücü
    • Devam niteliğindeki Doom kitabı da harika okunuyor
  • Retro sistemlerin güzel yanı, araçları bir araya getirdiğinizde yeniden derleyebilmeniz. Yakın zamanda eğlencesine eski Uplink oyununu tekrar derledim; gereken tek şey Visual Studio 6.0’dı ve geliştirme arşivinde derleme için gerekli tüm bağımlılıklar vardı
    Bağımlılıkları ayarlamak yaklaşık bir saat sürdü ama sonunda başardım ve oyun da düzgün çalıştı. Küçük bir hatayı da düzelttim, oraya buraya ufak iyileştirmeler ekledim. Günümüz yazılımlarına dokunmayı düşününce gerçekten delilik

    • Bu daha çok Linux paket yönetiminin karmakarışık olduğu durumlar için geçerli gibi. Benim gördüğüm ticari gömülü/Windows tarafında bağımlılıklar genelde thirdparty/ klasörüne vendor edilir, kullanılan toolchain de sabitlenirdi; bu yüzden kurulum her zaman yeniden üretilebilirdi
    • Bugün gerekenlerin önemli bir kısmı, doğru sürüm Unity ya da Unreal kurmaktan ibaret. Unity öncesi dönem içinse kesinlikle doğru
    • Uplink kaynak kodunun yayımlanmış olduğunu bilmiyordum. Harika oyun
  • Programlamayı Borland Turbo C++ ile öğrendim. O günleri özlememin nedenlerinden biri, karmaşık görünen işleri çok kolay yapabilmesiydi. Geometrik şekil fonksiyonunu çağırmanız yeterliydi, ekrana çizim yapardı; bir şekil çizdikten sonra biraz farklı bir şekil için xor fonksiyonunu çağırınca animasyon bile yapabiliyordunuz
    Arkadaşlarımla bu tekniklerle Final Fantasy benzeri bir oyun yaptık; elle hazırlanmış sprite’lar, ekran bazlı haritalar, kenara gidince bitişik haritaya geçilen bir dünya ve her adımda doğal sayı 1 gelirse savaşa girilen bir yapı bile vardı. Zahmetliydi ama lise öğrencileri için gerçekten eğlenceliydi; bugünkü gibi daha baştan SFML, ActiveX, OpenGL öğrenmek yerine sadece circle çağırabilmek büyük farktı

    • Çocukların basit şekil programlama yapabileceği bir ortam aranırsa bugün de böyle şeyler vardır herhalde. Fark, “profesyonel araçlar” ile “çocuk/başlangıç araçları” arasındaki ayrımın çok daha belirginleşmiş olması; Turbo C++ ya da benim dönemimdeki Turbo Pascal ise ikisine de yakındı
    • Çocukken Borland Turbo C++ ve öğrenme materyallerine erişebilmiş olmanı biraz kıskandım. Benim erişimim yerel bilgisayar dergisindeki incelemeleri okumaktan ibaretti; bir kopyasını bulsaydım bile okuyacak materyal olmadan ne yapacağımı bilemezdim. O zamanki İngilizcemle materyal olsa bile ne kadar anlayabilirdim, emin değilim
    • Modern 2D grafiklerde temel yöntem framebuffer’a piksel basmak değil; texture ya da surface sistemin temel öğeleri ve compositing ayrı bir aşama olarak işleniyor. Bu yüzden “basit sprite” yapmak aslında daha kolay hale geldi; composited surface’i donanım sprite’ının daha genel bir biçimi gibi düşünebilirsiniz
    • Eski güzel conio.h ve Borland’ın BGI graphics.h dosyaları aklıma geldi. Bugün SDL bir ölçüde o rolü üstleniyor ama o kadar basit değil
    • Borland Turbo C++ hâlâ açık ara en sevdiğim IDE
  • Burada yıllar içinde birkaç kez adı geçtiğini görünce birkaç ay önce nihayet Masters of Doom’u okudum; harika bir kitaptı. O dönemde yaptıkları oyunlar oynanış olarak zaten inanılmaz ilgi çekiciydi ama geriye dönüp bakınca, elinde az imkân olan birkaç genç geliştiricinin neler yapabildiği daha da büyük ilham veriyor

    • Romero yakın zamanda Doom Guy adlı anı kitabını çıkardı; okuyan var mı merak ediyorum. İyi bir kitap mı bilmek isterim
  • DOS’un metin tabanlı UI’ını gerçekten özlüyorum. 1997 civarına kadar kullanmaya devam ettiğim güvenilir PS/2’im aklıma geliyor

    • Terminalde en azından Midnight Commander kullanabilirsiniz
  • C sürücüsüne kurmak mı, ne lüks! Sabit diskim yoktu; A ve B sürücüleri arasında sürekli disket değiştirirdim, derleyici de sürekli değiştirilmiş parçalarını isterdi. Yine de keyif alırdık. Bugünün çocukları böyle hikâyeler anlatsan inanmaz

    • 1992’de 8.9 MB’lık 5.25 inç double-height sabit diskim ve iki adet 5.25 inç 360 KB disket sürücüm vardı. Arkadaşımın 720 KB disket sürücülü ve 30 MB sabit diskli Mac’ine imrenirdim ama o sistem muhtemelen benim PC’min yaklaşık 6 katı pahalıydı
    • 1982 değil, 1992
  • Borland C++ gerçekten çok iyiydi. C++ derleyicisi, standart kütüphane ve debugger içeren IDE yaklaşık 5 MB’a sığıyordu; sarı yazılar ve mavi arka plandan oluşan o sıcacık Borland renk paleti de vardı

    • C++ tutorial içeren basılı kılavuz da birlikte gelirdi. Eskiden C++’ı onunla öğrenmiştim
    • OWL da oldukça iyiydi
    • Zortech çok daha iyiydi
  • Borland’ın MS-DOS IDE’leri tatlı hatıralar

    • Böyle bir nostaljiniz varsa Free Pascal’a bakmaya değer. Açık kaynaklı bir Pascal/Delphi klonu; mavi DOS Turbo Pascal editörünün klonu da var, istediğiniz havayı yakalayabilirsiniz
      Bu yıl Advent of Code’un birkaç gününde kullandım ama nostalji çabuk geçti. Modern ortamlara alışmışken IDE’nin kısıtları ve Pascal’ın uzun uzun yazma gerektirmesi günlük kullanım için pek “eğlenceli” değildi. Yine de anılar kesinlikle tatlı
    • RHIDE’ın son güncellemesi 23 yıl önce olsa da kaynak kodu hâlâ bir yerlerde duruyor olmalı. Bu tür terminal modu GUI uygularken asıl sorun, Unix/Linux terminallerinin MS-DOS metin modu programlarının sunduğu özelliklerin tamamını sağlamayan terminal standartlarına takılı kalmış olmasıydı
      Özellikle tek başına Alt tuşunu, Alt+harf kombinasyonlarını ve Ctrl+Shift+sol/sağ ok tuşlarını algılayamıyorlar
    • Eski kitaplık alanımda Turbo C kılavuzlarının olduğu kutuyu hâlâ saklıyorum
  • İlgili yazı: Let’s compile like it’s 1992 (2014) - https://news.ycombinator.com/item?id=13750097 - Şubat 2017, 80 yorum

  • Arşivi açarken sorun yaşadım. wolfsrc.zip için End-of-central-directory signature not found hatası verdi; dosyanın zip olmayabileceği ya da çok diske bölünmüş bir arşivin parçası olabileceği yazıyordu