Anasayfa
UO Sunucular
Forumlar
Profilim
UO-Developer.COM
NPC Evrimi

Bölüm 1'de o temel NPC senaryosuna baktığımız zamanı hatırlıyor musunuz? Çıplak bir adam (veya çıplak bir oyuncu) yaratmak için genel bir senaryoydu. Ve şuna benzer bir şeye benziyordu:
[CHARDEF 0190]
DEFNAME=c_man
Name=Man
ICON=i_pet_MAN
CAN=MT_EQUIP|MT_WALK|MT_RUN|MT_USEHANDS
RESOURCES=i_flesh_head, i_flesh_torso, i_flesh_right_arm, i_flesh_left_arm
FOODTYPE=15 t_food, t_fruit
DESIRES=i_gold,e_notoriety
AVERSIONS=t_TRAP,t_eerie_stuff
SHELTER=r_house
BLOODCOLOR=0

TSPEECH=spk_human_prime
TSPEECH=spk_human_default
TEVENTS=e_Human_HearUnk
DESCRIPTION=Man
SUBSECTION=Miscellaneous
CATEGORY=Civilized
Gördüğünüz gibi, bu oldukça eksik bir senaryo. Aslında, spherechar_*.scp dosyalarında bulunan komut dosyalarının en az tamamlananlarından biridir.

İşte bir NPC komut dosyasının daha eksiksiz bir örneği:
[CHARDEF 0490]
DEFNAME=C_H_ALCHEMIST
NAME=#NAMES_HUMANMALE the Alchemist
ID=C_MAN

DESIRES=i_gold,e_notoriety,t_magic
AVERSIONS=t_TRAP,t_eerie_stuff

TSPEECH=spk_human_prime
TSPEECH=jobalchemist
TSPEECH=spk_shopkeep
TSPEECH=spk_needs
TSPEECH=spk_rehello
TSPEECH=spk_human_default

TEVENTS=e_Human_HearUnk
TEVENTS=e_Human_ConvInit
TEVENTS=e_Human_Greet
TEVENTS=e_Human_Space
TEVENTS=e_Human_Needs
TEVENTS=e_Human_Refuse
TEVENTS=e_Human_Environ

CATEGORY=Civilized
SUBSECTION=Tradesmen
DESCRIPTION=Alchemist (male)

ON=@Create
NPC=brain_vendor
COLOR=colors_skin
STR={36 50}
DEX={36 50}
INT={51 65}

ALCHEMY={55.0 78.0}
TASTEID={55.0 78.0}
WRESTLING={15.0 38.0}
MAGICRESISTANCE={25.0 48.0}
TACTICS={15.0 38.0}
POISONING={35.0 55.0}

ITEMNEWBIE=random_male_hair
COLOR=colors_hair
ITEMNEWBIE=random_facial_hair
COLOR=match_hair

ON=@NPCRestock
ITEM=i_expcoin,3

ITEM=i_shirt_plain
COLOR=colors_all
ITEM=random_pants
COLOR=colors_all
ITEM=i_robe
COLOR=colors_red
ITEM=random_shoes
COLOR=colors_neutral
ITEM=random_coin_purse

SELL=VENDOR_S_ALCHEMIST
BUY=VENDOR_B_ALCHEMIST
[CHARDEF 0490] Bunu daha önce gördük. Diyor ki, "Hey SPHERE! Bu satırdan sonraki her şey bir sonraki başlığa kadar bir karakter tanımlayacak!" Bu karakter ne olacak? Eh, şu anda hiçbir fikrimiz yok, sadece SPHERE'e 0490 var. 0490 ayrıca kullanıcıya hangi animi göstereceğini de gösterir (ID alanı anim'i gösterecek olan ID alanına sahip canavarlar hariç). [CHARDEF x] alanında bir sayı yerine char defname'i de kullanabilirsiniz (bu, yeni npc'ler için daha iyidir),

örneğin:
[CHARDEF c_new_monster]
DEFNAME=C_H_ALCHEMIST

Açıkçası, bu betiğin defname'si budur. Böyle şeyleri o kadar çok gördük ki, bunun üzerine gitmem gerektiğine inanmıyorum. Ama şimdi en azından bu senaryo için daha akılda kalıcı bir ismimiz var. Açıkçası bir karakter (C), bir insan (H) ve bir alchemist (C_H_ALCHEMIST). Karakterin ne olduğuna bağlı olarak DEFNAME'lerinizi anlamlı hale getirmeye çalışın. Bunu c_robed_man olarak adlandırmanın kesinlikle unutulmaz bir niteliği olmazdı.

