Mount&Blade Ders Haritası (Grup Büyüklüğünü Değiştirme)

Users who are viewing this thread

Uzun zamandan sonra yeni bir ders ile aranıza dönmüş bulunuyorum.

Bu dersimizde ise process_scene üzerinde bazı düzenlemeler yapacağız ve bu düzenlemeler sayesinde artık fazla scn dosyalarından kurtulacağız. Ne demek istiyorum?

Başlamadan önce şunuda açıkca belirtmek isterim ki ben bazı denemeler yaptım, bazı köylere girdim çıktım bir sorun yaşamadım, lakin sorun olabileceğini kodları düzenlerken hata yapabileceğimi unutmazsanız ve mesaj olarak bunları bildirirseniz düzelteceğimden emin olabilirsiniz.

Öncelikle process_scene dosyasının çalışmasını biraz anlatalım. Normal bir module_scene.py dosyasında köy kodlaması şu şekildedir;
Code:
  ("village_101",sf_generate,"none", "none", (0,0),(100,100),-100,"0x00000001500410320005a96800006b5300004edc00000d11",
    [],[],"outer_terrain_desert"),

Bu köy kodlaması ise process_scene.py içerisinde ilk kısımda yazan "village_101" in başına scn_ yazılarak dosya araması yapılır yani bu köyün arayacağı dosya scn_village_101 dosyası olacaktır. Belki bir köy için bir scn dosyası çok fazla olmayabilir ama aynı scn dosyasını kullanmak için 100 tane köy eklediğizde bu defa scn_village_111 scn_village_112 ... gibi dosyalar oluşturacaksınız ve SceneOBJ dosyanızın içi dolacak, halbuki biz köy yaratırken istediğimiz scn_ doyasını okutma şansımız olsaydı, 100 tane köye sadece scn_village_hamit (buradaki hamit benim adım sadece atıyorum) gibi belirtip tüm köyleri o scn_ dosyasından okutabilirdik. İşte tam olarak bizim yapacağımız şey bu.

Artık her şehir oluşturduğunuzda 4 tane dosya oluşturmanıza gerek kalmayacak. Yada 10 tane köy oluşturduğunuzda.

Aşağıdaki ayarlamaların tamamı Warband 1.153 sürümüne aittir ve öncesinde hiç bir düzenleme yapılmamıştır. (Eğer önceden module_scene.py dosyasında düzenlemeler yaptıysanız onları tekrardan yapmanız yada bu koda göre uyarlamanız gerekmektedir.)

Eski kod ile yeni kod arasındaki fark,
Eski kod (Burada dikkat ederseniz "village_101" ile sf_generate arasında hiç bir şey yok):
Code:
  ("village_101",sf_generate,"none", "none", (0,0),(100,100),-100,"0x00000001500410320005a96800006b5300004edc00000d11",
    [],[],"outer_terrain_desert"),

Yeni kod ("village_101" ile sf_generate arasında scene dosyası bulunuyor):
Code:
  ("village_101","scn_village_101",sf_generate,"none", "none", (0,0),(100,100),-100,"0x00000001500410320005a96800006b5300004edc00000d11",
    [],[],"outer_terrain_desert"),

Şimdi gelelim düzenlemelere;


Öncelikle process_scene.py dosyasını açalım ve bununla değiştirelim;

Code:
from module_info import *
from module_scenes import *

from process_common import *

def save_python_header():
  ofile = open("./ID_scenes.py","w")
  for i_scene in xrange(len(scenes)):
    ofile.write("%s = %d\n"%(convert_to_identifier(scenes[i_scene][1]),i_scene))
  ofile.close()

print "Exporting scene data..."
save_python_header()

from process_operations import *
from module_troops import *

#Hamit Edition
scene_name_pos = 0 #Name
passages_pos = 9 #Passage
scene_troop_pos = 10 #Chest-Troop
scene_outer_terrain_pos = 11 #Outer Terrain

def write_vec(ofile,vec):
  ofile.write(" %f %f %f "%vec)
  
def write_passage(ofile,scenes,passage):
  scene_no = 0
  found = 0
  while (not found) and (scene_no < len(scenes)):
    if (scenes[scene_no][0] == passage):
      found = 1
    else:
      scene_no += 1
  if (passage == "exit"):
    scene_no = 100000
  elif (passage == ""):
    scene_no = 0
  elif not found:
    print "Error passage not found:"
    print passage
    do_error()
  ofile.write(" %d "%scene_no)


