Mod Sistemi Dersleri (Yeni konular eklendi)

Users who are viewing this thread

Status
Not open for further replies.

karka

Evet arkadaslar; bundan boyle bu baslik altinda, Winter'in  Module System Documentation forumlarinda olusturmakta oldugu Mod Sistemi Dokumanlarini Turkce'ye hep birlikte cevirecegiz. Tum modul sistemini bitirdigimizde, elimizde tam tesekkulu bir Turkce dokuman olacak. Bu sayede simdiye kadar pek fazla katkimizin olmadigi mod topluluguna da katkilarimizin artacagini umuyorum.

Dokumanlarin orijinallerini http://forums.taleworlds.com/index.php/board,12.0.html adresinde bulabilirsiniz.

Sistem soyle isleyecek: Konunun bu ilk mesaji henuz Turkce'ye cevrilmemis bolumlerin bir listesini icerecek. Ceviride gorev almak isteyen arkadaslar, cevirmek istedikleri bolumu, bu konu altina mesaj ekleyerek bize soyleyecekler ve ben de soz konusu bolumun uzerini cizecegim. Ceviriyi yapacak arkadas isi bittiginde; cevirmek istedigi bolumu bildirdigi mesajini degistirerek, icerigini yapmis oldugu ceviri ile guncelleyecek. Her "Part" bittiginde, ben o ana kadar girilmis olan tum cevirilieri derleyip, toplu bir dokuman haline gtirecegim.

Gorus, oneri ve sorulariniz icin lutfen http://forums.taleworlds.com/index.php/topic,11925.0.html adresini kullaniniz.

Bu islem icin Winter'dan ve armagan'dan izin alinmistir.

CEVIRI YAPACAKLARIN DIKKATINE: Tam olarak karsilik bulamadiginiz ya da, buldugunuz karsiligin "sirittigini" dusundugunuz durumlarda kelimenin Inglizce'sini parantez icinde belirtin. Dokumanin nihai halini hazirlarken, hepsini dikkate alip belirli bir format oturtacagim. Sizin iciniz rahat olsun.

CEVIRI YAPMAYACAKSANIZ BU KONUNUN ALTINA MESAJ GIRMEYINIZ!


Part 1'i cevirmekle ise baslayacagiz. Part 1 bolumlari soyle:

1.1 What is the Module System? (marsec) [Git]
1.2 Requirements for using the Module System (marsec) [Git]
1.3 Obtaining the Module System (marsec) [Git]
1.4 Module Sytem Files (marsec) [Git]
1.5 Creating a new module (marsec) [Git]

Part 1 dokumanlarinin orijinallerini http://forums.taleworlds.com/index.php/topic,5408.0.html adresinde bulablirsiniz.



Part 2 ile devam ediyoruz o halde. Part 2 bolumleri soyle:

2.1 Editing the Module Files (zgf) [Git]
2.2 Adding New Game Objects (zgf) [Git]
2.3 Referencing Game Objects (karka) [Git]

Part 2 dokumanlarinin orijinallerini http://forums.taleworlds.com/index.php/topic,11422.0.html adresinde bulablirsiniz.



Part 3 bolumleri soyle:

3.1 Breakdown of Module_Troops (zgf) [Git]
3.2 Upgrading Troops (sencer) [Git]
3.3 Adding New Troops (sencer) [Git]
3.4 Mercenaries (Büyüteç) [Git]
3.5 NPCs (karka) [Git]
3.6 Merchants (zgf) [Git]

Part 3 dokumanlarinin orijinallerini http://forums.taleworlds.com/index.php/topic,11902.0.html adresinde bulablirsiniz.



Part 4 bolumleri soyle:

4.1 Breakdown of Module_Party_Templates (marsec) [Git]
4.2 Personality (Büyüteç) [Git]
4.3 Creating New Templates (Büyüteç) [Git]

Part 4 dokumanlarinin orijinallerini http://forums.taleworlds.com/index.php/topic,12203.0.html adresinde bulablirsiniz.



Part 5 bolumleri soyle:

5.1 Breakdown of Module_Items (Diabelica) [Git]
5.2 Damage Types (Diabelica) [Git]
5.3 Creating An Item (JustSetMeFree) [Git]
5.4 Item Stats

Part 5 dokumanlarinin orijinallerini http://forums.taleworlds.com/index.php/topic,12372.0.html adresinde bulablirsiniz.



Artık çalışmayan rapidshare linkleri kaldırıldı. -Ativan
 
1.1 Modul Sistemi nedir?
Mount&Blade Modul Sistemi oyun icin icerik yaratmaniza ya da var olan icerigi degi$tirmenize yarayan bir Python script setidir. Bu ayni zamanda bizim de resmi versiyon icerigi uzerinde cali$irken kullandigimiz sistemdir. Modul sistemini kullanarak yeni birim (troop) ce$itleri, yeni karakterler, yeni questler, yeni diyaloglar vb. ekleyebilir ya da varolan icerik uzerinde degi$iklikler yapabilirsiniz.

$unu belirtmekte fayda var ki; Mount&Blade, Python kullanmaz ve modul sistemindeki python scriptlerinin iceriklerini direkt olarak okumaz. Bunun yerine, bu scriptler cali$tirilarak Mount&Blade'in icerigini kullandigi text dosyalari yaratilir.

Mount&Blade gercekte icerigini Mount&Blade/Modules altindaki text dosyalarindan alir. Yani *teorik olarak* istediginiz butun degi$iklikleri bu text dosyalari uzerinde oynama yaparak gercekle$tirebilirsiniz (Gercekten de bazi mod yapimcilari bu dosyalari nasil kullanacaklari uzerine cali$mi$ ve kendi ba$larina $a$irtici modlar yaratmi$lardir). Ancak bu text dosyalarinin okununulabilirligi/anla$ilirligi cok zor oldugu icin uzerlerinde cali$mak hic de pratik degildir. $u an yeni moduller yazmak icin iki secenek var. Birincisi, bu dokumanda bahsedilen resmi modul sistemi. Ikincisi ise Effidian'in resmi olmayan editoru. Bu editor grafik arayuzune sahip oldugu ve resmi modul sisteminden daha kullani$li oldugu icin M&B'i nasil modlayacaklarini ogrenmek isteyen yeni kullanicilar icin harika bir arac. (Ekleme: Effidian'in editoru bir suredir geli$tirilmedigi icin herhangi bir destek sunulmamakta, ve yeni versiyonlarla [.751'den itibaren] uyumlu cali$mamaktadir - Marsec)


1.2 Modul Sistemini kullanmak icin gerekenler
Modul Sistemi Python scriptlerinden olu$ur, bu yuzden onlarla cali$abilmek icin sisteminizde Python'un yuklu olmasi gerekir. Python.org'un download sayfasindan Python'u edinebilirsiniz:
http://www.python.org/download/
Ilgili sayfada bir cok download linki olsa da, sizin ihtiyac duyacaginiz tek $ey en guncel Windows Installer.

Python'u download edip sisteminize kurdukten sonra, ayni zamanda Python'u kendi ortam degi$keni tanimlamaniza/lokasyonunuza (path environment variable) eklemeniz gerekir. Bu kisim onemli oldugu icin devam etmeden once duzgun olarak ayarlama yaptiginizdan emin olun.

Windows 9x i$letim sistemli konfigurasyonlar icin, autoexec.bat dosyanizda degi$iklik yapip python dizininizi "path" degi$kenine ekleyebilirsiniz. Ornegin, eger Python'u C:\Python24 dizinine kurduysaniz, autoexec.bat dosyaniza a$agidaki satiri ekleyin:
set PATH=C:\Python24;%PATH%

Eger Windows XP kullaniyorsaniz, i$lem biraz daha degi$ik: Bilgisayarim (My Computer) uzerine sag tiklayin, Ozellikler (Properties)'i secin, Geli$mi$ (Advanced) tabina gectikten sonra da Ortam Degi$kenleri (Environmental Variables) butonuna tiklayip; Path degi$kenine python dizininizi ekleyin (Ornegin, ";C:\Python24").


1.3 Modul Sistemine eri$mek
Modul Sistemi'nin en son versiyonu resmi web sayfasindan download edilebilir:
www.taleworlds.com/mb_module_system.html

Modul Sistemi icin zip dosyasini download etmeli ve acmalisiniz. (Bu dokuman boyunca dosyanin icerigini "D:" surucusune actiginizi varsayiyorum, bu yuzden butun dosyalar "D:\ModuleSystem" altinda olmali. Ama tabii ki dosyalari istediginiz yere acabilirsiniz)


1.4 Modul Sistemi dosyalari
$imdi modul sistemi icindeki dosyalara bir goz atalim. Asil Phyton dosyalarina (.py ile bitenler) baktigimizda dort ce$it dosya oldugunu goruyoruz.
  • header_ ile ba$layan dosyalar
  • process_ ile ba$layan dosyalar
  • ID_ ile ba$layan dosyalar
  • module_ ile ba$layan dosyalar
Ilk iki ce$it dosya modul sisteminin cali$masi icin gerekli, bunlar uzerinde kesinlikle oynama yapmamalisiniz. Ucuncu ce$it dosyalar (ID_) modul derlenirken olu$an gecici dosyalardir. Isterseniz silebilirsiniz, ama modul sistemi bu dosyalari tekrar olu$turacaktir. Son dosya ce$idimiz (module_) asil icerik bilgisinin tutuldugu dosyalar, yani bunlar uzerinde oynama yapacaksiniz.


