İçindekiler

Kısaca: MKA Engine'de olay, içerik dosyasında tanımlanan bir "olur" kaydıdır: kendiliğinden belli bir ortalama sürede gerçekleşir ya da bir etki ona tetikler; oyuncuya seçenekler sunar ve cevap bir komutla gelir. Değiştirici ise bir ülkeye ya da eyalete bağlanan geçici ya da kalıcı bonus ve cezadır: toplanır, çarpılır ya da bir anahtarı açar. İkisi de belirlenimcidir; çekilişler adım ve kayda göre ayrı akışlardan gelir.
Bir strateji oyunundaki kıtlığı düşünün. "Kuraklık başladı" ekranı çıkar; hasat üç ay boyunca eksilir; bir danışman size iki seçenek sunar. Bu üç şey, yani olay, değiştirici ve seçenek, büyük strateji oyunlarının omurgasıdır. Bu günlükte motorun bunları nasıl tuttuğunu anlatıyoruz. Kuralların yazıldığı dili Günlük #5'te gördük; burada o dilin çalıştığı yerlere bakıyoruz.
Olay nedir?
Olay, içerik türlerinden biridir; oyun hangi türün olay olduğunu project.bsm içinde söyler. Bir olay şunlardan oluşur:
- bir kapsam (olay bir ülkede mi, bir eyalette mi olur),
- bir koşul (şu an olabilir mi),
- bir hemen etkisi ve bir sonra etkisi,
- isteğe bağlı seçenekler; her seçeneğin kendi koşulu ve etkisi vardır.
İki biçimde başlar. Ya kendiliğinden, belli bir ortalama sürede (gün olarak) olur; ya da yalnız tetiklenerek: bir etki, bir eylem ya da bir kanca onu ateşler. Bizim deneme oyunumuzdaki araştırma olayı ikincisine örnektir: her teknoloji bir seçenektir ve seçeneğin koşulu "bu teknoloji henüz alınmadı" der; seçilen teknoloji alınmış olur. Bu, deneme oyunundan bir örnektir; gerçek bir oyunun kuralı değildir.
Rastgele olay ne zaman olur?
"Ortalama şu kadar günde bir olur" demek, her gün zar atmak demek değildir. Her olay ve kapsam çifti için bir bekleme süresi bir kez çekilir ve bir takvime yazılır; süre dolunca olay denenir. Çekiliş adıma, olaya ve kapsama göre anahtarlanır ve takvimin kendi kaynağından gelir; hiçbir sistem bu kaynaktan çekmez. Olayın kendi çekilişleri (koşulu, seçenekleri, etkileri) ise olaya ayrılmış ayrı bir akıştan gelir.
Bunun pratik sonucu iki türlü: aynı tohumla aynı olaylar aynı günlerde olur (Günlük #1'deki durumsuz üreteç) ve bir sistem fazladan bir zar attı diye bir olayın günü kaymaz.
Olay günün neresinde çalışır?
Günlük #4'te günün yedi durağını saymıştık. Olay iki yerde çalışır:
- Zamanlayıcılardan sonra, sistemlerden önce: vakti gelen olaylar ateşlenir.
- Günün sonunda, özetten önce: o günkü değişikliklerle koşulu yeniden sınanması gereken kapsamlar tekrar denenir.
Kancalar, yani oyunun Rust modunun adım sınırında çalışan kodu, bu ikisinden sonra gelir ve bir olayı elle ateşleyebilir. Bir olay bir etkiyle başka bir eylem isterse, o eylem aynı olaydan hemen sonra, aynı evrede koşar.
Seçenekler: cevap bir komuttur
Seçenekli bir olay ateşlenince bir seçim satırı açılır. Oyuncu cevabı, ağdan herkese giden bir komutla verir; cevap seçeneğin yazılış sırasındaki numarasıdır (ilk seçenek 0). Seçimin bir son günü vardır; cevap gelmezse adım o güne ulaştığında varsayılan seçenek uygulanır. Yapay zekâ da aynı komutla cevap verir.
Seçim ve son gün tabloda sütun olarak durur, zamanlayıcıda değil; böylece Günlük #3'teki depoda diğer verilerle birlikte durur.
Değiştirici nedir?
Bir ülkenin hasadı "100" olabilir; kuraklık ona -3 koyar, iyi bir hükümdar +2. Bu bonusları ülkenin sütununa elle yazmak, kuraklık bitince geri almayı unutmak demektir. Bunun yerine her bonus ya da ceza ayrı bir örnek olarak durur: kimin üzerinde olduğu, hangi türden olduğu ve ne kadar olduğu bellidir. Toplam her seferinde örneklerden hesaplanır.
Üç tür vardır:
| Tür | Nasıl birleşir | Örnek |
|---|---|---|
| Toplamsal | Örneklerin miktarı toplanıp tabana eklenir | Hasat: kuraklık -3, iyi hükümdar +2, toplam -1 |
| Çarpansal | Miktarlar toplanır, çarpan 1 + toplam olur | Vergi: +%10 ve -%5 örnekleri, çarpan 1,05 |
| Anahtar | Biri sıfırdan farklı bir miktarla açıksa açık | Açıksa, anahtara bağlı komut türü o kapsamda reddedilir |
Çarpansal türde miktarlar önce toplanır, sonra çarpan olur; yani iki "+%10" örneği 1,21 değil 1,20 eder. (Örnekteki sayılar hesaptır, ölçüm değil.)
Deneme oyunumuzda bir kuraklık kümesi harvest = -3 yazar; fırtına kümesi ise örneğin kaynağındaki şiddet sütununu okur ve şiddet başına -1 uygular. Yapay zekânın zor ayarı da ülkesine her gün harvest = 2 veren bir küme ekler. Bu da motorun deneme oyunundan alınmış bir örnektir.
Toplamlar nasıl tutulur?
Bir koşul modifier:harvest > 0.5 diye yazıldığında kapsamın o türdeki toplamını okur. Bu toplamlar sık okunur, onun için her seferinde örnekleri toplamak yerine türetilmiş bir önbellekte durur. Önbellek kaydedilmez; oyun yüklenince örneklerden yeniden kurulur. Böylece kayıtta tek gerçek kaynak örneklerdir, toplamlar onlardan çıkar ve ikisinin birbirinden kayması mümkün olmaz.
Toplamlar yalnız dünya değişince hareket eder: örneğin zamanlayıcılardan sonra (olaylar güncel toplamı okusun diye), olaylardan sonra (sistemler okusun diye) ve her komuttan sonra, bir komut türü bir anahtarla kapanabiliyorsa (sıradaki komut doğru durumu görsün diye). Hareket, deponun değişen satırlarına bakar; bütün tabloyu taramaz.
Süreli değiştiriciler
Kuraklık kalıcı değildir. Süreli bir örneği kendi zamanlayıcısı bitirir: zamanlayıcı onu o günün zamanlayıcı evresinde siler, olay ve sistemler çalışmadan. Anahtar türünde ince bir kural var: anahtar, bitiş gününden önce geçerlidir, bitiş gününde değil. Zamanlayıcı evresi komut evresinden sonra geldiği için bitiş günündeki komutlar anahtara takılmaz. Bunu bilmek, bir mod yazarının "anahtarın bittiği gün komutlar geçer mi?" sorusuna cevap verir: geçer.
Değiştirici kümeleri
Bir olay tek tek örnek yazmaz; bir küme ekler: drought = { modifiers = { harvest = -3 } }. Kümeler project.bsm'deki tür sırasıyla, sonra kayıt sırasıyla numaralanır; olay kümeyi bu numarayla (@SET_DROUGHT gibi bir tanımla) anar ve spawn etkisiyle kapsama bağlar. Kümelerin kendi koşulları olabilir, ama bir kümenin koşulu kendi beslediği toplamı okuyamaz: aksi halde "bonusum varsa bonusum olsun" gibi kendini besleyen bir döngü kurulurdu.
Sınırlar
- Ölçüm yok: Bu günlükte olay ve değiştiricilerin hızına dair ölçüm vermiyoruz; kuralları ve düzeneği anlatıyoruz.
- Örnekler deneme oyunundan: Gösterdiğimiz olay ve kümeler motorun deneme oyunundandır, gerçek oyunun kuralı değildir.
- Olay kuralı değil düzenek: Kuraklığın ne olduğu, hangi olayın hangi ortalama sürede olacağı oyunun işidir; motor yalnız bunları tutan ve belirlenimci koşturan düzeneği verir.
- Değiştirici ve olay birlikte kurulur: Toplamları okuyan bir olay ya da eylem varsa oyunun bir değiştirici kümesi de olmak zorundadır; yoksa oyun kurulurken hata verir.
- Motor geliştirme aşamasında: Alanlar ve sözcükler değişebilir.
Sık sorulanlar
Strateji oyunlarında rastgele olaylar nasıl çalışır?
MKA Engine'de her olay ve kapsam çifti için bir bekleme süresi bir kez çekilir ve takvime yazılır; süre dolunca olayın koşulu sınanır. Çekiliş adıma, olaya ve kapsama göre anahtarlandığı için aynı tohumla aynı olaylar aynı günlerde olur.
Değiştirici (modifier) nedir?
Bir ülke ya da eyalet üzerindeki bonus veya cezadır. Toplamsal, çarpansal ya da anahtar türünde olur; her biri ayrı bir örnek olarak durur ve toplam örneklerden hesaplanır. Süreli olanı kendi zamanlayıcısı bitirir.
Olay seçeneğine oyuncu cevap vermezse ne olur?
Seçimin bir son günü vardır; adım o güne ulaştığında varsayılan seçenek uygulanır. Cevap, ağdan herkese giden bir komuttur; yapay zekâ da aynı komutla cevap verir.
İki çarpan değiştiricisi nasıl birleşir?
Miktarları önce toplanır, çarpan 1 artı toplam olur. Yani iki "+%10" 1,20 eder, 1,21 değil.
Kaynaklar ve kayıtlar
Bu günlüğün anlattıkları motorun kendi kararlarına ve kılavuzuna dayanır; dış kaynak kullanmadık. İç kayıtlarımız (motorun deposu kapalı olduğu için bağlantı veremiyoruz):
- Adım evre sırası: olayların zamanlayıcılardan sonra, sistemlerden önce çalışması ve kancaların yeri.
- İçerik dili kararı: etkiler yalnız olay, komut ve kanca anında koşar.
- Betik bağlamları: simülasyon bağlamında toplamların okunması.
- Değiştirici düzeneği ve olaylar: motor kılavuzu ve deneme oyunu.
Sırada ekonomi araçları var: pazar, dağıtım ve akış ağları.
Bu konuda daha fazlası gelecek
MKA Engine hâlâ geliştirme aşamasında. Olaylar ve değiştiricilerle ilgili çalışmalarımızı, yeni özellikler geldikçe yeni günlüklerle paylaşmaya devam edeceğiz.
Bu günlük hakkında sorularınız ya da önerileriniz varsa bize iletişim sayfasından yazabilirsiniz. Motorun genel tanıtımı için MKA Engine sayfasına, bütün günlükler için Geliştirici Günlükleri listesine bakabilirsiniz.
Kaynaklar ve ilgili belgeler
Bunlar da ilginizi çekebilir
- Bir strateji oyununun dünya haritası nasıl yapılır?
MKA Engine için gerçek veriden 27.357 konumluk bir 1337 dünya haritası ürettik: arazi, nehirler, boğazlar, nüfus ve konum sınırları nasıl çıkarıldı?
- Oyun motoruna giden yol
MKA Engine'e nasıl başladık: dört oyunu okumak, belirlenimciliği yasa saymak, aşama aşama ölçerek ilerlemek ve şu an neredeyiz.