def save_scenes(variables,variable_uses,tag_uses):
  ofile = open(export_dir + "scenes.txt","w")
  ofile.write("scenesfile version 1\n")
  ofile.write(" %d\n"%len(scenes))
  for scene in scenes:
    ofile.write("%s %s %d %s %s %f %f %f %f %f %s "%(convert_to_identifier(scene[1]),replace_spaces(scene[0]),scene[2], scene[3],scene[4],scene[5][0],scene[5][1],scene[6][0],scene[6][1],scene[7],scene[8]))
    passages = scene[passages_pos]
    ofile.write("\n  %d "%len(passages))
    for passage in passages:
      write_passage(ofile,scenes,passage)
    chest_troops = scene[scene_troop_pos]
    ofile.write("\n  %d "%len(chest_troops))
    for chest_troop in chest_troops:
      troop_no = find_troop(troops,chest_troop)
      if (troop_no < 0):
        print "Error unable to find chest-troop: " + chest_troop
        troop_no = 0
      else:
        add_tag_use(tag_uses,tag_troop,troop_no)
      ofile.write(" %d "%troop_no)
    ofile.write("\n")
    if (len(scene) > scene_outer_terrain_pos):
      ofile.write(" %s "%scene[scene_outer_terrain_pos])
    else:
      ofile.write(" 0 ")
    ofile.write("\n")
  ofile.close()

variable_uses = []
variables = load_variables(export_dir, variable_uses)
tag_uses = load_tag_uses(export_dir)
quick_strings = load_quick_strings(export_dir)
save_scenes(variables,variable_uses,tag_uses)
save_variables(export_dir,variables,variable_uses)
save_tag_uses(export_dir,tag_uses)
save_quick_strings(export_dir,quick_strings)

Şimdi ise module_scene.py dosyamızda düzenlemeye gidelim; (Bu bölümde dikkat etmeniz gereken benim verdiğim Warband 1.153 sürümüdür başka sürümlerle uyumlu çalışmayabilir. Ek olarak düzenleme yapmışsanız düzenlemelerinizi tekrardan yapmanız gerekecektir yani sonradan eklediklerinizi yedeklemeyi unutmayınız.)

Dosyanın tamamını şöyle değiştirelim;
Kelime limitinden dolayı module_scene.py doyasını direkt olarak py olarak indirebilirsiniz;
Link: module_scene.py indir

Ve kodumuzun sonuna geldik, artık istediğimiz köye, şehire veyahut sahnesi olan her şeye özel bir scn verebiliriz.
 
yani aslında direkt oyunun modül bölümünden scenes.txt den de düzenlenebilir kafaya göre ama modül yaparken önce farklı yapıp sonra orada düzelttiği zaman insan, modül güncellediğinde tekrardan ayarlaması falan gerekir o yüzden böyle daha kolay olur diye düşündüm, çünkü tıpatıp aynı 20şer 30ar tane köy var hepsini tek dosyada toplamak daha kolay olur çünkü şimdi 20 tane köy ekliyorsun eklemesi bir eziyet zaten sonra bide tek tek durup kopyala yapıştır, isim değiştir yapıyorsun en sıkıcı kısmıda bu sanırım :smile:)
 
Hani çalmış gibi olmayayım, şahsen hiç bir modu yükleyip oynamadım ben o yüzden bilmiyorum. Elimden geldikce yeni fikirler üretip sizlerin işini kolaylaştırmaya çalışıyorum :smile:

 
Aynen ama şeyi farkettim ki vendor yani satıcıları scn dosyaları üzerine kullanıyorlarmış yani yine satıcı konulacak sahneleri farklı tutmak gerekecek gibi duruyor, tabi ben hala üzerinde çalışıyorum bu konunun direk sahne üzerine değilde parti üzerine koyabilirsek ilerde büyük bir eziyetten kurtarabilir bizi bu. Gerçi aynı sahneye koyacağımız için aynı sahneler için birer vendorda oluşturmaya gerek kalmayacak gibi duruyor yani satıcılar sabitleniyor böylece yani bir çok şehirde aynı mallarda satılabilir bu yöntemlede kullanılabilir, tam olarak kullanılmaz diyemeyiz yani :smile:
 
