diff --git a/init.lua b/init.lua index 13aabda..068c0c3 100644 --- a/init.lua +++ b/init.lua @@ -1,12 +1,13 @@ -local maps = require("lib-core.maps") -local r_lib = require("lib-core.render") -local camera = require("lib-core.camera") -local input = require("lib-core.input") -local player = require("lib-core.player_control") +local maps = require("lib-core.maps") +local r_lib = require("lib-core.render") +local camera = require("lib-core.camera") +local input = require("lib-core.input") +local player = require("lib-core.player_control") +local interaction = require("lib-core.interaction") --- inline stubs (extract in P.0.lib.{actor,interaction}) -local actor = { hello = function() return "actor stub" end } -local interaction = { hello = function() return "interaction stub" end } +-- inline stub (extract in P.0.lib.actor — currently DEFERRED per +-- meta/docs/superpowers/specs/2026-05-10-p0-actor-deferral.md) +local actor = { hello = function() return "actor stub" end } local demo_map = maps.load("maps/demo.map.json") maps.set_current(demo_map) @@ -19,12 +20,13 @@ local map_center_y = (m_size.h * t_size) / 2 camera.set_target(map_center_x, map_center_y) camera.set_zoom(1.0) --- Bind input actions: ESC quits; WASD/arrows drive player movement +-- Bind input actions input.bind("quit", { engine.input.KEY_ESCAPE }) input.bind("move_left", { engine.input.KEY_A, engine.input.KEY_LEFT }) input.bind("move_right", { engine.input.KEY_D, engine.input.KEY_RIGHT }) input.bind("move_up", { engine.input.KEY_W, engine.input.KEY_UP }) input.bind("move_down", { engine.input.KEY_S, engine.input.KEY_DOWN }) +input.bind("interact", { engine.input.KEY_E }) -- Configure player: defaults are 24x24 + 200 px/sec; place at map-center local p_size = player.size() @@ -33,12 +35,17 @@ player.bind_movement("move_left", "move_right", "move_up", "move_down") local PLAYER_R, PLAYER_G, PLAYER_B = 200, 60, 80 +-- Sign as module-local (actor deferred — see actor-deferral spec) +-- Tile (4,4) center: 4*32+16 = 144 px in walkable grass-area +local sign = { x = 144, y = 144, text = "Hier steht: Willkommen im Spine." } +local SIGN_R, SIGN_G, SIGN_B = 220, 200, 60 + local frames = 0 local TARGET_FRAMES = 60 function init(ctx) engine.print("spine-prototype init: maps loaded") - engine.print("inline stubs loaded: " .. actor.hello() .. ", " .. interaction.hello()) + engine.print("inline stubs loaded: " .. actor.hello()) engine.print(string.format("map size: %dx%d", m_size.w, m_size.h)) local corner = maps.tile_at(0, 0) local interior = maps.tile_at(5, 5) @@ -54,13 +61,22 @@ function init(ctx) local s = player.size() engine.print(string.format("player: pos=(%d,%d) size=%dx%d speed=%d", p.x, p.y, s.w, s.h, player.speed())) + + interaction.register(sign.x, sign.y, 40, "interact", function(info) + engine.print(sign.text) + end) + engine.print(string.format("interaction: %d trigger(s) registered", + interaction.trigger_count())) end function render(ctx) engine.render.clear_color(engine.render.rgb(20, 20, 30)) camera.begin() r_lib.draw_map() - -- draw player on top of map + -- draw sign on top of map + engine.render.draw_rect(sign.x - 6, sign.y - 6, 12, 12, + engine.render.rgb(SIGN_R, SIGN_G, SIGN_B)) + -- draw player on top of sign local p = player.position() local s = player.size() engine.render.draw_rect(p.x, p.y, s.w, s.h, @@ -80,6 +96,9 @@ function update(ctx, dt) local s = player.size() camera.set_target(p.x + s.w / 2, p.y + s.h / 2) + -- Interaction proximity-check + dispatch + interaction.update(p.x + s.w / 2, p.y + s.h / 2) + frames = frames + 1 if frames >= TARGET_FRAMES then engine.exit(0) diff --git a/manifest.module b/manifest.module index f9829bc..0bd0f76 100644 --- a/manifest.module +++ b/manifest.module @@ -9,6 +9,7 @@ {"id":"lib-core.render","version":"0.1.0"}, {"id":"lib-core.camera","version":"0.1.0"}, {"id":"lib-core.input","version":"0.1.0"}, - {"id":"lib-core.player_control","version":"0.1.0"} + {"id":"lib-core.player_control","version":"0.1.0"}, + {"id":"lib-core.interaction","version":"0.1.0"} ] }