Crusader Kings III’te Event Kodlama

Crusader Kings III geliştirici günlüklerinde bu hafta eventlerin yapısına değiniliyor.

Yeni bir geliştirici günlüğüne daha hoşgeldiniz yoldaşlar, bugün CK3’teki eventlerin yapısını ve CK2’den farklarını inceleyeceğiz.

Bir Eventin Anatomisi

Standart bir karaktere ait eventlerin temeline artık aşina olmuşsunuzdur; Başlık, açıklama, portre ve birkaç seçenek.

Ancak iş betiklemeye gelince işlevselliği, okunabilirliği ve genel *betik hijyenini geliştirmek adına birkaç değişiklik yaptık. Bir eventin başlangıcının CK2 ve CK3’te nasıl göründüğünü gösterelim:

Fark edeceğiniz ilk değişiklik event tipinin ve ID’sinin yerlerinin değiştirmemiz olacaktır. Eventler artık isim uzayları (stewardship_domain_special) ve özgün IDler (1424) ile oluşturulurken eventin tipi eventin içinde belirtiliyor. Bu sayede eventleri katladığınızda (içlerinde yazan kısmı gizleyerek kapladığı alanı azaltmak) IDlerini görmeye devam edebileceksiniz!

Tetiklenme metinlerinin çalışma şeklini de değiştirdik. Bu metinler CK2’de eventin oyuncunun durumuna göre uygun hâle getirildiğine emin olmamızı ve özgünlüğünü kaybetmeden geniş bir kullanım alanı oluşturmamızı sağlıyordu. Ancak bu sistem birbirinden farklı tetikleyicileri ayırmanın kolay bir yolunu içermediğinden oldukça yorucu bir hâle dönüşüyordu ve genellikle aşağıdaki gibi sonuçlar ortaya çıkıyordu.

O kadar da kötü değil ancak istediğimizden daha şişkin.

CK3’te bu şişkinliği gereksinimleri karşılıyan ilk tetiğin açıklamasının kullanıldığı first_valid bloğu ile engelleyebiliyoruz. Bu sayede metinleri birbirinden ayırmak için uğraşmamız gerekmeden, istediğimiz sırada basit tetikleyiciler hâlinde listeleyebiliyoruz.

Örneğin bir eventin Fransız, Ashari, 80 yaşının üstünde veya bu kriterlerin hiç birini karşılamayan karakterler için ayrı ayrı açıklama metinlerine sahip olmasını istiyorsam bu eventi aşağıdaki gibi betikleyebilirim.

Bu betikleme sayesinde Fransız karakter farklı, Ashari karakter farklı, Fransız veya Ashari olmayan 80 yaşının üstündeki bir karakter farklı ve bunların dışındaki tüm karakterler için farklı bir açıklama metni gösterebiliyoruz. Yeni sistem ile bu eventlere yeni açıklamalar ve başlıklar eklemek inanılmaz kolaylaştı.

Değinmek istediğim ufak bir nokta da bir event ne kadar çok tetiklenmiş açıklamaya sahip olursa olsun bu yeni yapı ile istediğiniz veya tüm tetiklenmiş metinleri tek bir tuşla katlayarak çalışma alanınızı daha temiz bir şekilde kullanabilirsiniz.

Event Temaları ve Arka Planları

Resim ve sınır bloklarının yokluğu CK3’ün yeni biçiminde fark edilen değişikliklerden.

Tabi bu yokluğun mantıklı ve güzel sebepleri var! Eski sistemlerin çoğu gösterdiğimiz ilk CK3 event resminde görebileceğiniz üzere yeni event tema sistemine dahil edilmiş durumda.

Temalar event ekranının sol üstünde görülen event ikonunu belirlerleyen, benzer eventleri gruplamamıza yardım eden ve oyuncunun eventten ne bekleyebileceği konusunda bilgi veren şeylerdir. Ayrıca event için varsayılan bir arkaplan resmi ayarlamamıza olanak sağlar.

Arkaplan ve tema ikonu elimizde daha uygun oluğunu düşündüğümüz materyal olduğunda birkaç satır ile değiştirilebilir. Yani her ne kadar yeni sistem çeşitliliği yüksek eventler oluşturmak için gereken iş gücünü azaltma amacıyla oluşturulmuş olsa da eventlerin içeriği üzerinde tam kontrole sahibiz ve istediğimiz şekilde içeriği daha uygun bir hâle getirmek için değiştirebiliriz.

