LINUX.ORG.RU
ФорумTalks

простой синтаксис для программирования роботов minetest

 


0

3

Собственно вопрос в заголовке.

Пока тестовая версия выглядит так:

http://storage4.static.itmages.ru/i/13/0304/h_1362341336_4963468_5cf8a1feb8.jpeg

http://storage6.static.itmages.ru/i/13/0304/h_1362341357_2329104_e1e336442d.jpeg

http://storage7.static.itmages.ru/i/13/0304/h_1362341360_8581625_90b1f13c50.jpeg

и умеет копать по программе:

y-1,x+2,z-2,x-4,z+4,x+4
наподобие «выкопать по оси y 1 блок в сторону убывания», но это фигня, идея в том чтобы задать выкапывание сложных фигур (например выкопать цилиндр), или задавать построение «цилиндра»

так как поле ввода небольшое то надо что-то краткое, но не скатится в перл.

а ведь в идеале - задать выкапывание и из выкопанного уже заказать построение, и все это надо уметь объяснить боту, как?

ps. в толксы т.к. вопрос болеше философский

Deleted

так как поле ввода небольшое то надо что-то краткое, но не скатится в перл.

Имя внешнего скрипта на любом нормальном скриптовом языке. Например, JS.

Sadler
()
Ответ на: комментарий от Sadler

ага, и написать на убогом lua (за 80 строк кода я его успел пару раз проклясть) интерпретатор js?

Deleted
()
Ответ на: комментарий от Deleted

ага, и написать на убогом lua (за 80 строк кода я его успел пару раз проклясть) интерпретатор js?

Я думал, ты патч к клиенту рисуешь.

Sadler
()
Ответ на: комментарий от vurdalak

так они вроде просто lua юзают

Deleted
()
Ответ на: комментарий от Sadler

просто мод, благо api позволяет, только анимацию копания сделать - весьма затейливо (там просто так ящик не передвинуть). А как написаны мобы я офф доке я не нашел - они по идее проблему анимации решат

Deleted
()

ps. в толксы т.к. вопрос болеше философский

Глубже 3-х метров в глубину не везде можно, так как придётся выкупать грунт из бюджета.

pacify
()

простой синтаксис для программирования роботов

Посмотри мод Robot craft для Майнкрафта.

minetest

Забудь про эту корявую подделку.

kranky
()
Последнее исправление: kranky (всего исправлений: 1)
Ответ на: комментарий от kranky

эту корявую подделку.

я принципиально не совокупляюсь с проприетарными поделками, бесплатно.

а так как это just for fun то майнкрафта идет лесом

Deleted
()
Ответ на: комментарий от Arrest

и чего это фанаты прориетарной поделки так норовят присовокупить к своей кодле еще одну жертву?

Deleted
()
Ответ на: комментарий от Deleted

От проприетарного кода там остался разве что (неприятный) сетевой протокол. Просто к ним написано много готового кода, в том числе, разнообразных ботов и плагинов для сервера.

Arrest
()
Ответ на: комментарий от Arrest

это был не риторический вопрос, а твои потуги - не ответ.

Deleted
()
Ответ на: комментарий от derlafff

этож емулятор процессора, а у меня задачка попроще, тут можно вообще обойтись:

y+100,cr10y  //столб, диск с рад. 10
y+50,sp10    //шар на 50бл выше
сb20         //куб
cl10z+50      // цилиндр r=10, h=50 вдоль оси z

но этот пипец нмв для непрограммистов нечитабилен, а так можно даже стековую машину заюзать

Deleted
()
Ответ на: комментарий от Deleted

этож емулятор процессора

любой ЯП — эмулятор процессора, лол?

у меня задачка попроще

а как потом к твоим x, y и z лазеры прикручивать с детекторами?

а так можно даже стековую машину заюзать

ты не поверишь, но там как раз стековая машина

derlafff
()
Последнее исправление: derlafff (всего исправлений: 1)
Ответ на: комментарий от derlafff

