000%
RESTORATION Nº 11 · 2026
IPHONE · IPAD · MAC

HeavyMach — iPhone·iPad·Mac에서 다시 만든 전차 액션 게임

대학생 때 아이팟터치에서 즐겼던 HeavyMach를 현재의 Apple 기기에서 다시 실행하도록 만들었습니다. 원작의 전투·성장·미션을 복원하고, 넓은 화면과 키보드 조작, 자동조준, 새로운 항공기와 지상 유닛, HUD 위치 편집 기능을 추가했습니다. 저는 기능을 기획하고 직접 플레이하면서 원작과 다른 부분을 찾아 수정을 지시했습니다. Codex는 분석·코드 구현·그림 제작·빌드·검사를 맡았습니다.

녹색 모서리와 LOCKED 문구가 표적을 표시한다.
FIG. 01HEAVYMACH — IPHONE · IPAD · MAC — IPHONE · IPAD · MAC
HEAVYMACHSECTION 01

아이팟터치에서 지금의 아이폰으로

HeavyMach는 2009년에 나온 횡스크롤 전차 액션 게임입니다. 변해준이 개발하고 박재철이 그림을 맡았습니다. 기기를 기울여 전차를 앞뒤로 움직이고, 화면에서 공격할 지점을 터치해 조준하고 발사합니다. 점프 버튼으로 장애물을 넘고, 무기 버튼으로 지상·공중의 적에 맞는 공격 수단을 고릅니다. 복원판에서도 이 조작을 유지했습니다.

저는 Cydia에서 처음 이 게임을 접한 뒤 미국 App Store 계정을 만드는 방법을 찾아 구매했습니다. 당시 한국 스토어에는 게임 카테고리가 없었습니다. 이후 2017년 7월 세 번째 직업으로 iOS 개발자를 택했을 때, HeavyMach가 그 선택에 약 35%의 영향을 주었다고 생각합니다. 지금 쓰는 아이폰에서 다시 실행하고 싶었던 것도 그 때문입니다. 꿈속에서 아이팟터치를 처음 접하던 자신을 본 뒤 이 게임을 검색했고, 원본을 찾은 일이 복원의 시작이 됐습니다. 진로를 바꾼 경험과 지금 이 게임을 남기려는 이유는 함께 쓴 Mags 인터뷰에서 다룹니다. Internet Archive(archive.org)의 HeavyMach 시리즈 모음에서 받은 HeavyMach 1.13 빌드를 바탕으로 복원을 시작했습니다.

이 글의 기능과 개발 상태는 2026년 10월 29일 공개판 v0.16을 기준으로 합니다. iPhone·iPad·Mac에서 일반 앱과 치트 검증 앱을 각각 설치할 수 있습니다. 원작의 규칙을 복원한 뒤 화면과 입력을 확장하고 새 적을 추가했습니다. 무엇이 원래 있던 기능이고 무엇을 새로 넣었는지 구분하면서 작업했습니다.

경사로 위로 뛰어오른 전차가 적을 향해 사격한다.FIG. 02
FIG. 02

The tank jumps above a slope and fires at an enemy.

HEAVYMACHSECTION 02

무기·성장·미션의 규칙

기관포·산탄·미사일·광선·공중 지원 무기는 원작에서 가져왔습니다. 무기마다 탄속·분산·중력·연사 간격이 다릅니다. 같은 위치에서 발사해도 무기에 따라 궤적과 도달 시간이 달라집니다. 플레이어는 전차의 위치와 포신을 조절하고, 무기를 바꾸거나 지원 공격을 사용해 적을 상대합니다.

경험치를 얻어 이동·방어·공격 능력을 강화하고, 보스를 물리치며 미션을 진행하는 구조도 유지했습니다. 미션을 끝내면 박재철의 결과 일러스트와 다음 스테이지 선택 화면이 나옵니다. 전차가 움직이고 총알이 나가는 것 외에도 피해와 강화 계산, 적의 이동·등장 조건, 미션 종료와 저장까지 맞춰야 했습니다. 예를 들어 피해 강화는 정수 나눗셈의 순서가 달라지면 결과값도 바뀝니다. Codex는 같은 무기·강화·난수 조건에서 계산과 실행 결과를 대조했습니다.

저는 설치한 앱을 직접 플레이하며 틸트 반전, 지원 공격의 낙하 위치, 보스의 움직임, 빠진 결과 그림을 지적했습니다. 수정 뒤 원작 복원 단계인 v0.9의 아이폰 앱으로 전체 미션을 플레이했고, 그때는 크래시·오동작·적 이동 이상을 보지 못했습니다. 이후 항공기와 자동조준을 추가한 앱도 iPhone·iPad에서 플레이했습니다.