NAME=#NAMES_HUMANMALE ALCHEMIST
İşte bu noktada SPHERE bazı tuhaf şeyler yapıyor. Her şeyden önce, SPHERE_NAME'dan hatırlarsanız. Bölüm 2'deki SCP dersi, #NAMES_HUMANMALE'yi bu NPC için "Fritz", "Bob" veya her zaman popüler olan "Roderick" gibi gerçek bir adla değiştirecek. Yapacağı ikinci şey, bu ismi bir NAME ve bir TITLE olarak bölmektir. Bu bölünmeyi nerede yapıyor? "The" kelimesinde.

Yani bu satırı yazmak şuna eşdeğerdir:
NAME=#NAMES_HUMANMALE
TITLE=the Alchemist
ID=C_MAN İşte bu noktada SPHERE'e bu şeyin ne olduğunu anlatıyoruz. C_MAN nedir? Açıkçası bu bir DEFNAME, ama ne için? Bu dosyanın üst kısmına doğru bakın ve C_MAN karakterin tanımını göreceksiniz.

Gördüğünüz gibi, sadece önceki bölümde yazdıklarımızı tekrarlıyoruz. Ancak SPHERE'in daha yeni sürümleriyle bunu yapmamıza gerek yok. Karakterimiz 0490, AKSİNİ SÖYLEMEDİĞİMİZ SÜRECE, yetenekler, simgeler ve sesler dahil olmak üzere bir C_MAN varsayılan olarak gelen her şeyi otomatik olarak alır. Programlamada buna kalıtım denir. Yeni, daha spesifik karakter, daha az spesifik olanın özelliklerini devralır.

DESIRES ve AVERSIONS yeniden belirttiğimizi fark edeceksiniz. C_MAN bize bu tür bir karakterin ne istediğini ve ne istemediğini zaten söylediyse bunu neden yapıyoruz? ÖFKE söz konusu olduğunda emin değilim, çünkü, onlar aynı. Ancak bir simyacının arzuları, sıradan bir adamın arzularından farklıdır, bu yüzden SPHERE'e "Hey, C_MAN arzuları yenileriyle değiştirin!" deriz.

TSPEECH = Bu şifreli isimlerin bu ifadeyi takip ettiğini ne sanıyorsunuz? Tabii ki, onlar DEFNAME'ler, ama ne için? Dosyalarınıza bakarsanız, muhtemelen tanımlanmış olanları hiçbir yerde bulamayacaksınız. Ama bu nedir? Zip dosyasında önceden oluşturulmuş olarak gelen konuşma adlı bir klasörümüz var. Bu dosyalara bakmak, çok sayıda [SPEECH] blok tanımını ortaya çıkarır. Varsayılan olanlar, betikler klasörünüzdeki SPEECH klasöründe bulunabilir.

Şu anda çok basit bir konuşma senaryosuna bakacağız. Bunu herhangi bir dosyadan almıyorum. Tamamen örnek.
[SPEECH spk_human_test]
ON=*hello*
SAY Cheese!
Senaryomuzda, TSPEECH=spk_human_test yazacak olsaydık, NPC'miz ona her "merhaba" dediğimizde "Peynir!" diye yanıt verirdi. Bu kelimeyi neden yıldızlarla (*) çevrelediğimi merak ediyor olabilirsiniz. Programlama dilinde, bir yıldız "HERHANGİ BİR ŞEY" anlamına gelir. Böylece "Seni yemek istiyorum merhaba hoşçakal" diyebilirdiniz ve NPC yine de "Peynir!" ile yanıt verirdi, çünkü "merhaba" kelimesi mevcuttu.

Tabii ki, SPEECH bundan çok daha karmaşıktır ve temel olay komut dosyası oluşturma bölümüne ulaştığımızda tekrar bakacağız. Şimdilik bir CHARDEF bölümünde istediğiniz kadar TSPEECH satırına sahip olabileceğinizi bilin.

TEVENTS = Bunu Bölüm 1'de zaten çok çok küçük bir ayrıntıyla ele aldık. Yaratık için olayların tanımlandığı yer burasıdır. Gördüğünüz gibi, bu yaratık çok sayıda olay içeriyor. Bilinmeyen bir kelime duyduğunda ne söylediğinden ("Ha?&quot, yeni bir oyuncu gördüğünde ne yaptığına kadar her şeyi tanımlarlar. Bölüm 8'de bir etkinlik senaryosuna bakacağız. NPC olay komut dosyası oluşturmayı denemeden önce öğe komut dosyası oluşturmanın temellerini öğrenmelisiniz. Şimdilik, bir npc'nin tüm TEVENTS'ini kullanarak alabileceğinizi bilin

<[REF].TEVENTS>.