любой ЯП — эмулятор процессора, лол?

ага, например декларативный, типа sql, тебе точно надо заканчивать с понями 8)

а как потом к твоим x, y и z лазеры прикручивать с детекторами?

а зачем?

Deleted
()
Ответ на: комментарий от Deleted

тебе точно надо заканчивать с понями 8)

первый аргумент в сторону моей правоты :3

а зачем?

какой ты скучный

derlafff
()
Ответ на: комментарий от quickquest

кц это круто, но многословно и нужно для англоязычных юзеров 8)

Deleted
()

получается какойто фреймфорк "рисования" кубиками

у меня вопрос: где найти тусовку любителей майнтеста на русском, чтобы они потестили сию штукенцию

до

http://storage8.static.itmages.ru/i/13/0306/h_1362517285_8234807_565aaf8ef6.jpeg

после

http://storage9.static.itmages.ru/i/13/0306/h_1362517291_9020189_485dfcd3ac.jpeg

до

http://storage1.static.itmages.ru/i/13/0306/h_1362517298_1357210_d8aff6d480.jpeg

после

http://storage2.static.itmages.ru/i/13/0306/h_1362517304_4760119_7d7c48b625.jpeg

все изничтоженное попадает в инвентарь штуковины

куда и в каком направлении копать программируется на lua в виде

r:jump(0, -1, 0) r:rect(30) r:cube(10)

опуститься на -1, выкопать горизонтальный (пока непонятно как удобно задавать плоскость) квадрат со стороной 30 и куб со стороной 10

в планах

1) научиться копать круги, цилиндры и сферы, и постепенно исчезновение, а не мгновенное как щас

2) затем построение аналогичных штук из накопанного

3) решать задачи - частично выкопать параллелепипед в скале, а из накопанного завершить эту фигуру

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

ComputerCraft даёт программировать тупо на lua.

RedPower даёт программировать на форте на эмуляторе процессора, похожего на 6502.

(это примеры модов под майнкрафт, где программирование реализовано хорошо)

PolarFox
()
Последнее исправление: PolarFox (всего исправлений: 1)
Ответ на: комментарий от rikardoac

ну надо его кудато выложить по GPL или какй там лицензия у minetest, пока както так (это один файл, всего их три)

do
  local mod_name = "buldozzer"
  local mod_path = minetest.get_modpath(mod_name);
  
  function load_module(name) 
    if _G.name then
      return
    end
    local module = dofile(mod_path.."/"..name..".lua")
    rawset(_G, name, module)
  end

  load_module("wr_utils")
  load_module("wr_router")
  
  local description = "Automation bot Buldozzer"
  local name = mod_name..":buldozzer"
  minetest.register_node(name, {
	  tiles = {"buldozzer.png"},
	  description = description,
	  groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
	  on_punch = function(pos, node, puncher) 
		  local meta = minetest.env:get_meta(pos)
		  local command = meta:get_string("command")
		  if not command or command == "" then
			  return
		  end
		  print("Start command: "..command)
		  digg(pos, node, command)
	  end,
	  on_construct = function(pos)
		  local meta = minetest.env:get_meta(pos)
          meta:set_string("command", "r:jump(0, -1, 0) r:rect(30) r:cube(10)")
		  meta:set_string("formspec",
				  "size[8,11]"..
				  "list[current_name;main;0,0;8,4;]"..
				  "list[current_player;main;0,5;8,4;]"..
		          "textarea[0.3,9.3;7,2;command;Command;${command}]"..
				  "button[7,9.2;1,1;do_commnad;Save]")
		  meta:set_string("infotext", description)
		  local inv = meta:get_inventory()
		  inv:set_size("main", 8*4)
	  end,
	  --[[can_dig = function(pos,player)
		  local meta = minetest.env:get_meta(pos);
		  local inv = meta:get_inventory()
		  return inv:is_empty("main")
	  end,]]--
	  on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
		  minetest.log("action", player:get_player_name()..
				  " moves stuff in chest at "..minetest.pos_to_string(pos))
	  end,
	  on_metadata_inventory_put = function(pos, listname, index, stack, player)
		  minetest.log("action", player:get_player_name()..
				  " moves stuff to chest at "..minetest.pos_to_string(pos))
	  end,
	  on_metadata_inventory_take = function(pos, listname, index, stack, player)
		  minetest.log("action", player:get_player_name()..
				  " takes stuff from chest at "..minetest.pos_to_string(pos))
	  end,
      on_receive_fields = function(pos, formname, fields, sender)
		local meta = minetest.env:get_meta(pos)
		meta:set_string("command", fields.command)
	  end,
  })

  minetest.register_craft({
	output = '"'..name..'" 2',
	recipe = {
	  {'default:wood', 'default:wood', ''},
	  {'default:wood', 'default:wood', ''},
	  {'', '', ''},
	}
  })
  
  function digg(initial_pos, node, command)
      local env = minetest.env
      local meta = env:get_meta(initial_pos)
	  local inv = meta:get_inventory()
	  local pos = wr_utils.copy_table(initial_pos)
      do
        local r = wr_router.Router.new(pos);
        local command_func = loadstring(command)
        local context = {
          r = r 
        }
        setmetatable(context, {__index = _G})
        setfenv(command_func, context)
        command_func()
      end 
  end
