Add optional Lua scripting module, examples, and validation

This commit is contained in:
emil28092005
2026-09-18 11:28:50 +03:00
parent 06210aac23
commit 5a67735ff4
45 changed files with 3887 additions and 92 deletions
+27
View File
@@ -0,0 +1,27 @@
local motion = require("util.motion")
local Beacon = faset.behavior {
id = "example.lua_beacon",
version = 1,
name = "Lua Beacon",
fields = {
amplitude = { name = "Height", type = "number", default = 0.3, min = 0, max = 2 },
frequency = { name = "Frequency", type = "number", default = 0.7, min = 0, max = 5 }
}
}
function Beacon:on_start()
self.state.origin_y = self.entity:transform().position.y
self.state.elapsed = 0
end
function Beacon:update(delta)
self.state.elapsed = self.state.elapsed + delta
local pose = self.entity:transform()
pose.position.y = self.state.origin_y
+ motion.bob(self.state.elapsed, self.fields.frequency, self.fields.amplitude)
pose.rotation.z = self.state.elapsed
self.entity:set_transform(pose)
end
return Beacon
+47
View File
@@ -0,0 +1,47 @@
local Player = faset.behavior {
id = "example.lua_player",
version = 1,
name = "Lua Player",
fields = {
move_speed = {
name = "Move speed", type = "number", default = 5,
min = 0, max = 30, units = "m/s"
},
jump_speed = {
name = "Jump speed", type = "number", default = 7,
min = 0, max = 20, units = "m/s"
}
}
}
function Player:on_start()
self.state.origin = self.entity:transform()
self.state.jumps = 0
faset.log("Lua player ready: A/D move, Space jump, E reset")
end
function Player:fixed_update(delta)
local input = faset.input()
if input.interact_pressed then
self.entity:teleport(self.state.origin)
self.entity:set_velocity { x = 0, y = 0, z = 0 }
self.state.jumps = 0
return
end
local velocity = self.entity:velocity()
velocity.x = input.horizontal * self.fields.move_speed
if input.jump_pressed and self.entity:is_grounded() then
velocity.y = self.fields.jump_speed
self.state.jumps = self.state.jumps + 1
faset.log("Jump", self.state.jumps)
end
self.entity:set_velocity(velocity)
if self.entity:transform().position.y < -10 then
self.entity:teleport(self.state.origin)
self.entity:set_velocity { x = 0, y = 0, z = 0 }
end
end
return Player
+7
View File
@@ -0,0 +1,7 @@
local motion = {}
function motion.bob(time, frequency, amplitude)
return math.sin(time * frequency * 2 * math.pi) * amplitude
end
return motion