İçeriğe geç

Metin2 skilldesc.txt: Beceri Açıklamaları ve İpucu Formülleri

Hazırlayan: Metin2VIP Editörleri Yayın: 10 dk okuma

Kısaca: skilldesc.txt, Metin2 istemcisinin locale/tr klasöründeki beceri açıklama dosyasıdır; her satır bir becerinin adlarını, açıklamasını, niteliklerini, silah şartını, simgesini, hareketini ve en çok üç etki satırını formülleriyle tutar. İpucundaki sayıları istemci oyuncunun kendi değerleriyle hesaplar: Türkiye ve Avrupa istemcilerinde ilk etki satırının formülü skilltable.txt'den, yani sunucudaki skill_proto'nun kopyasından alınır, ikinci ve üçüncü satırlar skilldesc.txt'deki formüllerle hesaplanır. Sunucu bu dosyayı hiç okumaz; gerçek hasar her zaman sunucuda skill_proto ile hesaplanır.
İçindekiler
  1. skilldesc.txt ne zaman okunur?
  2. Satır biçimi: 28 sütun
    1. Nitelik ve silah adları
  3. İpucundaki sayılar nasıl hesaplanır?
  4. skill_proto ile ilişkisi: ikisi uyuşmazsa ne olur?
    1. Varsayılan dosyalarda ipucu ile oyunun farkı
  5. skilldesc.txt nasıl düzenlenir?
  6. Sık hatalar

skilldesc.txt, istemcinin locale paketinde locale/tr/skilldesc.txt yolunda duran beceri açıklama dosyasıdır. Her satırı bir becerinin istemcideki tanımıdır: üç dereceli adı, açıklaması, koşul satırları, nitelikleri, gerektirdiği silah, simgesi, hareketi ve en çok üç etki satırı. Etki satırlarındaki sayılar istemcide, oyuncunun kendi değerleriyle hesaplanır. Türkiye ve Avrupa istemcisinde ilk etki satırının formülü bu dosyadan değil, sunucudaki skill_proto tablosunun kopyası olan locale/common/skilltable.txt dosyasından alınır.

Sunucu bu iki dosyayı hiç okumaz. Hasar, süre, SP ve bekleme süresi sunucuda skill_proto ile hesaplanır; istemcideki dosyalar ipucunu, beceri penceresini ve istemcinin kendi kullanım denetimlerini belirler. Aşağıdaki davranış istemcinin C++ kaynağından (PythonSkill.cpp, PythonPlayer.cpp, PythonPlayerSkill.cpp) ve root/uitooltip.py'den çıkarıldı; Türkiye ve Avrupa istemcisinden türeyen sürümlerin çok büyük çoğunluğunda aynıdır. Locale klasörünün genel yapısı ve dosyaların yüklenme sırası client dil dosyaları yazısında.

skilldesc.txt ne zaman okunur?

İstemci dosyayı karakter seçim ekranına geçerken, item_proto, itemdesc.txt ve mob_proto'dan sonra okur; hemen ardından skilltable.txt gelir. skilltable.txt'deki bir satır ancak aynı numara skilldesc.txt'de varsa kaydedilir. skilldesc.txt okunamazsa beceri verisi yüklenmez, sıradaki dosyalar da atlanır; syserr.txt'deki LoadLocaleData - RegisterSkillDesc(...) Error satırında koddaki bir yazım hatası yüzünden mob_proto yolu görünür.

Dosya Türkçe için cp1254 (Windows-1254) kod sayfasıyla kaydedilir. Kaynakla gelen dosyada 94 satır vardır; satırlar numara sırasında değildir, sıra önemsizdir.

Satır biçimi: 28 sütun

Sütunlar sekmeyle ayrılır ve en çok 28 sütun okunur. İlk 13 sütun her satırda bulunmalıdır: istemci bunları sütun sayısına bakmadan okur, eksik bir satır istemciyi çökertebilir. Kaynakla gelen dosyada her satır 22 sütundur; son altı sütun yazılmamıştır. Bıçak Çevirme satırı:

