Hesaplama modeli — sunucudan çıkarılan formüller
Formüller AKGame GameServer.exe (x64) disassemble edilerek, sınıf katsayıları KO_DATABASE yedeğinden okunarak çıkarıldı. Fonksiyon adresleri o binary'ye aittir.
1 · Karakter değerleri — CUser::SetUserAbility (0x1400d62e0)
item = (sağ el dmg + bonus) + sol el (yay: tam, diğerleri: ½), en az 3
AP = (item·coef·lvl·STAT + 0.005·item·(STAT+40) + 3) · (100+AP%)/100 + baseAP + düz AP
STAT: Rogue → DEX, Priest (INT>240) → INT ve 1.7× katsayı, diğerleri → STR
baseAP: STR>150 ise STR−150 (STR=160'ta bir eksik), INT>240 priest'te INT−150, rogue'da yok
AC = (lvl + item AC)·coef.AC → +mastery % → +(STA−100) → +düz AC → ·AC%/100
Hit = (1 + coef.Hit·lvl·DEX) · itemHit%/100 · ⌊HitBuff/100⌋
Eva = (1 + coef.Eva·lvl·DEX) · itemEva%/100 · ⌊EvaBuff/100⌋
MaxHP = coef.HP·lvl²·STA + 0.1·lvl·STA + STA/5 + HP bonus + 20
2 · Vuruş — CUser::GetDamage (0x14028f800)
tempAC = max(0, AC + AC buff − AC debuff) · (100 + sınıf AC bonusu)/100 tempAP = AP · AttackAmount · PvP AP%/100 · (100 + hedef sınıfa AP%)/100 B = ⌊2·tempAP / (tempAC + 240)⌋ R = ⌊0.85·B + 0.3·rand(0..B)⌋ (normal vuruş) Skill = ⌊B·sHit% + 0.3·rand(0..T/5) + 0.99⌋ (type 1) Ok = ⌊1.8·T·0.6 + rand(0..T/5) + 0.99⌋ (type 2, ×1.8 AKGame'e özel)
3 · Hit şansı — Unit::GetHitRate (0x140290210)
Oran = Hit / Evasion (+1 normal vuruşta). rand(1..10000) eşiğe göre:
| oran ≥ | 5 | 3 | 2 | 1.25 | 0.8 | 0.5 | 0.33 | 0.2 | <0.2 |
|---|---|---|---|---|---|---|---|---|---|
| isabet | 98% | 96% | 94% | 92% | 90% | 80% | 70% | 60% | 50% |
4 · Hasar zinciri (sırasıyla)
- Elemental —
GetMagicDamage(0x140290470): her element içinmiktar − miktar·min(200, direnç + direnç bonusu)/200. Zehirde hedefin zehir direnci hiç okunmuyor, sadece direnç bonusu düşüyor. Iskada bile eklenir. - HP drain / mirror — drain bu ara hasar üzerinden saldırana HP verir; hedefin mirror'u aynı değerden saldırana yansır.
- Silah direnci —
GetACDamage(0x14028eb10): saldıranın her elindeki silah içinhasar −= hasar·direnç/250. Çift dagger iki kez düşer. Dagger ve yay direnci kendi % çarpanıyla. - Sınıf katsayısı —
COEFFICIENT_DAMAGEtablosu (saldıran sınıf × hedef grubu). - PvP bölücü — normalde ÷2, zone bayrağı açıksa ÷3.
- ±%10 sapma — hasarın %10'u ≥ 10 ise
rand(−%10, +%10)eklenir; sonuç ±32000 ile sınırlanır.
5 · Mastery ve düşük HP pasifleri
- Warrior Novice / Kurian Novice: master puanına göre AC +5/8/10/13 %, direnç +15/30/45.
- Warrior Master: AC +20/34/40/50/60/80 %, direnç +30/60/90 — sol elde kalkan yoksa yarıya iner.
- Kurian Master: AC +5/8/10/13/15/20 %, direnç +15/30/45.
- HP %30 altında: Warrior Master & Priest Master AC +%20, Rogue Master direnç +50, Kurian Master (skill[8] 15–23) AP +%20. Düelloda HP eşiği geçince otomatik uygulanır.
- INT > 100 → direnç bonusu +(INT−100)/2.
6 · Skill'ler — MagicInstance::ExecuteType1/2/3
- Type 1 (yakın) (0x1401cf7a0): GetDamage'in skill dalı (
B·Hit%), sonraAddDamageeklenir — PvP'de ÷3 (özel zonda ÷2) — veAddDmgPercToUser% ile çarpılır. - Type 2 (ok) (0x1401d0010): her ok ayrı GetDamage atışı (×1.8 AKGame çarpanı),
NeedArrowkadar ok. - Type 3 (büyü) —
GetMagicDamage(0x1401d8330). Oyuncu büyüsünde isabet zarı yok:
mage : x = ⌈MP_toplam · FirstDamage / 102.5⌉ · (170 + büyü buff) / 100 diğerleri: x = FirstDamage · (500 + büyü buff) / 100 (DAMAGE_SETTINGS.kurianzehir = 500) x = 485·x / (direnç + direnç bonusu + 510) · COEFFICIENT_DAMAGE mage değilse: x = ⌊x/80⌋ · ⌊2·(AP·AttackAmount/5·PvP%) / (AC+240)⌋ x = 0.85·x + 0.1·rand(0, x/2) + 170 (veya 500) x += staff·lvl/60 + 0.8·staff + elemental·lvl/60 + 0.8·elemental (büyü elementi “magic” değilse) warrior: ÷2 (staff yoksa), sonra PvP ÷3
DAMAGE_SETTINGS'teki sınıf çiftleri (ör. mage→warrior 1.4) binary'de hiçbir yerde okunmuyor. Okunan değerler: canavar ayarları (sadece NPC), item sınıfı çarpanları (çağrılmayan fonksiyon) ve kurianzehir.
7 · Karakter dizici
- Base statlar
CHARACTER_SET_VALIDStablosundan (ırk/sınıf). Dağıtılabilir puan: 10 + 3·(lvl−1) + 2·(lvl−60), 83'te 302. Skill puanı: 2·(lvl−9), master en fazla 23. - Itemler
ITEMtablosundan (≈250 bin varyant, slot/tür bazında ayrı dosyalar). Toplanan alanlar: Damage, Ac, Hitrate/Evasionrate (100 + toplam), silah AC'leri, elemental hasar, drain/mirror, stat bonusları, MaxHpB ve dirençler. - Büyü elemental bonusu: sağ eldeki staff + eller dışındaki itemler (sunucu silahları bu döngüden çıkarıyor).
- Kaynak: server reposundaki
Client\klasörü (UI/Item paketleri, Chr iskelet ve animasyonları, Data tabloları). Stok client sadece server client'ta olmayan 12 ikon için yedek olarak kullanılıyor. - Model ve ikon numarası:
ITEM.ItemIconID1= model,ItemIconID2= ikon (client'ınItem_Orgtablosuyla doğrulandı);Item_Ext_Ntablolarındaki kayıt (id = Num % 1000) bunları ezebilir (471 item). İkon dosyasıUI\itemicon_A_BBBB_CC_D.dxt. İsim renkleri ItemType'a göre (Unique, Rare, Upgrade…). - 3D karakter: client'ın
Item\itemarşivindeki ırk modelleri, iskelet (.n3joint) vebreathanimasyonunun ilk karesiyle oyunun kendi skinning'i (v = vOrigin · inv(M₀) · M) uygulanarak bekleme pozunda. Zırh parçasıItem\A_(BBBB+ırk)_CC_D.n3cpart, silahItem\A_BBBB_CC_D.n3cplug(MakeResrcFileNameForUPC); silah sağ el / sol el, kalkan sol ön kol kemiğine takılır. Client'ta modeli olmayan itemler (ör. Holy Knight, Rosetta, Bloody Sword gibi n3chrplug'lı silahlar) çıplak gövde parçasıyla gösterilir. Puri Tuarek'in iskeleti olmadığı için modeli A-pozunda. - Tooltip satırları ve metinleri oyunun
CUIImageTooltipDlgsırasıyla aynı; karşılanmayan level/stat/sınıf gereksinimleri kırmızı.
Sınırlamalar
- Saldırı hızı sunucuda bu fonksiyonlarda yok; düelloda vuruş/cast aralığını sen giriyorsun. Skill cooldown'ları ve DOT düelloya katılmıyor.
- Buff/skill kaynaklı alanlar (AC buff, AttackAmount vb.) sunucudaki toplam değerlerdir; hangi skill'in ne verdiğini oyundaki değerle girmen gerekir.
- Set bonusları (SET_ITEM), item_op tetiklemeleri, NPC hedefler, Kurian'ın özel büyü dalı ve perk tablosunun kendisi modellenmedi; PvP perk % elle girilir.