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
()
Ответ на: комментарий от kranky

Как будто minecraft - поделка не из корявых.

Quasar ★★★★★
()

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

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

до

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)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.