33	ASSASSIN	Bıçak Çevirme	Dönen Bıçak	Danseden Bıçak	Düşmanın çevresinde Bıçakla dönmek.	Sıçrama Saldırısı	Dayanıklı Zehir Saldırısı			ATTACK_SKILL|CAN_CHANGE_DIRECTION|WEAPON_LIMITATION	DAGGER|DOUBLE_SWORD|SWORD	charyun	3	4			Saldırı Gücü %.0f-%.0f	2*minatk + (0.5*minatk + dex*9 + str*7)*k	2*maxatk + (0.5*maxatk + dex*9 + str*7)*k	Zehirlenme Değişimi %.0f%%	1 + 4*k
Sütun İçerik Not
1 Beceri numarası skill_proto'daki dwVnum; 0 ise satır atlanır
2 Sınıf ya da tür WARRIOR, ASSASSIN, SURA, SHAMAN, WOLFMAN, SUPPORT, GUILD, HORSE, PASSIVE; simge klasörünü de seçer
3-5 Adlar Normal, Master ve Grand Master derecesinde ipucu başlığı; boş olan yerine 3. sütun kullanılır
6 Açıklama Başlığın altındaki metin
7-9 Koşul satırları Ayrı renkte yazılır; 10. sütun okunmaz
11 Nitelikler | ile ayrılmış adlar, aşağıda
12 Silah SWORD|TWO_HANDED gibi; yalnız WEAPON_LIMITATION varken denetlenir
13 Simge d:/ymir work/ui/skill/<sınıf>/<ad>_01.sub, _02 ve _03: normal, Master ve Grand Master simgesi; destek, lonca ve at becerilerinde tek <ad>.sub
14 Hareket numarası Boşsa beceri hareket oynatmaz
15 Derece başına hareket sayısı En çok 4
16 Hedef sayısı formülü Yelpaze ve daire alanlı becerilerde istemcinin seçtiği hedef sayısı
17 Hareket tekrar formülü Tekrarlanan Atış'ta atılan ok sayısı gibi
18-20 1. etki satırı Metin, en az formülü, en çok formülü
21-23 2. etki satırı Aynı biçim
24-26 3. etki satırı Aynı biçim
27 Seviye şartı İpucunda "Seviye: X" satırı
28 En yüksek seviye Yazılmazsa 20

Seviye şartında küçük bir tuzak var: skilltable.txt'deki şart yalnız bu sütunda 1'den büyük bir değer yazılıysa onun yerine geçer, çünkü koddaki koşul yeni değere değil eski değere bakar. Kaynakla gelen dosyada 27. sütun hiç yazılmadığı için at becerilerinin 50-55 seviye şartı ipucunda görünmez; At Üzerinde Savaş'ın açıklamasında şart ayrıca "(sev. 50 itibariyle)" diye yazılıdır. En yüksek seviyede ise skilltable.txt'nin 2. sütunu 1'den büyükse o geçerlidir (Liderlik 40, At Çağırma 10).

Nitelik ve silah adları

Tanınmayan bir ad syserr.txt'ye Strange Skill Attribute ya da Strange Skill Need Weapon yazdırır ve yok sayılır. Niteliklerin istemcideki etkisi:

Nitelik İstemcide ne yapar
ATTACK_SKILL Saldırı becerisi
NEED_TARGET Seçili hedef ister; hedef yoksa imleçtekini seçer
WEAPON_LIMITATION 12. sütundaki silahlar dışında beceriyi uyarıyla engeller
MELEE_ATTACK, CHARGE_ATTACK Menzil 170 birim sayılır; CHARGE_ATTACK hedefe atılan becerilerdir
STANDING_SKILL Hedef seçmeden olduğu yerde kullanılan beceri; varsayılan dosyada güçlendirmeler ve çevresine vuranlar
CAN_CHANGE_DIRECTION Kullanırken karakter hedefe ya da imlecin gösterdiği yere döner
TOGGLE Aç-kapa; ikinci kullanım kapatır
ONLY_FOR_ALLIANCE, CAN_USE_FOR_ME Yalnız dost oyunculara; hedef bir düşmansa CAN_USE_FOR_ME varken beceri kullananın kendisine uygulanır, yokken engellenir
FAN_RANGE, CIRCLE_RANGE 16. sütundaki sayı kadar ek hedefi yelpaze ya da daire alanından seçer
USE_HP Maliyet SP yerine HP olarak gösterilir ve denetlenir
CAN_USE_IF_NOT_ENOUGH SP 0'dan büyükse, maliyete yetmese de kullanılır
HORSE_SKILL Yalnız at üstünde; at üstünde başka beceri kullanılamaz
ONLY_FOR_GUILD_WAR Yalnız lonca savaşındayken
PASSIVE, CANNOT_LEVEL_UP Kullanılamaz ya da puanla yükseltilemez