Bu günkü dersimiz kodlama yerine, daha çok bilgi üzerine olacak. Öncelikle Quick String ile Game String'in farkını anlatmak istiyorum. Game String (tam olarak Türkçe çevirisi ne olur bilmiyorum ama Oyun Etiketi olarak çevirdim ben) kalıcı verilerdir. Yani atıyorum ki module_string.py içerisine ("hamit", "Hamit"), eklediğimiz zaman str_hamit her zaman Hamit olarak cevap verecektir. Buna niye ihtiyaç olabilir dersek, misalen "Hamit" kelimesini çok fazla kullanıyorsam, niye sürekli Hamit yazıp Türkçe çeviri yaparken hepsini tek tek çevireyim? Yani bir nevi bize çeviri yapmakta kolaylık sağlıyor çünkü tek yapmamız gereken game_strings.csv dosyası içine str_hamit|Hamido gibi eklemek olacaktır.  Böylece artık oyundaki tüm Hamitler Hamido olarak değişecektir.

Quick Strings yani Hızlı Etiketler ise sadece kod devreye girdiği zaman devreye girmektedir. Mesela (str_store_string, s1, "@Hamit"), yaptığım zaman s1 o kod için Hamit olabilir ama diğer kodlar için Hamit değildir. Tabi koddan koda değişen bir veriyi çeviri yapmak iste Game String'e nazaran biraz daha karmaşıktır. Quick Stringler bize call_script tagında çok yardımcı olurlar, basitce inceleyelim.

Mesela Quick String'in kullanıldığı en belirgin yerlerden birisi İnşaatlardır.

Code:
  ("get_improvement_details",
    [(store_script_param, ":improvement_no", 1),
     (try_begin),
       (eq, ":improvement_no", slot_center_has_manor),
       (str_store_string, s0, "@Manor"),
       (str_store_string, s1, "@A manor lets you rest at the village and pay your troops half wages while you rest."),
       (assign, reg0, 8000),
     (else_try),
       (eq, ":improvement_no", slot_center_has_fish_pond),
       (str_store_string, s0, "@Mill"),
       (str_store_string, s1, "@A mill increases village prosperity by 5%."),
       (assign, reg0, 6000),
     (else_try),
       (eq, ":improvement_no", slot_center_has_watch_tower),
       (str_store_string, s0, "@Watch Tower"),
       (str_store_string, s1, "@A watch tower lets the villagers raise alarm earlier. The time it takes for enemies to loot the village increases by 50%."),
       (assign, reg0, 5000),
     (else_try),
       (eq, ":improvement_no", slot_center_has_school),
       (str_store_string, s0, "@School"),
       (str_store_string, s1, "@A shool increases the loyality of the villagers to you by +1 every month."),
       (assign, reg0, 9000),
     (else_try),
       (eq, ":improvement_no", slot_center_has_messenger_post),
       (str_store_string, s0, "@Messenger Post"),
       (str_store_string, s1, "@A messenger post lets the inhabitants send you a message whenever enemies are nearby, even if you are far away from here."),
       (assign, reg0, 4000),
     (else_try),
       (eq, ":improvement_no", slot_center_has_prisoner_tower),
       (str_store_string, s0, "@Prison Tower"),
       (str_store_string, s1, "@A prison tower reduces the chance of captives held here running away successfully."),
       (assign, reg0, 7000),
     (try_end),
     ]),

Burada bir input, yani bir girişimiz var. Peki input nedir?
Code:
(call_script, "script_get_improvement_details", NUMARA),

Burada numara bizim script girişimiz oluyor eğer kodumuz şöyle olsaydı;
Code:
(call_script, "script_get...", NUMARA, KALE),

Bu defa bizim 2 tane input yani girişimiz olacaktı.

Tabi bizim burada sadece tek bir girişimiz olduğu için kodlama yaparken önce girişimizi çekiyoruz ve kayıt ediyoruz;
Code:
(store_script_param, ":improvement_no", 1),

Burada girilen girişi ki burada bina numarası kullanıldığı için numara olacağından 1. inputu (yani sondaki 1 kaçıncı inputu alacağını gösteriyor) :improvement_no üzerine kayıt ettirdik. Biliyorsunuz ki ":" ile başlayan veriler yerel yani sadece kod içinde geçerli verilerdir. "$" ile başlayanlar değiştirilmediği sürece kalıcı, "reg1,2,3,4,5" gibi veriler ise eğer yanlış bilmiyorsam kod ve koda bağlı işlemler tamamen bitene kadar kalıcı olan verilerdir.

Her neyse, 1. girişimizi kayıt ettirdikten sonra, girişimize uyan binayı bulmak kalıyor, bu defa giriş numaramız ile bina numaralarını eşleştiriyoruz, ve eğer onlardan birine uyarsa bu defa QUICK String vererek bilgilerini çekebiliyoruz. Atıyorum ki Giriş numaramız ile 1. bina yani Manor'un uyuştuğunu kabul edelim.

