Commit Graph

24 Commits

Author SHA1 Message Date
Axel Meyer
77550149cb chore(deps): bump lib-core.maps 0.5.6 -> 0.5.7
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-01 22:44:25 +02:00
Axel Meyer
b5278bd24d chore(deps): bump lib-core.maps 0.5.5 -> 0.5.6
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-01 17:19:18 +02:00
calic
7ebd17209f chore(deps): bump lib-core.maps 0.5.4 -> 0.5.5 2026-05-29 09:56:49 +02:00
calic
c64a85e5de chore(deps): bump lib-core.maps 0.5.3 -> 0.5.4 2026-05-29 01:37:42 +02:00
calic
cff86c3e65 chore(deps): bump lib-core.maps 0.5.2 -> 0.5.3 2026-05-29 01:29:22 +02:00
calic
930591c564 chore(deps): bump lib-core.maps 0.5.1 -> 0.5.2 2026-05-28 23:53:55 +02:00
calic
1293876e9f deps: bump lib-core.maps 0.5.0 -> 0.5.1
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 23:10:24 +02:00
calic
6a48653569 vagrant: migrate map to v3 multi-layer + autotile + overrides
manifest.module
  + new dep on lib-asset.prototype-blob-geom v0.1.0 (companion lib
    for the design paper's reference asset set + Python atlas-packer)
  + asset_aliases entry for blob_testbench (mixed 3-material atlas:
    grass/stone/wood x 14 slots = 42 tiles) and blob_rect_stone
    (single-material atlas for vertex-painted autotile)
  - removed subterrain_tiles asset_alias (no longer used)
  bumped lib-core.maps dep 0.4.0 -> 0.5.0

vagrant_test.map.json rewritten as native schema-v3 with three non-
empty terrain layers, exercising all renderer paths in a single map:
  - surface (tiles[] path, multi-material via blob_testbench):
      grass-solid floor across all 400 cells
      14-wide x 3-tall showcase strip on rows 10-12 columns 2-15
      displays every slot of every material the atlas ships (slot 0
      through 13 x grass/stone/wood, ids 1..42 visible at a glance)
  - topsurface (tiles[] path): 2x4 wood overlay decoration on rows
      3-4 columns 2-5
  - wall (vertex-painted autotile with blob_rect_stone material):
      21x21 vertex grid; 80 vertices painted in a border-ring pattern
      so the renderer's bitmask + 47->14 slot lookup produces the
      visually-correct stone wall around the 18x18 interior; plus
      3 interior pillars (cells 9:7, 7:15, 13:15) authored as
      overrides with slot 0 (isolated), demonstrating that the
      override sublayer can place truly-1-cell-isolated material
      which the any-corner vertex rule alone cannot express

assets/tiles/vagrant_test.tilemap.json removed; under schema v3 the
engine resolves the palette directly from the atlas's tiles.atlas.json,
the standalone tilemap.json was unused (atlas-bootstrap stub path
took over since M.2).

Closure verifies SPOREL_CI=1 ./Sporel.exe --module=vagrant-skeleton
rc=0 with 60 render_frame_ok, both atlases load (no magenta-
placeholders), walkability rule (surface present + wall absent)
correctly treats border + pillars as non-walkable.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 20:49:26 +02:00
Axel Meyer
7cdb95f5d6 Bump lib-core.maps dep to 0.4.0
Picks up the new write APIs (set_cell_gid, set_roof, save_to_disk).
No source changes — lib is purely additive.
2026-05-24 00:53:46 +02:00
Axel Meyer
b5b8318aa3 Migrate vagrant-skeleton to atlas-uv consumers
Asset-aliases now reference the three baked subterrain atlas-sets
(subterrain_player, subterrain_tiles, subterrain_world) rather than
the legacy indexed pack labels. The rig asset_pack updates to
subterrain_player and each bone gains a calibrated anchor offset.
Furniture-draw loads the subterrain_world atlas once and renders
via source-rect draw_sprite_transform. The map tilemap field updates
to subterrain_tiles to match the new atlas-id. Dep-bumps for
lib-core.maps 0.3.0, lib-core.puppet 0.5.0, and
lib-asset.prototype-subterrain 0.2.0. Replace r_lib.draw_map with
draw_map_pre/post_entities.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-21 23:28:24 +02:00
Axel Meyer
7c4b147608 Bump dep on lib-core.maps to 0.2.0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 16:14:27 +02:00
Axel Meyer
c4f2c9cda9 feat(vagrant): sprint (shift+wasd) + backpack interaction
Sprint: holding shift while WASD doubles player_speed (120 → 240) and
walk-anim play-speed (0.45 → 0.9). Mid-walk sprint toggle uses puppet
v0.4.4 set_play_speed → no cycle restart. Releasing shift or stopping
WASD reverts to normal speed in next frame.

Interaction: 'interact' bound to E. Proximity trigger registered on
the backpack sprite at (350, 400) with range 40px. Pressing E within
range fires callback that prints a log message with the actor distance.
Uses existing lib-core.interaction (registered at init, polled by
interaction.update(player.x, player.y) each frame).

New dep: lib-core.interaction ^0.1.0. Module version 0.4.0 → 0.4.4
(syncs with puppet bump).
2026-05-18 23:46:23 +02:00
Axel Meyer
b66c4ca4dd fix(vagrant): substrate leg.scl cycle restored; feet inherit_scale=false
User feedback after iteration-4: legs SHOULD cycle through +1/0/-1
(substrate-style — leg renders forward, under body, then behind body).
But feet must NOT Y-flip when leg.scl_y goes negative, and must NOT
collapse when leg.scl_y=0. They should follow leg-end position only.

Three changes:
1. walk_fwd_lower keyframes restored to substrate-style (leg.scl_y
   sign-flip on both halves: leg_l +1↔-1, leg_r -1↔+1). foot.pos
   animations REMOVED — cascade through leg.world.scl now correctly
   moves foot to leg-end position automatically (foot.local.pos
   stays at rest 25 in y).
2. foot.rest.scl: [1, -1] → [1, 1] (no Y-flip in rest, natural
   sprite orientation). inherit_scale=false → foot.world.scl stays
   at foot.local.scl=[1,1] regardless of leg.scl_y. Foot sprite
   never flips, never collapses.
3. Procedural extended: writes foot.local.rot = -leg.local.rot so
   foot.world.rot = body.world.rot (feet stay body-oriented even
   when legs rotate to walk-direction).

Speed slowed further from 0.5 → 0.4 (user: still too fast at 0.5).
2026-05-18 22:31:42 +02:00
Axel Meyer
77f3e726ae fix(vagrant): hip-anchors body-relative; leg-orientation procedural
User feedback: 'anchorpoints sind hüftgelenke und können sich nicht
frei drehen. hüfte bleibt zum körper statisch'.

Architecture:
- legs.parent = body (was lower_control). Hip position cascades from
  body.world.rot, so hips stay at body-frame left/right regardless of
  body rotation. lower_control virtual bone removed (no longer needed).
- Procedural 'leg_orientation' sets leg.local.rot = walk_dir - body.rot
  each frame, so leg.world.rot = walk_dir (independent of body cascade).
  Requires puppet v0.4.2 per-channel write_bone (walk_anim writes leg.scl
  while procedural writes leg.rot — disjoint channels).

Result: legs visually attach at body's anatomical left/right hips no
matter where body faces; stride oscillation aligns with WASD walk
direction. Hip position no longer drifts with walk direction.
2026-05-18 21:57:20 +02:00
Axel Meyer
0a7ef7f270 fix(vagrant): legs rotate to walk direction (user preference)
User feedback: 'Beine sollten in die richtung oszillieren, in die
gegangen wird, nicht nach norden/süden relativ zum fenster.'

Old: lower_control.rot = wedge_deg (substrate's body-relative ±30°
sub-angle), legs always oscillated near world-up axis.

New: lower_control.rot = atan(move_x, -move_y) = walk direction in
sprite-top-up convention. Legs visually rotate to align with WASD
direction → stride animation cycles along the walk axis.

Side-effect: 4-direction-anim picker collapsed to single
walk_fwd_lower (the rotation handles directional differentiation;
4 anims kept on disk for later gait-style work). Bumps puppet dep
to 0.4.1 (head south-flick fix).
2026-05-18 21:48:10 +02:00
Axel Meyer
e6e4e3805b fix(vagrant): bump version 0.3.0→0.4.0 + puppet dep 0.3.3→0.4.0
Iteration-3 implemented Subterrain control model but forgot to bump
the consumer manifest. Engine lib-resolver does exact strcmp so
'0.3.3' fails against published 0.4.0 → ENGINE_ERR_LIB_DEP_MISSING
FATAL at module load.

Recurring pattern (cf. feedback_sporel_dep_versions memory) — every
lib-bump must update all consumer manifests in the same commit-set.
2026-05-18 21:24:11 +02:00
Axel Meyer
926cb9da29 fix(vagrant): head sprite_rot=-90 corrects 90° CW visual offset
head_001.png is drawn with face pointing +X (right) at rot=0, but the
look-at math assumes sprite-top (-Y) is forward. Without compensation,
head visually appears 90° clockwise off when math says 'point at mouse'.

sprite_rot=-90 on head bone aligns sprite-top with bone-forward at
render time. Body, shoulder, and arm sprites already match the
sprite-top=forward convention so no sprite_rot needed there.

Also bumps puppet dep to 0.3.3 and removes the temporary debug print.
2026-05-18 20:42:13 +02:00
Axel Meyer
c3f2730119 fix(vagrant): bump puppet dep 0.3.1 -> 0.3.2 to match staged lib
Iteration 2 bumped lib-core.puppet to v0.3.2 (persistent look_at_state
fix) but the vagrant-skeleton manifest dep was not updated. Engine
lib-resolver does exact strcmp → module fails to load with
ENGINE_ERR_LIB_DEP_MISSING at launcher select.
2026-05-18 20:18:48 +02:00
Axel Meyer
03a536984d fix(vagrant): iteration — body+head look-at, WASD-driven leg-facing, idle-collapse
- humanoid.rig.json: root removed from upper track; body look_at + slow speed
  (180 deg/s, lazy); head fast speed (480 deg/s) + +-90 deg limits; puppet
  dep bumped to 0.3.1
- animations/idle_lower.anim.json (NEW): leg+foot scl=[mirror, 0] keeps legs
  invisible at idle (locomotion skips animated bones; foot cascade zeros out)
- init.lua: set_procedural 'facing' callback writes root.rot from
  last_walk_rot_deg each frame; WASD-vector updates last_walk_rot_deg
  via atan(dx, -dy); idle_lower played parallel to idle, stopped during walk

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 19:51:56 +02:00
Axel Meyer
00d10bbd47 fix(vagrant): manifest dep versions match resolver expectations
Engine lib-resolver does exact strcmp (not semver-range), so '^0.3.0'
fails to match published 0.3.0. Also pin lib-asset.prototype-subterrain
to 0.1.1 (the published patch version).

Surfaced during Phase-4 install-reference verify after vagrant-skeleton
v0.3.0 cutover.
2026-05-18 18:57:11 +02:00
Axel Meyer
fa511204c2 feat(vagrant): v0.3.0 — substrate-port rig + animations + locomotion
- humanoid.rig.json rewrite: legs->root, rest.rot+rest.scl on all bones,
  Y-mirror via scl=-1 on leg_l/r/foot_l/r, locomotion-block with
  procedural footplant config
- walk.anim.json: substrate walk_fwd_lower port; track=lower; pos+scl
  channels on legs+feet
- walk_upper.anim.json (NEW): substrate walk_upper port; arm-swing
- idle.anim.json: substrate idle_upper port; pos+rot on shoulders+arms
- init.lua: walk_upper parallel-play wiring
- manifest bump v0.2->v0.3; puppet dep ^0.3.0
2026-05-18 18:55:34 +02:00
Axel Meyer
161913795b feat: bump to v0.2.0 with asset_aliases for sprite-upgrade
Manifest changes:
- Version 0.1.0 -> 0.2.0
- New asset_aliases block: player + tiles + world all map to
  lib-asset.prototype-subterrain
- deps bumped: lib-core.maps 0.1.1 -> 0.1.2, lib-core.puppet
  0.1.0 -> 0.2.0
- New dep: lib-asset.prototype-subterrain 0.1.0

Rig, animations, tilemap, and init.lua updates land in follow-up
commits in this slice.
2026-05-18 03:25:28 +02:00
Axel Meyer
db8129e2fc chore: bump lib-core.maps to 0.1.2, lib-core.puppet to 0.2.0 2026-05-18 03:22:29 +02:00
Axel Meyer
2817613490 feat: initial implementation v0.1.0 — single player puppet + WASD + map
Composer module: single-player character as puppet (humanoid 4-bone
rig: torso, head, leg_l, leg_r) at world (320, 240) on a 20x20
v0.1-format tilemap.

- WASD direct movement, normalized for diagonals, 120 px/s.
- Camera-chase via lib-core.camera target-provider (camera follows
  puppet position frame-to-frame).
- Idle and walk keyframe animations: idle is a 2s torso-sway on the
  upper track; walk is a 0.6s leg-cycle on the lower track.
- Animation-state transitions driven by movement input: walk while
  WASD-active, idle when released.
- Headtrack: head bone (marked look_at: true in rig) rotates each
  frame to face the mouse cursor's world position via
  puppet.set_look_target.
- ESC -> launcher.

CI hooks (env-var-gated, no-op in normal play):
- SPOREL_CI=1: emits 'vagrant: frame_avg_ms=N' after 60 frames and
  'vagrant: render_frame_ok' per frame from the render hook, then
  engine.exit(0). Smoke stages consume these markers.
2026-05-17 20:21:31 +02:00