Metin2 skilldesc.txt: Beceri Açıklamaları ve İpucu Formülleri
Hazırlayan: Metin2VIP Editörleri Yayın: 10 dk okuma
İçindekiler
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:
- 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_LEVELya da bir becerinin bMaxLevel çarpanı değiştirilirse ipucu bunu bilmez. FormüllerdekileSkillPointaynı değerdir. - İlk etki satırı:
skilltable.txt'deki güç formülü alınır. Formüldeatk,mwepya danumbergeçiyorsa istemci formülü ikiye ayırır:numberyerineminvemax,atkyerineminatkvemaxatk,mwepyerineminmwepvemaxmwepyazar. Üç 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. - İkinci ve üçüncü satır:
skilldesc.txt'deki en az ve en çok formülüyle hesaplanır; sunucununszPointPoly2değerini istemci hiç görmez. - Yazım: Sonuç eksiyse artıya çevrilir. Metinde
%.0fvarsa iki sayı aşağı yuvarlanır, sonra metin C'nin printf biçimiyle doldurulur. Biçimlendirilmiş satır en çok 64 karakterdir, fazlası kesilir. - 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?
-
Önce sunucu. Hasar, süre, SP ya da bekleme değişecekse
skill_proto'yu değiştir ve/reload pile yükle. İstemci dosyaları gerçek değeri değiştirmez. -
skilltable.txt'yi skill_proto'dan üret. Elle kopyalamak hata kaynağıdır. Aşağıdaki sorguyu
skilltable.sqladıyla kaydedip yalnız SELECT yetkisi olan bir kullanıcıyla çalıştır;-pparolayı komut satırına yazmadan sorar.-Nbaşlık satırını kaldırır,-Bsü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 -
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.
-
Paketle.
skilldesc.txtlocale paketindelocale/tr,skilltable.txtaynı pakettelocale/commonaltındadır; paket yeniden oluşturulur, ayrıntı pack dosyaları yazısında. -
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'deStrange Skill Attribute,STRANGE_SKILL_TYPE,Strange Formulaya daOut Of Rangesatı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
mtkvewepistemcide ilk satırda bile tanınmaz; büyü silahı içinmwepyaz. İkinci ve üçüncü satırlardaatkda tanınmaz,minatkvemaxatkgerekir.MinMWEPveminmtksilahın büyülü değil normal saldırısını verir. - Biçim belirtecini bozmak. Metinde
%dkullanmak 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 Rangeyazar ve dosyanın geri kalanını hiç okumaz; o satırdan sonraki beceriler açıklamasız kalır,skilltable.txtde yüklenmez. - Sınıf sütununu küçük harfle yazmak.
warriorgibi 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
- Metin2 Beceri Gücü Tablosu: Seviyeye Göre Güç Yüzdesi ve Anlamı (Wiki)
- Metin2 Client Dil Dosyaları: locale_game, itemdesc ve skilldesc (Server kurma)
- Metin2 Pack Dosyaları: EPK ve EIX Nedir? (Server kurma)
- Metin2 skill_proto Sütunları ve Formüller (Server kurma)
- Metin2 Beceri Formülleri: Bütün Sınıfların Saldırı Becerileri (Wiki)
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?