Game
In developmentCrosswind Puzzle
Six puzzles on one engine, where adding a seventh touches nothing else.
Overview
A 2D puzzle collection for iPhone and iPad: the 15-puzzle, letter sudoku, minesweeper, 2048, Merge III and Crosswind Drop, each a separate module behind one interface. Written in C++20 against SDL3 rather than a game engine, developed on Linux and macOS and shipped to iOS through TestFlight.
What it does
- Six puzzles, one framework
- Each puzzle implements a single `IPuzzle` interface — init, event, update, render, solved. Adding another means one new library and one line of registration, touching neither the engine nor any screen.
- A falling-block puzzle with weather
- Crosswind Drop's own mechanic is the gust: a banner warns about a second ahead, then a crosswind nudges the falling piece one column sideways. Original mixed-size pieces of three, four and five cells rather than the familiar seven.
- Merge III moves one cell at a time
- Where 2048 slides tiles the whole way, a Merge III swipe shifts each tile exactly one cell, so a chain of equal tiles needs one swipe per merge. A 1 and a 2 make 3; equal tiles double.
- Generated boards, not bundled ones
- Letter sudoku generates a fresh, uniquely solvable board per game by randomised-backtracking fill and uniqueness-preserving digging, so there is no puzzle bank to exhaust.
- Picks up where you left it
- Leaving a puzzle mid-solve saves it, keyed per puzzle type, and the picker marks it "(resume)" next time. A solved board clears instead of saving, so starting again starts fresh.
- Best times and best scores
- Completion times are tracked lowest-first, while an open-ended score like 2048's is tracked highest-first and recorded separately — reaching the 2048 tile is rare enough that time alone would say nothing.
- Animation the board does not know about
- 2048's state updates immediately, but tiles slide and merge over about 0.12s: the move logic records where each tile came from and the renderer interpolates, so saving and solving stay unaffected by what is on screen.
- iOS gestures handled centrally
- A left-edge swipe-right goes back, deliberately restricted to starting near the edge so it cannot collide with 2048's own rightward swipes. Screens crossfade without either screen knowing transitions exist.
Built with
- C++20
- SDL3
- SDL3_ttf
- CMake
- iOS
- Linux
- macOS
Worth knowing
No engine, and few dependencies
SDL3 and SDL3_ttf are pinned and built from source by CMake, so no system install is needed, and the font is embedded as data rather than packaged as a resource. HarfBuzz and colour emoji are switched off because nothing here needs them.
Primitives SDL3 does not provide
A filled rounded rectangle and a cached glyph atlas were written for this project — glyph textures are cached per text and size and tinted at draw time, so the same string in a new colour is not re-rasterised.
In TestFlight, not yet on the App Store
The iOS signing, archiving and export pipeline is scripted in `scripts/ios/`, producing a signed `.ipa` for App Store Connect. Uploading needs an account-specific API key and is deliberately left unscripted.
Interested in Crosswind Puzzle?
Ask about availability, licensing, or having something similar built for your own domain.
Get in touchMore work
Fuel Planner
Aviation app
Cross-country fuel planning that answers the question EFBs can't.
Genus
Game
Puzzles you solve by reasoning, not by memorising — where the surface itself is the problem.