Code:
       (eq, ":improvement_no", slot_center_has_manor),
       (str_store_string, s0, "@Manor"),
       (str_store_string, s1, "@A manor lets you rest at the village and pay your troops half wages while you rest."),
       (assign, reg0, 8000),

Bu andan itibaren s0 artık @Mayor, s1 açıklaması reg0 ise ücreti olacaktır. Diğer yandan süresi neden yok derseniz, bina süresi ise tamamen ücretin, mühendisliğe ve grup mühendislik artısına bağlı olarak düşüşünden sonra 100 e bölünüp 3 fazlası alınarak bulunur. Yani ücret 8000 ve sizin 10 mühendislik seviyeniz varsa grup mühendislik seviyeside 5 ise, (8000*(20-10-5))/20 yani (8000*5)/20=40000/20=2000 dinar olacaktır. 2000 dinarı ise 100 e böldüğümüzde 20, 3 topladığımızda 23 güne denk gelecektir.  Ama konumuz bu olmadığı için bu konuda pek fazla ayrıntıya girmeye gerek yok.

Peki şimdi s0, ile s1 i QUICK String olarak belirledik, fakat her kodda s0 s1 var, oyun hangisinin hangisi olduğunu nerden anlayacak? İşte tamda burada veri giriyor devreye. Quick stringler veri üzerinden çalışır yani;
Code:
qstr_Manor|Malikane

Fakat şöyle bir sorun var ki bazen Quick Stringler 4-5 satırlık yazı olabiliyor, çevirirken 4,5 satırdaki tüm boşlukları "_" yaparak mı çevireceğiz? Düşünsenize ne kadar zaman alırdı her kod için ve ne kadar karmaşa olurdu. İşte tam yine burada imdadımıza process_operation.py yetişiyor.

Process operation içerisinde QSTR_ tanımlamasında QSTR ye 20 karakter limiti konulmuş yani, eğer ki s1 yani açıklamayı çevirmek istersek boşlukları "_" yapmak ve bir karakter symak şartı ile şu şekilde çevirmemiz gerekecekti;
qstr_A_manor_lets_you_res|Açıklama

Burada eğer yanlış saymadıysam qstr_ den sonra 20 karakter yazdık, şimdi çeviriyi kontrol edelim;
Code:
qstr_A_manor_lets_you_res|Malikane köyde kalmanı sağlar ve  burada kalırken askerlerin maaşını yarıya düşürür.

Burada da göründüğü gibi 20 karakter res de bitiyor.
Burada dikkat edilmesi gereken nokta büyük/küçük harfdir. Yani "@Hamit Tower" olarak girilen veri, qstr_Hamit_Tower olarak çevirilmelidir. Yani bu kesin değil ama kodların tamamında bu şekilde yapılmış, bu nedenle öyle olduğunu tahmin ediyorum. Ek olarak Quick Stringler oyun başladığında kayıt edildiği için, benzer qstr tanımladıktan sonra Türkçe görünmesi için yeni oyuna başlamak gerekecektir.

Umarım anlatımım olmuştur, anlatmak konusunda pek becerikli olduğumu söyleyemem lakin, elimden geleni yaptım, inş. anlatabilmişimdir.
 
Uzun zaman sonra yine buradayım, aslında paylaşacağım bir kaç şey vardı ama ilk olarak http://forums.taleworlds.com/index.php/topic,219086.msg5979449.html#msg5979449 linkindeki deniz savaşlarında eksik olan module_mission_templates.py kısmını ekledim ve savaş sırasında askerlerinin üzerinde banner görünmeme sorununu giderdim. Ek olarak hala lordları deniz üstünde gezdirmeyi planlıyorum, eğer onuda kodlayabilirsem düzelteceğim, şimdilik sadece düzeltmeler.

1024x575.resizedimage
 
Bu dersimizde yeni yetenek eklemeyi öğreneceğiz.

Değiştireceğimiz dosyalar;
Code:
module_skills.py
header_skills.py

Aslında bu konu en basit konulardan birisidir. Çünkü bizim için 10 adet reserve skill bırakılmış.

Düzenlemeye başlamadan önce yedek almayı unutmayınız.

ilk olarak module_skills.py dosyasını açalım.

Code:
  ("reserved_1","Reserved Skill 1",sf_base_att_cha|sf_inactive,10,"This is a reserved skill."),

Ben burada reserved_1 skillini seçtim, siz istediğiniz bir taneyi seçebilirsiniz.

