mirror of
https://github.com/tacigar/maidroid.git
synced 2024-11-17 07:40:18 +01:00
109 lines
2.5 KiB
Lua
109 lines
2.5 KiB
Lua
|
------------------------------------------------------------
|
||
|
-- Copyright (c) 2016 tacigar. All rights reserved.
|
||
|
-- https://github.com/tacigar/maidroid
|
||
|
------------------------------------------------------------
|
||
|
|
||
|
local maidroid_instruction_set = {
|
||
|
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
|
||
|
end,
|
||
|
|
||
|
getyaw = function(_, thread)
|
||
|
return true, thread.droid.object:getyaw()
|
||
|
end,
|
||
|
|
||
|
setyaw = function(params, thread)
|
||
|
if #params ~= 1 then
|
||
|
return false, "wrong number of arguments"
|
||
|
end
|
||
|
local p = params[1]
|
||
|
if type(p) ~= "number" then
|
||
|
return false, "unsupported argument"
|
||
|
end
|
||
|
thread.droid.object:setyaw(p)
|
||
|
return true
|
||
|
end,
|
||
|
}
|
||
|
|
||
|
|
||
|
local function mylog(log)
|
||
|
-- This happens to the maidroids messages
|
||
|
minetest.chat_send_all("maidroid says " .. log)
|
||
|
end
|
||
|
|
||
|
-- the program is loaded from a "default:book_written" with title "main"
|
||
|
-- if it's not present, following program is used in lieu:
|
||
|
local dummycode = [[
|
||
|
beep
|
||
|
print $No book with title "main" found.
|
||
|
]]
|
||
|
|
||
|
local function get_code(self)
|
||
|
local list = self:get_inventory():get_list"main"
|
||
|
for i = 1,#list do
|
||
|
local stack = list[i]
|
||
|
if stack:get_name() == "default:book_written" then
|
||
|
local data = minetest.deserialize(stack:get_metadata())
|
||
|
if data
|
||
|
and data.title == "main" then
|
||
|
return data.text
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function on_start(self)
|
||
|
self.object:setacceleration{x = 0, y = -10, z = 0}
|
||
|
self.object:setvelocity{x = 0, y = 0, z = 0}
|
||
|
|
||
|
local parsed_code = pdisc.parse(get_code(self) or dummycode)
|
||
|
self.thread = pdisc.create_thread(function(thread)
|
||
|
thread.flush = function(self)
|
||
|
mylog(self.log)
|
||
|
self.log = ""
|
||
|
return true
|
||
|
end
|
||
|
table.insert(thread.is, 1, maidroid_instruction_set)
|
||
|
thread.droid = self
|
||
|
end, parsed_code)
|
||
|
self.thread:suscitate()
|
||
|
end
|
||
|
|
||
|
local function on_step(self)
|
||
|
local thread = self.thread
|
||
|
if thread.stopped then
|
||
|
thread:try_rebirth()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function on_resume(self)
|
||
|
self.thread:continue()
|
||
|
end
|
||
|
|
||
|
local function on_pause(self)
|
||
|
self.thread:flush()
|
||
|
end
|
||
|
|
||
|
local function on_stop(self)
|
||
|
self.thread:exit()
|
||
|
|
||
|
self.object:setvelocity{x = 0, y = 0, z = 0}
|
||
|
end
|
||
|
|
||
|
-- register a definition of a new core.
|
||
|
maidroid.register_core("maidroid_core:ocr", {
|
||
|
description = "OCR programmable maidroid core",
|
||
|
inventory_image = "maidroid_core_ocr.png",
|
||
|
on_start = on_start,
|
||
|
on_stop = on_stop,
|
||
|
on_resume = on_resume,
|
||
|
on_pause = on_pause,
|
||
|
on_step = on_step,
|
||
|
})
|