Silah adları SWORD, DAGGER, DOUBLE_SWORD (hançer), BOW, TWO_HANDED, BELL, FAN, ARROW, MOUNT_SPEAR, EMPTY_HAND ve Lycan açık istemcide CLAW'dır.

İpucundaki sayılar nasıl hesaplanır?

İpucu uitooltip.py'de kurulur: derecesine göre ad, "Master", "Grand Master" ya da "Perfect Master" satırı, açıklama, koşul satırları; "Güncel Seviye" başlığının altında etki satırları, "Süre", "Yükleme Süresi" (bekleme) ve "Gereken SP". P olmayan becerilerde aynı satırlar bir sonraki seviyenin gücüyle soluk renkte tekrarlanır. Sayıları C++ tarafı şu kurallarla üretir:

  1. Beceri gücü: İstemci k'yı sunucudan almaz. Becerinin seviyesini kendi içine derlenmiş tabloyla yüzdeye çevirir (M1 %50, G1 %82, P %125) ve 100'e böler. Sunucuda SKILL_POWER_BY_LEVEL ya da bir becerinin bMaxLevel çarpanı değiştirilirse ipucu bunu bilmez. Formüllerde k ile SkillPoint aynı değerdir.
  2. İlk etki satırı: skilltable.txt'deki güç formülü alınır. Formülde atk, mwep ya da number geçiyorsa istemci formülü ikiye ayırır: number yerine min ve max, atk yerine minatk ve maxatk, mwep yerine minmwep ve maxmwep yazar. Üç Yönlü Kesme'nin formülüne ayrıca "× 3" eklenir, ipucu üç darbenin toplamını gösterir. Kamuflaj (34) ile lonca becerilerinde (151-157) bu değişiklik yapılmaz, skilldesc.txt'deki formül kalır.
  3. İkinci ve üçüncü satır: skilldesc.txt'deki en az ve en çok formülüyle hesaplanır; sunucunun szPointPoly2 değerini istemci hiç görmez.
  4. Yazım: Sonuç eksiyse artıya çevrilir. Metinde %.0f varsa iki sayı aşağı yuvarlanır, sonra metin C'nin printf biçimiyle doldurulur. Biçimlendirilmiş satır en çok 64 karakterdir, fazlası kesilir.
  5. Süre, bekleme, SP: skilltable.txt'nin süre, bekleme, SP ve saniyelik SP formüllerinden gelir. İpucu bekleme süresini büyü hızı uygulanmadan yazar; istemcinin bekleme kilidi ise büyü hızını hesaba katar.

Formüllerde kullanılabilen adlar ve istemcideki karşılıkları:

Ad İstemcideki değer
k, SkillPoint Beceri gücü ÷ 100
lv, LV, Level Seviye
str, dex, con, iq (ve STR, DEX, CON, INT) Statüler
minatk, maxatk (MinATK, MaxATK) 2 × seviye + (statü saldırısı + 2 × (silahın en düşük ya da en yüksek saldırısı + artı bonusu)) × isabet oranı ÷ 100
minmwep, maxmwep Silahın büyülü saldırı aralığı + artı bonusu
minwep, maxwep, MinMWEP, MaxMWEP, minmtk, maxmtk Silahın normal saldırı aralığı + artı bonusu
ar Kendi isabet oranı ÷ 100 (0,70-1,00); HR bölünmemiş hâli
maxhp, maxsp, odef, DEF Kendi en yüksek HP'si, SP'si ve savunması
chain 0

Fonksiyonlar min, max, number, floor, abs, sqrt, sin, cos, tan, log, ln ile pi ve e sabitidir. IQ ya da Lv gibi listede olmayan bir ad hata vermez, ama istemci ona değer atamaz ve ipucunda anlamsız bir sayı çıkar. Sunucu tanımadığı adı 0 sayar; aynı formül iki tarafta farklı davranır.