Okuma yeteneği ekleyeceğimizi var sayalım yani "skl_reading".

Code:
  ("reading","Reading",sf_base_att_int,10,"This is a reading skill."),

Burada kesinlikle dikkat edilmesi gereken kısım düzenlediğimiz yeteneğin yerini değişmemek çünkü birazdan header_skills.py içinde direkt olarak konum belirteceğimiz için eğer 1 skillin yeri değişirse diğer skillerinde sayıları 1 azalacak veya artacağından bütün ayarları tekrardan yapmanız gerekecektir.

Burada "reserved_1" yerine "reading" yazdık. Bu skl_reading'e denk geliyor.
"Reading" kısmı ise skillin görünen ismi olacaktır. (Dil dosyasında skl_reading|Okuma)
sf_base_att_int kısmı ise yeteneğimizin temelidir "cha" Karizma, "int" Zeka, "agi" Çeviklik ve "str" Güç değerlerini temsil eder. Okuma bir zeka yeteneği olduğundan ben sf_base_att_int olarak değiştirdim.
sf_inactive kısmı ise skill in karakter ekranında gizlenmesini sağlar, bu nedenle kaldırdık.
10 kısmı ise skill in en yüksek gelebileceği değerdir. Yani oraya 5 yazarsak skilli en fazla 5 e kadar yükseltebilirsiniz.
"This is a reading skill." kısmı ise skill açıklamasıdır, yani skill üzerine geldiğimizde sağ üste yazan bilgidir. (Dil dosyasında skl_reading_desc|Bu okuma yeteneğidir.)

Gel gelelim şimdi skl_reading tanımlamasını yapmaya, header_skills.py dosyasını açalım ve değiştirdiğimiz skilli bulalım. Burada reserved_1'i değiştirdiğimiz için skl_reserved_1 kısmını bulalım.

Code:
skl_reserved_1 = 3

bunu skl_reading olarak değiştirelim.

Code:
skl_reading = 3

Bu kısmı yapmazsak eğer skl_reading tanımlanamadı hatası ile karşılaşırsınız.

Aynı dosya içerisinde edeğiştirdiğimiz yeteneğin knows_ kısmını bulalım yani knows_reserved_1

Code:
knows_reserved_1_1 = 4096
knows_reserved_1_2 = 8192
knows_reserved_1_3 = 12288
knows_reserved_1_4 = 16384
knows_reserved_1_5 = 20480
knows_reserved_1_6 = 24576
knows_reserved_1_7 = 28672
knows_reserved_1_8 = 32768
knows_reserved_1_9 = 36864
knows_reserved_1_10 = 40960

reserved_1 kısımlarını reading olarak değişelim yani;

Code:
knows_reading_1 = 4096
knows_reading_2 = 8192
knows_reading_3 = 12288
knows_reading_4 = 16384
knows_reading_5 = 20480
knows_reading_6 = 24576
knows_reading_7 = 28672
knows_reading_8 = 32768
knows_reading_9 = 36864
knows_reading_10 = 40960

Peki buradaki 4096, 8192 kısımları nedir. Her skill in ilk değeri bir öncekinin 16 ile çarpımına eşittir yani;

Code:
knows_trade_1 = 1
knows_leadership_1 = 16
knows_prisoner_management_1 = 256
knows_reserved_1_1 = 4096

burada gördüğünüz gibi trade_1 = 1 bunu 16 ile çarpınca leadership_1 e eşit oluyor yani 16, bunu 16 ile çarpnca bir sonraki yetenek yani prisoner_managementin başlangıcını buluyoruz yani 256 bunuda 16 ile çarptığımızda 4096 ile bir sonraki yeteneğin başlangıcını buluyoruz ve bu böyle gidiyor.

Aynı zamanda her skill ise kendi içinde ilk döngünün sırayla katına sahiptir yani demek istediğim şu ki taban başlangıç 4096 ise _2 kısmı bunun 2 katı _3 kısmı bu sayının 3 katı olacaktır yani örnek olarak göstermek gerekirse;

Code:
knows_reserved_1_1 = 4096 (4096 x 1)
knows_reserved_1_2 = 8192 (4096 x 2)
knows_reserved_1_3 = 12288 (4096 x 3)
knows_reserved_1_4 = 16384 (4096 x 4)
knows_reserved_1_5 = 20480 (4096 x 5)
knows_reserved_1_6 = 24576 (4096 x 6)
knows_reserved_1_7 = 28672 (4096 x 7)
knows_reserved_1_8 = 32768 (4096 x 8)
knows_reserved_1_9 = 36864 (4096 x 9)
knows_reserved_1_10 = 40960 (4096 x 10)


