71 lines
1.5 KiB
GDScript3
71 lines
1.5 KiB
GDScript3
|
|
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)
|