Computer Craft のメモ
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ただいまコメントを受けつけておりません。
dofile("lib_log"); dofile("lib_turtle_0.2.4"); local manText = [[ NAME tr - Turtle Runner SYNOPSIS tr [options] [FILE] DESCRIPTION tr is a program which operates a turtle using the script which can be described by a few keystrokes. The script for tr consists of COMMANDS in which a name is extremely short. For example, forward is defined as "f", turnLeft is "l" and placeDown is "p2". Moreover, control syntax is also prepared for tr. (Although it is only a repetition.) The following example is the script which perform tofu construction. s1 (up2 ((fp2)4 r (fp2)3 r)2)3 fr (fp2)2 lfp2l fp2 rf p2rf dd p0 blbbd s2p1 rflfr e1fe0f ll s3p1 lbl *** Set items as follows. *** slot1 : block x 48 slot2 : bed x 1 slot3 : door x 1 When tr is executed, without specifying a FILE, the prompt for script is displayed. After the input of a script, the prompt for file name is displayed. If you don't want to save, press the Enter key, with no input. options --help display this help and exit. --demo interactive input mode with "tofu construction" example. FILE optional. The path of a script file. COMMANDS f - <f>orward b - <b>ack l - turn <l>eft r - turn <r>ight u - <u>p d - <d>own s[slot] - <s>elect slot - 1 ~ 16 p[side] - <p>lace side - 0:up, 1:front, 2:down t[side],[count] - <t>hrow (= drop) side - 0:up, 1:front, 2:down count e[side] - <e>xcavate (= dig) side - 0:up, 1:front, 2:down z[millisecond] - <z>zz = sleep o[side],[value] - set redstone <o>utput side - 0:up, 1:front, 2:down, 3:left, 4:back, 5:right value - 0:off, 1:on k[side] - suc<k> side - 0:up, 1:front, 2:down a[side] - <a>ttack side - 0:up, 1:front, 2:down v[id] - user e<v>ent id - Control syntax (xx)[loopCount] - loop loopCount - loop count. AUTHOR kssr (http://cct.blog.shinobi.jp) REPORTING BUGS Report bugs to <http://cct.blog.shinobi.jp>. COPYRIGHT Copyright (C) 2014 kssr (http://cct.blog.shinobi.jp) SEE ALSO http://cct.blog.shinobi.jp ]]; local function split(src, sepalator) local ret = { }; local bgnIdx = 1; repeat local endIdx = src:find(sepalator, bgnIdx, true); if nil == endIdx then endIdx = #src + 1; end table.insert(ret, src:sub(bgnIdx, endIdx - 1)); bgnIdx = endIdx + 1; until #src < bgnIdx; return ret; end local KNtC = { }; for i = 0, 256 do local name = keys.getName(i); if nil ~= name then KNtC[name] = i; end end local pages = { }; local function makePages() local w, h = term.getSize(); w = w - 1; h = h - 1; local current = { }; local beginIdx = 1; local lines = split(manText, "\n"); for _, val in ipairs(lines) do local indent = 0; for j = 1, #val do if " " ~= val:sub(j, j) then indent = j - 1; val = val:sub(j); break; end end local x = 1; local BLANK = " "; while true do if #val < x then break; end table.insert(current, BLANK:rep(indent) .. val:sub(x, math.min(x + w - indent - 1, #val))); x = x + w - indent; if h == #current then table.insert(pages, current); current = { }; end end end if 0 < #current then table.insert(pages, current); end end local function isOneOf(val, possibleValues) for _, v in ipairs(possibleValues) do if val == v then return true; end end return false; end local pageIdx = 1; local function man() while true do term.clear(); term.setCursorPos(1, 1); term.setBackgroundColor(colors.black); term.setTextColor(colors.white); local w, h = term.getSize(); local BLANK = " "; for i, val in ipairs(pages[pageIdx]) do term.setCursorPos(1, i); term.write(val .. string.rep(BLANK, w - #val)); end for i = #pages[pageIdx] + 1, h do term.setCursorPos(1, i); term.write(string.rep(BLANK, w)); end term.setCursorPos(1, h); term.setTextColor(colors.black); term.setBackgroundColor(colors.white); term.write(" [b]ack, [n]ext, [q]uit / page : " .. pageIdx .. " of " .. #pages .. "."); while true do local event, scanCode = os.pullEvent("key"); -- key name -- http://computercraft.info/wiki/Keys_(API) if isOneOf(scanCode, { KNtC.up, KNtC.left, KNtC.p, KNtC.b, KNtC.w, KNtC.a }) then pageIdx = math.max(pageIdx - 1, 1); break; elseif isOneOf(scanCode, { KNtC.down, KNtC.right, KNtC.n, KNtC.f, KNtC.s, KNtC.d, KNtC.space }) then pageIdx = math.min(pageIdx + 1, #pages); break; elseif isOneOf(scanCode, { KNtC.q, KNtC.e }) then term.setBackgroundColor(colors.black); term.setTextColor(colors.white); term.clear(); term.setCursorPos(1, 1); return; end sleep(0.5); end end end local function interactiveScriptInputMode(history) local input = history; while true do print("input command or type ? >"); if nil ~= input and "" ~= input then print("** In order to re-display your script,"); print("** press the 'up' cursor key."); end input = read(nil, { input }); if string.find(input, "?", 1, true) then man(); else if nil ~= input then script = input; else script = ""; end break; end end return script; end local function interactiveFileNameInputMode() local pass = false; local input; local exitFlg = false; while true do print("Input script name if you want to save. >"); input = read(nil, { input }); if nil == input then fileName = ""; pass = true; elseif "" ~= input and fs.exists(input) then while true do print("file exists. [o]verwrite, [n]ame other, [d]on't save, [q]uit"); local ip2 = read(); if "o" == ip2 then fileName = input; pass = true; break; elseif "n" == ip2 then break; elseif "d" == ip2 then print("Don't save."); fileName = ""; pass = true; break; elseif "q" == ip2 then print("Quit."); exitFlg = true; pass = true; break; else print("Wrong input. retry."); end end else fileName = input; break; end if pass then break; end end return fileName, exitFlg; end local tArgs = { ... }; makePages(); local script; local fileName = ""; local history = ""; local exitFlg; if isOneOf("--help", tArgs) then man(); return; elseif isOneOf("--demo", tArgs) then history = "s1 (up2 ((fp2)4 r (fp2)3 r)2)3 " .. "fr (fp2)2 lfp2l fp2 rf p2rf dd p0 " .. "blbbd s2p1 rflfr e1fe0f ll s3p1 lbl"; elseif 1 == #tArgs then fileName = tArgs[1]; end if "" ~= fileName then local hFile = fs.open(fileName, "r"); local txt = hFile.readAll(); hFile.close(); script = txt; else script = interactiveScriptInputMode(history); fileName, exitFlg = interactiveFileNameInputMode(); if exitFlg then return; end if "" ~= fileName then local hFile = fs.open("/" .. fileName, "w"); hFile.writeLine(script); hFile.close(); end end if "" ~= script then doCommand(script); print("tr was completed."); else print("script is empty."); end