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.

Difference between revisions of "User:Selune"

From ATITD6
Jump to navigationJump to search
 
(9 intermediate revisions by the same user not shown)
Line 1: Line 1:
Paint Reaction Template:
+
Selune's Macros have been updated to the TaleScripts repository. Please leave any ideas for improvements or new macros here.
 +
 
 +
{{Collapse top|title=Paint Reaction Template}}
 
<pre>
 
<pre>
 
Cabbage | RedSand | G | -11 | 26
 
Cabbage | RedSand | G | -11 | 26
Line 21: Line 23:
 
Copper | Saltpeter | B | 42 | 4
 
Copper | Saltpeter | B | 42 | 4
 
</pre>
 
</pre>
 +
{{Collapse bottom}}
  
Modified VT PaintWatch:
+
{{Collapse top|title=Fishing Macro for Testing}}
 
<pre>
 
<pre>
--
+
-- Pin up your Lures menu 'Self Click, Skills, Fishing, Use Lure' (no other pinned up windows can exist)
--  
+
-- Should have (Chat-Related): 'Chat and Inventory can be minimized' AND 'Minimized chat-channels are still visible'.
--
+
-- You must have Main Chat tab showing at all times and window is long/wide enough so no lines don't wrap.
 +
 
 +
-- Yes, this macro reads your MAIN chat screen, so make sure you read the above statement for it to work correctly.
 +
-- Each line of text must not scroll/wrap to the next line. If it does, then drag your chat window wider so it doesn't wrap.
 +
-- You want to make your chat very wide. Note: It is possible to see a LONG message like "Though you lost your lure, you did catch a 15 deben Orange Spongefish"
 +
-- Another long message is "You didn't catch anything. You also lost your lure. Try different lures and locations"
 +
-- At 1280x1024 your chat screen should reach at least to the mid point of your screen to avoid having a chat line wrap to next line, for a long message, like above.
 +
-- Higher resolutions may not have to reach quite to the mid point.
 +
 
 +
 
 +
-- ********** This macro writes to a log file (Fishlog.txt) for most actions, so you can review later! ******
 +
-- ********** This also macro writes to a log file (Fishstats.txt) showing stats of your last fishing session, so you can review later! ******
 +
 
 +
 
 +
--You can delete any of the log files if you wish. It will automatically create new ones if they dont exist.
 +
--The fishlog.txt file gets appended everytime you fish, so the file can grow quite long over time.
 +
--The fishstats.txt file gets overwritten everytime your gui program window updates, so it doesn't 'grow' over time.
 +
 
 +
 
 +
-- "Main chat tab is not showing" and other errors can usually be overcome by adjusting the main chat window size and restarting, assuming main chat is showing.
 +
-- And also verify the lines aren't wrapping.
 +
 
 +
 
 +
-- The very first thing this macro does is to Self Click, Special, What Time is it? option. This will then display the time in main chat window.
 +
-- The macro then parses time displayed, in main chat tab, so it can use it while the macro runs (Log files and on screen display).
 +
-- Thats what the mysterious Self Click is doing, its not a bug, it is suppose to do that and thats why, to fetch the time.
 +
 
 +
 
 +
-- Note: These are currently refered to as Common Fish in the below 'SkipCommon' type of fishes (True or False), in the 'Custom Variables' section.
 +
 
 +
--Abdju
 +
--Chromis
 +
--Catfish
 +
--Carp
 +
--Perch
 +
--Phagrus
 +
--Tilapia
 +
 
 +
 
 +
 
 +
--CUSTOM VARIABLES -- EDIT HERE To Change Fishing Casts, Skips, Updates.
 +
 
 +
TotalCasts=3; --Total Casts per lure, if a fish caught. If no fish then it skips.
 +
SkipCommon = false; --Skips to next lure if fish caught is a common (Choose True or False).
 +
LureChangesToUpdateTimer = 7; --Total lures used before time is updated. Zero updates every new lure.
 +
IgnoreUnknown = false; --Continues the script if fish is not recognized
 +
 
 +
--AlmostCaughtAttempts = 0; --Adds additional attempts to the current lure if Unusual, Strange fish are seen;
 +
-- Note: AlmostCaughtAttempts above was already commented out upon arriving to Talescripts.
 +
-- It is also commented out during the script, so uncommenting above will NOT activate the feature.
 +
 
 +
 
 +
 
 +
-- Additional reporting in the log file
 +
-- Choose True or False.
 +
-- Note 'LogStrangeUnusual' and 'LogOdd' (below) overrides LogFails setting. ie if LogStrange true, then it would still log even if LogFails = False
 +
--If LogFails = false and LogStrangeUnusual or LogOdd = true, then failed catches those would still be included in the log file.
 +
 
 +
 
 +
LogFails = true;  -- Do you want to add Failed Catches to log file? 'Failed to catch anything' or 'No fish bit'. Note the log will still add an entry if you lost lure.
 +
LogStrangeUnusual = true; -- Do you want to add Strange and Unusual fish to the log file? Note the log will still add an entry if you lost lure.
 +
LogOdd = true; -- Do you want to add Odd fish to the log file? Note the log will still add an entry if you lost lure.
 +
 
  
--Cabbage | 129, 63, 145  | 8      | Y | bulk    | 10
+
-- END CUSTOM VARIABLES
--Carrot | 225, 113, 33  | 10    | Y | bulk    | 10
 
--Clay | 128, 96, 32    | 4      | Y | bulk    | 20
 
--DeadTongue | 112, 64, 64    | 500    | N | normal  | 4
 
--ToadSkin | 48, 96, 48    | 500    | N | normal  | 4
 
--EarthLight | 128, 240, 224  | 10000  | N | normal  | 4
 
--RedSand | 144, 16, 24    | 10    | Y | bulk    | 20
 
--Lead | 80, 80, 96    | 50    | Y | normal  | 6
 
--Silver | 16, 16, 32    | 50    | N | normal  | 6
 
--Iron | 96, 48, 32    | 30    | Y | normal  | 8
 
--Copper | 64, 192, 192  | 30    | Y | normal  | 8
 
  
--Sulfur      | catalyst      | 10    | Y | normal  | 1
 
--Potash      | catalyst      | 50    | Y | normal  | 1
 
--Lime        | catalyst      | 20    | Y | normal  | 1
 
--Saltpeter  | catalyst      | 10    | Y | normal  | 1
 
  
-- 317, 55, 71
 
--                cj  ca  cl  dt  ts  el  rs  le  si  ir  co  su  po li sp
 
paint_colourR = { 129, 225, 129, 112, 48,  128, 145, 81,  16,  97,  64  };
 
paint_colourG = { 64,  113, 97,  64,  96,  240, 16,  81,  16,  48, 194  };
 
paint_colourB = { 145, 33,  33,  64,  48,  224, 24,  97,  32,  33, 194  };
 
catalyst1 = 12;
 
  
 
loadfile("luaScripts/screen_reader_common.inc")();
 
loadfile("luaScripts/screen_reader_common.inc")();
 
loadfile("luaScripts/ui_utils.inc")();
 
loadfile("luaScripts/ui_utils.inc")();
loadfile("luascripts/common.inc")();
+
loadfile("luaScripts/Fishing_Func.inc")();
  
button_names = {
 
"CabbageJ","Carrot","Clay","DeadTongue","ToadSkin","EarthLight","RedSand",
 
"Lead","SilverP","Iron","Copper","C:Sulfur","C:potash","C:Lime","C:Saltpeter"};
 
  
per_paint_delay_time = 1000;
 
per_read_delay_time = 600;
 
per_click_delay = 10;
 
  
 +
function SetupLureGroup()
  
function doit()
+
TLures = {};
 +
FirstLure="";
 +
LastLure = "";
  
local paint_sum = {0,0,0};
 
local paint_count = 0;
 
local bar_colour = {0,0,0};
 
local expected_colour = {0,0,0};
 
local diff_colour = {0,0,0};
 
local new_px = 0xffffffFF;
 
local px_R = nil;
 
local px_G = nil;
 
local px_B = nil;
 
local px_A = nil;
 
local m_x = 0;
 
local m_y = 0;
 
local update_now = 1;
 
local y=0;
 
local button_push = 0;
 
  
lsSetCaptureWindow();
 
  
askForWindow("Open the paint window. Take any paint away so to start with 'Black'.");
+
 +
srReadScreen();
 +
FindPin = srFindImage("UnPin.png");
 +
if FindPin then
 +
 +
 
 +
--Click the pinup to refresh the lures window
 +
 
 +
srClickMouseNoMove(FindPin[0]+5,FindPin[1]+30);
 +
lsSleep(500);
  
  
 
srReadScreen();
 
srReadScreen();
xyWindowSize = srGetWindowSize();
+
 
local colour_panel = findAllImages("paint-black.png");
+
 