1.5 Yeni bir modul olu$turmak
Daha ilerisine ba$lamadan once, ilk olarak yeni modulunuz icin bir dizin olu$turalim. Bunun icin oncelikle Mount&Blade/Modules dizinine gitmemiz gerekiyor (varsayilan olarak bu dizin "C:/Program Files/Mount&Blade/Modules" 'tur). Bu dizin altinda Native isminde bir alt dizin olmali, bu bizim oyunumuzun resmi (yani modlanmami$) hali. Kendi modulunuz icin burada yeni bir alt dizin olu$turmali ve Native dizininin icerigini buraya kopyalamalisiniz. Bu yeni dizin sizin kendi modul dizininiz olacagi icin istediginiz $ekilde adlandirabilirsiniz. Basit olmasi acisindan, isminin MyNewModule olacagini varsayiyorum.

Bu adimi dogru yapip yapmadiginizi kontrol etmek icin Mount&Blade'i cali$tirabilirsiniz. Bu andan itibaren Mount&Blade'in ba$langic penceresi hangi modulu oynamak istediginizi secebileceginiz bir combo box icerir hale gelmeli. Bu menuden kendi modulunuzu secmeyi deneyerek yeni bir oyun ba$latin. Native dizininin icerigini yeni modulumuze kopyaladigimiz icin, oynadigimiz oyun Native'in aynisi olacaktir.

Bu a$amadan sonra, modul sistemimizin hedef olarak bu yeni dizini kullanmasini saglamaliyiz. Bunu yapmak icin module_info.py dosyasini uzerinde degi$iklik yapmak icin acin (dosya uzerine sag tiklayip "Edit with IDLE" secenegini secin ya da notepad vb. tercih ettiginiz metin editorunuzle acin) ve export_dir satirini kendi yeni dizininizi gosterecek $ekilde degi$tirin. Ornegin modulunuz icin yarattiginiz dizinin konumu c:/Program Files/Mount&Blade/Modules/MyNewModule ise, bu satiri a$agida goruldugu gibi degi$tirin:

Code:
export_dir = "C:/Program Files/Mount&Blade/Modules/MyNewModule/"

Bu andan itibaren modul sistemimizin kurulumu tamamlanmi$ olmali. Denemek icin, yeni modul dizininiz icindeki conversation.txt dosyasini silin ve build_module.bat dosyasi uzerine cift tiklayin. Bunu yaptiginizda a$agidaki gibi cikti veren bir komut satiriyla kar$ila$maniz gerekiyor:

Code:
D:\ModuleSystem>python process_strings.py
Exporting strings...

D:\ModuleSystem>python process_items.py
Exporting item data...

D:\ModuleSystem>python process_map_icons.py
Exporting map icons...

D:\ModuleSystem>python process_factions.py
Exporting faction data...

D:\ModuleSystem>python process_scenes.py
Exporting scene data...

D:\ModuleSystem>python process_troops.py
Exporting troops data

D:\ModuleSystem>python process_party_tmps.py
Exporting party_template data...

D:\ModuleSystem>python process_parties.py
Exporting parties

D:\ModuleSystem>python process_quests.py
Exporting quest data...

D:\ModuleSystem>python process_scripts.py
Exporting scripts...

D:\ModuleSystem>python process_mission_tmps.py
Exporting mission_template data...

D:\ModuleSystem>python process_game_menus.py
Exporting game menus data...

D:\ModuleSystem>python process_dialogs.py
exporting triggers...
exporting dialogs...

D:\ModuleSystem>pause
Press any key to continue . . .
$imdi yeni modul dizininizi kontrol edin. Eger her $ey yolunda gittiyse burada yeni bir conversation.txt dosyasi olmali.

Eger bir hatayla kar$ila$tiysaniz, bu dokumandaki butun adimlari tam olarak uyguladiginizdan emin olun. Eger uygulami$ olmaniza ragmen hata aliyorsaniz, lutfen forumdaki Search butonu vasitasiyla arama yapin; buyuk ihtimalle bir ba$kasi ayni problemle kar$ila$mi$ ve cozum yolu daha onceden yazilmi$tir.

Eger hatayla kar$ila$madiysaniz, tebrikler! Mount&Blade modul sistemiyle kendi modulunuzu yaratmak icin tamamen hazir durumdasiniz. $imdi, Bolum 2'ye gecelim.
 
Daha önceki bölümde de bahsedildiği üzere Mod sistemiyle şu şekilde çalışıyorduk :
1 ) Önce bir veya daha çok mod dosyasını ( başlangıcı module_ ve uzantısı .py olan dosyalar) düzenleyip istediğiniz değişiklikleri yapıyorsunuz. (Sağ tuşa tıklayıp açılan menüden "Edit with IDLE" seçeneğini seçerek )
2 ) Bundan sonra build_module.bat dosyasını çift tıklayıp çalıştırıyorsunuz. Bu modunuzu sizin için kuracak ve herhangi bir hata olursa size bildirecek.
3 ) Eğer hiç hata çıkmazsa Mount&Blade'i açıp yaptığınız değişiklikleri test edebilirsiniz. Bazen yaptığınız değişikliklerin etkin olabilmesi için yeni bir oyuna başlamanız gerekebilir.

2.1 Mod Dosyalarını Düzenlemek
Modül sisteminde oyundaki nesne toplulukları Python listeleriyle temsil edilmekte. (Bir python listesi '[' ile başlarken virgülle ayrılmış nesnelerle devam eder ve ']' ile biter) eğer herhangi bir modül dosyasını açarsanız onun da böyle bir liste kullandığını görürsünüz mesala module_map_icons.py dosyasının içeriği :

map_icons = [
  ("player",0,"player", 0.2, snd_footstep_grass),
  ("player_horseman",0,"player_horseman", 0.2, snd_gallop),
  ("gray_knight",0,"knight_a", 0.2, snd_gallop),
  ("vaegir_knight",0,"knight_b", 0.2, snd_gallop),
  ("peasant",0,"peasant_a", 0.2,snd_footstep_grass),
  ("khergit",0,"khergit_horseman", 0.2,snd_gallop),
  ("axeman",0,"bandit_a", 0.2,snd_footstep_grass),
  ("woman",0,"woman_a", 0.2,snd_footstep_grass),
  ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
]


Burada map_icons değişkeni bir python listesi ve listenin içindeki her öğe de özel bir harita simge (map icon) nesnesi olarak olarak tanımlanmış. Bu örnekte ("player",0,"player", 0.2, snd_footstep_grass) de böyle bir nesne. Bu nesnelere Python dilinde tuple denilmekte. Tuplelarda listeler gibi virgülle ayrılmış nesnelerden oluşurken listelerden farklı olarak parantezlerle tanımlanırlar. Her bir tuple nesnesinin yapısı modül dosyası başlangıcında açıklanmıştır. Harita simgeleri (map icon) için her tuple nesnesi şunları içerir :

1 ) simgenin adı
2 ) simge flagı
3 ) Mesh'in adı
4 ) Mesh'in ölçeği
5 ) Ses kimliği

(ç.n. Yukarıda gördükleriniz module_map_icons.py dosyasının "#" ile başlayan python dökümantasyon kısmı ve dosyanın
orjinalinde ingilizce geçmekte haliye, bu arada "#" Python'da dökümantasyon amacıyla kullanılır)


Yani ilk tuple ("player",0,"player", 0.2, snd_footstep_grass) için :
1 ) simgenin adı = "player"
2 ) simge flagı = 0
3 ) Mesh'in adı = "player"
4 ) Mesh'in ölçeği = 0.2
5 ) Ses kimliği = snd_footstep_grass

Her modül sistemi dosyasının başındaki dökümasyonda listelenen açıklamalarla python listelerindeki öğeleri eşleyerek oyun nesnelerinin yapısıyla bu şekilde oynayabilirsiniz.


2.2 Oyuna Yeni Nesneler Eklemek
Harita simgesi (map icon) tuplelarının yapısını öğrendiğimize göre artık yeni harita simgeleri ekleyebiliriz. Listeye tekrar dönersek :

map_icons = [
  ("player",0,"player", 0.2, snd_footstep_grass),
  ("player_horseman",0,"player_horseman", 0.2, snd_gallop),
  ("gray_knight",0,"knight_a", 0.2, snd_gallop),
  ("vaegir_knight",0,"knight_b", 0.2, snd_gallop),
  ("peasant",0,"peasant_a", 0.2,snd_footstep_grass),
  ("khergit",0,"khergit_horseman", 0.2,snd_gallop),
  ("axeman",0,"bandit_a", 0.2,snd_footstep_grass),
  ("woman",0,"woman_a", 0.2,snd_footstep_grass),
  ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
]


Her modül dosyasındaki yeni oyun nesneleri listelerin içine eklenmelidir. Gördüğünüz gibi module_map_icons listesi  ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass) ile bitmekte.Yeni oyun nesnesine yer açabilmek için köşeli ayracı (']') bir satır aşağı kaydırmamız gerekecek.

Bunu yaptıktan sonra yeni oyun nesnesimizi ekleyebiliriz.Bunun en kolay yolu hazır nesneleri kopyalayıp yapıştırdakdan sonra içeriklerini düzenlemekten geçer. Örneğin :

map_icons = [
  ("player",0,"player", 0.2, snd_footstep_grass),
  ("player_horseman",0,"player_horseman", 0.2, snd_gallop),
  ("gray_knight",0,"knight_a", 0.2, snd_gallop),
  ("vaegir_knight",0,"knight_b", 0.2, snd_gallop),
  ("peasant",0,"peasant_a", 0.2,snd_footstep_grass),
  ("khergit",0,"khergit_horseman", 0.2,snd_gallop),
  ("axeman",0,"bandit_a", 0.2,snd_footstep_grass),
  ("woman",0,"woman_a", 0.2,snd_footstep_grass),
  ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
  ("new_icon",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
]


Bu örnekte ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass) nesnesini tamamen kopyalayıp ona yeni bir isim verdik; "new_icon". Bu yeni simgemiz bir flaga sahiptir. Flaglar uygun alanlara eklenip çıkarılarak, açık ve kapalı olarak iki halde gelen ayarlardır. Örneğin mcn_no_shadow flagı yeni simgemizin yerde gölge oluşturmasını engelleyecektir.

mcn_no_shadow flagını 0 ile değiştirerek modül sistemine burada herhangi bir flag olmadığını belirtelim.

map_icons = [
  ("player",0,"player", 0.2, snd_footstep_grass),
  ("player_horseman",0,"player_horseman", 0.2, snd_gallop),
  ("gray_knight",0,"knight_a", 0.2, snd_gallop),
  ("vaegir_knight",0,"knight_b", 0.2, snd_gallop),
  ("peasant",0,"peasant_a", 0.2,snd_footstep_grass),
  ("khergit",0,"khergit_horseman", 0.2,snd_gallop),
  ("axeman",0,"bandit_a", 0.2,snd_footstep_grass),
  ("woman",0,"woman_a", 0.2,snd_footstep_grass),
  ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
  ("new_icon",0,"City", 0.9,snd_footstep_grass),
]


Hem "town hem de "new_icon" simgeleri "City" meshini kullanmaktadırlar. Bu da her ikisinin de oyunun kaynak dosyalarından "City" 3d modelini kullandıklarını gösterir. Bu alan değiştirilerek kaynak dosyalarından herhangi bir 3d model kullanılabilir.

Her iki simge de aynı Mesh'i kullandıklarından şu anda oyuna "new_icon" simgesi koymaya kalksaydık, "town" simgesiyle aynı görüntüye sahip olacaktı.

Şimdi "new_icon" simgesinin görünümü biraz değiştirmeye çalışalım:

map_icons = [
  ("player",0,"player", 0.2, snd_footstep_grass),
  ("player_horseman",0,"player_horseman", 0.2, snd_gallop),
  ("gray_knight",0,"knight_a", 0.2, snd_gallop),
  ("vaegir_knight",0,"knight_b", 0.2, snd_gallop),
  ("peasant",0,"peasant_a", 0.2,snd_footstep_grass),
  ("khergit",0,"khergit_horseman", 0.2,snd_gallop),
  ("axeman",0,"bandit_a", 0.2,snd_footstep_grass),
  ("woman",0,"woman_a", 0.2,snd_footstep_grass),
  ("town",mcn_no_shadow,"City", 0.9,snd_footstep_grass),
  ("new_icon",0,"City", 5.0,snd_footstep_grass),
]


