[Rehber]Module System Kullanımı

Users who are viewing this thread

erennuman_mb

Grandmaster Knight
Kodlamaya yeni başlayan arkadaşlarımızın işini kolaylaştırmak için bunu yazmaya karar verdim. Ayrıca benim eski halim gibi kodlara aval aval bakan arkadaşlara da bayağı yardımı dokunur inşallah :grin:. Bun yazarken Caba'drin'in An Introduction to Module System Syntax and Usage dersinden ilham aldım. Evet, daha önce çevrilmişti.

Başlangıç
Öncelikle kodlamada sürekli karşılaşacağımız bazı terimleri yazmak istiyorum. Bunlar hayati önemlidir.
Bu terimi kendim uydurdum. Modül sistemde kendi dosyası olan şeylere nesne denir. Nesnelerin başına prefix denen yazılar gelir. script_, mnu_, itm_ gibi.
Bunu da kendim uydurdum, İngilizcesi aslında stringdir. "" işaretleri arasına yazılan şeylere denir.
Modül sistemdeki komut/eylemlere operation denir. Bunları o kadar ayrıntılı işlemeyeceğiz çünkü çok fazla var. Operasyonların listesini header_operations'da bulabilirsiniz. Yalnız hiç açıklama yoktur. Bunu kullanmanız tavsiye edilir.
Operationların kullandığı materyallere argüman denir. header_operations'ta argümanlar <> işaretleri arasında gösterilir.
İçine bir değer, yahut bir nesne, vs. yüklenebilen şeylere değişken denir.

Yazım Kuralları
Module System'ın da kendine özgü yazım kuralları bulunmaktadır. En temel kural tuple ve block mantığıdır.
Tuple = İki parantez arasına tuple denir. Operasyonların parantezleri buna dahil değildir. Tupleların sonuna her zaman virgül konur.
Block = İki köşeli parantez arasına block denir. Blockların içine genellikle operasyonlar yazılır. Eğer bir blocktan sonra ) varsa bloktan sonra virgül konmaz, yoksa konur.
Operasyonlardan sonra virgül konur, eğer operasyonla aynı satırda ve dibinde ] varsa koymaya gerek yoktur. Koyulsa da bir şey olmaz. (operasyon)] gibi.

Değişkenler
Değişkenler, yukarıda bahsettiğim gibi içine bir değer yahut bir nesne yüklenebilen şeylerdir. Hemen hemen her yerde bunları kullanırız. Değişkenlere değer yüklemek için çeşitli operasyonlar kullanılır. Değişken çeşitleri şunlardır:
Yerel değişkenler, sadece şu an bulundukları blokta aktiftirler. Yani yereldirler. ":falan_filan" şeklinde gösterilirler. Bir yerel değişen oluşturmak için header_operations'ta <destination> yazan argümanlara kafanızdan bir isim sallayıp yazabilirsiniz. Tüyo: Değişkenlere adam gibi isim verin. Bazı kısaltmalar kullanmakta fayda var: cur = current, num = number gibi.
Küresel değişkenler, bütün modül dosyaları tarafından bilinen değişkenlerdir. "$falan_filan" şeklinde gösterilirler. Bir küresel değişen oluşturmak için header_operations'ta <destination> yazan argümanlara kafanızdan bir isim sallayıp yazabilirsiniz. (Tüyo: Değişkenlere adam gibi isim verin)Modül sistemdeki variables.txt'de bulunan değişkenlerin kendilerine özel değerleri vardır.
Registerlar, önceden oluşturulmuş küresel değişkenlerdir. reg0'dan reg65'e kadar register vardır. Genellikle bir şeyi geçici olarak depolamak için kullanılırlar. Ayrıca bir registera sayı atadığınız zaman bir yazının içinde {reg1} vs. şeklinde gösterebilirsiniz. Yeni registerlar oluşturamazsınız. Bir registera değer yüklemek için header_operations'ta <destination> yazan argümanlara reg0, reg1 vs. yazabilirsiniz.
Yazı anlamına gelen stringlerle karıştırmamak için bunlara string register da denir. s0'dan s67'ye kadar string vardır. Yeni stringler oluşturamazsınız. Ayrıca bir stringe yazı depoladığınız zaman bir yazının içinde {s1} vs. şeklinde gösterebilirsiniz. Bir stringe yazı depolamak için header_operations'ta <string_register> yazan argümanlara s0, s1 vs. yazabilirsiniz.
Bir presentation, bir sahne veya dünya haritasındaki herhangi bir şeyin yerini kaydetmek için pozisyonlar kullanılır. pos0'dan pos63'e kadar poszisyon bulunur. Yeni pozisyonlar oluşturamazsınız. Bir pozisyona yer kaydetmek için header_operations'da <position> yazan yere pos1 vs. yazabilirsiniz.
module_constant'ta listelenen değişkenlere constant denir. Bu dosyadaki constantların kendilerine özel değerleri vardır. Fakat siz bir constant eklediğinizde ona bir değer verene kadar bir işe yaramaz. Yeni bir constant oluşturmak için module_constants'ta: constant_item = "itm_spear" gibi yazmanız gerekir. Burda, mızrak nesnesini constant_item içine depoladık.
Local variable, global variable, register ve constant aynı amaçla kullanılabilir. Ama string ve position özeldir.

