Steamworks Belgeleri
Oyun İçi Eylemler Dosyası

Genel Bakış


Oyundaki eylemleri, eylem setlerini ve oyunun temel girdi yapılandırmasının yapısını tanımlayan oyun içi eylemler (in-game files/IGA) dosyası geliştirici tarafından sağlanmak durumundadır. Bu makalede bu dosyanın genel yapısı açıklanacak ve bazı birkaç oyundan gerçek durum örnekleri verilecektir.

Örnek Dosyalar


Bir Oyun İçi Eylemler Dosyasını Elle Oluşturmak

Yukarıdaki örneklerde bağlantısı verilmiş oyun içi eylemleri (IGA) dosyalarından birini indirerek başlayın. Ardından Steam klasöründe bir "controller_config" dizini (genellikle C:/Program Files (x86)/Steam/controller_config şeklinde olur) oluşturun ve dosyayı bu dizine yerleştirin. Steam klasöründe benzer adlı bir klasör olacağından, bu dosyayı "controller_base" klasörüne değil, "controller_config" klasörüne yerleştirdiğinizden emin olun. Dosyayı şu şekilde yeniden adlandırın: "game_actions_X.vdf". X oyununuzun Steam AppID'sidir. Eğer oyununuzun AppID'sini bilmiyorsanız, Steam partner sitesine giriş yaparak öğrenebilirsiniz.

Dosyayı istediğiniz bir metin düzenleyicisini kullanarak açın. Dosya, KeyValues adlı basit ve okuması kolay olan standart Valve formatındadır. Ayrıca referans olması açısından oyun içi eylemleri dosya şablonlarından veya Portal 2 IGA'lerinden işinize yarayacak birini indirmek isteyebilirsiniz.

Steam Girdisi API'ını kullanan bir oyundan bir IGA dosyası oluşturmak


