The Wiki for Tale 7 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:Obol/flax stable mac
From ATITD7
Jump to navigationJump to search-- flax_stable.lua v1.2 -- by Jimbly, tweaked by Cegaiel and
-- KasumiGhia, revised by Tallow.
--
-- Plant flax and harvest either flax or seeds.
--
-- Works Reliably: 2x2, 3x3, 4x4, 5x5
-- May Work (depends on your computer): 6x6, 7x7
--
dofile("common.inc");
askText = singleLine([[
flax_stable v1.1 (by Jimbly, tweaked by Cegaiel and KasumiGhia,
revised by Tallow) --
Plant flax and harvest either flax or seeds. --
Make sure the plant flax window is pinned and on the RIGHT side of
the screen. Your Automato window should also be on the RIGHT side
of the screen. You must be 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. Enable Hotkeys on flax must be OFF.
]]);
-- Global parameters set by prompt box.
num_loops = 5;
grid_w = 5;
grid_h = 5;
is_plant = true;
seeds_per_pass = 5;
--imgFlax1 = "Flax:";
--imgFlax1 = "flax_symphony.png";
--imgFlax1 = "Symphony";
imgFlax1 = "Jacob";
flax_seeds = {"Symphony", "Jacob", "Constitution",
"Nile Green", "Old Dog", "Old Egypt",
"SunsetPond"};
imgHarvest = "HarvestThisFlax.png";
imgWeedAndWater = "WeedAndWater.png";
imgWeed = "WeedThisFlaxBed.png";
imgSeeds = "HarvestSeeds.png";
imgUseable = "UseableBy.png";
imgThisIs = "ThisIs.png";
imgUtility = "Utility.png";
imgRipOut = "RipOut.png";
imgUnpin = "UnPin.png";
-- Tweakable delay values
refresh_time = 300; -- Time to wait for windows to update
walk_time = 300;
-- Don't touch. These are set according to Jimbly's black magic.
walk_px_y = 340;
walk_px_x = 380;
xyCenter = {};
xyFlaxMenu = {};
-- The flax bed window
window_w = 174;
window_h = 100;
FLAX = 0;
ONIONS = 1;
plantType = FLAX;
-------------------------------------------------------------------------------
-- initGlobals()
--
-- Set up black magic values used for trying to walk a standard grid.
-------------------------------------------------------------------------------
function initGlobals()
-- Macro written with 1720 pixel wide window
srReadScreen();
xyWindowSize = srGetWindowSize();
local pixel_scale = xyWindowSize[0] / 1720;
lsPrintln("pixel_scale " .. pixel_scale);
walk_px_y = math.floor(walk_px_y * pixel_scale);
walk_px_x = math.floor(walk_px_x * pixel_scale);
local walk_x_drift = 14;
local walk_y_drift = 18;
if (lsScreenX < 1280) then
-- Have to click way off center in order to not move at high resolutions
walk_x_drift = math.floor(walk_x_drift * pixel_scale);
walk_y_drift = math.floor(walk_y_drift * pixel_scale);
else
-- Very little drift at these resolutions, clicking dead center barely moves
walk_x_drift = 1;
walk_y_drift = 1;
end
xyCenter[0] = xyWindowSize[0] / 2 - walk_x_drift;
xyCenter[1] = xyWindowSize[1] / 2 + walk_y_drift;
if plantType == FLAX then
xyFlaxMenu[0] = xyCenter[0] - 43*pixel_scale;
xyFlaxMenu[1] = xyCenter[1] + 0;
else
xyFlaxMenu[0] = xyCenter[0] - 20;
xyFlaxMenu[1] = xyCenter[1] - 10;
end
end
-------------------------------------------------------------------------------
-- checkWindowSize()
--
-- Set width and height of flax window based on whether they are guilded.
-------------------------------------------------------------------------------
window_check_done_once = false;
function checkWindowSize(x, y)
if not window_check_done_once then
srReadScreen();
window_check_done_once = true;
local pos = srFindImageInRange(imgUseable, x-5, y-50, 150, 100)
if pos then
window_w = 166;
window_h = 116;
end
end
end
-------------------------------------------------------------------------------
-- promptFlaxNumbers()
--
-- Gather user-settable parameters before beginning
-------------------------------------------------------------------------------
function promptFlaxNumbers()
scale = 1.0;
local z = 0;
local is_done = nil;
local value = nil;
-- Edit box and text display
while not is_done do
-- Make sure we don't lock up with no easy way to escape!
checkBreak();
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", 110, y, z, 50, 30, scale, scale,
0x000000ff, num_loops);
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", 110, 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 not is_plant then
lsPrint(5, y, z, scale, scale, 0xFFFFFFff, "Seeds per:");
is_done, seeds_per_pass = lsEditBox("seedsper", 110, y, z, 50, 30,
scale, scale, 0x000000ff, 4);
seeds_per_pass = tonumber(seeds_per_pass);
if not seeds_per_pass then
is_done = nil;
lsPrint(10, y+18, z+10, 0.7, 0.7, 0xFF2020ff, "MUST BE A NUMBER");
seeds_per_pass = 1;
end
y = y + 32;
end
is_plant = lsCheckBox(10, y, z+10, 0xFFFFFFff, "Grow Flax", is_plant);
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 Flax " .. num_loops ..
" times, requiring " .. (grid_w * grid_w * num_loops) ..
" seeds, doing " .. (grid_w*grid_w*num_loops) ..
" flax harvests.");
else
local seedTotal = grid_w * grid_h * num_loops * seeds_per_pass
lsPrintWrapped(10, y, z+10, lsScreenX - 20, 0.7, 0.7, 0xD0D0D0ff,
"This will plant a " .. grid_w .. "x" .. grid_w ..
" grid of Flax and harvest it " .. seeds_per_pass ..
" times, requiring " .. (grid_w * grid_w) ..
" seeds, and repeat this " .. num_loops ..
" times, yielding " .. seedTotal .. " seed harvests.");
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(tick_delay);
end
end
-------------------------------------------------------------------------------
-- getPlantWindowPos()
-------------------------------------------------------------------------------
lastPlantPos = null;
seedImage = imgFlax1;
function getPlantWindowPos()
srReadScreen();
local plantPos = 0
for item_index=1, #flax_seeds do
plantPos = findText(flax_seeds[item_index])
if plantPos then
break
end
end
--local plantPos = findText(seedImage);
if plantPos then
plantPos[0] = plantPos[0] + 10;
else
plantPos = lastPlantPos;
if plantPos then
safeClick(plantPos[0], plantPos[1]);
lsSleep(refresh_time);
end
end
if not plantPos then
error 'Could not find plant window';
end
lastPlantPos = plantPos;
return plantPos;
end
-------------------------------------------------------------------------------
-- getToggle()
--
-- Returns 0 or 2 alternately. Used to slightly shift position of windows
-- while collecting them.
-------------------------------------------------------------------------------
toggleBit = 0;
function getToggle()
if toggleBit == 0 then
toggleBit = 2;
else
toggleBit = 0;
end
return toggleBit;
end
-------------------------------------------------------------------------------
-- doit()
-------------------------------------------------------------------------------
function doit()
promptFlaxNumbers();
askForWindow(askText);
initGlobals();
srReadScreen();
local startPos = findCoords();
if not startPos then
error("ATITD clock not found.\Verify entire clock and borders are visible. Try moving clock slightly.");
end
drawWater();
for loop_count=1, num_loops do
error_status = "";
local finalPos = plantAndPin(loop_count);
dragWindows(loop_count);
harvestAll(loop_count);
walkHome(loop_count, startPos);
drawWater();
end
lsPlaySound("Complete.wav");
end
-------------------------------------------------------------------------------
-- plantAndPin()
--
-- Walk around in a spiral, planting flax seeds and grabbing windows.
-------------------------------------------------------------------------------
function plantAndPin(loop_count)
local xyPlantFlax = getPlantWindowPos();
-- for spiral
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;
local success = true;
for y=1, grid_h do
for x=1, grid_w do
statusScreen("(" .. loop_count .. "/" .. num_loops .. ") Planting " ..
x .. ", " .. y);
success = plantHere(xyPlantFlax, y);
if not success then
break;
end
-- Move to next position
if not ((x == grid_w) and (y == grid_h)) then
lsPrintln('walking dx=' .. dx[dxi] .. ' dy=' .. dy[dxi]);
lsSleep(40);
x_pos = x_pos + dx[dxi];
y_pos = y_pos + dy[dxi];
local spot = getWaitSpot(xyFlaxMenu[0], xyFlaxMenu[1]);
safeClick(xyCenter[0] + walk_px_x*dx[dxi],
xyCenter[1] + walk_px_y*dy[dxi], 0);
spot = getWaitSpot(xyFlaxMenu[0], xyFlaxMenu[1]);
if not waitForChange(spot, 1500) then
error_status = "Did not move on click.";
break;
end
lsSleep(walk_time);
waitForStasis(spot, 1500);
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;
end
else
lsPrintln('skipping walking, on last leg');
end
end
checkBreak();
if not success then
break;
end
end
local finalPos = {};
finalPos[0] = x_pos;
finalPos[1] = y_pos;
return finalPos;
end
-------------------------------------------------------------------------------
-- plantHere(xyPlantFlax)
--
-- Plant a single flax bed, get the window, pin it, then stash it.
-------------------------------------------------------------------------------
function plantHere(xyPlantFlax, y_pos)
-- Plant
lsPrintln('planting ' .. xyPlantFlax[0] .. ',' .. xyPlantFlax[1]);
local bed = clickPlant(xyPlantFlax);
if not bed then
return false;
end
-- Bring up menu
lsPrintln('menu ' .. bed[0] .. ',' .. bed[1]);
if not openAndPin(bed[0], bed[1], 3500) then
error_status = "No window came up after planting.";
return false;
end
-- if plantType == ONIONS then
-- lsPrintln("Onions");
-- lsSleep(200);
-- srReadScreen();
-- local waters = findAllImages("WaterThese.png");
-- for i = 1,#waters do
-- lsPrintln("Water");
-- safeClick(waters[i][0]+5, waters[i][1]+5);
-- end
-- sleepWithStatus(1000, "First Water");
-- end
-- Check for window size
checkWindowSize(bed[0], bed[1]);
-- Move window into corner
stashWindow(bed[0] + 5, bed[1], BOTTOM_RIGHT);
return true;
end
function clickPlant(xyPlantFlax)
local result = xyFlaxMenu;
local spot = getWaitSpot(xyFlaxMenu[0], xyFlaxMenu[1]);
safeClick(xyPlantFlax[0], xyPlantFlax[1], 0);
lsSleep(click_delay);
local plantSuccess = waitForChange(spot, 1500);
if not plantSuccess then
error_status = "No flax bed was placed when planting.";
result = nil;
end
return result;
end
-------------------------------------------------------------------------------
-- dragWindows(loop_count)
--
-- Move flax windows into a grid on the screen.
-------------------------------------------------------------------------------
function dragWindows(loop_count)
statusScreen("(" .. loop_count .. "/" .. num_loops .. ") " ..
"Dragging Windows into Grid HAHA");
arrangeStashed();
end
-------------------------------------------------------------------------------
-- harvestAll(loop_count)
--
-- Harvest all the flax or seeds and clean up the windows afterwards.
-------------------------------------------------------------------------------
function harvestAll(loop_count)
local did_harvest = false;
local harvestLeft = 0;
local seedIndex = 1;
local seedWave = 1;
local lastTops = {};
while not did_harvest do
-- Monitor for Weed This/etc
lsSleep(refresh_time);
srReadScreen();
local tops = findAllImages(imgThisIs);
for i=1,#tops do
safeClick(tops[i][0], tops[i][1]);
lsSleep(click_delay);
end
if is_plant then
harvestLeft = #tops;
else
harvestLeft = (#tops - seedIndex) + 1 +
(#tops * (seeds_per_pass - seedWave));
end
statusScreen("(" .. loop_count .. "/" .. num_loops ..
") Harvests Left: " .. harvestLeft);
lsSleep(refresh_time);
srReadScreen();
if is_plant then
local weeds = findAllImages(imgWeed);
for i=1,#weeds do
--srSetMousePos(weeds[i][0], weeds[i][1]);
safeClick(weeds[i][0], weeds[i][1]);
end
local waters = findAllImages(imgWeedAndWater);
for i=1,#waters do
safeClick(waters[i][0], waters[i][1]);
end
local harvests = findAllImages(imgHarvest);
for i=1,#harvests do
--srSetMousePos(harvests[i][0], harvests[i][1]);
safeClick(harvests[i][0], harvests[i][1]);
lsSleep(refresh_time);
safeClick(harvests[i][0], harvests[i][1] - 15, 1);
end
local seeds = findAllImages(imgSeeds);
for i=1,#seeds do
local seedTop = srFindImageInRange(imgThisIs,
seeds[i][0] - 10, seeds[i][1]-window_h,
window_w, window_h, 5000);
if seedTop then
ripOut(seedTop);
end
end
else
srReadScreen();
local tops = findAllImages(imgThisIs);
if #tops > 0 then
if seedIndex > #tops then
seedIndex = 1;
seedWave = seedWave + 1;
end
local seedPos = srFindImageInRange(imgSeeds,
tops[#tops - seedIndex + 1][0],
tops[#tops - seedIndex + 1][1],
160, 100);
if seedPos and seedWave <= seeds_per_pass then
safeClick(seedPos[0] + 5, seedPos[1]);
lsSleep(harvest_seeds_time);
seedIndex = seedIndex + 1;
end
end
if seedWave > seeds_per_pass then
local seeds = findAllImages(imgThisIs);
for i=1,#seeds do
ripOut(seeds[i]);
end
end
end
if #tops <= 0 then
did_harvest = true;
end
checkBreak();
end
-- Wait for last flax bed to disappear
sleepWithStatus(4000, "(" .. loop_count .. "/" .. num_loops ..
") ... Waiting for flax beds to disappear");
end
-------------------------------------------------------------------------------
-- walkHome(loop_count, finalPos)
--
-- Walk back to the origin (southwest corner) to start planting again.
-------------------------------------------------------------------------------
function walkHome(loop_count, finalPos)
closeAllWindows(0, 0, srGetWindowSize()[0] - lsGetWindowSize()[0] - 100,
srGetWindowSize()[1]);
statusScreen("(" .. loop_count .. "/" .. num_loops .. ") Walking...");
walkTo(finalPos);
-- Walk back
-- for x=1, finalPos[0] do
-- local spot = getWaitSpot(xyCenter[0] - walk_px_x, xyCenter[1]);
-- safeClick(xyCenter[0] - walk_px_x, xyCenter[1], 0);
-- lsSleep(walk_time);
-- waitForStasis(spot, 1000);
-- end
-- for x=1, -(finalPos[1]) do
-- local spot = getWaitSpot(xyCenter[0], xyCenter[1] + walk_px_y);
-- safeClick(xyCenter[0], xyCenter[1] + walk_px_y, 0);
-- lsSleep(walk_time);
-- waitForStasis(spot, 1000);
-- end
end
-------------------------------------------------------------------------------
-- ripOut(pos)
--
-- Use the Utility menu to rip out a flax bed that has gone to seed.
-- pos should be the screen position of the 'This Is' text on the window.
-------------------------------------------------------------------------------
function ripOut(pos)
statusScreen("Ripping Out");
lsSleep(refresh_time);
srReadScreen();
local util_menu = srFindImageInRange(imgUtility, pos[0] - 10, pos[1] - 50,
180, 200, 5000);
if util_menu then
safeClick(util_menu[0] + 5, util_menu[1], 0);
local rip_out = waitForImage(imgRipOut, 1000);
if rip_out then
safeClick(rip_out[0] + 5, rip_out[1], 0);
lsSleep(refresh_time);
safeClick(pos[0], pos[1], 1); -- unpin
lsSleep(refresh_time);
end
end
end