The Wiki for Tale 7 is in read-only mode and is available for archival and reference purposes only. Please visit the current Tale 11 Wiki in the meantime.

If you have any issues with this Wiki, please post in #wiki-editing on Discord or contact Brad in-game.

User:Wimsankh/lilyfish

From ATITD7
Jump to navigationJump to search

-- 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.


-- Almost all issues can be corrected by slightly adjusting the main chat window size and restarting. -- And also verify the lines aren't wrapping to the next line (if so, adjust chat screen to be wider until it is no longer wrapping down to next line).


-- Note: These are currently refered to as Common Fish in the below 'SkipCommon' type of fishes (True or False), checkbox.

--Abdju --Chromis --Catfish --Carp --Perch --Phagrus --Tilapia



dofile("common.inc"); dofile("Fishing_Func.inc");


-- These used to be hardcoded, but now only affects what checkboxes are checked/unchecked upon starting the macro up.

SkipCommon = false; --Skips to next lure if fish caught is a common (Choose True or False). --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. This might be a future project...

-- 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 = false; -- 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 = false; -- 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 = false; -- Do you want to add Odd fish to the log file? Note the log will still add an entry if you lost lure. muteSoundEffects = false;

function setOptions()

 local is_done = false;
 local count = 1;
 while not is_done do
 lsDoFrame();

checkBreak(); local y = 10;

   lsSetCamera(0,0,lsScreenX*1.3,lsScreenY*1.3);  -- Shrink the text boxes and text down
     lsPrint(5, y, 0, 0.8, 0.8, 0xffffffff, "Casts per Lure?");
     is_done, TotalCasts = lsEditBox("totalcasts", 160, y, 0, 40, 25, 1.0, 1.0, 0x000000ff, 4);
     TotalCasts = tonumber(TotalCasts);
     if not TotalCasts then
       is_done = false;
       lsPrint(10, y+22, 10, 0.7, 0.7, 0xFF2020ff, "MUST BE A NUMBER");
       TotalCasts = 4;
     end

y = y + 40;

     lsPrint(5, y, 0, 0.8, 0.8, 0xffffffff, "Cast Timer (ms):");
     is_done2, castWaitTimer = lsEditBox("castwaittimer", 160, y, 0, 65, 25, 1.0, 1.0, 0x000000ff, 15000);
     castWaitTimer = tonumber(castWaitTimer);
     if not castWaitTimer then
       is_done2 = false;
       lsPrint(10, y+22, 10, 0.7, 0.7, 0xFF2020ff, "MUST BE A NUMBER");
       castWaitTimer = 15000;
     end
     lsSetCamera(0,0,lsScreenX*1.0,lsScreenY*1.0);  -- Restore text boxes and text back to normal

y = y + 30;

     lsPrint(5, y, 0, 0.6, 0.6, 0xffffffff, "Casts per Lure?  # Casts before switching lures.");

y = y + 16;

     lsPrint(5, y, 0, 0.6, 0.6, 0xffffffff, "Cast Timer: 15s (15000ms) is idea.");

y = y + 16;

     lsPrint(5, y, 0, 0.6, 0.6, 0xffffffff, "  This is delay between each time you cast.");

y = y + 16;

     lsPrint(5, y, 0, 0.6, 0.6, 0xffffffff, "  You can slightly lower time with +Focus food.");

y = y + 16;

     lsPrint(5, y, 0, 0.6, 0.6, 0xffffffff, "  Increase if 'Already Fishing' messages occur.");
     lsSetCamera(0,0,lsScreenX*1.4,lsScreenY*1.4);  -- Shrink the check boxes and text down

y = y + 85;

muteSoundEffects = lsCheckBox(10, y, 10, 0xFFFFFFff, " Mute Sound Effects", muteSoundEffects);

y = y + 25; SkipCommon = lsCheckBox(10, y, 10, 0xFFFFFFff, " Skip Common Fish", SkipCommon); y = y + 25; lsPrintWrapped(10, y, 0, lsScreenX + 82, 0.7, 0.7, 0xffff80ff, "If Common Fish Caught, immediately switch to next lure:"); y = y + 18 lsPrintWrapped(10, y, 0, lsScreenX + 80, 0.7, 0.7, 0xffffffff, "(Abdju, Chromis, Catfish, Carp, Perch, Phagrus, Tilapia)"); y = y + 30; lsPrintWrapped(10, y, 0, lsScreenX + 80, 0.8, 0.8, 0x80ff80ff, "Log entries to FishLog.txt in Automato/games/ATITD folder."); y = y + 25; LogFails = lsCheckBox(10, y, 10, 0xFFFFFFff, " Log Failed Catches", LogFails); y = y + 25; LogStrangeUnusual = lsCheckBox(10, y, 10, 0xFFFFFFff, " Log Strange & Unusual Fish Seen ...", LogStrangeUnusual); y = y + 25; LogOdd = lsCheckBox(10, y, 10, 0xFFFFFFff, " Log Odd Fish Seen ...", LogOdd);

     lsSetCamera(0,0,lsScreenX*1.0,lsScreenY*1.0);  -- Restore text boxes and text back to normal

