Pokémon Türkiye Forumları | Pokémon ve Anime Paylaşım Platformu

Tam Versiyon: Script ve Hack Temelleri - 3 (Evet/Hayır Soruları. )
Şu anda arşiv modunu görüntülemektesiniz. Tam versiyonu görüntülemek için buraya tıklayınız.
Sayfalar: 1 2
Ders 3 - Evet/Hayır Soruları
Merhaba, arkadaşlar. Bu günkü dersimizde evet/hayır soruları üzerinde durucaz. Geçen dersimizde temel script yazma mantığını, Offset kavramını ve boş offset bulmayı göstermiştik. Bu gün ise daha komplike bir kod olan evet/hayır durumu üzerine duacağız. Hemen vakit kaybetmeden Free Space Finder'imizi kullanarak boş offset yakalayalım ardından, Advance Map' te kobay olarak kullanacağımız bir person event ekleyelim. (Ben geçen ders kullandığım karakteri kullanacağım gene yani şunu;)

[Resim: xfvg.png]

Eğitim sırasında benim kullanacağım offsetler şunlar. Bunları isterseniz sizde aynen kullanabilirsiniz...

Eklediğimiz person' un offsetini ayarlayalım ve kounu açalım. Yine #org 0x8xxxxxx'dan sonra bir sürü #raw 0xFF bulunyorsa kodda boş bir offsete denk gelmişiz demektir. Buda iyi bir şey tabi ki  :p

Bu gün örnek olarak adamın bize Sen Pallet Kasabasi'ndan mi geliyorsun? Diye sormasını, evet dersek "Ne kadar guzel", hayır dersek ise "muhim degil". demesini sağlayacağız. Peki bunu ben nerede kullanacağım diye soracak olursanız. Oyun sırasında bazı şeylerin olması için sizin onayınız gerekir. Bunları da "Yes/no Questions"lar ile sağlarsınız. Örnek vermek gerekirse, oyunlarda pek çok defa gördüğünüz, pokémon verme, saldırı öğretme ve item verme gibi....

Şimdi bu örneği yapmak için gereken kodu yazalım ve bu kodu açıklayalım..


Alıntı:#org 0x871AC00
'-----------------------------------
lock
faceplayer
message 0x871AB00 ' Sen Pallet Kasabasi'...
boxset 5
compare LASTRESULT 0x0
if 0x0 goto 0x871AA00
message 0x871A800 ' Ne kadar guzel.
boxset 6
release
end

#org 0x871AA00
'-----------------------------------
message 0x871A900 ' muhim degil.
boxset 6
release
end


#org 0x871AB00
= Sen Pallet Kasabasi'ndan mi\ngeliyorsun?

#org 0x871A800
= Ne kadar guzel.

#org 0x871A900
= muhim degil.

Kodumuzu F9'a basıp compile yaptıktan sonra sayfaan çıkıp tekrar girelim. Şöyle bir manzarayla karşılaşacağız..

[Resim: y2n4.png]


Geçen derste Lock ve Faceplayer kodlarının ne için kullanıldığını anlatmıştık. Bu yüzden bundan yine bahsetmeyeceğim.
Message teriminden sonra. yazmak istediğimiz yazının offsetini çağırdık. Benim çalışmam da bu 0x871AB00 numaralı offset. Sizde farklı olabilir burası.
boxset 5 Geçen ders bahsettiğimiz üzere, boxset 6 normal metinler için, "boxset 5" ise evet/hayır soruları için kullanılıyor. Bizde burada doğal olarak boxset 5' i kullandık.
compare LASTRESULT Bu kod bizim çok işimize yarayacak bir kod. Compare bir fonksiyondur. Bu fonksiyon, LASTRESULT adındaki başa bir fonksiyonun değerini aklnda tutar. Peki nedir LASTRESULT.
LASTRESULT ise son yapılan işlemde alınan değeri aklında tutar. Siz bir evet/hayır sorusunda "EVET" şıkkını seçerseniz LASTRESULT bunu 0x1 olarak aklında tutardı. Ama siz Hayır seçseydiniz, LASTRESULT bu sefer bunu 0x0 olara tutardı.
If 0x0 goto 0x871AA00 Bu kodu bilgisayar bölümünde okuyanlar aslında iyi bilir. (If yapısı...)Bu yapıda sizden bir şart isteniyor ve bu kod bu şarta göre işletiliyor. Bizim şartımız neydi bu çalışmada? Evet/Hayır durumu. 
NOT: Genel olarak bir kural değil ama bir prensiptir bu. Bu oyunun yazdığı kodları daha rahat okumak için şu aşağıdaki yazana dikkat edin.

