OpenStrike: 2004 PSP'de Çalışan Counter-Strike Benzeri FPS, JavaScript ve Rust ile Hayat Buluyor Yazılım

OpenStrike: 2004 PSP'de Çalışan Counter-Strike Benzeri FPS, JavaScript ve Rust ile Hayat Buluyor

OpenStrike, 2004 PSP'de 60 FPS çalışan Counter-Strike benzeri bir FPS. JavaScript, Rust ve QuickJS ile geliştirilmiş, eski donanımda modern yazılım te

OpenStrike, 2004 yılına ait Sony PSP'de çalışan, Counter-Strike benzeri bir FPS oyunu olarak karşımıza çıkıyor. Oyun, klasik GoldSrc dönemi haritalarını (BSP formatı) kullanıyor ve botlar, mermi izleri, silah geri tepmesi, tur akışı gibi Counter-Strike'ın temel mekaniklerini içeriyor. En dikkat çekici özelliği ise tüm bunları 333 MHz işlemci ve 32 MB RAM gibi kısıtlı donanıma sahip bir PSP'de, 60 FPS ile çalıştırması. Oyunun HUD arayüzü ise bir Solid.js uygulaması olarak TypeScript ile yazılmış ve QuickJS JavaScript motoru üzerinde çalışıyor. Bu, web geliştiricilerinin aşina olduğu araçların (TypeScript, Solid.js) gömülü bir sistemde nasıl kullanılabileceğine dair çarpıcı bir örnek.

OpenStrike'in mimarisi, iki ana bileşenden oluşuyor: Rust ile yazılmış oyun motoru (openstrike-core) ve JavaScript ile yazılmış oyun kuralları ve HUD. Rust motoru, oyuncu hareketi, çarpışma, bot yapay zekası, mermi fiziği ve dünyanın çizilmesi gibi her karede kaçırılmaması gereken kritik işlemleri yönetiyor. JavaScript tarafı ise tur akışı, puanlama, silah ve bot ayarları (rules.ts) ile HUD'u (hud.tsx) içeriyor. Bu ayrım, web geliştiricilerinin native uygulamalardan aşina olduğu bir model: motor performans kritik işleri üstlenirken, ürün mantığı ve kullanıcı arayüzü daha esnek bir dilde yazılıyor. Oyunun temel sürümü, bir moddan farklı olarak herhangi bir ayrıcalığa sahip değil; sadece rules.ts dosyasını değiştirerek bir mod oluşturabiliyorsunuz.

Oyunun çalıştığı donanım olan PSP-1000, tek çekirdekli 333 MHz MIPS işlemciye sahip. Bu işlemci, sıralı komut yürütme (in-order execution) yapıyor ve JavaScript için JIT (Just-In-Time) derleme desteği bulunmuyor. Bu nedenle her JavaScript kodu yorumlanarak çalışıyor. 32 MB RAM'in yalnızca 24 MB'ı kullanıcı programlarına açık. Bu, modern bir web tarayıcısının JavaScript heap'inden bile daha küçük bir bellek. GPU ise programlanabilir gölgelendiricilerden yoksun, sabit fonksiyonlu bir pipeline. Üçgenleri matrislerle dönüştürebiliyor, renk geçişleri yapabiliyor, çift doğrusal filtreleme ile doku örnekleyebiliyor, derinlik testi ve harmanlama (blending) yapabiliyor. Tüm bunlar 2 MB video belleği ile 480×272 çözünürlükte çalışıyor. İşletim sistemi yok; oyun tek bir EBOOT.PBP dosyası halinde, motor, JavaScript yorumlayıcısı, JS paketi ve haritayı içeriyor.

QuickJS, Fabrice Bellard tarafından geliştirilen, ES2023 uyumlu, birkaç yüz kilobaytlık bir JavaScript motoru. OpenStrike'de, QuickJS, PSP'ye özel bir API yüzeyi (strike ve ui) sunuyor ve openstrike.js adlı paket, her platformda aynı şekilde çalışıyor. Oyunun çalışma döngüsü şu şekilde: Her 16.7 milisaniyede bir (dikey boşluk), oyun kumandasından giriş alınır, simülasyon (sim.tick) çalıştırılır, ardından JavaScript'e bir kere çağrı yapılır (strike.__dispatch). Bu çağrıda, rules.ts olaylara tepki verir ve komutlar kuyruğa eklenir, hud.tsx ise sadece değişen bağlamaları yeniden render eder. Son olarak, kuyruktaki komutlar işlenir ve dünya çizilir. Bu yapı, JavaScript'in simülasyonu asla bloke etmemesini sağlar; her karede yalnızca bir kez çağrılır ve bu çağrıda kuyruğa alınan komutlar bir sonraki karede işlenir.

Grafik tarafında ise, 1999 yılından kalma GoldSrc harita formatı (BSP) kullanılıyor. BSP, bir ikili uzay bölümleme ağacı (binary space partitioning tree) ile dünyayı düzlemlere bölerek depolar. Bu, 1990'ların bir veri yapısı olmasına rağmen, PSP'nin sabit fonksiyonlu GPU'su için idealdir. Gölgelendirici olmadığından, doku örnekleme, renk geçişleri ve derinlik testi gibi temel işlemler donanım tarafından yapılır. OpenStrike, bu eski formatı modern bir araç zinciriyle birleştiriyor: Rust motoru, BSP haritalarını yükler ve PSP'nin GPU'suna uygun şekilde render eder. Bu, web geliştiricilerinin aşina olduğu bir konsepti hatırlatıyor: bir bundler (paketleyici) ile eski bir formatı modern bir uygulamaya entegre etmek.

Detaylar ve Etkileri

OpenStrike, sadece teknik bir başarı değil, aynı zamanda web teknolojilerinin sınırlarını zorlayan bir proje. PocketJS runtime ailesinin ilk oyunu olan OpenStrike, 'web yığınının ergonomisi, ancak web yığınının altyapısı olmadan' fikrinin sadece kullanıcı arayüzünde değil, gerçek zamanlı 3D oyunlarda da işe yaradığını kanıtlıyor. Proje, açık kaynak olarak yayınlandı (pocket-stack/open-strike) ve geliştiricilere, kısıtlı donanımda modern yazılım tekniklerini kullanma konusunda ilham veriyor. Oyunun çalıştığı donanımın (PSP) iPhone'dan daha eski olduğunu düşünürsek, bu başarı daha da etkileyici hale geliyor. OpenStrike, retro oyun geliştirme ile modern web geliştirme arasında bir köprü kuruyor.

Kaynak: pocketjs.dev

Paylaş: