Crusader Kings III’te Aktiviteleri Modlamak

Crusader Kings III’ün bu geliştirici günlüğünde Tours and Tournaments ile değişen kodlar ve modlama yenilikleri tanıtılıyor.

Selamlar. 126. CK3 Geliştirici Günlüğü’ne hoş geldiniz. Ben Matthew, ekipteki programcılardan biriyim ve bugün Tours and Tournaments ile birlikte gelen modlama desteğindeki değişikliklerin yanı sıra aktivitelerin nasıl modlanabileceğini ele alacağız.

Aktivite Modlaması

Aktiviteler tamamen modlanabilir ve daha önceki geliştirici günlüklerinde de belirttiğimiz gibi çeşitli seçenekler ve aşamalardan oluşurlar, aşamalar ise bir tür ve bir konumdan oluşur.

Aktivitelerde çok sayıda kod seçeneği var, bu nedenle daha ayrıntılı bir genel bakış için bunlarla ilgili bilgi dosyamızı da ekleyeceğim. Bu geliştirici günlüğünde ise sadece birkaç büyük şeyi ele alacağım.

Seçenekler

Seçenekler görece daha basit şeylerden biridir, gösterilebilen ve seçilebilen farklı seçeneklerle kategoriler halinde gruplandırılırlar ve varsayılanın hangisi olduğu kodlanır. Bu varsayılan seçim bir tetikleyicidir, böylece farklı karakterler için farklı varsayılanlar ayarlanabilir; vanilyada bunu Müslümanlar için Hac’ı varsayılan yapmak için kullanıyoruz, böylece ilk önce ona gidiyorlar.

Ek olarak, her seçenek ev sahibinin ve davet edilen misafirlerin maiyetine zorla karakter ekleyebilir, saray karakterlerinden seçer ve onları seçmek için bir ağırlık ve oyuncu ve yapay zeka için seçilebilecek maksimum bir ağırlık sağlar.

Davet edilen bu karakterler ayrıca, birazdan daha derinlemesine ele alacağım bir davet sırasına da sahiptir.

Son olarak bir seçenek kategorisi “özel” kategori olarak ayarlanabilir, bu seçenek bir aktivite planlanırken ilk olarak seçilecektir. Vanilyada bunu, hangi Tur türüne gideceğiniz gibi özel aktivite türleri için kullanırız. Kontrol için aktivite kurulumunda birçok tetikleyiciyle ve kod değeri ile beslenir.

Aşamalar

Aşamaları ayarlamak, esas olarak konumlarının nasıl seçilmesi gerektiğine odaklanırsak oldukça karmaşık olabilir.

İki tür aşama olduğunu düşünebilirsiniz: Önceden Tanımlanmış ve Seçilebilir.

Önceden tanımlanmış aşamalar her zaman mevcuttur ve çıkarılamazlar, kod tarafından bir konum seçilerek veya otomatik olarak ilk veya son aşamaya ayarlanarak seçilebilirler.

Örneğin, bir Turda son aşama olan “Eve Yolculuk” önceden tanımlanmıştır ve sizi her zaman başkentinize götüren bir koda sahiptir, böylece eve dönersiniz.

Seçilebilir aşamalar için oyuncu bunun yerine bir eyaleti kendisi seçer, aşamalar tekrar tekrar seçilebilir ve bir maksimum limite sahiptir, böylece her vasalı ziyaret etmek için bir Tura çıkamazsınız.

Her aşamanın ayrıca gerçekleştiği bir sıra vardır, tüm aşamaları önceden tanımlanmış olan bir ziyafet gibi basit bir aktivite için bu sadece gerçekleştikleri sırayı kontrol eder. Oyuncunun bir şeyleri seçebildiği daha karmaşık aktivitelerde sıra daha karmaşık hale gelir, kodladığınız sıraya uyacaktır ancak aynı zamanda sıra eşleşiyorsa, oyuncunun seçtiği sonuncusu olacaktır.

Yukarıdaki resimde Turları örnek olarak tekrar ele alırsak, sıranın 2’ye ayarlandığını ve farklı vasalları ziyaret ettiğiniz seçilebilir aşamalar için sıranın 1’e ayarlandığını görebilirsiniz.

Yani Eve Yolculuk her zaman her şeyin en sonundadır ve vasal durakları için oyuncu en son hangisini seçtiyse yolculuğunuzun sonuna doğru olacaktır.

Özel Konuklar

Özel konuklar iki şekilde seçilebilir; ya bir tetikleyici ile bu tetikleyiciye uyan tüm davetli karakterler arasından seçim yaparsınız ya da bir efekt tarafından otomatik olarak doldurulurlar. Bu, düğünlerde gelin ve damadın otomatik olarak belirlenmesini sağlarken, bir ziyafette onur konuğunuzu seçebilirsiniz.

Ek olarak, fark etmiş olabileceğiniz gibi, özel konuklar gerekli olabilir veya olmayabilir, eğer gerekliyse, aktivite onlar olmadan planlanamaz ve eğer reddederlerse geçersiz olur.

Davet Kuralları

Her aktivite, kimlerin davet edilebileceğini kontrol eden birden fazla davet kuralına sahiptir, bu kurallar yeniden kullanılabilir ve farklı aktiviteler arasında paylaşılabilir ve kendi dosyalarında tanımlanır.

Kendi başına bir davet kuralı sadece bir listeye karakter ekleyen bir etkidir, bu karakterleri ev sahibinden nasıl alacağınız gerçekten size bağlıdır.

Bir aktivite bu davet kurallarını kullanmaya karar verdiğinde, kuralın varsayılan olarak etkinleştirilip etkinleştirilmeyeceğine ve daha da önemlisi davet kuralının hangi sırayla uygulanması gerektiğine karar verebilir. Bu, davet kuralları aktivitenizin destekleyebileceğinden daha fazla karakter eklediğinde devreye girer, karakterleri sıraya göre davet etmeye çalışacak ve daha sonra daha az önemli karakterler atlanacaktır.

Aktivite bir dereceye kadar onların etrafında döndüğü için özel konuklar her zaman önce davet edilir. Aynı şekilde, etkileşim yoluyla manuel olarak davet ettiğiniz kişiler de davet listesinin ön sıralarına yerleştirilecektir.

Niyetler

Davet kuralları gibi niyetlerimiz de kendi dosyalarında tanımlanır ve farklı aktiviteler tarafından yeniden kullanılabilir. Ev sahipleri ve misafirler için varsayılan niyet her aktivite için tanımlanmıştır, oyuncu ve yapay zeka buradan kendilerine özel olanı seçecektir.

Her niyet isteğe bağlı olarak bir hedef karaktere sahip olabilir ve bunlar etkileşim hedeflerine benzer şekilde kodlanırlar. Niyetleri modlarken akılda tutulması gereken bir şey yapay zeka hedef kullanımıdır; davet edilen her karakter bir hedef olduğundan, sağladığımız yapay zeka hedef filtrelemesini özgür bir şekilde kullanmalı ve potansiyel olarak çok büyük insan gruplarına sınır koymalısınız.

Eklenti Araç Çubukları

Özel bilgileri görüntülemek isteyen aktivitelerin doğası gereği ve Turnuvalar söz konusu olduğunda temelde kendi penceresinin tamamını göstermesi nedeniyle, aktivite kod dosyasının ana pencereye hangi eklenti araç çubuklarını eklemesini istediğini tanımlamasına izin veren bir sistem geliştirdik.

Bunların biçimi, sol tarafın eklenti widgetının adını ve içinde bulunacağı dosyanın adını ifade etmesidir, hepsi gui/activity_window_widgets dizini altında bulunan olay penceresi widgetlarına benzer.

Sağ taraf, altına eklenmeleri gereken ana aktivite penceresindeki widgetın adını ifade eder. Vanilyada halihazırda kullandığımız birkaç tane var ancak modlar widget ekledikleri yerleri genişletebilir ve daha fazlasını ekleyebilir ve kendi aktivite bilgileri için özel widgetlar kullanabilir.

Seviyeli Özellikler

Daha önceki bazı geliştirici günlüklerinde gösterildiği gibi, artık modcuların tamamen kodda halletmesi yerine oyuna yerleştirilmiş seviyeli özelliklere sahibiz.

Kod yönünden çok basittirler; herhangi bir özellik bir veya daha fazla takipçi tanımlayabilir ve değiştiricilerin uygulanması için hangi XP eşiklerinin karşılanması gerektiğini belirleyebilir. Değiştiriciler istiflenir, böylece her zaman önceki seviyelerin ödüllerini alırsınız.

Herhangi bir özellik seviyeli bir özellik haline getirilebilir, şimdilik bunu seviye atlayabileceğiniz yaşam tarzı özelliklerine yaptık. Ancak bunu gelecekte başka şeylere de uygulayabiliriz!

Şu anda vanilyada kullanılmasa da özellik XP’sinin zaman içinde azalabilmesi için kod da ekledik. Eminim modcular bunu rahatça kullanabileceklerdir. Aşağıdaki kod XP’nin her ay 5 azalmasını sağlayacak ancak yalnızca en az 20’ye kadar, böylece zor kazandığınız tüm XP’yi kaybetmezsiniz.

Bu yeniden çalışmanın yanı sıra, özelliklere daha fazla dokümantasyon ekledik.

Veritabanı Kapsamları

