You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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).