상단의 무기 목록과 선택 테두리.FIG. 03
FIG. 03

The weapon list and selection outline at the top of the screen.

푸른 광선 여러 줄이 상공에서 지상으로 내려온다.FIG. 04
FIG. 04

Multiple blue beams descend from the sky.

MOVEMENT·DEFENSE·ATTACK을 고르는 업그레이드 창.FIG. 05
FIG. 05

The upgrade screen offers MOVEMENT, DEFENSE and ATTACK.

전차 일러스트 위에 STAGE CLEAR와 다음 스테이지 버튼이 표시된다.FIG. 06
FIG. 06

STAGE CLEAR and the next-stage button appear over the tank illustration.

HEAVYMACHSECTION 03

HUD 위치 편집

게임 중 MENU를 열고 SET GAME UI를 선택하면 버튼·계기판·상단 금속 장식의 위치를 바꿀 수 있습니다. v0.14에서 추가한 기능이며, v0.15부터는 전투 일시정지 메뉴에서만 엽니다. 미션 선택 화면에 있던 편집 버튼은 제거했습니다.

원하는 묶음을 드래그해 옮기고 APPLY를 누르면 배치를 저장하고 일시정지 메뉴로 돌아갑니다. RESUME GAME을 눌러야 전투가 재개됩니다. RESET LAYOUT은 편집 중인 배치를 기본 위치로 되돌리고, CANCEL은 변경을 버립니다. 멈춘 전투 화면과 예시 장면을 바꾸어 보면서 배치를 정할 수도 있습니다. 그림과 터치 영역은 같은 위치 정보를 사용하므로 옮긴 버튼은 새 위치에서 눌립니다.

오른쪽 도구 패널은 HUD를 끌기 시작하면 접힙니다. 다시 열 때는 TOOLS를 누릅니다. 작은 화면에서는 보조 도구만 스크롤하고 CANCEL·APPLY는 아래에 남습니다. 도구 버튼에는 원작 금속 버튼의 판·모서리·눌림 상태를 재사용했습니다.

편집 기능을 만드는 과정에서 사용자 배치에 상단 금속판과 연결 레일이 빠지는 문제가 있었습니다. Codex는 이를 UPPER TRIM 묶음으로 복원해 따로 옮길 수 있게 했습니다. 전투 중 장식은 터치를 가로채지 않습니다. 기존 배치 파일도 읽을 수 있으며 변경된 배치를 APPLY할 때 한 번 저장합니다.

Codex는 실제 iPhone과 iPad에서 HUD 관련 검사 13개씩을 통과했고, MENU를 오른쪽으로 옮긴 뒤 새 위치를 눌러 일시정지 메뉴가 열리는 것도 확인했습니다. 아래 편집 화면과 적용 화면은 치트 앱에서 촬영했습니다. 상단 방향키는 그 앱의 검사용 버튼입니다. HUD 편집 구현 기록에 입력·저장·장식 복원 과정을 정리했습니다.

iPhone 치트 앱에서 상단 금속 장식을 아래로 옮긴 HUD 편집 화면. 드래그 중 오른쪽 도구가 접혔다.FIG. 07
FIG. 07

Upper metal trim moved downward in the HUD editor; the right-hand tools fold away during dragging. iPhone cheat app.

iPhone 치트 앱에서 MENU를 오른쪽으로 옮겨 적용한 뒤 새 위치를 눌러 연 일시정지 메뉴.FIG. 08
FIG. 08

The pause menu opened by pressing MENU at its new position on the right. iPhone cheat app.

HEAVYMACHSECTION 04

저장·렌더링·음향·시간 처리

초기 구현은 사격하거나 피격되거나 경험치를 얻을 때마다 파일을 저장했습니다. 제가 “발사 때마다 파일을 저장?”이라고 묻자 Codex가 메모리 갱신과 파일 저장을 분리했습니다. 슬롯 선택·다음 스테이지·게임 오버·메뉴 복귀 때 저장하도록 바꾸고, 기존 3,624바이트 저장 형식은 유지했습니다. 수정 뒤 자동 검사에서는 180프레임 사격 중 파일 쓰기 0회, 메뉴 복귀 1회가 기록됐습니다.