if setResume then buttonName = "Set/Resume"; else buttonName = "Start"; end

if lsButtonText(10, lsScreenY - 30, 0, 130, 0xFFFFFFff, buttonName) then

       is_done = 1;

setResume = false; end

   if lsButtonText(lsScreenX - 110, lsScreenY - 30, 0, 100, 0xFFFFFFff,
                   "End script") then
     error(quitMessage);
   end
 --lsDoFrame();

if castWait > 0 then castWait = castWait - 100; end

 lsSleep(100);
 end
 return count;

end


function checkBreakSpecial()

   while setPause do

if castWait > 0 then castWait = castWait - 100 -- Finish the cast timer off, even while we are paused... end checkBreak(); lsSleep(100);

     statusScreen("Fishing macro is Paused!\n\nClick Unpause to resume ...\n\nCast Timer finishing up ... " .. castWait/1000, 0xffffffff, false);

if lsButtonText(lsScreenX - 110, lsScreenY - 60, z, 100, 0xFFFFFFff, "Unpause") or (lsAltHeld() and lsShiftHeld()) then setPause = false; gui_refresh(); end

   end

end


function SetupLureGroup() TLures = {}; FirstLure=""; LastLure = "";

if not muteSoundEffects then lsPlaySound("moneycounter.wav"); end

lsDoFrame(); statusScreen("Indexing Lures ..."); checkBreak() srReadScreen(); FindPin = srFindImage("UnPin.png"); if FindPin then --Click the pinup to refresh the lures window (in case a lure was lost earlier, it would still be showing on menu). srClickMouseNoMove(FindPin[0]+20,FindPin[1]+20); lsSleep(200); srReadScreen(); -- Push Up arrow, just in case its current at bottom of list DownPin = srFindImageInRange("Fishing/Menu_DownArrow.png",FindPin[0]-10,FindPin[1],50,500); if DownPin then UpArrow = srFindImageInRange("Fishing/Menu_UpArrow.png",FindPin[0]-10,FindPin[1],50,50); if UpArrow then srClickMouseNoMove(UpArrow[0]+5,UpArrow[1]+5); lsSleep(200); 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 error("Didn\'t find Lures pinned window - Self Click->Skills, Fishing -> Use Lure, PIN THIS WINDOW!"); end


if LastLure ~= nil then --We have last lure, and arrows showing ChangeLureMenu = LastLure;


FirstLurLoc = srFindImage("fishing/" .. FirstLure); LastLurLoc = srFindImage("fishing/" .. LastLure);


lureCounter = 0; for i = 1, #Lures,1 do test = srFindImageInRange(("fishing/" .. Lures[i]),FirstLurLoc[0]-5,FirstLurLoc[1]-5,175,500); if test then --Add Lure lureCounter = lureCounter + 1; statusScreen("Indexing Lures (" .. lureCounter .. ") ..."); table.insert(TLures,Lures[i]); 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(200); srReadScreen(); 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

else --No arrows, just get lures lureCounter = 0; for i = 1, #Lures, 1 do test = srFindImage("Fishing/" .. Lures[i]); if test then lureCounter = lureCounter + 1; statusScreen("Indexing Lures (" .. lureCounter .. ") ..."); table.insert(TLures,Lures[i]); end end end

return TLures; end


function FindLureName(x,y,w,h)

for i = 1, #Lures, 1 do Lure = srFindImageInRange("Fishing/" .. Lures[i], x,y,w,h); if Lure then return Lures[i] end end end


function UseLure()

checkBreak(); if #TLures == 0 then if not muteSoundEffects then lsPlaySound("fail.wav"); end error 'Can\'t find any lures on the pinned window. Did you run out of lures?' end

CurrentLure = string.sub(PlayersLures[CurrentLureIndex],string.find(PlayersLures[CurrentLureIndex],"_")+1,string.len(PlayersLures[CurrentLureIndex])-4); if #TLures == 1 then QCurrentLure = CurrentLure; QCurrentLureIndex = CurrentLureIndex; else QCurrentLure = string.sub(PlayersLures[QCurrentLureIndex],string.find(PlayersLures[QCurrentLureIndex],"_")+1,string.len(PlayersLures[QCurrentLureIndex])-4); end

