Skip to content
chrissotraidisPublic

About

Super Mario Strikers native for iOS and iPadOS.

Topics

Resources

Stars

25 stars

Watchers

1 watching

Forks

Repository files navigation

BallPad

BallPad geometric black-and-white soccer icon

Configured iOS and iPadOS target 17+ Native ARM64 game code Metal renderer Experimental preview Game data not included Join the BallPad Discord Build BallPad with PadMint Join the BallPad Discord

BallPad is an iOS/iPadOS port of new-coke/strikers. Play Super Mario Strikers on iPhone and iPad through the community native source port. BallPad is an experimental Apple app with Metal rendering, GameCube touch controls, physical controller support, and local game-data import.

Built on new-coke/strikers, the native desktop port based on the community decompilation by Yannick Suter and contributors. Aurora provides the platform and graphics layer, and SunPad provides the touch interface BallPad adapts. See full attribution and third-party notices.

BallPad is the Apple app repository. Its engine changes live in the maintained Strikers fork, built from new-coke/strikers v1.3.0 with the upstream history preserved. Builds select an exact fork commit; they do not apply a patch series. The dependency manifest records the source relationships and exact versions. BallPad's work is the Apple integration, touch adaptation, importer, mobile fixes, and build/test tooling.

You supply your own supported disc image. BallPad does not download or include game images, extracted assets, or saves.

Note

AI disclosure: BallPad uses substantial AI assistance for code, tests, documentation, debugging and maintenance. Some support replies and maintenance tasks are automated. There is no audited percentage of AI-generated code. Build, test and device records describe what was checked. This disclosure concerns BallPad's workflow, not the authorship of its upstream projects.

Experimental preview

Releases publish no app: BallPad is compiled from its decompilation, so you make your own. On an Apple Silicon Mac with Xcode, CMake, Ninja and ripgrep (brew install cmake ninja ripgrep), download PadMint, unzip it, double-click PadMint.command and choose BallPad. PadMint builds the app from this repository's latest release and saves an unsigned IPA in your Downloads folder. Install it with AltStore Classic, SideStore or Sideloadly (signing with your own Apple account), then import your own supported game image in the app (see First launch and game data).

Current status

Version 1.0, build 7 updates the maintained engine to upstream Strikers v1.3.0. It includes upstream fixes for an AI pass crash, goal replay hangs, and input lag with VSync. BallPad retains its own iOS controller bridge, game-data importer, and host pause hooks. Upstream's desktop settings app, Switch support, and texture-pack controls are not BallPad features. See the v1.3.0 integration notes.

Version 1.0, build 6 moves the engine pin forward ten upstream commits — including a crash and texture-cache rework and a goal-replay crash fix — and adds a pause the host can ask for. Opening the menu now stops the game rather than slowing it: two new weak hooks in the port (PortHostUIWantsPause, PortHostUIIdle) hold the game still, keep the audio transport fed so music carries on, and hand the frame to the interface. The same hooks pace the loop when there is no surface to draw into, which build 4 could only contain from outside. The Experimental frame row is renamed Lift the Port's Frame Cap: it was called "Uncapped Frame Rate" and measured at 170 fps uncapped against 59.9 capped, which on this engine is the game running fast rather than drawing more — vsync is what holds a phone at sixty, not the limiter. See the engine notes.

Version 1.0, build 4 makes the interface usable while the game is running. The port's frame loop owns the main thread and SDL's pump hands UIKit two microseconds a frame, so the three-dot menu was starved; and when the render surface was unavailable the loop skipped the frame limiter and spun a core flat out, which is why the app stayed unstable until it was backgrounded and brought back. The app now shares each frame with UIKit, paces a loop nothing else is pacing, and does far less per-frame diagnostic work. The three-dot button can also be hidden — Controls ▸ Hide Menu Button, with a two-finger tap anywhere to bring it back. See the main-thread notes.