ON=@Create
Aslında yalan söyledim. @Create bir olay ve şu anda bunun hakkında konuşacağız. Ama bu özel bir olay, tartışacağımız bir sonraki olay gibi. Temel olarak, @Create bir nesne oluşturulduğunda kendisinden sonraki her satırın işlenmesine neden olur. Bu durumda, aşağıdaki satırların çoğuna odaklanmayacağım, çünkü şimdi hepsi sizin için bir anlam ifade etmeli. Bu noktada @Create hakkında bilmeniz gereken tek şey, oyun içinde değiştirebileceğiniz şeylerin bu bölüme girdiğidir. Buna istatistikler, beceriler, yağmalanamayan öğeler, renkler, beyin türleri ve TAG'ler dahildir (Etiketler CHARDEF'te de tanımlanabilse de, yeniden stok yapmaya veya tek tek değiştirmeye gerek kalmadan o chardef ile tüm npc'lere bir etiket ayarlamanın harika bir yoludur) (TAG'ın ne olduğunu bilmiyor musunuz? Güzel, sana henüz öğretmedim.).

ALCHEMY ={55.0 77.0}
Bu satır çok aldatıcıdır ve aldatmacanın nedeni SPHERE'in sayıları işleme şeklidir. SPHERE hiçbir zaman ondalık bir sayıyı okuyamaz. 55.0, SPHERE için hiçbir şey ifade etmez ve sadece ondalık noktayı çıkarır. Şimdi, dahili olarak becerilerin büyük sayılar olarak saklanması uygun değil mi? Şu anda oyun içindeki beceri menünüze bakın. Açıkçası sıfır olmayan bir beceri bulun ve değerine bakın.

Şuna benziyor: 42.0

Şimdi, tekrar oyun içinde şu komutu yazın: .set [skillname] 42 (Tabii ki, [skillname]'yi istediğiniz beceriyle değiştirin. Yazdığınız ad çalışmıyorsa spheretables.scp'ye bakın.) Ne oldu? Yeteneğiniz aniden 4.2'ye çıktı!! Bu oyunda bir hata mı? Hayır, aslında bunun nedeni becerilerin ondalık nokta kaldırılarak saklanmasıdır. Demircilikte 100.0'ınız varsa, beceriniz aslında 1000 olarak ayarlanmıştır. Bir beceride 75.2 varsa, bu beceri 752'dir.

Bu basit bir kavram gibi görünebilir, ancak aynı zamanda komut dosyasının geri kalanı için de geçerlidir. 55.0 gibi bir sayı yazdığınızda, SPHERE ondalık sayıyı ortadan kaldırır.

Yani yukarıdaki örnek satırımız aslında şudur:

ALCHEMY={550 770}

Bu sinsi değil mi?

Bunu hatırlamak isteyebileceğiniz zamanlardan biri, sayıları çarpıyorsanız daha sonradır:

4 * 0.5

Sphere bunu "4 çarpı 5" olarak çevirir ve beklediğiniz 2 yerine 20 elde edersiniz. Gördüğünüz gibi, bu ciddi sorunlara neden olabilir. Daha sonraki bölümlerde bu sorunun nasıl aşılacağını göstereceğim. Burada sadece var olduğunu belirtmek istedim. (Gizli ondalık noktaların kullanıldığı başka bir örnek için sphereregion.scp dosyasındaki kaynak tablolarına bakın.)

NPC=brain_vendor Ok, so I'm out of order. Deal with it.

Oyundaki tüm NPC'ler, belirli durumlarda nasıl davrandıklarını yönlendiren belirli zekalar tarafından kontrol edilir. Örneğin, bu simyacı bir brain_vendor, yani "buy” ve "sell" gibi komutlara bir ticaret penceresi açarak yanıt verir. Bu aynı zamanda, satın alabileceği ve satabileceği ürünlerle ilgili bilgiler için ekstra depolama alanına sahip olmasına izin verildiği anlamına gelir. (Aslında bunlar satıcıda depolanan ek konteynerlerdir, ancak bunu daha sonra göreceğiz.) İşte mevcut diğer zekaların bir listesi (bahse girerim bunu hangi dosyadan çektiğimi tahmin edemezsiniz):
[DEFNAME brains]
BRAIN_NONE 0 // Oyuncular: Beyin yok. Kullanışlı değil mi?:)
BRAIN_ANIMAL 1 // Hayvanlar: Dolaşırlar, sadece saldırıya uğrarlarsa saldırırlar
BRAIN_HUMAN 2 // İnsan: gezin ve konuş
BRAIN_HEALER 3 // Şifacı: yakınlardaki hayaletleri iyileştirir
BRAIN_GUARD 4 // Muhafız: Gördüğü kötü adamlara saldırır
BRAIN_BANKER 5 // Bankacı: bankanıza onun aracılığıyla erişebilirsiniz
BRAIN_VENDOR 6 // Satıcı: bir şeyler alır ve satar
BRAIN_BEGGAR 7 // Dilenci: Oyuncuları takip ederek rahatsız edici sorular sorar
BRAIN_ANIMAL_TRAINER 8 // Trainer: can stable animals*****
BRAIN_THIEF 9 // Hırsız: şu anda etkisi yok
BRAIN_MONSTER 10 // Şeytan: Gördüğümüz tüm oyunculara saldırın
BRAIN_BERSERK 11 // Çılgın: gördüğümüz her şeye saldırırız
BRAIN_UNDEAD 12 // Ölümsüz: Şeytanla aynı, sadece tanımlama için kullanılır
BRAIN_DRAGON 13 // Ejderha: ateş püskürtür (bunu bir tavşanın üzerine koyun)
BRAIN_VENDOR_OFFDUTY 14 // Buradaki farkın ne olduğu hakkında bir fikrim yok.
BRAIN_TOWNCRIER 2 // brain_human ile aynı sayı, aynı etki
brain_berserk //Sadece yazım hatalarından kaynaklanan bazı hataları önlemek için brain_berserk ile aynı şey
ITEMNEWBIE=
Bu, belirtilen öğeyi karakter üzerindeki attr_newbie ile oluşturur.