Bu örnekte simgenin ölçeğini 0,9'dan 5.0'a değiştirdik. Bu yeni simgemizin normalden beş kat daha büyük görünmesine neden olmakla beraber simgemizi oyuna dahil ettiğimizde onu "town" simgesinden ayırmamızı sağlar.

Bir sonraki bölümde module_parties.py dosyasına yeni simgemizi kullanan bir parti ekleyeceğiz. Bunun için module_parties.py dosyasından simgeyi referans etmemiz gerekecek.
 
2.3 Oyun Nesnelerine Referans Vermek

Modul sisteminin bulundugu dizindeki module_parties.py dosyasini actiginizda "parties = [" isminde bir baska Python listesiyle karsilasirsiniz.

Gorebileceginiz gibi, module_parties.py dosyasindaki tuple'larin yapisi module_icons'da bulunanlarla nerdeyse aynidir. Bu durum tum modul dosyalari icin olmasa da, bir cogu icin gecerlidir.

Bir parti ornegi:

("zendar","Zendar",icon_town|pf_is_static|pf_always_visible|pf_hide_defenders, "zendar", pt_none, fac_neutral,0,ai_bhvr_hold,0,(2,46),[(trp_swadian_knight,6,0)]),

Bu tuple, Zendar kasabasini haritaya yerlestirir. Zendar'in cesitli ozellikleri, module_icons.py dosyasinda gordugumuz alanlara oldukca benzeyen alanlara uygun sekilde atanmistir.

Tuple alanlarinin dokumu:

1 ) Parti kimligi (Party-id). Diger dosyalardan partiye referans vermek icin kullanilir.
2 ) Parti adi. Parti adinin oyun icinde gorunen halidir. Arzu edilirse parti kimliginden farkli olabilir.
3 ) Parti bayraklari (Party flags). Her parti nesnesinin ilk bayragi bu partinin kullanacagi simge(icon) olmalidir.
4 ) Menu. Bu alan gecersizdir ve kullanilmamaktadir. M&B'in 0.730 versiyonundan itibaren, bu alanin oyuna herhangi bir etkisi yoktur.
5 ) Parti şablonu(Party-template). Soz konusu partinin ait oldugu parti sablonunun kimligini belirtir. Varsiylan deger olarak pt_none kullanilir.
6 ) Parti grubu(Party faction). Bu deger module_factions.py dosyasindan herhangi bir girdi olabilir.
7 ) Parti kişiliği(Party personality). Kisilik(personality) bayraklarinin aciklamasi icin header_parties.py dosyasina bakiniz.
8 ) YZ(yapay zeka) davranisi. YZ partisinin ana haritada nasil davranacagini belirler.
9 ) YZ hedef parti. YZ davranisina hedef olan partiyi belirler.
10 ) Baslangic koordinatlari. Partinin ana haritadaki baslangic noktasi; X, Y.
11 ) Birlik yigini listesi. Her yigin kaydi 3 alandan olusur:
11.1 ) Birlik kimligi(Troop-id). Bu alan module_troops.py dosyasindaki birlik degerinden birini alabilir.
11.2 ) Soz konusu yigindaki birlik sayisi; değişmez. Buraya gireceginiz deger, sehrin sahip oldugu birlik sayisini belirler.
11.3 ) Uye bayraklari(Member flags). Opsiyonel. Parti uyesini tutsak olarak belirlemek icin pmf_is_prisoner kullanilir.

Zendar tuple incelemesi:

("zendar","Zendar",icon_town|pf_is_static|pf_always_visible|pf_hide_defenders, "zendar", pt_none, fac_neutral,0,ai_bhvr_hold,0,(2,46),[(trp_swadian_knight,6,0)]),

1 ) Parti kimligi = "zendar"
2 ) Parti adi = "Zendar"
3 ) Parti bayraklari = icon_town|pf_is_static|pf_always_visible|pf_hide_defenders
4 ) Menu = "zendar"
5 ) Parti sablonu = pt_none
6 ) Parti grubu = fac_neutral
7 ) Parti kisiligi = 0
8 ) YZ davranisi = ai_bhvr_hold
9 ) YZ hedef parti = 0
10 ) Baslangic koordinatlari = (2,46)
11 ) Birlik yigini listesi:
11.1 ) Birlik kimligi = trp_swadian_knight
11.2 ) Yigindaki birlik sayisi = 6
11.3 ) Uye bayraklari = 0

3. alana bakarsak, Zendar'in module_icons.py dosyasindaki "town" simgesine, basina icon_ oneki koyarak referans verdigini gorebiliriz. Bu onek sistemin dogru modul dosyasina bakmasini saglar. Ornegin, module_icons dosyasina referans vermek icin icon_; module_factions dosyasina referans vermek icin fac_; module_parties dosyasina referans vermek icin p_ oneklerini kullaniriz. Bu sistem diger dosyalar icin de gecerlidir ve tum modul dosyalari icin bir onek vardir. (Tumunun listesini bu bolumun sonunda bulabilirsiniz.)

Artik partilerin nasil yapilandigini bildigimize gore, kendi partimizi eklemeye baslayabiliriz. Fakat bundan once, module_parties.py ve diger bazi modul dosyalarinda, yeni sehirlerinizi listenin sonuna eklememeniz gerektigini hatirlatalim. Listenin sonuna sehir eklemek ana kodun calismasini etkileyeceginden, bu tip dosyalarda sizi uyaran bir aciklama satiriyla karsilasirsiniz. modul_parties.py dosyasinda yeni partileri "training_ground" ve "castle_1" satirlari arasina eklemeniz tavsiye edilir.

Simdi, "town_14" partisini kopyalayip "training_ground" ve "castle_1" arasina yapistirin.

("training_ground","Training Ground",  icon_town|pf_town|pf_disabled, "training_ground", pt_none, fac_vaegirs,0,ai_bhvr_hold,0,(-2,-3),[(trp_vaegir_knight,6,0)]),

  ("new_town","Mod_Town",  icon_town|pf_town, "town", pt_none, fac_vaegirs,0,ai_bhvr_hold,0,(-4,-37),[(trp_vaegir_knight,6,0)]),

  ("castle_1","Culmarr_Castle",icon_town|pf_is_static|pf_always_visible, "castle", pt_none, fac_outlaws,0,ai_bhvr_hold,0,(-47,-51),[(trp_swadian_knight,5,0),(trp_swadian_crossbowman,25,0)]),

Bu ornekte, "town_14" olan parti kimligini "new town", "Halmar" olan parti ismini de "Mod_Town" olarak degistiridk.

Tuple'a bakarak bazi cikarimlar yapabiliriz.

1 ) Bu partiye baska bir dosyadan referans vermek icin, "new_town" kimligini "p_" oneki ile birlestirerek elde ettigimiz "p_new_town" tanimlayicisini kullanmaliyiz.
2 ) Oyun sirasinda parti kimligini degil, "Mod Town" olarak belirledigimiz parti adini goruruz.
3 ) Bu parti icon_town ve pf_town bayraklarini kullanir. pf_town bayragi partiye genel sehir ayarlarini atar.
4 ) "Mod Town"  Vaegir grubuna bagli.
5 ) Eger yeni sehrimizi oyuna simdi koysaydik, Halmar ile ayni koordinatlarda gozukecekti. Siradaki isimiz bu durumu degistirmek olacak.


("training_ground","Training Ground",  icon_town|pf_town|pf_disabled, "training_ground", pt_none, fac_vaegirs,0,ai_bhvr_hold,0,(-2,-3),[(trp_vaegir_knight,6,0)]),

  ("new_town","Mod_Town",  icon_new_icon|pf_town, "town", pt_none, fac_neutral,0,ai_bhvr_hold,0,(-1,-1),[(trp_vaegir_knight,6,0)]),

  ("castle_1","Culmarr_Castle",icon_town|pf_is_static|pf_always_visible, "castle", pt_none, fac_outlaws,0,ai_bhvr_hold,0,(-47,-51),[(trp_swadian_knight,5,0),(trp_swadian_crossbowman,25,0)]),

Yukarida, yeni olusturdugumuz sehrin simgesini icon_new_icon yaptik ve koordinatlarini da (-1,-1) olarak degistirdik. Buna ek olarak, sehrin bagli bulundugu grubu degistirerek, fac_neutral yaptik.

Artik, sehir yeni simgemizi kullanacak sekilde ayarlandi ve kendi koordinatlarina kavustu. Bu sayede olusabilecek karisikliklar da onlenmis oldu.

Yaptiklariniz kaydedin ve build_module.bat dosyasini calisitirin. Her seyi dogru yaptiysaniz, artik modulunuzu baslatabiliyor olmali ve yeni sehrinizi simgesiyle birlikte haritanin ortalarinda goruyor olmalisiniz. Simdi deneyin.

Eger sorun cikarsa, yazimi ve sozdizimi dikkatlice kontrol edin. Tum virgul ve parantezlerin yerli yerinde oldugundan emin olun. Sozdizimi hatalari, resmi modul sisteminde ortaya cikan derleme hatalarinin baslica sebebidir.

Henuz olusturdugunuz sehre oyun menusu atanmadigi icin, oyun icinde bu sehre gitmek carpisma(combat) ekranini tetikler. Menu atamak karmasik bir is oldugundan, ilerde geri donmek uzere, yeni sehrimizi oldugu gibi birakiyoruz.

Gorebileceginiz gibi, cesitli modul dosyalarinin karislikli iliskileri kapsamli olabilir. Yine de, cogu degisimi en fazla bir iki dosyanin yeniden duzenlenmesiyle gerceklestirilebilmek mumkundur.

Artik modlamanin temellerini kaptiginiza gore, modul dosyalarini daha derinlemesine inceleyebiliriz. Bolum 3'e gecebilirsiniz.


Modul dosyalari onek listesi:

fac_  -- module_factions.py
icon_   -- module_map_icons.py
itm_   -- module_items.py
mnu_   -- module_game_menus.py
mno_  -- module_game_menus.py
mt_  -- module_mission_templates.py
psys_  -- module_particle_systems.py
p_     -- module_parties.py
pt_  -- module_party_templates.py
qst_   -- module_quests.py
script_  -- module_scripts.py
scn_  -- module_scenes.py
spr_  -- module_scene_props.py
str_  -- module_strings.py
trp_  -- module_troops.py

module_dialogs.py dosyasina dogrudan referans verilemez, bu yuzden oneki yoktur.
 
Dökümantasyonun bu bölümünde module_troops.py ve fonksiyonlarını inceleyeceğiz. Module_troops normal birliklerin (troops), baş karakterlerin (heroes), sandıkların (chests), ve şehirlerdeki oynanamayan karakterlerlerle (NPC) beraber yüz, yetenek puanları (ability scores) ve envanterlerin (inventory) tanımlandığı bölümdür. Yeni bir karakter veya birlik tipi yaratmak istediğinizde bu dosyayla çalışmanız
gerekir.


3.1 Module_Troops Dökümü

