Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Edit these first 2 to adjust how much is planted in a pass
- -- May need to adjust walk_time in flax_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;
- is_plant = true;
- seeds_per_pass = 5;
- rip_out_when_done = true;
- loadfile("luaScripts/screen_reader_common.inc")();
- loadfile("luaScripts/ui_utils.inc")();
- xyWindowSize = srGetWindowSize();
- imgFlax1 = "FlaxGeneric.png";
- imgHarvest = "HarvestThisFlax.png";
- imgWeedAndWater = "WeedAndWater.png";
- imgWeed = "WeedThisFlaxBed.png";
- imgSeeds = "HarvestSeeds.png";
- imgHarvestThese = "HarvestThese.png";
- imgWeedThese = "WeedThese.png";
- delay_time = 100;
- screen_refresh_time = 300;
- walk_px_y = 340;
- walk_px_x = 380;
- walk_y_drift = 18;
- walk_x_drift = 14;
- walk_time = 570;
- refocus_time = 500;
- function initGlobals()
- pixel_scale = xyWindowSize[0] / 1720; -- Macro written with 1720 pixel wide window
- 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);
- if (lsScreenX < 1280) then
- -- Have to click way off center in order to not move at high resoltuions
- walk_y_drift = math.floor(walk_y_drift * pixel_scale);
- walk_x_drift = math.floor(walk_x_drift * pixel_scale);
- else
- -- Very little drift at these resolutions, clicking dead center barely moves
- walk_y_drift = 1;
- walk_x_drift = 1;
- end
- end
- -- The flax bed window
- -- T4, guilded?: window_w = 166;
- -- T4, guilded?: window_h = 116;
- window_w = 174;
- window_h = 100;
- refresh_down_y_offs = 4;
- refresh_up_y_offs = 0;
- -- adjust if "plant all guild owned" option is enabled
- 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("UseableBy.png", x-5, y-50, 150, 100)
- if pos then
- window_w = 166;
- window_h = 116;
- end
- end
- end
- function getCenterPos()
- local ret = {};
- ret[0] = xyWindowSize[0] / 2 - walk_x_drift;
- ret[1] = xyWindowSize[1] / 2 + walk_y_drift;
- return ret;
- end
- function setWaitSpot(x0, y0)
- setWaitSpot_x = x0;
- setWaitSpot_y = y0;
- setWaitSpot_px = srReadPixel(x0, y0);
- end
- function waitForChange(timeout)
- if not timeout then
- timeout = 10000000;
- end
- local c=0;
- local timestart = lsGetTimer();
- while srReadPixel(setWaitSpot_x, setWaitSpot_y) == setWaitSpot_px do
- lsSleep(1);
- c = c+1;
- if (lsShiftHeld() and lsControlHeld()) then
- error 'broke out of loop from Shift+Ctrl';
- end
- if lsGetTimer() > timestart + timeout then
- lsPrintln('Timed out waiting.');
- end
- end
- lsPrintln('Waited ' .. c .. 'ms for pixel to change.');
- end
- function drag(x0, y0, x1, y1)
- srSetMousePos(x0, y0);
- setWaitSpot(x1, y1);
- srMouseDown(x0, y0, 0);
- -- lsSleep(15);
- srSetMousePos(x1, y1);
- --lsSleep(50);
- waitForChange(1000);
- srMouseUp(x0, y0, 0);
- --lsSleep(50);
- end
- 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
- -- 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;
- if is_plant or rip_out_when_done then
- lsPrint(5, y, z, scale, scale, 0xFFFFFFff, "Passes:");
- is_done, num_loops = lsEditBox("passes",
- 110, 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
- else
- lsPrint(5, y, z, scale, scale, 0x808080ff, "Passes: 1");
- 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
- -- rip_out_when_done = lsCheckBox(10, y, z+10, 0xFFFFFFff, "Rip out when done", rip_out_when_done);
- -- y = y + 25;
- 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 " .. (grid_w * grid_w * num_loops * seeds_per_pass) .. " 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 safeBegin()
- local oldX = 0;
- local oldY = 0;
- oldX, oldY = srMousePos();
- local at_rest = false;
- local loopCount = 0;
- while not at_rest do
- lsSleep(10);
- local currentX = 0;
- local currentY = 0;
- currentX, currentY = srMousePos();
- at_rest = (currentX == oldX and currentY == oldY);
- oldX = currentX;
- oldY = currentY;
- loopCount = loopCount + 1;
- if loopCount > 200 then
- error "Error: The mouse keeps moving"
- end
- end
- srMouseUp(oldX, oldY);
- end
- function safeClick(x, y, rightClick)
- safeBegin();
- srClickMouseNoMove(x, y, rightClick);
- end
- function safeDrag(sourceX, sourceY, destX, destY)
- safeBegin();
- drag(sourceX, sourceY, destX, destY);
- end
- -- Just testing spiral algorithm, ignore this...
- function spiraltest()
- -- 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;
- -- Plant and pin
- for y=1, grid_h do
- for x=1, grid_w do
- lsPrintln('doing ' .. x .. ',' .. y);
- -- move to next position
- if not ((x == grid_w) and (y == grid_h)) then
- lsPrintln('walking dx=' .. dx[dxi] .. ' dy=' .. dy[dxi]);
- 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
- end
- end
- function doit()
- -- num_loops = promptNumber("How many " .. grid_w .. "x" .. grid_h .. " passes ?", 5);
- promptFlaxNumbers();
- askForWindow("Script by Jimbly with tweaks from Cegaiel, KasumiGhia, and Tallow\n\nMake sure the plant flax window is pinned and on the RIGHT side of the screen. Your VeggieTales 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.");
- initGlobals();
- local went_to_seeds = 0; -- Don't loop if we lost one, it'll mess us up!
- srReadScreen();
- local xyPlantFlax = srFindImage(imgFlax1);
- if not xyPlantFlax then
- error 'Could not find plant window';
- end
- xyPlantFlax[0] = xyPlantFlax[0] + 5;
- local xyCenter = getCenterPos();
- local xyFlaxMenu = {};
- xyFlaxMenu[0] = xyCenter[0] - 43*pixel_scale;
- xyFlaxMenu[1] = xyCenter[1] + 0;
- for loop_count=1, num_loops do
- -- 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 bit = 0;
- -- Plant and pin
- for y=1, grid_h do
- for x=1, grid_w do
- if bit == 0 then
- bit = 2;
- else
- bit = 0;
- end
- lsPrintln('doing ' .. x .. ',' .. y .. ' of ' .. grid_w .. ',' .. grid_h);
- statusScreen("(" .. loop_count .. "/" .. num_loops .. ") Planting " .. x .. ", " .. y);
- -- Plant
- lsPrintln('planting ' .. xyPlantFlax[0] .. ',' .. xyPlantFlax[1]);
- setWaitSpot(xyFlaxMenu[0], xyFlaxMenu[1]);
- safeClick(xyPlantFlax[0], xyPlantFlax[1], 0);
- srSetMousePos(xyFlaxMenu[0], xyFlaxMenu[1]);
- waitForChange();
- -- lsSleep(delay_time);
- -- Bring up menu
- lsPrintln('menu ' .. xyFlaxMenu[0] .. ',' .. xyFlaxMenu[1]);
- setWaitSpot(xyFlaxMenu[0]+5, xyFlaxMenu[1]);
- safeClick(xyFlaxMenu[0], xyFlaxMenu[1], 0);
- waitForChange();
- -- lsSleep(delay_time);
- -- Check for window size
- checkWindowSize(xyFlaxMenu[0], xyFlaxMenu[1]);
- -- Pin
- lsPrintln('pin ' .. xyFlaxMenu[0] .. ',' .. xyFlaxMenu[1]);
- safeClick(xyFlaxMenu[0]+5, xyFlaxMenu[1], 1);
- -- Move window
- srReadScreen();
- local windowList = findAllImages("ThisIs.png");
- if #windowList >= 2 then
- table.remove(windowList, 1);
- end
- for i=1,#windowList do
- lsPrintln('move ' .. windowList[i][0] .. ',' .. windowList[i][1] .. ' to ' .. 20 .. ',' .. (100+bit));
- safeDrag(windowList[i][0], windowList[i][1],
- 20, 100 + bit, 0);
- lsSleep(50);
- end
- -- 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];
- safeClick(xyCenter[0] + walk_px_x*dx[dxi], xyCenter[1] + walk_px_y*dy[dxi], 0);
- lsSleep(walk_time - 50);
- 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();
- end
- -- Move windows into a grid
- local moveX = 1;
- local moveY = 1;
- --local screenWidth = srGetWindowSize()[0];
- lsSleep(25);
- srReadScreen();
- local corner =
- srFindImageInRange("ThisIs.png", 10,
- 40, 100, 100, 5000);
- while corner do
- safeDrag(corner[0], corner[1],
- window_w*(grid_w - moveX + 1),
- window_h*(grid_h - moveY + 1));
- moveX = moveX + 1;
- if moveX > grid_w then
- moveX = 1;
- moveY = moveY + 1;
- end
- lsSleep(25);
- srReadScreen();
- corner =
- srFindImageInRange("ThisIs.png", 10,
- 40, 100, 100, 5000);
- end
- -- Bring windows to front
- -- refocusWindows();
- 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(screen_refresh_time);
- srReadScreen();
- local tops = findAllImages("ThisIs.png");
- for i=1,#tops do
- safeClick(tops[i][0], tops[i][1]);
- lsSleep(50);
- 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(screen_refresh_time);
- srReadScreen();
- if is_plant then
- local weeds = findAllImages(imgWeed);
- for i=1,#weeds do
- safeClick(weeds[i][0], weeds[i][1]);
- --lsSleep(screen_refresh_time);
- end
- local waters = findAllImages(imgWeedAndWater);
- for i=1,#waters do
- safeClick(waters[i][0], waters[i][1]);
- --lsSleep(screen_refresh_time);
- end
- local harvests = findAllImages(imgHarvest);
- for i=1,#harvests do
- safeClick(harvests[i][0], harvests[i][1]);
- lsSleep(screen_refresh_time);
- safeClick(harvests[i][0], harvests[i][1] - 15, 1);
- end
- local seeds = findAllImages(imgSeeds);
- for i=1,#seeds do
- local seedTop = srFindImageInRange("ThisIs.png",
- 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("ThisIs.png");
- if #tops > 0 then
- if seedIndex > #tops then
- seedIndex = 1;
- seedWave = seedWave + 1;
- end
- local seedPos = srFindImageInRange(imgSeeds,
- tops[seedIndex][0],
- tops[seedIndex][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("ThisIs.png");
- for i=1,#seeds do
- ripOut(seeds[i]);
- end
- end
- end
- --if is_plant then
- --end
- if #tops <= 0 then
- did_harvest = true;
- end
- checkBreak();
- end
- -- Remove all windows
- --for i=1,#lastTops do
- -- safeClick(lastTops[i][0], lastTops[i][1], 1);
- --end
- lsSleep(2500); -- Wait for last flax bed to disappear before accidentally clicking on it!
- statusScreen("(" .. loop_count .. "/" .. num_loops .. ") Walking...");
- if went_to_seeds == 0 then
- -- Walk back
- for x=1, x_pos do
- safeClick(xyCenter[0] + walk_px_x*-1, xyCenter[1], 0);
- lsSleep(walk_time);
- end
- for x=1, -y_pos do
- safeClick(xyCenter[0], xyCenter[1] + walk_px_y, 0);
- lsSleep(walk_time);
- end
- end
- if went_to_seeds and not loop_count == num_loops then
- error 'Some of the plants went to seeds, stopping loop'
- end
- end
- lsPlaySound("Complete.wav");
- end
- function ripOut(pos)
- while 1 do
- -- statusScreen(loop_label .. " Ripping out...");
- statusScreen("Ripping Out");
- lsSleep(screen_refresh_time);
- srReadScreen();
- local util_menu = srFindImageInRange("Utility.png", pos[0] - 10, pos[1] - 50, 180, 200);
- if util_menu then
- safeClick(util_menu[0] + 5, util_menu[1], 0);
- while 1 do
- lsSleep(screen_refresh_time);
- srReadScreen();
- local rip_out = srFindImage("RipOut.png");
- if rip_out then
- safeClick(rip_out[0] + 5, rip_out[1], 0);
- lsSleep(refocus_time);
- safeClick(pos[0], pos[1], 1); -- unpin
- lsSleep(screen_refresh_time);
- break;
- end
- checkBreak();
- end
- break;
- end
- checkBreak();
- end
- end
Add Comment
Please, Sign In to add comment