ON=@NPCRestock
İki kere yalan söyledim! Bu, bu senaryoda öğreneceğiniz İKİNCİ olaydır. Bu etkinlik, oyun içinde bir "stok yenilemesi" gerçekleştiğinde tetiklenir. Bu, her birkaç gerçek zamanlı saatte bir veya bir personel üyesi ".sector.restock" yazdığında gerçekleşir. Buraya koymanız gereken şey, satın aldıkları ve sattıkları şeylerin tanımlarıyla birlikte bu NPC'den yağmalanabilecek herhangi bir şeydir. Bir kez daha, bu çoğu durumda sadece bir şablondur, bu yüzden bununla nasıl başa çıkacağınızı bilmelisiniz. Yine de iki satırı inceleyeceğim:
SELL=VENDOR_S_ALCHEMIST
BUY=VENDOR_B_ALCHEMIST
Bu, satıcının ne alıp sattığını tanımlar mı? Ama bu gizemli öğe listeleri nereden geliyor? Aslında, bunlar spheretemp_vend.scp dosyasındaki şablonlardır. (Satıcılar için şablonlar. Bu geliştiriciler çok yaratıcı.) Aslında, dosyaları içindekilerden sonra adlandırmak iyi bir şeydir.

Fiyat, bu ALIŞ ve SATIŞ satırlarının hiçbir yerinde tanımlanmamıştır. Fiyat, tek bir öğe komut dosyasındaki VALUE= satırında tanımlanır. Bir öğe komut dosyasında VALUE= satırı yoksa, fiyat, o öğedeki kaynakların değerinin gereken kaynak sayısıyla çarpılmasıyla belirlenir. Örneğin, bir öğenin yapılması için 8 demir külçe gerekiyorsa ve her külçenin değeri 8 altın parçasına sahipse, tüm öğenin değeri 64 altın olacaktır. Varsayılan olarak, şeyler satın alabileceğiniz fiyatın yarısına satılır.

Sanırım şimdilik yeni bir NPC senaryosu yazmakla ilgili bilmeniz gereken tek şey bu. Şu anda, yeteneklerinizle dünyanızda dolaşan yeni satıcılar, yeni canavarlar ve yeni hayvanlar yaratabilirsiniz. Ama henüz benzersiz bir şey yapmıyorlar. Sadece aynı canavarların daha güçlü veya daha zayıf versiyonları gibi davranırlar. Ve muhtemelen onlar da güzel renklerdir, hues.mul dosyamın 077a ve 07a1 renkleri için son kullanımına bakılırsa. (Bunlar için gerçekten bir DEFNAME betiği yayınlamalıyım.)

Artık nasıl iyi bir NPC yapılacağını bildiğinize göre, ona ganimet olarak koymak için benzersiz eşyalar yapmanın yollarını keşfedelim. Bir sonraki bölümde, süper kandırılan ateş ve kükürt payı yapacağız! *trompet tantanası*[/skillname][/skillname][/ref][/speech]

UO-Dev SPONSOR

Paylaş

XFacebook

Faydalı mı?

Bu içerik size yardımcı oldu mu?

UO-Dev SPONSOR

Henüz yorum yapılmamış. Yorum yazabilmek için giriş yapmanız gerekir.

Üyelerin oylama ortalaması (10 dışında) :

Henüz Oylanmamış

Oylar: 0

Paylaş

XFacebook

Faydalı mı?

Bu içerik size yardımcı oldu mu?