Bir yüzük oyuncuya nasıl nişan alır
Elly'nin saldırısı, ilk sayısı 16 olan bir nişan yüzüğü istiyor. Bir yardımcı, her merminin yönünü hesaplar. Aynı halka sabit bir yöne bakabilir veya oyuncuya doğru dönebilir.
TH04'NUN bir mermi halkasını nasıl oluşturduğunu ve onu oyuncuya nasıl hedeflediğini bulmak için REA kullanın. Hesaplamayı açıklayın ve kodu gösterin.
Özgün yürütülebilir dosya ve yeniden yapılandırma ödemesinin yerel olarak kullanılabildiği örnek bir komut istemi.
TH04, 256 açı biriminde saat yönünde tam bir dönüş depolar. 16 Madde işareti için her dizin 16 birim ekler: 0, 16, 32, …, 240. Oyuncunun yönünü eklemek, bu pozisyonları birlikte döndürür.
Kurtarılan kaynaktaki ateşleme şablonu
bullet_template.angle = 0;
bullet_template.group = BG_RING_AIMED;
bullet_template.count = 16;
bullet_template_tune();
Bu çizgiler, zorluk ve performans ayarından önce deseni seçer. Saldırının kaynağını okuyun.
REA ne döndürür
Her merminin hızını ve açısını ayarlayan işlev olan bullet_velocity_and_angle_setbullet_velocity_and_angle_set() REA yönergelerini, sözde kodunu ve referanslarını döndürür. Bu sonucun üç kısmı modeli açıklıyor.
-
Kodunu okumadan önce DOS görüntüsünü kontrol edin
Ajan → REAopen_binary {"path": "MAIN.EXE"} inspect_native_load_image {}REA → aracı * seçilen alanlarstatus: "verified" format: "dos-mz" load_segment: 4096 header_bytes: 6144 module_bytes: 150114Kontrol, yüklenen kodu ve yer değiştirme kayıtlarını sağlanan yürütülebilir dosyaya bağlar. Yukarıdaki yol görüntüleme için kısaltılmıştır.
-
Yüzüğün çarpımını ve bölünmesini okuyun
Ajan → REA *analyze_function{"procedure": "0x2cfc8"}REA → ajan * talimat alıntısı0x2d0eb: MOV AX, SI 0x2d0ed: SHL AX, 0x8 0x2d0f0: MOV DL, byte ptr [0x53af] 0x2d0f9: IDIV BXSImadde işareti dizinini tutar. Vardiya 256 ile çarpar, ardından bölmeDS:53AF. Bullet_template alanı tutulan kaynakbullet_template.count. Tam sıra aşağıda görünür. -
Desenin oyuncuya doğru nereye döndüğünü bulun
Aynı işlev sonucu * amaç alıntısı0x2d190: SUB AX, word ptr [0x53a6] 0x2d198: SUB AX, word ptr [0x53a4] 0x2d19d: CALLF 0x1000:1da8 0x2d1a2: ADD word ptr [BP + -0x2], AXİlgili tutulan C ++group_angle_offset += iatan2( player_pos.cur.y - bullet_template.origin.y, player_pos.cur.x - bullet_template.origin.x );Yönerge işlenenleri iki koordinat farklılığı ve bir yön yardımcısı ortaya çıkarır. Dönüş değeri göreceli halka açısına eklenir. Kaynak adları bu adresleri okunabilir hale getirir; REA, aracının arkalarındaki orijinal işlemleri kontrol etmesini sağlar.
Montajdan okunabilir C ++ 'ya
Orijinal talimatları açı hesaplamasıyla eşleştirmek için bir adım seçin. Bu özet, hedeflenen halka yolunu izler; Tam kaynak ayrıca yayılımları, yığınları ve rastgele kalıpları da işler.
0x2cfcf: MOV SI, word ptr [BP + 0x4]
0x2d0eb: MOV AX, SI
0x2d0ed: SHL AX, 0x8
0x2d0f0: MOV DL, byte ptr [0x53af]
0x2d0f4: MOV DH, 0x0
0x2d0f6: PUSH DX
0x2d0f7: CWD
0x2d0f8: POP BX
0x2d0f9: IDIV BX
0x2d0fb: MOV word ptr [BP + -0x2], AX
0x2d18d: MOV AX, [0x4650]
0x2d190: SUB AX, word ptr [0x53a6]
0x2d194: PUSH AX
0x2d195: MOV AX, [0x464e]
0x2d198: SUB AX, word ptr [0x53a4]
0x2d19c: PUSH AX
0x2d19d: CALLF 0x1000:1da8
0x2d1a2: ADD word ptr [BP + -0x2], AX
0x2d1b9: MOV AL, byte ptr [BP + -0x2]
0x2d1bc: ADD AL, byte ptr [0x53ad]
0x2d1c0: MOV [0xbcc8], AL
unsigned char aimed_ring_angle(
int index, int count,
int player_direction,
unsigned char rotation)
{
int angle = index;
angle = (angle * 256) / count;
angle += player_direction;
angle += rotation;
return (unsigned char)angle;
}
01 * Madde işareti dizinini okuyun. Yığın bağımsız değişkeni SI yüklenir. 16 Maddelik bir halkada, bu üye dizini 0'dan 15'e kadar çalışır.
02 * Yönleri tam bir dönüş etrafında boşluk bırakın. SHL AX,8 256 ile çarpar. Sayım bir kelimeye sıfır genişletilir, ardından IDIV ürünü bu sayıma böler. 16 Sayısı için her indeks 16 açı birimi ilerletir.
03 * Oyuncu yönünü ekleyin. İki çıkarma, oyuncu eksi orijinli koordinatları oluşturur. Yön yardımcısı AX içinde bir açı döndürür; Onu eklemek tüm halkayı oynatıcıya doğru döndürür.
04 * Desenin dönüşünü ekleyin. ADD AL,[0x53ad] şablon açısını ekler. Elly'nin ilk şablonu onu sıfıra ayarlar; diğer desenler aynı yardımcıyı bir dönüşle kullanabilir.
05 * Son açıyı bir baytta tutun. Mağaza, yumurtlama açısı alanına AL yazar. Değerler, tıpkı imzasız bayt dökümünün yaptığı gibi 255'ten sonra sarılır. Çevreleyen kaynak da bu açıyı ve hızı hıza dönüştürür.
Montaj, hedeflenen halka dalını, amaç hesaplamasını ve son depoyu seçer. Yukarıdaki C ++ okunabilir bir özettir. Aşağıdaki derleyici denetimleri, bağlantılı projedeki tutulan kaynak için geçerlidir.
Tutulan halkayı okuyun ve kaynağı hedefleyin
angle_offset = (i * BULLET_ANGLE_FULL_TURN) / count;
if (i >= (count - 1)) {
group_complete = true;
}
goto aim_or_no_aim;
aim:
group_angle_offset += iatan2(
(player_pos.cur.y - bullet_template.origin.y),
(player_pos.cur.x - bullet_template.origin.x)
);
no_aim:
vector2_near(
bullet_template.velocity,
(group_angle_offset + bullet_template.angle),
speed
);
bullet_spawn_angle = (group_angle_offset + bullet_template.angle);
Tutulan kaynağı kontrol etme
TH04 projesinin kaydedilen kontrolleri, sabitlenmiş Turbo C ++ 4.0J araç zinciri ile bu yardımcı da dahil olmak üzere madde işareti oluşturma kodunu derler.
2,139 eşleşen bayt
Derlenmiş madde işareti oluşturma kodu, özgün yürütülebilir dosyanın 2.139 baytlık bir bölümüyle eşleşir.
İki temiz yapı
İki ayrı yapı aynı eşleşen baytları üretir. Kaydedilen giriş karmaları, burada gösterilen korunan kaynakla eşleşir.
3 Ekim 2026'da kaydedildi. Derleyici denetimlerini okuyun.
Hedef kimlik ve analiz kapsamı
| Orijinal hedef | MAIN.EXE, 156,258 bayt, DOS MZ |
|---|---|
| Yardımcı giriş | 0x2cfc8rea'nınREA yüklenen görüntüsünde 0x2cfc8 |
| Orijinal dosya ofseti |
0x1e7c8 döndürülen address_to_file_offset
|
| Kayıtlı kod denetimi | REA 4.1.0 * 7 Ekim 2026 |
Derleyici denetimleri, bu yardımcı da dahil olmak üzere tüm madde işareti ekleme kodu bölümünü kapsar. Ayrıca HARİTA katkısını ve örtüşen yer değiştirmeyi karşılaştırırlar.
REA, 0x1000 yük segmentinde statik DOS yük görüntüsünü doğruladı. Adresleri bu analiz görüntüsünü tanımlar. İşlev sonucu, 517 baytlık bir aralıkta iki aralıkta 503 gövde baytı bildirir; Yukarıdaki seçilen yönergeler, bildirilen aralıklarda bulunur.
Kaynak adları ve derleyici denetimleri TH04 denetim noktası 0d72e980'den 0d72e980. Daha önceki yeniden yapılanma gözlemleri, projenin kendi analiz komut dosyalarını kullandı; Bu sayfa, aynı orijinal hedefin yeni bir REA incelemesini ekler. Sağlanan oyunun kimliği, bağımsız bozulmamış döküm kaynağı hala açıkken, depo bildirimi tarafından sabitlenir.
Şekil açı hesaplamasını göstermektedir. Tam oyun denetimleri, zamanlama ve PC-98 donanım davranışı, yeniden yapılandırma projesinde ayrı çalışma zamanı denetimlerine sahiptir.
Tam TH04 rekonstrüksiyonu
Proje, oyunun dört DOS ürününü bakımlı C ++ ve montajdan oluşturuyor. Madde işareti oluşturmanın ötesinde, kaynak aşamaları, patronları, oluşturma, girdi, menüleri, sonları ve puan işlemeyi kapsar.
- Madde işareti oluşturma kaynağı Tam yardımcı, diğer desen türleri ve şablon ayarı.
- DOS oluşturma ve çalıştırma kılavuzu Kaynağı oluşturun ve projenin PC-98 öykünücüsü iş akışında test edin.
- Geçerli proje durumu DOS doğrulaması ve ayrı yerel x64 bağlantı noktası.