-- Uses lure according to CurrentLureIndex, which is used in PlayersLures which contains each lure the player has. lsDoFrame(); -- Blank the screen so next statusScreen messages isn't mixed/obscured with previous gui_refresh info on screen lsSleep(10); if LostLure == 0 then statusScreen("Switching Lures | " .. QCurrentLure); lsSleep(750); else if not muteSoundEffects then lsPlaySound("boing.wav"); end statusScreen("Lost Lure! | " .. lastLostLure .. "\nSwitching Lures | " .. QCurrentLure); table.insert(lostlure_log, Time .. " | " .. lastLostLure .. " (" .. lastLostLureType .. ")"); LostLure = 0; lsSleep(1000); end


srReadScreen(); --Only the first 30 lures will show in window, 31+ needs the down arrow clicked to be viewed, else click the up arrow (if more than 30 lures). if QCurrentLureIndex > 30 then down = srFindImage("Fishing/Menu_DownArrow.png"); srClickMouseNoMove(down[0]+5,down[1]+5); lsSleep(200); elseif #PlayersLures > 30 then up = srFindImage("Fishing/Menu_UpArrow.png"); srClickMouseNoMove(up[0]+5,up[1]+5); lsSleep(200); end

srReadScreen(); lure = srFindImage("Fishing/" .. PlayersLures[QCurrentLureIndex]); if lure then srClickMouseNoMove(lure[0]+3,lure[1]+3); lsSleep(200); srReadScreen();

-- Find Lure Type for i = 1, #Lure_Types, 1 do test = srFindImage("Fishing/" .. Lure_Types[i]); if test then LureType = Lure_Types[i]; LureType = string.sub(Lure_Types[i],string.find(Lure_Types[i],"Menu_")+5,string.len(Lure_Types[i])-4); if not muteSoundEffects then lsPlaySound("high_rise.wav"); end --Click it! srClickMouseNoMove(test[0]+3,test[1]+3); break; end end


end end