Türkçeleştirmek için ise skill.csv dosyasına
Code:
skl_reading|Okuma
skl_reading_desc|Bu bir okuma yeteneğidir.

Gibi yazmanız yeterli olacaktır.

Her hangi bir kodun içinde sorgulamak için ise diğer kodlardaki gibi

Code:
(store_skill_level, ":reading", skl_reading, "trp_player"),
(try_begin),
  (gt, ":reading", 0),
  ...
(try_end),

Gibi kullanabilirsiniz. Ek olarak eğer isterseniz bu bir okuma yeteneği olduğu için module_game_menus.py içerisinde

Code:
        (eq,"$background_answer_3",cb3_student),

aratıp hemen altına;

Code:
        (troop_raise_skill, "trp_player", skl_reading, 1),

şeklinde ekleyip öğrenci başlayanların başlangıçta 1 okuma yeteneği ile başlamasını sağlayabilirsiniz.
 
Porshy said:
Bu dersimizde yeni yetenek eklemeyi öğreneceğiz.

Değiştireceğimiz dosyalar;
Code:
module_skills.py
header_skills.py

Aslında bu konu en basit konulardan birisidir. Çünkü bizim için 10 adet reserve skill bırakılmış.

Düzenlemeye başlamadan önce yedek almayı unutmayınız.

ilk olarak module_skills.py dosyasını açalım.

Code:
  ("reserved_1","Reserved Skill 1",sf_base_att_cha|sf_inactive,10,"This is a reserved skill."),

Ben burada reserved_1 skillini seçtim, siz istediğiniz bir taneyi seçebilirsiniz.

Okuma yeteneği ekleyeceğimizi var sayalım yani "skl_reading".

Code:
  ("reading","Reading",sf_base_att_int,10,"This is a reading skill."),

Burada kesinlikle dikkat edilmesi gereken kısım düzenlediğimiz yeteneğin yerini değişmemek çünkü birazdan header_skills.py içinde direkt olarak konum belirteceğimiz için eğer 1 skillin yeri değişirse diğer skillerinde sayıları 1 azalacak veya artacağından bütün ayarları tekrardan yapmanız gerekecektir.

Burada "reserved_1" yerine "reading" yazdık. Bu skl_reading'e denk geliyor.
"Reading" kısmı ise skillin görünen ismi olacaktır. (Dil dosyasında skl_reading|Okuma)
sf_base_att_int kısmı ise yeteneğimizin temelidir "cha" Karizma, "int" Zeka, "agi" Çeviklik ve "str" Güç değerlerini temsil eder. Okuma bir zeka yeteneği olduğundan ben sf_base_att_int olarak değiştirdim.
sf_inactive kısmı ise skill in karakter ekranında gizlenmesini sağlar, bu nedenle kaldırdık.
10 kısmı ise skill in en yüksek gelebileceği değerdir. Yani oraya 5 yazarsak skilli en fazla 5 e kadar yükseltebilirsiniz.
"This is a reading skill." kısmı ise skill açıklamasıdır, yani skill üzerine geldiğimizde sağ üste yazan bilgidir. (Dil dosyasında skl_reading_desc|Bu okuma yeteneğidir.)

Gel gelelim şimdi skl_reading tanımlamasını yapmaya, header_skills.py dosyasını açalım ve değiştirdiğimiz skilli bulalım. Burada reserved_1'i değiştirdiğimiz için skl_reserved_1 kısmını bulalım.

Code:
skl_reserved_1 = 3

bunu skl_reading olarak değiştirelim.

Code:
skl_reading = 3

Bu kısmı yapmazsak eğer skl_reading tanımlanamadı hatası ile karşılaşırsınız.

Aynı dosya içerisinde edeğiştirdiğimiz yeteneğin knows_ kısmını bulalım yani knows_reserved_1

Code:
knows_reserved_1_1 = 4096
knows_reserved_1_2 = 8192
knows_reserved_1_3 = 12288
knows_reserved_1_4 = 16384
knows_reserved_1_5 = 20480
knows_reserved_1_6 = 24576
knows_reserved_1_7 = 28672
knows_reserved_1_8 = 32768
knows_reserved_1_9 = 36864
knows_reserved_1_10 = 40960

reserved_1 kısımlarını reading olarak değişelim yani;