Event temaları modlanabilirler; istediğiniz varsayılan arkaplan, ikon, karakter ışıklandırması, ambiyans efektlerini belirleyebilir, kolaylıkla yeni temalar oluşturup üzerinde değişiklikler yapabilirsiniz.

Portreler ve Animasyonlar

En sevdiğim kısım! Yeni sistemdeki portreler, şaşırtıcı derecede, CK2’dekinden daha dinamikler ve herhangi bir event toplamda 5 portre barındırabilir. Bunlardan 2 tanesi sağ ve sola gelecek şekilde animasyonluyken diğer 3 tanesi eventin alt kısmına simetrik bir şekilde yerleştirilmiş kafalar olarak bulunmakta. Bunlar, eventin doğru gözükmesi adına istediğiniz kombinasyonda kullanılabilir.

Sağ ve soldaki portreler çıkış ile birlikte gelecek oldukça geniş çeşitliliğe sahip animasyonlardan herhangi biri ile kullanılabilirken, eventin açıklamasında bahsedilen yardımcı karakterleri görselleştirmenize yardım edecek kafa portreleri animasyonlu olmayacak.

Her Şey için On_Actions!

Tüm eventlerin geldiği bir yer var ve CK2’de (özellikle de ilk zamanlarında) bu çoğunlukla bir eventin yaklaşık ne kadar süre içerisinde ortaya çıkacağını belirlememizi sağlayan “Ortalama Gerçekleşme Zamanı” sistemiyle hallediliyordu. Ne yazık ki iş pek çok sayıda eventi birbirine karşı dengelemeye gelince bu sistemin esnekliği bir dezavantaja dönüşmeye başladı. Bir eventin katı tetikleyiciler olmadan ne kadar sık ortaya çıkacağını yönetmeye çalışmak oldukça zorlaşıyordu. Ayrıca bu sistem tamamen olasılıklar üzerinden çalıştığı için pek çok garip istatistiksel anormallikler ortaya çıkıyordu ve bunlar da oyunun performansını dibe çekiyordu.

CK2’yi çıkış sonrası geliştirmeye devam ettikçe eventleri tetiklemek için daha çok on_actions kullanmaya yöneliyorduk. On_action kodun içindeki bir kanca gibi gereksinimleri karşıladığında eventi çekip ortaya çıkartan (gerektiğinde eventi de değiştiren) bir kod parçası diyebiliriz. Bu sistemi dengelemek normalden daha fazla zaman alsa da eventlerin ne zaman ve nasıl çağırılacakları konusunda bize tam kontrol sağlıyordu ve eventler üzerinde ince değişiklikler yapmayı inanılmaz kolay bir hâle getiriyordu. Ayrıca performans olarak da çok hızlıydı.

CK3’te eventleri ortaya çıkarmak için tamamen on_actions kullandık. Bu sayede eventlerin oyun sırasında belli eylemler (örneğin bir karakterin doğması) gerçekleştiğinde veya belli bir düzen içinde (5 senede bir gibi) ortaya çıkmasını sağlayabiliyoruz. Eventler on_actions gereksinimi sağlandığında ortaya çıkmaya ayarlanabilir veya ortaya çıkabilecek potansiyel eventlerin bulunduğu bir ağırlıklı listeye eklenebilir.

CK2’deki on_actions sistemi üzerinde yaptığımız büyük değişikliklerden biri betiklenebilen on_actionslar! Bu yenilik sayesinde tamamen sabit kodlanmış(hardcoded) on_actionslara yüklenmek yerine sıradan bir on_actions gibi çalışan betiklere bağlayabileceğimiz on_actionslar oluşturabiliyoruz.

Örneğin bir iç savaş sonucunda yaşanan uzlaşma süreciyle ilgili bir dizi event oluşturdum ve bu eventlerin iç savaşın bitişiyle ortaya çıkmasını istiyorum. Bu akışı sağlamam için yapmam gereken tek şey ilgili savaşın bitiş etkilerine böyle bir kod parçası eklemek.

Ardından uygun yerde bu on_action kısmını içeren bir dosya oluşturuyorum.

Bir etkiyi betikleyebildiğiniz her yerde yeni veya mevcut bir on_actionsa referans verebilirsiniz.

Immediate Bloğu ve Siz

CK betiklemeye eklediğimiz ve immediate bloklarında sıkça kullandığımız en büyük yeniliklerden biri ise betiklenmiş listeler!