İpucunun saldırı değeri ve isabet oranı hedefsizdir. minatk hedefin kaçınmasını, "Saldırı Değeri +X" ve yüzdelik saldırı bonuslarını, ırk bonuslarını ve okun saldırısını içermez; artı bonusunu da isabet oranıyla çarpar, sunucu ise çarpmaz. Büyülerde ar hedefin çevikliği yokmuş gibi hesaplanır:

İpucu bu örnekte formülün sonucunu yaklaşık %32 yüksek gösterir; dirençler ve bonuslar hesaba hiç girmez. Karanlık Vuruş gibi isabetli bütün büyülerde fark hedefin çevikliği arttıkça büyür. Seviye payını da içerdiği için Hava Kılıcı gibi düz bir güçlendirmede ise ipucu tam doğrudur: (100 + Güç + 3 × seviye) × k.

skill_proto ile ilişkisi: ikisi uyuşmazsa ne olur?

skilltable.txt'nin dokuz sütunu skill_proto'nun aynı adlı sütunlarının kopyasıdır: dwVnum, bMaxLevel, bLevelLimit, szPointPoly, szSPCostPoly, szDurationPoly, szDurationSPCostPoly, szCooldownPoly ve dwTargetRange. Sütunların sunucudaki anlamı skill_proto yazısında. Kaynakla gelen dosyada bu sütunlar skill_proto ile birebir aynıdır; yalnız Lycan'ın iki beceri satırında süre formülü boştur, 141 ve 142 numaralı satırlar da altı sütun olduğu için okunmaz.

Uyuşmazlık yalnız ipucunu bozmaz; istemci bazı denetimleri kendi kopyasıyla yapar:

skill_proto alanı İstemcideki karşılığı Farklıysa
szPointPoly İpucunun ilk satırı Yalnız ipucu yanlış; hasar sunucudan gelir
szSPCostPoly İpucu ve istemcinin SP denetimi İstemci "SP yetersiz" deyip beceriyi göndermeyebilir ya da sunucu reddeder
szCooldownPoly İpucu ve istemcinin bekleme kilidi İstemcinin süresi uzunsa oyuncu fazladan bekler; kısaysa beceri erken gönderilir, sunucu SP'yi düşer ama bekleme dolmadığı için uygulamaz
dwTargetRange İstemcinin hedefe yaklaşma mesafesi Sunucunun menzili kısaysa uzaktan atılan becerinin isabetleri sayılmaz
szDurationPoly, szDurationSPCostPoly "Süre" ve saniyelik SP satırları Yalnız ipucu
szMasterBonusPoly Karşılığı yok G ve P ipucu normal formülle hesaplanır
szPointPoly2, szPointPoly3 Karşılığı yok; skilldesc.txt 21-26. sütunlar elle İkinci satır eski şansı gösterir
iMaxHit Karşılığı yok; 16. sütun hedef sayısı Ok Yağmuru'nda istemci P'de 9 hedef seçer, sunucu 8 isabeti sayar

Varsayılan dosyalarda ipucu ile oyunun farkı

Kaynakla gelen dosyalarla bile bazı satırlar gerçek değeri göstermez. Sunucu sahibi bunları düzeltmek isterse ikinci ve üçüncü satırları skilldesc.txt'de, ilk satırı ise ancak istemci kodunda düzeltebilir:

