---
title: 'TH04 الهندسة العكسية: أنماط رصاصة دوس — REA'
url: https://rea.tools/ar/showcase/th04/
---

[الرئيسية](https://rea.tools/ar/) / [يعرض](https://rea.tools/ar/showcase/) / TH04

دراسة حالة \* توهو 4: قصة لوتس لاند

# إعادة البناء TH04في أنماط رصاصة.

تبدأ حلقة من الرصاص بحساب زاوية قصير. استخدام REA لتفقد وظيفة دوس الأصلية ، ثم اتبع تعليماتها في قراءة ج++.

PC-98 \* 16 بت دوس \* ج assembly والتجمع

[عرض TH04 إعادة الإعمار](https://github.com/N0zoM1z0/th04)

من التعليمات الأصلية إلى المصدر المحدد

1. 01 \* اللعبة الأصلية

   **الرئيسية.إكس**

   ال PC-98 قابل للتنفيذ ومساعد زاوية الرصاصة.
2. 02 \* فحص مع REA

   **تعليمات + المراجع**

   تحقق من رمز دوس تحميل وقراءة حساب زاوية من الملف القابل للتنفيذ.
3. 03 \* قراءة ج C

   **الفضاء-الهدف-تدوير**

   قم بتوصيل كل عملية بإعادة الإعمار التي تمت صيانتها.
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/ar/figures/th04-bullet-ring.svg)

رسم توضيحي للرياضيات الزاوية المستردة للعد 16 واتجاه اللاعب 40 ودوران القالب 0. [الشكل المفتوح](https://rea.tools/assets/localized/ar/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
   ```

   المقابلة الحفاظ ج C

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

   المعاملات تعليمات فضح اثنين من الاختلافات تنسيق ومساعد الاتجاه. تضاف قيمة الإرجاع إلى زاوية الحلقة النسبية. أسماء المصدر تجعل هذه العناوين قابلة للقراءة; REA يتيح للوكيل التحقق من العمليات الأصلية خلفهم.

## من التجميع إلى القراءة ج C

حدد خطوة لمطابقة التعليمات الأصلية مع حساب الزاوية. يتبع هذا الملخص مسار الحلقة المستهدفة ؛ يعالج المصدر الكامل أيضا فروق الأسعار والمداخن والأنماط العشوائية.

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

قراءة ج · \* تهدف حلقة ملخص

```
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 ، تماما كما يفعل يلقي بايت غير موقعة. يحول المصدر المحيط أيضا هذه الزاوية والسرعة إلى سرعة.

يختار التجميع فرع الحلقة المستهدفة وحساب الهدف والمخزن النهائي. ج above أعلاه هو ملخص مقروء. تنطبق عمليات التحقق من المترجم أدناه على المصدر المحفوظ في المشروع المرتبط.

قراءة حلقة الحفاظ ومصدر الهدف

حلقة ماكرو · 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 تقوم الشيكات المسجلة للمشروع بتجميع رمز إنشاء الرصاص ، بما في ذلك هذا المساعد ، مع سلسلة أدوات توربو سي J 4.0 ي.

### 2,139 بايت مطابقة

يتطابق رمز إنشاء التعداد النقطي المجمع مع قسم 2139 بايت من الملف التنفيذي الأصلي.

### اثنين نظيفة يبني

اثنين من يبني منفصلة تنتج نفس بايت مطابقة. تتطابق تجزئات الإدخال المسجلة مع المصدر المحفوظ الموضح هنا.

تم تسجيله في 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` |
| فحص الكود المسجل | REA 4.1.0 \* 7 أكتوبر 2026 |

تغطي شيكات المترجم قسم الرمز النقطي الكامل ، بما في ذلك هذا المساعد. كما أنها تقارن مساهمة الخريطة وإعادة التوطين المتداخلة.

REA تم التحقق من صورة تحميل دوس الثابتة في مقطع التحميل `0x1000`. تصف عناوينها صورة التحليل هذه. تقارير نتيجة وظيفة 503 بايت الجسم في نطاقين عبر فترة 517 بايت ؛ التعليمات المحددة أعلاه تكمن في تلك النطاقات المبلغ عنها.

أسماء المصدر والشيكات مترجم تأتي من TH04 نقطة تفتيش `0d72e980`. استخدمت ملاحظات إعادة الإعمار السابقة نصوص التحليل الخاصة بالمشروع; تضيف هذه الصفحة جديدة REA التفتيش على نفس الهدف الأصلي. يتم تثبيت هوية اللعبة الموردة من خلال بيان المستودع الخاص بها ، مع استمرار فتح مصدر التفريغ الأصلي المستقل.

يوضح الشكل حساب الزاوية. ضوابط اللعبة الكاملة والتوقيت و PC-98 سلوك الأجهزة لديها الشيكات وقت التشغيل منفصلة في مشروع إعادة الإعمار.

## كامل TH04 إعادة الإعمار

يقوم المشروع ببناء منتجات دوس الأربعة للعبة من صيانة ج assembly والتجميع. ما وراء جيل رصاصة ، ويغطي المصدر مراحل ، ورؤساء ، وتقديم ، والمدخلات ، والقوائم ، والنهايات والتعامل مع النتيجة.

[استكشاف 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 الأصلي المنفصل.
