Files
libakgl/docs
Andrew Kesterson 88aaa184e4 Add two tutorial games that build, run in CI, and cannot drift
examples/sidescroller and examples/jrpg are complete programs, built with the
library and exercised headless by ctest. The chapters quote them with
`c excerpt=examples/...` blocks rather than restating the code, so a chapter
cannot drift from a program that compiles -- the excerpt check fails the moment
the source moves. 34 excerpts in one chapter, 21 in the other.

The two are complementary. The sidescroller is the physics tutorial: gravity, a
jump, coins, hazards. The JRPG is the content-pipeline tutorial: a town map,
NPCs spawned from map objects, four-way per-facing animation, a text box, a
follower.

Both smoke tests drive real SDL_Events through akgl_controller_handle_event and
step the physics clock at a fixed 1/60s rather than sleeping, so a scripted run
is deterministic and finishes in under five seconds.

Writing them is what turned up most of the defects recorded in the next commit,
because a game exercises paths a unit test does not. Each workaround says in the
chapter which library gap forced it:

- collision is written in a custom movementlogicfunc, because
  akgl_physics_arcade_collide raises AKERR_API and akgl_physics_simulate never
  calls collide at all;
- the sidescroller cancels the step's own gravity when it blocks downward,
  because otherwise a quarter-pixel of penetration makes the *horizontal* sweep
  report blocked and the character walks backwards a tile at a time;
- both clear movement_controls_face on every map-spawned actor, because the
  default facefunc leaves a stopped actor with no facing bit, no sprite, and no
  draw;
- the JRPG's follower gets a renderfunc that nulls obj->parent for the duration
  of the draw, because a child's offset is counted twice.

Assets are CC0 from three Kenney packs, vendored with per-pack licence text,
per-file provenance, and the geometry contract in
docs/tutorials/assets/README.md. CC0 specifically rather than merely free: a
reader who copies a tutorial into their own game inherits no obligation.
scripts/fetch_tutorial_assets.sh refreshes them in the shape
mkcontrollermappings.sh was fixed into for 0.5.0 -- it checks curl's status,
refuses a pack page that does not say CC0, verifies the archive and the staged
dimensions, and leaves the tracked bytes untouched on any failure. Both failure
paths were tested, and a no-op refresh is byte-identical.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 20:59:00 -04:00
..

The libakgl manual

libakgl is a C library for building 2D games on SDL3. It is not an engine: there is no editor, no scripting layer, no inheritance and no runtime malloc. Behaviour attaches to a struct as function pointers, objects come from fixed pools, and every call reports failure through an error context you cannot silently ignore.

This manual teaches the library. It deliberately does not re-document its dependencies — libakerror owns the error-handling protocol, SDL3 owns renderers and events, Tiled owns the map format, jansson owns the JSON API. Each chapter says what libakgl adds or constrains, shows what a caller actually writes, and links out for the rest. For per-function reference, build the Doxygen output with doxygen Doxyfile.

1. Introduction What libakgl is, what it refuses to be, the frame budget, and who owns which documentation
2. Design philosophy Bounded pools, pluggable backends, bit flags, name-based registries, one world at a time
3. Getting started Dependencies, add_subdirectory vs akgl.pc, and the smallest program that opens a window
4. Errors and status codes The status tables, what each code means here, and the traps that fail silently
5. The heap The five pools, akgl_heap_next_*, akgl_String, and why exhaustion usually means a missing release
6. The registry The eight registries, configuration properties, and the id-0 silent no-op
7. The game and the frame Startup order, akgl_game_update, the state lock, iterators, savegames
8. Rendering The backend vtable, the frame contract, cameras, and embedding a host's own SDL_Renderer
9. Drawing Points, lines, rectangles, circles, flood fill, and saving a region
10. Spritesheets and sprites One texture shared by path, the sprite JSON format, frame animation
11. Characters State-to-sprite mappings, movement constants, the character JSON format
12. Actors The state bitmask, the six behaviour hooks, parents and children, layers
13. Tilemaps Tiled TMJ, libakgl's three extensions, and the limits that bind a map
14. Physics Thrust, environment and velocity; the null and arcade backends; what is not implemented
15. Input Control maps, push-not-poll dispatch, the keystroke ring, gamepads
16. Text and fonts Loading, drawing, measuring, and the teardown order that matters
17. Audio The three-voice synthesizer, and the separate background-music path
18. Utilities Collision helpers, path resolution, the JSON accessors, static strings
19. Tutorial: a 2D sidescroller Gravity, a jump, collision you write yourself, coins and hazards
20. Tutorial: a top-down JRPG A town map, NPCs spawned from map objects, four-way animation, a text box, a follower
21. Appendix Every limit, every status, every configuration property

Both tutorials are complete programs under examples/. They build with the library and run headless in CI, and the chapters quote them rather than restating them — so a tutorial cannot drift from a program that compiles.

Every example here is checked

The examples in these chapters are compiled, linked, run, and cross-checked against the source tree by the test suite. A snippet that stops compiling, an excerpt that no longer matches the header it quotes, or a JSON document the loader would reject turns ctest -R docs_examples red.

This exists because the documentation it replaces had drifted badly: the previous FAQ's examples did not compile — two unbalanced PASS() calls, a sprite->frameids = [0, 1, 2, 3]; that is not C in any dialect, and, in the first snippet a reader ever saw, the exact strncpy call AGENTS.md forbids. The prose had drifted with it, and writing these chapters turned up twenty-seven header claims that were false against src/.

Where a chapter documents behaviour that is a known defect rather than a design decision, it says so and points at TODO.md. See MAINTENANCE.md if you are editing an example.

Assets

The tutorial art, tiles and music are CC0, vendored under tutorials/assets/ with provenance recorded per file in PROVENANCE.md and geometry documented in README.md. CC0 specifically, not merely free: a reader who copies a tutorial into their own game inherits no obligation.