if (#colour_panel == 0) then
+
DownPin = srFindImageInRange("Fishing/Menu_DownArrow.png",FindPin[0]-10,FindPin[1],50,500);
m_x, m_y = srMousePos();
+
if DownPin then
 +
--Just Incase
 +
UpArrow = srFindImageInRange("Fishing/Menu_UpArrow.png",FindPin[0]-10,FindPin[1],50,50);
 +
if UpArrow then
 +
srClickMouseNoMove(UpArrow[0]+5,UpArrow[1]+5);
 +
lsSleep(1000);
 +
srReadScreen();
 +
end
 +
 +
 +
-- srClickMouseNoMove(DownPin[0]+5,DownPin[1]+5);
 +
LastLure=FindLureName(DownPin[0]-150,DownPin[1]-10,150,25);
 +
--error(LastLure);
 +
FirstLure = FindLureName(FindPin[0]-150,FindPin[1]-10,150,25);
 +
-- error(FirstLure);
 +
else
 +
--No Arrows on lure menu?
 +
FirstLure=FindLureName(FindPin[0]-150,FindPin[1]-10,150,25);
 +
LastLure=nil;
 +
end
 
else
 
else
m_x = colour_panel[1][0];
+
error("Didn\'t find Lures pinned window - Self Click->Skills, Fishing -> Use Lure, PIN THIS WINDOW!");
m_y = colour_panel[1][1];
 
 
end
 
end
 +
 +
 +
if  LastLure ~= nil then
 +
--We have last lure, and arrows showing
 +
ChangeLureMenu = LastLure;
 +
 +
 +
FirstLurLoc = srFindImage("fishing/" .. FirstLure);
 +
LastLurLoc = srFindImage("fishing/" .. LastLure);
 +
  
local paint_buttons = findAllImages("paint-button.png");
 
if (#paint_buttons == 0) then
 
error "No buttons found";
 
end
 
  
 +
for i = 1, #Lures,1 do
 +
test = srFindImageInRange(("fishing/" .. Lures[i]),FirstLurLoc[0]-5,FirstLurLoc[1]-5,175,500);
  
while 1 do
+
if test then
lsSetCamera(0,0,lsScreenX*1.5,lsScreenY*1.5);
+
--Add Lure
-- Where to start putting buttons/text on the screen.
+
table.insert(TLures,Lures[i]);
y=0;
+
if Lures[i] == LastLure then
 +
--End of Menu, Use Down Arrow
 +
arrow=srFindImageInRange("Fishing/menu_downarrow.png",test[0],test[1]-5,175,50);
 +
if arrow then
 +
DownArrowLocs = arrow;
 +
srClickMouseNoMove(arrow[0]+5,arrow[1]+5);
 +
lsSleep(1000);
 +
srReadScreen();
 +
lsSleep(1000);
 +
else
 +
error("no arrow found");
 +
end
 +
end
 +
LastLureMenu = Lures[i];
 +
 
 +
end
 +
end
 +
 +
--Reset Lure Menu
 +
UpArrow = srFindImageInRange("Fishing/Menu_UpArrow.png",FindPin[0]-10,FindPin[1],50,50);
 +
if UpArrow then
 +
srClickMouseNoMove(UpArrow[0]+5,UpArrow[1]+5);
 +
end
 
 
if lsButtonText(lsScreenX - 30, lsScreenY - 80, 0, 100, 0xFFFFFFff, "Reset") then
+
else
for i= 1, 10 do
+
--No arrows, just get lures
srClickMouseNoMove(paint_buttons[7][0]+2,paint_buttons[7][1]+2, right_click);
+
for i = 1, #Lures, 1 do
lsSleep(per_click_delay);
+
test = srFindImage("Fishing/" .. Lures[i]);
 +
if test then
 +
table.insert(TLures,Lures[i]);
 
end
 
end
srReadScreen();
 
lsSleep(100);
 
clickAllText("Take the Paint");
 
lsSleep(100);
 
paint_sum = {0,0,0};
 
paint_count = 0;
 
bar_colour = {0,0,0};
 
expected_colour = {0,0,0};
 
diff_colour = {0,0,0};
 
new_px = 0xffffffFF;
 
px_R = nil;
 
px_G = nil;
 
px_B = nil;
 
px_A = nil;
 
m_x = 0;
 
m_y = 0;
 
update_now = 1;
 
 
end
 
end
 +
end
 +
 +
return TLures;
  
-- Create each button and set the button push.
+
end
for i=1, #button_names do
+
 
if lsButtonText(10, y, 0, 250, 0xFFFFFFff, button_names[i]) then
+
function FindLureName(x,y,w,h)
image_name = button_names[i];
+
 
update_now = 1;
+
for i = 1, #Lures, 1 do  
button_push = i;
+
Lure = srFindImageInRange("Fishing/" .. Lures[i], x,y,w,h);
end
+
if Lure then
y = y + 26;
+
return Lures[i]
 
end
 
end
 +
end
 +
end
 +
 +
function GetLure()
 +
 +
srReadScreen();
 +
 +
if CurrentLureIndex == LastLureIndex then
 +
-- Use Down Menu
 +
srClickMouseNoMove(DownArrowLocs[0]-5,DownArrowLocs[1]-5);
 
srReadScreen();
 
srReadScreen();
 +
end
 +
 +
lure = srFindImage("Fishing/" .. PlayersLures[CurrentLureIndex]);
 +
if not lure then
 +
--Failed to find lure
 +
error("Can\'t find a lure!");
 +
else
 +
slure = Lures[PlayersLures[CurrentLureIndex]];
 +
slure = string.sub(slure,string.find(slure,"_")+1,string.len(slure) - 4);
 +
--statusScreen("Using Lure " .. slure);
 +
return slure
 +
end
 +
end
 +
 +
function UseLure()
 +
-- Uses lure according to CurrentLureIndex, which is used in PlayersLures which contains each lure the player has.
 +
 +
 +
if #TLures == 0 then
 +
error 'Can\'t find any lures on the pinned window. Did you run out of lures?'
 +
end
  
  
-- read the bar pixels
+
srReadScreen();
new_px = srReadPixel(m_x, m_y);
+
lure = srFindImage("Fishing/" .. PlayersLures[CurrentLureIndex]);
px_R = (math.floor(new_px/256/256/256) % 256);
 
px_G = (math.floor(new_px/256/256) % 256);
 
px_B = (math.floor(new_px/256) % 256);
 
px_A = (new_px % 256);
 
  
if not(update_now==0) then
+
if lure then
--{
+
srClickMouseNoMove(lure[0]+3,lure[1]+3);
if not (button_push==0) then
+
lsSleep(500);
--{
+
srReadScreen();
-- click the appropriate button to add paint.
+
-- Find Lure Type
srClickMouseNoMove(paint_buttons[button_push][0]+2,paint_buttons[button_push][1]+2, right_click);
+
for i = 1, #Lure_Types, 1 do
lsSleep(per_click_delay);
+
test = srFindImage("Fishing/" .. Lure_Types[i]);
+
if test then
if(button_push < catalyst1) then
+
--Click it!
-- add the paint estimate
+
srClickMouseNoMove(test[0]+3,test[1]+3);
paint_sum[1] = paint_sum[1] + paint_colourR[button_push];
+
gui_refresh();
paint_sum[2] = paint_sum[2] + paint_colourG[button_push];
+
break;
paint_sum[3] = paint_sum[3] + paint_colourB[button_push];
 
paint_count = paint_count + 1.0;
 
end
 
--}
 
 
end
 
end
 +
end
  
-- count up all the pixels.
+
end
lsSleep(per_paint_delay_time);
+
srReadScreen();
+
if PlayersLures[CurrentLureIndex] == ChangeLureMenu then
 +
down = srFindImage("Fishing/Menu_DownArrow.png");
 +
srClickMouseNoMove(down[0]+5,down[1]+5);
 +
lsSleep(1000);
 +
elseif PlayersLures[CurrentLureIndex] == LastLureMenu  then
 +
up = srFindImage("Fishing/Menu_UpArrow.png");
 +
srClickMouseNoMove(up[0]+5,up[1]+5);
 +
CurrentLureIndex=1;
 +
lsSleep(1000);
 +
end
 +
  
bar_colour[1] = #findAllImages("paint-redbarC.png");
+
end
lsSleep(per_read_delay_time/3);
 
bar_colour[2] = #findAllImages("paint-greenbarC.png");
 
lsSleep(per_read_delay_time/3);
 
bar_colour[3] = #findAllImages("paint-bluebarC.png");
 
lsSleep(per_read_delay_time/3);
 
update_now = 0;
 
  
-- tweak/hack because we miss the first pixel
+
function ChatReadFish()
for i=1, 3 do
+
--Find the last line of chat
if(bar_colour[i]>0)then
+
lsSleep(100);
bar_colour[i]=bar_colour[i]+1;
+
srReadScreen();
bar_colour[i]=bar_colour[i]*256.0/259;
+
imgs = findAllImages("fishing/chatlog_reddots.png");
end
+
Coords = imgs[#imgs];
 +
 +
-- Look for the ** red dots in main chat to see if they exist.
 +
if #imgs == 0 then
 +
error 'Main chat tab is not showing or the chat window needs to be adjusted!'
 +
end
 +
 
 +
 +
--Caught Something..  Find Fish Details
 +
Sfish = "";
 +
 +
for i = 1, #CL_Fish do
 +
ChatFish = srFindImageInRange("Fishing/" .. CL_Fish[i],Coords[0] ,Coords[1],500,25);
 +
if ChatFish then
 +
Sfish = string.sub(CL_Fish[i],string.find(CL_Fish[i],"Fish_") + 5,string.len(CL_Fish[i]) - 4);
 +
GrandTotalCaught = GrandTotalCaught + 1
 +
break;
 +
end
 +
end
 +
 +
if  string.len(Sfish) < 1 then
 +
-- This fish name and fishname.png file likely needs to be added to Fishing_Func.inc, under the CL_Fish array and the .png added to /Images/Fishing folder
 +
if IgnoreUnknown then
 +
Sfish = "Unknown";
 +
SNum = "1";
 +
else
 +
error("Unknown Fish! PLEASE, Take screenshot (Alt+C) of main chat tab, share with Talescripts team!");
 +
end
 +
else
 +
--Find Size
 +
for i = #CL_Number,1,-1 do
 +
ChatSize =  srFindImageInRange("fishing/" .. CL_Number[i],Coords[0],Coords[1],500,25);
 +
if ChatSize then
 +
SNum = string.sub(CL_Number[i],string.find(CL_Number[i],"_") + 1, string.len(CL_Number[i]) - 4);
 +
break;
 
end
 
end
 +
end
 +
GrandTotaldb = GrandTotaldb + SNum;
 +
end
 +
 +
return(Sfish .. " (" .. SNum .. "db)");
 +
end
  
  
 
-- New colour has been added, mix in the pot, and see if there's a difference from the expected value.
 
if not (button_push==0) then
 
--{
 
for i=1, 3 do
 
expected_colour[i] = paint_sum[i] / paint_count;
 
diff_colour[i] = math.floor(0.5+bar_colour[i]) - math.floor(0.5+expected_colour[i]);
 
end
 
  
button_push = 0;
+
function findchat(line)
--}
+
--Reads a chat line and returns a basic string for better processing
 +
 +
-- Odd fish means your fly fishing skill is not high enough. Raise it with enormous amounts of fishing.
 +
-- Strange fish means you need a better rod to catch the rish. You may succeed on future attempts.
 +
-- Unusual fish means your speed skill was not high enough to catch this type of fish. If it is almost enough, you may catch them on future casts.
 +
 
 +
 
 +
--Possible fishing messages
 +
-- Caught A (SIZE) Deben (FISH)
 +
-- You almost caught a strange fish
 +
-- (You almost caught a strange fish. You also lost your lure.)
 +
-- You almost caught an unusual fish
 +
-- (You almost caught an unusual fish. You also lost your lure.)
 +
-- You almost caught an odd fish
 +
-- (You almost caught an odd fish. You also lost your lure.)
 +
-- Although you lost your lure  (Caught a fish)
 +
-- Using a (LURE) (TYPE) lure.
 +
-- You are carrying more than you can manage.
 +
-- You are carrying too much bulk.
 +
-- You didn't catch anything.
 +
-- (You didn't catch anything. You also lost your lure.)
 +
-- No Fish Bit.
 +
-- (No Fish Bit. You also lost your lure.)
 +
 
 +
 +
--Find the last line of chat
 +
lsSleep(100);
 +
srReadScreen();
 +
imgs = findAllImages("Fishing/chatlog_reddots.png");
 +
Coords = imgs[#imgs];
 +
 
 +
-- Look for the ** red dots in main chat to see if they exist.
 +
if #imgs == 0 then
 +
error 'Main chat tab is not showing or the chat window needs to be adjusted!'
 +
end
 +
 
 +
 +
if line and line > 0 then
 +
Coords = imgs[(#imgs) - line];
 +
if not Coords then
 +
error 'Main chat tab is not showing or the chat window needs to be adjusted!'
 
end
 
end
--}
+
 
 +
end
 +
 +
--Find What Happened
 +
 
 +
ChatType = "";
 +
 +
for i = 1, #Chat_Types -1,2 do
 +
test = srFindImageInRange("Fishing/" .. Chat_Types[i],Coords[0],Coords[1],500,30);
 +
if test then
 +
--Found Chat
 +
ChatType = Chat_Types[i + 1];
 +
break;
 
end
 
end
 +
end
 +
 +
 +
--Break down!
 +
if ChatType then
 +
--if ChatType == "lure" then
 +
--elseif ChatType == "nofishlostlure" then
 +
--elseif ChatType == "nofish" then
 +
--elseif ChatType == "strange" then
 +
--elseif ChatType == "unusual" then
 +
return ChatType;
 +
else
 +
error(ChatType);
 +
 +
end
 +
 +
 +
 +
end
 +
  
-- Display all the goodies
 
lsPrintWrapped(0, y, 1, lsScreenX, 1, 1, 0xFFFFFFff,
 
" Pixel  RGBA: " .. px_R .. "," .. px_G .. "," .. px_B .. "," .. px_A);
 
y = y + 26;
 
lsPrintWrapped(0, y, 1, lsScreenX, 1, 1, 0xFFFFFFff,
 
" Bar read RGB: " .. math.floor(bar_colour[1]+0.5) .. "," .. math.floor(bar_colour[2]+0.5) .. "," .. math.floor(bar_colour[3]+0.5));
 
y = y + 26;
 
lsPrintWrapped(0, y, 1, lsScreenX, 1, 1, 0xFFFFFFff,
 
" Expected RGB: " .. math.floor(expected_colour[1]+0.5) .. "," .. math.floor(expected_colour[2]+0.5) .. "," .. math.floor(expected_colour[3]+0.5) );
 
y = y + 26;
 
lsPrintWrapped(0, y, 1, lsScreenX, 1, 1, 0xFFFFFFff,
 
" Reactions RGB: " .. math.floor(diff_colour[1]+0.5) .. "," .. math.floor(diff_colour[2]+0.5) .. "," .. math.floor(diff_colour[3]+0.5) );
 
  
 +
function GetTime()
 +
--Reads time stamp using special->what time menu
 +
winsize = srGetWindowSize();
 +
 +
--Open Menu, Press the Esc key to open the Self Click menu
  
if lsButtonText(lsScreenX - 30, lsScreenY - 30, 0, 100, 0xFFFFFFff, "Exit") then
+
-- Move mouse to center of screen before Sending the Esc key, to get the Self Click menu. We dont want it self clicking near the edge of screen causing an error.
error "Canceled";
+
srSetMousePos(winsize[0]/2,winsize[1]/2);
 +
lsSleep(100);  -- This delay is critical for any srSetMousePos. Without it, the mouse will not have time to actually move!
 +
 
 +
srKeyEvent(string.char(27));  -- Send Esc Key
 +
lsSleep(500);
 +
 +
--Find Special Menu
 +
srReadScreen();
 +
menu = srFindImage("Fishing/Menu_Special.png");
 +
 +
if menu then
 +
--Click it!
 +
srClickMouseNoMove(menu[0]+3,menu[1]+3);
 +
 +
lsSleep(500);
 +
srReadScreen();
 +
 
 +
-- Look for the What Time Is It? option in menu
 +
menu = srFindImage("Fishing/Menu_WhatTime.png");
 +
if menu then
 +
--Click it!
 +
srClickMouseNoMove(menu[0]+3,menu[1]+3);
 +
lsSleep(500);
 +
end
 +
end
 +
 
 +
 
 +
 
 +
 +
srReadScreen();
 +
imgs = findAllImages("Fishing/chatlog_reddots.png");
 +
Coords = imgs[#imgs];
 +
 
 +
-- Look for the ** red dots in main chat to see if they exist.
 +
if #imgs == 0 then
 +
error 'Main chat tab is not showing or the chat window needs to be adjusted!'
 
end
 
end
  
lsDoFrame();
+
lsSleep(per_read_delay_time);
+
for i = #CL_Time, 1, -1 do
 +
Stime = srFindImageInRange("Fishing/" .. CL_Time[i],Coords[0],Coords[1],400,25);
 +
if Stime then
 +
Hour = string.sub(CL_Time[i],string.find(CL_Time[i],"ime_")+4,string.len(CL_Time[i])-4);
 +
 +
AM = srFindImageInRange("Fishing/Chatlog_Time_AM.png",Coords[0],Coords[1],400,25);
 +
if AM then
 +
CurrentTime=(Hour .. "AM");
 +
return (Hour .. "AM");
 +
else
 +
PM = srFindImageInRange("Fishing/chatlog_time_PM.png",Coords[0],Coords[1],400,25);
 +
if PM then
 +
CurrentTime=(Hour .. "PM");
 +
return (Hour .. "PM");
 +
end
 +
end
 +
 
 +
end
 
end
 
end
 
end
 
end
</pre>
 
  
Fixed Crematory Macro:
+
function gui_refresh()
<pre>
+
lsDoFrame();
-- crematory.lua v1.2 by Tallow
 
--
 
-- Runs one or more crematories. Automatically discovers button
 
-- configuration on its own and loads/unloads materials.
 
--
 
  
assert(loadfile("luaScripts/common.inc"))();
 
  
askText = singleLine([[
+
if GrandTotalCaught < 10 then
  Crematory v1.2 (by Tallow) --
+
last10 = GrandTotalCaught .. "/10";
  Automatically runs one or more crematories.
+
else
]]);
+
last10 = 10;
 +
end
 +
 
  
wmText = "Tap control on Crematories to open and pin.";
+
--Stats (On Screen Display)
 +
--CurrentLureIndex  out of  PlayersLures
 +
winsize = lsGetWindowSize();
 +
 +
 +
lsPrintWrapped(10, 0, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "Lure Index: " .. CurrentLureIndex .. " out of " .. #PlayersLures .. "      " .. PlayersLures[CurrentLureIndex]);
  
OPP = 0;
 
SAME_UP = 1;
 
SAME_DOWN = 2;
 
  
tolerance = 6500;
+
lsPrintWrapped(10, 20, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "Time: " .. CurrentTime);
tickTime = 1000;
 
maxWait = 1000;
 
longWait = 500;
 
shortWait = 30;
 
  
colOffsets = {
+
lsPrintWrapped(10, 40, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "Last [" .. last10 .. "] Fish Caught:");
  {35-40-3, 204-182},
 
  {71-40-3, 204-182},
 
  {107-40-3, 204-182},
 
  {143-40-3, 204-182},
 
  {179-40-3, 204-182},
 
  {215-40-3, 204-182},
 
  {251-40-3, 204-182}
 
};
 
  
colWidth = 36-35+6;
+
--Reset this string before showing last 10 fish below. Else the entries will multiply with entries from previous loops/call to this function
colHeight = 323-204;
+
last10caught = "";
colMiddle = 57;
 
  
buttonOffsets = {
+
if #gui_log_fish > 10 then
  {49-40, 333-182},
+
table.remove(gui_log_fish,1);
  {89-40, 333-182},
+
end
  {129-40, 333-182},
+
for i = 1, #gui_log_fish,1 do
  {169-40, 333-182},
+
lsPrintWrapped(10, 50 + (12*i), 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, gui_log_fish[i]);
  {209-40, 333-182}
+
last10caught = last10caught .. gui_log_fish[i] .. "\n";
};
+
end
  
buttonWidth = 78-49;
 
buttonHeight = 354-333;
 
buttonClick = 10;
 
  
limestoneOffset = 0;
+
lsPrintWrapped(10, winsize[1]-133, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "Odd Fish Seen: " .. GrandTotalOdd);
leeksOffset = 16;
+
lsPrintWrapped(10, winsize[1]-121, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "Unusual Fish Seen: " .. GrandTotalUnusual);
flaxOffset = 32;
+
lsPrintWrapped(10, winsize[1]-109, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "Strange Fish Seen: " .. GrandTotalStrange);
papyrusOffset = 48;
 
woodOffset = 64;
 
  
load_flax = true;
+
lsPrintWrapped(10, winsize[1]-97, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "-----------------------------");
load_papyrus = true;
 
load_leeks = true;
 
load_limestone = true;
 
  
currentPass = 1;
+
lsPrintWrapped(10, winsize[1]-85, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "Lures Clicked: " .. GrandTotalLuresUsed);
passCount = 5;
+
lsPrintWrapped(10, winsize[1]-73, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "Lures Lost: " .. GrandTotalLostLures);
  
windows = nil;
+
lsPrintWrapped(10, winsize[1]-61, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "-----------------------------");
  
-------------------------------------------------------------------------------
+
lsPrintWrapped(10, winsize[1]-49, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "Total Casts: " .. GrandTotalCasts);
-- doit
+
lsPrintWrapped(10, winsize[1]-37, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "Failed Catches: " .. GrandTotalFailed);
-------------------------------------------------------------------------------
+
lsPrintWrapped(10, winsize[1]-25, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "Fish Caught: " .. GrandTotalCaught .. " (" .. GrandTotaldb .. "db)");
  
function doit()
 
  askForWindow(askText);
 
  windowManager("Crematory Setup", wmText);
 
  unpinOnExit(runCrematories);
 
end
 
  
-------------------------------------------------------------------------------
+
-- Write stats to log file. Everytime the GUI screen is updated, so is the log file.
-------------------------------------------------------------------------------
 
  
function runCrematories()
+
WriteFishStats("Last Session Hour: " .. CurrentTime .. "\n\nOdd Fish Seen: " .. GrandTotalOdd .. "\nUnusual Fish Seen: " .. GrandTotalUnusual .. "\nStrange Fish Seen: " .. GrandTotalStrange .. "\n---------------------\nLures Clicked: " .. GrandTotalLuresUsed .. "\nLures Lost: " .. GrandTotalLostLures .. " \n---------------------\nTotal Casts: " .. GrandTotalCasts .. "\nFailed Catches: " .. GrandTotalFailed .. "\nFish Caught: " .. GrandTotalCaught .. " (" .. GrandTotaldb .. "db)\n---------------------\n\nLast 10 Fish Caught:\n\n".. last10caught);
  promptLoad();
 
  askForFocus();
 
  for i=1,passCount do
 
    currentPass = i;
 
    takeAll();
 
    loadAll();
 
    start();
 
    local is_done = false;
 
    while not is_done do
 
      tick();
 
      is_done = checkDone();
 
    end
 
    sleepWithStatus(longWait*5, updateMessage("Waiting to take"));
 
  end
 
  takeAll();
 
  lsPlaySound("Complete.wav");
 
end
 
  
-------------------------------------------------------------------------------
 
-- addWindow
 
-------------------------------------------------------------------------------
 
  
function addWindow(vPos)
 
  local newWindow = {
 
    origin = {vPos[0], vPos[1]},
 
    ups = {nil, nil, nil, nil, nil},
 
    downs = {nil, nil, nil, nil, nil},
 
    dirs = {OPP, OPP, OPP, OPP, OPP},
 
    double = {false, false, false, false, false, false, false},
 
    probe = 0,
 
    lastPos = nil;
 
    lastDiff = nil;
 
    buttonState = {true, true, true, true, true},
 
    sameCount = 0,
 
    done = false
 
  };
 
  local vFire = srFindImageInRange("crem-fire.png", newWindow.origin[1] - 31,
 
                                  newWindow.origin[2] - 175, 238, 175,
 
                                  tolerance);
 
  if vFire then
 
    newWindow.fire = {vFire[0], vFire[1]};
 
  else
 
    error "No fire button. Do you have Advanced Chemistry?"
 
  end
 
  windows[#windows + 1] = newWindow;
 
end
 
  
-------------------------------------------------------------------------------
 
-- resetWindow
 
-------------------------------------------------------------------------------
 
  
function resetWindow(current)
 
  local vLime = srFindImageInRange("crem-lime.png", current.origin[1] - 20,
 
                                  current.origin[2] - 20, 100, 100,
 
  tolerance);
 
  if (not vLime) then
 
    error "Could not find origin again.";
 
  end
 
  if ((vLime[0] ~= current.origin[1]) or
 
      (vLime[1] ~= current.origin[2])) then
 
    error("Window moved from (" .. current.origin[1] .. ", " ..
 
      current.origin[2] .. ") to (" .. vLime[0] .. ", " .. vLime[1] .. ")");
 
  end
 
  local vFire = srFindImageInRange("crem-fire.png", current.origin[1] - 31,
 
                                  current.origin[2] - 175, 238, 175,
 
                                  tolerance);
 
  if vFire then
 
    current.fire = {vFire[0], vFire[1]};
 
  end
 
  if current.probe < 6 then
 
    current.probe = 0;
 
    current.ups = {nil, nil, nil, nil, nil};
 
    current.downs = {nil, nil, nil, nil, nil};
 
    current.dirs = {OPP, OPP, OPP, OPP, OPP};
 
    current.double = {false, false, false, false, false, false, false};
 
  end
 
  current.lastPos = nil;
 
  current.lastDiff = nil;
 
  current.buttonState = {true, true, true, true, true};
 
  current.sameCount = 0;
 
  current.done = false;
 
 
end
 
end
  
-------------------------------------------------------------------------------
 
-- start
 
-------------------------------------------------------------------------------
 
  
function start()
 
  sleepWithStatus(longWait, updateMessage("Waiting to begin"));
 
  srReadScreen();
 
  if windows then
 
    for i=1,#windows do
 
      resetWindow(windows[i]);
 
    end
 
  else
 
    windows = {};
 
    local posList = findAllImages("crem-lime.png");
 
    if #posList == 0 then
 
      error "No crematories found";
 
    end
 
    for i=1,#posList do
 
      addWindow(posList[i]);
 
    end
 
  end
 
  for i=1,#windows do
 
    if windows[i].fire then
 
      safeClick(windows[i].fire[1] + 5, windows[i].fire[2] + 5);
 
      lsSleep(shortWait);
 
    end
 
  end
 
  sleepWithStatus(longWait, updateMessage("Finding my Chi"));
 
  srReadScreen();
 
  for i=1,#windows do
 
    windows[i].lastPos = findPoints(windows[i]);
 
    if not windows[i].lastPos then
 
      windows[i].done = true;
 
    end
 
  end
 
end
 
  
-------------------------------------------------------------------------------
 
-- tick
 
-------------------------------------------------------------------------------
 
  
function tick()
 
  sleepWithStatus(tickTime, updateMessage("Tending Crematory"));
 
  srReadScreen();
 
  for i=1,#windows do
 
    tickWindow(windows[i]);
 
  end
 
  checkBreak();
 
end
 
  
-------------------------------------------------------------------------------
+
function doit()
-- tickWindow
+
askForWindow("MAIN chat tab MUST be showing and wide enough so that each lines doesn't wrap. Pin up Lures Menu (Self, Skills, Fishing, Use Lures). No other pinned menus can exist. More detailed instructions are included inside the script as comments at top. There are options you can set in the script such as how many casts per lure, what gets written to the log file and more! History will be recorded in FishLog.txt and stats in FishStats.txt. Most errors can be fixed by slightly adjusting/moving your chat screen! Press Shift to continue.");
-------------------------------------------------------------------------------
 
  
function tickWindow(current)
+
--Gui_Main();
  if not current.done then
 
    local points = findPoints(current);
 
    if points then
 
      probeNext(current, points);
 
      if current.probe > 5 then
 
        toggleButtons(current, points, current.buttonState);
 
      end
 
    else
 
      current.done = true;
 
    end
 
  end
 
end
 
  
-------------------------------------------------------------------------------
 
-- checkDone
 
-------------------------------------------------------------------------------
 
  
function checkDone()
+
--Variables Used By Program -- Don't Edit Unless you know what you're doing!
  local all_done = true;
+
CurrentLure = ""; --Don't Edit
  for i=1,#windows do
+
gui_log_fish = {}; --Don't Edit, holds log display
    if not windows[i].done then
+
log_fish = {};
      local done = srFindImageInRange("crem-done.png", windows[i].origin[1] - 3,
+
CurrentLureIndex=0; -- 1 = First Lure Player Owns in alphabetical order
                                      windows[i].origin[2] - 15, 40, 40,
+
ChangeLureMenu="";
                                      tolerance);
+
LastLureMenu="";
      if done then
+
DownArrowLocs=nil;
        windows[i].done = true;
+
PlayersLures={}; --Don't Edit, Holds Current Player Lures
      else
+
CurrentTime=""; --Don't Edit, Holds Time Check Value
        all_done = false;
+
TotalLuresUsed = 0;
      end
+
castcount = 0;
    end
+
--strangecounter = 0;
  end
 
  return all_done;
 
end
 
  
-------------------------------------------------------------------------------
 
-- findPoints
 
-------------------------------------------------------------------------------
 
  
function findPoints(current)
+
--These variables were later added for displaying additional info on the screen.
  local result = {};
+
-- Used for the extra reporting/statistics, on screen.
  for i=1,7 do
+
-- Dont Edit Unless you know what you're doing!
    local offset = {current.origin[1] + colOffsets[i][1],
 
                    current.origin[2] + colOffsets[i][2]};
 
    local point = srFindImageInRange("crem-point.png", offset[1],
 
                                    offset[2] - 5,
 
                                    colWidth, colHeight + 10, tolerance);
 
    if point then
 
      result[i] = point[1] - colOffsets[i][2] - current.origin[2] - colMiddle;
 
    else
 
      result = nil;
 
      break;
 
    end
 
  end
 
  return result;
 
end
 
  
-------------------------------------------------------------------------------
+
GrandTotalCaught = 0;
-- findDiffs
+
GrandTotalCasts = 0;
-------------------------------------------------------------------------------
+
GrandTotaldb = 0;
 +
GrandTotalStrange = 0;
 +
GrandTotalOdd = 0;
 +
GrandTotalUnusual = 0;
 +
GrandTotalLuresUsed = 0;
 +
GrandTotalLostLures = 0;
 +
GrandTotalFailed = 0;
  
function findDiffs(current, points)
+
  local result = {};
+
PlayersLures = SetupLureGroup();
  local all_zero = true;
+
CurrentTime = GetTime();
  for i=1,7 do
+
lsSleep(1500);
    result[i] = points[i] - current.lastPos[i];
 
    if result[i] ~= 0 then
 
      all_zero = false;
 
    end
 
  end
 
  if all_zero then
 
    result = nil;
 
  end
 
  return result;
 
end
 
  
-------------------------------------------------------------------------------
 
-- probeNext
 
-------------------------------------------------------------------------------
 
  
function probeNext(current, points)
+
--Write an entry into log file to show this is a new session
  local diffs = findDiffs(current, points);
+
WriteFishLog("[New Session]\n");
  checkSame(current, diffs);
 
  if diffs and current.probe < 6 then
 
    if current.probe > 0 then
 
      for i=1,7 do
 
        if current.lastDiffs[i] < 0 and diffs[i] > 0 then
 
          if current.ups[current.probe] then
 
            current.downs[current.probe] = i;
 
            current.dirs[current.probe] = SAME_UP;
 
          else
 
            current.ups[current.probe] = i;
 
          end
 
        elseif current.lastDiffs[i] > 0 and diffs[i] < 0 then
 
          if current.downs[current.probe] then
 
            current.ups[current.probe] = i;
 
            current.dirs[current.probe] = SAME_DOWN;
 
          else
 
            current.downs[current.probe] = i;
 
          end
 
        end
 
      end
 
      if current.ups[current.probe] and current.downs[current.probe] then
 
        current.double[current.ups[current.probe]] = true;
 
        current.double[current.downs[current.probe]] = true;
 
      end
 
    end
 
    current.lastPos = points;
 
    current.lastDiffs = diffs;
 
    current.probe = current.probe + 1;
 
    if current.probe <= 5 then
 
      local newProbe = not current.buttonState[current.probe];
 
      local clickX = current.origin[1] + buttonOffsets[current.probe][1] +
 
buttonClick;
 
      local clickY = current.origin[2] + buttonOffsets[current.probe][2] +
 
buttonClick;
 
  
      current.buttonState[current.probe] = newProbe;
+
      safeClick(clickX, clickY);
+
while 1 do
      lsSleep(shortWait);
+
    end
+
checkBreak();
  end
+
srReadScreen();
end
+
 +
 +
--cast = srFindImage("Fishing/Button_Fish.png");
 +
cast = srFindImage("fishicon.png");
 +
if not cast then
 +
error("cannot find fishing button");
 +
end
 +
 +
if castcount == 0 then
 +
--Update counters
 +
castcount = 1;
 +
CurrentLureIndex = CurrentLureIndex +1;
  
-------------------------------------------------------------------------------
 
-- checkSame
 
-------------------------------------------------------------------------------
 
  
function checkSame(current, diffs)
+
if CurrentLureIndex > #PlayersLures then
  if diffs then
+
--Refresh the Lure window, and reindex it, in case some were lost.
    local all_same = true;
+
PlayersLures = SetupLureGroup();
    for i=1,#diffs do
+
CurrentLureIndex = 1;
      if diffs[i] ~= 0 then
+
end
        all_same = false;
 
      end
 
    end
 
    if all_same then
 
      current.sameCount = current.sameCount + 1;
 
    else
 
      current.sameCount = 0;
 
    end
 
    if current.sameCount > 10 then
 
      current.done = true;
 
    end
 
  end
 
end
 
  
-------------------------------------------------------------------------------
 
-- toggleButtons
 
-------------------------------------------------------------------------------
 
  
function toggleButtons(current, points, buttonState)
+
  local balance = getBalance(points, current.double);
+
--Update the time if ready, always update before new lure to keep chat/log proper
  for i=1,5 do
+
if TotalLuresUsed == LureChangesToUpdateTimer then
    local up = getPointValue(points, current.double, current.ups[i],
+
--Update Time
                            balance);
 
    local down = getPointValue(points, current.double, current.downs[i],
 
                              balance);
 
    local goalState = ((up >= 0 and down <= 0) or
 
                      (up >= 0 and down >= 0 and up > down) or
 
                      (up <= 0 and down <= 0 and up > down));
 
    if current.dirs[i] == SAME_UP then
 
      goalState = ((up >= 0 and down >= 0) or
 
                  (up >= 0 and down <= 0 and up >= -down) or
 
                  (up <= 0 and down >= 0 and -up <= down));
 
    elseif current.dirs[i] == SAME_DOWN then
 
      goalState = ((up <= 0 and down <= 0) or
 
                  (up >= 0 and down <= 0 and up <= -down) or
 
                  (up <= 0 and down >= 0 and -up >= down));
 
    end
 
    local goalStateStr = "false";
 
    if goalState then
 
      goalStateStr = "true";
 
    end
 
    local buttonStr = "false";
 
    if buttonState[i] then
 
      buttonStr = "true";
 
    end
 
    if (goalState and not buttonState[i]) or
 
      (not goalState and buttonState[i]) then
 
      safeClick(current.origin[1] + buttonOffsets[i][1] + buttonClick,
 
current.origin[2] + buttonOffsets[i][2] + buttonClick);
 
      lsSleep(shortWait);
 
      buttonState[i] = goalState;
 
    end
 
  end
 
end
 
  
-------------------------------------------------------------------------------
+
CurrentTime = GetTime();
-- getBalance
+
TotalLuresUsed = 0;
-------------------------------------------------------------------------------
+
end
 +
 +
--Since no casts been made at all, use a lure
 +
UseLure();
 +
lsSleep(2000);
 +
TotalLuresUsed = TotalLuresUsed + 1;
 +
GrandTotalLuresUsed = GrandTotalLuresUsed + 1;
 +
 +
--update log
 +
gui_refresh();
 +
 +
elseif castcount  > TotalCasts then
 +
-- if strangecounter > 0 and strangecounter < AlmostCaughtAttempts then
 +
--we don't reset yet!
 +
-- else
 +
--Reset
 +
castcount=0;
 +
strangecounter = 0;
 +
-- end
 +
else
 +
--Cast
 +
srClickMouseNoMove(cast[0]+3,cast[1]+3);
 +
lsSleep(1000);
 +
checkBreak();
  
function getBalance(points, double)
 
  local above = 0;
 
  local below = 0;
 
  for i=1,#points do
 
    if points[i] > 0 and double[i] then
 
      below = below + 1;
 
    elseif points[i] < 0 and double[i] then
 
      above = above + 1;
 
    end
 
  end
 
  
  local result = 0;
 
  if above >= 3 then
 
    result = -5;
 
  elseif below >= 3 then
 
    result = 5;
 
  end
 
  return result;
 
end
 
  
-------------------------------------------------------------------------------
+
while findchat(castcount - 1) == "lure" do
-- getPointValue
+
lsSleep(1000);
-------------------------------------------------------------------------------
+
checkBreak();
 +
end
  
function getPointValue(points, double, index, balance)
 
  local result = 0;
 
  if index then
 
    result = points[index];
 
    if not double[index] then
 
      result = result + balance;
 
    end
 
  end
 
  return result;
 
end
 
  
-------------------------------------------------------------------------------
+
castcount = castcount + 1;
-- takeAll
+
GrandTotalCasts = GrandTotalCasts + 1;
-------------------------------------------------------------------------------
 
  
function takeAll()
 
  srReadScreen();
 
  local updateList = findAllImages("ThisIs.png");
 
  for i=1,#updateList do
 
    safeClick(updateList[i][0], updateList[i][1]);
 
  end
 
  sleepWithStatus(longWait, updateMessage("Update Crematory Windows"));
 
  srReadScreen();
 
  local takeList = findAllImages("crem-take.png");
 
  for i=1,#takeList do
 
    safeClick(takeList[i][0] + 5, takeList[i][1] + 5);
 
    sleepWithStatus(shortWait*2, "Waiting for Everything");
 
    srReadScreen();
 
    local all = waitForImage("Everything.png", maxWait, "Grabbing Everything");
 
    if all then
 
      safeClick(all[0] + 5, all[1] + 5);
 
    end
 
    lsSleep(shortWait*2);
 
  end
 
end
 
  
-------------------------------------------------------------------------------
 
-- promptLoad
 
-------------------------------------------------------------------------------
 
  
function promptLoad()
 
  scale = 1.0;
 
  local z = 0;
 
  local is_done = nil;
 
  while not is_done do
 
    checkBreak("disallow pause");
 
    lsPrint(10, 10, z, scale, scale, 0xFFFFFFff, "Configure");
 
    local y = 60;
 
  
    lsPrint(5, y, z, scale, scale, 0xffffffff, "Passes:");
 
    is_done, passCount = lsEditBox("passes", 110, y, z, 50, 30, scale, scale,
 
                                  0x000000ff, 5);
 
    if not tonumber(passCount) then
 
      is_done = false;
 
      lsPrint(10, y+18, z+10, 0.7, 0.7, 0xFF2020ff, "MUST BE A NUMBER");
 
      passCount = 1;
 
    end
 
    y = y + 48;
 
  
    load_flax = lsCheckBox(15, y, z+10, 0xffffffff, "Dried Flax",
+
--Read Chat
                          load_flax);
+
ChatType = findchat();
    y = y + 32;
 
  
    load_papyrus = lsCheckBox(15, y, z+10, 0xffffffff, "Dried Papyrus",
+
lsSleep(200);
                              load_papyrus);
 
    y = y + 32;
 
  
    load_leeks = lsCheckBox(15, y, z+10, 0xffffffff, "Leeks",
+
CurrentLure = string.sub(PlayersLures[CurrentLureIndex],string.find(PlayersLures[CurrentLureIndex],"_")+1,string.len(PlayersLures[CurrentLureIndex])-4);
                            load_leeks);
 
    y = y + 32;
 
  
    load_limestone = lsCheckBox(15, y, z+10, 0xffffffff, "Limestone",
 
                                load_limestone);
 
    y = y + 32;
 
  
    lsPrintWrapped(10, y, z+10, lsScreenX - 20, 0.7, 0.7, 0xd0d0d0ff,
+
if ChatType == "nobitlostlure" then
                  "Make sure each crematory is pinned and empty.");
+
--No fish bit. You also lost your lure.
 +
GrandTotalLostLures = GrandTotalLostLures + 1;
 +
GrandTotalFailed = GrandTotalFailed + 1;
 +
--Reset, skip to next lure
 +
castcount=0;
 +
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "No fish bit. You also lost your lure." .. "\n");
  
    if lsButtonText(10, lsScreenY - 30, z, 100, 0xFFFFFFff, "Begin") then
 
        is_done = 1;
 
    end
 
    if lsButtonText(lsScreenX - 110, lsScreenY - 30, z, 100, 0xFFFFFFff,
 
                    "End script") then
 
      error "Clicked End Script button";
 
    end
 
    lsDoFrame();
 
    lsSleep(shortWait);
 
  end
 
end
 
  
-------------------------------------------------------------------------------
+
elseif ChatType == "nobit" then
-- loadAll
+
--No fishbit
-------------------------------------------------------------------------------
+
GrandTotalFailed = GrandTotalFailed + 1;
 +
if LogFails == true then
 +
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "No fish bit." .. "\n");
 +
end
  
function loadAll()
 
  srReadScreen();
 
  local posList = findAllImages("ThisIs.png");
 
  for i=1,#posList do
 
    safeClick(posList[i][0], posList[i][1]);
 
  end
 
  sleepWithStatus(longWait, updateMessage("Update Crematory Windows"));
 
  srReadScreen();
 
  posList = findAllImages("crem-fire.png");
 
  for i=1,#posList do
 
    loadSingle(posList[i], woodOffset, "Wood");
 
    if load_flax then
 
      loadSingle(posList[i], flaxOffset, "Flax");
 
    end
 
    if load_papyrus then
 
      loadSingle(posList[i], papyrusOffset, "Papyrus");
 
    end
 
    if load_leeks then
 
      loadSingle(posList[i], leeksOffset, "Leeks");
 
    end
 
    if load_limestone then
 
      loadSingle(posList[i], limestoneOffset, "Limestone");
 
    end
 
  end
 
end
 
  
-------------------------------------------------------------------------------
+
elseif ChatType == "nocatchlostlure" then
-- loadSingle
+
--You didn't catch anything. You also lost your lure.
-------------------------------------------------------------------------------
+
GrandTotalLostLures = GrandTotalLostLures + 1;
 +
GrandTotalFailed = GrandTotalFailed + 1;
 +
--Reset, skip to next lure
 +
castcount=0;
 +
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "You didn\'t catch anything. You also lost your lure." .. "\n");
  
function loadSingle(pos, offset, type)
 
  sleepWithStatus(200, "Waiting to load");
 
  safeClick(pos[0]+5, pos[1]+5+16);
 
  lsSleep(100);
 
  local limePos = waitForImage("crem-limestone.png", maxWait,
 
      "Loading " .. type .. " Into Crematory");
 
  if limePos then
 
    safeClick(limePos[0] + 5, limePos[1] + 5 + offset);
 
    lsSleep(100);
 
    local maxPos = waitForImage("crem-max.png", maxWait,
 
"Adding Maximum Amount");
 
    if maxPos then
 
      safeClick(maxPos[0]+5, maxPos[1]+5);
 
    end
 
  end
 
  lsSleep(100);
 
  sleepWithStatus(shortWait, "Waiting for load to complete");
 
end
 
  
-------------------------------------------------------------------------------
+
elseif ChatType == "nocatch" then
-- updateMessage
+
--You didn't catch anything.
-------------------------------------------------------------------------------
+
GrandTotalFailed = GrandTotalFailed + 1;
 +
if LogFails == true then
 +
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "You didn\'t catch anything." .. "\n");
 +
end
  
function updateMessage(message)
 
  local result = "Pass " .. currentPass .. " / " .. passCount .. "\n";
 
  result = result .. message .. "\n\n";
 
  if message == "Tending Crematory" then
 
    for i=1,#windows do
 
      local status = "Buttons: ";
 
      for j=1,5 do
 
if windows[i].dirs[j] == OPP then
 
  status = status .. getDir("+", windows[i].ups[j]) ..
 
    getDir("-", windows[i].downs[j]);
 
elseif windows[i].dirs[j] == SAME_UP then
 
  status = status .. getDir("+", windows[i].ups[j]) ..
 
    getDir("+", windows[i].downs[j]);
 
else
 
  status = status .. getDir("-", windows[i].ups[j]) ..
 
    getDir("-", windows[i].downs[j]);
 
end
 
if j ~= 5 then
 
  status = status .. ", ";
 
else
 
  status = status .. "\n";
 
end
 
      end
 
      result = result .. "\n" .. status;
 
    end
 
  end
 
  return result;
 
end
 
  
function getDir(sign, number)
+
elseif ChatType == "alreadyfishing" then
  local result = "";
+
--castcount = castcount-1;
  if number then
+
lsSleep(15000); -- Long pause to wait for fishing queue to stop. Somehow it pushed the Fish button twice and now you will cast 2 times in a row.  
    result = sign .. number
+
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "You are already fishing!" .. "\n");
  end
 
  return result;
 
end
 
</pre>
 
  
Forge.inc to add Treated Metal Sheeting option:
 
  
<pre>
 
button_names = {
 
"Knife Blade",
 
"Shovel Blade",
 
"Nails",
 
"Copper Pipe",
 
"Lead Pipe",
 
"Bars",
 
"Sheeting",
 
"Straps",
 
"Tools",
 
"Wire"
 
};
 
  
bar_button_names = {
+
elseif ChatType == "strange" then
"Iron Bar",
+
--Strange Fish
"Gold Bar",
+
GrandTotalStrange = GrandTotalStrange + 1;
"Silver Bar"
+
GrandTotalFailed = GrandTotalFailed + 1;
};
+
if LogStrangeUnusual == true then
 +
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "You almost caught a STRANGE fish, but your rod was just too clumbsy." .. "\n");
 +
end
  
sheeting_button_names = {
+
-- if AlmostCaughtAttempts > 0 then
"Lead Sheeting",
+
-- strangecounter = strangecounter +1;
"Gold Sheeting",
+
-- end
"Copper Sheeting",
+
"Octecs Alloy Sheeting",
+
"Silver Sheeting",
+
elseif ChatType == "strangelostlure" then
"Steel Sheeting",
+
-- Strange Fish and lost lure
"Gold Foil",
+
GrandTotalStrange = GrandTotalStrange + 1;
"Metal Blue Sheeting",
+
GrandTotalLostLures = GrandTotalLostLures + 1;
"Treated Metal Sheeting",
+
GrandTotalFailed = GrandTotalFailed + 1;
"Tin Sheeting",
+
--Reset, skip to next lure
"Moon Steel Sheeting",
+
castcount=0;
"Thoths Metal Sheeting"
+
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "You almost caught a STRANGE fish, but your rod was just too clumbsy. You also lost your lure." .. "\n");
};
 
  
straps_button_names = {
+
-- if AlmostCaughtAttempts > 0 then
"Water Metal Strap",
+
-- strangecounter = strangecounter +1;
"Iron Strap",
+
-- end
"Aluminum Strap",
 
"Copper Strap"
 
};
 
  
tools_button_names = {
 
"Iron Poker",
 
"Steel Blade",
 
"Lead Chisel"
 
};
 
  
wire_button_names = {
 
"Thoths Metal Wire",
 
"Metal Blue Wire",
 
"Magnesium Wire",
 
"Octecs Alloy Wire",
 
"Silver Wire",
 
"Copper Wire",
 
"Steel Wire",
 
"Gold Wire"
 
};
 
  
 +
elseif ChatType == "unusual" then
 +
-- Unusual Fish
 +
GrandTotalUnusual = GrandTotalUnusual + 1;
 +
GrandTotalFailed = GrandTotalFailed + 1;
 +
if LogStrangeUnusual == true then
 +
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "You almost caught an UNUSUAL fish, but you were not quick enough." .. "\n");
 +
end
  
----------------- MAKE PROJECTS 'SUPPORTING' FUNCTIONS -----------------
+
-- if AlmostCaughtAttempts > 0 then
 +
-- strangecounter = strangecounter +1;
 +
-- end
  
function waitMinutes(minutes)
 
-- Teppy Minute is 66 seconds or 66000 ms
 
-- Add a 3 second delay (3000 ms) in case of lag
 
  
wait_delay = 3000; -- Extra delay on top of Teppy Time, for lag purposes. Default is 3000
 
wait = (minutes * 66000) + wait_delay;
 
askForFocus(); -- Pause to allow user to focus back to ATITD (if they checked the Pause for Focus Box), before starting project.
 
end
 
  
  
function doneGUI(totalPasses)
+
-- Can't uncomment below elseif statement until we get a screenshot of a message of you were not quick enough. You also lost your lure.
wait = 5000;  -- Gives a 5 second delay to review the GUI stats, before quitting/returing to Main Menu.
+
-- This would need to be added to Fishing_Func.inc , in the Chat_Types {array} along with adding Chatlog_AlmostUnusualLostlure.png). Add above "unusual" line in the array
clickAllImages("This.png"); -- Refresh the screen. Update forge window so we know how much charcoal is currently in each forge before next project
 
  
sleepWithStatus(wait, "[" .. totalPasses .. "/" .. totalPasses .. "] ALL DONE!\n----------------------------------------------\n[" .. made .. "/" .. batch*project_windows*num_loops .. "] " .. name .. " / Completed");
 
  
lsPlaySound("Complete.wav");
+
--elseif ChatType == "unusuallostlure" then
runForge(); -- Return to/Display Main Menu
+
-- Unusual Fish
end
+
--GrandTotalUnusual = GrandTotalUnusual + 1;
 +
--GrandTotalLostLures = GrandTotalLostLures + 1;
 +
--GrandTotalFailed = GrandTotalFailed + 1;
 +
--if LogStrangeUnusual == true then
 +
--WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "You almost caught an UNUSUAL fish, but you were not quick enough." .. "\n");
 +
