Kod Kuralları ile İlgili Rehber

Users who are viewing this thread

Migrantah

Merhaba, bu rehberi aslında Yusuf Kaya için yapmıştım, sonra da herkese hitap edecek biçimde uyarladım.
Modül sistemde genel kurallar:
1- ID.
ID'ler trigger'larda bulunmazlar. ID'leri kodlar arasında "isim" olarak kullanırız. Örneğin "Kral Harlaus" troop'unu bu haliyle değil, "trp_kingdom_1_lord(gibi bir şeydi) olarak kullanırız.

2- Parantezler "(, ), [, ]"
Her modül dosyasında bulunan kurallardan biri de her açılan parantezin bir satır kod açtığıdır. Yani:
(assign, askadk, 1),
Burada ilk parantezden sonra bir kod yazıldı. Bittiğini ise ")," işareti koyarak belirtiyoruz.

3-Yazım kuralları
Her modül dosyasında ayrı bir yazım kuralı vardır. Aslında bu bahsettiğimiz "yazım kuralı" bir sıradır. Şöyle:
Module game_menus'ünki:
("genel menünün idsi", menü flagları(mnu_disable_all_keys tarzı şeylerdir. Bu flaglara sen "özellik" de diyebilirsiniz),
"Oyunda görülecek menü yazısı(Merhabalar hoşgeldin MB:W'ye tarzında. Klasik. Ne istersen yazabilirsiniz buraya),
  "none",
[İşlem kısmı. Buraya bu menü ile birlikte nelerin olacağını yazıyorsunuz.],
[Menü seçenekleri(hana git, şehir meydanında dolaş gibi)]
  ("alt_menü_idsi",[koşul kısmı. Bu seçeneğin hangi koşullarda gözükeceğini belirliyorsunuz], "Görünecek yazı(Hana git, Kaleye git gibi)",
  [sonuç bölümü. Buraya bu seçenek seçildiğinde ne olacağını yazıyorsunuz. Sonuç bölümü burası.],
  ]),

Module_scripts:

("Script idsi", [sonuç bölümü. Ne var ne yok her şeyi buraya yazıyorsunuz.]),

Ve parantezler üzerindeki tüm kuralları açıklayalım.
Bir parantez açıldığında "(" mutlaka o satırın sonuna (o kodun sonuna) ")," getirilmelidir. bir "[" açıldığında ise sonuna mutlaka "]" ya da "]," getirilmelidir. Bu köşeli parantezler genelde koşul ve sonuç bölümleri oldukları için diğer parantezlere uyumlu bir şekilde koyulmalıdır.
Örneğin scripts'te en başta bir parantez var. Daha sonra bir köşeli parantez açılıyor. heme ardından kodlar geliyor. Kodlar bittikten sonra o "]" tarafı şöyle görünecek:
)]
Ama burada biz şöyle yapıyoruz:
),
],
Niye? Çünkü module_system karıştırmasın diye. Pek sanmam öyle bir şey olacağını ama göze hoş görünmüyor ve riskli. Şimdi o "]" tarafına geri dönelim.
Burayı eğer o parantez kısmı( "[" ve "]" bu işaretlerin içerdiği alanlar) son kısım ise (daha sonradan bir köşeli parantez gelmiyor veya kodun sonuysa) "])," yazılır.

Triggers'a bakalım.
x, x, x, [], []),  Temel olarak yazım kuralı böyle. Ama biz açalım.

0, 0, 0, [],
[
  (assign, asdajdha, asdha),
  ]),

Bir başka örnek;

0, 0, 0, [
  (assign, asduha, sadjakd),
],
[
  (eq, asıaıjd, hakıhjda),
  ]),
Ya da;

0, 0, 0, [(assign, sdfds, dfsf),
],
[
  (eq, asdad, dfdg),
  ]),
