Commit Graph

15 Commits

Author SHA1 Message Date
calic
8994b24567 feat(vagrant): v0.15.0 stone-age slice — saw_planks property-constraint recipe (log→4 planks, cutting tool); crafting output-alias for bw-compat icon resolvers 2026-07-28 10:42:21 +00:00
calic
c3290058c1 feat(vagrant): v0.14.0 — TC_Basics first-consumer + UI item icons
ADR-0054 Item-Visual-Identity validated end-to-end.

World-sprite migration off the proprietary Subterrain world-atlas:
  - Bed + Bench promoted to composition-entities with renderable tag;
    rendered via the existing draw_entities path (the hardcoded
    draw_sprite_transform calls for furniture are gone).
  - Backpack sprite source: Subterrain backpack_001 → TC_Basics sack1.
  - Stick visual: blob_rect_stone slot_04_straight → TC_Basics log_pile1.
  - rock_pick crafted-output visual: blob_rect_stone slot_05_tee_open →
    TC_Basics spade.
  - rock + rock_pile + workbench stay on blob_rect_stone (no TC_Basics
    equivalent yet).

Scale resolution is now atlas-level (no more module-side constants):
M.init reads tc_meta.atlas_meta.pixels_per_meter and divides into
PROJECT_PIXELS_PER_METER (128 per puppet shoulder anchor) to derive
tc_scale, applied per-entity via lib-core.render v0.3.0's sprite_
scale property.

UI item icons via ADR-0054 §3 Konsum:
  - Backpack + Workbench-Inventory rows now show item icons via the
    inventory-list-display v0.2.0 default resolver (fallback chain
    icon_atlas → sprite_atlas), fit-to-bounds.
  - Backpack-Crafting + Workbench-Crafting panels get an icon column
    via crafting-display v0.3.0; vagrant supplies a small recipe-
    output → {atlas, uv} lookup (craft_icons) and wires it as
    icon_resolver on both widgets.

Deps cascaded: lib-core.render 0.2.0 → 0.3.0, lib-core.inventory-
list-display 0.1.1 → 0.2.0, lib-core.crafting-display 0.2.0 → 0.3.0,
lib-asset.prototype-tc-basics 0.1.0 → 0.3.0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-21 11:45:24 +02:00
Axel Meyer
1fa0628c83 feat: v0.13.0 Workbench multi-panel via panel v0.2.0
D.2-revisit closes the Workbench Gate-2 walkthrough: right-click
on Workbench now opens workbench_crafting (left-half layout-slot)
+ workbench_inv (right-half) simultaneously, replacing the v0.12.0
auto-switch workaround. Both panels visible at the same time.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-15 02:01:39 +02:00
Axel Meyer
644bfe98fd feat: v0.12.0 Workbench-Integration
Workbench-Entity bei (350, 380) als Crafting-Context-Erweiterung.
Right-Click oeffnet Workbench-Crafting-Panel + Workbench-Inventory.
Crafting nutzt Multi-Source-Locale {backpack, workbench} mit sink
= workbench; Take-Action verschiebt vom Workbench-Inventory zum
Backpack. C-Key Backpack-Crafting bleibt unveraendert via Bw-
Compat-Shim in crafting v0.2.0.

Deps: crafting 0.1.0 -> 0.2.0, crafting-display 0.1.0 -> 0.2.0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-14 20:04:04 +02:00
Axel Meyer
31333111c0 feat: v0.11.0 crafting integration
Stick pickup neben rock spawnt; 2 Recipes (rock_pick, rock_pile);
C-key oeffnet Crafting-Panel via lib-core.crafting-display.
Craft + Inspect Actions konsumieren notify-Channels fuer Erfolg +
Detail-Modal.

Deps: +crafting 0.1.0, +crafting-display 0.1.0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-14 13:57:19 +02:00
Axel Meyer
6b4c698984 feat(vagrant): notification system — Inspect modal, pickup-float, toast events, game-log
- manifest: bump to v0.10.0; add deps lib-core.notify, lib-core.notify-display,
  lib-core.world-overlay (all v0.1.0)
- Inspect action migrated from engine.print to notify.post{tags={"inspect"}, data={...}};
  routes to modal detail-panel via notify-display detail-channel
- Pickup callback: world_overlay.spawn fires "+1 <name>" float anchored on player
  (yellow, rise_px=24, ttl=1.2s) + notify.post pickup event-toast/log entry
- Drop action (right-click menu): notify.post{tags={"drop","inventory"}} added
  after existing relocate+close_menu logic
- Setup block: 3 channels (inspect/events/log), 2 panel widgets
  (inspect-detail/game-log), 3 attach_mode calls; L bound to game-log panel
- M.update: notify_display.update + world_overlay.update after panel.update pause-guard
- M.draw: camera_handle constructed after camera.finish(); world_overlay.render between
  camera.finish and panel.render; notify_display.render at end (toasts on top)
- README: version 0.10.0, Requires expanded, Controls section updated, changelog entry added
2026-06-14 02:05:35 +02:00
Axel Meyer
f66ffc7f12 feat(vagrant): rock template gains player-facing properties
Rock template now declares name="Rock", a description, weight (kg),
volume (L), and composition.stone=1.0. The module-side label_resolver
override is removed — display lib's default reads name now.

Inspect action prints a structured block (name, description, weight,
volume, composition.<material>, reg_id) to the console. Future
notification system will route this to an in-game text panel; for now
the console output makes Inspect useful instead of silent.
2026-06-14 00:26:29 +02:00
Axel Meyer
60eac65bce feat(vagrant): Tab-Toggle inventory panel + right-click context menu
- lib-core.panel and lib-core.inventory-list-display added to deps (v0.1.0 each)
- backpack-widget created in M.init with label-resolver returning "Rock"
- Drop action registered: removes from backpack, relocates to player position,
  re-registers pickup trigger