Önümüzdeki birkaç yama boyunca devam edecek olan daha büyük bir yeniden çalışma ise artık veritabanı türlerinin kapsam türleri olarak kaydedilebilmesidir.

Arka ucumuzu şimdi bunu daha iyi destekleyecek şekilde yeniden düzenledim ve esas olarak değiştirilemedikleri için bu veritabanı kapsamlarında etkilerin çalıştırılmasına izin vermeyerek işleri hala güvende tutuyorum. Artık örneğin özellikler ve aktivite türleri kaydedilebilen ve kod dosyasında kullanılabilen kapsamlardır.

Şu anda destek çoğunlukla asgari minimum durumda ancak gelecekteki yamalarda çeşitli veritabanı türlerini kapsam haline getirmeyi planlıyorum. Bu sayede mod uyumluluğunun artacağını ve her bir özelliğin elle kontrol edilmesinden kaynaklanan kod dosyası yinelemelerinin azalacağını umuyorum.

Tours and Tournaments’dan sonraki sürümde, özellikleri hem tetikleyiciler hem de etkiler için tamamen entegre hale getirdim, böylece örneğin birinin rastgele bir zıt özelliğini arayabilir ve ardından karakterinize ekleyebilirsiniz.

Tours and Tournaments için, bunu çoğunlukla uyarıları daha iyi desteklemek için aktivite sisteminde kullandık, böylece ev sahipliği yapabileceğiniz aktiviteler hakkında sabit kodlanmış bir uyarıya sahip olmak yerine, bunları normal kod gibi kontrol edebiliriz.

Bunu okuyan modcular: Hangi türlerin kapsam olarak eklenmesini istediğinizi ve veritabanı anahtarlarını alan hangi tetikleyicilerin ve etkilerin kapsam aldığını görmek istediğinizi bilmek isterim. Gelecekteki bir yama için zaten özellikleri hallettim, bu yüzden yapabileceğim diğerleriyle ilgileniyorum!

Veri Modelleri

Veri modellerinin nasıl çalıştığına dair arka uç üzerinde yeniden çalıştım, bu da artık gui betiğinde dinamik olarak bir veri modelinin alt bölümlerini almamıza ve veri modelindeki belirli bir öğeye bir veri bağlamı ayarlamamıza olanak tanıyor.

Örneğin, artık bir veri modelini ilk üç kişiyle sınırlayabilirsiniz:

datamodel = "[DataModelFirst( ActivityWindow.GetCharacters, '(int32)3' )]"

Ya da ilk birkaçını atlayabilirsiniz:

datamodel = "[DataModelSkipFirst( ActivityWindow.GetCharacters, '(int32)3' )]"

Ayrıca, bunların sonu alan/atlayan bir “Son” sürümü ve hem ofset hem de istenen boyutu yapmanıza olanak tanıyan DataModelSubSpan bulunuyor.

datacontext_from_model kullanarak belirli bir öğeyi de alabilirsiniz, çoğu zaman bu ilk öğe olacaktır, böylece en çok puan alan karakteri veya ilk tamamlanan amacı vb. gösterebilirsiniz.

Dizin dinamik de olabilir, böylece kodda bir değer kaydedebilir ve ardından bu karakteri veri modelinizden çıkarabilirsiniz.

Koşullu Kapsam Değişikliği

İçinizden bazı keskin gözlülerin fark etmiş olabileceği gibi, ya da Vicky’yi modlamayı denediyseniz ve bizim değişikliğimizi bizden önce yayınlandıklarını gördüyseniz, yeni koşullu kapsam değiştirme operatörünün ?= olduğunu fark etmişsinizdir.

Normalde bir kapsama geçtiğinizde, o kapsam mevcut değilse hata alırsınız, ancak birçok durumda o şeyin ayarlanmamış olabileceğini bilirsiniz, bu durumda bir hata değil, tetikleyicinin başarısız olmasını istersiniz.

Bunu yapmanın önceki yolu, her seferinde yukarıdaki satıra bir varlık tetikleyicisi eklemektir, çünkü bu daha sonra etrafta değillerse false döndürür, ancak bu oldukça hantal olabilir.

Şimdi bunları bir araya getirebilirsiniz, böylece fazladan bir sürü kod yazmak yerine sadece tek bir kullanışlı ? işinizi görür!

Bu, sol taraf mevcut değilse false döndüreceği kapsam karşılaştırmaları için de çalışır. Etkilerde kullanıldığında, kapsam mevcut değilse bu kapsam değişikliğindeki etkileri çalıştırmayı atlayacaktır.

Yazar: Akın Yıldızlı

Strateji oyunlarını seviyorum.

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.

Son Yorumlar

  • Furkan: Yüzdelik olarak ne kadar yol aldınız acaba?
  • Yılmaz: 1.3.2 yaması ne zaman çıkar

KATEGORİLER

ARŞİV