daily pastebin goal
24%
SHARE
TWEET

ComputerCraft Tutorial: btn_ctrl0_2

hevohevo Jan 8th, 2014 94 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- ############################################
  2. -- btn_ctrl
  3. -- version 0.2
  4. -- http://hevohevo.hatenablog.com/
  5.  
  6. -- ################## config ##################
  7. CtrlMonSide = "top"
  8. CtrlMon = peripheral.wrap(CtrlMonSide)
  9. ----------------------------
  10. -- btns[1]  btns[2]  btns[3]
  11. -- btns[4]  btns[5]  btns[6]
  12. -- btns[7]  btns[8]  btns[9]
  13. ----------------------------
  14. Btns = {}
  15. Btns[1] = {name="atk",   cmd="turtle.attack()"}
  16. Btns[2] = {name="dig",   cmd="turtle.dig()"}
  17. Btns[3] = {name="place", cmd="turtle.place()"}
  18. Btns[4] = {name="<=",    cmd="turtle.turnLeft()"}
  19. Btns[5] = {name="suck",  cmd="turtle.suck()"}
  20. Btns[6] = {name="=>",    cmd="turtle.turnRight()"}
  21. Btns[7] = {name="<sel", cmd="turtle.selectPrev()"}
  22. Btns[8] = {name="sel1",  cmd="turtle.select(1)"}
  23. Btns[9] = {name="sel>", cmd="turtle.selectNext()"}
  24.  
  25. -- ################## functions ###############
  26. -- new turtle commands
  27. turtle.select(1)
  28. CurrentSlot = 1 -- for retaining current selected slot number
  29. OrgSelectCmd = turtle.select -- for redefining function
  30.  
  31. function turtle.select(slot) -- redefine function
  32.   CurrentSlot = slot
  33.   OrgSelectCmd(slot)
  34.   print("  slot: ", slot)
  35. end
  36.  
  37. function return1_16(num)
  38.   if (num % 16) == 0 then
  39.     return 16
  40.   else
  41.     return (num % 16)
  42.   end
  43. end
  44.  
  45. function turtle.selectNext() -- define new function
  46.   turtle.select(return1_16(CurrentSlot + 1))
  47. end
  48.  
  49. function turtle.selectPrev() -- define new-function
  50.   turtle.select(return1_16(CurrentSlot - 1))
  51. end
  52.  
  53. -- evaluate a function-string
  54. -- ex. eval("turltle.select(1)")
  55. function eval(s)
  56.   print("  ",s)
  57.   assert(loadstring(s))()
  58. end
  59.  
  60. -- return btns-table
  61. function makeNineButtons(ctrl_mon, Btns)
  62.   local mon_w, mon_h = ctrl_mon.getSize()
  63.   local btn_w = math.floor(mon_w/3)
  64.   local btn_h = math.floor(mon_h/3)
  65.   local btns = {}
  66.   local i=1 -- table index
  67.   for row=1,3 do
  68.     for col=1,3 do
  69.       btns[i] = {
  70.         name=Btns[i]["name"], cmd=Btns[i]["cmd"],
  71.         min_x = 1+(btn_w)*(col-1), min_y = 1+(btn_h)*(row-1),
  72.         max_x = btn_w*col, max_y = btn_h*row}
  73.       i = i+1
  74.     end
  75.   end
  76.   return btns
  77. end
  78.  
  79. function drowButtons(mon, buttons)
  80.   for i,b in pairs(buttons) do
  81.     local center_x = math.floor((b.min_x + b.max_x)/2)
  82.     local center_y = math.floor((b.min_y + b.max_y)/2)
  83.     local center_label = math.floor(string.len(b.name)/2)
  84.     mon.setCursorPos(center_x - center_label, center_y)
  85.     mon.write(b.name)
  86.   end
  87. end
  88.  
  89. -- whichButton(buttons, 1, 1) => btn     (btn-table)
  90. --                            => false   (don't pushed)
  91. function whichButton(buttons, x, y)
  92.   local function within(min_num, max_num, num)
  93.           return (min_num <= num and max_num >= num)
  94.         end
  95.   local pushed_btn = false
  96.  
  97.   for i,v in pairs(buttons) do
  98.     if within(v.min_x, v.max_x, x) and within(v.min_y, v.max_y, y) then
  99.       pushed_btn = v
  100.       break
  101.     end
  102.   end
  103.  
  104.   return pushed_btn
  105. end
  106.  
  107. -- event_name, pushed_btn = pullPushButtonEvent(buttons_table, "top")
  108. function pullPushButtonEvent(buttons, mon_dir)
  109.   local pushed_btn = false
  110.   repeat
  111.     local event, dir, x, y = os.pullEvent("monitor_touch")
  112.     if mon_dir == dir  then
  113.       pushed_btn = whichButton(buttons, x, y)
  114.     end
  115.   until  pushed_btn
  116.  
  117.   return "push_button", pushed_btn
  118. end
  119.  
  120. -- ################## main #####################
  121. -- init ctrl monitor
  122. CtrlMon.setTextScale(0.5)
  123. CtrlMon.clear()
  124.  
  125. -- make buttons and drow on ctrl monitor
  126. local mon_btns = makeNineButtons(CtrlMon, Btns)
  127. drowButtons(CtrlMon, mon_btns)
  128.  
  129. -- main loop
  130. while true do
  131.   local event_name, pushed_btn = pullPushButtonEvent(mon_btns, CtrlMonSide)
  132.   if event_name == "push_button" then
  133.     print("pushed: ",pushed_btn.name)
  134.     eval(pushed_btn.cmd)
  135.   end
  136.  
  137.   sleep(0) -- "monitor_touch" event is too sensitive.
  138. end
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top