Version 1.0, build 3 repairs physical controller input. One controller was reaching the game twice — once through BallPad's own GameController bridge and once through SDL's MFi driver, which Aurora reads on its own account — so the engine saw two GameCube pads pressing every button. A frame carrying both A and B is resolved as B by the front-end screens that test B first, which is why the main menu worked and every submenu behaved as if B had been pressed. The app's bridge is now the only reader. Build 3 also stops a quick tap being dropped between queue hops, stops a button held across a background from sticking down, and keeps the pad polled while the overlay is being rebuilt. See the controller notes.

Build 2 refreshed the app icon, About & Credits, keyboard-aware problem reporting and the FPS badge, added movie/scene diagnostics for rendering reports, and kept imported game-data paths working when iOS relocates the app during an in-place update.

Build 7 was installed in place and launched with game data on an iPad Pro; the imported ISO, memory-card save, and preferences matched their pre-install hashes. The owner subsequently reported that the game plays well on that iPad. Its controller repair and live-match path passed focused Simulator checks; dedicated physical controller and extended gameplay checks remain to be done. Build 2 was played on iPad Pro and iPhone 14. Simulator checks cover the front end, a live match with scoring and replay, memory-card screens, and focused controls/settings flows. Sustained performance, multitouch behavior, and full-game validation remain work in progress.

Area Current result
Game setup Local import validates USA G4QE01, revision 0, raw ISO/GCM header and size
Rendering Native engine with Metal presentation; render resolution and aspect-ratio settings
Controls Floating movement stick, GameCube buttons, physical controller mapping, editable layouts
Saves Sandboxed Slot A memory card, with import and export
Platforms iPhone/iPad targets; configured iOS/iPadOS 17 minimum is not verified oldest-device compatibility
Status Experimental; broader device testing and full-game validation remain in progress

Known issues: intro movies and some stadium introductions have reported rendering artifacts on hardware. Local multiplayer with two physical controllers is not wired: the port's host seam carries a single pad, so a second controller is tracked and logged but has nowhere to be offered. Controller rumble through SDL is gone with the MFi driver that caused the duplicate-input defect. These remain open while testing continues.

See the controller notes, the testing notes and development record for tested behavior and known limitations. Simulator results do not establish physical-device performance.

Frequently asked questions

Is this native recompilation or emulation?

The active app builds reconstructed C/C++ game source from new-coke/strikers into native ARM64 code. Aurora supplies platform and graphics support, with Dawn's Metal backend. It does not use a runtime PowerPC JIT.

BallPad's active source-port engine differs from GalaxyPad's ahead-of-time PowerPC recompilation and Dolphin-derived runtime. The older static-recompilation experiment in app/ and host/ remains in this repository for history; it is not the engine built by scripts/native/.

Is the game included, and which version do I need?

Supply your own lawfully obtained Super Mario Strikers USA, G4QE01, revision 0 raw ISO or GCM image. Its raw size is 1,459,978,240 bytes. Other regions, revisions, and compressed images are unsupported. Game data is never downloaded or bundled by BallPad.

The executable builds reconstructed game code from the upstream source port; that is separate from the disc image and assets supplied at first launch. See rights-status limitations.

Does it run at 60 FPS?

The FPS badge is a live diagnostic reading, not a sustained-performance promise. Performance varies with the scene and device. Sustained iPad frame rates, thermals, audio quality, and battery use still need broader testing.

Will updates preserve my save?

Use an in-place update with the same application identity. Uninstalling the app can remove local game data and saves. Export your memory card from the app's menu before changing installation or signing boundaries. Imported game data is managed in the app sandbox. The active memory card is stored in app support data; use the menu’s memory-card export to keep a portable backup.

How can I report a problem?

Open the three-dot menu → Report a Problem. Describe what happened and choose Continue. BallPad saves a diagnostic log and prepares an issue for the BallPad repository. Choose Open GitHub, review the draft, and manually attach the saved log from Files → BallPad → Diagnostics before submitting. Share Log… also exports it.

