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:Murtha
-- -- To run: -- Copy a recipe from the output of the Thistle Mode -- Update expected_gardens equal to the number you have opened and pinned -- Gardens must all have their buttons visible, can overlap as long as the -- row with "asc" is visible regardlesss of which window was clicked last -- Update "last sun" to be what it is now (0 if night, -- 99 if daylight and open lid, 33 if daylight and closed lid) --
dofile("screen_reader_common.inc"); dofile("ui_utils.inc"); dofile("common.inc");
per_click_delay = 0;
local expected_gardens = 2;
local last_sun = 99;
instructions =
{
0,0,0,0,99,
0,0,0,0,99,
0,0,0,0,33,
0,0,0,0,99,
0,0,0,1,99,
0,0,0,2,99,
0,0,2,0,99,
0,0,0,0,33,
0,0,3,0,33,
0,0,0,0,33,
0,0,1,0,33,
0,0,0,0,99,
0,0,1,4,33,
0,0,0,1,99,
0,0,0,0,99,
0,0,2,1,33,
0,0,0,0,33,
0,0,1,0,33,
0,0,0,0,33,
0,0,0,0,99,
0,0,0,0,99,
0,0,0,0,33,
0,0,0,0,33,
0,0,0,3,33,
0,0,0,0,33,
0,0,3,1,33,
0,0,1,0,33,
0,0,1,2,33,
0,0,0,0,33,
0,0,1,0,33,
0,0,0,0,33,
0,0,0,1,33,
0,0,0,0,99,
0,0,1,0,99,
0,0,0,0,99,
0,0,0,2,99,
0,0,1,0,33,
0,0,1,0,33,
0,0,0,0,33,
0,0,0,1,99,
0,0,0,0,99,};
function clickAll(image_name, up) if nil then lsPrintln("Would click '".. image_name .. "'"); return; -- not clicking buttons for debugging end -- Find buttons and click them! srReadScreen(); xyWindowSize = srGetWindowSize(); local buttons = findAllImages(image_name);
if #buttons == 0 then statusScreen("Could not find specified buttons..."); lsSleep(1500); else statusScreen("Clicking " .. #buttons .. "button(s)..."); if up then for i=#buttons, 1, -1 do srClickMouseNoMove(buttons[i][0]+5, buttons[i][1]+3); lsSleep(per_click_delay); end else for i=1, #buttons do srClickMouseNoMove(buttons[i][0]+5, buttons[i][1]+3); lsSleep(per_click_delay); end end statusScreen("Done clicking (" .. #buttons .. " clicks)."); lsSleep(100); end end
button_names = {"ThistleNit.png", "ThistlePot.png", "ThistleH2O.png", "ThistleOxy.png", "ThistleSun.png"};
local z = 2;
-- Initialize last_mon local mon_w = 10; local mon_h = 152; local last_mon = {}; for x=1, mon_w do last_mon[x] = {}; for y=1, mon_h do last_mon[x][y] = 0; end end
function waitForMonChange(message) if not first_nit then first_nit = srFindImage("ThistleNit.png"); end if not first_nit then error "Could not find first Nit"; end mon_x = first_nit[0] - 25; mon_y = first_nit[1] + 13;
local different = nil; local skip_next = nil; while not different do srReadScreen(); for x=1, mon_w do for y=1, mon_h do newvalue = srReadPixelFromBuffer(mon_x + x, mon_y + y); if not (newvalue == last_mon[x][y]) then different = 1; end last_mon[x][y] = newvalue; end end
if different then -- Make sure the screen was done refreshing and update again lsSleep(60); srReadScreen(); for x=1, mon_w do for y=1, mon_h do last_mon[x][y] = srReadPixelFromBuffer(mon_x + x, mon_y + y); end end end
if (different and skip_next) then skip_next = nil; different = nil; end
lsPrintWrapped(10, 5, 0, lsScreenX - 20, 1, 1, 0xFFFFFFff, message); lsPrintWrapped(10, 60, 0, lsScreenX - 20, 1, 1, 0xFFFFFFff, "Waiting for change..."); if lsButtonText(lsScreenX - 110, lsScreenY - 30, z, 100, 0xFFFFFFff, "End script") then error "Clicked End Script button"; end
if lsButtonText(40, lsScreenY - 60, z, 200, 0xFFFFFFff, "Force tick") then different = 1; end
if lsButtonText(40, lsScreenY - 90, z, 200, 0xFFFFFFff, "Skip tick") then skip_next = 1; end
if lsButtonText(40, lsScreenY - 120, z, 200, 0xFFFFFFff, "Finish up") then finish_up = 1; end
-- display mon pixels for x=1, mon_w do for y=1, mon_h do local size = 2; lsDisplaySystemSprite(1, 10+x*size, 90+y*size, 0, size, size, last_mon[x][y]); end end lsDoFrame(); lsSleep(100); end end
function test()
local loop=0; while 1 do waitForMonChange("tick " .. loop);
statusScreen('Changed!'); lsSleep(1000); loop = loop + 1; end
error 'done'; end
function refillWater() lsSleep(100); srReadScreen(); FindWater = srFindImage("iconWaterJugSmall.png");
if FindWater then statusScreen("Refilling water..."); srClickMouseNoMove(FindWater[0]+3,FindWater[1]-5, right_click); lsSleep(500);
srReadScreen();
FindMaxButton = srFindImage("Maxbutton.png");
if FindMaxButton then srClickMouseNoMove(FindMaxButton[0]+3,FindMaxButton[1]+3, right_click); lsSleep(500); end
end end
function refillWaterBarrel() lsSleep(100); srReadScreen(); FindWater = findText("Draw Water");
if FindWater then statusScreen("Refilling water..."); srClickMouseNoMove(FindWater[0]+30,FindWater[1]+5, right_click); lsSleep(500);
srReadScreen();
FindMaxButton = srFindImage("Maxbutton.png", 5000);
if FindMaxButton then srClickMouseNoMove(FindMaxButton[0]+3,FindMaxButton[1]+3, right_click); lsSleep(500); end end end
function doit()
num_loops = promptNumber("How many passes ?", 1);
askForWindow("Pin any number of thistle gardens, edit thistle_custom with recipe. Macro will always look for water icon to refill jugs. You can optionally pin the Water Barrel menu to refill jugs.");
if not ( #instructions == 41*5) then error 'Invalid instruction length'; end
refillWater(); refillWaterBarrel();
-- test();
for loops=1, num_loops do
clickAll("ThistleAsc.png", nil); lsSleep(100);
srReadScreen(); local buttons = findAllImages("ThistleNit.png");
-- Sanity check if not (#buttons == expected_gardens) then error "Did not find expected number of thistle gardens"; end local buttons2 = findAllImages("ThistlePlantACrop.png"); if not (#buttons2 == #buttons) then error ("Some PlantACrop obscured, found " .. #buttons2 .. ", expected " .. #buttons); end for i=1, #button_names do local buttons2 = findAllImages(button_names[i]); if not (#buttons2 == #buttons) then error ("Some " .. button_names[i] .. " obscured, found " .. #buttons2 .. ", expected " .. #buttons); end end
clickAll("ThistlePlantACrop.png", 1); statusScreen("(" .. loops .. "/" .. num_loops .. ") Doing initial 2s wait..."); lsSleep(2000); waitForMonChange("Getting initial image..."); for i=0, 39 do for j=0, 3 do for k=1, instructions[i*5 + j + 1] do clickAll(button_names[j+1], 1); end end if not (instructions[i*5 + 5] == last_sun) then last_sun = instructions[i*5 + 5]; clickAll(button_names[5], 1); end waitForMonChange("(" .. loops .. "/" .. num_loops .. ") Tick " .. i .. " done."); if finish_up then num_loops = loops; end lsSleep(1000); -- Wait a moment after image changes before doing the next tick end
lsSleep(100); clickAll("ThistleAsc.png", nil); lsSleep(500); clickAll("Harvest.png", nil); lsSleep(500);
refillWater(); refillWaterBarrel();
if finish_up then
break;
end
end
lsPlaySound("Complete.wav");
end