- Inspect action registered: prints reg_id via engine.print
- M.update: panel.update(dt) + is_pausing() early-return added after
  quit_to_launcher check
- interaction.update wrapped in panel.is_open() guard to block world triggers
  while panel is visible
- M.draw: panel.render() added at z-top after CI traces
- Q-drop (LIFO quick-drop via Q key) unchanged and parallel to panel Drop action
2026-06-13 23:42:55 +02:00
Axel Meyer
e38d396b87 feat(vagrant): backpack as inventory container — end-to-end pickup/drop demo
- Add container={kind="list"} to the backpack template so inventory.add
  accepts it as a valid list-container
- Remove old backpack proximity-trigger (print-only callback, pre-B.5);
  the rock's register_pickup is now the sole interaction trigger
- Emit unconditional inventory inspection trace after every add/remove:
  backpack count + item reg-ids for user-facing demo feedback
- Add CI-gated tree-check traces: tree_check_after_pickup=ok and
  tree_check_after_drop=ok verify composition-tree child placement
- Bump version 0.7.3 -> 0.8.0 across init.lua header, manifest.module,
  and README
- README: rewrite Controls section into full demo walkthrough; add Demo
  Walkthrough section; update Demonstrates + Interactions sections;
  add v0.8.0 CHANGELOG entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-13 19:00:12 +02:00
Axel Meyer
f874813498 feat(vagrant): spawn rock entity with pickup trigger
- Rock template (stack_mode=individual, tags=renderable+item) defined
  alongside backpack and vagrant_player templates.
- state.rock entity created in M.init using slot_00_isolated UV from
  the blob_rect_stone atlas (lib-asset.prototype-blob-geom); position
  (270, 400) — 80px left of the backpack.
- register_pickup(state.rock) wires an interaction trigger; existing
  render.draw_entities{tag="renderable"} draws the rock with no
  special-case render code.
- CI trace: engine.print("vagrant: rock_spawned") emitted once on init.
- Version bump 0.7.2 -> 0.7.3.
2026-06-13 18:27:25 +02:00
Axel Meyer
f1e27d8183 feat(vagrant): pickup/drop glue + lib-core.inventory-list dep
- Add lib-core.inventory-list v0.1.0 to manifest deps; bump module
  version 0.7.1 -> 0.7.2
- Import inventory = require("lib-core.inventory-list") in init.lua
- Add Item-Template-Convention comment block after vagrant_player
  template: documents stack_mode/tags/sprite/position contract that
  B.4 (rock) and B.5 (backpack-as-container) will fulfill
- Add register_pickup(item) factory: reads item position, registers
  interaction trigger; callback calls inventory.add + unregisters
  trigger on pickup
- Bind "drop" action to Q; drop handler in M.update pops last item
  from backpack via inventory.remove (renderable tag restored by
  library), repositions item at player pos +30px, re-registers pickup
- Update README Controls section: document E (pickup) and Q (drop)
  with note that end-to-end use requires B.4 + B.5
2026-06-13 18:18:52 +02:00
Axel Meyer
733db11821 docs(vagrant): README sync to v0.4.4 — sprint + interaction 2026-05-19 00:29:50 +02:00
Axel Meyer
a064825160 docs(vagrant): README sync to v0.4.3 — Subterrain-model puppet features
Updates README to describe the Subterrain-style puppet control model
implemented across v0.3.1–v0.4.3. Previous README described v0.2.0
state and predated the multi-look-target, slerp, inherit_scale,
procedural orientation, and tactical-twist foot behavior.

Demonstrates section updated: multi-look-target (soft/aim), scale-
deformation walk cycle, procedural leg orientation, foot-body-orientation
(tactical twist), inherit_scale=false on feet, per-channel conflict guard,
camera.begin/finish world-space rendering.

Interactions section updated to describe the v0.4.3 visual behavior.
Full CHANGELOG from v0.2.0 through v0.4.3 with per-version summaries.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-18 23:00:51 +02:00
Axel Meyer
3457a7eab8 feat: sprite-mode test-chamber with 13-bone puppet + sprite-tilemap
13-bone humanoid rig (12 visible bones + 1 root) hand-ported from
substrate reference, mapped to PROTOTYPE asset-pack via asset_aliases
indirection (asset_pack: player). Bones use texture/z_order/scale/
anchor fields from the rig-format extension. Tracks split: lower for
legs + feet (walk animation), upper for root/body/head/shoulders/arms
(idle animation).

Animations:
- idle.anim.json: 2.0s loop on upper track, subtle body+head sway
- walk.anim.json: 0.6s loop on lower track, legs+feet cycle

Sprite-tilemap: 4-tile palette (floor_001-003 walkable, floor_004
as wall). Map content: 20x20 with wall-border and interior wall
blocks. tile_rotations parallel array exercises 90 and 180-degree
rotations on a handful of cells for visual rotation-pipeline
verification.

init.lua loads textures via asset_aliases lookup:
- maps.load_textures(aliases) resolves tilemap-tile atlas-ids
- puppet.load_rig(path, aliases) loads + resolves bone textures
- furniture textures preloaded at init (bed, bench, backpack) to
  avoid first-frame load stutter; rendered via engine.render.
  draw_sprite_transform in the draw hook

Camera follows puppet via per-frame camera.set_target. Headtrack:
head bone (look_at: true) rotates to face mouse world-position.

New SPOREL_CI=1 traces from render and init hooks:
- vagrant: render_frame_ok (per frame from render)
- vagrant: sprite_mode=on (once after first sprite-draw)
- vagrant: assets_loaded=14 (once after init: 7 puppet + 4 tile + 3 furniture)
2026-05-18 03:29:54 +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