diff --git a/maidroid_core/cores/ocr.lua b/maidroid_core/cores/ocr.lua index ce22bc6..6301df1 100644 --- a/maidroid_core/cores/ocr.lua +++ b/maidroid_core/cores/ocr.lua @@ -4,20 +4,29 @@ ------------------------------------------------------------ local maidroid_instruction_set = { + -- popular (similars in lua_api) information gathering functions getpos = function(_, thread) local pos = thread.droid.object:getpos() return true, {pos.x, pos.y, pos.z} end, - beep = function(_, thread) - minetest.sound_play("maidroid_beep", {pos = thread.droid.object:getpos()}) - return true + getvelocity = function() + local vel = self.vel + return true, {vel.x, vel.y, vel.z} + end, + + getacceleration = function(_, thread) + local acc = thread.droid.object:getacceleration() + return true, {acc.x, acc.y, acc.z} end, getyaw = function(_, thread) return true, thread.droid.object:getyaw() end, + -- other info functions + + -- popular actions for changing sth setyaw = function(params, thread) if #params ~= 1 then return false, "wrong number of arguments" @@ -29,6 +38,48 @@ local maidroid_instruction_set = { thread.droid.object:setyaw(p) return true end, + + -- other actions + jump = function(params, thread) + -- test if it can jump + local droid = thread.droid + if droid.vel.y ~= 0 + or droid.vel_prev.y ~= 0 then + return true, false + end + + -- get the strength of the jump + local h = tonumber(params[1]) + if not h + or h <= 0 + or h > 2 then + h = 1 + end + + -- play sound + local p = droid.object:getpos() + p.y = p.y - 1 + local node_under = minetest.get_node(p).name + local def = minetest.registered_nodes[node_under] + if def + and def.sounds then + local snd = def.sounds.footstep or def.sounds.dig + if snd then + p.y = p.y + .5 + minetest.sound_play(snd.name, {pos = p, gain = snd.gain}) + end + end + + -- perform jump + droid.vel.y = math.sqrt(-2 * h * droid.object:getacceleration().y) + droid.object:setvelocity(droid.vel) + return true, true + end, + + beep = function(_, thread) + minetest.sound_play("maidroid_beep", {pos = thread.droid.object:getpos()}) + return true + end, } @@ -61,6 +112,8 @@ end local function on_start(self) self.object:setacceleration{x = 0, y = -10, z = 0} self.object:setvelocity{x = 0, y = 0, z = 0} + self.vel = {x = 0, y = 0, z = 0} + self.vel_prev = self.vel local parsed_code = pdisc.parse(get_code(self) or dummycode) self.thread = pdisc.create_thread(function(thread) @@ -77,9 +130,13 @@ end local function on_step(self) local thread = self.thread - if thread.stopped then - thread:try_rebirth() + if not thread.stopped then + return end + self.vel_prev = self.vel + self.vel = self.object:getvelocity() + + thread:try_rebirth() end local function on_resume(self) @@ -92,6 +149,7 @@ end local function on_stop(self) self.thread:exit() + self.thread = nil self.object:setvelocity{x = 0, y = 0, z = 0} end