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/glass mac
From ATITD7
Jump to navigationJump to searchdofile("screen_reader_common.inc"); dofile("ui_utils.inc"); window_w = 285; window_h = 415; temp_width = 75; tol = 6500; -- It will make the first in the list if available, otherwise the next, etc -- This will let you make, e.g. Rods on your Soda Glass and Sheet Glass on your normal, by putting -- sheet glass before rods (on soda it'll fail to find sheet) item_priority = {"GlassMakeSheet.png", "GlassMakePipe.png", "GlassMakeWine.png", "GlassMakeTorch.png","GlassMakeJar.png", "GlassMakeRod.png", "GlassMakeBlade.png", "GlassMakeFineRod.png", "GlassMakeFinePipe.png"}; -- max temperature in which we will contine heating it, wait until it gets below this before adding max_add_temp = 2300; -- minimum temperature in which we will start a new project, otherwise will reheat min_new_temp = 1750; tick_time = 3000; function ocrNumber(x, y) -- find first number local digit=nil; local offset=0; while (not digit) and (offset < 10) do for i=0, 9 do local pos = srFindImageInRange(i .. ".png", x, y, 6, 9, tol); if pos then digit=i; break; end end if not digit then x = x+1; offset = offset + 1; end end if (offset > 0) then lsPrintln("Perf warning: OCR non-0 offset of " .. offset); end local ret = digit; while 1 do digit = nil; x = x + 7; for i=0, 9 do local pos = srFindImageInRange(i .. ".png", x, y, 6, 9, tol); if pos then digit=i; break; end end if digit then ret = ret * 10 + digit; else break; end end return ret; end function addCC(window_pos, state) if state.just_added then return; end -- lsPrintln(window_pos[0] .. " " .. window_pos[1] .. " " .. window_w .. " " .. window_h); local pos = srFindImageInRange("GlassAdd2Charcoal.png", window_pos[0], window_pos[1], window_w, window_h, tol); state.just_added = 1; srClickMouseNoMove(pos[0]+5, pos[1]+2); state.status = state.status .. " Added 2 CC"; end function glassTick(window_pos, state) state.status = ""; local pos; local out_of_glass = nil; if state.want_spike then state.timer = state.timer - (tick_time / 1000); end pos = srFindImageInRange("GlassTimeToStop.png", window_pos[0], window_pos[1], window_w, window_h, tol); if pos then out_of_glass = 1; end pos = srFindImageInRange("GlassTemperature.png", window_pos[0], window_pos[1], window_w, window_h, tol); if not pos then state.status = state.status .. " No temperature found, ignoring"; return state.status; end local temp = ocrNumber(pos[0] + temp_width, pos[1]); state.status = (state.status .. " Temp:" .. temp); nothing_cooking = srFindImageInRange("GlassNothingCooking.png", window_pos[0]-5, window_pos[1], window_w, window_h, tol); if (stop_cooking or out_of_glass) and nothing_cooking then return nil; end -- Monitor temperature local last_frame_just_added = state.just_added; if state.last_temp then local fell = temp < state.last_temp; local rose = temp > state.last_temp; if fell then state.status = state.status .. " (fell)"; state.spiking = nil; end if rose then state.status = state.status .. " (rose)"; end -- if just fell, and under max threshold, add 1 CC if fell and (temp < max_add_temp) then state.status = state.status .. " Fell,Adding"; addCC(window_pos, state); end -- if just fell, and is under 1600+threshold, add one -- item, add another and wait for spike or fall if fell and (temp < min_new_temp) then -- addCC(window_pos, state); -- done above state.timer = 72; state.want_spike = 1; state.status = state.status .. " WaitingToSpike"; end --if it's time to add for spike, add if state.want_spike and state.timer <= 0 then state.want_spike = nil; state.spiking = 1; state.timer = 0; addCC(window_pos, state); end end if state.want_spike then state.status = state.status .. " (wait to spike: " .. state.timer .. ")"; end if state.spiking then state.status = state.status .. " (spiking)"; end state.last_temp = temp; if last_frame_just_added then state.just_added = nil; end -- Monitor what we're making if nothing_cooking then state.status = state.status .. " NothingCooking"; if not stop_cooking then if temp > 1600 and temp < 2400 then local made_one=nil; for item_index=1, #item_priority do pos = srFindImageInRange(item_priority[item_index], window_pos[0], window_pos[1], window_w, window_h, tol); if pos then state.status = state.status .. " Making:" .. item_priority[item_index]; srClickMouseNoMove(pos[0]+5, pos[1]+2); made_one = 1; break; end end if not made_one then state.status = state.status .. " NothingToMake"; -- refresh window srClickMouseNoMove(window_pos[0], window_pos[1]); end else state.status = state.status .. " (temp out of range)"; end end else -- Something cooking, leave it be state.status = state.status .. " InUse"; end state.last_nothing_cooking = nothing_cooking; lsPrintln(state.status); return state.status; -- keep going and return status end function allowReorder(x, y) local z = 0 local scale=0.7; local dy = 26; lsPrint(x, y, z, scale, scale, 0xFFFFFFff, "Click an item to raise priority"); y=y+20; x=x+5; local item_index; for item_index=1, #item_priority do if lsButtonText(x, y, z, 100, 0xFFFFFFff, string.sub(string.sub(item_priority[item_index], 10), 1, -5)) then if item_index > 1 then local temp = item_priority[item_index-1]; item_priority[item_index-1] = item_priority[item_index]; item_priority[item_index] = temp; end end -- debug code for checking image matching if false then local list = findAllImages(item_priority[item_index], tol); lsPrint(x+110, y, z, scale, scale, 0xFFFFFFff, #list); end y=y+dy; end end function testReorder() while 1 do lsSleep(100); allowReorder(10, 10); checkBreak(); lsDoFrame(); end end function doit() -- testReorder(); askForWindow("Pin your benches, put the cursor over the ATITD window, press Shift. Then add charcoal until the benches are hot enough, melt your materials, an as it cools back down into useable temperature ranges, the macro will take over. Please pause the macro when you need to use your mouse. Self Click, Options, Interface Options, Notifications: \"Use the chat area instead of popups\" MUST be CHECKED!"); srReadScreen(); local glass_windows = findAllImages("ThisIs.png"); if #glass_windows == 0 then error 'Could not find any \'Glazier\'s Bench\' windows.'; end local glass_state = {}; for window_index=1, #glass_windows do glass_state[window_index] = {}; end local last_ret = {}; while 1 do -- Tick srReadScreen(); --Mark clickAll("ThisIs.png", 1); lsSleep(200); local glass_windows2 = findAllImages("ThisIs.png"); local should_continue=nil; if #glass_windows == #glass_windows2 then for window_index=1, #glass_windows do local r = glassTick(glass_windows[window_index], glass_state[window_index]); last_ret[window_index] = r; if r then should_continue = 1; end end end -- Display status and sleep local start_time = lsGetTimer(); while tick_time - (lsGetTimer() - start_time) > 0 do time_left = tick_time - (lsGetTimer() - start_time); lsPrint(10, 6, 0, 0.7, 0.7, 0xB0B0B0ff, "Hold Ctrl+Shift to end this script."); lsPrint(10, 18, 0, 0.7, 0.7, 0xB0B0B0ff, "Hold Alt+Shift to pause this script."); lsPrint(10, 30, 0, 0.7, 0.7, 0xFFFFFFff, "Waiting " .. time_left .. "ms..."); if not (#glass_windows == #glass_windows2) then lsPrintWrapped(10, 45, 5, lsScreenX-15, 1, 1, 0xFF7070ff, "Expected " .. #glass_windows .. " windows, found " .. #glass_windows2 .. ", not ticking."); elseif not should_continue then lsPrint(10, 45, 5, 1.5, 1.5, 0x70FF70ff, "All benches done."); end for window_index=1, #glass_windows do if last_ret[window_index] then should_continue = 1; lsPrint(10, 80 + 15*window_index, 0, 0.7, 0.7, 0xFFFFFFff, "#" .. window_index .. " - " .. last_ret[window_index]); else lsPrint(10, 80 + 15*window_index, 0, 0.7, 0.7, 0xFFFFFFff, "#" .. window_index .. " - COOL DOWN"); end end if lsButtonText(lsScreenX - 110, lsScreenY - 60, z, 100, 0xFFFFFFff, "Finish up") then stop_cooking = 1; end if lsButtonText(lsScreenX - 110, lsScreenY - 30, z, 100, 0xFFFFFFff, "End script") then error "Clicked End Script button"; end allowReorder(10, 100+15*#glass_windows); checkBreak(); lsDoFrame(); lsSleep(25); end checkBreak(); -- error 'done'; end end function clickAll(image_name, up) -- Find buttons and click them! srReadScreen(); xyWindowSize = srGetWindowSize(); local buttons = findAllImages(image_name); if #buttons == 0 then error 'Could not find any \'Rock Saw\' windows.' --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