Modül sistemin içine;
Merhaba.Bu dersimizde,Modül sistem dosyalarının ne olduğuna,neye yarayacağına bakacağız.
4 tane dosya türü vardır modül sistem de.Bunlar;
Header_
ID_
Module_
Process_
Dir.
-Ne işe yarar bunlar ?
+Bu dosyalarda,kimisinde kod yazmak için gereken komutlar vardır.Kimisinde,yapılan komutları,kod yazmak için kullanılan dosyalar vardır,kimisinde de,Oyuna aktarması için gereken komutlar-dizilimler vardır.
-Bir kodcu olabilmek için,Hangi tür dosyadan başlamak gerek ?
+Header_ dosyalarından başlanması gerekir.Zaten,Header_ dosyalarını kavradımmı,geriye biraz mantık kalıyor.Onu da,öğrenci yavaş yavaş kavrıyor.
Gelelim bunların ne işe yaradığına.
Header_ dosyaları,Yazılan-yazılacak kodlar için temel bir işlev görürler.
Mesela,Oyuna başlar iken asker ile başlamak istiyorsunuz.
Örnek kod dan yola çıkalım;
Code:
(party_add_members, "p_main_party", "trp_khergit_lancer", 50),
Burada,gereken komut "(party_add_members," dir.Yani,Header_ dosyalarının içinde,bu komut var ki siz oyuna bu komut ile yanınızda asker ile başlıyorsunuz.eğer,o komut olmasaydı,belki de askerler ile başlama diye bir kavram olamazdı.
-Peki Header_ dosyalarını genişleten yani daha çok komut daha çok fonksiyon ve kavram ekleyen bir değişiklik varmıdır ?
+Evet var.Warband Script Enhancer dır kendileri.Büyük bir değişikliktir.Ateşli ok kavramı'nı eklemiştir mesela.
-Header_ larda ne komutları var ? mesela Header_operations Gözüme çarptı.Orada ne var ? mesela header_music gözüme çarptı.Onda ne var ?
Header_operations'da,Neredeyse yazılmış olan tüm kodların temelleri var.
Mesela bir kod örneği ile devam edelim;
En basitinden;
Code:
call_script = 1 # (call_script,<script_id>),
Burada ki call_script module_scripts de ki belirttiğiniz kodu çalıştırır.Yani,eğer bir menüyü tıkladığınızda bir krallıkla diğerinin savaş başlatmasını istiyorsanız,orada ki koddan yazmanız gerekecek.Mesela;
Code:
(call_script, "script_diplomacy_start_war_between_kingdoms","$Global Variable",":local variable"),
Gibi birşey olması gerek.
Burada ki global ve local variable'lar,değişkenler dir.Değişkenlerin ne olduğunu anlamak için;
Artizan said:
Değişkenler
Yerel değişkenler - ": variable " -
iki nokta üst üste) ile başlayan değişkenler, yerel değişkenlerdir. Bu değişkenler sadece belirtildikleri kod bloğunda(tuple) yer alır ve diğer kod bloklarında refere edilemezler. Öncelikle değişkenler kendileri daha önceden bir değer taşıyabilecekleri için bunlara 0 ya da başka bir değer verilmelidir. Alıntı(denden) işaretiyle kapatılırlar. Örn: “:agent_id”
Genel değişkenler - "$variable" - $(soru işareti) ile başlayan değişkenler, genel değişkenlerdir. Herhangi bir modül_x’in içerisinde refere edilebilirler. Varsayılan değerleri 0’dır. . Alıntı(denden) işaretiyle kapatılırlar. Örn: "$g_talk_troop"
Artizan'a Teşekkür ederim(z) sayesinde mancınık kodumun hatalarını biraz daha düzelttim.
Anlıyacağınız,Header_ dosyaları,yapılacak kodlar için gereken fonksiyonları içerir.Orta-yüksek seviyeli kodcular değişim yapabilir üzerinde.Acemi ler için
Önerilmez!
Öneri!!!
Yabancı forumda, Lav adlı üyenin yaptığı bir rehber var.Oyunda ki neredeyse tüm kodların komutlarını kapsayan header_operations'da ki komutların ne işe yaradığını açıklayan bir rehberi var.Eğer gerçekten kodcu olmak istiyorsanız,İngilizcenizin iyi olması gerekir!
İşte rehber;
http://forums.taleworlds.com/index.php/topic,213060.0.html
Size,bu rehberi indirmenizi şiddetle tavsiye ederim.Bir kod yazacağınız zaman bunların aklınızda kalması gerekir.
Module_ dosyaları,Header_ dosyalarında yazılan komutların burada test edilmesi gibi biryerdir.Yani,bir çeşit laboratuar gibi düşünün.Yaptığınız şeyi,burada deniyorsunuz.Bu dosyalarda,header da eklenmiş olan fonksiyonlar eklenir.
Mesela;
("spawn_cannon",
[
(store_script_param, ":position", 1),
(store_script_param, ":team", 2),
(store_script_param, ":prop", 3),
(try_begin),
(eq,":prop","spr_art_mangonel"),
(copy_position,pos52,":position"),
(call_script,"script_get_next_unused_instance",":prop"),
kırmızı olan,Script'in adıdır.Bunu,başka module_ dosyalarında yaptığınız değişikleri çağırmak için kullanacaksınız.Yani aktive etmek için.
Yeşil,Header_operations'da eklenen bir komuttur.gördüğünüz üzere,"denenen komutlardır" dediğimde yalan dememişim
Kahverengi,Bir sıranın başlangıcı dır.
Mesela;
Code:
(try_begin),
(store_div, ":castle_prosperity", ":total_prosperity", ":total_villages"),
(else_try),
(assign, ":castle_prosperity", 50),
(try_end),
Burada ki (try_begin), bir sıra başlatır.Altta belirttiği komutu yapmasını ister.
else diye bir konu da vardır python da.Eğer o olmazsa anlamında dır.
Orada ki (else_try), da,eğer üstünde ki kod bozulur-çalışmazsa diye,alternatif eklenen bir komut dizisidir.
(try_end), ise,o komut dizisinin bittiğini gösterir.yani anlıyacağınız,burada ki try_begin,bir cümleye başlarken ki büyük harf,else_try,devam eden cümlenin virgülü,try_end ise de nokta işlevi görür.
Burada söylediğim tüm komutlar,Header_operations'da mevcuttur.Size verdiğim linkte ki rehberi incelemiş iseniz daha çabuk kavramışsınızdır.
ID_ ler.Bunlar,biraz karışıklar.Silerseniz,modül sistem hata verir.Ancak bunları yeniden yazar.Burada,kullanılan-yaratılan tüüm kodların-bunlara verilen isimlerin-bunlara verilen terimlerin,kimlikleri vardır.sıra ile devam ederler.0 dan başlayarak,sonsuza kadar uzanabilirler.Ayrıca,bazı yerlerde script_<script_id> veya itm_<item_id> gibi şeyler oluyor.O baştaki etiketler,onların türlerini söyler.Buna fazla takılmayalım.İleride anlatacağım.
Örneğin module_animations ile ID_animations a bir göz atalım;
Module animations'un başında şu animasyon var;
Code:
["stand", 0, amf_client_prediction,
# [3.0, "myanim", 0, 50, arf_cyclic|arf_loop_pos_0_25],
[3.0, "anim_human", 50, 52, arf_use_stand_progress|arf_cyclic, 0, (0, 0, 0), 0.25],
[3.0, "anim_human", 60, 62, arf_use_stand_progress|arf_cyclic, 0, (0, 0, 0), 0.75],
[3.0, "anim_human", 70, 72, arf_use_stand_progress|arf_cyclic, 0, (0, 0, 0), 0.25],
[3.0, "anim_human", 80, 82, arf_use_stand_progress|arf_cyclic|arf_two_handed_blade, 0, (0, 0, 0), 0.5],
## [35.0, "stand_woman", 0, 1059, arf_use_stand_progress|arf_cyclic|arf_two_handed_blade, 0, (0, 0, 0), 0.5],
## [43.0, "stand_woman_public", 0, 1313, arf_use_stand_progress|arf_cyclic|arf_two_handed_blade, 0, (0, 0, 0), 0.5],
# [35.0, "tavern_stand", 0, 472, arf_cyclic|arf_loop_pos_0_25],
],
Orada başta ki ["stand", yazısına dikkat edin.ve ID_Animations'a bakalım;
gördüğünüz gibi,başta anim stand animasyonu var.Tıpkı module_animations da başta olan o stand animasyonu gibi.
burada,gözünüze karışık gelen birşey var.
-Burada ki bazı dosyaları açtım,kimisinde script_blabla kimisinde mt_blabla kimisinde snd_blabla var.Bunlar ne oluyor ?
+bunlar,o yazılan kodların sınıflarını gösterir.Mesela,snd olan,sesler sınıfında,mst olan mission template sınıfında dır.Bunların açıklamaları için Artizan'a bir kez daha teşekkür ederim!;
Artizan said:
Module System Ön ekleri
Modül sistem içerisinde(örn; module_mission_templates), bir koda veya diğer modül dosyalarında bulunan bilgilere kodun önüne, ön ek(prefix) koyarak çağırılabilir.
- module_animations: "anim_"
- module_factions: "fac_"
- module_info_pages: "ip_"
- module_items: "itm_"
- module_map_icons: "icon_"
- module_game_menus: "menu_"
- module_meshes: "mesh_"
- module_mission_templates: "mst_"
- module_particle_systems: "psys_"
- module_parties: "p_"
- module_party_templates: "pt_"
- module_pstfx_params: "pfx_"
- module_presentations: "prsnt_"
- module_quests: "qst_"
- module_scene_props: "spr_"
- module_scenes: "scn_"
- module_scripts: "script_"
- module_skills: "skl_"
- module_sounds: "snd_"
- module_strings: "str_"
- module_tableau_materials: "tableau_"
- module_troops: "trp_"
Bu yukarıda kiler,ID_ dosyalarında yine module_ dosyalarında kullandığınız kodun türünü belirlemek için varlardır.
Yani itm_ yi silerseniz,modül sistemin temelini bunu yok sayacak şekilde değiştirmezseniz,o itm_ yi eklemediğiniz için cmd ekranında hata deniziyle baş başa kalırsınız
Son olarak,Geldik Process_ dosyalarına.
Process_dosyaları,kesinlikle ve kesinlikle Usta kodcular için düzenlenmeye açıktır.Tamamıyla gerçek bir python dilinden yazılmıştır.isterse,usta bir kodcu bu modül sistem dilini şaşırtabilir.Mesela warning vermemesi için variable_uses gibi şeyleri dikkatlice silebilir.Böylece hem warning vermez,hemde işi kolaylaşır düşüncesindeyim.Ayrıca,Usta kodcular isterse farklı python dosyalarını,gereken module_ dosyalarına ,importlayabilirler.Böylece module_ dosyalarına şunu şuraya ekleyecem de çok uzun sürecek derdi olmaz.Yani,mod birleştirme(modmerger) deniyor buna.Yabancı forumda araştırırsanız daha iyi bir kaynaktan yardım alırsınız o konuda
bir kodu siz manuel olarak eklemek istemiyorsanız ne yaparsınız ? ben şahsen ayrı bir modül dosya türü yapıp,ait olması gereken yere importlarım.böylece kısa yoldan oyuna özellik eklemiş olurum.
Neyse.Nerede kalmıştık,evet.Bu dosyalar gerçek python ile yazılmıştır.
Mesela;
Code:
print "Exporting scripts..."
save_python_header()
variable_uses = []
variables = load_variables(export_dir, variable_uses)
Burada,
print,build module ye tıkladığımızda,herşeyi hatasız yaparsak gelen şeydir.exporting scripts der.Bunu türkçe harf kullanmama şartına bağlı kalarak çevirebilirsiniz türkçeye.Mesela "Script ler Ihrac ediliyor..." gibi olması gerek.
save_python_header() hiç bir fikrim yok.
variables = load_variables(export_dir, variable_uses) demiştim ya usta bir kodcu isterse değişkenleri modüle tanıttırmayabilir diye.Sanırım o buradan yapılıyor.Onun da yabancı forumda konusu var.Belendor'un yabancı forumda ki mod dersleri linkine bakarsanız "Engine" kısmında,bulabilirsiniz.
bu process de,birçok şey yapılabilir.ama,bu bizim modülde yaptığımız değişiklikleri
eski txt dosyalarının üzerine yenilerini kaydetmesi için sınırlandırılmıştır.Bana göre
Okuduğunuz için teşekkür ederim.Hatalarım var ise düzeltmem gereken yerleri kibar bir şekilde belirtiniz.