HeavyMach — A tank action game rebuilt for iPhone, iPad and Mac
I made HeavyMach, a game I enjoyed on an iPod touch as a university student, run again on today's Apple devices. We restored the original combat, progression and missions, then added wider screens, keyboard controls, auto-aim, new aircraft and ground units, and HUD layout editing. I planned the features and played the game myself, finding differences from the original and directing corrections. Codex handled the analysis, code implementation, artwork, builds and tests.
FIG. 01HEAVYMACH — IPHONE · IPAD · MAC — IPHONE · IPAD · MAC
HEAVYMACHSECTION 01
From the iPod touch to today's iPhone
HeavyMach is a side-scrolling tank action game released in 2009. Byun Hae-jun developed it, and Park Jae-cheol created the artwork. You tilt the device to move the tank forward or backward, then touch the point you want to attack to aim and fire. A jump button gets you over obstacles, and weapon buttons let you choose attacks suited to ground or airborne enemies. The restored version keeps those controls.
I first encountered the game through Cydia, then looked up how to create a US App Store account and bought it. The Korean store had no games category at the time. When I chose iOS development as my third occupation in July 2017, I believe HeavyMach accounted for about 35% of that decision. That was also why I wanted to run it again on the iPhone I use now. After dreaming about myself encountering the iPod touch for the first time, I searched for the game. Finding the original became the start of the restoration. The accompanying Mags interview covers that change of career and why I want to leave this game behind now. I started the restoration with a HeavyMach 1.13 build downloaded from the HeavyMach series collection on Internet Archive (archive.org).
This article describes the features and development status of the public v0.16 release, as of October 29, 2026. The regular app and a cheat-enabled validation app can be installed separately on iPhone, iPad and Mac. After restoring the original rules, we expanded the display and input systems and added new enemies. Throughout the work, we distinguished original features from new additions.
FIG. 02
FIG. 02
The tank jumps above a slope and fires at an enemy.
HEAVYMACHSECTION 02
Weapons, progression and mission rules
The cannon, shotgun, missile, beam and air-support weapons came from the original. Each weapon has different projectile speed, spread, gravity and firing intervals. Even when fired from the same position, the trajectory and arrival time vary by weapon. The player adjusts the tank's position and barrel, changes weapons or calls in support attacks to fight enemies.
We also kept the structure of earning experience to improve movement, defense and attack, and defeating bosses as you progress through missions. Finishing a mission brings up Park Jae-cheol's result illustration and the next-stage selection screen. Beyond getting the tank moving and bullets firing, we had to match damage and upgrade calculations, enemy movement and spawn conditions, mission completion and saving. Damage upgrades, for example, produce different results if the order of integer division changes. Codex compared calculations and runtime results under identical weapon, upgrade and random-number conditions.
I played the installed app myself and pointed out reversed tilt controls, support attacks landing in the wrong place, boss movement and missing result illustrations. After the fixes, I played every mission in the iPhone app at v0.9, the original-game restoration stage. At that point, I saw no crashes, malfunctions or abnormal enemy movement. I later played the versions with aircraft and auto-aim on iPhone and iPad as well.
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.
FIG. 05
FIG. 05
The upgrade screen offers MOVEMENT, DEFENSE and ATTACK.
FIG. 06
FIG. 06
STAGE CLEAR and the next-stage button appear over the tank illustration.
HEAVYMACHSECTION 03
HUD layout editing
During combat, open MENU and choose SET GAME UI to move buttons, gauges and the upper metal trim. The editor was added in v0.14. Since v0.15, it opens only from the combat pause menu; the entry on the mission-selection screen was removed.
Drag a group into position and press APPLY to save the layout and return to the pause menu. Press RESUME GAME to resume combat. RESET LAYOUT restores the working layout to its default positions, while CANCEL discards the changes. You can switch between the paused battle and a sample scene while arranging it. Images and touch regions share position data, so a moved button responds at its new location.
The tool panel on the right folds away when you start dragging the HUD. Press TOOLS to reopen it. On small screens, only the secondary tools scroll; CANCEL and APPLY remain at the bottom. The tool buttons reuse the original metal button's plate, corners and pressed state.
During implementation, the upper metal plate and connecting rails disappeared from custom layouts. Codex restored them as the separately movable UPPER TRIM group. The decoration does not intercept touches in combat. Existing layout files remain readable, and a changed layout is saved once when APPLY is pressed.
Codex passed 13 HUD checks on each physical iPhone and iPad and confirmed that moving MENU to the right and pressing its new position opened the pause menu. The editor and applied-layout images below were captured in the cheat app; the directional buttons at the top are its test controls. The HUD implementation record covers input, saving and restoration of the trim.
FIG. 07
FIG. 07
Upper metal trim moved downward in the HUD editor; the right-hand tools fold away during dragging. iPhone cheat app.
FIG. 08
FIG. 08
The pause menu opened by pressing MENU at its new position on the right. iPhone cheat app.
HEAVYMACHSECTION 04
Saving, rendering, sound and timing
The initial implementation saved a file whenever the player fired, took a hit or gained experience. When I asked, “You save a file every time I fire?”, Codex separated memory updates from file saving. It changed saving to occur on slot selection, moving to the next stage, game over and returning to the menu, while keeping the existing 3,624-byte save format. After the fix, an automated test recorded zero file writes during 180 frames of firing and one write on returning to the menu.
The initial renderer calculated pixels on the CPU, flipped and copied rows, then created a new image object each time. I asked Codex to compare this with the original game running in an environment I had personally verified and reconsider generating every game image through UIKit. Codex changed the renderer to draw sprites through OpenGL ES 1.1 and reuse textures. It also freed CPU pixel memory that was no longer needed after texture upload. Mac uses a desktop OpenGL compatibility path.
Gunfire audio had a separate delay. Codex measured AVAudioPlayer sound-effect restart calls at a mean of 52.887ms and a p95 of 58.549ms. After switching to OpenAL buffers and sources prepared in advance and reused when firing, the playback-call cost measured a mean of 0.007053ms and a p95 of 0.008167ms. The measurement covered the processing time of the call requesting sound-effect playback.
We also corrected time handling. The initial implementation accumulated real elapsed time and updated the game state zero or several times for each displayed frame. Codex changed it to update the game state once per displayed frame. Pausing or entering the background stops game time, sound effects and held-fire input. The player resumes manually after returning. The game pauses in the same way after 120 seconds without input during combat. We also restored the missing sound effects when switching weapons.
HEAVYMACHSECTION 05
Wider screens and coordinates
We made the game show more of the world according to the screen's aspect ratio. Firing at a touched point in the newly visible areas on either side requires distinguishing physical pixels, UI, camera and world coordinates. Button artwork and hit areas use the same layout calculation. Sensor and touch coordinates are transformed for both landscape orientations, and the reversed direction of tilt movement was corrected.
The aircraft boss in mission 3-5 also approached too early because of the wider screen. Codex initially mistook the enemy I described for a helicopter. After I clarified that it was an aircraft, the investigation found that the wider screen caused the enemy-visibility and combat-activation conditions to be met too early. Codex handled the battle-start condition separately so that a wider view would not start the boss battle earlier.
Air-support attacks were landing behind the tank because of fake coordinates passed on touch release. Codex separated input release from aiming coordinates and retained the last valid attack position. It fixed JPG/PNG suffix matching in the path that failed to show result illustrations. After fixing image lookup, we separately corrected the battlefield appearing beyond the illustration on wider screens.
For the title, mode and mission menus, we retained the existing central artwork and added backgrounds on both sides. We corrected discontinuities in lighting and structure and removed black lines caused by texture padding bleeding into the image. We changed menu transitions so that four panels close like doors and cover the whole screen. We kept the central emblem at its original size and extended only the outer areas. Integer display coordinates prevent gaps when the panels close.
HEAVYMACHSECTION 06
Auto-aim controls and ballistics
I planned auto-aim with target selection and tracking in Armored Core and Ace Combat as references. The barrel follows an enemy while the tank moves and jumps, but movement, jumping, weapon selection and firing remain with the player. Pressing the HUD's A button selects a nearby enemy ahead. Arrow buttons switch targets, and the crosshair button fires. Pressing A again returns to the original touch aiming and firing.
The selected enemy remains targeted even when it leaves the screen. If it is destroyed, removed or moves behind the tank, another enemy ahead is selected. Corner markings and LOCKED, TRACK and BLOCKED states identify the target, while an edge indicator points toward off-screen targets. With no target, the barrel returns to its default angle.
Codex calculated reachable trajectories using weapon speed, gravity and lifetime, along with the enemy's most recent movement. It updates gravity and position in the same order as a real projectile and recalculates the muzzle position for each barrel angle. If terrain blocks a low trajectory, it checks a high trajectory. Air-support weapons account for their launch point overhead.
At first, I asked for aiming that calculated the weapon's arc and enemy movement and guaranteed a hit. The C correction Codex added changed projectile speed, spread and flight paths as well. After checking its effects, I told it to remove that correction. The current feature selects targets and adjusts the barrel; projectile speed, spread, gravity and damage use the existing weapon values. A shot can miss if the enemy moves after it is fired or the projectile spreads.
With auto-aim disabled, Codex compared manual-firing records from before and after the feature was added. With 20 weapons, three random seeds and 420 frames for each combination, the records for 25,200 frames matched byte for byte. Clearer guidance for off-screen targets, targets below terrain and no-target states remains future work.
FIG. 09
FIG. 09
Green corners and the LOCKED label mark the target.
FIG. 10
FIG. 10
The tank jumps while fighting a locked airborne target.
FIG. 11
FIG. 11
Firing at an airborne auto-aim target. Original speed, 5 seconds.
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
Six types of aircraft
The new airborne enemies are the Yak-141, Harrier GR3 and F-35B vertical-takeoff-and-landing aircraft, and the F-22, Su-57 and MiG-31 fighters. I specified the models, appearance, weapons and spawn conditions and asked that they be inserted between existing placements without replacing original enemies. Codex made the artwork and code.
The VTOL aircraft reuse the existing helicopters' movement and weapons. The Yak-141 fires a single missile, the Harrier GR3 two cannon rounds, and the F-35B two missiles. The aircraft tilt with movement, and their muzzles, nozzles and hit areas follow their pose. We added 113 aircraft across 14 sub-missions while preserving the names, coordinates, order and boss flags of all 1,182 original enemy-placement entries. New units use a separate random state so that they do not change the order of the original enemies' random-number calls.
The three fighters use Lux Lunae liveries. I wanted the black paint, gold lines, gold cockpit glass and tail emblems to make the visual homage recognizable. The plan was to add powerful reinforcements to boss battles and the final stretches of preceding missions, increasing the difficulty and tension of encounters that previously combined one boss with ordinary enemies. We tried to minimize changes to the original game by reusing existing code and resources.
HeavyMach influenced my choice to become a developer. When I heard that Ace Combat 8 was going to be released, I thought I had to stay alive at least until its release. Adding Lux Lunae brought what both games meant in my life together in HeavyMach. I planned the livery together with the weapons and spawn conditions because I wanted to bring over both the appearance I remembered and the threat and tension I felt when fighting Lux Lunae.
Durability is 765: the maximum 450 in the existing regular Heli definitions multiplied by 1.7. The F-22 and Su-57 each fire the existing single missile in three-shot bursts. The MiG-31 fires three pairs, for six missiles in total. Missile speed rose by 25%, from 160 to 200. Following a later instruction, the increase in firing rate was reduced from 25% to 10%, while the existing weapon's damage, gravity, spread and lifetime remained unchanged.
We added 72 fighters across seven boss battles and the missions immediately preceding them. In the preceding missions, four appear in the final world segment; in boss battles, they appear when combat with the boss actually begins. I found that aircraft suddenly appeared inside the screen in the regular app and asked Codex to fix it. Codex changed them to enter with the entire aircraft starting outside the right edge. They do not fire while entering, and entry stops when the game is paused. The original boss-clear conditions remain unchanged.
Codex chose the fast entry speed itself. I had not directed it, but kept it because it reminded me of Lux Lunae's high-speed hit-and-run attacks and turning fights in Ace Combat 8. I think the current movement and weapon-use sequence stay within the original game's feel. The spacing of the formation during entry was revised in v0.16.
Codex applied the same relative arrangement to spawn positions and entry destinations, using horizontal spacing of 140 and vertical spacing of 70. Counts, weapons, speed and post-entry AI stayed the same. Clearance between aircraft was checked from spawning through completion of entry in 140 conditions: 14 reinforcement areas, five screen sizes and two player heights. Once combat begins, the original AI moves toward the player, so aircraft can bunch up again. In a separate comparison of 56 conditions with a stationary player, overlapping aircraft pairs 20 seconds after entry increased from 372 before the change to 533 afterward. The formation-entry record covers entry and subsequent combat separately.
I asked Codex to redraw the new aircraft several times. I required the real aircraft's shape to be retained while following the original game's colors and texture. The first drafts reinterpreted the designs with things I had not requested, such as short noses and exaggerated armor. Codex remade them using real photographs and drawings as shape references, and existing game artwork as references for color and texture. I then checked the outlines, on-screen scale and rear flames in the actual game and directed further corrections. The Mags interview continues with the reasons for those choices and my assessment of that process.
This work was also meant to test how accurately Codex could read and reuse existing code and assets, and implement specified appearances and behavior from text directions. As I bring my experiences with both games into HeavyMach's combat, I keep playing and deciding what to change. Bunching during combat after entry remains, and leaving the screen to return for another attack is still an idea.
FIG. 15
FIG. 15
The tank fires a beam at the black aircraft.
FIG. 16
Combat against the added aircraft · 13 seconds.
HEAVYMACHSECTION 08
Shilka and Tunguska ground units
Shilka and Tunguska have appeared as ground enemies since v0.13. A total of 152 vehicles were added across 35 stages without replacing existing enemies. Shilka fires bursts of six white rounds; Tunguska fires four white rounds and two missiles. Each weapon has its own firing point and firing state.
As with the aircraft, I asked for new artwork while retaining the original ground units' movement and combat behavior. Codex made separate hull, turret, barrel, missile-launcher and radar parts and connected them through the existing parts system. Bullets, smoke, explosions, sound effects, damage and destruction also use the existing paths. Keeping the hull and weapons as separate parts preserves movement on slopes and barrel recoil.
The radar consists of a base fixed to the turret and a rotating upper section. The upper section uses 24 directional images and turns independently of the barrel. The new parts follow the original colors and textures. Hull movement, weapons and mission placements remained unchanged during the artwork revisions.
Shilka's assembled turret initially looked too flat, so it was revised. Photographs of the real vehicle guided thicker side armor and a fuller rear section, and two long antennas were removed. Its displayed turret height was then increased from 16 to 29, matching Tunguska, with the barrel and radar attachment points moved accordingly. The final artwork and revisions are in the ground-unit development record.
The two images below show the final parts during assembly and firing tests in the iPhone and iPad cheat apps. The same units are included in the regular apps. Ammunition, damage and campaign difficulty with the additional enemies still need a full campaign review.
FIG. 17
FIG. 17
Shilka fires white rounds on a slope with its final turret height. iPhone cheat app.
FIG. 18
FIG. 18
Tunguska fires a missile on a slope; its radar rotates independently of the barrel. iPad cheat app.
HEAVYMACHSECTION 09
Code shared across three Apple platforms
The game rules use C++20, while Objective-C++ connects windows, input, graphics and sound on Apple devices. HeavyMach.xcworkspace manages dependencies between the shared modules and the iOS/iPadOS and Mac projects. Movement, ballistics, damage, progression and enemy placements come from the same core instead of being copied into each app. The aim is for a change to one weapon value to apply across all three platforms.
The shared code is compiled with each platform's SDK and linked as a static framework. Images, audio, maps and new artwork are included in the apps through HeavyMachAssets.bundle. iPhone and iPad use the same iOS target. Mac is an AppKit app supporting windowed and full-screen modes; it does not use Catalyst. Platform-specific code handles differences in windows, app lifecycle, input and graphics contexts.
iPhone supports both landscape orientations and touch, tilt and keyboard input. iPad can use touch, tilt and a keyboard together on a canvas fitted to its aspect ratio. Mac is controlled with a keyboard. Movement, jumping, barrel adjustment, firing, weapon selection and menus are mapped to keys, with Shift allowing finer tilt and barrel-angle adjustments.
The cheat-enabled validation app can specify a mission and all weapons, parts and upgrades so that the same battle can be repeated. It has a different app ID and save storage from the regular app, and its cheat core and runtime are built separately. We use it to check not only core calculations but also selecting weapons and pressing and releasing controls on the actual screen.
HEAVYMACHSECTION 10
Results checked and tests still remaining
For v0.16, released on October 29, 2026, Codex checked formation entry and combat and wirelessly updated the regular and cheat apps on iPhone and iPad. The apps ran with existing saves and HUD layouts preserved. I did not notice problems when playing on both devices myself.
Measurements that day showed a p95 frame-callback interval of 21.39ms during formation entry on iPad Air M2, above the 20ms threshold. The cause still needs a comparison with the pre-change version under the same conditions. The iPhone entry and combat segments and the iPad combat segment passed the callback-interval threshold.
When I played the regular apps installed on an iPhone Air and a 13-inch iPad Air M2, I saw no frame drops or malfunctions. In the automated tests Codex ran on physical devices on October 27, 2026, 84 of 85 checks passed on each device, while one display-time comparison failed. The tested operating systems were iOS/iPadOS 27.0.1. Automated keyboard input used OS key input through Device Hub; tests with actual Bluetooth or USB keyboards connected remain to be done.
On a Mac mini M4 Pro running macOS 27.0.1, 33 checks passed, covering movement, jumping, aiming, firing, 20 weapons, menus, graphics, audio and full screen. The regular and cheat apps signed with a development certificate had zero leaks. Previously detected system-connection leaks in ad-hoc-signed apps were resolved by comparing signing and app-registration states. Across six scenes at 1200×800 and 1920×1080, measuring 180 frames after a 30-frame warm-up produced processing-time p95 values of 10.86–14.29ms.
A later measurement after HUD editing was added used local ad-hoc signing. Three of six conditions exceeded the 16.67ms processing-time threshold; five had exceeded it before the change. Remeasuring under the earlier development-certificate conditions and investigating window-display delays remain to be done.
On October 28, 2026, Codex cloned the public main branch afresh and built and ran it with access to the existing working folder and original package blocked. It compared the hashes of 1,482 resources, and 21 core checks and 10 iOS checks passed. It also ran the regular and cheat apps in an iPhone simulator. This checked whether someone else could build the game using only the files in the repository.
The cause of the failed iPhone/iPad display-time test needs further investigation. Planned checks also cover heat, power and memory changes during prolonged movement, jumping and combat; physical keyboard connection and reconnection; and ammunition, damage and difficulty across the entire campaign with the added aircraft. There is also a report that game sound disappears after using the alarm app and returning to the game; its cause has not yet been investigated. Figures for each condition are in the validation record.
HEAVYMACHSECTION 11
Downloading and building
The current builds target Apple Silicon and arm64. Project minimum-OS settings are iOS/iPadOS 15.0 for iPhone and iPad, and macOS 12.0 for Mac. The actual test environments were the OS 27.0.1 devices described above. Building uses an Apple Silicon Mac, Xcode, CMake 3.20 or later, Python 3 and Git LFS. Source code, images, audio, maps and build projects are in the GitHub repository.
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
After downloading large resources with Git LFS, run the resource validator and open the workspace. Set your own development team and signing configuration in Xcode, then choose a run destination. HeavyMachRestored is the regular iPhone/iPad app and HeavyMachValidation is the cheat app. On Mac, the regular app is HeavyMachMac and the cheat app is HeavyMachMacValidation. You can also build from the source-and-resource archive in v0.16 Releases. Simulator execution, device installation and signing troubleshooting are covered in the installation document.
Version management proceeds by merging task branches into develop, and only develop into main. Release tags are placed on main's merge commits. To rebuild a particular release, use the source and resources from that tag together. The complete documentation links the code structure, features, correction process and change history.
GitHub Releases contains the change history from v0.9 through v0.16. The clone command above retrieves main; choose the source-and-assets archive for a particular tag to build that release. After v0.16, main also gained tools/release.py, which extracts release notes, packages assets, prepares hashes and handles GitHub draft publication. The v0.16 package and 17 failure-and-resumption checks were verified. Using the tool to upload and publish a new release remains for the next version. The release-tool guide describes its commands and outputs.
HEAVYMACHSECTION 12
Further development
As of October 29, 2026, the public release is v0.16. Alongside auto-aim and six aircraft types, it includes two ground-unit types, HUD layout editing, an app icon without lettering and revised formation-entry spacing. The icon is applied to the regular and cheat apps on iPhone, iPad and Mac.
Clearer auto-aim status feedback and tutorials 0-0 through 0-4 remain to be implemented. An Android icon PNG is ready. Building the shared C++ core with CMake and NDK and connecting windows, input, audio and graphics to Android APIs are planned work. There is no Android app or APK yet.
We have not finished investigating and correcting all build warnings. Some warnings are suspected to involve deprecated APIs. Their causes will be investigated alongside feature development. A script combining download, resource preparation, build and launch is also planned. It would let users choose Mac execution or iPhone/iPad installation and guide them through required tools, development-team selection and signing settings.
HEAVYMACHSECTION 13
Creators, licenses and gameplay material
The original creators are developer Byun Hae-jun and illustrator Park Jae-cheol. In 2011, WeMade Creative, a subsidiary of WeMade Entertainment, acquired Indiapps assets including the IP for HeavyMach and HeavyMach 2. The roles of the creators and companies distinguish original creation from the later acquisition.
New code written for this project uses the MIT license. The license scope distinguishes material derived from the original, external code and documentation. Original artwork, audio and game data, and additional artwork, are covered by the asset-use terms. OpenAL Soft, stb and other dependencies follow the third-party notices.
I do not intend to make money from this restoration. I have published the code and assets so that others can build and play it themselves. I intend to keep documenting what I restore and correct. If an original creator or another stakeholder asks for it to be taken down, I intend to delete the repository. If I later create an App Store account for sass.studio and obtain permission to distribute it from the original creators and stakeholders, it will still be offered free of charge.
The gameplay material was extracted from videos I recorded. Eight PNGs, two GIFs played at their original speed and three MP4s with sound show the original jumping, weapons, upgrades and mission results, as well as the new aircraft and auto-aim. The original timestamps and file list for each scene are also public.
Nine Years and Three Months
I have no intention of making money from this restoration. I want to release the code and assets together so that others can build and play it themselves. I also intend to leave a record of how I restored this game and what I fixed.
If an interested party contacts me, I will take this project down. The nine years and three months that the HeavyMach team gave me exceed the lifespan originally allotted to me by the creator who made me.