読者です 読者をやめる 読者になる 読者になる

turtleapis.lua

turtleapis.lua

方向別のタートルAPIをまとめて管理するためのAPIです。
わりと誰でも作るやつだと思いますが、これには right / left / back なんかも追加してあって思ったより便利です。
ぼちぼち良く出来た気がします。
前進/後退のみで一歩移動する STEPF/STEPB を追加予定です。

-----------------------------------------------------------
-- @file  turtleapis(lua)
-- @brief turtle API で方向別のものを簡易に取得できるテーブル集
-- @author 琴葉茜(さとうけい)
-----------------------------------------------------------
os.loadAPI('/lib/apis/const')

-----------------------------------------------------------
-- 回転
-----------------------------------------------------------
TURN = {
  [const.RIGHT] = turtle.turnRight,
  [const.LEFT]  = turtle.turnLeft,
  [const.BACK]  = function() -- 真後ろに回転するやつや
      local turn = turtle.turnRight -- 右回りやで
      if not turn() then return false end -- 1回目の回転に失敗したらそこまでや
      return turn() -- 2回めの回転や
    end
}

-----------------------------------------------------------
-- タートルが右か左を向いて、関数を実行して、元の向きに戻る
-- っていう関数を作って返すよ
-- 後ろまで向くのもついでに作るけど、TURN[BACK]の途中で失敗するとどうなるかわからん
-- そもそもタートルが回転に失敗することあるかどうか知らんけど
--
-- @param func [in]実行する関数
-- @param direction [in]タートルが向く向き
-- @return 作った関数
-----------------------------------------------------------
local function createSideFunc(func, direction)
  -- タートルが横向く関数や。とりあえず右向くもんとして設定しとくで
  local turn1st, turn2nd = TURN[const.RIGHT], TURN[const.LEFT]

  if direction == const.LEFT then -- 左に向く時は入れ替えればええで
    turn1st, turn2nd = turn2nd, turn1st
  elseif direction == BACK then -- 後ろ向く場合や
    turn1st = TURN[const.BACK] -- 後ろ向くで
    turn2nd = turn1st -- 同じ方向でまた後ろ向くで
  end

  -- 関数を作って返すよ
  return function(not_return)
    if not turn1st() then return false end -- 最初の横向くの失敗したらどうにもならん
    local result = func() -- 戻り値は関数の戻り値をそのまま返すんや
    if not not_return then turn2nd() end -- 引数が真でなければ元の向きに戻るよ
    return result, not_return and turn2nd
  end
end

-----------------------------------------------------------
-- 方向別のタートルAPIを格納したテーブルを作るよ
-- 例えばDROP[方向]で必要な関数がもらえる感じのやつや
--
-- 横向くやつは使い途が限られるかもなあ
--
-- @param methods [in]FORWARD UP DOWNの順にAPIメソッドを格納した配列
-- @return 作ったテーブル
-----------------------------------------------------------
local function createFuncsTable(methods)
  local methods_table = {}

  -- 前・上・下やで
  for i, v in ipairs { const.FORWARD, const.UP, const.DOWN } do
    methods_table[v] = methods[i]
  end

  -- 横向くやつや
  for _i, v in ipairs { const.RIGHT, const.LEFT, const.BACK } do
    methods_table[v] = createSideFunc(methods[1], v)
  end

  return methods_table
end

-----------------------------------------------------------
-- 方向別のタートルAPIメソッドを取得するためのテーブルやで
-- DROP[方向]でメソッドがもらえるで
DROP = createFuncsTable {
  turtle.drop,
  turtle.dropUp,
  turtle.dropDown,
}

-- 以下、似たようなのが続くで

ATTACK = createFuncsTable {
  turtle.attack,
  turtle.attackUp,
  turtle.attackDown,
}

DIG = createFuncsTable {
  turtle.dig,
  turtle.digUp,
  turtle.digDown,
}

PLACE = createFuncsTable {
  turtle.place,
  turtle.placeUp,
  turtle.placeDown,
}

DETECT = createFuncsTable {
  turtle.detect,
  turtle.detectUp,
  turtle.detectDown,
}

INSPECT = createFuncsTable {
  turtle.inspect,
  turtle.inspectUp,
  turtle.inspectDown,
}

COMPARE = createFuncsTable {
  turtle.compare,
  turtle.compareUp,
  turtle.compareDown,
}

SUCK = createFuncsTable {
  turtle.suck,
  turtle.suckUp,
  turtle.suckDown,
}

-----------------------------------------------------------
-- 一歩移動
-----------------------------------------------------------
STEP = createFuncsTable {
  turtle.forward,
  turtle.up,
  turtle.down,
}
STEP[const.BACK] = turtle.back -- 一歩移動の[BACK]だけは他と違って回らずそのまま下がるよ