사례 연구*동방 4:로터스 랜드 스토리

재구성 TH04의
총알 패턴.

총알의 고리는 짧은 각도 계산으로 시작됩니다. 사용 REA 원래 도스 함수를 검사하려면 해당 지침을 따라 읽을 수 있습니다.

PC-98 ·16 비트 도스*C++및 어셈블리

보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 총알 링의 두 다이어그램. 고정 링은 각도 0 에서 시작합니다. 40 의 플레이어 방향을 추가하면 모든 방향이 같은 양으로 회전합니다.강조된 첫 번째 총알은 플레이어를 가리킵니다. 둘 다 16 각 단위 또는 22.5 도의 간격을 유지합니다.
카운트에 대한 복구 각도 수학의 그림 16,플레이어 방향 40 템플릿 회전 0. 열린 그림

복구된 소스의 발사 템플릿

엘리의 반지 공격*출처 발췌
bullet_template.angle = 0;
bullet_template.group = BG_RING_AIMED;
bullet_template.count = 16;
bullet_template_tune();

이 선은 난이도와 성능 조정 전에 패턴을 선택합니다. 공격 소스 읽기.

WhatREA환

우리는 검사 bullet_velocity_and_angle_set() 각 총알의 속도와 각도를 설정하는 함수입니다. REA 명령어,의사 코드 및 참조를 반환합니다. 그 결과의 세 부분이 패턴을 설명합니다.

  1. 코드를 읽기 전에 도스 이미지를 확인하십시오

    에이전트→REA
    open_binary
    {"path": "MAIN.EXE"}
    
    inspect_native_load_image
    {}
    REA→에이전트·선택된 분야
    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 에이전트가 그 뒤에 있는 원래 작업을 확인할 수 있습니다.

어셈블리에서 읽을 수있는 키++

원래 지침과 각도 계산을 일치시킬 단계를 선택합니다. 이 요약은 목표 링 경로를 따릅니다.전체 소스는 스프레드,스택 및 무작위 패턴을 처리합니다.

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 까지입니다.

어셈블리는 조준 링 분기,조준 계산 및 최종 저장소를 선택합니다. 위의 C++는 읽을 수있는 요약입니다. 아래의 컴파일러 검사는 연결된 프로젝트의 유지되는 소스에 적용됩니다.

유지 링 및 조준 소스 읽기
매크로 반지·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);

링 매크로 · 조준 및 속도 소스 · 각도 표현

유지 관리 소스 확인

그 TH04 프로젝트의 기록된 검사는 이 도우미를 포함한 총알 생성 코드를 컴파일합니다.

2,139 일치하는 바이트

컴파일된 총알 생성 코드는 원래 실행 파일의 2,139 바이트 섹션과 일치합니다.

두 개의 깨끗한 빌드

두 개의 별도 빌드는 동일한 일치하는 바이트를 생성합니다. 기록된 입력 해시는 여기에 표시된 유지되는 소스와 일치합니다.

2026 년 10 월 3 일에 기록된 컴파일러 검사 읽기.

대상 신원 및 분석 범위
원래 목표 MAIN.EXE,156,258 바이트
도우미 항목 0x2cfc8 그 안에 REA로드 된 이미지
원본 파일 오프셋 0x1e7c8,반환 address_to_file_offset
기록 된 코드 검사 REA 4.1.0·2026 년 10 월 7 일

컴파일러 검사는 이 도우미를 포함하여 전체 글머리 기호 추가 코드 섹션을 다룹니다. 그들은 또한 지도의 기여와 중복되는 재배치를 비교합니다.

REA 로드 세그먼트에서 정적 도스 로드 이미지 확인 0x1000. 그 주소는 분석 이미지를 설명합니다. 함수 결과는 517 바이트 범위에 걸쳐 두 범위에서 503 개의 본문 바이트를 보고합니다.위의 선택된 명령은 보고된 범위에 있습니다.

소스 이름과 컴파일러 검사는 TH04 체크포인트 0d72e980. 이전 재구성 관측은 프로젝트의 자체 분석 스크립트를 사용했습니다.이 페이지는 신선한 REA 동일한 원래 대상의 검사. 제공된 게임의 신원은 저장소 매니페스트에 의해 고정되어 있으며 독립적인 원시 덤프 출처가 여전히 열려 있습니다.

이 그림은 각도 계산을 보여줍니다. 전체 게임 컨트롤,타이밍 및 PC-98 하드웨어 동작에는 재구성 프로젝트에서 별도의 런타임 검사가 있습니다.

전체TH04재건

이 프로젝트는 유지 관리 된 C++및 어셈블리에서 게임의 네 가지 도스 제품을 빌드합니다. 총알 생성 외에도 소스는 스테이지,보스,렌더링,입력,메뉴,엔딩 및 점수 처리를 다룹니다.

탐색 TH04 저장소

상단