초기 렌더러는 CPU에서 픽셀을 계산하고 행을 뒤집어 복사한 뒤, 매번 이미지 객체를 만들었습니다. 저는 직접 정상 동작을 확인한 원작 실행판과 비교해 UIKit으로 게임 그림을 매번 만드는 구현을 재검토하라고 했습니다. Codex는 OpenGL ES 1.1로 스프라이트를 그리고 텍스처를 재사용하도록 바꿨습니다. 텍스처 업로드 뒤 필요 없는 CPU 픽셀 메모리도 해제했습니다. Mac은 desktop OpenGL 호환 경로를 사용합니다.

사격음에도 별도 지연이 있었습니다. Codex가 측정한 AVAudioPlayer 효과음 재시작 호출은 평균 52.887ms, p95 58.549ms였습니다. OpenAL 버퍼와 소스를 미리 준비해 발사 때 재사용하도록 바꾼 뒤, 재생 호출 비용은 평균 0.007053ms, p95 0.008167ms로 측정됐습니다. 측정 대상은 효과음 재생을 요청하는 호출의 처리시간입니다.

시간 계산도 고쳤습니다. 초기 구현은 실제 경과 시간을 누적해 화면을 한 번 표시하는 동안 게임 상태를 갱신하지 않거나 여러 번 갱신했습니다. Codex는 이를 화면을 표시할 때마다 한 번씩 갱신하도록 바꿨습니다. 일시정지와 백그라운드 전환 때는 게임 시간·효과음·발사 유지 입력을 멈춥니다. 복귀한 뒤에는 플레이어가 직접 재개하며, 전투 중 120초 동안 입력이 없을 때도 같은 방식으로 일시정지합니다. 무기 전환 때 빠져 있던 효과음도 재생되도록 고쳤습니다.

HEAVYMACHSECTION 05

넓은 화면과 좌표

화면 비율에 따라 더 넓은 월드를 표시하도록 했습니다. 새로 보이는 좌우 영역에서도 터치한 곳으로 사격하려면 실제 픽셀, UI, 카메라, 월드 좌표를 구분해야 합니다. 버튼 그림과 터치 영역은 같은 배치 계산을 따릅니다. 기기의 두 가로 방향에 맞춰 센서와 터치 좌표를 변환하고, 뒤집혀 있던 틸트 이동 방향도 수정했습니다.

미션 3-5의 항공기형 보스가 너무 일찍 접근하는 문제도 화면 확장에서 생겼습니다. Codex는 처음에 제가 말한 적을 헬기로 잘못 짚었습니다. 항공기라고 정정한 뒤 조사한 결과, 화면 폭이 넓어지면서 적이 보이는 조건과 전투 활성 조건이 일찍 충족되고 있었습니다. Codex는 화면에 보이는 범위가 넓어져도 보스전이 일찍 시작되지 않도록 전투 시작 조건을 따로 처리했습니다.

공중 지원 공격이 전차 뒤로 떨어진 원인은 터치를 뗄 때 전달한 가짜 좌표였습니다. Codex는 입력 해제와 조준 좌표를 분리하고 마지막 유효한 공격 위치를 유지하도록 고쳤습니다. 결과 일러스트가 나오지 않던 경로에서는 JPG·PNG 접미사 대응을 수정했습니다. 그림을 찾는 문제를 고친 뒤에는 넓은 화면에서 그림 밖으로 전장이 보이는 문제도 따로 고쳤습니다.

타이틀·모드·미션 메뉴에는 중앙의 기존 그림을 유지하고 좌우 배경을 붙였습니다. 이어지지 않는 명암과 구조를 수정하고, 텍스처 여백이 섞여 나타나던 검은줄도 제거했습니다. 메뉴를 전환할 때 문처럼 닫히는 네 조각이 화면 전체를 덮도록 바꿨습니다. 중앙 표식의 크기는 유지하고 바깥쪽만 늘렸습니다. 닫힐 때 틈이 생기지 않도록 표시 좌표는 정수로 맞췄습니다.

HEAVYMACHSECTION 06

자동조준의 조작과 탄도

아머드 코어와 에이스 컴뱃의 표적 선택·추적을 참고해 자동조준을 기획했습니다. 이동하고 점프하는 동안 포신이 적을 따라가되, 이동·점프·무기 선택·발사는 플레이어가 맡습니다. HUD의 A 버튼을 누르면 전방에서 가까운 적을 선택합니다. 화살표 버튼으로 표적을 바꾸고, 조준경 버튼으로 발사합니다. A 버튼을 다시 누르면 원작의 터치 조준·발사로 돌아갑니다.