Dosya, silah ustalıkları (weapon proficiencies) ve diğer modlanamayan kodları hesaplayan küçük bir kod bloğu ile başlar. Bu tüm blok Python listeleri dışında kaldığından ve burada herhangi bir düzenleme yapmayacağımızdan şimdilik bizi ilgelendirmiyor. troops = [ bölümüne kadarki kısmı atlayabilirsiniz.

Oyundaki oyuncu, dost ve diğer önemli birlikleri bulabileceğiniz tupleları burada görebilirsiniz. Hemen aşağıda Zendar trainer'da görecebileceğimiz çeşitli dövüşçü (fighter) birliklerini bulabilirsiniz. Bunlar normal birliklerin level ilerleyişini de görebileceğimiz çok güzel örnekler olduğu için birkaçını inceleyeceğiz.

Mesela :
  ["novice_fighter","novice_fighter","novice_fighters",tf_guarantee_boots|tf_guarantee_armor,no_scene,reserved,fac_commoners,
  [itm_sword,itm_hide_boots],
  str_6|agi_6|level(5),wp(60),knows_common,swadian_face1, swadian_face2],


Bu "novice fighter" isimli alt seviye, çok düşük yetenek puanlarına (ability scores) sahip ve pek de iyi dövüşemeyen bir birlik.

Tuple alanlarının dökümü :
1 ) Birlik kimliği (Troop id) Diğer dosyalarda birlikleri referans vermek için kullanılır.
2 ) Birlik ismi (Troop name)
3 ) Çoğul birlik ismi (Plural troop name)
4 ) Birlik bayrakları (Troop flags). tf_guarantee_* bayrakları(flag) bir birliğin her zaman belirli envanterle (inventory) gelmesini garanti etmek için kullanılır. Eğer kullanmazsanız söz konusu birlik zırhsız (armor) bir şekilde oyunda belirebilir. Eğer birliğin envanterinde varsa sadece yakın dövüş silahlarıyla donatılmış olarak gelmesi garantidir.
5 ) Olay yeri (Scene). Bu sadece oyundaki baş karakterlere etki etmekle beraber söz konusu karakterlerin nerede ve hangi noktada oyuna dahil olacağını belirtir. Mesala scn_reyvadin_castle|entry(1) birliğin Reyvadin kalesinde 1 numaralı noktada çıkmasını sağlayacaktır.
6 ) Ayrılmış (reserved). Şu anda kullanılmıyor. 0 veya reserved olabilir.
7 ) Grup (Faction). Birliğin dahil olduğu grup, fac_ ön ekiyle kullanılır.
8 ) Envanter (Inventory). Birliğin envanterindeki öğelerin listesi. Normal birlikler Normal birlikler bu lisiteden ekipmanları rasgele seçerler.
9 ) Özellikler (Attributes). Birliğin özellikleri ve karakter leveli. Oyuncuyla aynı şekilde çalışır.
10 ) Silah ustalıkarı (Weapon proficiencies). Bu birlik için silah ustalık puanları. wp(x) fonksiyonu x parametresinenin yakınlarında değerlerde silah ustalığı puanları üretecekdir ama siz ekstra tanımlamalar ekleyerek istediğiniz ustalık puanlarını belirtebilirsiniz. Mesala okçuluk da usta ama diğer silah becerileri 60'a yakın bir okçu için şunu kullanablirsiniz :
                  wp_archery(160) | wp(60)
11 ) Yetenekler (skills). Oyuncu yetenekleriyle tamamen aynıdır. Bu arada tanımladığınız özelliklere ve yeteneklere ek olarak, birlik her levelde 1 rastgele özellik (attribute) ve yetenek (skill) puanı alır.
12 ) Yüz kodu (Face code). Oyun yüzleri buradaki kodlara göre yaratır. Yüz editöründe Edit mod açıkken CTRL-E'ye basarak yeni yüz kodlarını dışarı aktarabilirsiniz (export).
13 ) Yüz kodu 2 (Face code 2). Sadece normal birliklere uygulanabilir, baş karakterler etkilenmez. Oyun yüz kodu 1 ve 2 arasında her birlik tipi için rastgele yüzler üretir.

novice_fighter tuple incelemesi :
1 ) Birlik kimliği = "novice_fighter"
2 ) Birlik ismi = "novice_fighter"
3 ) Çoğul birlik ismi = "novice_fighters"
4 ) Bİrlik bayrakları = tf_guarantee_boots|tf_guarantee_armor
5 ) Olay yeri = no_scene
6 ) Ayrılmış = reserved
7 ) Grup = fac_commoners
8 ) Envanter = [itm_sword,itm_hide_boots]
9 ) Özellikler = str_6|agi_6|level(5)
10 ) Silah ustalıkları = wp(60)
11 ) Yetenekler = knows_common
12 ) Yüz kodu = swadian_face1
13 ) Yüz kodu 2 = swadian_face2

Bu tupleda 3 önemli nokta var.

"novice fighter" birliği tf_guarantee_armor bayrağına sahip ama hiç zırhı yok. Ancak bu tf_guarantee_armor bayrağını geçersiz yapmıyor, söz konusu birlik oyun içinde de alacağı zırhları giyebilir.

Başlangıçta "novice fighter" 6 STR ve 6 AGI özelliklerine sahip. Ancak oyun başlayınca tüm avantajlarıyla beraber level 5'e yükseltiliyor.

knows_common yeteniğine sahip. Bu module_troops'un başlangıcında tanımlanmış bir yetenekler topluluğu :

knows_common = knows_riding_1|knows_trade_2|knows_inventory_management_2|knows_prisoner_management_1|knows_leadership_1

knows_common'a sahip her birlik yukarıdaki yeteneklerin hepsine sahip olur, Riding skill: 1, Trade skill: 2, Inventory Management skill: 2, Prisoner Management skill: 1 ve Leadership skill: 1. knows_common sabit olarak bilinen tiplere bir örnektir. Bunlar sayı, belirteç, başka bir sabit veya nesneyi temsil edebilen ifadelerdir. Bir sabit doğru sırada olmak koşuluyla birden çok nesneyi temsil edebilir.

Bu durumda knows_common şöyle tanımlanmıştır :
knows_riding_1|knows_trade_2|knows_inventory_management_2|knows_prisoner_management_1|knows_leadership_1
Böylece knows_common'ı gerekli Skills alanına koyarak modül sisteminin şunu yazmış gibi 
knows_riding_1|knows_trade_2|knows_inventory_management_2|knows_prisoner_management_1|knows_leadership_1
çalışmasını sağlıyoruz.

Şimdi listedeki bir diğer bölüme bakalım.

  ["regular_fighter","regular_fighter","regular_fighters",tf_guarantee_boots|tf_guarantee_armor,no_scene,reserved,fac_commoners,
  [itm_sword,itm_hide_boots],
  str_8|agi_8|level(11),wp(90),knows_common|knows_ironflesh_1|knows_power_strike_1|knows_athletics_1|knows_riding_1|knows_shield_2,swadian_face1, swadian_face2],


Bu örnekte biraz daha güçlü "regular fighter" birliğini görüyoruz. Bu birlik level 11, daha yüksek yetenek puanlarına sahip ve knows_common dışında da yetenekleri var. Oyun içinde "novice fighter" birimleri level 11'e gelecek kadar deneyim (experience) kazanırlarsa onları "regular fighters" birlikleriye yenileyebiliriz (update).
 
3.2 – Askerleri Geliştirme

Hangi tip askerlerin hangi tip askerlere geliştirilebileceği, module_troops kısmın altındadır. Lütfen sona şimdi gidiniz.

Göreceğiniz gibi, her askerin geliştirme seçenekleri upgrade(troops) işlemi boyunca belirtilmiştir. İlk dizi, askerin geliştirilecek olan askerin ismidir, ikinci dizi ise askerin geliştirileceği askerin ismidir. Örneğin, upgrade(troops,"farmer", "watchman") komutu, “farmer” eğer yeterince tecrübe kazanmışsa, bir “farmer”ın bir “watchman”e gelişmesine izin verir.

İki çeşit gelişim işlemi bulunur.

upgrade(troops,"source_troop", "target_troop_1") sadece bir gelişim seçeneği belirtir; "source_troop"un "target_troop_1" gelişmesi.

Öte yandan upgrade2(troops,"source_troop", "target_troop_1", "target_troop_2"), komutu oyuncunun "source_troop" un, "target_troop_1" ya da "target_troop_2"ye gelişmesine izin verir. Şu anda en fazla gelişim seçeneği sayısı 2’dir.

İlk olarak, “novice_fighter” için bir giriş yok, o yüzden bir tane yapalım. upgrade(troops,"farmer", "watchman") komutunu kopyalayıp, bloğun sonunda yapıştırın. Sonra “farmer”ı “novice_fighter” olarak, “watchman”i de “regular_fighter” olarak değiştirin. Önceki kısımda anlatıldığı gibi, grubunuzdaki herhangi bir “novice fighter” şimdi birer “regular fighter”a geliştirilebilecektir.

Sonraki adım olarak, biraz daha ileri gideceğiz. Listenin sonunda bir giriş daha yapın, şöyleki kaynak asker “new_troop” olsun ve sonuç asker ise “regular_fighter” olsun. Sonra, # Add Extra Quest NPCs below this point yazısına dönün. Burada bir ]   göreceksiniz, “Troops Python” listesinin bitiş parantezi. Yeni askerler bu parantezden önce belirtilmelidir, ve bu da sonraki aşamada yapacağımız iş oluyor.
 
3.3 -- Adding New Troops

Parantezi iki satır alta kaydırın ve boşluğa aşağıdaki kodu kopyalayıp yapıştırın:

  ["new_troop","new_troop","new_troops",tf_guarantee_boots|tf_guarantee_armor,no_scene,reserved,fac_commoners,
  [itm_sword,itm_hide_boots],
  str_6|agi_6|level(5),wp(60),knows_common,swadian_face1, swadian_face2],


Bu girdi, yeni asker yapmak için uğraşacağımız kısımdır.

İlk olarak ona biraz zırh ve başlık verelim.

  ["new_troop","new_troop","new_troops",tf_guarantee_boots|tf_guarantee_armor,no_scene,reserved,fac_commoners,
  [itm_sword,itm_hide_boots,itm_leather_jerkin,itm_skullcap],
  str_6|agi_6|level(5),wp(60),knows_common,swadian_face1, swadian_face2],



Bundan sonra, "new_troop" sınıfındaki her asker, itm_leather_jerkin giyecek. Fakat,"Flags" kısmındaki girdileri nedeniyle, sadece birkaçı  itm_skullcap a sahip olacak; bu asker garanti olarak sadece zırh ve botlara sahip olacak. Bütün yeni askerlerin birer başlığa sahip olmaları için, "Flags" kısmına tf_guarantee_helmet komutunu eklemeliyiz.

  ["new_troop","new_troop","new_troops",tf_guarantee_boots|tf_guarantee_armor|tf_guarantee_helmet,no_scene,reserved,fac_commoners,
  [itm_sword,itm_hide_boots,itm_leather_jerkin,itm_skullcap],
  str_6|agi_6|level(5),wp(60),knows_common,swadian_face1, swadian_face2],