--end
  
  
function waitGUI(pass)
 
--If any forge menus shows the Forge_StartFire.png - refreshWindows() function, then display the stalledMessage in the GUI. Suggests its not lit (or out of charcoal)
 
if #stalled > 0 then
 
stalledMessage = "\n[" .. #stalled .. "] Forges STALLED (Needs Lit)"
 
else
 
stalledMessage = "";
 
end
 
  
sleepWithStatus(wait, "[" .. pass .. "/" .. num_loops .. "] Total Passes\n----------------------------------------------\n[" .. batch .. "] " .. name .. " per forge\n[" .. project_windows .. "] Forges working" .. stalledMessage .. "\n----------------------------------------------\n[" .. batch*project_windows .. "] " .. name .. " per pass\n----------------------------------------------\n[" .. made .. "/" .. batch*project_windows*num_loops .. "] " .. name .. " / Completed");
+
-- if AlmostCaughtAttempts > 0 then
 +
-- strangecounter = strangecounter +1;
 +
-- end
  
made = made + (batch*project_windows);
 
end
 
  
  
function refreshWindows()
 
checkBreak();
 
pinned_windows = clickAllImages("This.png");
 
lsSleep(400);
 
if pinned_windows == 0 then
 
error("No pinned windows found!");
 
else
 