function ChatReadFish() --Find the last line of chat --lsSleep(100); checkBreak(); srReadScreen(); imgs = findAllImages("fishing/chatlog_reddots.png"); Coords = imgs[#imgs];

if not Coords or #imgs == 0 then if not muteSoundEffects then lsPlaySound("timer.wav"); end end

-- Wait for Main chat screen and alert user if its not showing while not Coords or #imgs == 0 do checkBreak(); srReadScreen(); imgs = findAllImages("Fishing/chatlog_reddots.png"); Coords = imgs[#imgs]; sleepWithStatus(100, "Looking for Main chat screen ..."); 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 --error("Unknown Fish! PLEASE, Take screenshot (Alt+C) of main chat tab, share with Talescripts team!"); Sfish = "Error/Unknown" end

--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 GrandTotaldb = GrandTotaldb + SNum; return("[" .. CurrentLure .. " (" .. LureType .. ")] " .. Sfish .. " (" .. SNum .. "db)");

end


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); checkBreak(); srReadScreen(); imgs = findAllImages("Fishing/chatlog_reddots.png"); Coords = imgs[#imgs];

if not Coords or #imgs == 0 then if not muteSoundEffects then lsPlaySound("timer.wav"); end end -- Wait for Main chat screen and alert user if its not showing while not Coords or #imgs == 0 do checkBreak(); srReadScreen(); imgs = findAllImages("Fishing/chatlog_reddots.png"); Coords = imgs[#imgs]; sleepWithStatus(100, "Looking for Main chat screen ..."); end

gui_refresh();


if line and line > 0 then Coords = imgs[(#imgs) - line];

-- Wait for Main chat screen and alert user if its not showing --while not Coords or #imgs == 0 do --checkBreak(); --srReadScreen(); --imgs = findAllImages("Fishing/chatlog_reddots.png"); --Coords = imgs[#imgs]; --sleepWithStatus(100, "Looking for Main chat screen ..."); --end

--if not Coords then --error 'Main chat tab is not showing or the chat window needs to be adjusted!' --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


--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


function findClockInfo() srReadScreen();

 anchor = findText("Year");
 if(not anchor) then
   anchor = findText("ar 1");
 end
 if(not anchor) then
   anchor = findText("ar 2");
 end
 if(not anchor) then
   anchor = findText("ar 3");
 end
 if(not anchor) then
   anchor = findText("ar 4");
 end
 if(not anchor) then
   anchor = findText("ar 5");
 end
 if(not anchor) then
   anchor = findText("ar 6");
 end
 if(not anchor) then
   anchor = findText("ar 7");
 end
 if(not anchor) then
   anchor = findText("ar 8");
 end
 if(not anchor) then
   anchor = findText("ar 9");
 end


 if anchor then
   lsPrintln("Found Clock");
   window = getWindowBorders(anchor[0], anchor[1]);
   lines = findAllText(nil, window, nil, NOPIN);
   for i=1,#lines do
     --lsPrintln("LINE " .. i .. " : " .. table.concat(lines[i], ","));

theDateTime = table.concat(lines[1], ",") -- Line 1 on the clock theDateTime = string.sub(theDateTime,string.find(theDateTime,",") + 1); regionCoords = table.concat(lines[2], ",") -- Line 2 on the clock regionCoords = string.sub(regionCoords,string.find(regionCoords,",") + 1); Coordinates = string.sub(regionCoords,string.find(regionCoords,":") + 2); stripYear = string.sub(theDateTime,string.find(theDateTime,",") + 2); Time = string.sub(stripYear,string.find(stripYear,",") + 2); stripYear = "," .. stripYear Date = string.sub(stripYear,string.find(stripYear,",") + 1, string.len(stripYear) - string.len(Time) - 2);

     --lsPrintln(theDateTime .. "\nCoords: " .. Coordinates .. " (" .. string.len(Coordinates) .. ")\nTime: " .. Time .. " (" .. string.len(Time) .. ")\nDate: " .. Date .. " (" .. string.len(Date) .. ")");
   end
 end

end


function gui_refresh() checkBreak(); checkBreakSpecial();

if GrandTotalCasts == 0 or GrandTotalCasts == 1 then DateBegin = Date; TimeBegin = Time; end

if GrandTotalCaught < 10 then last10 = GrandTotalCaught .. "/10"; elseif GrandTotalCaught > 10 then last10 = "10/" .. GrandTotalCaught else last10 = 10; end


--Stats (On Screen Display) --CurrentLureIndex out of PlayersLures winsize = lsGetWindowSize();

if #PlayersLures == 0 then if not muteSoundEffects then lsPlaySound("fail.wav"); end error 'Can\'t find any lures on the pinned window. Did you run out of lures?'; elseif #PlayersLures == 1 then CurrentLureIndex = 1; QCurrentLureIndex = 1;

elseif CurrentLureIndex > #PlayersLures then CurrentLureIndex = #PlayersLures; QCurrentLureIndex = 1; end


CurrentLure = string.sub(PlayersLures[CurrentLureIndex],string.find(PlayersLures[CurrentLureIndex],"_")+1,string.len(PlayersLures[CurrentLureIndex])-4); QCurrentLure = string.sub(PlayersLures[QCurrentLureIndex],string.find(PlayersLures[QCurrentLureIndex],"_")+1,string.len(PlayersLures[QCurrentLureIndex])-4);

lsPrintWrapped(10, 0, 0, lsScreenX - 20, 0.5, 0.5, 0xc0c0ffff, Date .. " | " .. Time .. " | " .. Coordinates);

nextLureChange = TotalCasts + 1 - castcount nextLureChangeMessageColor = 0xc0ffffff;

if nextLureChange-1 <= 0 and LockLure then nextLureChangeMessageColor = 0xffff40ff; nextLureChangeMessage = "LOCKED! 0 casts remaining ..."; elseif nextLureChange <= 0 and not LockLure then nextLureChangeMessageColor = 0xffff40ff; nextLureChangeMessage = "0 casts remaining until Next Lure change!"; elseif LockLure then nextLureChangeMessageColor = 0xffff40ff; nextLureChangeMessage = "LOCKED! " .. nextLureChange-1 .. " casts remaining ..."; else nextLureChangeMessage = nextLureChange-1 .. " casts remaining until Next Lure change!"; end

lsPrintWrapped(10, 14, 0, lsScreenX - 20, 0.5, 0.5, 0xc0ffc0ff, "Current Lure: " .. CurrentLureIndex .. " of " .. #PlayersLures .. " " .. CurrentLure .. " (" .. LureType .. ")");

if skipLure or ((TotalCasts + 1 - castcount) <= 1 and not LockLure) then nextLureChangeMessageColor = 0xffffc0ff; nextLureChangeMessage = "0 casts remaining until Next Lure change!"; end

lsPrintWrapped(10, 26, 0, lsScreenX - 20, 0.5, 0.5, nextLureChangeMessageColor, nextLureChangeMessage); lsPrintWrapped(10, 41, 0, lsScreenX - 20, 0.5, 0.5, 0xfcad86ff, "Cast Timer: " .. castWait/1000);

     lsSetCamera(0,0,lsScreenX*1.6,lsScreenY*1.6);
   if lsButtonText(160, 62, 0, 20, 0xffffffff,
                   "-"	) then

QCurrentLureIndex = QCurrentLureIndex - 1; if QCurrentLureIndex < 1 then

QCurrentLureIndex = #PlayersLures; end

   end
   if lsButtonText(187, 62, 0, 20, 0xffffffff,
                   "+"	) then

QCurrentLureIndex = QCurrentLureIndex + 1 if QCurrentLureIndex > #PlayersLures then QCurrentLureIndex = 1; end

   end
     lsSetCamera(0,0,lsScreenX*1.0,lsScreenY*1.0);

lsPrintWrapped(137, 41, 0, lsScreenX - 20, 0.5, 0.5, 0xfFFFFFff, "Next Lure (" .. QCurrentLureIndex .. "):");

if skipLure or ((TotalCasts + 1 - castcount) <= 1 and not LockLure) then lsPrintWrapped(209, 41, 0, lsScreenX - 20, 0.5, 0.5, 0xffffc0ff, QCurrentLure); else lsPrintWrapped(209, 41, 0, lsScreenX - 20, 0.5, 0.5, 0xc0ffffff, QCurrentLure); end

lsPrintWrapped(10, 58, 0, lsScreenX - 20, 0.5, 0.5, 0xffffc0ff, "Last " .. last10 .. " Fish Caught:\n"); --Reset this string before showing last10 or allcaught fish below. Else the entries will multiply exponetially with entries from previous loops/call to this function last10caught = ""; allcaught = ""; lostlures = "";

if #gui_log_fish > 10 then table.remove(gui_log_fish,1); end for i = 1, #gui_log_fish,1 do lsPrintWrapped(10, 57 + (14*i), 0, lsScreenX - 18, 0.5, 0.5, 0xffffdfff, gui_log_fish[i]); --last10caught = last10caught .. gui_log_fish[i] .. "\n"; end

for i = 1, #gui_log_fish2,1 do allcaught = allcaught .. gui_log_fish2[i] .. "\n"; end

for i = 1, #lostlure_log,1 do lostlures = lostlures .. lostlure_log[i] .. "\n"; end


lsPrintWrapped(10, winsize[1]-133, 0, lsScreenX - 20, 0.5, 0.5, 0xffffffff, "Odd Fish Seen: " .. GrandTotalOdd); lsPrintWrapped(10, winsize[1]-121, 0, lsScreenX - 20, 0.5, 0.5, 0xffffffff, "Unusual Fish Seen: " .. GrandTotalUnusual); lsPrintWrapped(10, winsize[1]-109, 0, lsScreenX - 20, 0.5, 0.5, 0xffffffff, "Strange Fish Seen: " .. GrandTotalStrange); lsPrintWrapped(10, winsize[1]-97, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "-----------------------------"); lsPrintWrapped(10, winsize[1]-85, 0, lsScreenX - 20, 0.5, 0.5, 0xc0ffc0ff, "Lures Switched: " .. GrandTotalLuresUsed-1); if lastLostLure ~= "" then lsPrintWrapped(10, winsize[1]-73, 0, lsScreenX - 20, 0.5, 0.5, 0xff8080ff, "Lures Lost: " .. GrandTotalLostLures .. " - Last: " .. lastLostLure .. " (" .. lastLostLureType .. ")"); else lsPrintWrapped(10, winsize[1]-73, 0, lsScreenX - 20, 0.5, 0.5, 0xff8080ff, "Lures Lost: " .. GrandTotalLostLures); end

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, 0xc0ffffff, "Completed Casts: " .. GrandTotalCasts); lsPrintWrapped(10, winsize[1]-37, 0, lsScreenX - 20, 0.5, 0.5, 0xff8080ff, "Failed Catches: " .. GrandTotalFailed); lsPrintWrapped(10, winsize[1]-25, 0, lsScreenX - 20, 0.5, 0.5, 0xffffc0ff, "Fish Caught: " .. GrandTotalCaught .. " (" .. GrandTotaldb .. "db)");

     lsSetCamera(0,0,lsScreenX*1.6,lsScreenY*1.6);
   if lsButtonText(lsScreenX + 40, lsScreenY - 10, 0, 130, 0xFFFFFFff,
                   "Options") then

lsDoFrame(); setResume = true; setOptions();

   end

if not setPause then

   if lsButtonText(lsScreenX + 40, lsScreenY + 20, 0, 130, 0xFFFFFFff,
                   "Pause") then

setPause = true;

   end

end

   if lsButtonText(lsScreenX + 40, lsScreenY + 50, 0, 130, 0xFFFFFFff,
                   "End Script") then
     error(quitMessage);
   end
     lsSetCamera(0,0,lsScreenX*1.4,lsScreenY*1.4);

--Test messages can go here... --lsPrintWrapped(280, winsize[1]+40, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, ChangeLureMenu); --lsPrintWrapped(280, winsize[1]+55, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, LastLureMenu);

lsPrintWrapped(305, winsize[1]+70, 0, lsScreenX - 20, 0.5, 0.5, 0xFFFFFFff, "(TOGGLE ON / OFF)");

     lsSetCamera(0,0,lsScreenX*1.6,lsScreenY*1.6);

if skipLure or ((TotalCasts + 1 - castcount) <= 1 and not LockLure) then skipLureText = "Queued ..."; skipLureTextColor = 0xffff40ff; else skipLureText = "Next Lure"; skipLureTextColor = 0xFFFFFFff; end

   if lsButtonText(lsScreenX + 40, lsScreenY + 150, 0, 130, skipLureTextColor,
                   skipLureText	) then

if skipLure then skipLure = false; else skipLure = true; LockLure = false; end

   end


if LockLure then LockLureColor = 0xffff40ff; LockLureText = "Unlock Lure!"; else LockLureColor = 0xFFFFFFff; LockLureText = "Lock Lure"; end


   if lsButtonText(lsScreenX + 40, lsScreenY + 180, 0, 130, LockLureColor,
                   LockLureText ) then

if LockLure then LockLure = false; else LockLure = true; skipLure = false; end

   end

if #lostlure_log == 0 then lostlures = "*** No lures lost! ***"; end

if #gui_log_fish2 == 0 then allcaught = "*** No fish caught! ***"; end

WriteFishStats("Note this report is overwritten every time the macro runs. The stats are for last fishing session only!\nYou can safely delete this file, but it will be created the next time macro runs!\n\n\nStart Time: " .. DateBegin .. " @ " .. TimeBegin .. "\nEnd Time: " .. Date .. " @ " .. Time .. "\nLast Coordinates: " .. Coordinates .. "\n----------------------------------\nOdd Fish Seen: " .. GrandTotalOdd .. "\nUnusual Fish Seen: " .. GrandTotalUnusual .. "\nStrange Fish Seen: " .. GrandTotalStrange .. "\n----------------------------------\nLures Clicked: " .. GrandTotalLuresUsed .. "\nLures Lost: " .. GrandTotalLostLures .. " \n----------------------------------\nCasts: " .. GrandTotalCasts .. "\nFailed Catches: " .. GrandTotalFailed .. "\nFish Caught: " .. GrandTotalCaught .. " (" .. GrandTotaldb .. "db)\n----------------------------------\n\nAll lures lost this Session:\n\n" .. lostlures .. "\n\n\nAll fish caught this Session:\n\n".. allcaught);

lsDoFrame(); lsSleep(10); end


function doit()

 askForWindow("Fishing v1.53 (by Tutmault, revised by KasumiGhia, revised by Cegaiel)\n\nMAIN chat tab MUST be showing and wide enough so that each line doesn't wrap.\n\nPin up Lures Menu (Self, Skills, Fishing, Use Lures). No other pinned menus can exist! History will be recorded in FishLog.txt and stats in FishStats.txt.\n\nSelf, Options, Interface Options (Menu:) \"Display available fishing lures in submenus\" MUST BE CHECKED! Egypt Clock /clockloc must be showing and unobstructed. Move clock window slightly if any problems.\n\nMost problems can be fixed by adjusting main chat window!");

--Variables Used By Program -- Don't Edit Unless you know what you're doing! CurrentLure = ""; --Don't Edit gui_log_fish = {}; --Don't Edit, holds log display gui_log_fish2 = {}; --Don't Edit, holds log display log_fish = {}; --Don't Edit, holds log display lostlure_log = {}; --Don't Edit, holds log display CurrentLureIndex = 1; -- 1 = First Lure Player Owns in alphabetical order QCurrentLureIndex = 1; ChangeLureMenu=""; LastLureMenu=""; DownArrowLocs=nil; PlayersLures={}; --Don't Edit, Holds Current Player Lures

--strangecounter = 0; castcount = 0; GrandTotalCaught = 0; GrandTotalCasts = 0; GrandTotaldb = 0; GrandTotalStrange = 0; GrandTotalOdd = 0; GrandTotalUnusual = 0; GrandTotalLuresUsed = 0; GrandTotalLostLures = 0; GrandTotalFailed = 0; lastLostLure = ""; LostLure = 0; LureType = ""; lastLostLureType = ""; lockLure = false; setPause = false; skipLure = false; castWait = 15000; firstrun = 1;


     setOptions();

PlayersLures = SetupLureGroup(); -- Fetch the list of lures from pinned lures window lsSleep(1000); -- Just a delay to let the sound effect finishing playing, not needed...

findClockInfo(); while not Time do checkBreak(); findClockInfo(); sleepWithStatus(1000, "Can not find Clock!\n\nMove your clock slightly.\n\nMacro will resume once found ...\n\nIf you do not see a clock, type /clockloc in chat bar."); end

while 1 do

-- Loop, do nothing while Paused while setPause do checkBreak(); lsSleep(150); end

checkBreak(); srReadScreen(); --cast = srFindImage("Fishing/Button_Fish.png"); cast = srFindImage("fishicon.png"); OK = srFindImage("OK.png");

if not cast then if not muteSoundEffects then lsPlaySound("timer.wav"); end end

while not cast do checkBreak(); srReadScreen(); cast = srFindImage("fishicon.png"); sleepWithStatus(100, "Looking for Fishing icon ..."); end


if castcount == 0 or OK or skipLure then --Update counters castcount = 1;

if OK then -- We treat this as a lost lure if the OK box appears. This happens when you press fishing icon, but no lure equipped (lost). -- This is just in case, the macro failed to read "Lost Lure" message in main chat. Otherwise, when a lure was detected in main chat, it would have changed lures. srClickMouseNoMove(OK[0]+5,OK[1]+3); -- Close the popup OK button GrandTotalLostLures = GrandTotalLostLures + 1; lastLostLure = CurrentLure; lastLostLureType = LureType; LostLure = 1; end


--Switch Lures if #PlayersLures > 1 or firstrun == 1 or OK then UseLure(); GrandTotalLuresUsed = GrandTotalLuresUsed + 1; end

skipLure = false; if #PlayersLures > 1 then LockLure = false; else LockLure = true; end

lsSleep(500); srReadScreen(); --Look for an empty window - This means it clicked a lure no longer in inventory (lost), but still showing on the lures menu (before it got refreshed) FindUnPin = srFindImage("Fishing/Menu_MissingLure.png"); if FindUnPin then srKeyEvent(string.char(27)); -- Send Esc Key to close the window sleepWithStatus(500,"No " .. QCurrentLure .. " lures found!\nRefreshing lure list ...") PlayersLures = SetupLureGroup(); lsSleep(1000); -- Just a delay to let the sound effect finishing playing, not needed... if QCurrentLureIndex > #PlayersLures or QCurrentLureIndex == 1 then QCurrentLureIndex = 2; CurrentLureIndex = 1; else CurrentLureIndex = CurrentLureIndex + 1; QCurrentLureIndex = QCurrentLureIndex + 1; end

UseLure(); else CurrentLureIndex = QCurrentLureIndex; QCurrentLureIndex = QCurrentLureIndex + 1; end


if QCurrentLureIndex > #PlayersLures then --Last Lure, Prepare to go to first lure in list ... QCurrentLureIndex = 1; CurrentLureIndex = #PlayersLures; end

firstrun = 0;

--update log gui_refresh();


elseif castcount > TotalCasts and not LockLure then -- if strangecounter > 0 and strangecounter < AlmostCaughtAttempts then --we don't reset yet! -- else --Reset castcount=0; strangecounter = 0; -- end else

--Cast checkBreak(); srClickMouseNoMove(cast[0]+3,cast[1]+3); castWait = castWaitTimer; lsSleep(100);


--Check for OK popup box srReadScreen(); OK = srFindImage("OK.png");

---if not muteSoundEffects and not OK then --lsPlaySound("fishingreel.wav"); --end

while castWait > 0 and not OK do checkBreak(); lsSleep(100); castWait = castWait - 100; gui_refresh(); --Cheesy attempt to delay reel sound by 3s; an attempt to align sound with the actual animation. --Plus delay helps from drowning fish caught sound that might still be going on when clicking fishing/cast button ... if not muteSoundEffects and castWait/1000 == 12.5 then lsPlaySound("fishingreel.wav"); end

end

castcount = castcount + 1; GrandTotalCasts = GrandTotalCasts + 1; findClockInfo();


--Read Chat ChatType = findchat(); LastChatType = ChatType; lsSleep(200); CurrentLure = string.sub(PlayersLures[CurrentLureIndex],string.find(PlayersLures[CurrentLureIndex],"_")+1,string.len(PlayersLures[CurrentLureIndex])-4);

if ChatType == "alreadyfishing" or OK then castcount = castcount - 1; GrandTotalCasts = GrandTotalCasts - 1;

elseif ChatType == "nobitlostlure" then --No fish bit. You also lost your lure. GrandTotalLostLures = GrandTotalLostLures + 1; GrandTotalFailed = GrandTotalFailed + 1; lastLostLure = CurrentLure; lastLostLureType = LureType; LostLure = 1; --Reset, skip to next lure castcount=0; WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] [" .. CurrentLure .. " (" .. LureType .. ")] " .. "No fish bit. You also lost your lure." .. "\n");

elseif ChatType == "nobit" then --No fishbit GrandTotalFailed = GrandTotalFailed + 1; if LogFails == true then WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] [" .. CurrentLure .. " (" .. LureType .. ")] " .. "No fish bit." .. "\n"); end


elseif ChatType == "nocatchlostlure" then --You didn't catch anything. You also lost your lure. GrandTotalLostLures = GrandTotalLostLures + 1; GrandTotalFailed = GrandTotalFailed + 1; lastLostLure = CurrentLure; lastLostLureType = LureType; LostLure = 1; --Reset, skip to next lure castcount=0; WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] [" .. CurrentLure .. " (" .. LureType .. ")] " .. "You didn\'t catch anything. You also lost your lure." .. "\n");

elseif ChatType == "nocatch" then --You didn't catch anything. GrandTotalFailed = GrandTotalFailed + 1; if LogFails == true then WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] [" .. CurrentLure .. " (" .. LureType .. ")] " .. "You didn\'t catch anything." .. "\n"); end


elseif ChatType == "strangelostlure" then

-- Strange Fish and lost lure GrandTotalStrange = GrandTotalStrange + 1; GrandTotalLostLures = GrandTotalLostLures + 1; GrandTotalFailed = GrandTotalFailed + 1; lastLostLure = CurrentLure; lastLostLureType = LureType; LostLure = 1; --Reset, skip to next lure castcount=0; WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] [" .. CurrentLure .. " (" .. LureType .. ")] " .. "You almost caught a STRANGE fish, but your rod was just too clumbsy. You also lost your lure." .. "\n");