Sonraki düzenlememiz için, askerin istatistiklerinde değişik yapacağız. Askerin STR sini 9, AGI sini de 9 yapın. Bu tamamlandıktan sonra Seviyesini 4 yapın ve silah ustalığını da 80 yapın.

Bizim "new troop" şimdi şöyle gözükmeli:

  ["new_troop","new_troop","new_troops",tf_guarantee_boots|tf_guarantee_armor|tf_guarantee_helmet,no_scene,reserved,fac_commoners,
  [itm_sword,itm_hide_boots,itm_leather_jerkin,itm_skullcap],
  str_9|agi_9|level(4),wp(80),knows_common,swadian_face1, swadian_face2],


Yeni askerimiz denemek için oyuna eklenmeye hazır durumda.
 
3.4 Kiralık askerler (Mercenaries)

Çalışmanızı sakladıktan sonra module_parties.py modülünü açın. Kaydırma çubuğunu "zendar_mercs" partisini görene kadar kaydırın.

("zendar_mercs","zendar_mercs",pf_disabled, no_menu, pt_none, fac_commoners,0,ai_bhvr_hold,0,(0,0),[(trp_farmer,15,0)]),

Bu, haritada yerleşmiş olmayan bir kiralık asker partisidir. Bu partinin askerleri kasabanın hancısından kiralanabilir. Bu özel parti, Zendar'daki hancıya bağlıdır.

"zendar_mercs" şu an için 15 tane çiftçi içermektedir. Şu anda oyuna başlamış olsaydınız, kiralayabileceğiniz askerler onlar olacaktı. Fakat eğer "trp_farmer" kısmını "trp_new_troop" ile değiştirirsek onların yerine 15 tane "new troops" (yeni asker) kiralayabileceğiz. Şimdi bu değişikliği yapın.

Çalışmanızı saklayın, module_parties modülünü kapatın ve build_module.bat dosyasına çift tıklayın. Eğer işlem hiç problem olmadan tamamlanırsa, yeni askerleri Zendar'daki hancıdan kiralanabilecek askerler arasında görebileceğiz. (Yeni askerlerin gözükmesi için yeni oyun başlatılması gerekecektir. Partilerdeki değişikliklerin etkili olması için yeni oyun başlatılması gerekir. )

Yeni oyun başlatın ve "new troops" (yeni askerleri) kiralayın. Sonra kasabadan çıkıp bi kaç savaş yapın ve yeterince tecrübe kazandıklarında yeni askerlerin rütbelerini "regular fighters" rütbesine yükseltebildiğinizi gözleyin.

Tebrikler! Şimdi "regular" askerleri nasıl oluşturduğunuzu ve değiştirdiğinizi öğrenmiş bulunmaktasınız. Bir sonraki kesim kahramanları (heroes), Tüccarları (merchants) ve diğer NPCleri kapsayacak.
 
3.6 Tüccarlar (Merchants)

Tüccarlar'lar (merchant) özel bir tür hero'dur. tf_hero'ya ek olarak tf_is_merchant bayrağına da sahiptir. Bu bayrak, troop tuple'ında özel olarak tahsis edilmiş olanlar hariç  envanterlerinde ki öğeleri giymelerini engeller. Bir başka deyişle, bu tüccarlar oyun boyunca her türlü şeyi alabilmekle beraber bunları kullanamıyor ve yalnızca satışa çıkartabiliyorlar.

Bir tüccar örneği :

["zendar_weaponsmith","Dunga","Dunga",tf_hero|tf_is_merchant, scn_zendar_center|entry(3),0,  fac_commoners,[itm_linen_tunic,itm_nomad_boots],def_attrib|level(2),wp(20),knows_inventory_management_10, 0x00000000000021c401f545a49b6eb2bc],

Bu Dunga adlı Zendar'daki silah tüccarı. Native versiyondaki tüm tüccarlarla neredeyse aynı özelliklere sahip. Eğer
dikkatli bakarsanız tek farkının tanımlayıcıları, isimleri, konumları ve yüzleri olduğunu görürsünüz.

Bununla birlikte oyuna bir tüccar eklemek biraz karmaşık olabilmektedir. Bunların gruplanmalarının bir sebebi vardır.
M&B'de her tür tüccar envanterlerini güncellemek için her gün bir script çalıştırılır. Bunun için script, alt ve üst noktaları belirlenmiş, bir sayı aralığından seçim yapar. Mesala, zırh tüccarlarının aralığı "zendar_armorer" dan (alt nokta) "zendar_weaponsmith" e (üst nokta ve dahil değil) kadar herşey kullanılır. Üst nokta aralığa dahil olmadığından "town_14_armorer"ın zırh tüücarı aralığına dahil olmasını istersek, üst nokta bir giriş aşağı çekilmelidir ("zendar_weaponsmith").

Bu yüzden yeni zırh tüccarları "zendar_weaponsmith" den önce, yeni silah tüccarları "zendar_tavernkeeper"dan önce, diğer tüccarlar ise "merchants_end" dan önce eklenmelidir.

Bunu da öğrendikten sonra artık module_troops hakkındaki herşeyi biliyorsunuz. header_troops.py dosyasında başka birimleri de yaratmanıza olanak sağlayan hazır bayrakların bir listesi vardır. Bunları denedikten sonra, hazır olunca, dökümantasyonun bir sonraki bölümüne geçebilirsiniz.
 
Bu dokumantasyonun 2. bolumunde nasil yeni partiler -harita uzerindeki ozel lokasyonlar- yaratilacagini ogrenmi$tik. Bunlarin $imdi aciklanacak olan parti $ablonlari (party templates) ile kari$tirilmamalari gerekir.

En basit tanimiyla, parti $ablonlari; haritada olu$acak olan (spawn) partiler icin tanimlanmi$ yonergelerdir. Bu, partiler ve parti $ablonlari arasindaki en acik farktir -- partiler harita uzerindeki ozel varliklarken, $ablonlar oyunun icinde fiziksel olarak var olmazlar. Amaclari, sadece yaratilacak partiler icin yonergeler belirlemektir. Bu yuzden, girdi olarak party kimligi (party_id) kullanan ce$itli i$lemler bir parti $ablonu kimligi (party_template_id) girdi olarak kullanildiginda cali$mayacaktir.

Bir $ablondan olu$turulan partilerin tekil veya benzersiz olmak gibi bir $arti yoktur. Ayni $ablondan birden fazla parti olu$turulabilir; bunlarin hepsi oyuncunun level'ina ve $ablonda belirtilen minimum/maksimum birim (troop) limitlerine gore rastgele sayida birim icereceklerdir.

4.1 -- Module_Party_Templates Dokumu

Dosya her zamanki Python listesiyle ba$lar: party_templates = [. Ardindan gelen birkac $ablon oyun motoruna eklenmi$tir ve uzerlerinde degi$iklik yapilmamasi gerekir.

Module_party_templates'teki tuplelarin module_parties'dekilerle cok benzedigini fark edeceksiniz, ama bu ikisi birbirleri arasinda degi$tirilemezler, yani aralarinda farkliliklar mevcut.

Ornek bir parti $ablonu:


("farmers","farmers",icon_peasant|pf_auto_start_dialog,0,fac_innocents,merchant_personality,[(trp_farmer,11,22),(trp_peasant_woman,16,44)]),

Bu, hepimizin oyunda *** *** kar$ila$tigi bir $ablon. Bu $ablona sahip partiler "farmers" $eklinde adlandirilir, biriyle map ustunde kar$ila$tiginizda otomatikman diyalog ba$latirlar, oyun icinde korkakca hareket ederler ve her birinin farmer ve peasant woman'dan olu$an iki birim yigini (troop stack) vardir.


Tuple alanlarinin dokumu:

1 ) Parti $ablonu kimligi (Party-template id). Ba$ka dosyalardan parti $ablonlarina refereans vermek icin kullanilir.
2 ) Parti $ablonu ismi (Party-template name). Bu $ablondan yaratilan partilerin kullanacagi isim.
3 ) Parti bayraklari (Party flags). Fark edeceginiz gibi module_party_templates'taki butun $ablonlarda bayrak olarak pf_auto_start_dialogue bulunuyor. Bu bayrak bu $ablondan bir parti ile harita uzerinde kar$ila$ildiginda otomatikman diyalog ba$latmaya yariyor.
4 ) Menu. modul_parties dokumaninda belirtildigi gibi, artik kullanilmiyor. Deger olarak 0 verin.
5 ) Grup (faction).
6 ) Ki$ilik (personality). Bu alan harita uzerindeki parti davrani$larini belirleyen bayraklar icerir.
7 ) Yigin listesi (List of stacks). Her yigin a$agidaki bolumleri iceren bir tuple'dir:
    7.1) Birim kimligi (Troop-id).
    7.2) Yigindaki minimum birim sayisi.
    7.3) Yigindaki maksimum birim sayisi.
    7.4) Uye bayraklari (opsiyonel) - Member flags. Uye bayraklarini ayarlamak icin yeni bir alan eklemek zorundasiniz. Ornegin: (trp_swadian_crossbowman,5,14,pmf_is_prisoner)

Bir parti $ablonunda en fazla 6 yigin (stack) bulunabilir.


Farmers tuple incelemesi:

1 ) Parti $ablonu kimligi = "farmers"
2 ) Parti $ablonu ismi = "farmers"
3 ) Parti bayraklari = icon_peasant|pf_auto_start_dialog
4 ) Menu = 0
5 ) Grup = fac_innocents
6 ) Ki$ilik = merchant_personality
7 ) Yigin listesi:
    7.1) Birim kimligi = trp_farmer, trp_peasant_woman
    7.2) Yigindaki minimum birim sayisi = 11, 16
    7.3) Yigindaki maksimum birim sayisi. = 22, 44
    7.4) Uye bayraklari (opsiyonel) = Belirlenmi$ bir bayrak yok.


Eger 1. bolumden itibaren dokumantasyonu takip ettiyseniz, tuple okuma konusunda tecrube kazanmi$ olmalisiniz. Fark ettiyseniz bu tuple'da daha onceden kar$ila$madigimiz bir bolum var: 6) Ki$ilik (personality) bayraklari bolumu. Bu alani ve fonksiyonlarini bir sonraki a$amada inceleyecegiz.
 
4.2 -- Kişilik

Tuple dökümünde bahsedildiği üzere, kişilik alanı partinin harita üzerindeki davranışını belirler. Burada Cesaret ve Saldırganlık için özel skorlar atayabilir, veya merchant_personality gibi öntanımlı kişiliklerden birisini kullanabilirsiniz. Bu öntanımlı kişilikler sabittirler, ve hepsi bir Cesaret ve Saldırganlık skoru içerir. Öntanımlı kişiliklerin hepsi header_parties.py dosyasında tanımlıdır. Dosyayı açın ve en aşağıya kaydırarak bu sabit tanımlamaları kendiniz görün. Orada aynı zamanda olası Cesaret ve Saldırganlık ayarlarının listesini de farkedeceksiniz.

