The Wiki for Tale 6 is in read-only mode and is available for archival and reference purposes only. Please visit the current Tale 11 Wiki in the meantime.
If you have any issues with this Wiki, please post in #wiki-editing on Discord or contact Brad in-game.
User:Teti
Macros
Barley with fert
-- Edit these first 2 to adjust how much is planted in a pass -- May need to adjust walk_time in Barley_common.inc if you move too slowly to keep up -- grids tested: 2x2, 3x3, 5x5, 6x6 (probably need 3+ dex and 600ms walk time) grid_w = 5; grid_h = 5; watered = {};
loadfile("luaScripts/Flax_common.inc")(); loadfile("luaScripts/screen_reader_common.inc")(); loadfile("luaScripts/ui_utils.inc")();
function promptBarleyNumbers(is_plant) scale = 1.0;
local z = 0; local is_done = nil; local value = nil; -- Edit box and text display while not is_done do -- Put these everywhere to make sure we don't lock up with no easy way to escape! checkBreak("disallow pause");
lsPrint(10, 10, z, scale, scale, 0xFFFFFFff, "Choose passes and grid size");
-- lsEditBox needs a key to uniquely name this edit box -- let's just use the prompt! -- lsEditBox returns two different things (a state and a value) local y = 40; lsPrint(5, y, z, scale, scale, 0xFFFFFFff, "Passes:"); is_done, num_loops = lsEditBox("passes", 100, y, z, 50, 30, scale, scale, 0x000000ff, 5); if not tonumber(num_loops) then is_done = nil; lsPrint(10, y+18, z+10, 0.7, 0.7, 0xFF2020ff, "MUST BE A NUMBER"); num_loops = 1; end y = y + 32;
lsPrint(5, y, z, scale, scale, 0xFFFFFFff, "Grid size:"); is_done, grid_w = lsEditBox("grid", 100, y, z, 50, 30, scale, scale, 0x000000ff, grid_w); if not tonumber(grid_w) then is_done = nil; lsPrint(10, y+18, z+10, 0.7, 0.7, 0xFF2020ff, "MUST BE A NUMBER"); grid_w = 1; grid_h = 1; end grid_w = tonumber(grid_w); grid_h = grid_w; y = y + 32;
if lsButtonText(170, y-32, z, 100, 0xFFFFFFff, "OK") then is_done = 1; end
if is_plant then lsPrintWrapped(10, y, z+10, lsScreenX - 20, 0.7, 0.7, 0xD0D0D0ff, "This will plant and harvest a " .. grid_w .. "x" .. grid_w .. " grid of Barley " .. num_loops .. " times, requiring " .. (grid_w * grid_w) .. " raw barley and ".. (grid_w * grid_w * num_loops * 4) .. "water in jugs, doing " .. (grid_w*grid_w*num_loops) .. " harvests."); else lsPrintWrapped(10, y, z+10, lsScreenX - 20, 0.7, 0.7, 0xD0D0D0ff, "This will plant a " .. grid_w .. "x" .. grid_w .. " grid of Flax " .. num_loops .. " times, requiring " .. (grid_w * grid_w) .. " seeds, yielding " .. (grid_w * grid_w * num_loops) .. " seeds."); end
if is_done and (not num_loops or not grid_w) then error 'Canceled'; end
if lsButtonText(lsScreenX - 110, lsScreenY - 30, z, 100, 0xFFFFFFff, "End script") then error "Clicked End Script button"; end
lsDoFrame();
lsSleep(10); -- Sleep just so we don't eat up all the CPU for no reason
end
end
function doit()
promptBarleyNumbers(1); askForWindow("Make sure the plant barley window is pinned and you are in F8F8 cam zoomed in. You may need to F12 at low resolutions or hide your chat window (if it starts planting and fails to move downward, it probably clicked on your chat window). Will plant grid NE of current location. 'Plant all crops where you stand' must be ON. 'Right click pins/unpins a menu' must be ON."); lsSleep(1000); delay_time = 2000; local x = 1; local y = 1; initGlobals(); -- Find the plant barley button srReadScreen(); local imgBarley = "barley.png"; local xyPlantBarley = srFindImage(imgBarley); if not xyPlantBarley then error 'Could not find plant window'; end xyPlantBarley[0] = xyPlantBarley[0] + 5;
for loop_count=1, num_loops do local start_time = lsGetTimer(); harvested = 0;
-- Init watered array to 0 for y=grid_h, 1, -1 do
for x=grid_w, 1, -1 do watered[x+((y-1)*grid_w)] = 1; end end
-- Local variables
local xyCenter = getCenterPos(); local xyBarleyMenu = {}; xyBarleyMenu[0] = xyCenter[0] - 43; xyBarleyMenu[1] = xyCenter[1] + 0; local dxi=1; local dt_max=grid_w; local dt=grid_w; local dx={1, 0, -1, 0}; local dy={0, -1, 0, 1}; local num_at_this_length = 3; local x_pos = 0; local y_pos = 0; for y=1, grid_h do for x=1, grid_w do lsPrintln('doing ' .. x .. ',' .. y .. ' of ' .. grid_w .. ',' .. grid_h); statusScreen("Planting " .. x .. ", " .. y);
-- Plant
lsPrintln('planting ' .. xyPlantBarley[0] .. ',' .. xyPlantBarley[1]); setWaitSpot(xyBarleyMenu[0], xyBarleyMenu[1]); srClickMouseNoMove(xyPlantBarley[0], xyPlantBarley[1], 0); srSetMousePos(xyBarleyMenu[0], xyBarleyMenu[1]); waitForChange(); -- Bring up menu lsPrintln('menu ' .. xyBarleyMenu[0] .. ',' .. xyBarleyMenu[1]); setWaitSpot(xyBarleyMenu[0]+5, xyBarleyMenu[1]); srClickMouse(xyBarleyMenu[0], xyBarleyMenu[1], 0); waitForChange();
-- Check for window size window_w = 214; window_h = 218;
-- Pin lsPrintln('pin ' .. (xyBarleyMenu[0]+5) .. ',' .. xyBarleyMenu[1]); srClickMouseNoMove(xyBarleyMenu[0]+5, xyBarleyMenu[1]+0, 1);
-- Move window local pp = pinnedPos(x, y); lsPrintln('move ' .. (xyBarleyMenu[0]+5) .. ',' .. xyBarleyMenu[1] .. ' to ' .. pp[0] .. ',' .. pp[1]); drag(xyBarleyMenu[0] + 5, xyBarleyMenu[1], pp[0], pp[1], 0);
-- Add 2 water now srReadScreen(); local barleyAddButton = srFindImageInRange("BarleyAdd.png", pp[0], pp[1], 200, 100); local barleyWater = srFindImageInRange("barleyWater.png", pp[0], pp[1] - 50, 220, 150);
srClickMouseNoMove(barleyAddButton[0]+8, barleyWater[1]);
srClickMouseNoMove(barleyAddButton[0]+8, barleyWater[1]); srClickMouseNoMove(barleyAddButton[0]+8, barleyWater[1]+20); srClickMouseNoMove(barleyAddButton[0]+8, barleyWater[1]+20);
watered[x+((y-1)*grid_w)] = watered[x+((y-1)*grid_w)] + 2;
-- move to next position if not ((x == grid_w) and (y == grid_h)) then lsPrintln('walking dx=' .. dx[dxi] .. ' dy=' .. dy[dxi]); x_pos = x_pos + dx[dxi]; y_pos = y_pos + dy[dxi]; srClickMouseNoMove(xyCenter[0] + walk_px_x*dx[dxi], xyCenter[1] + walk_px_y*dy[dxi], 0); lsSleep(walk_time); dt = dt - 1; if dt == 1 then dxi = dxi + 1; num_at_this_length = num_at_this_length - 1; if num_at_this_length == 0 then dt_max = dt_max - 1; num_at_this_length = 2; end if dxi == 5 then dxi = 1; end dt = dt_max; else lsPrintln('skipping walking, on last leg'); end end checkBreak(); end
end
statusScreen("Refocusing windows..."); -- Bring windows to front for y=grid_h, 1, -1 do for x=grid_w, 1, -1 do local rp = refreshPosUp(x, y); srClickMouseNoMove(rp[0], rp[1], 0); lsSleep(refocus_click_time); end end lsSleep(refocus_time); -- Wait for last window to bring to the foreground before clicking again -- Barley has been planted, pinned and refocused while 1 do for y=1, grid_h do for x=1, grid_w do local pp = pinnedPos(x, y); local rp = refreshPosDown(x, y); srClickMouse(rp[0],rp[1]); lsSleep(200); srReadScreen(); local leftBar = srFindImageInRange("barleyBarLeft.png", pp[0], pp[1] - 50, 120, 100); if leftBar then leftBar[0] = leftBar[0] + 4; end local rightBar = srFindImageInRange("barleyBarRight.png", pp[0], pp[1] - 50, 220, 200); if rightBar then rightBar[0] = rightBar[0] + 1;
end
if not rightBar then error 'Could not find rightbar'; end local barleyWater = srFindImageInRange("barleyWater.png", pp[0], pp[1] - 50, 220, 150); if not barleyWater then error 'Could not find water button'; end local barleyAddButton = srFindImageInRange("BarleyAdd.png", pp[0], pp[1], 200, 100); if not barleyAddButton then error 'Could not find add button'; end while 1 do if leftBar then waterBlue = 0; if rightBar then if barleyWater then srReadScreen(); for i=leftBar[0],rightBar[0] do pxval = srReadPixelFromBuffer(i, barleyWater[1]); b = (math.floor(pxval/256) % 256); if b > 220 then waterBlue = waterBlue + 1; end end waterBlue = (waterBlue/(rightBar[0]-leftBar[0])*100); end end end checkBreak();
if watered[x+((y-1)*grid_w)] < 6 then
statusScreen("Watering " .. x .. "," .. y .. "step " .. watered[x+((y-1)*grid_w)] .. ".");
if waterBlue < 80 then
if watered[x+((y-1)*grid_w)] == 0 then end
srClickMouseNoMove(barleyAddButton[0]+8, barleyWater[1]); srClickMouseNoMove(barleyAddButton[0]+8, barleyWater[1]+20); watered[x+((y-1)*grid_w)] = watered[x+((y-1)*grid_w)] + 1; lsSleep(100); break; end else
statusScreen("Harvesting " .. x .. "," .. y .. ".");
if waterBlue < 90 then
srClickMouseNoMove(pp[0]+90, pp[1]+90);
lsSleep(100); srClickMouseNoMove(pp[0]+180, pp[1]-25);
if watered[x+((y-1)*grid_w)] == 6 then harvested = 1; end
break; end end end end
end
if harvested == 0 then
statusScreen("Refocusing windows..."); -- Bring windows to front for y=grid_h, 1, -1 do for x=grid_w, 1, -1 do local rp = refreshPosUp(x, y); srClickMouseNoMove(rp[0], rp[1], 0); lsSleep(refocus_click_time); end end
lsSleep(refocus_time); -- Wait for last window to bring to the foreground before clicking again else for x=1, x_pos do srClickMouseNoMove(xyCenter[0] + walk_px_x*-1, xyCenter[1], 0); lsSleep(walk_time); end for x=1, -y_pos do srClickMouseNoMove(xyCenter[0], xyCenter[1] + walk_px_y, 0); lsSleep(walk_time); end break; end end local end_time = lsGetTimer(); statusScreen("Time taken: " .. (end_time-start_time)/1000);
end end