Code:
knows_reading_1 = 4096
knows_reading_2 = 8192
knows_reading_3 = 12288
knows_reading_4 = 16384
knows_reading_5 = 20480
knows_reading_6 = 24576
knows_reading_7 = 28672
knows_reading_8 = 32768
knows_reading_9 = 36864
knows_reading_10 = 40960

Peki buradaki 4096, 8192 kısımları nedir. Her skill in ilk değeri bir öncekinin 16 ile çarpımına eşittir yani;

Code:
knows_trade_1 = 1
knows_leadership_1 = 16
knows_prisoner_management_1 = 256
knows_reserved_1_1 = 4096

burada gördüğünüz gibi trade_1 = 1 bunu 16 ile çarpınca leadership_1 e eşit oluyor yani 16, bunu 16 ile çarpnca bir sonraki yetenek yani prisoner_managementin başlangıcını buluyoruz yani 256 bunuda 16 ile çarptığımızda 4096 ile bir sonraki yeteneğin başlangıcını buluyoruz ve bu böyle gidiyor.

Aynı zamanda her skill ise kendi içinde ilk döngünün sırayla katına sahiptir yani demek istediğim şu ki taban başlangıç 4096 ise _2 kısmı bunun 2 katı _3 kısmı bu sayının 3 katı olacaktır yani örnek olarak göstermek gerekirse;

Code:
knows_reserved_1_1 = 4096 (4096 x 1)
knows_reserved_1_2 = 8192 (4096 x 2)
knows_reserved_1_3 = 12288 (4096 x 3)
knows_reserved_1_4 = 16384 (4096 x 4)
knows_reserved_1_5 = 20480 (4096 x 5)
knows_reserved_1_6 = 24576 (4096 x 6)
knows_reserved_1_7 = 28672 (4096 x 7)
knows_reserved_1_8 = 32768 (4096 x 8)
knows_reserved_1_9 = 36864 (4096 x 9)
knows_reserved_1_10 = 40960 (4096 x 10)


Türkçeleştirmek için ise skill.csv dosyasına
Code:
skl_reading|Okuma
skl_reading_desc|Bu bir okuma yeteneğidir.

Gibi yazmanız yeterli olacaktır.

Her hangi bir kodun içinde sorgulamak için ise diğer kodlardaki gibi

Code:
(store_skill_level, ":reading", skl_reading, "trp_player"),
(try_begin),
  (gt, ":reading", 0),
  ...
(try_end),

Gibi kullanabilirsiniz. Ek olarak eğer isterseniz bu bir okuma yeteneği olduğu için module_game_menus.py içerisinde

Code:
        (eq,"$background_answer_3",cb3_student),

aratıp hemen altına;

Code:
        (troop_raise_skill, "trp_player", skl_reading, 1),

şeklinde ekleyip öğrenci başlayanların başlangıçta 1 okuma yeteneği ile başlamasını sağlayabilirsiniz.

Ders çok güzel ve yararli olmuş ellerine sağlik
 
Güzel yorumlarınız için teşekkürler arkadaşlar, elimden geldikce bende öğrendikce aktarmaya çalışıyorum.

Soruya gelirsem ülke ekleyince şehir menülerinin sapıtmasından kastın tam oolarak ne olduğunu anlamadım, bir çok sebebi olabilir;

  • Şehir tanımlamalarında mnu_town tanımlamasında hata yapmış olabilirsin.
  • Faction'u menülerden birine tanımlamamış olabilirsin.
  • Şehir menüsünün kodu içerisinde kaymalar yaşanmış olabilir.

Daha düşününce bir çok şey sayılabilir ancak sorun tam olarak nedir yani menüler mi açılmıyor yoksa menüler açılıyorda seçenekler mi yeteli değil, resimle veya anlatarak biraz açıklarsan sorunu anlayabiliriz belki, olmadı sen eğer bana modül dosyalarını gönderirsen ben kendimdeki mbfs üzerinde deneme yapıp sorunu daha kolay çözebilirim
 
Asıl ben teşekkür ederim bir modcu olarak, araştırmaların ve paylaşımların için.

Mesela yeni bir ülke ekledin. Tüm kodlamaları yaptın. Ama şehir menülerinde sapıtmalar oluyor. Örneğin:

5B8ED2F2984EAB679C376215BB1A31B826256ADE

660CADE288D0CCCDFD9D947907C96DACC4860FB9

Bunun çözümünü biliyor musun veya başına geldi mi?
 
İlk resim yeni eklenen şehre girişte gelen menü, 2. resimde normal ekli olan şehre girdiğinde gelen bir menü mü sorunu tam anlayamıyorum sanırım ben, benim anladığım şu