Bu parantezleri eğer doğru bir şekilde öğrenirsen syntax hatalarını daha az alırsınız. Buradaki mantık aslında kolay. Eğer parantezler yan yana geliyorlarsa en sondaki virgül hariç (mesela ")])," ya da "]), )" tüm virgüller silinir.

Şimdi oyunda "ağır abi" kodlar:
assign. Bu kod çok işe yarar. Bazen hata gidermek için, bazen bir şeyleri görevlendirmek için, bazen ise şart koşulmuş kodlara destek için kullanılırlar.

gt, eq, lt, ge, le. sırasıyla(anlamları): büyüktür, eşit, küçüktür, hem büyük hem eşit, hem küçük hem eşit.
Hem şöyle hem eşit ne demek? Örnek;
"gt, adsad, 1" dediğimizde "adsad 1'den büyüktür" dedik. Peki aynı anda hem 1'e eşit, hem de 1'den büyük diyemez miyiz? İşte ge ve le bu işe yarar.

neg. eq "eşit" demiştik. neg de "negatif" demek. eğer eq'ın tersi ise sadece o anlamda tek başına kullanılır.

eq, aasdada, 2. aasdada 2'ye eşit dedik.
neg, asdf, 2. asdf 2'ye eşit değil dedik.
Aradaki fark bu. gt,eq,lt,ge,le yerine kullanılması kötüdür. Gerek yok bu konuda. Ama bu kodun tek işlevi bu değil.

is_between, reg4, asdf, aasdf. Burada reg4 asdf ile aasdf arasında dedik. Lakin "neg" komutunu getirirsek;
neg|is_between, reg4, asdf, aasdf. reg4, asdf ile aasdf arasında değilse demiş oluruz. eğer tek başına kullanılırsa(yukarıdaki gibi) normal yazılır. Ama bir kodun arkasına yazıldığında "|" koyulur hemen g'nin ardına.

Slot işlemleri. Slot demek "depo, yer, boş alan" anlamına gelir. Biz de bu tür komutlar ile bir depo/yer açarız.

(troop_get_slot, ":location_score", ":location_lord", slot_troop_renown),
(troop_slot_ge, "trp_player", slot_troop_renown, 200),

Sırayla:
1:Bunu anlamadım :sad:
2:Bunda da "trp_player'a nam olarak 200 ayırıyoruz."
Teker teker açıklarsak eğer:
troop_slot_ge, troop, slot_şekli(burada renown, yani nam), değer

Bunlar dışındaki kodlar alanlarına göre kullanırlar, ama bunlardan en az bir tanesi "mutlaka" "tüm" kodlarda bulunur(istisnalar hariç).

Şimdi bunları öğrendik. Ama nasıl kullanacağımız kodlar ile bağlantı kurdurabileceğiz?

eq'dan başlayalım(zaten o türleri ben tek sınıfta topladım, gerisini açıklamaya gerek kalmaz diye düşünüyorum):

Görev: "Eğer şu şöyle ise".
(eq, ":troop_renown", 20),
(remove_member_from_party, "trp_npc13", "p_main_party"),
"Eğer troop'un namı 20 ise"
"trp_npc13'ü ana partiden sil"

Assign.
1. Görev: "Şunu şu olarak görevlendir".
(assign, reg4, ":item"),

2. Görev: Bu tarz görevlerde assign komutu eq'lar için bir yardımcıdır. Şöyle ki:
(assign, "$g_troop_spawnlandi", 1),

Bu arada global ve local variable'ları tanıtmadım.

Local Variable: Sadece kullanıldığı kod bölümü içinde tanınır ve aynı local variable farklı farklı yerlerde (aynı kod kısmında (koşul/kısım) olmaması lazım) farklı amaçlarla kullanılabilir.

":cur_hours", ":cur_time", ":agent", ":troop_no", ":troop_id" gibi. eğer ": bunu görürseniz, bu local_variable'dır.

Global variable: Heryerde aynı amaçla kullanılır bu variale'lar. İstenildiği gibi anlam yüklenilebilir lakin heryerde anlamı aynıdır.

"$g_encountered_party", "$g_herhangi_bir_global_variable", "$cheat_mode" gibi. "$ ya da "$g_ görürseniz, bilin ki bu global_variable'dır. İkisinin arasındaki fark, işaretleridir.

Şimdi konumuza gelirsek, burada belirttiğimiz gv(siz anlayın) ile eq'lı bir kod yazacağız.
Bu kod nerede olursa olsun farketmez.

(eq, "$g_troop_spawnlandi", 1),
(heal_party, "p_main_party"),

"is_between" komutu: "arasında mı" anlamına gelir.

(is_between, ":agent", "trp_player", "trp_zerina"),
Şimdi bunu bir açalım:
is_between, hedef(bunların arasında olan), herhangi bir değer, herhangi bir değer.
Burada önemli olan şeyler:
1- 1. değer 2.'den mutlaka küçük olmalı(ondan önce olmalı olarak da anlayabilirsiniz, aynı yola çıkıyor).
2- 2. değer (örneğin):
(is_between, ":value", 1, 30),
30 ise module_system bunu 29 olarak algılar. Yani siz bu 2. değeri yazdığınızda, bir önceki rakam/harf ya da kısacası değeri algılar. Eğer bir şeyleri bu kodla belirtiyorsanız bir sonraki değeri seçin(30 ise amacınız 31, trp_kingdom_lord_2 ise trp_kingdom_lord 3 gibi)

try_for'lar (try_for_agents, try_for_parties, try_for_range). Bir döngü başlatır. Yani siz "try_for_range, ":parties"" derseniz module_system ":parties"i bulana kadar bir döngü başlatır. Eğer bir döngü(bir kere yap bitir olmayan, hiç bitmeyen) başlatacaksanız bu size lazım olur. Ama mümkün olduğunca kod kalabalığı(gerekli olmayan, dolaylı) yapmanızı tavsiye etmem. Çünkü bu kod sürekli tekrar ettiğinden, ne kadar çok işlem yaparsa o kadar çok oyunu kastırır. Bu da optimizasyonu kötüleştirir. Bu kod ile bitmez bir döngü, veya biteceği belli olan bir döngü belirleyebilirsiniz.
 
Back
Top Bottom