The log includes build/device context, control settings, and bounded recent runtime/interface logs, movie decoder details, and scene/stadium transitions. Review it before sharing. Nothing is uploaded or submitted automatically; never attach disc images, extracted assets, saves, or signing material. A GitHub account is required to submit an issue.

Join the BallPad community on Discord for discussion and testing feedback.

Build from source

Engine changes are maintained directly in the pinned source fork. To make local changes, commit them in your engine fork and update its URL, commit, and tree in scripts/native/common.sh and the dependency manifest. The build verifies source identity before compiling.

Developer prerequisites and build commands

Use an Apple Silicon Mac with Xcode 26.x or newer and its command-line tools, CMake, Ninja, Git, Python 3.10+, and ripgrep. Keep your own supported game image in ignored local storage. The runbook and dependency manifest record the engine and dependency pins. Preview 2 was built with Xcode 27.0; its device and Simulator targets retain the iOS/iPadOS 17 deployment minimum.

From the repository root, bootstrap the pinned engine and dependencies, then build the Simulator app:

scripts/native/bootstrap.sh --platform simulator
scripts/native/build.sh --platform simulator

Install and launch on an already-booted Simulator:

xcrun simctl install booted build/native/simulator-release/port/BallpadStrikers.app
xcrun simctl launch booted com.ballpad.strikers

For a device build, run bootstrap and build with --platform device. That produces an unsigned app. A Simulator bundle cannot be installed on an iPad.

To sign that app with your own Apple account and install it on a connected iPhone or iPad:

scripts/native/build.sh --platform device
scripts/native/install-device.sh

The device must be plugged in, unlocked, paired, and have Developer Mode on (Settings > Privacy & Security > Developer Mode). Signing material is whatever this Mac already has: the Apple Development certificate in the login keychain and a provisioning profile Xcode has downloaded that covers the device. Nothing is uploaded and no Apple account is contacted. Pass --device, --identity or --profile when more than one is available, and --sign-only to stop before installing.

Installing over an existing copy is an in-place update, so the app's container — the imported disc image and the memory card — is kept. iOS keys that on the application-identifier entitlement rather than the bundle identifier, so a copy signed earlier by another tool can carry a string this script would not have chosen; the installer names it in its refusal and the script re-signs with it and retries once. If it still refuses, the copy on the device belongs to a different team: export your memory card from inside the app, delete BallPad, and run it again.

Bootstrap fetches the maintained engine fork into ignored work/native/strikers and checks out the exact manifest revision. Engine changes belong in the maintained fork; update the manifest pin after committing them there. Upstream authorship and notices remain intact. Do not commit build/, work/, ref/, or .local-assets/.

First launch and game data

  1. Launch BallPad to open Add your game.
  2. Choose Choose ISO or GCM and select your supported image, or place it in BallPad's Files folder and choose Import from BallPad Folder.
  3. Keep BallPad open while it copies and validates the image.
  4. Choose Start the Game when the data is ready.

Wrong game codes, revisions, headers, and sizes are rejected without replacing existing valid data. Use Game Data in the menu to manage the image later; memory-card import/export is separate. Do not erase the app container to fix a launch problem.

For local scripted Simulator scenarios, SIMCTL_CHILD_STRIKERS_DATA can point to a private image path. This development route does not bundle that image.

Controls and the three-dot menu

The touch overlay adapts SunPad's GameCube controls and native menu. BallPad's changes live alongside the unmodified vendored reference.

  • Movement: touch the lower-left movement area to place the stick at your thumb. It is invisible at rest and disappears on release.
  • GameCube buttons: D-pad and L on the left; C-stick, A/B/X/Y, Z, R, and Start on the right. Touch shoulders provide analog pressure and the digital click.
  • Controls: controller button mapping, touch visibility, and touch settings. Touch and physical-controller input can be used together.
  • Touch Control Settings → Move controls: drag a control, select it to change its size or visibility, then choose Done. Phone and iPad layouts are stored separately. Reset restores the current device's layout.
  • Display: FPS counter, render resolution, and aspect ratio. The experimental frame-rate limiter is separate from these display settings.
  • Game data, memory card, diagnostics, and About & Credits are available from the same menu. Credits and license texts are bundled for offline viewing.

