OutOfOre-AutoLeveler
Out of Ore oynarken çok temel bir işlevin eksikliğini hissettim. Bu sebeple, eski günlerime dönerek körelmeye başlayan bazı yeteneklerimi hatırlamak ve biraz nostalji yapmak amacıyla; resmi olarak mod desteği ve SDK sunmayan bu oyun için topluluğun da faydalanabileceği, otomatik kazı seviyesini koruyan GPS destekli bir araç geliştirdim.
Daha önce birkaç farklı projede Python kullanmış olsam da, kendine has kütüphaneleri ve ihtiyaç duyduğum Pymem gibi yapıların çalışma mantığı konusunda zorlandığım noktalarda yardımını esirgemeyen Gemini’a ayrıca teşekkür etmem gerekir.
Oyun Hakkında
Out of Ore adlı madencilik odaklı oyunun, bir grup mod yapımcısı tarafından Steam’e çıkarılan sayılı “sandbox, dig-anywhere” oyunlardan biri olduğunu hatırlatırım. Construction Sim veya Gold Mining Sim gibi oyunlar, sizi nispeten sınırlandırılmış senaryolar içinde belirli alanları kazmaya zorlar. Out of Ore ise birçok araç-gereci istediğiniz gibi kullanıp kendi maden sahanızı yönetmenize izin verdiği için yeri gerçekten başka. Ancak Farming Simulator gibi bir platforma mod geliştirerek oyun yapımcılığına girişen bir firmanın, kendi çıkardıkları ilk oyunda mod desteği sunmaması ilginç bir tezatlık; bu da ayrı bir konu.
Sorun ve İhtiyaç
Grayder veya buldozerimizin bıçak açılarını; zeminin eğimine, yüksekliğine ve aracın o anki konumuna göre istediğimiz açıda sabitleyerek tesviye yapmamızı sağlayacak bir araca ihtiyaç duydum. Oyun içindeki mevcut GPS modülü sadece belirli telemetri bilgilerini görsel olarak sunuyor; kovanın veya bıçağın açısını buna göre doğrudan limitleyemediğimiz için bu verilerin pratikte bir anlamı kalmıyordu.
AŞAMA 1: Telemetri Verilerine Ulaşmak
SDK desteği yoksa ve telemetri verilerini sadece oyunun içinden okuyabiliyorsanız, bunu yapmanın birkaç yolu var. Ben, daha önce çok vakit geçirdiğim “Address Mapping” (veya Pointer Scanning) metodunu tercih ettim. ama fantezinize yönelik bunu ekrandan okutabilir miydik, evet.
İşleyiş Mantığı: Oyunda karakterinizin konumu, bıçağın açısı, haritadaki nesnelerin konumu gibi verilerin çoğu oyun başladığı andan itibaren RAM üzerinde depolanır. Oyunu kaydedip kapattığınızda bu bilgiler dosyalara yazılır. RAM geçici bir bellek olduğu için, Oyunu kaydetmeden oyunu kapattığınızda bu verilerin uçmasının sebebi de budur.
Bizim amacımız, dozer veya grayderimizdeki bıçak açısını bu RAM verisi üzerinden anlık olarak çekmek ve referans aralığına sabitlemekti. RAM söz konusu olduğunda kalıcılık zordur; bugün “A” adresine yazılan bir veri, yarın farklı bir durumda “B” adresine yazılabilir.
Zorluklar: Bıçak açısını ararken; singleplayer için ayrı, multiplayer için ayrı adresleme ve daha kötüsü; mevcut adres yuvaları doluysa oyuna her girip çıktığınızda farklı adreslerde aradığınız şeyi bulma gibi durumlarla karşılaştım. Hatta Windows’un “Hızlı Başlangıç” özelliği bile bellek yönetimini etkileyebiliyor. İlk aşamada; grayderin bıçak sağ-sol eğimini, topraktan yüksekliğini ve açılarını farklı senaryolarda ayrı ayrı tespit edip, ortak adresleri birleştirerek “kalıcı adresleri” buldum. Bu oldukça vakit alan bir süreç; milyonlarca adres verisini daraltıp potansiyel sonuçları permütasyon ile test etmeniz gerekiyor.
AŞAMA 2: Telemetri Verilerini Manipüle Etmek
Telemetri verilerini bulduktan sonra bunları referans aralığına nasıl getireceğiz? Bunun için iki temel yol var:
- Doğrudan RAM Manipülasyonu: Örneğin 5.80 olan bıçak açısının değerini, betik yardımıyla doğrudan 12 yapmak. Ancak bu senaryoda oyunun kullandığı farklı adreslerin çakışması nedeniyle oyunun çökmesine neden oldu (büyük ihtimalle kullanılan oyun motoruyla alakalı).
- Sanal Girdi (Tuş Vuruşu) Yöntemi: Oyunun içine, sanki biz yapıyormuşuz gibi değerler göndermek. Pymem kütüphanesi ile telemetri verilerini okuyup, kullanıcının arayüzden ayarladığı referans değerlerine ulaşana kadar keyboard kütüphanesi ile oyun içine sanal tuş vuruşları gönderdik.
Günün sonunda, elimizde otomatik zemin seviyesi tesviye aracımız vardı. Mod desteği ve SDK olmayan bir oyunda, çoğu kişinin oyunun kendi özelliği olarak gelmesini beklediği bir aracı 1-2 gün içinde yapıp açık kaynak olarak topluluğa kazandırmış oldum.
Teoride yaptığımız şey gayet basit:
- İhtiyaç olan telemetri verilerini tespit et.
- Bu verilerin RAM’de hangi adreslere yazıldığını bul.
- İstenilen değerlere gelene kadar veriyi manipüle et.
Aracın halen eksiklikleri var; örneğin farklı donanım profillerinde belirlediğimiz “Memory Offsets” adresleri uyuşmayabiliyor. Uygulamanın açık kaynaklı olmasının nedeni de bu: hataları birilerinin düzeltip projeyi geliştirmesi. Benim testlerimi yaptığım donanımda gayet iyi çalışıyor.
Evet, tüm bu gevezeliğin sonuna geldin!
gevezeliğin devamı için ahana link