선택한 적은 화면 밖으로 나가도 유지합니다. 적이 격파되거나 제거되거나 전차 뒤로 이동하면 다른 전방 적을 고릅니다. 표적에는 모서리 장식과 LOCKED·TRACK·BLOCKED 상태를 표시합니다. 표적이 화면 밖에 있으면 화면 가장자리에 그 방향을 표시합니다. 표적이 없는 경우에는 기본 포신 각도로 돌아갑니다.

Codex는 무기의 속도·중력·수명과 적의 직전 이동량을 사용해 도달 가능한 탄도를 계산했습니다. 실제 탄환과 같은 순서로 중력과 위치를 갱신하고, 포신 각도에 따라 포구 위치도 다시 계산합니다. 낮은 탄도가 지형에 막히면 높은 탄도를 검사하며, 공중 지원 무기는 상공의 발사점을 반영합니다.

처음에는 제가 무기의 포물선과 적의 움직임을 계산해 반드시 명중하는 조준을 요구했습니다. Codex가 넣은 C 보정은 탄속·분산·비행 경로까지 바꿨습니다. 영향을 확인한 뒤 이를 삭제하도록 했습니다. 현재 기능은 표적 선택과 포신 조정이며, 탄속·분산·중력·피해량은 기존 무기의 값을 사용합니다. 발사 뒤 적이 움직이거나 탄환이 분산되면 빗나갈 수 있습니다.

Codex는 자동조준을 끈 상태에서 기능 추가 전후의 수동 사격 기록을 비교했습니다. 20개 무기, 세 난수 시드, 각각 420프레임으로 총 25,200프레임의 기록이 바이트 단위로 같았습니다. 화면 밖·지형 아래·표적 없음 상태를 더 쉽게 알아보게 하는 안내는 후속 과제입니다.

녹색 모서리와 LOCKED 문구가 표적을 표시한다.FIG. 09
FIG. 09

Green corners and the LOCKED label mark the target.

LOCKED 표시가 붙은 공중 적과 싸우며 점프하는 전차.FIG. 10
FIG. 10

The tank jumps while fighting a locked airborne target.

자동조준한 공중 적에게 사격한다. 원래 속도, 5초.FIG. 11
FIG. 11

Firing at an airborne auto-aim target. Original speed, 5 seconds.

자동조준한 적에게 사격하며 점프하고 착지한다. 원래 속도, 6초.FIG. 12
FIG. 12

Jumping, firing at an auto-aim target and landing. Original speed, 6 seconds.

FIG. 13

Auto-aim gameplay with sound · 7 seconds.

FIG. 14

Jumping, firing and the weapon list with auto-aim · 7 seconds.

HEAVYMACHSECTION 07

여섯 종류의 항공기

새 공중 적은 수직이착륙기 Yak-141·Harrier GR3·F-35B와 전투기 F-22·Su-57·MiG-31입니다. 저는 기종·외형·무장·등장 조건을 지정하고, 기존 적을 바꾸지 않은 채 배치 사이에 넣도록 했습니다. Codex가 그림과 코드를 만들었습니다.

수직이착륙기는 기존 헬기의 이동과 무장을 활용합니다. Yak-141은 단발 미사일, Harrier GR3는 2발 기관포, F-35B는 2발 미사일을 사용합니다. 이동에 따라 기체를 기울이고, 포구·노즐·피격 범위도 기체 자세를 따르게 했습니다. 14개 서브미션에 총 113대를 추가했고, 원래 적 배치 1,182항목의 이름·좌표·순서·보스 플래그는 유지했습니다. 새 유닛에는 별도 난수 상태를 사용해 기존 적의 난수 호출 순서를 바꾸지 않았습니다.

전투기 세 기종은 럭스루나에 도색을 적용했습니다. 검은색·금줄·금색 조종석 유리·꼬리날개 엠블렘을 통해 시각적인 오마주를 드러내려 했습니다. 보스전과 직전 미션의 마지막 구간에 강한 증원을 넣어, 보스 하나와 일반 적이 협공하던 전투의 난도와 긴장감을 높이려는 기획입니다. 기존 코드와 자원을 재사용하면서 원작을 바꾸는 부분을 줄이려 했습니다.

HeavyMach는 제가 개발자라는 직업을 택하는 데 영향을 줬습니다. 에이스 컴뱃8의 출시 소식을 들었을 때에는 적어도 출시일까지는 살아 있어야겠다고 생각했습니다. 럭스루나에를 넣으면서 두 게임이 제 삶에서 지닌 의미를 HeavyMach 한 작품에 함께 담았습니다. 제가 기억하는 럭스루나에의 외형과 상대할 때 느꼈던 위협·긴장을 함께 옮기려 했기 때문에, 도색과 무장·등장 조건을 함께 기획했습니다.

