Örnek olay incelemesi * Touhou 4: Lotus Ülkesi Hikayesi

TH04'NUN yeniden yapılandırılması
kurşun izleri.

Bir mermi halkası kısa bir açı hesaplamasıyla başlar. Orijinal DOS işlevini incelemek için REA kullanın, ardından talimatlarını okunabilir C ++ olarak izleyin.

PC-98 * 16 bit DOS * C ++ ve derleme

TH04 rekonstrüksiyonunu görüntüleyin

Orijinal talimatlardan kontrol edilen kaynağa

  1. 01 * Orijinal oyun ANA.PC-98 yürütülebilir dosyasını ve mermi açısı yardımcısını çalıştırın.
  2. 02 * REA ile kontrol edin Talimatlar + referanslar Yüklenen DOS kodunu doğrulayın ve yürütülebilir dosyadan açı hesaplamasını okuyun.
  3. 03 * C ++ Boşluğunu okuyun → nişan al → döndür Her işlemi sürdürülen yeniden yapılandırmaya bağlayın.
  4. 04 * Kaynağı kontrol edin Kaydedilen 2.139 eşleşen bayt derleyici kontrolleri, bu yardımcıyı içeren madde işareti oluşturma kodunu kapsar.
REA, orijinal kodu ve analiz kanıtını döndürür. TH04 projesi, bakımı yapılan kaynak ve derleyici denetimlerini sağlar.

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.

Kodlama aracınız

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.

16 Mermi halkasının iki diyagramı. Sabit halka sıfır açıyla başlar. 40'lık bir oyuncu yönü eklemek her yönü aynı miktarda döndürür; Vurgulanan ilk mermi oyuncuya işaret eder. Her ikisi de 16 açı birimi veya 22,5 derecelik bir aralık tutar.
Sayı 16, oyuncu yönü 40 ve şablon dönüşü 0 için kurtarılan açı matematiğinin bir örneği. Açık şekil

Kurtarılan kaynaktaki ateşleme şablonu

Elly'nin halka saldırısı * kaynak alıntı
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.

  1. Kodunu okumadan önce DOS görüntüsünü kontrol edin

    Ajan → REA
    open_binary
    {"path": "MAIN.EXE"}
    
    inspect_native_load_image
    {}
    REA → aracı * seçilen alanlar
    status: "verified"
    format: "dos-mz"
    load_segment: 4096
    header_bytes: 6144
    module_bytes: 150114

    Kontrol, 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.

  2. 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 BX

    SI madde işareti dizinini tutar. Vardiya 256 ile çarpar, ardından bölme DS:53AF. Bullet_template alanı tutulan kaynak bullet_template.count. Tam sıra aşağıda görünür.

  3. 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.

REA * orijinal 16 bit talimatlar
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
Okunabilir C ++ * hedeflenmiş halka özeti
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.

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
Halka makro * TH04 şubesi, alıntı
angle_offset = (i * BULLET_ANGLE_FULL_TURN) / count;
if (i >= (count - 1)) {
    group_complete = true;
}
goto aim_or_no_aim;
Açı ve hız * kaynak alıntı
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);

Halka makro * Amaç ve hız kaynağı * Açı gösterimi

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.

TH04 deposunu keşfedin

Üst