14-12-2011, 12:46 AM
Ders 5 - Item/Pokemon Alıp verme
Evet, arkadaşlar uzun bir aradan sonra yeni bir dersle devam edelim. Bu gün/akşam tıkladığımız birinin bize bir item veya pokémon vermesini yada bizden item veya pokémon almasını göstereceğim. Ve bununla ilgili bir önceki derste öğrendiğimiz teknikleri kullanarak küçük örnekler yapacağız.Hemen her zaman olduğu gibi işe, FSF' mizi kullanarak boş offsetler bularak başlayalım. Saha sonra Advance Map üzerinden Rom'umuzu açalım.
Ben yine geçen derslerde olduğu gibi aynı adamı kullanacağım.
Tanımışsınızdır bunu!
Eveet, ilk olarak seçili karaktere bir item/verme işinden başlayalım.
Temel Haliyle kodumuz bu...
Alıntı:#org 0x871AC00
'-----------------------------------
lock
faceplayer
message 0x871C400
boxset6
additem 0xD 1
release
end
#org 0x871C400
= Al sana bir adet iksir.
Şimdi her zaman olduğu gibi kodumuzu açıklamaya başlayalım.
Artık lock-faceplayer ve message mantığını bildiğinizi varsayıyorum ve bu kısma değinmiyorum. Zaten bu kısmı ageçince sadece tek satır kalıyor açıklanacak. oda additem 0xD 1;
additem size bir nesne verilmek istendiği zaman kullanılır; additemden sonra gelen 0xD ise hangi itemin verileceğidir. benim kullandığım 0xD Potion yani iksir verir kullanıcıya ve en sondaki rakamda bu itemden kaç adet verileceğidir.(Ek kısmında tüm itemlerin sıralandığı listeyi indirebilirsiniz. zini için yararlı olacaktır)
Burda değinmem gereken bir nokta var. "0xD" yerine POTION Yazmanızda kabul edilir oyun tarafından. Zaten bu kodu F9 şle compile edip, girip-çıktığınızda 0xD yerine POTION Yazdığını Görürsünüz.
Compiledan sonra girip-çıktığınızda kodunuz böyleyse(tabiki sizin kullandığınız offsetler farklı olabilir) kodumuz sağlıklı bir şekilde oturdu.
Pekiya biri sizden bir item geri almak isterse? Biliyorum pek kulağa hoş gelmiyor ve ben bunu niye kullanayım diye de düşünebilirsiniz ama özellikle senaryolu bir oyun inşaa ediyorsanız. Belli başlı şeyleri bazı itemlerin başkalarına verilmesi şartıyla yaptırmak isteyebilirsiniz. Örneğin Fireredin başında marketten aldığımız Oak's Parcel'i Oak'a verince ondan pokedexi ve ilk pokéballari aldiğimiz gibi.
Kullanıcıdan item geri alma işlemi ise removeitem kodu ile yapılıyor. Removeitem <alinacak nesne> <ve sayısı> tıpkı, additem gibi. Ben kendi örneğimde her zamanki adamımım yanına bir adam daha ekledim. Ve yapacağım olay şu. ilk adama tıklayınca bize iksir verecek, ikinci adamda aldığımız iksiri bizden geri alacak. hemen yeni adamı ekliyor, offsetine FSF'den bulduğum offseti ekliyor ve kodumuzu yazıyoruz. (Benim bulduğum offset 0x871C300 sizinki farklı olabilir.)
Alıntı:#org 0x871C300
'-----------------------------------
lock
faceplayer
message 0x871C200
boxset 6
removeitem 0xD 1
release
end
#org 0x871C200
= Ver bana o iksiri.
f9'a basıp compile edip bir bakalım kodumuz çalışmış mı? çalışmamış mı?
Eveet, gördüğümüz üzere çalışmış. Tabi bu kodda şöyle enteresan bir özellik var. Normalde, siz oyundan bir karakterden bir itemi veya pokemonu yalnızca bir defalına alabilirsiniz. Yani birisinden bir itemi aldıktan sonra bu kişiye bir kez daha tıkladığınızda, size başka bir şeyler söyler bunu nasıl yaparız? Bu konuyu "Flag" konusu altında daha sonra işleyeceğiz. Şimdi yaptığımız çalışmayı bir adım daha öteye taşıyalım.
İlk adama tıkladığımızda bize, masterball isteyip istemediğimizi sorsun. Evet, diyince masterball versin, hayır diyince de "babayı al emi" desin. İkinci adam da bizden masterballi geri alsın karşılığında da bize bir adet "mewtwo" versin.. Eğer elimizde masterball yosa bu adam bize "önce al öyle gel" desin. Hemen ilk adamımızın kodunu yazayım. Daha sonra bu kodu inceleyerek gidelim.
Alıntı:#org 0x871AC00
'-----------------------------------
lock
faceplayer
message 0x871C400 ' Al sana bir adet iks...
boxset 5
compare LASTRESULT 0x1
if 0x1 goto 0x871C100 ' Built-in lock command
message 0x871C000
boxset 6
release
end
#org 0x871C100
additem 0x1 1
message 0x871BF00
boxset 6
pause 0x10
message 0x871BE00
boxset 6
release
end
#org 0x871C400
= Benden bir Masterball\nister misin?
#org 0x871C000
= Peki,\nBabayi al emi!
#org 0x871BF00
= \v\h01, adamdan masterball\naldi.
#org 0x871BE00
= Ona iyi bak.
Kodumuz compile'dan sonra bu şekle dönmüşse işlem tamamdır.
Evet kodumuza bir bakalım.
message 0x871C400 0x871c400 nolu offsetteki metni göster.
boxset 5 Bu metni bir evet/hayır sorusu olarak sor.
compare LASTRESULT 0x1 Yapılan son işlemdeki değerin 0x1 yani evet olup olmadığına bak. (Hayır için 0x0 veya NO'yu kullanın.)
if 0x1 goto 0x871C100 Eğer 0x1' yani evetse; 0x871C100 nolu offsetin kodunu işlet, hayır ise olduğu gibi devam etsin kod. (Yani eğer kullanıcı evet'i seçmişse;
message 0x871C000 ' Peki,\nBabayi al emi...
boxset 6
release
bu kodu görmezden gel ve 0x871C100 nolu offsetteki kodları işlet.)
0x871C100 numaralı offsette;
additem 0x1 1 kullanıcıya bir adet master ball ver.
message 0x871BF00 nolu offsette yazanı göster.
boxset 6 0x871BF00'da yazanı normal metin olarak göster
pause 0x10 bir saniye bekle ve sonra yine devam et. x'den sonraki sayı ne kadar büyürse bekleme süresi de o kadar artar.(unutmayın HEX kod geçerli.))
sonra yine mesaj göster ve bitir.
Tamam, şimdi diğer adamımızın kodları
Alıntı:#org 0x871C300
'-----------------------------------
lock
faceplayer
checkitem 0x1 1
compare lastresult 0x1
if 0x1 goto 0x871BC00
message 0x871C200 ' Ver bana o iksiri.
callstd MSG_LOCK ' Built-in lock command
removeitem POTION 1
release
end
#org 0x871BC00
removeitem 0x1 1
message 0x871BB00
boxset 6
addpokemon MEWTWO 5 NONE 0x0 0x0 0x0
release
end
#org 0x871C200
= Once al...\pOyle gel.
#org 0x871BB00
= Adam senden masterball'i\ngeri aldi
Yine, kodumuza bakacak olursak eğer; burada farklı olara iki kod kullandık bunlardan birincisi checkitem Bu kod adından da anlayacağınız gibi; kullanıcı da bir itemin olup olmadığını kontrol etmek amacıyla kullanılıyor.
checkitem MASTERBALL 1
compare LASTRESULT 0x1
if == jump 0x871BC00 '
Burada biz checkitem MASTERBALL 1 -> yani kullanıcının çantasında 1 adet masterball varmı bir bak dedik.
compare LASTRESULT 0x1 -> Burada bir üst satırda sorduğumuz sorunun cevabını hafızamıza aldık. Varsa 0x1 yoksa 0x0
ve en son eğer varsa 0x1 yani 0x871BC00 ' e git.
0x871BC00' gelince;
Önce removeitem masterball 1 ->Masterballı geri al
Message ve Boxset -> Malum artık açıklamayacapım bu kısmı
ve yeni kodumuz addpokemon Tahmin ettiğiniz gibi kullanıcıya pokémon verir.
addpokemon MEWTWO 5 NONE 0x0 0x0 0x0 ->Yeni pokemon ekle bu MEWTWO olsun Seviyesi 5 olsun. "NONE" hiçbir nesneyi tutyor olmasın. Bu nesne tutulabilir herşey olur.(Ekte paylaştım ful listeyi.) "0x0 0x0 0x0" Bunların ne anlama geldiğini bilmiyorum açıkçası :alala:
Eveet kodumuz bunlar. compile yapıp oyuna girince kodumuz çalışacak...
Ben endim denedim ve çalıştı. (Yanlışlıkla resimleri çekmeden kapattım emu'yu kusura bakmayın. )
Birde not: Prof.Oak'tan ilk pokémonunuzu almadan yaparsanız bu kısmı; aldığınız mewtwo' yu göremessiniz. (ilk pokemonunuzu almadan menüde pokemon seçeneği yok ya ondan...)
Evet bir dersimizin daha sonuna geldik. Bu dersimizde item verip almayı ve pokemon vermeyi öğrendik. Bir sonraki dersimizde azıcık marketçilik oynayacağız.
[size=14pt]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
4. Ders: https://pokemonturkiye.com/forum/index.p...987.0.html
[/size]