Skip to content

0.2.1

Choose a tag to compare

@github-actions github-actions released this 31 Aug 14:13
· 63 commits to main since this release
New helpers
- picogame_road.Road - drive the native pg.road_edges + Canvas.road pair from
  human units (curve periods and swing in px, hills via set_grade, safe int32
  phase wrap), plus the queries games kept re-deriving: curve_at() for
  centrifugal physics and row_of/half_of/edges_of for placing sprites on the
  road. Perspective is the device-proven picobike model; picobike itself now
  runs on it.
- shapes.masks(mask_list, color) - the multi-frame from_mask that was missing
  between from_mask and atlas.
- shapes.tileset_colors(..., gap=N) - a transparent mortar edge per tile, so
  touching same-colour tiles stay readable as tiles.
- Raycaster.set_cell(x, y, v) - change one world cell at runtime (doors,
  gates); keeps the caster grid, solid() and .map consistent and re-casts even
  for a standing camera.
- Shake(scene=None) - the trauma model without a scene: tick() publishes
  .ox/.oy for strip-rendered games (road, raycaster, mode-7) to spend in their
  own camera params, since set_view never moves a StripDraw.

Behaviour change
- Pool keeps its own in-use bit (`pool.alive`), so sprite.visible now means
  only "draw this": blinking a pooled sprite no longer hands its slot to the
  next spawn(). Every existing `if not s.visible: continue` guard still reads
  correctly, so no game needs changing; free() of a foreign sprite now raises
  ValueError instead of silently hiding it.

Also: picogame_scene.View.set_tile_prop (flip a tile TYPE's flags at runtime),
picogame_script (story scripts as generators), documented traps in
Raycaster.draw (its row 0 is the view's top, not the screen's) and the
billboard idiom (a Scene draws in add order, so sorting your own list
reorders nothing).