Bu listeler çeşitli grupları sıralamamızı, içlerinden belli kriterleri kaşılayan karakterleri alıp sadece bu karakterlerin bulunduğu listeyi kolaylıkla inceleyebiliriz.

Diyelim ki vasallarım ve saray mensuplarım arasındaki tüm yaşlı ve kaba adamlardan bir liste oluşturmak istiyorum. Yazacağım kod yaklaşık olarak şu şekilde olacaktır:

Ardından bu liste içindeki en kızgın ve kaba 2 kişiyi seçiyorum. Daha sonra bu iki kişi arasında yaşanan kavgayı bir eventle yanstıabilir veya başka şekillerde kullanabilirim.

Tamamdır! Bu iki karakterden lokalizasyonumda bahsedebilir, gerekli etkileri uygulayabilir ve portrelerini çıkarabilirim. Bu arada bir diğer yeni özelliğimiz olan alternative_limiti fark etmişsinizdir. Bunlar hemen üstlerindeki limit bloğu başarısız olursa kontrol edilen yeni tip limitlerimiz.

Yaptğımız bunca şeyin amacı gereksiz bakımları en aza indirmek ve bazı potansiyel hataları var olmadan yok etmek ancak aynı koşulları kullanan ayrı betik tetikleyicilerinin birer parçası olan iki ayrı liste çağıran bu kod parçası da çok sağlam durmuyor.

Bu durumu çözmek için birkaç yöntem var ancak şimdilik size ordered_in_list ile gelen yeni özelliğimizi gösterelim.

Ordered_in_list bir liste alıp sistemin içinde yer alan script_maths komutunu çağırarak listedeki elemanlara sayısal değerler atamakta. Ardından listede sayısal değeri en yüksek elemana belirtilen etkileri uygular(Eğer isterseniz yukarıda yaptığımız gibi siz de bu uygulamanın tüm listeye yapılmasını sağlayabilirsiniz). Burada çok ufak bir liste üzerinde oldukça az değişken ile işlemler yaptık ancak bu sıralama işlevini kullanacağınız listeler istediğiniz kadar karmaşık ve büyük olabilir.

Diğer immediate bloğu yeniliklerimize baktığımızda alanları (eskiden event hedefleri olarak geçiyordu, üstteki örnekte “save_scope_as” kısmında bir örneğini görebilirsiniz) ve değişkenleri kaydetmek artık daha kolay. Ayrıca bu bloklara ufak müzikler ekleyerek işleri daha da dramatik hâle sokabilirsiniz. Immediate bloğunun temel özelliğinde (bir event ortaya çıktığı anda çalışmaya başlaması) herhangi bir değişiklik yok ve immediate bloğunun içinde çalışan görünür etkiler tüm eventlerde “Has Happened” başlığı altındaki bir bilgi kutucuğu ile gösteriliyor.

Seçenekler: Yapay Zekaya Kişilik Vermek ve Oyuncuyu Strese Sokmak

Sonunda, seçenekler. Seçenekelr CK2’dekine benzer işliyorlar, event başına en az bir seçenek ve her seçeneğin bir metni olmak zorunda. Bu kısıtlamara rağmen seçeneklere istediğiniz sayıda ve çeşitli etkiler ekleyebilirsiniz.

Burada fark edebileceğiniz 2 ana yenilik ai_chance ve stress_imapct’ın geniş kullanımı olacaktır.

Ai_chance, CK2’de olduğu gibi, yapay zeka karakterin belli bir seçeneği seçme şansını belirliyor. CK3’te bu bloğun kullanımını artırarak karakterlerin seçenekleri seçerken kişiliklerini mümkün olduğunca yansıtmalarını sağlamayı hedefledik. Ayrıca seçenek bloğunun içine de tetikleyiciler ekleyerek yapay zekanın bazı durumlarda (savaştaysa veya paraya ihtiyacı varsa) kişiliğinin uymayan seçenekleri tercih edebilmesini sağladık.

Diğer taraftan stress_impact birkaç günlük önce bahsettiğimiz yeni stres mekaniğimizi organize etmemizi sağlıyor. Eğer hatırlamıyorsanız “stres” yapmanıza gerek yok, stres mekaniği kabaca karakterinizin kişiliğine ters eylemler gerçekleştirdiğinde kazandığı negatif bir etki diyebiliriz.

