Metin2 Lua Geliştirme Rehberi: Quest Fonksiyonları ve Algoritma Mantığı
Metin2 sunucu yönetiminde, oyun içi olayların akışını, etkinlikleri, zindan (zindan) mekaniklerini ve karmaşık görevleri yazmak için kullanılan hafif ve güçlü script diline Lua adı verilir. Oyun çekirdeği (game) C++ ile yazılmış olsa da, her yeni etkinlik için C++ kodlarını değiştirip sunucuyu baştan derlemek (build) zaman kaybettirir. Bu nedenle oyun motoru, geliştiricilere Lua dilini sunarak dinamik bir yazım alanı sağlar. Bu rehberde, Metin2 Lua geliştirme süreçlerini, fonksiyon yapılarını ve zindan scriptlerinin temel mantığını ele alıyoruz.
C++ ile Lua Arasındaki Köprü: Quest Fonksiyonları
Lua, tek başına Metin2 dünyasındaki bir canavarı doğuramaz veya oyuncuya eşya veremez. Bunu yapabilmesi için C++ kaynak kodlarında (
questlua.cpp ve türevleri) tanımlanmış olan özel API fonksiyonlarını çağırır. En sık kullanılan temel Lua fonksiyonları şunlardır:pc.give_item2: Belirtilen kodlu eşyayı doğrudan oyuncunun envanterine ekler. Örneğin
pc.give_item2(19, 1) satırı oyuncuya 1 adet +0 Dolunay Kılıcı verir.d.new_jump_all: Bir zindan içerisindeki tüm grup üyelerini aynı anda bir sonraki harita katına veya koordinata ışınlar. Zindan Lua scriptlerinin temel taşıdır.
say_reward ve say: Oyuncunun ekranına gelen NPC diyalog pencerelerini yönetir.
say düz yazı yazdırırken, say_reward yazıyı renkli (genellikle kırmızı) bir ödül metni olarak yansıtır.Zindan (Dungeon) Lua Scriptlerinin Mantığı
Metin2'de Nemere, Razadör veya Şeytan Kulesi gibi zindanların tamamı karmaşık birer Lua algoritmasıyla çalışır. Bir zindan Lua'sı yazılırken şu aşamalar takip edilir:
Giriş ve Kontrol: Oyuncu NPC'ye tıkladığında Lua kodu devreye girer. Grubun olup olmadığını (
party.is_party), üyelerin seviyelerini ve envanterlerinde gerekli biletin (Örn: Küçülen Kafa) bulunup bulunmadığını kontrol eder. Şartlar uyuyorsa d.join fonksiyonu ile grubu o zindana özel bir harita indexine (instance) ışınlar.Kat Mekanikleri: Harita içindeki canavarlar kesildikçe veya belirli metin taşları yok edildikçe Lua arka planda sayaç tutar. Örneğin kattaki tüm slotlar bittiğinde
d.set_regen_file fonksiyonu ile bir sonraki katın canavarlarını haritaya döker veya mühür katı için kilitleri aktif eder.Temizlik Döngüsü: Boss kesildiğinde oyunculara ödül sandıkları verilir ve Lua içerisine yazılan bir zamanlayıcı (
timer) devreye girer. Süre dolduğunda haritada kalan tüm oyuncular otomatik olarak dışarı fırlatılır ve zindan hafızası sıfırlanır.Lua Yazarken Dikkat Edilmesi Gereken Hatalar
Lua dilinde de Python'da olduğu gibi küçük/büyük harf duyarlılığı (case-sensitivity) en üst safhadadır. Örneğin
pc.get_gold() fonksiyonunu pc.Get_Gold() şeklinde yazarsanız oyun motoru bu fonksiyonu tanıyamaz ve syserr vererek questi askıya alır.Ayrıca yazılan scriptlerde açılan
if veya when bloklarının sonuna mutlaka end komutunun koyulması gerekir. Eksik bırakılan tek bir end kelimesi, questin derlenmesi esnasında Putty terminalinde sözdizimi hatası (syntax error) vererek derleme işleminin yarıda kalmasına yol açar.