Metin2'de "Beceri Hasarı" ve "Ortalama Zarar" efsunlarının nasıl çalıştığını hiç merak ettiniz mi?
Aslında bu iki efsunun birbiriyle bağlantılı şekilde hesaplandığını söylemek mümkün. game source/game/item_addon.cpp dosyasının içinde yer alan aşağıdaki formül, bu işleyişin temelini oluşturuyor:
Bu kod bloğunda:
Formülün işleyişi şu şekilde özetlenebilir:Öncelikle rastgele bir iSkillBonus değeri üretilir, ardından bu değere bağlı olarak iNormalHitBonus değeri hesaplanır.
Şimdi bu üretim sürecine biraz daha yakından bakalım:
Burada kullanılan MINMAX(-30, x, 30) fonksiyonu, değerin -30 ile +30 arasında kalmasını sağlar.
Asıl dikkat çeken ise gauss_random(0, 5) ifadesidir.
Bu fonksiyon, 0 ortalamalı ve 5 standart sapmalı Gauss dağılımına sahip rastgele bir değer üretir.
Ne anlama geliyor?
Aşağıdaki görseller, bu dağılımı daha net görmenizi sağlar:
İlk örnekte (0,5):
İkinci örnekte (0,10):
Sonuç?
Standart sapma arttıkça, yüksek beceri bonusu (iSkillBonus) gelme ihtimali de yükselir.
Yani daha yüksek "becerili vuruş" değerleri görmek isterseniz, gauss_random(0, 5) fonksiyonundaki 5 değerini arttırmanız yeterli olacaktır.
Kendi testinizi yapmak ister misiniz?
Aşağıdaki küçük C++ programı ile bunu kolayca gözlemleyebilirsiniz:
Aslında bu iki efsunun birbiriyle bağlantılı şekilde hesaplandığını söylemek mümkün. game source/game/item_addon.cpp dosyasının içinde yer alan aşağıdaki formül, bu işleyişin temelini oluşturuyor:
C++:
int iSkillBonus = MINMAX(-30, (int) (gauss_random(0, 5) + 0.5f), 30);int iNormalHitBonus = 0;if (abs(iSkillBonus) <= 20)iNormalHitBonus = -2 * iSkillBonus + abs(number(-8, 8) + number(-8, 8)) + number(1, 4);elseiNormalHitBonus = -2 * iSkillBonus + number(1, 5);
Bu kod bloğunda:
- iSkillBonus → "Becerili Vuruş" değerini,
- iNormalHitBonus → "Ortalama Zarar" değerini temsil ediyor.
Formülün işleyişi şu şekilde özetlenebilir:Öncelikle rastgele bir iSkillBonus değeri üretilir, ardından bu değere bağlı olarak iNormalHitBonus değeri hesaplanır.
Şimdi bu üretim sürecine biraz daha yakından bakalım:
C++:
iSkillBonus = MINMAX(-30, (int)(gauss_random(0, 5) + 0.5f), 30);
Burada kullanılan MINMAX(-30, x, 30) fonksiyonu, değerin -30 ile +30 arasında kalmasını sağlar.
Asıl dikkat çeken ise gauss_random(0, 5) ifadesidir.
Bu fonksiyon, 0 ortalamalı ve 5 standart sapmalı Gauss dağılımına sahip rastgele bir değer üretir.
Ne anlama geliyor?
- Ortalamanın 0 olması, üretilen değerlerin ağırlıklı olarak 0 civarında olduğunu gösterir.
- Standart sapma arttıkça, yüksek mutlak değerli sonuçların gelme ihtimali de artar.
Aşağıdaki görseller, bu dağılımı daha net görmenizi sağlar:
ortalama 0, standart sapma 5 | ortalama 0, standart sapma 10 |
---|---|
|
İlk örnekte (0,5):
- iSkillBonus'un 0-5 arasında gelme ihtimali %34,13
- 5-10 arası gelme ihtimali ise %13,59
İkinci örnekte (0,10):
- 0-10 arası %34,13
- 10-20 arası %13,59
Sonuç?
Standart sapma arttıkça, yüksek beceri bonusu (iSkillBonus) gelme ihtimali de yükselir.
Yani daha yüksek "becerili vuruş" değerleri görmek isterseniz, gauss_random(0, 5) fonksiyonundaki 5 değerini arttırmanız yeterli olacaktır.
Kendi testinizi yapmak ister misiniz?
Aşağıdaki küçük C++ programı ile bunu kolayca gözlemleyebilirsiniz:
C++:
#include <iostream>#include <random>#include <algorithm>#include <cmath>
double gauss_random(double mean, double stddev) {static std::random_device rd;static std::mt19937 gen(rd());std::normal_distribution<> d(mean, stddev);return d(gen);}
int number(int min, int max) {static std::random_device rd;static std::mt19937 gen(rd());std::uniform_int_distribution<> dis(min, max);return dis(gen);}
int MINMAX(int min, int value, int max) {return std::min(std::max(value, min), max);}
int main() {int iSkillBonus, iNormalHitBonus;
[code=cpp]
do {
iSkillBonus = MINMAX(-30, (int)(gauss_random(0, 5) + 0.5f), 30);
if (abs(iSkillBonus) <= 20)
{
iNormalHitBonus = -2 * iSkillBonus + abs(number(-8, 8) + number(-8, 8)) + number(1, 4);
} else
{
iNormalHitBonus = -2 * iSkillBonus + number(1, 5);
}
std::cout << "iSkillBonus: " << iSkillBonus << ", iNormalHitBonus: " << iNormalHitBonus << std::endl;
} while (iSkillBonus >= -10);
std::cout << "-10'dan küçük bir iSkillBonus değeri üretildi: " << iSkillBonus << std::endl;
return 0;
}