end

надо кой чего еще переименовать

Deleted
()
Ответ на: комментарий от Deleted

wr_router

load_module("wr_utils")

local this = {}

function this.pos(x, y, z) 
  return {x=x, y=y, z=z}
end

this.Router = {}
local Router_mt = {__index = this.Router}

function this.Router.new(pos) 
  local env = minetest.env
  local meta = env:get_meta(pos)
  t = {
    initial_pos = wr_utils.copy_table(pos),
    pos = wr_utils.copy_table(pos),
    env = env,
    meta = meta,
    inv = meta:get_inventory()
  }
  print("new router with pos="..minetest.pos_to_string(t.pos))
  return setmetatable(t, Router_mt)
end

function this.Router:processNode(pos) 
  local processed_node = self.env:get_node_or_nil(pos)
  if not processed_node then
      print("no node at "..minetest.pos_to_string(pos))
      return
  end
  local drawtype = wr_utils.get_nodedef_field(processed_node.name, "drawtype")
  if drawtype == "normal" and not (pos.x == self.initial_pos.x and pos.y == self.initial_pos.y and pos.z == self.initial_pos.z) then
      self.inv:add_item("main", processed_node)
      self.env:remove_node(pos)
  end
end

function this.Router:jump(x, y, z)
  local p = self.pos
  print("jump to "..minetest.pos_to_string(p))
  p.x = p.x + x
  p.y = p.y + y
  p.z = p.z + z
end

function this.Router:move(pos)
  print("move")
end

function this.Router:rect(r)
  local p = wr_utils.copy_table(self.pos)
  local halfr = math.floor(r/2) 
  for i = -halfr, halfr do
    for j = -halfr, halfr do
      p.x = self.pos.x + i
      p.z = self.pos.z + j
      self:processNode(p)
    end
  end
end

function this.Router:cube(r)
  local p = wr_utils.copy_table(self.pos)
  local halfr = math.floor(r/2) 
  for i = -halfr, halfr do
    for j = -halfr, halfr do
      for k = -halfr, halfr do
        p.x = self.pos.x + i
        p.z = self.pos.z + j
        p.y = self.pos.y + k
        self:processNode(p)
      end
    end
  end
end

return this


wr_utils

local this = {}

function this.copy_table(t)
    local u = { }
    for k, v in pairs(t) do u[k] = v end
    return setmetatable(u, getmetatable(t))
end

function this.print_table(table)
  for k,v in pairs(table) do 
    print(k.."="..tostring(v)) 
  end
end 

function this.get_nodedef_field(nodename, fieldname)
    if not minetest.registered_nodes[nodename] then
        return nil
    end
    return minetest.registered_nodes[nodename][fieldname]