merchant_personality sabiti dosya boyunca pek çok şablon içinde kullanılmaktadır. Bu kişiliğe sahip partiler dost canlısı olurlar, düşmana ya da daha zayıf partilere saldırmazlar. Çünkü merchant_personality sabitinde parti saldırganlığına aggresiveness_0 değeri verilmiştir. Saldırganlık değeri aggresiveness_0 olan bir parti asla başka bir partiye saldırmaz,  halbuki soldier_personality kişiliğine sahip savaşkan partilerin saldırganlık değeri aggresiveness_8 'dir. Bu tür bir parti, eğer saldıranın fraksiyonu savunanınkiyle kötü ilişkilere sahipse ve eğer saldırgan sayıca çok az değilse, başka partilere saldıracaktır.

Cesaret partilerin birbirlerinden ne zaman kaçacağını belirleyen skordur. Yüksek Cesaret, rakamlar lehte olmadığı zaman, partinin daha geç kaçacağı  anlamına gelir. merchant_personality kişiliğine sahip partilerin Cesareti 8, ve soldier_personality kişiliğine sahip partilerin Cesareti ise 11'dir.

Bu değerler 0'dan 15'e kadar uzanır, böylece parti şablonlarınız için arzu ettiğiniz davranışı verebilmenize olanak sağlar. Bununla beraber yeni modcuların, öntanımlı değerleri tercih etmesi önerilir. Öntanımlar ilk modunuz için ihtiyacınız olan bütün değerleri karşılayacaktır.

Son olarak, haydut(bandit) şablonlar için, haydutluk (banditness) bayrağı vardır. Bu, haydut partinin sürekli yanındaki partileri av olarak görmesine sebep olur ve eğer av önemli bir miktar para ya da ticaret malı taşıyorsa haydut parti avına saldıracaktır. İdeal olarak, bir haydut parti düşük saldırganlığa ve düşük asker sayısına sahip olmalıdır ki asker partilere saldırmasın.
 
4.3 -- Yeni şablonlar yaratmak

"farmers" için olan tupleyi kopyalayın, ve dosyanın en altına köşeli parantezin kapanmasından önceki kısma yapıştırın


  ("new_template","new_template",icon_peasant|pf_auto_start_dialog,0,fac_innocents,merchant_personality,[(trp_farmer,11,22),(trp_peasant_woman,16,44)]),

Bu örnekte "farmers" olan tanıtıcıyı "new_template" olarak değiştirdik, ve aynı şeyi isim için de yaptık. Bunu bitirdikten sonra, bu şablon için özel düzenlemelere başlayabiliriz.

İlk yapacağımız ince ayar için,  şablon'un fraksiyonunu fac_neutral olarak, ve merchant_personality değerini soldier_personality olarak değiştirelim.


("new_template","new_template",icon_peasant|pf_auto_start_dialog,0,fac_neutral,soldier_personality,[(trp_farmer,11,22),(trp_peasant_woman,16,44)]),

Şu andan itibaren, bu şablonun partileri tarafsız fraksiyon olacaklar, ve bir düşman görürlerse saldıracaklar.

Sırada, asker tertipini kurcalayalım.


("new_template","new_template",icon_peasant|pf_auto_start_dialog,0,fac_neutral,soldier_personality,[(trp_geoffrey,1,1),(trp_new_troop,16,44)]),

Bu örnek bir kaç belirgin değişikliğe sahiptir -- En önemlisi, bu dökümantasyonun 3. Bölümünde oluşturduğumuz Kahraman Ordusu(Hero troop) trp_geoffrey tarafından yönetilmektedir. Geoffrey'den birden fazla olamayacağı için onun minumum ve maksimum sayısını 1 olarak değiştirdik.

Yine bölüm 3'de oluşturduğumuz trp_new_troop'un bir asker topluluğunu onun izleyenleri olarak atadık. Bu partinin içindeki "yeni askerler" ("new troops") sayısı asla 16'dan az olmayacak fakat oyuncunun seviyesi arttıkça, asker sayısı kadameli olarak ayarlanacaktır. Sonunda bu "new_template", 44 adet "yeni asker" ile belirebilir, fakat asla 44'ten fazla yeni askere sahip olmayacaktır.

Dosyayı saklayın ve build_module.bat dosyasına tıklayın. Eğer işlem hiç problem olmadan tamamlanırsa, modül kodunuzda yeni şablonu kullanabileceksiniz, ama bu şablona ait partiler (haritada) belirmelidir. -- Kendi iradeleriyle ortaya çıkmazlar. Eğer oyunu bu noktada çalıştırmış olsaydık, yeni şablonun "new template" partilerini etrafta göremeyecektik.

Bu dökümantasyonun gelecek aşamasında bir şablonun partisinin haritada belirmesini nasıl sağlayacağımızı öğreneceğiz. Dökümantasyonun bir sonraki aşamasında yeni eşyaları yaratmanın yolunu öğrenirken, şu an için Geoffrey'i ve ufak çetesini rahat bırakalım. Lütfen Bölüm 5'e geçin.
 
3. ve 4. kısımlarda yeni birimlerin oluşturulup donanımlandırılacağını ve parti şablonlarının nasıl oluşturulacağını öğrendik. Şimdi bu tecrübelerle birliklerimiz için yeni nesneler yapmaya çalışabiliriz.

5.1 – Mod Eşyalarının Kırılması/Bozulması

Module.items.py dosyası oyunda gördüğümüz eşya/nesnelerin durumlarını ayarladığımız obje değişkenlerinin listesi ile başlar. Zarar görmüş kargılar, düşük kalite kılıçlar, ağır baltalar, tümü modül objelerindeki bir komut emri serisi (tuple) ve uygun bir obje değişkeninden yaratılmışlardır.

Burada belirtilen değişkenler standart nesne değişkenlerinden oluşur.Tüccarlarda ve ganimetlerde bulacağınız nesneler değişkenlerini bu listeden rastgele olarak alırlar.Bu listede belirtilmeyen değişkenler tüccar envanterinde ve savaş ganimetlerinde kayda alınmaz.

Daha tecrübeli modlayıcılar için, uygun değişken listesinde gözükmeyen değişkenlerin “troop add item” operasyonu ile kullanılabilmesi ilginçtir.Örnek olarak uzun yaylar genellikle “plain” “bent” ve cracked” konumlarında gelir,fakat biz eğer oyuncunun envanterine “balanced” değişkenine sahip bir yay ekleseydik , oyuncu “balanced” yaya sahip olacaktı.

Bu değişken listesinden sonra tuple listeleri gelir.İlki olan “practice sword / antrenman kılıcı” iyi bir örnek teşkil edecek.

Bir eşyanın örneği

["practice_sword","practice_sword", [("practice_sword",0)], itp_type_one_handed_wpn|itp_melee|itp_primary|itp_secondary, itc_longsword, 3,weight(1.5)|spd_rtng(103)|weapon_length(90)|swing_damage(16,blunt)|thrust_damage(10,blunt),imodbits_none],

Bu Zendar’ da eğitimde ve arena dövüşlerinde kullanılan basit bir kılıç.

Tuple’daki alanların açıklamaları.

1 ) Nesnenin referansı. Diğer dosyalardaki referans ismi
2 ) Nesnenin ismi. Eşyanın envanterimizde gözüken ismi
3 ) Mesh listesi.  Her mesh kaydı aşağıdaki alanları içeren bir tupledır.
    3.1) Mesh adı Mod kaynak dosyalarındaki yada oyun klasöründeki 3d model adı.
    3.2) Bu meshin eşleştiği değişkenler... Otomatik gelen mesh yerine bu meshi kullanacak olan değişkenlerin listesi.. Bu listedeki ilk mesh otomatik olarak gelendir.
4 ) Nesne özellikleri.
5 ) Nesnenin yapabilecekleri.Bu alan nesnenin kullanabileceği animasyonların listesini içerir
6 ) Nesnenin alt seviye denar bazında değeri.Eğer oyuncu 10 ‘ dan düşük bir alışveriş yeteneğine sahipse nesnenin oyundaki değeri çok daha fazla olacaktır.
7 ) Nesnenin istatistikleri. Bu alan nesnenin istatistikî bilgilerinin verildiği alandır; ağırlığı, ortaya çıkma olasılığı, zorluğu, savunma değerleri gibi.
8 ) Değişkenler. Nesneye uygulanabilecek değişken alanı
9 ) [İsteğe bağlı tetikleyiciler.


Antrenman kılıcı örneği.

ORJİNAL

1 ) Item id = "practice_sword"
2 ) Item name = "practice_sword"
3 ) List of meshes:
    3.1) Mesh name = "practice_sword"
    3.2) Modifier bits = 0
4 ) Item flags = itp_type_one_handed_wpn|itp_melee|itp_primary|itp_secondary
5 ) Item capabilities = itc_longsword
6 ) Item value = 3
7 ) Item stats = weight(1.5)|spd_rtng(103)|weapon_length(90)|swing_damage(16,blunt)|thrust_damage(10,blunt)
8 ) Modifier bits = imodbits_none
9 ) Triggers = None.


ANLAMI
1 ) nesne referansı=antrenman kılıcı
2 ) nesne adı = "practice_sword"
3 ) mesh listesi
    3.1) Mesh adı = "practice_sword"
    3.2) Modifier bits = 0
4 ) nesne özellikleri = itp_type_one_handed_wpn|itp_melee|itp_primary|itp_secondary (tek elle kullanılan / yakı dövüş silahı / birincil yada ikincil olabilir.)
5 ) nesne yeteneği = itc_longsword un sahip olduğu tüm yetenekler/animasyonlar.
6 ) nesne alt seviye denar değeri = 3
7 ) nesne istatistikleri = ağırlık(1.5)|hız(103)|uzunluk(90)|sallama zararı(16,blunt)|saplama zararı(10,blunt)
8 ) değişkenler = imodbits_none
9 ) tetikleyiciler. = None.



Antrenman kılıcının tuple’ ından onun hakkındaki her şeyi anlatabiliriz.

- Otomatik olarak “practice sword” meshini kullanıyor.
- Nesne özellileri olarak  tek elle kullanılan yakın dövüş silahı olduğu belli.Antrenman kılıcı ile  kuşanmış olarak envanterlerinden silah seçerken birinci yada ikinci silah olarak seçilip seçilemeyeceğine karar vermesi gerekiyor.
- 1,5kg geliyor. Hızı 103 uzunluğu 90 .Sallarken 16 kör zarar , saplarken 10 kör zarar veriyor.
- Herhangi bir nesne değişkeni yok.
 
5.2 -- Hasar/Zarar Tipleri

Daha önceki komut serisi emri (tuple) örneğinde incelediğimiz gibi “Antrenman Kılıcı”  kör zarar veriyor.Açıkça bu antrenman kılıcı olduğundan kaynaklı fakat bu M&B de değişik hasar tiplerinin olup olmadığını bakmamız konusunda bizi uyarıyor.