내구력은 기존 일반 Heli 정의의 최대 450에 1.7을 곱한 765입니다. F-22와 Su-57은 기존 단발 미사일을 1발씩 3연사하고, MiG-31은 2발 미사일을 세 묶음, 총 6발 발사합니다. 미사일 속도는 160에서 200으로 25% 높였습니다. 연사 속도 증가는 후속 지시에 따라 25%에서 10%로 낮췄으며, 기존 무기의 피해·중력·분산·수명은 유지했습니다.

일곱 보스전과 각 직전 미션에 걸쳐 총 72대를 추가했습니다. 직전 미션에서는 마지막 월드 구간에 4대씩 등장하고, 보스전에서는 보스와의 전투가 실제로 시작될 때 등장합니다. 저는 일반 앱에서 기체가 화면 안에 갑자기 나타나는 문제를 발견해 수정을 지시했습니다. Codex는 기체 전체가 오른쪽 화면 밖에서 진입하도록 고쳤습니다. 진입 중에는 발사하지 않고 일시정지하면 진입도 멈춥니다. 기존 보스의 클리어 판정은 유지했습니다.

화면 안으로 빠르게 진입하는 속도는 Codex가 따로 정했습니다. 제가 직접 지시한 부분은 아니었지만, 에이스 컴뱃8에서 상대했던 럭스루나에의 고속일격이탈과 선회전을 떠올리게 해 유지했습니다. 현재 움직임과 무기 사용 절차는 원작의 감각을 벗어나지 않는다고 생각합니다. v0.16에서는 편대가 진입할 때의 간격을 수정했습니다.

Codex는 기체의 생성 위치와 진입 목적지에 같은 상대 배치를 적용했습니다. 가로 간격은 140, 세로 간격은 70이며, 수량·무장·속도·진입 후 AI는 그대로입니다. 14개 증원 구간, 화면 크기 5종, 플레이어 높이 2종의 140조건에서 생성부터 진입 종료까지 기체 사이의 여유를 확인했습니다. 다만 전투가 시작되면 원작 AI가 플레이어 근처로 모이므로 다시 밀집할 수 있습니다. 고정 플레이어 56조건 비교에서 진입 20초 뒤 겹친 기체 쌍은 수정 전 372에서 수정 후 533으로 늘었습니다. 편대 진입 수정 기록에 진입과 이후 전투를 나누어 기록했습니다.

새 기체 그림은 Codex에 여러 차례 다시 그리게 했습니다. 저는 실물의 형상을 유지하면서 원작의 색조와 질감을 따르도록 요구했습니다. 첫 시안에는 요청하지 않은 짧은 기수와 과장된 장갑 등 외형 재해석이 들어갔습니다. Codex는 실제 사진·도면을 형태 참조로, 기존 게임 그림을 색조·질감 참조로 나눠 다시 제작했습니다. 이후 저는 실제 게임 화면에서 외곽선·표시 크기·후방 불꽃을 확인하고 수정을 지시했습니다. 구체적인 선택 이유와 이 과정에 대한 평가는 Mags에서 이어집니다.

이 작업에서는 텍스트 지시를 받은 Codex가 기존 코드·에셋을 읽고 재사용하며, 지정한 외형과 동작을 얼마나 정확히 구현하는지도 확인하려 했습니다. 두 게임에서 받은 경험을 HeavyMach의 전투에 담으면서, 직접 플레이해 보고 무엇을 바꿀지 계속 판단하고 있습니다. 진입 후 전투 중에 다시 밀집하는 현상은 남아 있고, 화면 밖으로 이탈했다가 다시 공격하는 행동은 아직 구상 중입니다.

검은 항공기들을 향해 전차가 광선을 발사한다.FIG. 15
FIG. 15

The tank fires a beam at the black aircraft.

FIG. 16

Combat against the added aircraft · 13 seconds.

HEAVYMACHSECTION 08

쉴카·퉁구스카 지상 유닛

v0.13부터 쉴카와 퉁구스카가 지상 적으로 등장합니다. 두 유닛은 기존 적을 교체하지 않고 35개 스테이지에 총 152대를 추가했습니다. 쉴카는 흰색 총탄을 6발씩, 퉁구스카는 흰색 총탄 4발과 미사일 2발을 연속 발사합니다. 무장마다 발사점과 발사 상태를 따로 관리합니다.

