HoI4 - Yılbaşı ve Modlama - Duman - 21-12-2017
Bu haftaki Hearts of Iron IV geliştirici günlüğünün konusu yılbaşı ve modlama.
https://forum.paradoxplaza.com/forum/index.php?threads/hoi4-dev-diary-christmas-modding.1061526/ :Herkese merhabalar. Yılın yine o güzel zamanına geldik, normal ve şanslı insanlar hediyeler seçer eggnog içerken biz oyun geliştiricileri olarak yeni yıl için bazı şeyleri yetiştirmeye çalışıyoruz. Bunun bu zamana kadar yazılmış en uzun geliştirici günlüğünü yazmak için de güzel bir zaman olduğunu düşündük ve kaleme sarıldık, ancak ilk olarak sizlere yaptığımız ucubemsi yılbaşı görselini paylaşmak istiyoruz.
Cuma gününden itibaren yılbaşı tatiline giriyoruz, önümüzdeki hafta yayınlanmak üzere bir günlük ayarladık ancak tam anlamıyla Ocak ayında asıl günlükler ve Waking the Tiger üzerinde çalışmaya geri döneceğimizi söylemek mümkün. Haftaya Stellaris'in proje şefi Jamor (kendisi aynı zamanda çılgın bir 2. Dünya Savaşı hastası) sizlere Alman ordularındaki tümen isimlendirmeleriyle ilgili bir günlük yazacak. Kendisi bu yeni isimlendirme mekaniğini Almanya'ya uygulamamızda bize ciddi derecede yardımcı oldu.
Kalemi modlamaya dair yenilikleri aktarmak üzere Havebeard'a aktarıyorum, eğer modlama hususu ilginizi çekmiyorsa günlüğün geri kalanı biraz fazla teknik gelebilir o sebeple aşağıdaki şeyleri sizin için özetleyeyim: Bu değişikliklerle birlikte 1.5 Cornflakes yamasıyla birlikte mod ekipleri çok daha güzel şeyler ortaya çıkarabilecekler.
----
Merhabalar ben Havebeard. Bu günlükte sizlere modcular için oluşturduğumuz yeni script özelliklerinden bahsedeceğiz. Tekrar uyarayım, yazılanlar bu meselelere fazla aşina olmayanlar için fazla teknik olabilir.
Decisionlar
Oyundaki decision sistemini geçtiğimiz geliştirici günlüklerinde tanıtmıştık, aşağıda bu sistemi nasıl modlayabileceğinizden bahsedeceğim.
Oluşturabileceğiniz en basit decision şu şekilde:
Kod: christmas_presents = {
more_guns = {
}
}
Bunu common/decisions içerisindeki .txt dosyasına yerleştirmeniz gerek, tüm decisionların bir kategorisi olması gerekiyor ve yukarıda gördüğünüz decision'un kategorisi christmas_presents.
Bunu da common/decisions/categories klasörüne şu şekilde eklediğinizde:
Kod: christmas_presents = {
}
Oyunda böyle bir şeyle karşılaşacaksınız:
Koddan da anlayabileceğiniz gibi, bu decisionu geçirmek için hiçbir şart yok ve decisionu geçirdiğinizde hiçbir şey kazanmıyorsunuz. More_guns yazısı itibariyle tıkladığında silah kazanacağını düşünen birisi için bu büyük bir hayalkırıklığı, gelin bunu düzeltelim.
Etkiler
Bir decisiona etki eklemek aşağıdaki gibi yapılıyor:
Kod: complete_effect = {
add_equipment_to_stockpile = {
type = infantry_equipment_1
amount = 1337
}
}
Şartlar
Bir decisionun geçirilmesi için şartı dilerseniz direkt olarak o decisiona dilerseniz decisionun kategorisine ekleyebilirsiniz.
Kod: available = {
has_country_flag = santa_podcat
}
Oyuna bir başka invite_santa isminde decision ekliyoruz ve bu flag'ı o decisiona bağlıyoruz. Bu yeni decisionu geçirmeye de maliyet ekleyelim, bu maliyet politik güç:
Yüzlerce decision yaptığınızda oyundaki pencerenin gerek ideolıojiniz gerek ülkeniz gerek başka sebeplerle asla geçiremeyeceğiniz bir ton decisionla dolduğunu görebilirsiniz, işte burada devreye visible triggerı giriyor. Bu trigger bir ülkenin hangi decisionları görebileceğini belirliyor.
Yerelleştirme
Hem kategorileri hem de decisionlara isim ve tanım oluşturabilirsiniz.
Kod: christmas_presents:0 "Christmas Presents"
christmas_presents_desc:0 "To fight off the cold and the dark we need to gather christmas present."
invite_santa:0 "Invite Santa"
invite_santa_desc:0 "In the darkest of times there is only one place to turn. Ask Santa Podcat for gifts."
Aynı zamanda oyun içerisinde değişkenler kullanabilirsiniz örneğin [Root.GetLeader] gibi.
Bunları yaptıktan sonra decisionumuz şu şekilde görünmeye başladı:
Bazı decisionların tıklandıktan bir süre sonra daha arayüzde bulunmasını isteyebilirsiniz, bazılarının belli bir süre sonra tekrardan seçilebilir olmasını isteyebilirsiniz, bazıları ise sadece bir kere tıklanabilir olabilir. Bunu aşağıdaki şekillerde sağlarsınız:
Kod: days_remove = 5 #Stays for 5 days before being removed
days_re_enable = 5 #Will show up in the interface and can be selected again after 5 days
fire_only_once = yes #Will not re enable after being removed
Oyuna aynı zamanda bir decisionun silinmesiyle birlikte devreye giren etki ekleyebiliyorsunuz:
Kod: days_remove = 5
remove_effect = {
add_political_power = 50
}
Bunu yaptığınızda decision 5 gün sonra siliniyor, decision silindiğinde ülke 50 puan kazanıyor.
Modifierlar
Bir decisiona modifier bağlayabiliyorsunuz, bunu yaptığınızda decision arayüzde aktif oldukça o ülke bir modifier elde ediyor:
Kod: modifier = { political_power_gain = 1 }
Aşağıda kodumuzun son halini inceleyebilirsiniz:
Kod: christmas_presents = {
invite_santa = {
allowed = { tag = SWE }
available = {
date > 1936.11.30
date < 1936.12.25
}
visible = {
NOT = { has_country_flag = sadness_and_darkness }
}
fire_only_once = yes
cost = 42
complete_effect = {
custom_effect_tooltip = invite_santa_tt
set_country_flag = santa_podcat
}
}
more_guns = {
allowed = { tag = SWE }
available = {
has_country_flag = santa_podcat
}
visible = {
NOT = { has_country_flag = sadness_and_darkness }
}
modifier = {
political_power_gain = 1
}
days_re_enable = 5
days_remove = 5
remove_effect = {
add_political_power = 50
}
complete_effect = {
add_equipment_to_stockpile = {
type = infantry_equipment_1
amount = 1337
}
}
}
}
Hedefli Decisionlar
Diyelim ki iki ülkeyi etkileyen bir decision yapmak istediniz, burada oturup her ülke için teker teker kod yazmak yorucu olabilir. Bunun için hedefli decisionlar devreye giriyor.
FROM kullanarak farklı ülkelerdeki içeriği bu decisionlarda kullanabiliyorsunuz:
Kod: ruin_christmas = {
allowed = { tag = FIN }
target_trigger = {
FROM = {
OR = {
tag = SWE
tag = DEN
tag = NOR
}
}
}
available = {
FROM = { has_country_flag = santa_podcat }
}
complete_effect = {
declare_war_on = {
target = FROM
type = ruin_christmas
}
FROM = {
set_country_flag = sadness_and_darkness
}
}
}
Yukarıda gördüğünüz örnekte Finlandiya İsveç, Danimarka veya Norveç'te yılbaşını mahvetme decisionlarına sahip. Ayıp sana Finlandiya.
Burada decision görünümünde FROM'la referans gösterilen ülkelerin bayrağının görüntülendiğini görebilirsiniz, FROM'u target_trigger, available, visible, remove_effect, complete_effect ve ai_will_do kodlarıyla kullanabiliyorsunuz.
Bu hedefe de yerelleştirmede yer verebiliyorsunuz:
Kod: ruin_christmas:0 "Ruin Christmas for [From.GetNameDef]"
Notlar
target_trigger her ülke için kontrol edildiği için performans açısından zorlayıcı olabilir. Eğer spesifik bir ülke için targeted decision eklemek istiyorsanız bunu bir etki oluşturarak yapabilirsiniz:
Kod: activate_targeted_decision = { target = TAG decision = decision_to_activate }
Burada aynı şekilde aynı ülke için farklı bir hedefli decision oluşturabilirsiniz:
Kod: activate_targeted_decision = { target = FROM decision = decision_to_activate }
Görevler
Oyunda görevler decisionlarla aynı yerde, büyük oranda aynı şekilde oluşturuluyorlar. Bunları bir bakıma belli zaman aralığında bir şeyler başarmanızı bekleyen decisionlar gibi düşünebilirsiniz.
Kod: more_cake = {
allowed = { tag = SWE }
available = {
controls_state = 64 #THIS IS THE ACTUAL OBJECTIVE
}
activation = {
has_stability < 0.3 #This starts the mission
}
Is_good = no
days_mission_timeout = 3
fire_only_once = yes
timeout_effect = {
DEN = { annex_country = { target = ROOT } }
}
complete_effect = {
add_political_power = 1337
}
}
Burada İsveç'in düşük stability'e sahip olması görevin başlamasına sebep oluyor. Şartlar için available triggerı için gerekli olan koşullar yerine getirildiğinde complete_effect devreye giriyor.
Is_good efekti tooltipleri ve ilerleme barının rengini değiştiriyor.
Modifierların şimdilik görevlerle çalışmadığını ekleyelim, ileride o konuda bir ekleme yapabiliriz.
Yapayzeka
Savaşla sonuçlanan decisionlar oluşturmanızı önermiyorum ancak yapayzekaya bazı decisionlara dikkat etmesini söylemenizin birkaç yolu ar:
Kod: war_with_on_remove = TAG
war_with_on_complete = TAG
war_with_on_timeout = TAG
war_with_target_on_remove = yes
war_with_target_on_complete = yes
war_with_target_on_timeout = yes
ai_will_do diğer ulusal odaklarla aynı şekilde çalışıyor, yapayzeka çeşitli unsurları değerlendirip en yüksek puana sahip olanı seçiyor. Eğer bir decision ai_will_do ile scriptlenmemişse yapayzeka o decisionu geçirmez.
Custom Maliyetler
Bazı decisionlarda decisionun maliyetinin illa ki politik güç olmamasını isteyebilirsiniz, bu durumda custom cost triggerıyla decisionun oyuncuya neye mal olacağını belirleyebilirsiniz.
Kod: custom_cost_trigger = {
has_army_experience > 10
}
custom_cost_text = army_xp_more_than_10
Kod: army_xp_more_than_10:0 "§H10§!£army_experience"
army_xp_more_than_10_blocked:0 "§R10§!£army_experience"
army_xp_more_than_10_tooltip:0 "It costs 10£army_experience to select this."
custom_cost_trigger oluşturduğunuzda normal cost triggerı görmezden gelinir.
Toprakları Göstermek
Decisionun üzerine mouse getirildiğinde oyundaki bazı eyaletlerin parlamasını sağlayabilirsiniz. Sağ tıkladığınızda harita bu eyalete gidecektir.
Kod: highlight_states = { state = 64 }
Kategori Sıralama
Kategoriler belli öncelik sıralamasına göre sıralanabilir, örneğin:
Kod: christmas_presents = {
priority = {
base = 0
modifier = {
add = 10
has_country_flag = christmas_time
}
}
}
İkonlar ve Resimler
picture=picture_name
GFX_decision_cat_picture_name'e bakar.
icon=icon_name
GFX_decision_icon_name'e bakar.
Hedefli Görevler
Hedefli decisionlarla aynı şekilde çalışırlar ancak days_mission_timeout scriptlenmişse decision değil görev olarak görünürler.
Bu sistemle yapabileceğiniz çok sayıda şey var ve bunların büyük bir kısmından bahsettim, aklınıza takılan bir şey olursa Paradoxplaza'da günlüğe yorum olarak sorabilirsiniz.
Yeni Script Özellikleri
Ekipte script odaklı çalışma yapanlar için diğer PDX oyunlarından farklı özelliklerin Hearts of Iron'a aktarılması her zaman güzel bir duygu.
shultays bu script geliştirmesi aşamasında büyük efor sarfetti ve variable oluşturulmasını sağladı. İlk doğan erkek çocuğunuza onun adını verdiğinize emin olun.
Kod: set_variable = { a = 20 }
set_variable = { b = ROOT.political_power }
multiply_variable = { var = b value = 2 }
check_variable = { a > b }
Bu a için 20'ye, b için ise ROOT ülkenin politik gücüne göre değişkenlik gösterebilen bir değer ortaya çıkarıyor, ardından bu değeri katlayıp a'nın b'den büyük olup olmadığını kontrol ediyor.
Variable'lar flaglar gibi @ kullanarak isimlendirilebilir.
Kod: set_variable, add_to_variable, subtract_from_variable, multiply_variable, divide_variable, clamp_variable, has_variable, check_variable (compare = less_than, less_than_or_equals, greater_than, greater_than_or_equals, equals, not_equals)
Aynı zamanda chain scope yapabilirsiniz.
Kod: set_variable = { b = FROM.FROM.FROM.political_power }
Aynı zamanda "geçici" variablelar oluşturabilirsiniz, bu variablelar sadece trigger veya effect için geçerli olabilir. Bunun için set_temp_variable kodunu kullanmanız yeterli.
Variable'ları yerelleştirme üzerinde ? kullanarak tanımlayabilirsiniz:
Kod: Some_loc_key:0 "Value of a: [?Root.a]"
Bu oyunda "Value of a: 20" şeklinde görünecektir.
Aynı zamanda spesifik bir ideolojinin parti destek değerini şu şekilde gösterebilirsiniz:
party_popularity@democratic.
party_popularity veya political_power gibi variablelar oyunun başından itibaren bulunan ve sadece okunabilen variablelar, bunlar gibi bazı özel variablelarımız daha var ve muhtemelen gelecekte daha çok eklenecek.
Country: political_power, command_power, manpower, max_available_manpower, max_manpower, opinion, stability, modifier, party_popularity.
State: resistance, arms_factory_level, industrial_complex_level, infrastructure_level
Opinion da bu şekilde özel variablelardan:
Kod: set_variable = { var = eng_opinion_on_turkey value = ENG.opinion@TUR }
Variablelar global'i kullanmıyorsanız bulunduğunuz scope içerisinde depolanıyor.
İlk örnek a'nın 1'e ayarlanması üzerine, 64 numaralı eyalette.
İkinci örnek ise b'yi 1'e ayarlıyor ve global.
Kod: 64 = { set_variable = { a = 1 } }
set_variable = { global.b = 1 }
Eğer kendi variable'nızı political_power veya mevcut hazır başka variable'ın ismiyle isimlendirirseniz, oyunun bilgisayarınızı havaya uçurmasına sebep olabilirsiniz, gökten ateş yağabilir, İsveç İtalya'yı futbolda yenebilir ve ölüler dirilebilir.
Dolayısıyla öyle bir şey yapmayın.
Modlama yaparken birkaç saat boyunca ortaya güzel scriptler çıkarttıktan sonra aslında yaptığınız hiçbir şeyin çalışmadığını farkedebilirsiniz, (böyle bir durum bizim başımıza hiç gelmedi, o sebeple bir varsayım itibariyle yaklaşıyorum meseleye). Konsoldan list_vars komutunu girerek o ülke ve seçtiğiniz eyalet için geçerli variable'ları inceleyebilirsiniz, aynı zamanda seçmek istemiyorsanz argüman olarak o eyaleti ekleyebilirsiniz, örneğin:
list_vars ENG (İngiltere için geçerli variablelar)
list_vars 37 (Sjaelland için geçerli variablelar)
Variablelar birçok yerde basitçe sayı yazmanın yerine kullanılabilir.
Kod: add_political_power = 141.infrastructure_level
Bu kod İsveç'e Svealand bölgesindeki altyapı seviyesi kadar politik güç veriyor, yani pek bir şey verdiği söylenemez.
Kod: set_temp_variable = { a = 141.infrastructure_level }
multiply_variable = { var = a value = 20 }
add_political_power = a
Bunu düzeltmek için daha çok kod yazıp bu sefer İsveç'in Svealand'daki altyapı seviyesinin 20 katı politik güç almasını sağladık.
Yine elimize pek bir şey geçmedi.
Bunların flaglarla benzer şekilde çalıştığını farkedebilir, Paradox'un flagsız bir dünya için bu kadar uğraştığı sonucunu çıkarabilirsiniz.
Ancak flaglar performans açısından daha hafif, dolayısıyla bir şeyi flaglar aracılığıyla yapabiliyorsanız öncelikli olarak flaglarla yapmanız daha doğru.
shultays aynı zamandakonsola list_flags komutunu ekledi, dolayısıyla flaglarla eskisinden daha kolay çalışabilirsiniz.
Bu geliştirici günlüğü haddinden uzun oldu gibi ancak önümüzdeki yıl variable'lara dair modlama bölümünde daha ayrıntılı bilgi vermeye çalışacağız.
Scriptli Yerelleştirmeler
Bu özellik diğer oyunlarda da kullanılabiliyor dolayısıyla birçoğunuz için yeni bir bilgi olmayacak ancak bu özellik yerelleştirme dosyalarında kendi dinamik anahtarlarınızı oluşturmanızı sağlıyor:
Kod: defined_text = {
name = GetIsThisDiaryLong
text = {
trigger = {
always = yes
}
localization_key = YES_YES_YES
}
text = {
localization_key = NO
}
}
Bunu yaptığınızda lokalizasyonda [Root.GetIsThisDiaryLong] YES_YES_YES ile değiştiriliyor.
Kod: YES_YES_YES:0 “Maybe a little.”
İsim Listeleri
İsim listeleri aşağıdaki şekilde kodlanıyor:
Kod: GER_Inf_01 = {
name = "Infantry Divisions"
for_countries = { GER }
can_use = { always = yes }
division_types = { "infantry" }
# Number reservation system will tie to another group.
link_numbering_with = { GER_dog_divisions }
fallback_name = "%d. Infanterie-Division"
# Names with numbers (only one number per entry).
# It's okay to have gaps in numbering.
ordered =
{
1 = { "%d. Infanterie-Division" }
2 = { "%d. Infanterie-Division" }
3 = { "%d. Infanterie-Division" }
4 = { "%d. Infanterie-Division" }
Büyük oranda ne olduğu anlaşılıyor.
link_numbering_with o tümenlerin aynı numaralandırmayı paylaşacağı anlamına geliyor, can_use ile bunu limitlendirebiliyorsunuz:
Kod: name = "SS Divisions"
can_use = {
has_government = fascism
}
İstikrar ve Savaş Desteği
National Unity diye bir şey kalmadığı için modlarınızda set_national_unity ve add_national_unity kodlarını set_stability, add_stability ve war_support kodlarıyla değiştirebilirsiniz. national_unity_factor gibi şeyler eskisi gibi çalışıyor, sadece national_unity kısmını stability veya war_support olarak değiştirin.
Birim Lideri Scope'u
Oyuna aynı zamanda birim lider scope'u ekledik bunu tüm birimlerde (general, mareşal, amiral) trigger odaklı olarak kullanabiliyorsunuz.
random_unity_leader, enemy_unit_leader, random_army, every_army_leader, random_navy_leader, enemy_navy_leader kodlarını kullanabiliyorsunuz.
Bunlar üzerinde kullanabileceğiniz triggerlar için trigger_docs'u kullanabilirsiniz.
Örnek kullanım:
Kod: random_army_leader = {
limit = {
average_stats < 2
is_field_marshal = no
}
set_unit_leader_flag = some_flag
add_trait = useless_trait
}
Odak Ağacı
Eğer focus yerine shared_focus kullanarak odak ağacı kullanırsanız shared_focus = focus_id_here şeklinde bir başka odak ağacına belli parçaları ekleyebilirsiniz. Bu odak ve onun altında kalan tüm odaklar o ağaca eklenecektir.
Bu odakların ülkenin normal odak ağaçlarının üstünde görünmemesi için dinamik olarak pozisyon belirlemeniz gerek.
Kod: offset = {
x = -6
y = 0
trigger = {
tag = PRC
}
}
load_focus_tree= id_of_focus_tree oyuna eklediğimiz yeni etki, ülkenin odak ağacını spesifik olarak değiştirmenizi sağlıyor.
Hedefli Modifierlar
National spiritlerin hedefli modifierları olabilir, bu demek oluyor ki o modifier o ülkenin bir başka ülkeyle olan bağına göre devreye giriyor.
Örneğin bir ülkeye İsveç'le savaşırken atak ve defans bonusu verebiliriz:
Kod: targeted_modifier = {
tag = SWE
attack_bonus_against = 0.1
defense_bonus_against = 0.05
}
Eyalet Eventleri
state_event üzerinden bir eventi belirlediğinizde spesifik olarak o eyalet için o eventin gerçekleşmesini sağlayabilirsiniz.
Kod: state_event = { id = some_event.1 trigger_for = controller }
Harita-Dışı Binalar
Çin odak ağacının bir parçası olarak haritadışı fabrikalar için destek ekledik. Bunu çalışması için illa ki haritada olması gerekmeyen herhangi bir bina için kullanabilirsiniz.
Kod: add_offsite_building = { type = arms_factory level = 2 }
Bu bina sanki oyun içerisindeki bir binaymış gibi çalışıp, harita üzerindeki binalardan farklı olarak ele geçirilemiyorlar veya bombalanmıyorlar. Bunu silmek için negatif değer girmeniz gerekir.
Kod: add_offsite_building = { type = arms_factory level = -2 }
Bir yerde bulunmayan binayı silmeye çalışmanız tüm evren simulasyonunun resetlenmesiyle sonuçlanabilir bu sebeple bunu yapmazsanız seviniriz.
Umarım bu günlük oluşturduğumuz yeni sistemleri tanımanızda yardımcı olmuştur. Konsolda kullanabileceğiniz trigger_docs komutu her zaman dostunuzdur ve modlama bölümünde modlamayla alakalı sorularınızı sorabilirsiniz.
HoI4 - Yılbaşı ve Modlama - Feldmarschal - 21-12-2017
Modcuların işine yarıyacak bilgiler gerçi modcu olmayada gerek yok gayet güzel ve detaylı açıklama olmuş biraz bilen bile bişeyler yapabilir
HoI4 - Yılbaşı ve Modlama - Semavi7 - 22-12-2017
Dlc şubattan önce çıkmaz bence.
HoI4 - Yılbaşı ve Modlama - napolyon94 - 22-12-2017
Haftaya önden bir günlük yazdıklarına göre bu bir "2017 istatistikleri" olabilir.
HoI4 - Yılbaşı ve Modlama - Duman - 22-12-2017
Alman birimlerinin isimlendirmesinden bahsedilecekmiş tarihsel açıdan doyurucu bir günlük olması bekleniyor. Stellaris'in proje şefi WW2 Almanya nerd'u anladığım kadarıyla.
|