extends Node class QueryHost: extends RefCounted func lua_query(_entity_id: int, query_name: String, params: Dictionary) -> Variant: print("lua_query: ", query_name, " ", params) match query_name: "sense.is_walkable": return params.get("x", 0) == 2 and params.get("y", 0) == 3 "sense.find_nearest": return { "entity_id": 7, "distance": 4, "world_x": 32.0, "world_y": 48.0, "group": params.get("group", ""), } _: return null var query_host := QueryHost.new() func _ready() -> void: var rt := OneBitLuaRuntime.new() rt.set_entity_id(42) rt.set_query_host(query_host) rt.set_instruction_budget(10000) var loaded := rt.load_string(""" return { api_version = 2, on_update = function(ctx, state) state.count = (state.count or 0) + 1 if not ctx.self.is_moving and sense.is_walkable(2, 3) then local nearest = sense.find_nearest("players") move.step(1, 0) log.say("tick", 1.0) end end } """) if not loaded.ok: push_error("load_string failed: " + str(loaded.error)) get_tree().quit(1) return var ctx := { "self": { "is_moving": false, }, } var state := {} var result := rt.call_event("on_update", ctx, state, []) if not result.ok: push_error("call_event failed: " + str(result.error)) get_tree().quit(1) return if result.commands.size() != 1 or result.logs.size() != 1 or result.state.get("count", 0) != 1: push_error("unexpected result: " + str(result)) get_tree().quit(1) return print("OneBitLuaRuntime smoke test passed: ", result) get_tree().quit(0)