end

return this

Deleted
()
Ответ на: комментарий от PolarFox

майнкрафт на яве, у меня для явы есть парочка своих яп, очевидно опыт их написания, а также там есть встроенных интерпретатор js, так что там проблем бы не было.

Deleted
()
Ответ на: комментарий от Deleted

Спасибо. Пожалуй подпишусь на тред. Когда окончательно пригладишь - кастани меня пожалуйста (ну или дай адрес репозитория, если на гитхабе).

rikardoac
()
Ответ на: залил на гитхаб от Deleted

А чего цилиндр не сделал типа «прямо вдоль прямой 30 блоков окружности убрать». В смысле разделить направление, траекторию и рисуемое/стираемое?

ziemin
()

советую переключиться на framsticks, там алгоритмы позабористее будут

q11q11
()
Ответ на: комментарий от ziemin

цилиндр не сделал типа «прямо вдоль прямой 30 блоков окружности убрать». В смысле разделить направление, траекторию

нипонял, как это разделить направление и траекторию, если траектории там вообще нет?

рисуемое/стираемое?

это в планах научить строить фигуры из стираемого (все что стирает он помещает унутырь себя)

Deleted
()
Ответ на: комментарий от Deleted

нипонял, как это разделить направление и траекторию, если траектории там вообще нет?

Есть. Из твоих же исходников это видно. Правда ты всё перемешал. Вот как я это вижу:

function this.Bulldozer:cylinder(axis, r, h)
  local p = wr_utils.copy_table(self.pos)
  local r2 = r*r
  local axes = axes_table[axis]
  local hstart = math.min(0, h)
  local hend = math.max(0, h)
  for x = -r, r do
    local x2 = x*x
    for y = -r, r do
      local y2 = y*y
-- ^^ Это окружность
      if x2 + y2 <= r2 then
        --may be 'for' statement?
        p[axes[1]] = self.pos[axes[1]] + x
        p[axes[2]] = self.pos[axes[2]] + y
        for hi = hstart, hend do
-- ^^^ Это "по прямой".
          p[axis] = self.pos[axis] + hi
          self:processNode(p)
-- строка выше это "убрать". У тебя она безусловна, а ведь можно и "строить"
        end
      end
    end
  end
end

Я предлагал разбить эту процедуру на три мелких, одна из которых вычисляет следующую базовую точку (траекторию), вторая вычисляет координаты некоторой точки фигуры, которую ты вокруг этой точки собираешься строить, ну и третья решает: сносить куб или положить.

Как-то так.

Соответственно вот и намётки некоторого простого языка:

forward linear(30) circle erase

где

  • forward (а могло быть down) - направление
  • linear (могло быть spline) - форма траектории
  • (30) ограничение на действие
  • circle (могло быть box) - форма фигуры
  • erase (могло быть put) - действие

Вот и всё. Осталось наклепать таких примитивов и вперёд.

Например вырыть прямоугольную шахту:

down linear(10) box erase

Построить китайскую стену:

forward spline(100) box put

ziemin
()
Ответ на: комментарий от ziemin

И не наклепать примитивов в смысле up, down, forward, а в смысле примитив «направление движения».

ziemin
()
Ответ на: комментарий от ziemin

Я предлагал разбить эту процедуру на три мелких, одна из которых вычисляет следующую базовую точку (траекторию), вторая вычисляет координаты некоторой точки фигуры, которую ты вокруг этой точки собираешься строить, ну и третья решает: сносить куб или положить.

строить или сносить - в планах, уже писал тем более что я вижу ситуевины когда в зависимости от окружающих условий нужно определять - строить или сносить.

идея про разделение действия по осям - понятна, но это также в планах, первоочередная задача была освоить 3d - т.к. твоим языком закодить сферу не выйдет 8) (ну разве что добавить синусоидальную зависимость радиуса от «шага» траектории, но пользователи за такое будут слать лучи поноса, им нужна простая и понятная сфера)

forward (а могло быть down) - направление

а тут у тебя трабла - в майнтест нет понятия forward - там 3 координаты, они не спроста на кубике нарисованы 8)

Построить китайскую стену:

forward spline(100) box put

сплайн с одной точкой? хехе

В остатке так

linear('x', 30) circle('x', 20) erase

направление для circle нужно хотябы для твоего же сплайна - который двумерен по сути, а рисовать перпендикуляр сплайну при его поворотах - излишне зателиво

Deleted
()
Ответ на: комментарий от Deleted

а тут у тебя трабла - в майнтест нет понятия forward - там 3 координаты, они не спроста на кубике нарисованы 8)

Там шесть направлений. Я описал уже три: forward, up, down. Что мешало додуматься до left, right, back? И так пол-работы за тебя сделал.

А суть в том, что направление это всего навсего зафиксированный в x-1 координатах вектор перемещения. Соответственно единственную оставшуюся регулируешь «формой кривой», которой можно добавить «вольности». Т.е. чтобы она могла отклоняться от основной.

ziemin
()
Ответ на: комментарий от ziemin

Там шесть направлений.

ты помоему просто хочешь запилить побольше непонятных ключевых слов, чтобы нищастный юзер гадал где back у куба.

А суть в том, что направление это всего навсего зафиксированный в x-1 координатах вектор перемещения.

ага, т.е. 3-мерная спираль нарисованная кругом, или таже стена огибающая рельеф (во всех 3х координатах) - это x-1?

Deleted
()
Ответ на: комментарий от ziemin

чем он в твоем примере отличается от прямой линии? для нормального сплайна потребутеся чуток поболее значений, в итоге чтобы не грузить юзера альгеброй будет нечто вида

splineTo(x,y,z) splineTo(x1,y1,z1) -- и т.п.
а это опятже плохо стыкуется с заданием направления

Deleted
()
Ответ на: комментарий от Deleted

ты помоему просто хочешь запилить побольше непонятных ключевых слов, чтобы нищастный юзер гадал где back у куба.

y-1,x+2,z-2,x-4,z+4,x+4

Да нет, што ты. Твои подходят. Просто я запутался и решил «усложнить».

ага, т.е. 3-мерная спираль нарисованная кругом,

Это траектория круга, фигура допускает «вольность»: подняться (опуститься) на 1 кубик.

или таже стена огибающая рельеф во всех 3х координатах
огибающая рельеф

Про условные выражения мы разве говорили?

ziemin
()
Ответ на: комментарий от Deleted

для нормального сплайна потребутеся чуток поболее значений

Для синтетического примера ты слишком привередлив. Но ОК. Для «нормального сплайна» хватит и одной точки - точки отправления. Форму изгиба можно сделать зависимой от длины, а длиной он будет известной.

ziemin
()
Ответ на: комментарий от ziemin

r:jump(0, -1, 0) r:rect(30) r:cube(10)

Твои подходят.

тогда непонятно чего енто ты вообще выступаешь, если со всем согласен

Это траектория круга, фигура допускает «вольность»: подняться (опуститься) на 1 кубик.

бгг, это траектория спирали, а фигура круг

Форму изгиба можно сделать зависимой от длины

наркоманство

Deleted
()

пофиксил самый страшный косяк - зависание при удаление тучи кубиков, теперь кубы удаляются по таймеру - для этого пришлось заюзать entity которая «шарится по окресностям» и «собирает кубы», вот, заодно выделил роутер (хреновина которая рисует фигуры) отдельно от бульдозера - для создания библиотеки маршрутизации

Deleted
()

Если бы там можно было запилить какой-то А* с простенькой эвристикой или хотя бы uniform-cost search - было бы незаменимо в образовательных целях.

crunchy_crow
()
Ответ на: комментарий от crunchy_crow

присоединяйся (https://github.com/wayerr/minetest-bulldozer-mod) , тут еще до простого релиза - когда оно будет уметь строить (и не только) и не в god-mode еще пилить и пилить

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.