반지가 플레이어를 겨냥하는 방법
엘리의 공격은 16 개의 초기 카운트를 가진 목표 링을 요구합니다. 하나의 도우미는 각 총알의 방향을 계산합니다. 같은 반지는 고정된 방향으로 향하거나 플레이어를 향해 돌 수 있습니다.
사용 REA 방법을 찾으려면 TH04 총알 반지를 만들어 플레이어를 겨냥합니다. 계산을 설명하고 코드를 보여줍니다.
로컬에서 사용할 수 있는 원래 실행 파일 및 재구성 체크아웃이 있는 예제 프롬프트입니다.
TH04 256 각도 단위로 전체 시계 방향 회전을 저장합니다. 16 개의 총알에 대해 각 인덱스는 16 개의 단위를 추가합니다: 0, 16, 32, …, 240. 플레이어의 방향을 더하면 그 위치들이 함께 회전됩니다.
복구된 소스의 발사 템플릿
bullet_template.angle = 0;
bullet_template.group = BG_RING_AIMED;
bullet_template.count = 16;
bullet_template_tune();
이 선은 난이도와 성능 조정 전에 패턴을 선택합니다. 공격 소스 읽기.
WhatREA환
우리는 검사 bullet_velocity_and_angle_set() 각 총알의 속도와 각도를 설정하는 함수입니다. REA 명령어,의사 코드 및 참조를 반환합니다. 그 결과의 세 부분이 패턴을 설명합니다.
-
코드를 읽기 전에 도스 이미지를 확인하십시오
에이전트→REAopen_binary {"path": "MAIN.EXE"} inspect_native_load_image {}REA→에이전트·선택된 분야status: "verified" format: "dos-mz" load_segment: 4096 header_bytes: 6144 module_bytes: 150114이 검사는 로드된 코드와 재배치 레코드를 제공된 실행 파일에 연결합니다. 위의 경로는 표시를 위해 단축됩니다.
-
링의 곱하기 및 나누기 읽기
에이전트→ REA ·analyze_function{"procedure": "0x2cfc8"}REA→에이전트·사용법 발췌문0x2d0eb: MOV AX, SI 0x2d0ed: SHL AX, 0x8 0x2d0f0: MOV DL, byte ptr [0x53af] 0x2d0f9: IDIV BXSI총알 인덱스를 보유하고 있습니다. 이 이동은 256 으로 곱하고,그 다음에는 이 분할에서 읽은 수를 사용합니다.DS:53AF. 유지 관리되는 소스 이름은 해당 필드입니다bullet_template.count. 전체 순서는 아래에 나타납니다. -
패턴이 플레이어 쪽으로 향하는 위치 찾기
동일한 기능 결과*목표 발췌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 에이전트가 그 뒤에 있는 원래 작업을 확인할 수 있습니다.
어셈블리에서 읽을 수있는 키++
원래 지침과 각도 계산을 일치시킬 단계를 선택합니다. 이 요약은 목표 링 경로를 따릅니다.전체 소스는 스프레드,스택 및 무작위 패턴을 처리합니다.
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 을 곱합니다. 카운트는 0 으로 확장되어 단어로, IDIV 곱을 그 수로 나눕니다. 카운트 16 의 경우 각 인덱스는 16 개의 각도 단위를 앞당깁니다.
03*플레이어 방향을 추가합니다. 두 빼기는 플레이어-마이너스-원점 좌표를 형성합니다. 방향 도우미는 각도를 반환합니다. AX;그것을 추가하면 전체 링이 플레이어에게 향합니다.
04*패턴의 회전을 추가합니다. ADD AL,[0x53ad] 템플릿 각도를 추가합니다. 엘리의 초기 템플릿은 0 으로 설정;다른 패턴은 회전과 같은 도우미를 사용할 수 있습니다.
05*최종 각도를 1 바이트로 유지하십시오. 가게가 쓴 글 AL 스폰 각도 필드에. 값은 부호없는 바이트 캐스트와 마찬가지로 255 이후에 래핑됩니다. 주변 소스는 또한 이 각과 속도를 속도로 변환합니다.
어셈블리는 조준 링 분기,조준 계산 및 최종 저장소를 선택합니다. 위의 C++는 읽을 수있는 요약입니다. 아래의 컴파일러 검사는 연결된 프로젝트의 유지되는 소스에 적용됩니다.
유지 링 및 조준 소스 읽기
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++및 어셈블리에서 게임의 네 가지 도스 제품을 빌드합니다. 총알 생성 외에도 소스는 스테이지,보스,렌더링,입력,메뉴,엔딩 및 점수 처리를 다룹니다.
- 총알 생성 소스전체 도우미,다른 패턴 유형 및 템플릿 튜닝.
- 도스 빌드 및 실행 가이드소스를 빌드하고 프로젝트에서 테스트 PC-98 에뮬레이터 워크 플로우.
- 현재 프로젝트 상태도스 검증 및 별도의 기본 64 포트.