If a layout is uncomfortable or an input behaves incorrectly, include your device, controller model, and reproduction steps in a report. Touch and controller feedback helps improve the defaults.

Validation

scripts/native/test.sh --suite unit
scripts/native/verify-notices.sh --inventory-only --final
scripts/native/verify-notices.sh --final --require-bundle
scripts/native/verify-clean.sh --scope all

Simulator checks include scripts/native/test.sh --suite acceptance --device <UDID> and scripts/native/run-uitests.sh --run-id <id> --device <UDID> --form-factor pad. Scenario and UI runs record evidence under ignored build/proofs/native-strikers/. See the acceptance specification for what each check establishes. Passing checks does not prove full-game or device readiness.

Project map

Path Purpose
mobile/ Apple app, engine bridge, touch adapter, importer, and credits
mobile/interface/sunpad/ Unmodified SunPad interface with source revision and hashes
Maintained Strikers fork Native engine with committed iOS/iPadOS adaptations
scripts/native/, tests/native/ Build, reproduction, audit, scenario, and UI tools
notices/, ATTRIBUTION.md Upstream notices and contribution boundaries
docs/ Runbook, evidence, dependency manifest, and release readiness
app/, host/ Superseded static-recompilation experiment
work/, build/, ref/, .local-assets/ Ignored local sources, builds, evidence, and private game data

Community and support

Join the Discord for help and news. It is one community for BallPad and its sibling projects, such as KartPad, BlueWake and MeleePad: ask about setup, building with PadMint, and installing, share how it runs on your device, and hear about new releases first.

Found a bug? Open an issue with your device, its OS version, and the steps that led to it.

Credits, legal and contributing

BallPad builds on new-coke/strikers, Yannick Suter and the Strikers decompilation contributors, Aurora/Dawn, SDL, FFmpeg, SunPad, and their dependencies. Preserve their authorship and notices when adapting code. The manifest, attribution, and notice inventory identify their exact roles, revisions, and license status.

BallPad's original code is GPL-3.0-only; see license scope for inherited material. SunPad's interface retains its GPL-3.0 license. Static FFmpeg linkage also requires the applicable relinking and corresponding-source material to accompany distribution. Upstream's CC0 offer covers its author's own material within their rights; it does not clear reconstructed game code or other third-party material.

This is unofficial and unaffiliated with Nintendo or Next Level Games. Their game and trademarks belong to their respective owners. BallPad grants no rights to redistribute game images or assets. See attribution and rights status for the scope of upstream licenses and reconstructed material.

Keep contributions small, preserve upstream notices, commit engine changes in the maintained fork, and record visible results and remaining failures. Never commit game images, extracted assets, generated game code, saves, signing material, or private runtime evidence.

Package an IPA

After building the device target and committing the exact app source, run:

scripts/native/package-release.sh --out build/releases/ballpad-preview-2 --source-ref HEAD

This creates an unsigned IPA, source-material archive, portable FFmpeg relink archive, and SHA256SUMS. Keep those materials together when distributing a build. The packager verifies the engine pin and exercises relinking with the recipient’s Xcode paths. It does not upload anything or include game data.

Legal

BallPad is an unofficial, fan-made project. It is not affiliated with, endorsed by, or sponsored by Nintendo. Super Mario Strikers and related names and marks are trademarks of Nintendo (and their respective owners). This repository contains no game data, disc images, or extracted assets. To use it, you need your own legally obtained copy of the game, and you build it yourself on your own machine. Please don't share game files or builds made from them.

About

Super Mario Strikers native for iOS and iPadOS.

Topics

Resources

Stars

25 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages