turtlefuel.lua

turtlefuel.lua

タートル補給クラスです。

-----------------------------------------------------------
-- @name  turtlefuel(lua)
-- @description タートルの燃料を扱う関数群
-- @author 琴葉茜(さとうけい)
-----------------------------------------------------------
os.loadAPI('/lib/apis/akaneutils')
os.loadAPI('/lib/apis/turtleapis')

-----------------------------------------------------------
-- タートルの燃料レベルを表す文字列を返すよ
-----------------------------------------------------------
function getFuelLevelString()
  return 'FL:'.. tostring(turtle.getFuelLevel())
end

-----------------------------------------------------------
-- 燃料補給を管理するオブジェクトを作って返すよ
-- 前に作った補給関数なんかも含まれてるよ
--
-- オブジェクトは燃料の最初の量と、補給量の合計を覚えてるよ
-- その合計から、現在の燃料の量を引いて
-- 燃料をどれだけ使ったか計算できるよ
--
-- @param setting 燃料補給管理オブジェクトの設定テーブル
-- @return 補給管理オブジェクト
-----------------------------------------------------------
function new(setting)
  -- テーブル作成。デフォルト値も設定するよ
  -----------------------------------------------------------
  -- @class table
  -- @name hokyu
  -- @description 燃料補給管理オブジェクト
  -- タートルの燃料補給と、燃料使用量を計算する機能があるよ
  -- @field direction   補給チェストがどっちにあるか
  -- @field wait        燃料確認間隔
  -- @field threashold  燃料補給閾値 これより少なかったら補給するよ
  -- @field enough      燃料十分量 補給時はコレより多くなったら補給をやめるよ
  -- @field sleep       待機に使用する関数
  -----------------------------------------------------------
  local hokyu = {
    direction = const.FORWARD,
    wait = 60,
    threashold = 1000,
    enough = threashold,
    sleep = sleep,
  }
  -- クロージャOOP
  local self = hokyu

  -- private
  -- 燃料の最初の量と、補給量の合計
  local total_fuel = turtle.getFuelLevel()

  -- 引数で渡された設定テーブルで上書き
  if setting then
    akaneutils.overwrite(hokyu, setting)
  end


  -----------------------------------------------------------
  -- 燃料の総使用量を計算して返すよ
  --
  -- 計算方法は、最初にあった量 + 総補給料 - 現在の燃料 やで
  -- どっかおかしかったら教えてな
  -- @return 燃料の総使用量
  -----------------------------------------------------------
  function hokyu.getTotalUsage()
    return total_fuel - turtle.getFuelLevel()
  end

  -----------------------------------------------------------
  -- 燃料の総使用量に加算するよ
  -- @param fuel_level [in]加算する量
  -----------------------------------------------------------
  function hokyu.addUsage(fuel_level)
    total_fuel = total_fuel + fuel_level
  end

  -----------------------------------------------------------
  -- 選択スロットから燃料を補給して、補給量を記憶するよ
  -- 補給する時はかならずこっちを使うようにしないとあかんで
  -- turtle.refuel()を直接使ってしまうと、補給量を記憶できんねん
  -- @param quantity 補給するアイテムの数
  -- @return turtle.refuel()の戻り値
  -----------------------------------------------------------
  function hokyu.refuel(quantity)
    quantity = quantity or math.huge
    local pre_level = turtle.getFuelLevel() -- 補給前の燃料レベルを覚えとくよ
    local result =  turtle.refuel()
    total_fuel = total_fuel + turtle.getFuelLevel() - pre_level -- 補給量を加算するで
    return result
  end

  -----------------------------------------------------------
  -- hokyu()のループ内容やで
  --
  -- @param take_fuel [in]燃料を補給する関数やで
  -- @param threashold [in]燃料補給する閾値やで
  -- @param enough [in]補給後の必要量や
  -----------------------------------------------------------
  function hokyu.hokyu_(take_fuel, threashold, enough)
    if turtle.getFuelLevel() >= threashold then return end -- 燃料があったら何もしないよ

    -- 補給するよ
    print('hokyu suruyo ('.. getFuelLevelString() ..')')

    while true do -- 必要量を超えるまで補給するで
      local selected_slot = turtle.getSelectedSlot() -- 選択スロットを覚えとくよ
      turtle.select(16) -- インベントリの最後のスロットを使うよ
      if take_fuel() and self.refuel() then -- 燃料補給するよ
        print('hokyu sitayo ('.. getFuelLevelString() ..')')
      else
        print('hara hetta') -- 燃料ないよー
      end
      turtle.select(selected_slot) -- 乙女のたしなみや
      if turtle.getFuelLevel() >= enough then break end -- 必要量以上なら補給終わりや
      self.sleep(self.wait)
    end
  end

  -----------------------------------------------------------
  -- 燃料がなかったら補給するよ<br>
  --
  -- 燃料がthreasholdより低かったら補給を開始するよ。
  -- enoughを超えるまで補給するよ。
  -- 引数省略時はselfの値を使うよ
  --
  -- @param threashold [in]燃料補給する閾値やで
  -- @param enough [in]補給後の必要量や
  -----------------------------------------------------------
  function hokyu.hokyu(threashold, enough)
    -- 引数の初期化
    threashold = threashold or self.threashold
    enough = enough or self.enough

    local takeFuel = turtleapis.SUCK[self.direction]
    while true do -- メインループや
      self.hokyu_(takeFuel, threashold, enough)
      self.sleep(self.wait) -- しばらく待機するで
    end
  end

  return self
end