Beceri ve satır İpucu Oyunun hesabı
Bıçak Çevirme, zehirleme şansı 1 + 4 × k (P'de %6) 40 × k (P'de %50)
Zehirli Bulut ve Sinsi Zehir, zehirleme şansı 40 × k (P'de %50) 60 × k (P'de %75)
Büyü Çözme, silme şansı 50 × k (P'de %62) 10 + 40 × k (P'de %60)
Kılıç Darbesi, bayılma şansı Satır var Sersemletme zarı yok; yalnız geri savrulan ana hedef sersemler
Yırtma ve Kurt Pençesi, kritik %20 Ek kritik yok
Kamuflaj, Suikast bonusu 50 × k Seviyeden bağımsız sabit +0,5
Dehşet, 1. satır "Rakibin saldırı değeri -%" 1 + 29 × k (P'de 37) Düz vuruş hasarı P'de %30 azalır; 37 oklardan korunma şansıdır
Karanlık Koruma, 1. satır "Zarar azalması %" Savunma değeri (Zeka 90 ile P'de 75) Hasarın üçte biri SP'den karşılanır
Okçu becerileri, Yüksek Saldırı G ve P'de normal formül G formülü (Yüksek Saldırı P'de ipucu 80,0, gerçek 92)
Hız, "Yüklenme süresi -%" Yüzde gibi yazılır Büyü hızı puanıdır

Dehşet ile Karanlık Koruma'nın ilk satırındaki karışıklık, skilldesc.txt'deki metin ile skill_proto'nun ilk etkisinin farklı şeyleri anlatmasından doğar: metin dosyadan, sayı skilltable.txt'den gelir. Bu iki becerinin ilk satır metnini skill_proto'daki ilk etkiye (oklardan korunma ve savunma) göre yeniden yazmak yeter.

skilldesc.txt nasıl düzenlenir?

  1. Önce sunucu. Hasar, süre, SP ya da bekleme değişecekse skill_proto'yu değiştir ve /reload p ile yükle. İstemci dosyaları gerçek değeri değiştirmez.

  2. skilltable.txt'yi skill_proto'dan üret. Elle kopyalamak hata kaynağıdır. Aşağıdaki sorguyu skilltable.sql adıyla kaydedip yalnız SELECT yetkisi olan bir kullanıcıyla çalıştır; -p parolayı komut satırına yazmadan sorar. -N başlık satırını kaldırır, -B sütunları sekmeyle ayırır. Son sütun (dwTargetRange) her satırda bir sayı olduğu için dokuz sütun korunur; skilldesc.txt'de karşılığı olmayan satırlar istemcide sessizce atlanır.

    SELECT dwVnum, bMaxLevel, bLevelLimit, szPointPoly, szSPCostPoly, szDurationPoly,
           szDurationSPCostPoly, szCooldownPoly, dwTargetRange
    FROM skill_proto
    ORDER BY dwVnum;
    
    mysql -N -B -u okuyucu -p player < skilltable.sql > skilltable.txt
    
  3. Metni ve ikinci satırları skilldesc.txt'de düzelt. Dosyayı cp1254 ve CRLF satır sonuyla, sekmeleri koruyan bir düzenleyiciyle aç; boş sütunları silme, araya sekme ekleme.

  4. Paketle. skilldesc.txt locale paketinde locale/tr, skilltable.txt aynı pakette locale/common altındadır; paket yeniden oluşturulur, ayrıntı pack dosyaları yazısında.

  5. Dene. GM karakterle /setskill <beceri numarası> <seviye> yazıp beceriyi 20 (M1), 30 (G1) ve 40 (P) seviyesine getir, ipucunu her derecede oku. syserr.txt'de Strange Skill Attribute, STRANGE_SKILL_TYPE, Strange Formula ya da Out Of Range satırı varsa düzelt.

Sık hatalar

  • İlk satırın formülünü skilldesc.txt'de değiştirmek. Türkiye ve Avrupa istemcisinde bu formül kullanılmaz; sayı skilltable.txt'den gelir.
  • Yalnız skill_proto'yu değiştirmek. İpucu, SP denetimi ve bekleme kilidi eski değerle kalır.
  • Formülde istemcinin tanımadığı ad kullanmak. Sunucuda geçerli olan mtk ve wep istemcide ilk satırda bile tanınmaz; büyü silahı için mwep yaz. İkinci ve üçüncü satırlarda atk da tanınmaz, minatk ve maxatk gerekir. MinMWEP ve minmtk silahın büyülü değil normal saldırısını verir.
  • Biçim belirtecini bozmak. Metinde %d kullanmak sayıyı bozar, çünkü değerler ondalıklı sayı olarak gönderilir; aralık için iki %.0f, yüzde işareti için %% yazılır.
  • 15. sütuna 4'ten büyük sayı yazmak. İstemci Skill grade motion ... Out Of Range yazar ve dosyanın geri kalanını hiç okumaz; o satırdan sonraki beceriler açıklamasız kalır, skilltable.txt de yüklenmez.
  • Sınıf sütununu küçük harfle yazmak. warrior gibi bir yazım beceriyi tanıtır ama simge klasörü büyük harfle arandığı için simge yüklenmez.
  • Aynı numarayı iki kez yazmak. İkinci satır birincinin üstüne yazılır ama etki satırları silinmez; ipucunda etkiler iki kez görünür.
  • Dosyayı UTF-8 ya da LF satır sonuyla kaydetmek. Türkçe harfler bozulur. İstemcinin okuyucusu 0x80'in üstündeki her baytı iki baytlık bir karakterin başı sayıp ardından gelen baytı da yutar; LF ile kaydedilmiş bir dosyada Türkçe harfle biten satır bir sonrakiyle birleşir.
  • skilltable.txt'de son sütunu boş bırakmak. Satır sonundaki boş sütun sayılmaz, satır sekiz sütun kalır ve atlanır. Menzil yoksa 0 yazılır.
  • Yeni beceriye skilltable.txt satırı eklememek. SP formülü olmayan, aç-kapa olmayan bir beceri istemcide kullanılamaz; sohbette "!!! Find strange game data. Please reinstall metin2." uyarısı çıkar.

Becerinin oyuncu tarafındaki gerçek hesabı beceri formülleri ve beceri gücü yazılarında.

Sık sorulan sorular

skilldesc.txt'deki formülü değiştirdim, ipucu neden değişmedi?
Türkiye ve Avrupa istemcilerinde ilk etki satırının formülü skilldesc.txt'den değil skilltable.txt'den alınır; skilldesc.txt'den bu satırın yalnız metni kullanılır. İlk satırın sayısını değiştirmek için skilltable.txt'deki güç formülünü değiştirmek gerekir. İkinci ve üçüncü satırlar ise skilldesc.txt'deki formüllerle hesaplanır.
skilldesc.txt'yi değiştirince beceri hasarı değişir mi?
Değişmez. Sunucu skilldesc.txt'yi ve skilltable.txt'yi hiç okumaz; hasar, süre, SP ve bekleme süresi sunucuda skill_proto tablosuyla hesaplanır. İstemci dosyaları yalnız ipucunu ve istemcinin kendi kullanım denetimlerini değiştirir.
Beceri ipucundaki hasar neden oyundakinden yüksek görünüyor?
İstemci hedefi bilmez: büyülerde isabet katsayısını hedefin kaçınması yokmuş gibi alır, saldırı değerine bonusları katmaz, okçu becerilerinin Grand Master formülünü de bilmez. Sunucu ise hedefin çevikliğini, savunmasını ve dirençlerini hesaba katar.
Yeni bir beceri için istemcide neler gerekir?
skilldesc.txt'de bir satır, skilltable.txt'de dokuz sütunlu bir satır, ui/skill altında üç simge (.sub) ve becerinin hareket dosyası. skilltable.txt satırı olmayan, aç-kapa olmayan bir beceri istemcide kullanılamaz; sohbette 'Find strange game data' uyarısı çıkar.

İlgili sayfalar

Kategori: Server Kurma Client (İstemci) beceri locale istemci skill_proto skilldesc skilltable

Bu sayfadaki bilgiler Metin2'nin sunucu yazılımındaki hesaplamalara ve standart oyun dosyalarına dayanır. Oyun dosyalarını değiştiren sunucularda değerler farklı olabilir. İçerikleri nasıl hazırlıyoruz?

Bu sayfa işine yaradı mı?

Giriş yap, oy ver ya da sayfayı kaydet. Okumak için üyelik gerekmez. WhatsApp X'te paylaş
Yanlış ya da eksik bir bilgi mi gördün? Bildir
Neyin yanlış olduğunu, doğrusunun ne olduğunu ve bunu nereden bildiğini yaz. Mesajın editörlere gider; yazı, kontrol edildikten sonra düzeltilir.
Yalnız editör görür.

Tartışma

Kurallar

Henüz yorum yok. Bu konuda bir deneyimin ya da sorun varsa ilk yorumu sen yaz.

Giriş yap ya da kayıt ol, sonra yorum yaz. Metin2VIP üyeliği hiçbir oyun sunucusunun hesabı değildir.