저는 항공기를 추가할 때처럼 새 외형을 만들되 원작 지상 유닛의 이동과 전투 동작을 활용하도록 했습니다. Codex가 차체·포탑·포신·미사일 발사관·레이더를 나눠 만들고 기존 파츠 구조에 연결했습니다. 탄환·연기·폭발·효과음, 피격과 파괴 처리도 기존 경로를 사용합니다. 차체를 한 장의 그림으로 합치지 않아 경사면에서의 움직임과 포신 반동을 유지할 수 있습니다.

레이더는 포탑에 고정한 받침과 그 위의 회전부로 나눴습니다. 회전부는 24방향 그림을 사용하며 포신과 독립적으로 돌아갑니다. 새 파츠에는 원작의 색조와 질감을 적용했고, 차체의 움직임과 무장·미션 배치는 외형을 고치는 동안에도 유지했습니다.

쉴카는 처음 조립한 포탑이 납작해 보여 다시 수정했습니다. 실차 사진을 참고해 장갑 측면과 뒤쪽 몸통을 두껍게 그리고 긴 안테나 두 개를 제거했습니다. 이후 포탑 표시 높이를 16에서 퉁구스카와 같은 29로 늘리고 포신·레이더 연결점도 함께 옮겼습니다. 최종 그림과 각 수정 단계는 지상 유닛 제작 기록에 있습니다.

아래 두 화면은 iPhone·iPad 치트 앱에서 조립과 사격을 검사하며 남긴 최종 파츠 적용본입니다. 일반 앱에도 같은 유닛이 들어 있습니다. 새 적을 포함한 전체 캠페인의 탄약·피해·클리어 난도는 추가로 확인할 과제입니다.

iPhone 치트 앱에서 최종 포탑 높이를 적용한 쉴카가 경사면에서 흰색 총탄을 발사한다.FIG. 17
FIG. 17

Shilka fires white rounds on a slope with its final turret height. iPhone cheat app.

iPad 치트 앱에서 퉁구스카가 경사면에서 미사일을 발사한다. 레이더는 포신과 별도로 회전한다.FIG. 18
FIG. 18

Tunguska fires a missile on a slope; its radar rotates independently of the barrel. iPad cheat app.

HEAVYMACHSECTION 09

Apple 세 플랫폼에서 공유하는 코드

게임 규칙은 C++20, Apple 기기의 창·입력·그래픽·음향 연결은 Objective-C++로 구성했습니다. HeavyMach.xcworkspace에서 공용 모듈과 iOS/iPadOS·Mac 프로젝트의 의존 관계를 관리합니다. 이동·탄도·피해·성장·적 배치를 각 앱에 복사하지 않고 같은 코어에서 가져오도록 했습니다. 무기 수치 하나를 고쳤을 때 세 플랫폼에 함께 적용하기 위한 구성입니다.

공용 코드는 플랫폼별 SDK로 컴파일한 정적 framework로 링크하고, 이미지·음원·맵·추가 그림은 HeavyMachAssets.bundle로 앱에 포함합니다. iPhone과 iPad는 같은 iOS 타깃을 사용합니다. Mac은 AppKit 앱으로 만들어 창 모드와 전체 화면을 지원하며, Catalyst를 사용하지 않습니다. 플랫폼별 코드는 창과 앱 수명주기, 입력, 그래픽 컨텍스트의 차이를 처리합니다.

iPhone은 두 가로 방향의 화면 회전과 터치·틸트·키보드를 지원합니다. iPad는 화면 비율에 맞춘 캔버스에서 터치·틸트·키보드를 함께 사용할 수 있습니다. Mac은 키보드로 조작합니다. 이동·점프·포신 조절·발사·무기 선택·메뉴를 키에 연결했고, Shift로 기울기와 포신 각도를 세밀하게 조절합니다.

치트 검증 앱에서는 미션·전체 무기·부품·강화 조건을 지정해 같은 전투를 반복할 수 있습니다. 일반 앱과 다른 앱 ID·저장 공간을 사용하며 치트 코어와 런타임도 구분해 빌드합니다. 코어 계산뿐 아니라 실제 화면에서 무기를 고르고 누르고 떼는 동작까지 확인하기 위해 사용합니다.

HEAVYMACHSECTION 10

확인한 결과와 남은 검사

2026년 10월 29일 공개한 v0.16에서는 Codex가 편대 진입과 전투 기능을 검사하고 iPhone·iPad의 일반·치트 앱을 무선 업데이트했습니다. 기존 저장과 HUD 배치를 유지한 채 실행했고, 제가 두 기기에서 직접 플레이했을 때 이상은 보이지 않았습니다.