srReadScreen();
 
stalled = findAllImages("Forge/Forge_StartFire.png");
 
if #stalled == pinned_windows/2 then -- The /2 is because each forge has 'This' located in window twice. Can't use ThisIs.png either because idle/working forge has different words (Idle Forge shows 'This' only and Working Forge shows 'This Is'
 
error("No forges are lit!");
 
end
 
end
 
end
 
  
 +
elseif ChatType == "odd" then
 +
-- Odd Fish
 +
GrandTotalOdd = GrandTotalOdd + 1;
 +
GrandTotalFailed = GrandTotalFailed + 1;
 +
if LogOdd == true then
 +
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "You almost caught an ODD fish, but were too late recognizing the bite." .. "\n");
 +
end
  
----------------- MAKE PROJECT FUNCTIONS -----------------
 
  
function KnifeBlade()
+
elseif ChatType == "oddlostlure" then
num_loops = promptNumber("How many passes ?", 1);
+
-- Odd Fish and lost lure
batch = 1;
+
GrandTotalOdd = GrandTotalOdd + 1;
name = "Knife Blade";
+
GrandTotalLostLures = GrandTotalLostLures + 1;
waitMinutes(10);
+
GrandTotalFailed = GrandTotalFailed + 1;
for i=1, num_loops do
+
--Reset, skip to next lure
while 1 do
+
castcount=0;
refreshWindows();
+
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "You almost caught an ODD fish, but were too late recognizing the bite. You also lost your lure." .. "\n");
project_windows = clickAllImages("Forge/Forge_Knife_Blade.png");
 
