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

Tam Versiyon: Script ve Hack Temelleri - 4 (İtem/Pokémon Alıp Verme)
Ş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 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.


[Resim: xfvg.png]
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.

[Resim: 12z0v.png]

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ı?

[Resim: 12zcn.png]

[Resim: 12zf9.png]

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.
[Resim: 12zyn.png]

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]

Soru:Mesala Proffesor Oak bizim yanımıza geliyor bir yerde National Pokedex verdirttirmek mümkün mü  Onion021
kodu bu; "special FR_NATIONAL_DEX"

dostum ben scrptleri yapıyorum ama saveliemiorum yardım et lütfen  Cry
kodları yazdıktan sonra F9'a basacaksın. Daha sonra minik bir sayfa açılacak compiler log diye. O çıkınca bilki kodun oyuna eklendi. Ondan sonra editörden(Scriptleri yazmak için kullandığın program) çıkış yapabilirsin. Çıkarken save yapayımmı demesini sen yazdığın kodun yedeğini alayımmı demesi olarak düşün. yani save edip etmemen birşey ifade etmez.

Uzun lafın kısası kodu yazdıktan sonra F9 tuşu yeterli kaydetmen için.
Munchlax ilk 3 jenerasyonda olmadığı için veremessin ama başka bir pokemon vermek kolay.
bunun için ilk olarak Dediğin olayın tetiklenmesi için bir Script uygulaması başlatman gerek. Bunu da "Person Event" Sayısı varya oradan "Script" i arttırarak yapıyosun. Scripti istediğin yere ekledikten sonra, istediğin bir karakteri hareket ettirmek için "applymovement" diye ayrı bir kodu var onu uygulaman lazım, daha sonra Evet/hayır sorusu ve seçime göre addpokemon KRABBY yada addpokemon GROWLITHE diyeceksin. işlem tamamlandığı zaman, eğer adamın kaybolmasını istiyorsan.
Alıntı:fadescreen 1 (Bu kod ekranı karartır)
dissapear 0x(Bu adamın person event'nosu)(adamın kaybolmasını sağlar.)
setflag 0x(buraya dört haneli herhangi bir sayı gir. Girdiğin sayıyı; kaybolmasını istediğin adamın person id'sine yapıştır.)
fadescreen 0 (Karartı Gider)

Hareket konusu biraz daha karışık bir konu bunu hafta sonu daha detaylı bir şekilde anlatacağım zaten.
Sayende bir şeyler öğreniyoruz. Bugün biraz kurcaladım da 3.derste ki evet/hayır konusunda bir hata yaptım sanırsam, evet desem de hayır desem de aynı yazı geliyor. Neyse biraz daha kurcalarım yarın yaparız bir şeyler. Bu arada dersler bitmemiştir umarım. Teşekkürler. :)
Tabiki devam edecek dersler ama Final haftam var bu dönem o nedenle pek uğraşamıyorum bu sıralar. Ayın 12. sinde son nınavı atlatıyım ondan sonra pokedex, oyun, çeviri ve dersleri yayınlamaya devam edicem :D
:D Amma yoğunmuşsun ya, Allah yardımcın olsun :)
Sayfalar: 1 2