Stress_imapct bloğunda hangi kişiliklerin ne kadar stres kazanacağını veya kaybedeceğini belirleyerek bu mekaniği uyguluyoruz. Bazı karabüyüler sayesinde bu blokta bulunan stres kazançları ve kayıpları toplanarak event seçeneğinde tek bir rakam olarak karşımıza çıkıyor.

Stres kayıp ve kazançlarını bu bloğun dışında yazabilirsiniz ancak böyle yaparsanız stres kazancı/kaybı seçenekte normal bir etki gibi görünecek ve diğer stres etkileriyle birleşmeyecektir. Ayrıca birden fazla stres bloğu da kullanabilirsiniz ancak farklı stres bloklarının içlerindeki değerlerin birbirleriye toplanmayacağını unutmayın.

Tetikleyiciler

Öncelikle durumu gözden geçirelim, CK2’de tetikleyiciler uzun gereksinim listelerini tek bir yerde toplamamızı sağlıyordu.

Örneğin bir eventte 20’den fazla koşulu kontrol etmem gereken 2 farklı yer var. Bu koşulları 2 yerde de elle yazsaydım event sorunsuz çalışacaktı ancak gelecekte birisi bu 2 yerden sadece birini güncelleyip diğerini unutsaydı problemler ortaya çıkmaya başlardı. Şimdi, birden fazla eventte, hatta farklı dosyalarda bulunana pek çok eventte bulunan bu tetikleyicileri tek tek kontrol etmeye çalışıtğımı hayal edin.

Fark edeceğiniz üzere bu durum tam bir kaosa dönüşüyor. Ancak hem oyunun yapısına uygun olmadığından hem de problemi çözmek yerine sadece ufalttığından dolayı daha az karmaşık tetikleyiciler kullanmak da istemiyoruz.

Bunların yerine betiklenmiş tetikleyiciler kullanmayı tercih ettik. Bu sayede belli bir tetikleyici listesini tek bir yere yazarak bu listeyi istediğimiz her eventin içinde çağırarak kullanabiliyoruz. Tetikleyicinin düzeltmeye veya güncellemeye ihtiyacı olduğunda listeyi yazdığımız yerde yaptğımız değişiklikler bu tetikleyiciyi kullanan bütün eventleri de etkilemiş oluyor. Kazandığımız zamanı tahmin edebiliyorsunuzdur.

Ancak CK2’de bu tetikleyiciler common klasörünün içinde kullanıldıkları eventlerden ayrı bi dosyada tutulmaları gerekiyordu. Bu pek de büyük bir sorun gibi gelmeyebilir ancak betiklenmiş tetikleri oluştururken veya bakımını yaparken bize ek iş çıkartıyordu. Ayrıca pek çoğunun sadece birkaç kez kullanıldığı devasa tetikleyici listesi de güzel bir görüntü değil.

CK3’e iç tetikleyiciler ekleyerek bu sorunu çözdük. Bu yolla tetikleyicileri kullanıldıkları dosyanın içine yazabiliyoruz. Ancak başka dosyalar bu tetikleyici kullanamamkta. Pek çok dosya tarafından kullanılan tetikleyiciler için az önce bahsettiğim tek dosya sistemi hâla işe yarar durumda. Bu yöntem, büyük ve küçük betiklenmiş tetikleyicileri birbirinden ayırmamızı ve bu tetikleyicileri oyun dosyalarına yayabilmemizi ve bu sayede detaydan ödün vermeden betikler oluşturmamızı sağlıyor.

Bu haftanın geliştirici günlüğünün sonuna geldik, haftaya görüşmek üzere!

*Betik/Betikleme -> Script/Scripting

Yazar: Mertcan Elçi

Yorumla

STRATEGYTURK

Strategyturk'te strateji oyunlarından haberleri, yama notlarını, geliştirici günlüklerini ve daha birçok içeriği Türk strateji oyuncularına Türkçe bir biçimde sunuyoruz. Aynı zamanda yeni çıkan strateji oyunlarının ve eklentilerinin incelemelerini yapıyor, bu oyunlara dair sürekli olarak içerik oluşturuyoruz.

Sosyal medya sayfalarımızı takip ederek strateji oyunlarındaki gelişmelerden haberdar olabilirsiniz.

STRATEGYTURK TWITTER

Hearts of Iron IV'te Türkiye Odak Ağacı #hoi4 https://t.co/UcONXW5zND
Civilization VI'da Galya'ya Ambiorix Liderlik Ediyor #civ6 https://t.co/b6rkmNCDcx

Strategyturk Arşiv