Sunday, March 18, 2012

Renatus v1.1 çıktı! (Ve post-mortem'i...)

GGJ 2012'de geliştirdiğimiz Renatus isimli shooter oyununun yeni versiyonu artık sizler tarafından oynanmaya hazır! Bu Flash oyununu hemen oynamaya başlamak için sizi şuraya alalım.

Bu yazıda sizlere oyun hakkında bilgi vereceğim; post-mortem (otopsi) olarak tabir edilen yapımcı notlarıyla birlikte (oyunu yaparken nasıl zorluklarla karşılaştığım, nelerin olmasını isterdim, vb.).

Önceki yazımı okuduysanız hatırlayacaksınız; Roselyn, Ragnor ve benden oluşan Yok Sothoth ekibi olarak GGJ'de Renatus'u yapmıştık, ama oyunun teknik bakımdan o kadar çok eksiği vardı ki oyunu burada yayınlamadan önce bu eksiklere bir el atmak istedim. Sonuç olarak; hâlen mükemmelliğe ulaşamamış, ama oynarken epey zevk aldığım ve gururla paylaşabileceğim bir oyun ortaya çıktı, GGJ'den 1,5 ay sonra.


Aslında bu "GGJ'de yaptığımız oyun henüz çok ham bir safhada, çünkü kısıtlı bir vakitte yaptık. Bu oyunu biraz daha geliştirirsek yayınlayabiliriz."düşüncesi oldukça yaygın, katıldığım GGJ'lerde gözlemlediğim kadarıyla.



Oyun hakkında bilgiler:
Flash'la yaptığımız bu oyunu oynamak için swf dosyasını buradan indirebilir (4,93 MB) veya browser'ınız içerisinde bu sayfadan oynayabilirsiniz. Flash Player yüklü herhangi bir bilgisayarda oynanabilir.



Ebediyen lanetli...
Ölmekle lanetli...
Yeniden hayata gelmekle lanetliyim ben.

Geçmişteki korkunç suçlarının cezası olarak cehenneme atılmış, her öldüğünde yeniden dirilmekle lanetlenmiş bir ruhu yönetiyoruz. Amacımız buradan kaçmak, ama öncelikle bizimle birlikte cehenneme atılmış ve aynı laneti taşıyan arkadaşlarımızı kurtarıp yanımıza almak. Düşmanlarımız, bizi orada hapis tutmaya çalışan zebaniler (ben Renatus'taki zebanilere direkt zombi diyorum, çünkü tam zombi gibi davranıyorlar) ve oyunun son bölümünde karşılaşacağımız bir Yılan.

Oynanış oldukça basit: Yön veya WASD tuşlarıyla hareket edip zombilere mouse'la ateş ediyoruz. Her bölümde kurtarılmayı bekleyen 5 adet yeşil ruh var, beşini de kurtardıktan sonra öbür bölüme geçiyoruz. Her bir kurtardığımız ruh, bizi takip edip zombileri öldürmemize yardım ediyor. Eğer bir zombi tarafından yakalanırsak ölüp spawn noktamızda yeniden diriliyoruz. Yakalanan ruhlarsa ölüp yeniden kurtarılmayı bekliyor.

Geçmişteki günahlarım gibi; dehşet verici, korkunç O. Her zaman orada O, daima izliyor. Peşimi bırakmadan işkence ediyor.

Üç bölümün sonunda bizi hapseden Yılan tarafından korunan çıkış kapısına ulaşıyoruz. Amacımız arkadaşlarımızın kapıya ulaşmasını sağlamak.

Yapımcı notları (Post-mortem)

1. GGJ aşaması
Aslında önceki yazımda GGJ 2012 maceramızı anlatmıştım, ama yine de Renatus'un yapım hikâyesini yeniden özetleyeyim.

Yarışma teması olarak bize verilen tek şey Ouroboros'a ait bu sağda gördüğünüz resimdi. Aklımıza birkaç fikir geldi, bunlardan yapılabilirliği ve temayla ilgisi en yüksek olanı bizim Renatus'umuzdu. "Yeniden doğuş", "sürekli tekrarlayan bir döngü" (lanetimiz) ve temayı literal bir şekilde ifade eden Yılan boss'u. "Acaba yılanı öldürmenin yolu ona kendi kuyruğunu yedirmek mi olsun?" diye düşündük, ama yılanın göz göre göre kendi kuyruğunu yiyecek kadar salak olması içimize sinmedi. "Onu öyle bir konuma getirmek zorunda olalım ki kendi kuyruğunu yemekten başka şansı olmasın" mekaniğini geliştirmemiz de kısıtlı bir zaman içinde mümkün olmayabilirdi.

Temanın yanında verilen diversifiers listesinde bizim oyunumuza en uygun ve yapılabilirliği yüksek olanı takipçi NPC'lerin varlığıydı.

Tema açıklandıktan sonra nasıl bir oyun yapacağımıza karar (yani yukarıdaki kararları) vermemiz yaklaşık 8 saat filan sürdü. Oyunu programlamaya C++ ve Allegro kütüphanesiyle başladık. Ama gördük ki bu çok iyi bir karar değildi, çünkü Flash'la 15 dakikada yapılabilecek bir şeyi iki saatte yapıyorduk. 46 saatlik sürecin yarısında (evet, GGJ'de 48 saatimiz değil de 46 saatimiz vardı) Flash'a geçmeye karar verdik, bu kararı geç vermemiz fena bir şekilde zaman kaybetmemize neden oldu.

Flash Develop ve Flashpunk çok güzel bir IDE ve kütüphaneymiş, bu arada. Adobe'un Flash'ına ihtiyaç duymadan Action Script kullanarak basitçe oyun yapabiliyorsunuz. Ve tamamen ücretsiz ikisi de.

46 saatin sonunda sunumu yapılabilecek ve yarışmaya katılabilecek kadar ilerlemiş bir oyun vardı elimizde, ama hâlen önemli teknik eksikle beraber. Son saatte o kadar çok yorulduk ki oyunda level atlamanın olmaması (koddaki denetimin ==  yerine = ile yapılması yüzünden), debug ekranının gözüküyor olması gibi basit hataları fark edemedik/düzeltemedik. Uzun bir süre boyunca uykusuz çalışmak üç kadeh şarapla aynı etkiyi yaratıyor beyninizde; dramatik sonuçlar doğuracak basit hatalar yapma olasılığınız korkunç bir şekilde artıyor.


Oyunla ilgili en çok memnun olduğum öğelerden birisi ışıklandırmaydı (daha doğrusu karartma). Alpha değeri merkeze doğru düşen simsiyah bir maske hazırladık, bu maskenin merkezini oyundaki ışık kaynağının (oyuncunun) üzerine yerleştirmek ambiyansı bir anda değiştirdi.

Soldaki resim, oyunun ışıklandırmasız hali. Eğer dramatik bir etki uyandırmak istiyorsanız, ışıklandırmanın var olması çok önemli.





2. GGJ sonrası
Oyunla ilgili içime sinmeyen çok sayıda öğe vardı. Oyunu oynanamaz hale getiren basit hataları düzeltmenin yanı sıra, oynanışı çok daha zevkli kılmamın mümkün olduğuna inanıyordum. Yapılabilecek en önemli şey, akıllı bir path-finding algoritmasının oyuna entegre edilmesiydi. Zombilerin, ruhların ve Yılan'ın hiçbir engele takılmadan hedeflere ulaşması, kendilerini tehlikeli durumlara sokmaktan sakınması oyunu ne kadar eğlenceli kılardı, değil mi?

İsmini bilmediğim şu pathfinding algoritmasını C++'la yaptığım adventure motorunda başarıyla kullanıyorum. Ama bunu Flash'a entegre etmeyi başaramadım, anlamadığım bir sebepten ötürü algoritma çalışmadı. Uzun bir süre uğraştım, en sonunda yapay zekâyı daha basit tutmaya karar verdim. Çünkü Renatus v1.1 için sonsuz zamanım yok. Oyunu mükemmelleştireceğim diye bokunu çıkarmaya ve diğer projelerimi ihmal etmeme lüzum yok.

Oyunu oynadıysanız ruhların duvardan geçebildiğini fark etmişsinizdir. İlk başta onları duvardan geçemeyecek şekilde kodlamıştım, ama sağlam bir yön bulma algoritmasına sahip olmadıkları için arada duvarlarda takılıyorlardı (Counter-Strike'taki botların ve rehinelerin takılmasını düşünün). Oynanış zevki ile mantık arasında bir seçim yapmam gerekiyordu, burada mantığı feda ettim. Aslında "mantığı feda ettim" sayılmaz, onlar duvardan geçerken yavaşlıyorlar ve alphaları düşüyor, yani onların duvardan geçebilmesini bu şekilde oyun evrenine yedirdim.

Aynı şey Yılan için de geçerli. Kendi içinden geçmesini engellemek daha büyük sorunlara neden oluyordu, bu yüzden onu da kendi içinden geçebilir yaptım. Eğer A* gibi bir algoritmanın yanında kendi içinde bir sarmal oluşturup tıkanmasını engelleyecek bir yapay zeka yaratabilseydim buna gerek kalmayacak ve oyun daha ikna edici bir nitelik kazanacaktı.

Ama yine de yapay zekanın bu halinden memnunum, oyunu yayınlayabilecek kadar. Bize katılan ruhlar, kendilerine yaklaşan zombilerden kaçabiliyor ve sadece görmelerinin mümkün olduğu zombilere ateş ediyor (bir duvarın arkasındaki zombiye ateş etmek yerine).

Oynanışı da iyi bir şekilde dengelediğime inanıyorum. Ne aşırı derecede zor, ne de yavan bir biçimde kolay. Yanınıza katılan ruhları korumak için çaba harcamadığınızda yakalanıyorlar, onları ve kendinizi üstünüze gelen zombi sürülerinden korumak için diken üstündesiniz. Böyle karanlık bir atmosferle kolay bir oyun uyumlu olmazdı.

Umarım bu oyunu oynarken benim keyif aldığım kadar keyif alırsınız ^_^