같은 날 계측한 iPad Air M2의 편대 진입 구간은 프레임 호출 간격 p95가 21.39ms로 기준 20ms를 넘었습니다. 수정 전과 같은 조건의 비교를 통해 원인을 더 조사해야 합니다. iPhone의 진입·전투 구간과 iPad의 전투 구간은 호출 간격 기준을 통과했습니다.

iPhone Air와 iPad Air 13형 M2에 설치한 일반 앱을 제가 직접 플레이했을 때 프레임 드랍이나 오작동은 보이지 않았습니다. Codex가 수행한 2026년 10월 27일 실기기 자동 검사는 두 기기에서 각각 85개 중 84개가 통과했고, 표시시간 비교 1개는 실패했습니다. 실제 검사 OS는 iOS/iPadOS 27.0.1입니다. 자동 검사의 키보드 입력은 Device Hub의 OS 키 입력을 사용했으며, Bluetooth·USB 키보드를 실제 연결해 하는 검사는 남아 있습니다.

Mac mini M4 Pro, macOS 27.0.1에서는 이동·점프·조준·사격·20개 무기·메뉴·그래픽·음향·전체 화면을 포함한 33개 검사가 통과했습니다. 개발 인증서로 서명한 일반·치트 앱의 누수는 0건이었습니다. 앞서 ad-hoc 서명 앱에서 검출된 시스템 연결 누수는 서명과 앱 등록 상태를 대조해 해결했습니다. 1200×800·1920×1080의 여섯 장면에서 30프레임 준비 뒤 180프레임을 측정했을 때 처리시간 p95는 10.86~14.29ms였습니다.

HUD 편집을 추가한 뒤 로컬 ad-hoc 서명으로 측정했을 때는 6개 조건 중 3개가 처리시간 기준 16.67ms를 넘었습니다. 수정 전에도 5개 조건이 기준을 넘었습니다. 이전 개발 인증서 서명 검사와 조건을 맞춘 재측정, 창 표시 지연 조사는 남아 있습니다.

2026년 10월 28일에는 Codex가 공개 main을 새로 clone하고 기존 작업 폴더와 원본 패키지 접근을 차단한 상태에서 빌드·실행했습니다. 자원 1,482개의 해시를 대조했고, 코어 21개·iOS 10개 검사가 통과했습니다. 일반·치트 앱을 iPhone 시뮬레이터에서도 실행했습니다. 다른 사람도 저장소의 파일만으로 빌드할 수 있는지 확인한 검사였습니다.

iPhone·iPad 표시시간 검사가 실패한 원인은 더 조사해야 합니다. 장시간 이동·점프·전투에서의 발열·전력·메모리 변화, 실제 키보드 연결과 재연결, 추가 항공기가 들어간 전체 캠페인의 탄약·피해·클리어 난도도 확인할 예정입니다. 알람 앱을 사용한 뒤 게임으로 돌아오면 소리가 사라진다는 보고도 있으며 원인 조사 전입니다. 조건별 수치는 검증 기록에 정리했습니다.

HEAVYMACHSECTION 11

내려받아 빌드하기

현재 빌드는 Apple Silicon·arm64 대상입니다. 프로젝트의 최소 OS 설정은 iPhone·iPad가 iOS/iPadOS 15.0, Mac이 macOS 12.0입니다. 실제 검사 환경은 앞서 적은 OS 27.0.1 기기들입니다. 빌드에는 Apple Silicon Mac, Xcode, CMake 3.20 이상, Python 3, Git LFS를 사용합니다. 소스·이미지·음원·맵·빌드 프로젝트는 GitHub 저장소에 들어 있습니다.

git clone https://github.com/gelb2/HeavyMach.git
cd HeavyMach
git lfs install --local
git lfs pull
python3 tools/verify_build_resources.py
open HeavyMach.xcworkspace

Git LFS로 큰 자원을 받은 뒤 자원 검사기를 실행하고 workspace를 엽니다. Xcode에서 본인의 개발 팀과 서명을 설정하고 실행 대상을 선택합니다. iPhone·iPad 일반 앱은 HeavyMachRestored, 치트 앱은 HeavyMachValidation입니다. Mac 일반 앱은 HeavyMachMac, 치트 앱은 HeavyMachMacValidation입니다. v0.16 Releases의 소스·자원 압축본을 받아 빌드하는 방법도 있습니다. 시뮬레이터 실행·기기 설치·서명 오류 해결은 설치 문서에 있습니다.