Geelde şart durumlarında bu oyunun yapımcıları şöyle bir yol izlemiş. Eğer kullanıcı olumsuz şıkkı seçerse, kod "goto" teriminden sonraki offsetten işletilmeye devam ediyor. Ve evet seçilirse kod normal akışıyla işletilmeye devam ediyor. Bunu siz tam tersi şeklinde de yapabilirsiniz ama yapımcılar bunu bu şekilde tercih etmemiş. yani.. siz oyunun normal kodlarını okurken sizin yaptığınız şekle zıt kodlar görmek, kodu okumanızı zorlaştırır.


Kodumuza dönecek olursak şartımız If 0x0 goto 0x871AA00. Yani diyor ki; eğer kullanıcı HAYIR şıkkıını seçmişse (0x0 demekti hayır. Kullanıcının seçimini compare fonksiyonu sayesinde aklında tutuyor oyun) alt satrdaki kodları atla; ve 0x871AA00 numaralı offsette yazılı olan kodları işlet.

Bizim; 0x871AA00 numaralı offsetteki kodumuz


Alıntı:#org 0x871AA00
'-----------------------------------
message 0x871A900 ' muhim degil.
boxset 6
release
end

yani; 0x871A900 numaralı offsette yazılı olan metni çağır, Bunu normal metin kutusu olarak göster(boxset 6), daha sonra "lock" durumunu etkisiz hale getir. "release", ve bitir.

Ama kullanıcı evet'i seçerse ne olacak? 0x1 yani evet durumu geçerli olacak. Bu sefer de, kod normal seyrinde devam edecek çünkü biz "if" kısmında sadece, "HAYIR" seçilirse, bir offsete git dedik.

message 0x871A800, buradada 0x871A800 numaralı offsette yazan metni göster..
boxset 6 bu metni normal mesaj olarak göster.
release ve end. Artık ne anlama geldiklerini biliyorsunuz...

Bu kısmı iyi anlamak ilerisi için iyi, Kapsamlı geniş scriptler yazarken "if yapısı ile compare fonksiyonu" sıkça kullanılacak çünkü. İsterseniz son olarak kodumuzu şema olarak gösterelim.. Daha iyi anlaşılması için.


[Resim: y2wc.png]

Şimdi isterseniz oyuna bir girip bakalım kodumuz çalışmış mı?

[Resim: y2xj.png]

[img][/img]

Bu dersimizinde sonuna geldik. Bir sonraki dersimizde, Kullanıcıya item ve pokémon verip/geri almayi ve bunları sartlara baglamayi ogreteceğiz.

Bir de hatırlatma; geçen ders bahsetmeyi unuttum, varolan scriptlerden metinleri değiştirirken; metinlerin kullandığı offsetleri, kendi offsetlerinizle değiştirin yoksa metinler birbirine karışmaya başlar.


Diğer dersler;
1. ve 2. Ders: https://pokemonturkiye.com/forum/index.p...983.0.html
3. Ders: https://pokemonturkiye.com/forum/index.p...985.0.html
Ya ben şu boxset 6 yazınca mavi ile gözükmüyor sonra kaydedip çıkıp tekrar açınca o sendeki gibi değil yine ilk baştaki gibi #raw 0xD5 gibi şeyler çıkıyo bende boxset çalışmıo yani.
yazdığın kodu olduğu halde buraya yazarsan daha etkili yardımcı olurum sana, şu haliyle bir şey söylemek güç.

lock
faceplayer
message (Buraya boş offset numarası formatı da bu = 0x8XXXXXX)
boxset 6
release
end

#org 0x8XXXXXX
= metin

gidiş yolun bu şekilde mi?
Evet böyle ama boxset mavi yazıyla çıkmıyor sonra kaydedip çıkıp tekrar girince o seninki gibi olmuyor farklı oluyor dur caps cekem.
iyi olur boxset mavi olmuyo zaten. o siyah olduğu gibi kalır daha sonra f9 ile compile yapıp girip-çıkınca boxset 6 yazan yerde başka bir şey yazar. raw varsa eğer hatalıdır. muhtemelen senin offsetlerinde bir problem olabilir. Yada metin için ilgili offsette "=" den sonra bir boşluk bırakman gerek sorun ordan olabilir.
Olmuyor olmuyor olmuyor..
Senin bana attığını denedim bende gayet güzel çalıştı.

Ama istersen bide böyle dene

şu boxset 5 li kısım, compare ve if yerine

callstd MSG_YESNO ' Yes/No message
compare LASTRESULT NO
if == jump

diğer boxset 6 lar yerine de
callstd MSG_LOCK

bunları dene bide
Oldu :)
Olmadıı  Cry  Flood için pardon.
resme bakkıyorum seninkiyle aynı ama "evet" diyincede "hayır" diyincede "ne kadar güzel" diyo  Cry
Sayfalar: 1 2