Yeni bir ülke ekledin, yeni şehirler ekleyip o ülkeye verdin fakat yeni şehirlere girdiğinde bu menü geliyor ama eski şehirlerde sorun yok doğru mu?

Eğer sorun buysa module_parties.py içinden şehirlerin kodlarını gönderirsen inceleyebilirim, muhtemelen pf_town tagı verilmemiş olabilir şehirlere.
 
Resimler çok taze değil. İlk resim sanırsam yoldaş eğitme menüsü. Normalde orada yeteneklerin yazması lazım, onların yerine uzun uzun cümleler var. 2. resimde de "There is a rumour in the city:" altında "Mill" ve "Infantry Commander" yazan yerlerde şehirler ilgili söylentilerden bahsetmesi lazım, uzun cümlelerle.

Baştan alayım kısaca. Forumdaki tüm ülke ekleme kodlarını uyguladım. Her şey sorunsuz çalışıyor. (Şehir falan değil sadece ülke.)

Ama...

Bir şehre girdiğinde "Şehirde yeni bir bina inşa edildi. Halk bundan çok mutlu oldu." gibi yazılar yazar üst tarafta. İşte o yazılar bazen "NO STRING" oluyor bazen de şehir menüsünde yazan farklı yazılarla değişiyor. "Silah ustası" yazması gereken yerde "Şehirde yeni bir bina inşa edildi. Halk bundan çok mutlu oldu." yazıyor. Gibi. "Şehirde yeni bir bina inşa edildi. Halk bundan çok mutlu oldu." yazması gereken yerde bambaşka bir şey yazıyor. Sadece sonradan eklediğin ülke değil diğerleri de sapıtıyor.

Yine anlatamadıysam tekrar yazarım sorun değil. :smile:
 
yok yok anladım, sorun tam nerede böyle bakarak söyleyemem ama sorun şu ki str_store_string kısımlarında muhtemelen s değerleri eklediğin krallığın stringleri ile karışıyor yada eğer bu şehir onlara ait ise eksik eklenen bir nokta vardır bu nedenle faction bulamadığı için no string olarak veya daha önceden tanımlanmış bir s değeri varsa o dönüyordur yani sorun string karışıklığı ancak tüm kodları incelemeden kesin bir cevap vermemin mümkünatı yok bu durumda çünkü hata .py dosyaları içinde herhangi bir yerde olabilir, call_script olarak çağırılan bir scriptte veya parties içinde tanımlanmayan bir partide dahi olabilir. Eğe bana modül dosyanı upload edip özelden yollarsan kodun sonundan başlayıp başa doğru giderek hatanın kaynağını bulabilirim.

Bide daha önce krallık ekleme yöntemiyle ilgili bir mesajım olacaktı

http://forums.taleworlds.com/index.php/topic,219086.msg5250913.html#msg5250913
http://forums.taleworlds.com/index.php/topic,219086.msg5250918.html#msg5250918

2 kısımdan oluşuyor, eğer istersen burayı daha önce uyguladığın kodlarla karşılaştırıp eksik noktalarınıda bulmaya çalışabilirsin. Gerçi sorun var mı hatırlamıyorum lakin hatalı olsa ve fark etsem paylaşmazdım yani muhtemelen hatasızdır ama dediğim gibi eğer modülünü upload edip özelden yollarsan hatayı inceleyip sana çözümünü söyleyebilirim
 
Bu benim aylarımı harcayıp uzun zaman önce havlu attığım bir sorun. Açıkçası şu anda bu kodu kullanmıyorum. Modu biraz daha toparlayıp sonra bu ülke ekleme kodlarını askerlerinden, sancaklarına tümden gireceğim.

Yabancı yapımcılara da sordum. Özelden, genelden. Uzun süre önce ümidimi kesmiştim ama yine bazı arkadaşlara tutarsa diye soruyordum. Geçenlerde bir cevap aldım. Cevap veren arkadaş sinir bozucu bir durum olduğunu söyledi. Yeni ülkeler için string hazne(slot)si açmak babında bir şeyler yazdı. 1-2 satırlık bir kod verdi. Ama ben nezaketen kodu paylaşamam izin almadan, sordum kısa süreye dönecektir, dönmezse kısa süreye mecbur yazarım özelden. Son yoğunlukta deneme fırsatım olmadı. Sende bu sorun olmadı mı merak ettim. Çünkü seni adınla hatırlıyorum konulardan. Sen de bilmiyorsan bizden bilen çıkmaz.
 
Back
Top Bottom