버전 관리는 작업 브랜치를 develop에, develop만 main에 병합하는 순서로 진행합니다. 출시 태그는 main의 병합 커밋에 붙입니다. 특정 출시판을 다시 빌드할 때에는 해당 태그의 소스와 자원을 함께 사용합니다. 코드 구조·기능·수정 과정·변경 이력은 전체 문서에서 연결합니다.

GitHub Releases에는 v0.9부터 v0.16까지의 변경 기록이 있습니다. 위 clone 명령은 main을 받으며, 특정 공개판을 빌드하려면 해당 태그의 소스·자원 묶음을 선택하면 됩니다. v0.16 이후 main에는 릴리스 노트 추출, 자원 포함 압축본, 해시와 GitHub 초안 게시를 처리하는 tools/release.py도 추가했습니다. v0.16 패키지와 실패·재개 검사 17개를 확인했으며, 이 도구로 새 릴리스를 실제 업로드하고 공개하는 단계는 다음 버전에 남아 있습니다. 릴리스 도구 설명에서 명령과 산출물을 볼 수 있습니다.

HEAVYMACHSECTION 12

후속 개발

2026년 10월 29일 기준 공개판은 v0.16입니다. 자동조준·항공기 6종에 이어 지상 유닛 2종, HUD 위치 편집, 글자를 뺀 앱 아이콘과 편대 진입 간격 수정이 반영됐습니다. 아이콘은 iPhone·iPad·Mac 일반·치트 앱에 적용했습니다.

자동조준 상태 안내 개선과 튜토리얼 0-0~0-4는 남아 있습니다. Android는 아이콘 PNG를 준비했고, 공용 C++ 코어를 CMake·NDK로 빌드해 창·입력·음향·그래픽을 Android API에 연결하는 작업은 앞으로 진행할 계획입니다. 아직 Android 앱과 APK는 없습니다.

빌드 경고는 아직 전면 조사·수정을 마치지 못했습니다. 일부 경고는 더 이상 사용을 권장하지 않는 API와 관련된 것으로 추정하고 있습니다. 추가 기능을 개발하면서 경고의 원인도 조사할 예정입니다. 다운로드·자원 준비·빌드·실행을 묶는 스크립트도 계획하고 있습니다. Mac 실행과 iPhone·iPad 설치를 선택하고 필요한 도구, 개발 팀과 서명 설정을 안내하는 방식입니다.

HEAVYMACHSECTION 13

제작자·라이선스·플레이 자료

원작 제작자는 개발자 변해준과 일러스트레이터 박재철입니다. 2011년에는 위메이드 엔터테인먼트의 자회사 위메이드 크리에이티브가 HeavyMach·HeavyMach 2의 IP를 포함한 인디앱스 자산을 인수했습니다. 제작자와 회사별 역할에 원작 제작과 후속 인수를 구분해 기록했습니다.

이 프로젝트에서 새로 작성한 코드에는 MIT를 적용합니다. 라이선스 적용 범위는 원작 유래 자료·외부 코드·문서를 구분합니다. 원작 그림·음원·게임 데이터와 추가 그림에는 자원 이용 조건이 적용되고, OpenAL Soft·stb 등은 외부 라이브러리 고지를 따릅니다.

저는 이 복원판으로 돈을 벌 생각이 없습니다. 다른 사람도 직접 빌드하고 플레이할 수 있도록 코드와 에셋을 공개했습니다. 앞으로도 복원하고 고친 내용을 기록으로 남기려 합니다. 원작자나 다른 이해관계자가 게시 중단을 요청하면 저장소를 지울 생각입니다. 나중에 sass.studio의 App Store 계정을 만들고 원작자·이해관계자에게 배포 허락을 받는다면, 그때도 무료로 제공할 것입니다.

플레이 자료는 제가 녹화한 영상에서 추출했습니다. PNG 8장, 원래 속도로 재생하는 GIF 2개, 소리 있는 MP4 3개로 원작의 점프·무기·강화·미션 결과와 새 항공기·자동조준을 볼 수 있습니다. 장면별 원본 시간과 파일 목록도 함께 공개했습니다.

Nine Years and Three Months

나는 이 복원판으로 돈을 벌 생각이 없다. 코드와 에셋을 함께 공개해 다른 사람도 직접 빌드하고 플레이할 수 있게 하고 싶다. 이 게임을 어떻게 복원했고 무엇을 고쳤는지도 기록으로 남기려 한다.

이해관계자가 연락하면 이 프로젝트는 내릴 것이다. HeavyMach 제작진이 내게 준 9년 3개월은 나를 만든 창조주가 나에게 최초로 할당한 수명을 초과한 값이다.

돈은 이승에서나 필요한 것이다.

— FIN —