Steam'deki bir oyun için bir yapılandırmayı, "yerel" yapılandırma olarak kaydederseniz, bunun dosyasını şu dizinde bulabilirsiniz:
[Steam Dizini]\UserData\[Kullanıcı ID'niz]\241100\remote\controller_config\[appid]\[Kayıt Adı].vdf

Defender's Quest için olan yerel yapılandırmalarımın Windows 10'da saklandığı yere dair bir örnek:

whereisvgf.png

Bu dosyaların, geliştirici tarafından yüklenen ana IGA dosyasının tam kopyaları olmadığını unutmayın. Ancak doğrudan ana dosyadan çekilen "actions" ve "localization" bloklarına bakarak bu dosyanın orijinal yapısına dair bir fikir edinebilirsiniz.

Yukarıdaki ekran görüntüsünde gösterilen dosyanın indirme bağlantısı: #library_controllersavedefaulttitle_0.vdf. Ana Defender's Quest IGA dosyası ile bunu karşılaştırarak yararlı bilgiler edinebilirsiniz.

IGA Biçimi


IGA dosyası, anahtar/değer dize çiftleriyle birlikte yapısal obje verileri oluşturmak için kullanılan ve Valve tarafından yaratılan bir veri biçimi olan VDF belgesi hâlini alır.

İskelet


Dosyanın temel yapısında "In Game Actions" adlı bir sarıcı obje ve altında da iki adet obje vardır, bunların adları
sırasıyla "actions" ve "localization"dır.

"In Game Actions" { "actions" { } "localization" { } }

Eylem Setleri

"actions" objesini yakından inceleyelim. Bu objede eylem setleriniz yer alır. Bir "actions" objesinin yapısı şu şekildedir:
"actions" { "BurayaEylemSetiAdıGelecek" { "title" "#BurayaAdGelecek" "StickPadGyro" { } "AnalogTrigger" { } "Button" { } } }

Yukarıda yer alan dizeler arasında kullanıcının değiştirebileceği dizeler sadece "BurayaEylemSetiAdıGelecek" ve "#BurayaAdGelecek" dizeleridir, geri kalan her şey anahtar sözcükler içindir.

"BurayaEylemSetiAdıGelecek" dizesinde değiştirdiğiniz değer, Steam Girdisi API'ında kullanacağınız eylem setinin adıyla değiştirilecek. "#BurayaAdGelecek" dizesinde değiştirdiğiniz değerse yerelleştirme belirteci olacak ve dosyadaki "localization" kısmında kullanılacak. # sembolünün burada gerekli olduğunu aklınızdan çıkartmayın.

Her eylem setinin özgün bir dize adı olmalıdır. "actions" kapsayıcı objesinde daha fazla obje oluşturarak daha fazlasını ekleyebilirsiniz. Virgül ya da köşeli parantez kullanmanıza gerek yok; bu bir VDF dosyası JSON değil.

Her eylem seti objesinde muhtemel alt üç obje vardır. Bunlar; "StickPadGyro", "AnalogTrigger" ve "Button". Sadece bu muhtemel objeleri tanımlayabilirsiniz ve bu objeler tekil eylem tanımlarınıza ev sahipliği yapacak kapsayıcılardır. Üç kategoriyi de sağlamak gibi bir mecburiyetiniz yok.

Bu yapı oldukça geçerlidir, örnek vermek gerekirse:
"actions" { "EylemSetiAdı1" { "title" "#Ad1" "AnalogTrigger" { } "Button" { } } "EylemSetiAdı2" { "title" "#Ad2" "StickPadGyro" { } } "EylemSetiAdı3" { "title" "#Ad3" "Button" { } } }

StickPadGyro

Bu eylem seti bloku iki hareket eksenine sahip analog eylemler (yani bir analog çubuğa, dokunmatik yüzeye veya bir jiroskopa atamak isteyeceğiniz eylemler) içindir. Bir fare veya farklı bir şeyle kontrol etmek istediğiniz eylemler de buraya eklenmelidir.

AnalogTrigger

Bu eylem seti bloku tek hareket eksenine sahip analog eylemler (yani analog tetiğe atamak isteyeceğiniz eylemler) içindir.

Button

Bu eylem seti bloku sadece açık ya da kapalı olduğu bilgisini gönderen dijital eylemler içindir. Bu blokun adının "button" olmasına karşın dijital eylemler neredeyse her türlü fiziksel girdiye atanabilir. Bunlara aslen analog veri çıktısı vermek için tasarlanan kontroller (analog çubuk, dokunmatik yüzey, vb.) de dâhildir.

Eylemler


İçerisine eylemler tanımlanmadığı sürece IGA dosyası bir işe yaramayacağı için gelin biraz eylem ekleyelim!

StickPadGyro Eylemleri

StickPadGyro (2 eksenli analog) eylemleri ekleyerek işe başlayalım. Öncelikle karakteri hareket ettirecek bir eylem ekleyelim, adına da "Move" diyelim, sonra da kamerayı kontrol edecek bir eylem ekleyelim, adına da "Camera" diyelim.

"actions" { "FPSControls" { "title" "#Set_FPSControls" "StickPadGyro" { "Move" { "title" "#Action_Move" "input_mode" "joystick_move" } "Camera" { "title" "#Action_Camera" "input_mode" "absolute_mouse" } } } }

Buradan da görebildiğiniz gibi StickPadGyro eyleminin yapı özeti şu şekildedir:
"BurayaEylemAdıGelecek" { "title" "#BurayaEylemEtiketiGelecek" "input_mode" "<analog_mode>" }

Bu yapıda kullanıcı tarafından değiştirilebilecek değerler "BurayaEylemAdıGelecek", "#BurayaEylemEtiketiGelecek" ve "<analog_mode>" olarak işaretlediğim değerlerdir. Bunlar sırasıyla eylemin Steam Girdisi API'ında kullanılacak dize adına, bu dosyanın localization kısmında kullanılacak yerelleştirme anahtarına ve analog verinin nasıl yorumlandığını ve işlendiğini yöneten Girdi Kaynağı Modu'na karşılık gelir.

"input_mode" özelliğinin StickPadGyro eylemleri için iki muhtemel değeri vardır:

  • "joystick_move"
  • "absolute_mouse"

"joystick_move"'u değerleri analog çubuğu olarak yorumlanan (merkezi bir noktadan sürekli yön saptırma) bir eylem için kullanmalı, "absolute_mouse"'u ise daha esnek ve çok amaçlı kullanıma sahip bir analog eylem için kullanmalısınız. Emin olmadığınızda "absolute_mouse"'u kullanın.

"joystick_move" ve "absolute_mouse"

FPS/TPS ya da imleç kullanan oyununuz için bir kamer girdisi oluştururken her daim "absolute_mouse" türünü kullanmanız gerektiğini ve deltalara fare gibi reaksiyon göstermenizi ne kadar söylesek azdır.

Çubuk bazlı girdileri API otomatik olarak hâlledeceği için eğer kameranız tam ölü bölgelere/yanıt eğrisine/vb. şeylere sahip bir analog çubuğa (PS4/Xbox tarzında) uygulansa bile çubuk girdisine ince ayar yapabilir, bahsi geçen özellikleri de varsayılan yapılandırmanızda belirleyebilirsiniz. Bunları yaptıktan sonra aynı girdi diğer analog çubuklarda, dokunmatik yüzeylerde veya hareket kontrolü jiroskoplarında (Steam ve PS4 kontrolcüsü) çalışabileceği gibi aynı zamanda ilerde gelecek olan fare desteğinde de çalışacaktır.

"joystick_move" temelli girdi yöntemini kameranız için kullanmamalısınız çünkü ters yöne atama yaparak pad/jiroskop/fare/hareket kontrolleri için işe yarar 1:1 oranında veri almak mümkün değildir.

Bu aynı zamanda imleç bazlı girdilere de uygulandığı için "absolute_mouse"'u imleç olarak çubuk bazlı girdilerde sorunsuz olarak kullanabilir, böylece, olur da gereksinim duyarsanız, kendi çubuk bazlı imlecinizi oluşturmakla uğraşmak durumunda kalmazsınız.

İsteğe bağlı olarak analog verinizin beraberinde düşük seviye fare etkinlikleri de gönderebilirsiniz. Oyununuz bu fare etkinliklerini, işletim sisteminiz tarafından oluşturulan fare etkinliklerinden ayırt edemez. Bunu, "os_mouse" değerini ekleyip ardından buna 1 değeri vererek yapabilirsiniz.

Örnek:
"StickPadGyro" { "Mouse" { "title" "#Action_Mouse" "input_mode" "absolute_mouse" "os_mouse" "1" } }


AnalogTrigger Eylemleri
AnalogTrigger eylemleri, tetiklere atanabilen 1-D analog eylemleridir. Silah ateşlemek veya "nişan alma" modu için tetiğin basit eşiğini kullanıyorsanız, kullanıcıların tekrar tuş ataması yapmalarında esneklik sağlamak için AnalogTrigger eylemi yerine bir buton eylemi kullanmak isteyebilirsiniz.

AnalogTrigger eylemlerinde, tuş atama arayüzünde yapılandırılabilir bir ölü alan vardır ve 0 - 1.0f değerleri arasında ölçeklendirilebilir. Nintendo Switch Pro kontrolcüsü gibi dijital tetik butonlarına sahip kontrolcüler 0 veya 1,0 gönderir. Bu yüzden oynanış kodunuzun zamanla kademeli tetik değişikliklerine bağlı olmadığından emin olmak isteyebilirsiniz.

AnalogTrigger eylemlerinin basit bir biçimi vardır. Anahtar olarak eylem adı ve değer olarak yerelleştirme belirteci kullanılır. Örnek:
"AnalogTrigger" { "AccelerationAxis" "#Action_Accelerate" "BreakingAxis" "#Action_Brake" }

Button Eylemleri

Buton eylemleri, eylem adını ve yerelleştirme belirtecini kullanan benzer bir biçime de sahiptir:
"Button" { "dijital_eylem_1_adı_buraya" "#BurayaDijitalEylem1BaşlığıGelecek" "dijital_eylem_2_adı_buraya" "#BurayaDijitalEylem2BaşlığıGelecek" }

Eğer gerekirse, eylemle birlikte tetiklenecek yerel düşük seviye bir girdi donanım etkinliği de (yerel fare tıklaması gibi) tanımlayabilirsiniz. Bu bazı nadir durumlarda oldukça işe yarardır. Örneğin eğer oyununuzun titiz, yedi katmanlı bir girdi yığını varsa ve bu yığın, uygulama katmanınızdan gelen simüle edilmiş fare etkinliklerine hiçbir zaman doğrudan işletim sistemi tarafından üretilenlere davrandığı gibi davranmıyorsa, bunu kullanabilirsiniz.

"Button" { "simple_click" "#simple_click" "fancy_click" "#fancy_click, mouse_button LEFT" }

Bu, her "fancy_click" eylemi tetiklendiğinde oyunun, işletim sistemi seviyesinde gibi gerçek bir sol fare butonu etkinliğinin üretmesini sağlar.

Uyarı!

Bu numarayı, eylemleriniz için bazı sabit girdi atamalarını zorlamak için asla kullanmamalısınız. Öbür türlü bu, "girdiler değil eylemler" yaklaşımını ve kullanıcıya kendi yapılandırmaları üzerinde tam kontrol verme maksadını bertaraf eder. Eğer bu özelliği birkaç nadir durumu düzeltmek dışında çok sık kullanıyorsanız, bu muhtemelen bu özelliği gereğinden fazla kullandığınızın bir işaretçisidir.

Eylem Seti Katmanları

Eylem setlerine ek olarak, bir eylem seti katmanı ile etkin eylem setine artımlı değişiklikler de ekleyebilirsiniz. Bu yöntem, genel bir moda özgü özellikleri yönetmek (örneğin, yaya kontrollerine bir keskin nişancı katmanı eklemek) veya bir oyun içi kullanıcı arayüzünün normal oynanış esnasında çıktığı durumları (oylama ekranları gibi) yönetmek için kullanılır. Katmanlar kendi bölümlerinde tanımlanır, örneğin:
"action_layers" { "IngameModalLayer" { "title" "#Layer_IngameModal" "legacy_set" "0" "set_layer" "1" "parent_set_name" "InGame" "AnalogTrigger" { } "Button" { "Modal_Accept" "#Action_Modal_Accept" "Modal_Decline" "#Action_Modal_Decline" } } }

Yerelleştirme


Ana IGA dosyasında, eylem seti tanımlarıyla birlikte bir yerelleştirme kısmı da yer almalıdır. Yerelleştirme objesinin tekil bağımlı objeleri, Steam'in desteklediği dil dizelerinden birinde olacaktır. En azından bir adet eylem adlarını içeren İngilizce bir blok eklediğinizden emin olun.

"localization" { "english" { "move" "Move" "camera" "Camera" } }

Özelliklerin adları, bir önceki kısımlarda belirtilen yerelleştirme anahtarlarıyla eşleşmelidir ama "#" karakterini içermemelidir.

İlave dil eklemek için yapmanız gereken tek şey her girdi için yerelleştirilmiş metne sahip bir dil bloku eklemektir:

"localization" { "english" { "move" "Move" "camera" "Camera" } "spanish" { "move" "Mover" "camera" "Cámara" } "norwegian" { "move" "Bevege" "camera" "Kamera" } }
Her dilin belirteci, "API dil kodu" değeri ile eşleşmelidir. Ör.: Basitleştirilmiş Çince için "schinese". Desteklenen tüm dillerin listesine buradan ulaşabilirsiniz.

Steam'in IGA Dosyalarınızı Kullanma Şekli


Oluşturduğunuz ana IGA dosyası sadece geliştirme esnasında kullanılacaktır (ama bu dosya yine de kaydedilmeli, kontrol edilmeli, sürüm kontrolünüzde saklanmalı vb.). Geliştirme süreci esnasında oyununuz için resmî bir yapılandırma oluşturduğunuzda, Steam istemcisi ana IGA dosyanızı başlangıç şablonu oluşturmak için kullanır.