Prefixler bir nesnenin türünü belirtirken kullanılır. Eğer prefixi yanlış yazarsanız Error: Unrecognized tag hatası alırsınız. Pek çok module system dosyası prefixlere sahiptir.
module_animations: "anim_"
module_factions: "fac_"
module_info_pages: "ip_"
module_items: "itm_"
module_map_icons: "icon_"
module_game_menus: "menu_"
module_meshes: "mesh_"
module_mission_templates: "mst_"
module_particle_systems: "psys_"
module_parties: "p_"
module_party_templates: "pt_"
module_pstfx_params: "pfx_"
module_presentations: "prsnt_"
module_quests: "qst_"
module_scene_props: "spr_"
module_scenes: "scn_"
module_scripts: "script_"
module_skills: "skl_"
module_sounds: "snd_"
module_strings: "str_"
module_tableau_materials: "tableau_"
module_troops: "trp_"

Slotlar, global variablelar gibidir. Fakat slotların özelliği, her nesne için farklı bir değere sahip olmalıdır. Mesela slot_troop_renown bir troop için 500, diğer troop için 1200 olabilir. Yeni bir slot eklemek için module_constants'ta slot_falan_filan = 251 şeklinde eklenebilir. Sondaki sayının diğer slotlar tarafından kullanılmıyor olması tavsiye edilir.

Operasyon Bilgisi
Bana göre 5 çeşit operasyon vardır.
  • Doğrudan eylem gerçekleştiren operasyonlar
  • Bir değer veya nesneyi değişkene kaydeden operasyonlar
  • Matematik işlemleri
  • Şart operasyonları
  • Flow operasyonları
Doğrudan eylem gerçekleştiren operasyonlar, direkt bir eylem gerçekleştirirler( :razz:) Mesela (display_message, "@Bla bla"), gibi.
Bir değer veya nesneyi değişkene kaydeden operasyonlar, bir şeyi bir değişkene kaydederler. Mesela (assign, ":falan_filan", "trp_player"), player troopunu ":falan_filan"ın içine kaydeder.
Matematik işlemleri bir değere işlem uygular. (val_add, ":falan_filan", 1), ":falan_filan" değerine 1 ekler mesela.
Şart operasyonları bu operasyondan sonra gelecek operasyonun uygulanıp uygulanmayacağını belirler.
Mesela
Code:
(assign, ":falan_filan", 1), #Falan filan'a 1 degerini verdim.
(eq, ":falan_filan", 1), #Falan filan 1se,
(display_message, "@asdasdsf"), #Ekrana asdasdf yaz.
Eğer herhangi bir şart operasyonunun cevabı 'hayır' çıkarsa ondan sonraki bütün kodlar iptal olur. Evet çıkarsa ondan sonraki operasyonlar tek tek uygulanır.
Flow operasyonları diğer operasyonları kontrol eder. Bunlardan birkaç tane vardır, hepsi de önemli olduğu için tek tek yazacağım:
module_scripts.py dosyasından bir script'in uygulanmasını sağlar. İletinin içindeki bir spoiler'ı açmak gibi düşünebilirsiniz.
Bir deneme-yanılma döngüsü başlatır. Şöyle ki, burdan önceki ve sonraki kodlar bir kenara bırakılıp sadece burası işlenir. Döngü bittiğinde koda geri dönülür. Bu da spoilerlar gibidir.Çalışma prensibini aşağıda anlatacağım.
Eğer deneme-yanılma döngüsündeki (try_begin)'in altındaki herhangi bir şart operasyonunun cevabı hayır çıkarsa, (else_try) yazan yerin altındaki şeyler işlenir. Bu da yanlış çıkarsa sonraki (else_try)'ın altına bakılır.
Herhangi bir döngüyü bitirir.
İki nesne veya değer arasındaki nesneleri sırayla belirtilen değişkene kaydeder ve hepsine uygular. Mesela,
Code:
(try_for_range, ":bandit", "trp_looter", "trp_desert_bandit"), #Bu iki nesnenin arasındaki nesneleri sırayla ":bandit" degiskenine kaydedip sırayla asagidakiler uygulayacagim.
  (troop_raise_skill, ":bandit", skl_power_strike, 1), #":bandit"in guclu darbe yetenegini 1 artırdım. Yani donguden etkilenen butun nesnelere bunu uygulamis oldum.
(try_end), #Donguyu bitirdim.
module_parties'teki bütün partileri sırayla belirtilen değişkene kaydeder ve aşağıdakileri uygular. Çalışma prensibi (try_for_range)'in aynısıdır.
Şu an oyuncunun bulunduğu sahnedeki bütün canlıları sırayla belirtilen değişkene kaydedip sırayla aşağıdakileri uygular.

Şimdilik biraz taslak gibi oldu. Geliştirmek veya basitleştirmek için her türlü öneriye açığım.
 
Conchobar bunu beğendi.
thumbup.gif
 
Hiç bişey anlamadım lao :razz: , ayrıca Operasyon yazabilirsin operation yerine.
 
Back
Top Bottom