---
title: TH04 การวิเคราะห์ทางวิทยาศาสตร์ — REA
url: https://rea.tools/th/showcase/th04/
---

[บ้าน](https://rea.tools/th/) / [โชว์เคส](https://rea.tools/th/showcase/) / TH04

กรณีศึกษา\*ทูโฮ 4:เรื่องโลตัสแลนด์

# การฟื้นฟู TH04ของ รูปแบบกระสุน

แหวนของกระสุนเริ่มต้นด้วยการคำนวณมุมสั้น ใช้ REA รวจสอบฟงกชันดอสดั้งเดิมจากนั้นปฏิบัติตามคำแนะนำของฟงกชันดอสที่สามารถอ่านได

PC-98 ·ดอส 16 บิต·ซีดีและแอสเซมบลี

[ดู TH04 การฟื้นฟู](https://github.com/N0zoM1z0/th04)

จากคำแนะนำเดิมไปยังแหล่งที่มาที่ตรวจสอบ

1. 01\*เกมเดิม

   **กเขาเอ็กเซส**

   ร PC-98 ปฏิบัติการและผู้ช่วยกระสุนของมุม
2. 02·ตรวจสอบด้วย REA

   **คำแนะนำ+อ้างอิง**

   ตรวจสอบโค้ดดอสโหลดและอ่านการคำนวณมุมจากปฏิบัติการ
3. 03·อ่านซี++

   **พื้นที่จุดมุ่งหมาย ro หมุน**

   เชื่อมต่อการดำเนินการแต่ละครั้งเพื่อการฟื้นฟูการบำรุงรักษา
4. 04·ตรวจสอบแหล่งที่มา

   **2,139 ไบต์ที่ตรงกัน**

   ตรวจสอบคอมไพเลอร์ที่บันทึกไว้ครอบคลุมรหัสรุ่นกระสุนที่ประกอบด้วยตัวช่วยนี้

REA ส่งกลับรหัสต้นฉบับและหลักฐานการวิเคราะห์ ร TH04 โครงการอุปกรณ์การบำรุงรักษาแหล่งที่มาและคอมไพเลอร์ตรวจสอบ

## วิธีแหวนเล็งไปที่ผู้เล่น

การโจมตีของเอลลี่ขอแหวนเล็งที่มีจำนวนเริ่มต้น 16 หนึ่งผู้ช่วยคำนวณทิศทางของกระสุนแต่ละ แหวนเดียวกันสามารถเผชิญกับทิศทางที่คงที่หรือหันไปทางผู้เล่น

ตัวแทนการเข้ารหัสของคุณ

ใช้ REA เพื่อหาวิธีการ TH04 สร้างแหวนของกระสุนและมีจุดมุ่งหมายที่ผู้เล่น อธิบายการคำนวณและแสดงรหัส

พร้อมท์ตัวอย่างด้วยการเช็คเอาท์ที่ปฏิบัติการและการฟื้นฟูเดิมที่มีอยู่ภายใน

TH04 เก็บหมุนตามเข็มนาฬิกาเต็มรูปแบบใน 256 หน่วยมุม สำหรับ 16 กระสุน,แต่ละดัชนีเพิ่ม 16 หน่วย: `0, 16, 32, …, 240`. การเพิ่มทิศทางของผู้เล่นหมุนตำแหน่งเหล่านั้นเข้าด้วยกัน

![สองแผนภาพของแหวน 16 กระสุน แหวนคงเริ่มต้นที่มุมศูนย์ การเพิ่มทิศทางของผู้เล่น 40 หมุนทุกทิศทางโดยจำนวนเดียวกัน;ไฮไลต์จุดกระสุนแรกที่มีต่อผู้เ ทั้งคู่มีระยะห่าง 16 หน่วยหรือ 22.5 องศา](https://rea.tools/assets/localized/th/figures/th04-bullet-ring.svg)

ภาพประกอบของคณิตศาสตร์มุมกู้คืนสำหรับการนับ 16 ทิศทางผู้เล่น 40 และการหมุนแม่แบบ 0 [เปิดรูป](https://rea.tools/assets/localized/th/figures/th04-bullet-ring.svg)

### แม่แบบการยิงในแหล่งที่มาที่กู้คืน

การโจมตีแหวนของเอลลี่\*ที่มาตัดตอนมา

```
bullet_template.angle = 0;
bullet_template.group = BG_RING_AIMED;
bullet_template.count = 16;
bullet_template_tune();
```

เส้นเหล่านี้เลือกรูปแบบก่อนที่จะปรับความยากลำบากและประสิทธิภาพการทำงาน [อ่านแหล่งที่มาของการโจมตี](https://github.com/N0zoM1z0/th04/blob/0d72e9801a5c14c10384efcbb6734ceccb74ee63/src/main/boss/elly_phase_ring16.cpp#L26).

## อะไรนะ REA การคืนสินค้า

เราตรวจสอบ `bullet_velocity_and_angle_set()` ฟังก์ชั่นที่กำหนดความเร็วและมุมของกระสุน REA ส่งคืนคำแนะนำของรหัสปลอมและการอ้างอิง สามส่วนของผลลัพธ์นั้นอธิบายรูปแบบ

1. #### ตรวจสอบภาพก่อนอ่านรหัส

   เจ้าหน้าที่→ REA

   ```
   open_binary
   {"path": "MAIN.EXE"}

   inspect_native_load_image
   {}
   ```

   REA agent ตัวแทน·ช่องที่เลือกไว้

   ```
   status: "verified"
   format: "dos-mz"
   load_segment: 4096
   header_bytes: 6144
   module_bytes: 150114
   ```

   ตรวจสอบผูกโค้ดที่โหลดและระเบียนการย้ายไปยังปฏิบัติการที่ให้มา เส้นทางด้านบนจะสั้นลงสำหรับการแสดงผล
2. #### อ่านแหวนคูณและหาร

   เจ้าหน้าที่→ REA · `analyze_function`

   ```
   {"procedure": "0x2cfc8"}
   ```

   REA →ตัวแทน\*ตัดตอนการเรียนการสอน

   ```
   0x2d0eb: MOV AX, SI
   0x2d0ed: SHL AX, 0x8
   0x2d0f0: MOV DL, byte ptr [0x53af]
   0x2d0f9: IDIV BX
   ```

   `SI` ถือดัชนีกระสุน กะคูณด้วย 256 แล้วส่วนที่ใช้นับอ่านจาก `DS:53AF`. ชื่อแหล่งที่มาที่เก็บรักษาไว้ `bullet_template.count`. ลำดับที่สมบูรณ์ปรากฏด้านล่าง
3. #### หาที่รูปแบบหันไปทางผู้เล่น

   ผลฟังก์ชั่นเดียวกัน\*ตัดตอนมาจุดมุ่งหมาย

   ```
   0x2d190: SUB AX, word ptr [0x53a6]
   0x2d198: SUB AX, word ptr [0x53a4]
   0x2d19d: CALLF 0x1000:1da8
   0x2d1a2: ADD word ptr [BP + -0x2], AX
   ```

   การบำรุงรักษาที่สอดคล้องกันค++

   ```
   group_angle_offset += iatan2(
     player_pos.cur.y - bullet_template.origin.y,
     player_pos.cur.x - bullet_template.origin.x
   );
   ```

   การเรียนการสอนดำเนินการเปิดเผยความแตกต่างสองประสานงานและผู้ช่วยทิศทาง มูลค่าผลตอบแทนของมันจะถูกเพิ่มในมุมแหวนสัมพัทธ์ ชื่อแหล่งที่มาทำให้ที่อยู่เหล่านั้นสามารถอ่านได้; REA ช่วยให้ตัวแทนตรวจสอบการดำเนินงานเดิมที่อยู่เบื้องหลังพวกเขา

## จากการชุมนุมที่จะอ่านค++

เลือกขั้นตอนเพื่อให้ตรงกับคำแนะนำเดิมกับการคำนวณมุม สรุปนี้เป็นไปตามเส้นทางที่มุ่งแหวน;แหล่งที่มาเต็มรูปแบบยังจัดการแพร่กระจาย,กองและรูป

REA \*คำแนะนำเดิม 16 บิต

```
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
```

Reอ่านได้ค\*สรุปเล็งแหวน

```
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\*อ่านดัชนีกระสุน** อาร์กิวเมนต์สแต็คถูกโหลดลงใน `SI`. ในวงแหวนกระสุน 16 ดัชนีสมาชิกนี้ทำงานจาก 0 ถึง 15

**02\*พื้นที่ทิศทางรอบเปิดเต็ม** `SHL AX,8` คูณด้วย 256 นับเป็นศูนย์-ขยายเป็นคำแล้ว `IDIV` หารผลิตภัณฑ์ด้วยจำนวนที่ นับ 16 แต่ละดัชนีก้าวหน้า 16 หน่วยมุม

**03\*เพิ่มทิศทางของผู้เล่น** สองรูปแบบการลบพิกัดผู้เล่นลบต้นกำเนิด ผู้ช่วยทิศทางกลับมุมใน `AX`;เพิ่มมันจะเปิดแหวนทั้งที่มีต่อผู้เล่น

**04\*เพิ่มการหมุนของรูปแบบ** `ADD AL,[0x53ad]` เพิ่มมุมแม่แบบ แม่แบบเริ่มต้นของเอลลี่ชุดให้เป็นศูนย์;รูปแบบอื่นๆสามารถใช้ผู้ช่วยเดียวกันกับการหมุน

**05\*เก็บมุมสุดท้ายไว้ในไบต์เดียว** ร้านเขียน `AL` ไปยังสนามวางไข่มุม ค่าห่อหลังจาก 255 เช่นเดียวกับการหล่อไบต์ที่ไม่ได้ลงนามไม่ แหล่งที่มาโดยรอบยังแปลงมุมนี้และความเร็วเป็นความเร็ว

การชุมนุมเลือกสาขาเล็งแหวน,การคำนวณจุดมุ่งหมายและเก็บสุดท้าย บทความนี้ไม่มีการอ้างอิงจากเอกสารอ้างอิงหรือแหล่งข้อมูลโปรดช่วยพัฒนาบทความนี้โด ตรวจสอบคอมไพเลอร์ด้านล่างนำไปใช้กับแหล่งที่มาของการบำรุงรักษาในโครงการที่เชื่

อ่านแหวนที่เก็บรักษาไว้และจุดมุ่งหมาย

แมโครแหวน · TH04 สาขาที่ตัดตอนมา

```
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);
```

[แมโครแหวน](https://github.com/N0zoM1z0/th04/blob/0d72e9801a5c14c10384efcbb6734ceccb74ee63/src/main/bullet/add_impl.hpp#L4) · [จุดมุ่งหมายและแหล่งที่มาของความเร็ว](https://github.com/N0zoM1z0/th04/blob/0d72e9801a5c14c10384efcbb6734ceccb74ee63/src/main/bullet/add.cpp#L422) · [การแสดงมุม](https://github.com/N0zoM1z0/th04/blob/0d72e9801a5c14c10384efcbb6734ceccb74ee63/src/main/bullet/types.hpp#L6)

## การตรวจสอบแหล่งที่มาที่บำรุงรักษา

ร TH04 การตรวจสอบการบันทึกของโครงการรวบรวมรหัสรุ่นกระสุน,รวมทั้งผู้ช่วยนี้,กับเทอร์โบตรึงค 44.0

### 2,139 ไบต์ที่ตรงกัน

รหัสรุ่นกระสุนที่คอมไพล์ตรงกับส่วน 2,139 ไบต์ของปฏิบัติการเดิม

### สองสร้างสะอาด

สองรุ่นที่แยกต่างหากผลิตไบต์ที่ตรงกันเดียวกัน แฮชอินพุตที่บันทึกไว้ตรงกับแหล่งที่มาที่เก็บรักษาไว้ที่แสดงที่นี่

บันทึกใน 3 ตุลาคม 2026. [อ่านการตรวจสอบคอมไพเลอร์](https://github.com/N0zoM1z0/th04/blob/0d72e9801a5c14c10384efcbb6734ceccb74ee63/docs/reconstruction/product/TH04_SEMANTIC_BULLET_GENERATION_V1236.md#validation).

อัตลักษณ์เป้าหมายและขอบเขตการวิเคราะห์

|  |  |
| --- | --- |
| เป้าหมายเดิม | `MAIN.EXE`,156,258 ไบต์,เมกะไบต์ |
| รายการผู้ช่วย | `0x2cfc8` ใน REAภาพโหลดของ |
| ชดเชยแฟ้มต้นฉบับ | `0x1e7c8`,ส่งคืนโดย `address_to_file_offset` |
| การตรวจสอบรหัสที่บันทึกไว้ | REA4.1.0·7 ตุลาคม 2026 |

ตรวจสอบคอมไพเลอร์ครอบคลุมส่วนโค้ดเพิ่มกระสุนที่สมบูรณ์รวมถึงตัวช่วยนี้ พวกเขายังเปรียบเทียบการมีส่วนร่วมของแผนที่และการย้ายที่ทับซ้อนกัน

REA ตรวจสอบภาพโหลดแบบคงที่ที่ส่วนโหลด `0x1000`. ที่อยู่ของมันอธิบายภาพการวิเคราะห์นั้น ผลฟังก์ชันรายงาน 503 ไบต์ร่างกายในสองช่วงข้ามช่วง 517 ไบต์;คำแนะนำที่เลือกข้างต้นอยู่ในช่วง

ชื่อแหล่งที่มาและการตรวจสอบคอมไพเลอร์มาจาก TH04 ด่านตรวจ `0d72e980`. การสังเกตการฟื้นฟูก่อนหน้านี้ใช้สคริปต์การวิเคราะห์ของตัวเองของโครงการ;หน้านี้จะเพิ่ REA การตรวจสอบของเป้าหมายเดิมเดียวกัน ตัวตนของเกมที่ให้มาถูกตรึงโดยที่ประจักษ์พื้นที่เก็บข้อมูลที่มีแหล่งที่มาที่เก่าแก่การถ่ายโอน

รูปที่แสดงให้เห็นถึงการคำนวณมุม การควบคุมเต็มรูปแบบเกมระยะเวลาและ PC-98 รวจสอบรันไทม์แยกต่างหากในโครงการฟื้นฟู

## เต็ม TH04 การฟื้นฟู

งการสร้างเกมสี่ผลิตภัณฑ์ดอสจากการบำรุงรักษาซีซีและการชุมนุม นอกเหนือจากการสร้างกระสุน,แหล่งที่มาครอบคลุมขั้นตอนผู้บังคับบัญชา,การแสดงผล,การป้อ

[สำรวจ TH04 ที่เก็บข้อมูล](https://github.com/N0zoM1z0/th04)

- [แหล่งกำเนิดกระสุน](https://github.com/N0zoM1z0/th04/blob/0d72e9801a5c14c10384efcbb6734ceccb74ee63/src/main/bullet/add.cpp#L292)ผู้ช่วยที่สมบูรณ์ประเภทรูปแบบอื่นๆและการปรับแต่งแม่แบบ
- [สร้างและเรียกใช้คู่มือ](https://github.com/N0zoM1z0/th04/blob/0d72e9801a5c14c10384efcbb6734ceccb74ee63/docs/DOS_BUILD.md)มีทักษะในการสื่อสารการเจรจาต่อรองและการเจรจาต่อรอง PC-98 เวิร์กโฟลว์จำลอง
- [สถานะโครงการปัจจุบัน](https://github.com/N0zoM1z0/th04/blob/0d72e9801a5c14c10384efcbb6734ceccb74ee63/docs/RE_HANDOFF.md)64 พอร์ต