İlk olarak kesici zarar var. Kesici zarar kılıç veya balta gibi silahların keskin yüzünün dilimleme hareketini temsil ediyor.Kesici zarar zırhsız yada hafif zırhlı birliklere karşı avantajlar sağlıyor fakat ağır zırhlara karşı büyük bir dezavantajı var.Kesici zarar bir düşmanı ; gücünü 0 ‘ a indirdiği takdirde öldürür.

Sırada kör zarar var.Kör zarar gürz ve çekiç gibi keskin yüzü olmayan silahların verdiği zarardır.Kör zarar ağır zırhlı düşmanlara karşı küçük bir artı avantaj alır, fakat kör silahlar kesici silahlardan genelde daha kısadır ve de daha az zarar verirler.En büyük avantajları ise düşmanın gücü 0 ‘ a indiğinde düşmanı bayıltır.Baygın durumdaki düşmanlar ele geçirilip köle tacirlerine satılabilir.Atların verdiği zararlarda kör zarardır.

Son olarak delici zarar tatar yaylarının oklarının , okların delici uçlarının yada benzer silahların verdiği zarardır.Delici zarar ağır zırhlara karşı en çok artı avantajları alır ama fakat bunun karşılığı olarak toplamda az zarar verir.Delici zarar bir düşmanı ; gücünü 0 ‘ a indirdiği takdirde öldürür.
 
5.3 Yeni bir nesne/silah yaratmak


"practice_sword" tuple'ını kopyalayıp sayfanın en altına, köşeli ayraçtan "]" önce olmak suretiyle yapıştırınız. Bunu yaptıktan sonra, bu yeni tuple'ın adını(item name) ve kimliğini(item id) "new_mace" olarak değiştiriniz.

["new_mace","new_mace", [("practice_sword",0)], itp_type_one_handed_wpn|itp_melee|itp_primary|itp_secondary, itc_longsword, 3,weight(1.5)|spd_rtng(103)|weapon_length(90)|swing_damage(16,blunt)|thrust_damage(10,blunt),imodbits_none],

M&B'nin nesne sistemi çok esnektir; bir kılıcı gürze (mace) dönüştürmek sadece bir kaç ayar gerektirir. "practice_sword" tuple'ı halihazırda kör zarar(blunt damage) olarak ayarlanmış. Bu bizim işimizi daha kolay hale getiriyor.

Öncelikle, yeni gürzümüzün nesne özelliklerini "itc_longsword" 'dan "itc_scimitar" 'a değiştiriyoruz. Bu gürzümüzün saplama özelliğini kaybetmesini sağlayacaktır, çünkü M&B 'in saplama animasyonu "itc_scimitar" sabitinde bulunmamaktadır.


["new_mace","new_mace", [("practice_sword",0)], itp_type_one_handed_wpn|itp_melee|itp_primary|itp_secondary, itc_scimitar, 3,weight(1.5)|spd_rtng(103)|weapon_length(90)|swing_damage(16,blunt)|thrust_damage(10,blunt),imodbits_none],

Şimdi nesnenin mesh'ini "practice_sword" 'dan "mace_pear" 'a değiştireceğiz. Bu mesh Native'de kullanılmayan bir mesh, böylece gürzümüze yeni bir görünüm kazandırmış olacağız.


["new_mace","new_mace", [("mace_pear",0)], itp_type_one_handed_wpn|itp_melee|itp_primary|itp_secondary, itc_scimitar, 3,weight(1.5)|spd_rtng(103)|weapon_length(90)|swing_damage(16,blunt)|thrust_damage(10,blunt),imodbits_mace],

Bu örnekte, mesh'i planladığımız gibi değiştirdik ve ayrıca niteleyici parçalarını(modifier bits) imodbits_none 'dan imodbits_mace'e değiştirdik. Bu gürzümüzün dosyanın en başındaki imodbits_mace sabitinde belirtilmiş bütün niteleyicileri(modifiers) kullanamsını sağlar.

Bu nesneyi tamamlamamız için yapacağımız iki değişiklik daha var. Özellikle, nesnemizin savurma zararını(swing damage) arttıracağız ve bir nesne bayrağı(item flag) ekleyeceğiz.

İnceleme:


["new_mace","new_mace", [("mace_pear",0)], itp_type_one_handed_wpn|itp_melee|itp_primary|itp_secondary|itp_unique, itc_scimitar, 3,weight(1.5)|spd_rtng(103)|weapon_length(90)|swing_damage(26,blunt)|thrust_damage(10,blunt),imodbits_mace],


Gördüğünüz gibi, savurma zararını(swing damage) 16'dan 26'ya yükselttik, bu gürzümüzün daha iyi vurmasını sağlayarak savaşta daha teklikeli olmasını sağlayacaktır. Ve daha da önemlisi, Bayraklar(flags) alanına itp_unique bayrağını(flag) ekledik. itp_unique 'e sahip bi nesne savaş sonrasında ganimet olarak  alınamaz.

Son değişikliğimiz için, nesne adını "new_mace" yerine "Geoffrey's_mace" olarak değiiştiriniz. Sonra, module_trooops.py dosyasını açın ve Geoffrey'in envanterindeki(inventory) itm_clubitm_new_mace 'le değiştirin.

İki dosyada da yaptıklarınızı kaydedip build_module.bat 'a tıklayın.

