Merhaba,
Bu yazıda RNG hakkında detaylı bir anlatım yapıp mantığından bahsedeceğim. Keyifli okumalar!
Not : Aşağıda yazılı olan iddialar tamamen teoriden ibarettir. Github'da bulunan, başka bir mmorpg oyunun sızdırıldığı iddia edilen kaynak kodları referans alınmıştır. Sadece olayların işleyişi hakkında bazı bilgilendirmeler yapmak üzere bu not oluşturulmuştur.
Öncelikle bazı tanımlar yapalım.
RNG : Random Number Generator (RNG), rasgele sayı oluşturma. Tamamen "rastgelelik" üzerine inşa edilmiş bir tür algoritma, kodlar topluluğu, sistem dizisi.
Seed : Rastgele sayı üretimindeki fonksiyon girdisi. (Aşağıda bundan biraz bahsediyorum.)
Fonksiyon : Belirli bir sayıyı (seed) bir veya birden fazla işleme sokup istenilen (belirlenen) aralıkta sayı ortaya çıkaran bir işlem veya işlemler dizisi.
Örneğin:
Belirli sayı (seed) = 7891534896
7891534896 > (10000 - 0 alt/üst limit aralığında) Fonksiyon > 5162 (Çıktı)
1 Saniye = 1,000,000,000 ns (1 saniyenin içerisinde 1 milyar nanosaniye var.)
Seed
Fonksiyon girdisidir. Geçmişte, eskiden üretilmiş olan mmorpg oyunlarında "kernel32.dll" adlı bir modül kullanılmış. Peki bu modül ne yapar?
Kernel32.dll adlı modül, bilgisayarın arka planında çalışan bir timer'ı ele alır. Yani bilgisayar saatidir. Ama bilgisayar saati denildiğinde akla 16.30, 18.47 gibi bir değerler gelmemeli. Bilgisayar çalışmaya başladığı andan itibaren, bilgisayar timer'ında "5378295738257" gibi sayılar, nanosaniye mertebesinde oluşturulmaya, sayılmaya başlar. Kernel32.dll adlı modül, bu sayaçtan 'anlık' olarak "dur! hop! hemen bana bi sayı ver bakim" dercesine bir sayı alır, belirler. İşte bahsettiğim seed, bu sayıdır. Bu seed istenilen şekilde belirlenemez. Black Desert Online'da bu modül mü kullanılıyor bilemeyiz ancak mantığı kavramamız yeterli olacaktır.
Bir Yaratık Yok Edildiğinde Elde Edilen Ödülün Belirlenme Süreci (Drop)
Eveet. Şimdi yukarıdaki sıkıcı bilgileri örneklendirip tatlıya bağlama zamanı.
Yaratık spawn noktasına geldin, attın skillini, yaratığı yok ettin, ne çıktı? Hiçbir şey. İşte bu süreç arka planda tam olarak şu şekilde işlemekte;
(Ben "anlık, o an" şeklinde bahsedeceğim ama siz okuyucular anlık olarak bahsettiğim işlemin, nanosaniye hızında gerçekleştiğini lütfen unutmayın.)
Yaratık kesildiğinde bu rng sistemi aktif edilir. RNG sistemi anlık olarak zamanlayıcıdan uzuun bir sayı çeker. Bu sayı belirlenen bir veya birden fazla fonksiyona sokulur (birden fazlaysan önce birine sonra diğerine sonra varsa diğerine veya diğerlerine). Sonuçta tamamen rastgele bir sayı elde edilir.
Sayının son çıktığı fonksiyonun alt ve üst limitinin 10,000-0 olarak ele alalım. Yani bu fonksiyondan çıkabilecek maksimum sayı 10,000 (on bin), minimum sayı 0 (sıfır) olsun. Envantere gelen ödül sayıya bağlı olarak şöyle olacaktır (tamamen uydurma bir sonuç listesidir);
Not: Görsel 2 adlı şekilde bahsedilen konu oldukça basit işlenmiştir. Detaylı anlatımın karmaşa yaratacağını düşünüp bu şekilde işlemek istedim.
%'ce düşen eşya eldesini arttıran parşömenlerin (sc) işleyişi nasıl? Kullanmanın etkisi nedir?
Nokta atışı bir işleyiş söylemem pek doğru olmaz çünkü incelemesinde bulunduğum kodların içerisinde böyle bir eşya kullanımı mevcut değil. Ancak etkisinden kısaca şöyle bahsedeyim.
Örneğin yaratık kesilen bölgede bir takı elde ediliyor olsun. İsmi de "Memoreka" olsun :)
Memoreka elde etme yüzdesini, kodu yazan abiler dışında kimse bilemez ama biz rastgele bir yüzde verelim (Bazı sitelerde yazan oranlar tamamen tahmindir, gerçek oranları bilemeyiz). Bu ihtimalin %0,02 olduğunu var sayalım, yani 5000'de 1. Bu oranın ne olduğu iyi kavramalıyız. Kestiğimiz yaratıktan eşyanın düşme ihtimali %0,02. Bu demek değildir ki 5000 yaratık kestiğimizde biz bu ödülü kesin olarak elde edeceğiz. Genelde bu kısımda yanlış bir algı var. "eee 5000'de 1 ihtimal varsa sc basıp 2500'e indireyim. 2500 yaratık kestiğimde düşüreyim" şeklinde bir düşüncede bulunmak çok da doğru değil. %0,02 olan bir düşme oranı, %100'lük bir eşya düşürme parşömeni ile %0,04 olur. TEBRİKLER, %0,02 OLAN MEMOREKA ELDE ETME YÜZDENİZ %0,04 OLARAK GÜNCELLENDİ.
Sc etkisini bu şekilde açıkça anlattığımı düşünüyorum. Bana soracak olursanız, eğer yaratıklardan "kadim dilde yazılmış parşömen" veya "yasaklı kitap" gibi sıkça düşme ihtimali bulunan bir eşya yoksa, parşömen basmanın pek de dillendirilecek bir getirisi olmadığını düşünüyorum.
RNG birikir mi? Uzun süre değerli bir drop alamadığımda daha büyük bir değerde drop alma ihtimalim artar mı?
Hayır. Bir spawn noktasından 2 adet takı aldığım durumlar yaşadım. Yani düşmesi muhtemel en değerli ödülden 2 adet peş peşe elde ettim. Muhtemelen bunu siz de yaşadınız veya çevrenizde bu durumu yaşayan biri vardır. Birikme gibi bir durum olsaydı asla böyle bir durum yaşanmazdı. Yaratık yok edilen noktada, istenilen eşyadan daha az değerde bir eşya elde edildiğinde kurulan "gitti bütün rng!" cümlesi bir hurafeden ibarettir.
RNG güne bağlı değildir. Saatlerdir değerli eşya alamamanız, ilerleyen dakikalarda veya saatlerde almayacağınız anlamına gelmez.
Biraz önce elde ettiğiniz eşya, sonrakiler için hiçbir anlam ifade etmez. Merak etmeyin, bütün rng gitmez, gitmemiştir. Oralarda bir yerlerdedir :)
RNG sistemi manipüle edilebilir mi? Yani rastgele sayı oluşturma sistemine bir takım yazılımlarla müdahale edip istediğimiz eşyayı elde edebilir miyiz?
Muhtemelen hayır. Anlattığım sistemde bir çok bilinmeyen, şirket politikası gereği saklanan parametre var. Seed'i bir şekilde kontrol ettik diyelim. Bu seed'in hangi fonksiyona veya fonksiyonlara girdiğini, nasıl bir işlemden geçtiğini bilmek mümkün değil. Hadi diyelim onu da bir şekilde uzun bir uğraş sonucu elde ettiğimizi var sayalım (örneğin; deneme yanılma yoluyla), yukarıda bahsettiğim eşya listenin gerçeğinin (oyunda kullanılan) de bir bilinmeyen olarak karşımıza çıktığını görüyoruz.
Özetle, database'den direkt olarak bu bilgileri elde etmediğimiz sürece bu manipüleyi uygulamak pek mümkün değil.
Elbette bazı kısımlarda eksiklikler hatta hatalar vardır. Konunun uzmanı değil, sadece araştırmaktan keyif alan biriyim. Zaman ayırdığınız için teşekkürler,
Malignant
Mayhem
Eline, emeğine sağlık.
Harika olmuş *Alnını silerken bas* ellerin dert görmesin.