if project_windows == 0 then
 
sleepWithStatus(1500, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function ShovelBlade()
 
num_loops = promptNumber("How many passes ?", 1);
 
batch = 1;
 
name = "Shovel Blade";
 
waitMinutes(5);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
project_windows = clickAllImages("Forge/Forge_Shovel_Blade.png");
 
if project_windows == 0 then
 
sleepWithStatus(1500, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function Nails()
 
num_loops = promptNumber("How many passes ?", 1);
 
batch = 12;
 
name = "Nails";
 
waitMinutes(1);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
project_windows = clickAllImages("Forge/Forge_Nail.png");
 
if project_windows == 0 then
 
sleepWithStatus(1500, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function CopperPipe()
 
num_loops = promptNumber("How many passes ?", 1);
 
batch = 1;
 
name = "Copper Pipe";
 
waitMinutes(5);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
project_windows = clickAllImages("Forge/Forge_Copper_Pipe.png");
 
if project_windows == 0 then
 
sleepWithStatus(1500, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function LeadPipe()
+
elseif ChatType == "carry" then
num_loops = promptNumber("How many passes ?", 1);
+
--chat lines are messed up now
batch = 1;
+
castcount=0;
name = "Lead Pipe";
+
waitMinutes(5);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
project_windows = clickAllImages("Forge/Forge_Lead_Pipe.png");
 
if project_windows == 0 then
 
sleepWithStatus(1500, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function IronBar()
+
elseif ChatType == "caught" or ChatType == "caughtlostlure" then
num_loops = promptNumber("How many passes ?", 1);
+
Fish = ChatReadFish();
batch = 1;
 
name = "Iron Bar";
 
waitMinutes(15);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Bars.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Iron_Bar.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function GoldBar()
+
table.insert(gui_log_fish,Fish);
num_loops = promptNumber("How many passes ?", 1);
 
batch = 1;
 
name = "Gold Bar";
 
waitMinutes(5);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Bars.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Gold_Bar.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function SilverBar()
 
num_loops = promptNumber("How many passes ?", 1);
 
batch = 1;
 
name = "Silver Bar";
 
waitMinutes(10);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Bars.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Silver_Bar.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function LeadSheeting()
+
if ChatType == "caughtlostlure" then
num_loops = promptNumber("How many passes ?", 1);
+
GrandTotalLostLures = GrandTotalLostLures + 1;
batch = 1;
+
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "Though you lost your lure, you did catch a " .. Fish .. "\n");
name = "Lead Sheeting";
+
-- This Needs Check for new lure. This will cause a error if not.
waitMinutes(10);
+
--Reset, skip to next lure
for i=1, num_loops do
+
castcount=0;
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Sheeting.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Lead_Sheeting.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
 
else
 
else
break;
+
WriteFishLog("[" .. CurrentTime .. "]\t[" .. CurrentLure .. "]\t" .. "Caught a " .. Fish .. "\n");
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
 
 
function GoldSheeting()
 
num_loops = promptNumber("How many passes ?", 1);
 
batch = 4;
 
name = "Gold Sheeting";
 
waitMinutes(10);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Sheeting.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Gold_Sheeting.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function CopperSheeting()
 
num_loops = promptNumber("How many passes ?", 1);
 
batch = 1;
 
name = "Copper Sheeting";
 
waitMinutes(1);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Sheeting.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Copper_Sheeting.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
 
end
 
end
end
+
waitGUI(i);
+
--gui_refresh();
end
+
doneGUI(num_loops);
+
if SkipCommon == true then
end
+
FishType = string.sub(Fish,string.find(Fish,",") + 1);
 +
if FishType == "Abdju" or FishType == "Chromis" or FishType == "Catfish" or FishType == "Carp" or FishType == "Perch" or FishType == "Phagrus" or FishType == "Tilapia" then
 +
--Skip it
 +
castcount=0;
  
function TreatedSheeting()
 
num_loops = promptNumber("How many passes ?", 1);
 
typeOfMetal = promptText("Enter the metal name:");
 
batch = 1;
 
name = "Treated Metal Sheeting";
 
waitMinutes(2);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Sheeting.png");
 
lsSleep(400);
 
project_windows = clickAllText("Treated");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
lsSleep(400);
 
local numClicked = clickAllText(typeOfMetal);
 
if numClicked == 0 then
 
break;
 
 
end
 
end
 
end
 
end
 +
 +
gui_refresh();
 
end
 
end
waitGUI(i);
+
 +
gui_refresh();
 
end
 
end
doneGUI(num_loops);
+
 +
gui_refresh();
 +
end
 
end
 
end
 +
</pre>
 +
{{Collapse bottom}}
  
function OctecsAlloySheeting()
+
{{Collapse top|title=New Raeli Oven Monitor (IN TESTING v3)}}
num_loops = promptNumber("How many passes ?", 1);
+
<pre>
batch = 8;
+
loadfile("luaScripts/screen_reader_common.inc")();
name = "Octecs Alloy";
+
loadfile("luaScripts/common.inc")();
waitMinutes(20);
+
loadfile("luaScripts/ui_utils.inc")();
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Sheeting.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Octecs_Alloy_Sheeting.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function SilverSheeting()
+
askText = singleLine([[
num_loops = promptNumber("How many passes ?", 1);
+
  Raeli Color Monitor v1.1c (edit by Selune) --
batch = 1;
+
  Make sure the Raeli Oven is pinned, select the ATITD window, and press shift.
name = "Silver Sheeting";
+
]]);
waitMinutes(2);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Sheeting.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Silver_Sheeting.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function SteelSheeting()
+
stop_at_CB = false;
num_loops = promptNumber("How many passes ?", 1);
+
take_screenshots = true;
batch = 6;
+
stop_at_color = "White";
name = "Steel Sheeting";
+
confidence_threshold = 15;
waitMinutes(10);
+
saved_x = 0;
for i=1, num_loops do
+
saved_y = 0;
while 1 do
+
go_now = false;
refreshWindows();
 
clickAllImages("Forge/Forge_Sheeting.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Steel_Sheeting.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function GoldFoil()
+
color_names = {"AliceBlue", "AntiqueWhite", "Aqua", "Aquamarine", "Azure", "Beige", "Bisque", "Black", "BlanchedAlmond", "Blue", "BlueViolet", "Brown", "Burlywood", "CadetBlue", "Carrot", "Chartreuse", "Chocolate", "Coral", "CornflowerBlue", "Cornsilk", "Crimson", "DarkBlue", "DarkCyan", "DarkGoldenrod", "DarkGray", "DarkGreen", "DarkKhaki", "DarkMagenta", "DarkOliveGreen", "DarkOrange", "DarkOrchid", "DarkRed", "DarkSalmon", "DarkSeaGreen", "DarkSlateBlue", "DarkSlateGray", "DarkTurquoise", "DarkViolet", "DeepPink", "DeepSkyBlue", "DimGray", "DodgerBlue", "Feldspar", "FireBrick", "FloralWhite", "ForestGreen", "Fuchsia", "Gainsboro", "GhostWhite", "Gold", "Goldenrod", "Gray", "Green", "GreenYellow", "Honeydew", "HotPink", "IndianRed", "Indigo", "Ivory", "Khaki", "Lavender", "LavenderBlush", "LawnGreen", "LemonChiffon", "LightBlue", "LightCoral", "LightCyan", "LightGoldenrodYellow", "LightGreen", "LightGrey", "LightPink", "LightSalmon", "LightSeaGreen", "LightSkyBlue", "LightSlateBlue", "LightSlateGray", "LightSteelBlue", "LightYellow", "Lime", "LimeGreen", "Linen", "Maroon ", "MediumAquamarine", "MediumBlue ", "MediumOrchid", "MediumPurple", "MediumSeaGreen", "MediumSlateBlue", "MediumSpringGreen", "MediumTurquoise", "MediumVioletRed", "MidnightBlue", "MintCream", "MistyRose", "Moccasin", "NavajoWhite", "Navy ", "OldLace", "Olive", "OliveDrab", "Orange", "OrangeRed", "Orchid", "PaleGoldenrod", "PaleGreen", "PaleTurquoise", "PaleVioletRed", "PapayaWhip", "PeachPuff", "Peru", "Pink", "Plum", "PowderBlue", "Purple ", "Red", "RosyBrown", "RoyalBlue", "SaddleBrown", "Salmon", "SandyBrown", "SeaGreen", "Seashell", "Sienna", "Silver", "SkyBlue", "SlateBlue", "SlateGray", "Snow", "SpringGreen", "SteelBlue ", "Tan", "Teal", "Thistle", "Tomato", "Turquoise", "Violet", "VioletRed", "Wheat", "White", "WhiteSmoke", "Yellow", "YellowGreen"};
num_loops = promptNumber("How many passes ?", 1);
+
color_values = {0xF0F8FF, 0xFAEBD7, 0x00FFFF, 0x7FFFD4, 0xF0FFFF, 0xF5F5DC, 0xFFE4C4, 0x000000, 0xFFEBCD, 0x0000FF, 0x8A2BE2, 0xA52A2A, 0xDEB887, 0x5F9EA0, 0xE07020, 0x7FFF00, 0xD2691E, 0xFF7F50, 0x6495ED, 0xFFF8DC, 0xDC143C, 0x00008B, 0x008B8B, 0xB8860B, 0xA9A9A9, 0x006400, 0xBDB76B, 0x8B008B, 0x556B2F, 0xFF8C00, 0x9932CC, 0x8B0000, 0xE9967A, 0x8FBC8F, 0x483D8B, 0x2F4F4F, 0x00CED1, 0x9400D3, 0xFF1493, 0x00BFFF, 0x696969, 0x1E90FF, 0xD19275, 0xB22222, 0xFFFAF0, 0x228B22, 0xFF00FF, 0xDCDCDC, 0xF8F8FF, 0xFFD700, 0xDAA520, 0x808080, 0x008000, 0xADFF2F, 0xF0FFF0, 0xFF69B4, 0xCD5C5C, 0x4B0082, 0xFFFFF0, 0xF0E68C, 0xE6E6FA, 0xFFF0F5, 0x7CFC00, 0xFFFACD, 0xADD8E6, 0xF08080, 0xE0FFFF, 0xFAFAD2, 0x90EE90, 0xD3D3D3, 0xFFB6C1, 0xFFA07A, 0x20B2AA, 0x87CEFA, 0x8470FF, 0x778899, 0xB0C4DE, 0xFFFFE0, 0x00FF00, 0x32CD32, 0xFAF0E6, 0x800000, 0x66CDAA, 0x0000CD, 0xBA55D3, 0x9370DB, 0x3CB371, 0x7B68EE, 0x00FA9A, 0x48D1CC, 0xC71585, 0x191970, 0xF5FFFA, 0xFFE4E1, 0xFFE4B5, 0xFFDEAD, 0x000080, 0xFDF5E6, 0x808000, 0x6B8E23, 0xFFA500, 0xFF4500, 0xDA70D6, 0xEEE8AA, 0x98FB98, 0xAFEEEE, 0xDB7093, 0xFFEFD5, 0xFFDAB9, 0xCD853F, 0xFFC0CB, 0xDDA0DD, 0xB0E0E6, 0x800080, 0xFF0000, 0xBC8F8F, 0x4169E1, 0x8B4513, 0xFA8072, 0xF4A460, 0x2E8B57, 0xFFF5EE, 0xA0522D, 0xC0C0C0, 0x87CEEB, 0x6A5ACD, 0x708090, 0xFFFAFA, 0x00FF7F, 0x4682B4, 0xD2B48C, 0x008080, 0xD8BFD8, 0xFF6347, 0x40E0D0, 0xEE82EE, 0xD02090, 0xF5DEB3, 0xFFFFFF, 0xF5F5F5, 0xFFFF00, 0x9ACD32};
batch = 4;
 
name = "Gold Foil";
 
waitMinutes(1);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Sheeting.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Gold_Foil.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function MetalBlueSheeting()
+
-- Decimal to Hex conversion
num_loops = promptNumber("How many passes ?", 1);
+
function DEC_HEX(IN)
batch = 1;
+
    local B,K,OUT,I,D=16,"0123456789ABCDEF","",0
name = "Metal Blue Sheeting";
+
    while IN>0 do
waitMinutes(15);
+
        I=I+1
for i=1, num_loops do
+
        IN,D=math.floor(IN/B),math.mod(IN,B)+1
while 1 do
+
        OUT=string.sub(K,D,D)..OUT
refreshWindows();
+
    end
clickAllImages("Forge/Forge_Sheeting.png");
+
    return OUT
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Metal_Blue_Sheeting.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
 
end
 
end
  
function TinSheeting()
+
--Color Conversions
num_loops = promptNumber("How many passes ?", 1);
+
function rgb2hsl(src_r, src_g, src_b)
batch = 1;
+
local h, s, l, d;
name = "Tin Sheeting";
+
src_r = src_r / 255;
waitMinutes(5);
+
src_g = src_g / 255;
for i=1, num_loops do
+
src_b = src_b / 255;
while 1 do
+
    local max_rgb = math.max(src_r, src_g, src_b);  
refreshWindows();
+
local min_rgb = math.min(src_r, src_g, src_b);
clickAllImages("Forge/Forge_Sheeting.png");
+
    l = (max_rgb + min_rgb) / 2;
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Tin_Sheeting.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
  
function MoonSteelSheeting()
+
    if(max_rgb == min_rgb) then
num_loops = promptNumber("How many passes ?", 1);
+
        h = 0; --achromatic
batch = 1;
+
s = 0;
name = "Moon Steel Sheeting";
+
    else
waitMinutes(5);
+
        d = max_rgb - min_rgb;
for i=1, num_loops do
+
if l > 0.5 then
while 1 do
+
s = d / (2 - max_rgb - min_rgb);
refreshWindows();
+
else
clickAllImages("Forge/Forge_Sheeting.png");
+
s = d / (max_rgb + min_rgb);
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Moon_Steel_Sheeting.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
 
end
 
end
doneGUI(num_loops);
+
end
+
if src_g > src_b then
 
+
if src_r > src_g then
function ThothsMetalSheeting()
+
h = (src_g - src_b) / d;
num_loops = promptNumber("How many passes ?", 1);
+
else
batch = 1;
+
h = (src_b - src_r) / d + 2;
name = "Thoths Metal Sheeting";
 
waitMinutes(10);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Sheeting.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Thoths_Metal_Sheeting.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
 
end
 
end
waitGUI(i);
+
else
end
+
if src_r > src_g then
doneGUI(num_loops);
+
h = (src_g - src_b) / d + 6;
end
+
else
 
+
h = (src_r - src_g) / d + 4;
function WaterMetalStrap()
 
num_loops = promptNumber("How many passes ?", 1);
 
batch = 1;
 
name = "Water Metal Strap";
 
waitMinutes(1);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Straps.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Water_Metal_Strap.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
 
end
 
end
waitGUI(i);
 
 
end
 
end
doneGUI(num_loops);
+
        h = h / 6;
end
+
    end
  
function IronStrap()
+
if h == nil then
num_loops = promptNumber("How many passes ?", 1);
+
error "NO H";
batch = 1;
+
end
name = "Iron Strap";
+
waitMinutes(3);
+
if s == nil then
for i=1, num_loops do
+
error ("NO S  D:" .. d);
while 1 do
+
end
refreshWindows();
+
clickAllImages("Forge/Forge_Straps.png");
+
if l == nil then
lsSleep(400);
+
error "NO L";
project_windows = clickAllImages("Forge/Forge_Iron_Strap.png");
+
end
if project_windows == 0 then
+
sleepWithStatus(1100, "Waiting for Project windows");
+
    return h, s, l;
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
 
end
 
end
  
function AluminumStrap()
+
function rgb2lab(src_r, src_g, src_b)
num_loops = promptNumber("How many passes ?", 1);
+
--R from 0 to 255
batch = 1;
+
--G from 0 to 255
name = "Aluminum Strap";
+
--B from 0 to 255
waitMinutes(1);
+
local r = src_r/255;
for i=1, num_loops do
+
local g = src_g/255;
while 1 do
+
local b = src_b/255;
refreshWindows();
+
clickAllImages("Forge/Forge_Straps.png");
+
if (r > 0.04045) then
lsSleep(400);
+
r = math.pow((r + 0.055) / 1.055, 2.4);
project_windows = clickAllImages("Forge/Forge_Aluminum_Strap.png");
+
else
if project_windows == 0 then
+
r = r / 12.92;
sleepWithStatus(1100, "Waiting for Project windows");
+
end
else
+
if ( g > 0.04045) then
break;
+
g = math.pow((g + 0.055) / 1.055, 2.4);
end
+
else
end
+
g = g / 12.92;
waitGUI(i);
+
end
end
+
if (b > 0.04045) then
doneGUI(num_loops);
+
b = math.pow((b + 0.055) / 1.055, 2.4);
end
+
else
 +
b = b / 12.92;
 +
end
 +
 +
r = r * 100;
 +
g = g * 100;
 +
b = b * 100;
 +
 +
local x = r * 0.4124 + g * 0.3576 + b * 0.1805;
 +
local y = r * 0.2126 + g * 0.7152 + b * 0.0722;
 +
local z = r * 0.0193 + g * 0.1192 + b * 0.9505;
 +
 +
x = x / 95.047;
 +
y = y / 100.000; 
 +
z = z / 108.883;
 +
 +
if ( x > 0.008856 ) then
 +
x = math.pow( x , 1/3 );
 +
else  
 +
x = ( 7.787 * x ) + ( 16/116 );
 +
end
 +
if ( y > 0.008856 ) then
 +
y = math.pow( y , 1/3 );
 +
else
 +
y = ( 7.787 * y ) + ( 16/116 );
 +
end
 +
if ( z > 0.008856 ) then
 +
z = math.pow( z , 1/3 );
 +
else
 +
z = ( 7.787 * z ) + ( 16/116 );
 +
end
 
 
function CopperStrap()
+
local lab_l = ( 116 * y ) - 16;
num_loops = promptNumber("How many passes ?", 1);
+
local lab_a = 500 * ( x - y );
batch = 1;
+
local lab_b = 200 * ( y - z );
name = "Copper Strap";
+
waitMinutes(2);
+
return lab_l, lab_a, lab_b;
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Straps.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Copper_Strap.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
 
end
 
end
  
function IronPoker()
+
--Get nearest color name
num_loops = promptNumber("How many passes ?", 1);
+
function nearestColor(px)
batch = 1;
+
local rgb_r, rgb_g, rgb_b, tst_r, tst_g, tst_b, test_px;
name = "Iron Poker";
+
local lab_l, lab_a, lab_b, lab_tst_l, lab_tst_a, lab_tst_b;
waitMinutes(20);
+
local hsl_h, hsl_s, hsl_l, hsl_tst_h, hsl_tst_s, hsl_tst_l;
for i=1, num_loops do
+
local offset, best_name, best_offset, next_best_offset, confidence;
while 1 do
+
best_offset = 100000;
refreshWindows();
+
next_best_offset = 1000000;
clickAllImages("Forge/Forge_Tools.png");
+
rgb_r = ((math.floor(px/256/256/256) % 256) - 7) * 255/247;
lsSleep(400);
+
rgb_g = ((math.floor(px/256/256) % 256) - 7) * 255/247;
project_windows = clickAllImages("Forge/Forge_Iron_Poker.png");
+
rgb_b = ((math.floor(px/256) % 256) - 5.5) * 255/247;
if project_windows == 0 then
+
lab_l, lab_a, lab_b = rgb2lab(rgb_r, rgb_g, rgb_b);
sleepWithStatus(1100, "Waiting for Project windows");
+
hsl_h, hsl_s, hsl_l = rgb2hsl(rgb_r, rgb_g, rgb_b);
else
+
break;
+
for i=1, #color_names do
end
+
checkBreak();
 +
test_px = color_values[i];
 +
tst_r = (math.floor(test_px/256/256) % 256);
 +
tst_g = (math.floor(test_px/256) % 256);
 +
tst_b = (math.floor(test_px) % 256);
 +
lab_tst_l, lab_tst_a, lab_tst_b = rgb2lab(tst_r, tst_g, tst_b);
 +
hsl_tst_h, hsl_tst_s, hsl_tst_l = rgb2hsl(tst_r, tst_g, tst_b);
 +
 +
---- Different methods to determine "distance" from the ideal colors. Change these to test different options.
 +
 +
--offset = math.abs(rgb_r - tst_r) + math.abs(rgb_g - tst_g) + math.abs(rgb_b - tst_b);
 +
--offset = math.max(math.max((math.abs(rgb_r - tst_r)), math.abs(rgb_g - tst_g)), math.abs(rgb_b - tst_b));
 +
offset = (rgb_r - tst_r)^2 + (rgb_g - tst_g)^2 + (rgb_b - tst_b)^2;
 +
--offset = math.abs(lab_l - lab_tst_l) + math.abs(lab_a - lab_tst_a) + math.abs(lab_b - lab_tst_b);
 +
--offset = (lab_l - lab_tst_l)^2 + (lab_a - lab_tst_a)^2 + (lab_b - lab_tst_b)^2;
 +
--offset = math.max(math.max((math.abs(lab_l - lab_tst_l)), math.abs(lab_a - lab_tst_a)), math.abs(lab_b - lab_tst_b));
 +
--offset = math.abs(hsl_h - hsl_tst_h) + math.abs(hsl_s - hsl_tst_s) + math.abs(hsl_l - hsl_tst_l);
 +
--offset = (hsl_h - hsl_tst_h)^2 + (hsl_s - hsl_tst_s)^2 + (hsl_l - hsl_tst_l)^2;
 +
--offset = math.max(math.max((math.abs(hsl_h - hsl_tst_h)), math.abs(hsl_s - hsl_tst_s)), math.abs(hsl_l - hsl_tst_l));
 +
if (offset < next_best_offset) then
 +
if (offset < best_offset) then
 +
next_best_offset = best_offset;
 +
best_offset = offset;
 +
best_name = color_names[i]; -- .. "   Hex: " .. DEC_HEX(color_values[i]);
 +
else
 +
next_best_offset = offset;
 
end
 
end
waitGUI(i);
+
confidence = ((next_best_offset - best_offset) / best_offset) * 100;
 
end
 
end
doneGUI(num_loops);
+
end
 +
 +
return best_name, math.floor(confidence);
 
end
 
end
  
function SteelBlade()
+
--Check pixel against target
num_loops = promptNumber("How many passes ?", 1);
+
function checkColor(px)
batch = 1;
+
local color_name, confidence;
name = "Steel Blade";
+
color_name, confidence = nearestColor(px);
waitMinutes(10);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Tools.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Steel_Blade.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
end
 
 
 
function LeadChisel()
+
if (color_name:upper() == stop_at_color:upper()) then
num_loops = promptNumber("How many passes ?", 1);
+
return true, confidence;
batch = 1;
+
else
name = "Lead Chisel";
+
return false, 0;
waitMinutes(6);
+
end
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Tools.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Lead_Chisel.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
end
 
doneGUI(num_loops);
 
 
end
 
end
  
function ThothsMetalWire()
+
-- optional message
num_loops = promptNumber("How many passes ?", 1);
+
function askForPixel()
batch = 14;
+
local is_done = false;
name = "Thoths Metal Wire";
+
local have_coords = false;
waitMinutes(5);
+
local color_found = false;
for i=1, num_loops do
+
local color_guess = "NONE";
while 1 do
+
local tst_r, tst_g, tst_b, rgb_r, rgb_g, rgb_b;
refreshWindows();
+
local confidence = 0;
clickAllImages("Forge/Forge_Wire.png");
+
-- Display message until shift is held
lsSleep(400);
+
while not go_now do
project_windows = clickAllImages("Forge/Forge_Thoths_Metal_Wire.png");
+
checkBreak();
if project_windows == 0 then
+
srReadScreen();
sleepWithStatus(1100, "Waiting for Project windows");
+
y = 0;
else
+
mouse_x, mouse_y = srMousePos();
break;
+
if not have_coords then
end
+
lsPrintWrapped(0, y, 1, lsScreenX, 0.7, 0.7, 0xFFFFFFff,
 +
"Mouse over one of the Raeli Oven color pixels and press Shift.");
 +
if lsShiftHeld() then
 +
saved_x = mouse_x;
 +
saved_y = mouse_y;
 +
have_coords = true;
 
end
 
end
waitGUI(i);
+
else
 +
lsPrintWrapped(0, y, 1, lsScreenX, 0.7, 0.7, 0xFFFFFFff,
 +
"Coords chosen, press 'Reset' to change or 'Do It' to start.");
 
end
 
end
doneGUI(num_loops);
+
end
+
y = y + 40;
 
+
if have_coords then
function MetalBlueWire()
+
px = srReadPixel(saved_x, saved_y);
num_loops = promptNumber("How many passes ?", 1);
+
lsPrintWrapped(0, y, 1, lsScreenX, 0.7, 0.7, 0xffffff,
batch = 12;
+
saved_x .. ", " .. saved_y);
name = "Metal Blue Wire";
+
else
waitMinutes(5);
+
px = srReadPixel(mouse_x, mouse_y);
for i=1, num_loops do
+
lsPrintWrapped(0, y, 1, lsScreenX, 0.7, 0.7, 0xB0B0B0ff,
while 1 do
+
mouse_x .. ", " .. mouse_y);
refreshWindows();
 
clickAllImages("Forge/Forge_Wire.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Metal_Blue_Wire.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
 
end
 
end
doneGUI(num_loops);
+
end
+
y = y + 15;
 
+
color_guess, confidence = nearestColor(px);
function MagnesiumWire()
+
lsPrintWrapped(0, y, 1, lsScreenX, 0.7, 0.7, px,
num_loops = promptNumber("How many passes ?", 1);
+
"(" .. (math.floor(px/256/256/256) % 256) .. "," .. (math.floor(px/256/256) % 256) .. "," .. (math.floor(px/256) % 256) .. "," .. (px % 256) .. ") Hex: " .. DEC_HEX(math.floor((px/256) % 16777216)));
batch = 10;
+
name = "Magnesium Wire";
+
y = y + 20;
waitMinutes(1);
+
lsPrintWrapped(0, y, 1, lsScreenX, 0.7, 0.7, px, "Best guess: " .. color_guess);
for i=1, num_loops do
+
y = y + 15;
while 1 do
+
lsPrintWrapped(0, y, 1, lsScreenX, 0.7, 0.7, px, "Confidence: " .. confidence .. "  (higher is better)");
refreshWindows();
+
clickAllImages("Forge/Forge_Wire.png");
+
-- Testing other methods of grabbing the pixel, making sure RGBA values match
lsSleep(400);
+
-- srReadScreen();
project_windows = clickAllImages("Forge/Forge_Magnesium_Wire.png");
+
-- px2 = srReadPixelFromBuffer(mouse_x, mouse_y);
if project_windows == 0 then
+
-- lsPrintWrapped(0, 80, 1, lsScreenX, 0.7, 0.7, 0xB0B0B0ff,
sleepWithStatus(1100, "Waiting for Project windows");
+
-- mouse_x .. ", " .. mouse_y .. " = " .. (math.floor(px2/256/256/256) % 256) .. "," .. (math.floor(px2/256/256) % 256) .. "," .. (math.floor(px2/256) % 256) .. "," .. (px2 % 256) );
else
+
-- lsButtonText(lsScreenX - 110, lsScreenY - 90, 0, 100, px, "test1");
break;
+
-- lsButtonText(lsScreenX - 110, lsScreenY - 60, 0, 100, px2, "test2");
 +
 +
y = y + 20;
 +
take_screenshots = lsCheckBox(15, y, z, 0xffffffff, " Take Screenshots", take_screenshots);
 +
 +
y = y + 20;
 +
stop_at_CB = lsCheckBox(15, y, z, 0xffffffff, " Stop at Color", stop_at_CB);
 +
 +
if stop_at_CB then
 +
y = y + 25;
 +
is_done = false;
 +
color_found = false;
 +
-- Edit box and text display
 +
lsPrint(10, y, z, 0.7, 0.7, 0xFFFFFFff, "Desired Color:");
 +
 +
y = y + 20;
 +
-- lsEditBox returns two different things (a state and a value)
 +
is_done, stop_at_color = lsEditBox("Desired Color:", 10, y, z, 250, 30, 0.7, 0.7, 0x000000ff, "White");
 +
--dropdown_color_cur_value = lsDropdown("ColorDropDown1", 5, y, 0, 200, dropdown_color_cur_value, color_names);
 +
 +
for i=0, #color_names do
 +
if stop_at_color and color_names[i] then
 +
if (stop_at_color:upper() == (color_names[i]):upper()) then
 +
color_found = true;
 +
end
 
end
 
end
 
end
 
end
waitGUI(i);
+
end
+
if not color_found then
doneGUI(num_loops);
+
lsPrint(130, y - 20, z, 0.7, 0.7, 0xFF0000ff, "No such color (Remove any spaces)");
end
 
 
 
function OctecsAlloyWire()
 
num_loops = promptNumber("How many passes ?", 1);
 
batch = 16;
 
name = "Octecs Alloy Wire";
 
waitMinutes(10);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Wire.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Octecs_Alloy_Wire.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
 
end
 
end
waitGUI(i);
+
end
+
y = y + 35;
doneGUI(num_loops);
+
lsPrint(5, y, 0, 0.6, 0.6, 0xffffffff, "Confidence Required:");
end
+
is_done, confidence_threshold = lsEditBox("confthresh", 150, y, 0, 50, 30, 0.7, 0.7, 0x000000ff, confidence_threshold);
 
+
confidence_threshold = tonumber(confidence_threshold);
function SilverWire()
+
if not confidence_threshold then
num_loops = promptNumber("How many passes ?", 1);
+
lsPrint(10, y+17, 10, 0.4, 0.4, 0xFF2020ff, "MUST BE A NUMBER");
batch = 5;
+
confidence_threshold = 10;
name = "Silver Wire";
 
waitMinutes(5);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Wire.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Silver_Wire.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
 
end
 
end
waitGUI(i);
+
else
 +
is_done = true;
 +
color_found = true;
 
end
 
end
doneGUI(num_loops);
+
end
+
if have_coords then
 
+
if color_found then
function CopperWire()
+
if lsButtonText(10, lsScreenY - 30, 0, 80, 0xFFFFFFff, "Do It") then
num_loops = promptNumber("How many passes ?", 1);
+
go_now = true;
batch = 20;
 
name = "Copper Wire";
 
waitMinutes(5);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Wire.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Copper_Wire.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
 
end
 
end
 
end
 
end
waitGUI(i);
+
end
+
if lsButtonText(100, lsScreenY - 30, 0, 80, 0xFFA500ff, "Reset") then
doneGUI(num_loops);
+
have_coords = false;
end
 
 
 
function SteelWire()
 
num_loops = promptNumber("How many passes ?", 1);
 
batch = 20;
 
name = "Steel Wire";
 
waitMinutes(5);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Wire.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Steel_Wire.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
 
end
 
end
waitGUI(i);
 
 
end
 
end
doneGUI(num_loops);
+
end
+
if lsButtonText(lsScreenX - 110, lsScreenY - 30, 0, 100, 0xFFFFFFff, "Exit") then
 
+
error "Canceled";
function GoldWire()
 
num_loops = promptNumber("How many passes ?", 1);
 
batch = 10;
 
name = "Gold Wire";
 
waitMinutes(10);
 
for i=1, num_loops do
 
while 1 do
 
refreshWindows();
 
clickAllImages("Forge/Forge_Wire.png");
 
lsSleep(400);
 
project_windows = clickAllImages("Forge/Forge_Gold_Wire.png");
 
if project_windows == 0 then
 
sleepWithStatus(1100, "Waiting for Project windows");
 
else
 
break;
 
end
 
end
 
waitGUI(i);
 
 
end
 
end
doneGUI(num_loops);
+
lsDoFrame();
 +
end
 +
-- Wait for shift to be released
 +
while lsShiftHeld() do end;
 +
xyWindowSize = srGetWindowSize();
 
end
 
end
  
  
function Bars()
+
function doit()
 +
askForWindow(askText);
 +
askForPixel();
 +
 +
local t0 = lsGetTimer();
 +
local px = 0;
 +
local index=0;
 +
local color_name, confidence;
 +
local do_screenshot, do_end_burn;
 
while 1 do
 
while 1 do
-- Ask for which button
+
local y = 0;
local image_name = nil;
+
do_screenshot = false;
local is_done = nil;
+
checkBreak();
while not is_done do
+
lsSleep(100);
local y = nil;
+
srReadScreen();
local x = nil;
+
new_px = srReadPixel(saved_x, saved_y);
local bsize = nil;
+
local t = (lsGetTimer() - t0) / 1000 / 60;
for i=1, #bar_button_names do
+
t = math.floor(t*10 + 0.5)/10;
if bar_button_names[i] == "Iron Bar" then
+
local t_string = t;
x = 30;
+
if not (new_px == px) then
y = 10;
+
index = index+1;
bsize = 250;
+
px = new_px;
elseif bar_button_names[i] == "Gold Bar" then
+
color_name, confidence = nearestColor(px);
x = 30;
+
if take_screenshots then
y = 40;
+
do_screenshot = true;
bsize = 250;
+
end
elseif bar_button_names[i] == "Silver Bar" then
+
x = 30;
+
if stop_at_CB then
y = 70;
+
if (color_name:upper() == stop_at_color:upper()) then
bsize = 250;
+
if confidence > confidence_threshold then
end
+
do_end_burn = true;
if lsButtonText(x, y, 0, bsize, 0x80D080ff, bar_button_names[i]) then
+
else
image_name = bar_button_names[i];
+
for i = 1, 3 do
is_done = 1;
+
lsPlaySound("Clank.wav");
 +
lsSleep(50);
 +
end
 +
end
 +
else
 +
lsPlaySound("Clank.wav");
 
end
 
end
 +
else
 +
lsPlaySound("Clank.wav");
 
end
 
end
 
+
end
if lsButtonText(lsScreenX - 110, lsScreenY - 30, z, 100, 0xFFFFFFff, "End script") then
+
error "Clicked End Script button";
+
end
+
y = y + 5;
lsDoFrame();
+
lsPrintWrapped(5, y, 1, lsScreenX - 10, 0.7, 0.7, 0xFFFFFFff,
lsSleep(10);
+
"Screen: " .. index .. "  Timer: " .. t_string);
 +
y = y + 15;
 +
lsPrintWrapped(5, y, 1, lsScreenX - 10, 0.7, 0.7, 0xFFFFFFff,
 +
"Color: " .. color_name .. "  Confidence: " .. confidence);
 +
 +
y = y + 30;
 +
lsPrintWrapped(5, y, 1, lsScreenX - 10, 0.7, 0.7, 0xFFFFFFff,
 +
"(" .. (math.floor(px/256/256/256) % 256) .. "," .. (math.floor(px/256/256) % 256) .. "," .. (math.floor(px/256) % 256) .. "," .. (px % 256) .. ")  Hex: " .. DEC_HEX(math.floor((new_px/256) % 16777216)));
 +
 +
if lsButtonText(lsScreenX - 110, lsScreenY - 30, 0, 100, 0xFFFFFFff, "Exit") then
 +
error "Canceled";
 
end
 
end
 +
lsDoFrame();
 +
srReadScreen();
 +
if do_screenshot then
 +
srSaveLastReadScreen("screen_" .. index .. "_" .. t_string .. ".png");
 +
end
 
 
if image_name == "Iron Bar" then
+
if do_end_burn then
IronBar();
+
clickAllText("Interrupt");
elseif image_name == "Gold Bar" then
+
lsPlaySound("Complete.wav");
GoldBar();
+
error ("Stopped burn at: " .. stop_at_color .. "  Confidence: " .. confidence);
elseif image_name == "Silver Bar" then
 
SilverBar();
 
 
end
 
end
 
end
 
end
 
end
 
end
 +
</pre>
 +
{{Collapse bottom}}
  
function Sheeting()
+
{{Collapse top|title=Food Timer (IN TESTING v1)}}
while 1 do
+
<pre>
-- Ask for which button
+
-- Food stat timer, made by Selune. Version 1.
local image_name = nil;
+
 
local is_done = nil;
+
loadfile("luaScripts/screen_reader_common.inc")();
while not is_done do
+
loadfile("luaScripts/ui_utils.inc")();
local y = nil;
 
local x = nil;
 
local bsize = nil;
 
for i=1, #sheeting_button_names do
 
if sheeting_button_names[i] == "Lead Sheeting" then
 
x = 30;
 
y = 10;
 
bsize = 150;
 
elseif sheeting_button_names[i] == "Gold Sheeting" then
 
x = 30;
 
y = 35;
 
bsize = 150;
 
elseif sheeting_button_names[i] == "Copper Sheeting" then
 
x = 30;
 
y = 60;
 
bsize = 150;
 
        elseif sheeting_button_names[i] == "Treated Metal Sheeting" then
 
x = 30;
 
y = 285;
 
bsize = 150;
 
elseif sheeting_button_names[i] == "Octecs Alloy Sheeting" then
 
x = 30;
 
y = 85;
 
bsize = 150;
 
elseif sheeting_button_names[i] == "Silver Sheeting" then
 
x = 30;
 
y = 110;
 
bsize = 150;
 
elseif sheeting_button_names[i] == "Steel Sheeting" then
 
x = 30;
 
y = 135;
 
bsize = 150;
 
elseif sheeting_button_names[i] == "Gold Foil" then
 
x = 30;
 
y = 160;
 
bsize = 150;
 
elseif sheeting_button_names[i] == "Metal Blue Sheeting" then
 
x = 30;
 
y = 185;
 
bsize = 150;
 
elseif sheeting_button_names[i] == "Tin Sheeting" then
 
x = 30;
 
y = 210;
 
bsize = 150;
 
elseif sheeting_button_names[i] == "Moon Steel Sheeting" then
 
x = 30;
 
y = 235;
 
bsize = 150;
 
elseif sheeting_button_names[i] == "Thoths Metal Sheeting" then
 
x = 30;
 
y = 260;
 
bsize = 150;
 
end
 
if lsButtonText(x, y, 0, 250, 0x80D080ff, sheeting_button_names[i]) then
 
image_name = sheeting_button_names[i];
 
is_done = 1;
 
end
 
end
 
  
if lsButtonText(lsScreenX - 110, lsScreenY - 30, z, 100, 0xFFFFFFff, "End script") then
+
per_click_delay = 10;
error "Clicked End Script button";
+
log_lines = {};
end
+
num_log_lines = 10;
lsDoFrame();
+
food_name = "Blocker";
lsSleep(10);
+
function log(msg)
end
+
lsPrintln(msg);
+
if #log_lines == num_log_lines then
if image_name == "Lead Sheeting" then
+
for i=1,num_log_lines-1 do
LeadSheeting();
+
log_lines[i] = log_lines[i+1];
elseif image_name == "Gold Sheeting" then
 
GoldSheeting();
 
elseif image_name == "Copper Sheeting" then
 
CopperSheeting();
 
    elseif image_name == "Treated Metal Sheeting" then
 
TreatedSheeting();
 
elseif image_name == "Octecs Alloy Sheeting" then
 
OctecsAlloySheeting();
 
elseif image_name == "Silver Sheeting" then
 
SilverSheeting();
 
elseif image_name == "Steel Sheeting" then
 
SteelSheeting();
 
elseif image_name == "Gold Foil" then
 
GoldFoil();
 
elseif image_name == "Metal Blue Sheeting" then
 
MetalBlueSheeting();
 
elseif image_name == "Tin Sheeting" then
 
TinSheeting();
 
elseif image_name == "Moon Steel Sheeting" then
 
MoonSteelSheeting();
 
elseif image_name == "Thoths Metal Sheeting" then
 
ThothsMetalSheeting();
 
 
end
 
end
 +
log_lines[num_log_lines] = msg;
 +
else
 +
log_lines[#log_lines+1] = msg;
 
end
 
end
 +
end
  
 
+
local last_time = 0;
 +
function timedLog(new_time)
 +
local timeDiff;
 +
 +
timeDiff = new_time - last_time;
 +
last_time = new_time;
 +
 +
log(food_name .. " -- Duration: " .. math.floor(timeDiff / 1000 / 60) .. ":" .. math.mod(timeDiff / 1000, 60));
 
end
 
end
  
function Straps()
+
function askForImage()
while 1 do
+
haveCoords = false;
-- Ask for which button
+
go_now = false;
local image_name = nil;
+
while not go_now do
 
+
checkBreak();
 
+
srReadScreen();
local is_done = nil;
+
mouse_x, mouse_y = srMousePos();
while not is_done do
+
local y = 10;
local y = nil;
+
local x = 40;
local x = nil;
+
local bsize = nil;
+
if not have_coords then
for i=1, #straps_button_names do
+
lsPrintWrapped(x, y, 1, lsScreenX - x - 10, 0.7, 0.7, 0xFFFFFFff,
if straps_button_names[i] == "Water Metal Strap" then
+
"Put your mouse in the top left of the Strength stat NUMBER. You should see all stat values in the preview. It doesn't have to be perfect!");
x = 30;
+
y = 10;
+
srMakeImage("CUSTOM", mouse_x, mouse_y, 10, 100);
bsize = 250;
+
if lsShiftHeld() then
elseif straps_button_names[i] == "Iron Strap" then
+
saved_x = mouse_x;
x = 30;
+
saved_y = mouse_y;
y = 40;
+
have_coords = true;
bsize = 250;
 
elseif straps_button_names[i] == "Aluminum Strap" then
 
x = 30;
 
y = 70;
 
bsize = 250;
 
elseif straps_button_names[i] == "Copper Strap" then
 
x = 30;
 
y = 100;
 
bsize = 250;
 
end
 
if lsButtonText(x, y, 0, bsize, 0x80D080ff, straps_button_names[i]) then
 
image_name = straps_button_names[i];
 
is_done = 1;
 
end
 
 
end
 
end
 
+
else
if lsButtonText(lsScreenX - 110, lsScreenY - 30, z, 100, 0xFFFFFFff, "End script") then
+
lsPrintWrapped(x, y, 1, lsScreenX - x - 10, 0.7, 0.7, 0xFFFFFFff,
error "Clicked End Script button";
+
"Coords chosen, press 'Reset' to change or 'Do It' to start.");
end
+
srMakeImage("CUSTOM", saved_x, saved_y, 10, 100);
lsDoFrame();
+
end
lsSleep(10);
 
end
 
 
 
if image_name == "Water Metal Strap" then
+
if have_coords then
WaterMetalStrap();
+
if lsButtonText(10, lsScreenY - 30, 0, 80, 0xFFFFFFff, "Do It") then
elseif image_name == "Iron Strap" then
+
go_now = true;
IronStrap();
 
elseif image_name == "Aluminum Strap" then
 
AluminumStrap();
 
elseif image_name == "Copper Strap" then
 
CopperStrap();
 
end
 
end
 
end
 
 
 
function Tools()
 
while 1 do
 
-- Ask for which button
 
local image_name = nil;
 
local is_done = nil;
 
while not is_done do
 
local y = nil;
 
local x = nil;
 
local bsize = nil;
 
for i=1, #tools_button_names do
 
if tools_button_names[i] == "Iron Poker" then
 
x = 30;
 
y = 10;
 
bsize = 250;
 
elseif tools_button_names[i] == "Steel Blade" then
 
x = 30;
 
y = 40;
 
bsize = 250;
 
elseif tools_button_names[i] == "Lead Chisel" then
 
x = 30;
 
y = 70;
 
bsize = 250;
 
end
 
if lsButtonText(x, y, 0, bsize, 0x80D080ff, tools_button_names[i]) then
 
image_name = tools_button_names[i];
 
is_done = 1;
 
end
 
 
end
 
end
 
+
if lsButtonText(lsScreenX - 110, lsScreenY - 30, z, 100, 0xFFFFFFff, "End script") then
+
if lsButtonText(100, lsScreenY - 30, 0, 80, 0xFFA500ff, "Reset") then
error "Clicked End Script button";
+
have_coords = false;
 
end
 
end
lsDoFrame();
+
end
lsSleep(10);
 
end
 
 
 
if image_name == "Iron Poker" then
+
if lsButtonText(lsScreenX - 100, lsScreenY - 30, 0, 80, 0xFFFFFFff, "Exit") then
IronPoker();
+
error "Canceled";
elseif image_name == "Steel Blade" then
 
SteelBlade();
 
elseif image_name == "Lead Chisel" then
 
LeadChisel();
 
 
end
 
end
 +
 +
srShowImageDebug("CUSTOM", 8, 8, 1, 3);
 +
lsDoFrame();
 
end
 
end
 
end
 
end
  
function Wire()
+
function doit()
 +
askForWindow("Food Timer - Records how long a particular meal lasts, down to the half-second. Works even with aqueduct or other already-running food buffs (So eat blocker first!) Made by Selune!");
 +
askForImage();
 +
srMakeImage("CUR_STATS", saved_x, saved_y, 10, 100);
 +
 +
for i=1, 20 do
 +
log("...");
 +
end
 +
 +
local t0 = lsGetTimer();
 +
local new_time;
 
while 1 do
 
while 1 do
-- Ask for which button
+
local i = 0;
local image_name = nil;
+
local y = 5;
local is_done = nil;
+
local x = 40;
while not is_done do
+
local is_done = false;
local y = nil;
+
new_time = lsGetTimer();
local x = nil;
+
checkBreak();
local bsize = nil;
+
lsSleep(100);
for i=1, #wire_button_names do
+
srReadScreen();
if wire_button_names[i] == "Thoths Metal Wire" then
+
x = 30;
+
lsPrintWrapped(x, y, 1, lsScreenX - x - 10, 1, 1, 0xFFFFFFff,
y = 10;
+
"Now recording, eat up!");
bsize = 150;
+
elseif wire_button_names[i] == "Metal Blue Wire" then
+
y = y + 25;
x = 30;
+
lsPrintWrapped(x, y, 1, lsScreenX - x - 10, 1, 1, 0xFF2020ff,
y = 35;
+
"Remember to block first!");
bsize = 150;
+
elseif wire_button_names[i] == "Magnesium Wire" then
+
y = y + 30;
x = 30;
+
lsPrintWrapped(x, y, 1, lsScreenX - x - 10, 0.7, 0.7, 0xC0C0C0ff,
y = 60;
+
"Name (for log):");
bsize = 150;
+
elseif wire_button_names[i] == "Octecs Alloy Wire" then
+
y = y + 20;
x = 30;
+
is_done, food_name = lsEditBox("Food Name:", x, y, z, 250, 30, 0.7, 0.7, 0x000000ff, food_name);
y = 85;
+
bsize = 150;
+
if not srFindImageInRange("CUR_STATS", saved_x, saved_y, 10, 100) then
elseif wire_button_names[i] == "Silver Wire" then
+
lsSleep(500);
x = 30;
+
srReadScreen();
y = 110;
+
srMakeImage("CUR_STATS", saved_x, saved_y, 10, 100);
bsize = 150;
+
for i = 1, 3 do
elseif wire_button_names[i] == "Copper Wire" then
+
lsPlaySound("Clank.wav");
x = 30;
+
lsSleep(100);
y = 135;
 
bsize = 150;
 
elseif wire_button_names[i] == "Steel Wire" then
 
x = 30;
 
y = 160;
 
bsize = 150;
 
elseif wire_button_names[i] == "Gold Wire" then
 
x = 30;
 
y = 185;
 
bsize = 150;
 
end
 
if lsButtonText(x, y, 0, 250, 0x80D080ff, wire_button_names[i]) then
 
image_name = wire_button_names[i];
 
is_done = 1;
 
end
 
 
end
 
end
 
+
timedLog(new_time - t0);
if lsButtonText(lsScreenX - 110, lsScreenY - 30, z, 100, 0xFFFFFFff, "End script") then
+
end
error "Clicked End Script button";
+
 +
y = y + 30;
 +
if #log_lines then
 +
for i=1, #log_lines do
 +
lsPrint(x + 10, y, 1, 0.7, 0.7, 0x808080ff, log_lines[i]);
 +
y = y + 15;
 
end
 
end
lsDoFrame();
+
end
lsSleep(10);
+
 +
if lsButtonText(lsScreenX - 110, lsScreenY - 30, 0, 100, 0xFFFFFFff, "Exit") then
 +
error "Canceled";
 
end
 
end
 
 
if image_name == "Thoths Metal Wire" then
+
srShowImageDebug("CUR_STATS", 8, 8, 1, 3);
ThothsMetalWire();
+
lsDoFrame();
elseif image_name == "Metal Blue Wire" then
 
MetalBlueWire();
 
elseif image_name == "Magnesium Wire" then
 
MagnesiumWire();
 
elseif image_name == "Octecs Alloy Wire" then
 
OctecsAlloyWire();
 
elseif image_name == "Silver Wire" then
 
SilverWire();
 
elseif image_name == "Copper Wire" then
 
CopperWire();
 
elseif image_name == "Steel Wire" then
 
SteelWire();
 
elseif image_name == "Gold Wire" then
 
GoldWire();
 
end
 
 
end
 
end
 
end
 
end
 
</pre>
 
</pre>
 +
{{Collapse bottom}}

Latest revision as of 21:04, 9 February 2013

Selune's Macros have been updated to the TaleScripts repository. Please leave any ideas for improvements or new macros here.