Tebrikler! Yeni bir nesne yaratıp takım/asker envanterine(troop's inventory) eklediniz. Bahsi geçen takım/asker bi kahraman(hero), böylelikle yeni gürz sürekli envanterinde bulunacak ve envanterinde bulunup kullanabildiği en iyi silahı kullanacaktır.

Öte yandan sıradan askerler envanter listelerinden rasgele bir silah seçerler. Bu kadar çok çeşitli silahla karşımıza çıkmalarının sebebi de budur -- böyle olmasaydı hep aynı şekilde olurlardı.

Yeni nesneleri nasıl yaratacağımızı artık biliyoruz, daha çok çeşitli istatistiklere bakarak ne anlama geldiklerini anlayabiliriz.

 
5.4 -- Nesne Özellikleri

Bu bölümde özellikerin açıklayıcı bir listesini ve fonksiyonlarının incelemelerini bulacaksınız. Bazı özellikler farklı nesne tipleri için farklı işlere yaradıkları için listeyi nesne tiplerine göre düzenledik.

Genel

abundance -- Yüzde değer.
Bu özellik nesnenin tüccar envanterlerinde ve savaş sonrası ganimetlerde ne sıklıkta ortaya çıkacağını belirtir. Standartı 100 dür; 100 den büyük yada küçük (0'a kadar) olabilir.

weight -- Kilogram değer.
Nesnenin kilogram cinsinden değerini belirtir.


itp_type_horse (Atlarla ilgili özelliler için)

body_armor
-- değer.

Atın zırhının değerini ve hit-point değerini belirler. Değer ne kadar yüksek olursa zırh ve hit-point de o kadar çok olur..

difficulty -- değer.
Oyuncunun ata binmesi için Riding yeteneğinin ne kadar yüksek olması gerektiğini belirler.

horse_speed -- değer.

Atın savaş haritasındaki hızını belirler. Yüksek değer daha hızlı at demektir.

horse_maneuver -- değer.
Atın savaş haritaındaki  manevra kabiliyetini belirler.

horse_charge -- değer.
Atın piyadelere atıldığında(şarj ettiğinde) ne kadar hasar vereceğini ve şarj ettikten sonra her bir piyade için ne kadar hız kaybedeceğini belirler.Yüksek değer atın daha çok hasar vermesini ve daha çok piyadeyi geçmesini sağlar.

itp_type_one_handed_wpn (tek elle kullanılan silahlar için)

difficulty -- değer.

Silahı kullanmak için gereken minimum STR puanını belirler. Eğer bir asker bu değere eşit yada bu değerden daha yüksek bir STR puanına sahip değilse bu silahı kullanamaz.

spd_rtng
-- Değer.

Silahın atak hızını belirler.Hem savurma(swing) hemde saplama hızını etkiler.

weapon_length -- Santimetre değer.
Silahın santimetre cinsinden uzunluğunu belirler.Silahın mesh boyutu ne olursa olsun oyun içinde ne kadar uzağa yetişeceğini belirler.

swing_damage -- değer, hasar tipi.
Silahın savurarak(swing) atak yaparken vereceği temel hasarı ve hasar tipini belirler.

thrust_damage
-- değer, hasar tipi.

Silahın saplayarak(thrust) atak yaparken vereceği temel hasarı ve hasar tipini belirler.


itp_type_two_handed_wpn (İki elle kullanılan silahlar için)

itp_type_one_handed_wpn la aynı.


itp_type_polearm

itp_type_one_handed_wpn
la aynı.


itp_type_arrows
(Oklar için)

weapon_length -- Santimetre değer.
Okun santimetre cinsinden uzunluğu.

thrust_damage -- değer,hasar tipi.
Okun yayın temel yay hasarına ekleyeceği hasar miktarını ve hasar tipini belirler.

max_ammo -- değer.
Bir istifteki(kesedeki) ok sayısını belirler.


itp_type_bolts (tatar okları için)
itp_type_arrows la aynı.



itp_type_shield (Kalkanlarla ilgili)

hit_points -- değer.

Kalkanın temel darbe puanını(hit point) belirler.

body_armor --  değer.
Kalkana yapılan her vuruşta düşülücek hasar miktarı.

spd_rtng -- Value.
Kalkanın defans durumuna getirilme hızı.

weapon_length -- değer.
Kalkanın kapladığı alan.Yüksek değerler kalkanın, gövdenin daha büyük bir alanını kaplamasını sağlar,böylece vücudun daha büyük bir bölümünü oklardan korunabilir kılar.


itp_type_bow (yaylarla ilgli)

difficulty -- değer.

Bu yayı kullanabilmek için gerekli minumum Power Draw puanı. Eğer bir asker bu değere eşit yada bu değerden daha yüksek bir Power Draw puanına sahip değilse bu silahı kullanamaz.

spd_rtng -- değer.
Yayın doldurma süresi. Yani, askerin oku kılıftan alıp,yerşetirip, germesini ne kadar çabuk yapacağını belirtir.Yüksek değerler daha kısa doldurma zamanı demektir.

shoot_speed -- değer.
Bu yaydan çıkan okun havadaki hızıdırr. Yüksek değerler daha hızlı giden oklar demektir; dikkat edin, bununla birlikte hızlı oklar yakındaki düşmanlara değmeden geçip gidebilir.

thrust_damage -- değer, hasar tipi.

Bu yayla yapılan vuruşların temel hasar miktarı ve hasar tipini belirler.


itp_type_crossbow (tatar yayları için)

difficulty -- değer.[/i]
Tatar yayını kullanmak için gereken minimum STR puanını belirler. Eğer bir asker bu değere eşit yada bu değerden daha yüksek bir STR puanına sahip değilse bu silahı kullanamaz.

spd_rtng -- değer.
Tatar yayının doldurma süresi. Yani, askerin oku kılıftan alıp,yerşetirip, germesini ne kadar çabuk yapacağını belirtir.Yüksek değerler daha kısa doldurma zamanı demektir.

shoot_speed -- değer.
Bu tatar yayından çıkan okun havadaki hızıdırr. Yüksek değerler daha hızlı giden oklar demektir; dikkat edin, bununla birlikte hızlı oklar yakındaki düşmanlara değmeden geçip gidebilir.

thrust_damage -- değer, hasar tipi.[/i]
Bu tatar yayıyla yapılan vuruşların temel hasar miktarı ve hasar tipini belirler.

max_ammo -- değer.
Tatar yayının bir dolduruştan diğerine kadar atabileceği ok sayısı.


itp_type_thrown (Atılabilir silahlar için)

difficulty -- değer.[/i]
Bu tür silahları kullanabilmek için gerekli minumum Power Throw puanı. Eğer bir asker bu değere eşit yada bu değerden daha yüksek bir Power Throw puanına sahip değilse bu silahı kullanamaz.

spd_rtng -- değer.
Bir atıştan sonra diğer parçanın çekilip atışa hazır hale gelme süresi

shoot_speed -- değer.
Bu tür bir silah atıldıktan sonra  havadaki hızıdır.

thrust_damage -- değer, hasar tipi.[/i]
Bu silahla yapılan vuruşların temel hasar miktarı ve hasar tipini belirler.

max_ammo -- değer.
Bu tip silahlar için kılıftaki parça sayısı

weapon_length -- Santimetre değer.
Silahın santimetre cinsinden uzunluğunu belirler


itp_type_goods (erzaklar için)

food_quality
Yiyeceğin parti moraline etkisidir. 50'den yukardaki değerler bu yiyecek tüketildiğinde parti moralini arttırırken 50'den düşük değerl morali düşürür.

max_ammo
Tüketilebilir bölümünün sayısı.


itp_type_head_armor (Kafa zırhları için)

head_armor -- değer.
Zırhın, askerin kafasını koruyacağı hasar miktarı.

body_armor -- değer.
Zırhın, askerin vücudunu koruyacağı hasar miktarı.

leg_armor -- değer.
Zırhın, askerin bacaklarını koruyacağı hasar miktarı.

difficulty -- değer.
bu zırhı giymek için gereken minimun STR puanı.


itp_type_body_armor
(Vücut zırhları için)

itp_type_head_armor 'la aynı.


itp_type_foot_armor (Bacak zırhları için)


itp_type_head_armor 'la aynı.


itp_type_hand_armor (El zırhları için)


itp_type_head_armor 'la aynı.


itp_type_pistol (Tabancalar için)

difficulty -- değer.
Bu tabancayı kullanmak için gereken minimun STR puanı.

spd_rtng -- değer.
Tabancayı doldurma süresi. Yani, bir atıştan sonra tabancayı doldurup tekrar nişan alma süresi.

shoot_speed -- değer.
Ateş edildikten sonra merminin havadaki hızıdır.

thrust_damage -- değer, hasar tipi.[/i]
Bu silahla yapılan vuruşların temel hasar miktarı ve hasar tipini belirler.

max_ammo
Doldurmadan önce kaç el ateş edilebileceğini belirler.

accuracy -- yüzde değer.
Nişan alınan noktaya isabet etme olasılığı. Değer 100 ise atış %100 nişan alınan noktaya gider, daha düşük değerler nişan alınan noktaya isabet ettirme şansını fazlasıyla düşürür.

itp_type_musket (Tüfekler için)

itp_type_pistol
'la aynı.


itp_type_bullets
  (Mermiler için)

itp_type_arrows 'la aynı.
 
Dokumantasyonun bu kisminda, modulunuzun genelini en az etkileyecek en kucuk modul dosyalarini inceliyoruz. Fakat bu dosyalar yine de, cok degi$ik $ekillerde kullani$li olabilir. Bu bolum bittiginde her birinin icindeki parametrelerin nasil kullanildigini buyuk oranda kavrami$ olacaksiniz.


6.1 -- Module_Constants

Module_constants.py oldukca yalin bir dosyadir. Icerigi sabitlerden (constant) olu$ur -- dokumantasyonun 3. bolumunu okuduysaniz nasil cali$tiklarini zaten biliyor olmalisiniz. Module_constants icindeki sabitler ba$ka herhangi bi yerde tanimlanmi$ sabitlerle tamamen aynidir, ancak modul sistemi icerisinde birden fazla dosyada kullanilan sabitlerin modul sistemi tarafindan taninabilmesi icin mutlaka module_constants icinde tanimlanmasi gerekir.

Module_constants ayni zamanda bir sabitin degerini istediginiz zaman degi$tirebileceginiz duzenli ve kolay eri$ilebilir bir liste olma ozelligi de ta$ir. Herhangi bir degi$iklik sabitin kullanildigi butun operasyonlari ve tanimlamalari etkileyecegi icin butun dosyalar uzerinde tek tek degi$iklik yapmak zorunda kalmazsiniz.

Ornegin marnid_inn_entry = 2 sabitinin degerini marnid_inn_entry = 4 olacak $ekilde degi$tirirseniz marnid_inn_entry iceren butun i$lemler aninda sabiti 2 degil 4 olarak kullanacak $ekilde degi$ecektir.
 
6.2 -- Module_Factions

module_factions.py, modül sistemi ve Mount & Blade'in yapay zekası tarafından kullanılan bütün fraksiyonları içerir. Küçük bir dosya olmasına rağmen burada değinecegimiz birkaç önemli ayarı idare eder.

Dosya direkt olarak bir Python listesiyle başlar: factions = [. Bir çok modül dosyasında olduğu gibi, ilk birkaç tuple oyun motoruna eklenmiştir ve üzerlerinde degişiklik yapılmaması gerekir.


Bir fraksiyon örneği:

  ("innocents","Innocents", 0, 0.5,[("outlaws",-0.05)]),

Bu; tek büyük düşmanı "outlaws" (haydutlar) fraksiyonu olan "Innocents" (masumlar) fraksiyonunu yöneten kısa, oldukça basit bir tuple. Eger bir fraksiyonun "innocents" ile olan ilişkisi module_constants içinde hiçbir yerde tanımlanmamışsa, otomatikman 0'a eşit olur ve böylece bu iki fraksiyon birbirine tamamen nötr hale gelirler.


Tuple alanlarının dökümü:

1 ) Fraksiyon kimliği (Faction id). Başka dosyalarda fraksiyona referans vermeye yarar.
2 ) Fraksiyon adı (Faction name).
3 ) Fraksiyon bayrakları (Faction flags).
4 ) Fraksiyon tutarlılığı - Fraksiyon içi ilişki (Faction coherence). Bu fraksiyonun farklı üyelerinin birbirleri ile ilişkisini belirler.
5 ) Fraksiyonlar arası ilişkiler (Inter-faction relations). Her ilişki tanımı, aşağıdaki alanları içeren bir tuple'dır.
    5.1 ) Fraksiyon (Faction). İlişkinin geçerli olduğu diğer fraksiyon.
    5.2 ) İlişki (Relation). İki fraksiyon arasındaki ilişkinin durumu. Değeri -1 ve 1 arasında değişir.


Innocents tuple incelemesi:

1 ) Fraksiyon kimliği = "innocents"
2 ) Fraksiyon ismi = "Innocents"
3 ) Fraksiyon bayrakları = 0
4 ) Fraksiyon tutarlılığı = 0.5
5 ) Fraksiyonlar arası ilişkiler:
    5.1 ) Fraksiyon = "outlaws"
    5.2 ) İlişki = 0.05

Bu fraksiyon herhangi bir bayrak sahibi değil, nötr bir fraksiyon tutarlılığı var ve tuple'ında tanımlanmış olan "outlaws" haricinde bir düşmanı yok. Ancak, eğer başka yerleri de incelerseniz, örneğin "dark_knights"ın "innocents" ile ilişkisinin -0.9 olduğunu görebilirsiniz. Bunun nedeni bir ilişki tanımının çift taraflı çalışmasıdır -- yalnızca bir kez tanımlanması gerekir ve bu andan itibaren tanımlanan değer her iki fraksiyon için de geçerlidir.

Şimdi, "innocents" tuple'ını listenin en altına kopyalararak yeni bir fraksiyon tuple'ı oluşturun. Fraksiyon kimliğini ve ismini "geoffrey" yapın ve ilişki bölümündeki "outlaws"u "player_faction" olarak değiştirin.

Değişiklikleri kaydettikten sonra, module_party_templates.py ve module_troops.py dosyalarını açıp "new_template" şablonunun ve "Geoffrey" biriminin fraksiyonlarını "fac_geoffrey" olarak değiştirin. Değişiklikleri kaydedip çıktıktan sonra build_module.bat'a tıklayın. Eğer her şey yolunda gittiyse, "new_template" şablonlu partiler görünür olarak "Geoffrey" fraksiyonundan ve oyuncu karaktere düşman olacaklar.
 
Bu kısımda modül sistemindeki en büyük ve en önemli dosyalardan ; Mount & Blade oyunundaki tüm diyalogları içeren module_dialogs.py dosyasını inceleyeceğiz.Herhangi bir yaratmak istediğiniz yeni diyalog bu doyanın içine gidecek.Bu dosya ayrıca en alt kısmında daha kendi diyalogları olmayan birlikler için ataç diyaloglar içerir.

7.1 -- Module_Dialogs kırılmaları.

Dosya hemen bir python listesi ile başlar ve bu listeyi oyundaki ilk dialoglardan biri ile Constable Harek in River Pirate lar ile ilgili açıklaması ile takip eder.Hatırlanması gereken önemli ir gerçek oyun module diyaloglarını yukarıdan aşağıya ; durumun kriterlerine uyan ilk satırı kullanarak tarar.Başka başka durumlarda (bu haritadaki bir karşılaşmadan bir NPC ile bir sahnede konuşmaya kadar) kullanılan satırları ayırt eder.

Her diyalog satırının bir tupple olduğunu fark edeceksiniz.Satırları birleştiren birazdan inceleyeceğimiz diyalog-ifadeleri (dialog-states)dir.

Bir dialog tupplenın örneği

  [trp_constable_hareck,"start", [], "What do you want?", "constable_hareck_talk",[]],

Bu iyi bir örnek olarak kullanılabilecek basit harika bir tupple.Bir satır diyalogunun yapması gereken her şeyi yapıyor.Bir sahnede Constable Hareck’ e yaklaşıldığında “Constable Hareck _Talk” dialog-ifadesini verip mouse ile tıklanıldığında “What do you want” tekstini gösteriyor.

Tupple alan kırılmaları.

1)Diaylog yapılan kişi.Bu oyuncunun kimle konuşuyorsa onunla eşleşmeli
2)Başlangıç dialog-ifadesi. Bu satırın nasıl açılacağını ifade eder.


DEVAM EDECEK İŞ ZAMANI
 
Status
Not open for further replies.
Back
Top Bottom