-- if AlmostCaughtAttempts > 0 then -- strangecounter = strangecounter +1; -- end


elseif ChatType == "strange" then --Strange Fish GrandTotalStrange = GrandTotalStrange + 1; GrandTotalFailed = GrandTotalFailed + 1; if LogStrangeUnusual == true then WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] [" .. CurrentLure .. " (" .. LureType .. ")] " .. "You almost caught a STRANGE fish, but your rod was just too clumbsy." .. "\n"); end

-- if AlmostCaughtAttempts > 0 then -- strangecounter = strangecounter +1; -- end


elseif ChatType == "unusuallostlure" then --Unusual Fish GrandTotalUnusual = GrandTotalUnusual + 1; GrandTotalLostLures = GrandTotalLostLures + 1; GrandTotalFailed = GrandTotalFailed + 1; lastLostLure = CurrentLure; lastLostLureType = LureType; LostLure = 1; --Reset, skip to next lure castcount=0;

if LogStrangeUnusual == true then WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] [" .. CurrentLure .. " (" .. LureType .. ")] " .. "You almost caught an UNUSUAL fish, but you were not quick enough. You also lost your lure." .. "\n"); end


-- if AlmostCaughtAttempts > 0 then -- strangecounter = strangecounter +1; -- end


elseif ChatType == "unusual" then -- Unusual Fish GrandTotalUnusual = GrandTotalUnusual + 1; GrandTotalFailed = GrandTotalFailed + 1; if LogStrangeUnusual == true then WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] [" .. CurrentLure .. " (" .. LureType .. ")] " .. "You almost caught an UNUSUAL fish, but you were not quick enough." .. "\n"); end

-- if AlmostCaughtAttempts > 0 then -- strangecounter = strangecounter +1; -- end


elseif ChatType == "oddlostlure" then -- Odd Fish and lost lure GrandTotalOdd = GrandTotalOdd + 1; GrandTotalLostLures = GrandTotalLostLures + 1; GrandTotalFailed = GrandTotalFailed + 1; lastLostLure = CurrentLure; lastLostLureType = LureType; LostLure = 1; --Reset, skip to next lure castcount=0; WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] [" .. CurrentLure .. " (" .. LureType .. ")] " .. "You almost caught an ODD fish, but were too late recognizing the bite. You also lost your lure." .. "\n");


elseif ChatType == "odd" then -- Odd Fish GrandTotalOdd = GrandTotalOdd + 1; GrandTotalFailed = GrandTotalFailed + 1; if LogOdd == true then WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] [" .. CurrentLure .. " (" .. LureType .. ")] " .. "You almost caught an ODD fish, but were too late recognizing the bite." .. "\n"); end


elseif ChatType == "carry" then --chat lines are messed up now castcount=0;


elseif ChatType == "caught" or ChatType == "caughtlostlure" then Fish = ChatReadFish(); --Last 10 fish caught that displays on GUI addlog = Time .. " | " .. Sfish .. " (" .. SNum .. "db) | " .. CurrentLure table.insert(gui_log_fish, addlog); -- All fish caught that displays in fishstats.txt table.insert(gui_log_fish2, addlog); if not muteSoundEffects then FishType = Sfish; if FishType == "Abdju" or FishType == "Chromis" or FishType == "Catfish" or FishType == "Carp" or FishType == "Perch" or FishType == "Phagrus" or FishType == "Tilapia" then lsPlaySound("cheer.wav"); else lsPlaySound("applause.wav"); end end

if ChatType == "caughtlostlure" then GrandTotalLostLures = GrandTotalLostLures + 1; lastLostLure = CurrentLure; lastLostLureType = LureType; LostLure = 1; WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] " .. Fish .. " was caught. You also lost a lure.\n"); --Reset, skip to next lure castcount=0;

else WriteFishLog("[" .. Date .. ", " .. Time .. "] [" .. Coordinates .. "] " .. Fish .. " was caught.\n");

end

--gui_refresh();

if SkipCommon == true and LockLure == false then --FishType = string.sub(Fish,string.find(Fish,",") + 1); FishType = Sfish; 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;

end end gui_refresh(); end

gui_refresh(); end gui_refresh(); end end