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

From ATITD7
Jump to navigationJump to search

Discord_Logo ATITD Discord Server http://www.discord.me/atitd / https://discord.gg/0kvxEfeM1sBBhy6H


Macros/Scripts

How to Install Scripts

zemples.lua

Download Automato_Logo Reads contents of multiple warehouses and makes a list of all raeli tiles.
--zStock.lua
dofile("common.inc");

--Exit Loop?
is_done = false;

askText = singleLine([[Hit SHIFT to begin.]]);

function doit()
  askForWindow(askText);
  askForFocus();
  Run();
end

--Color List
color = {
"Alice Blue", "Amethyst", "Antique White", "Aqua", "Aquamarine", "Azure", "Baker Miller Pink", "Banana", "Barn Red", "Beet", "Beige", "Bisque", "Black", "Blanched Almond", "Blaze Orange", "Blue", "Blue Violet", "Boysenberry", "Bright Pink", "Brown", "Burgundy Red", "Burly Wood", "Burnt Sienna", "Burnt Umber", "Cadet Blue", "Cadmium Orange", "Cadmium Yellow", "Carrot", "Chartreuse", "Chocolate", "Cobalt Blue", "Cobalt Green", "Coral", "Cornflower Blue", "Cornsilk", "Crimson", "Dark Blue", "Dark Cyan", "Dark Golden Rod", "Dark Green", "Dark Grey", "Dark Jungle Green", "Dark Khaki", "Dark Magenta", "Dark Olive Green", "Dark Orange", "Dark Orchid", "Dark Red", "Dark Salmon", "Dark Scarlet", "Dark Sea Green", "Dark Sienna", "Dark Slate Blue", "Dark Slate Grey", "Dark Turquoise", "Dark Violet", "Deep Pink", "Deep Sky Blue", "Dim Grey", "Dodger Blue", "Duke Blue", "Eggshell White", "Emerald Green", "Feldspar", "Fire Brick", "Floral White", "Forest Green", "Fuchsia", "Gainsboro", "Ghost White", "Gold", "Golden Rod", "Green", "Green Yellow", "Grey", "Honey Dew", "Hot Pink", "Imperial Blue", "Indian Red", "Indigo", "Ivory", "Khaki", "Lavender", "Lavender Blush", "Lawn Green", "Lemon Chiffon", "Licorice", "Light Blue", "Light Coral", "Light Cyan", "Light Golden Rod Yellow", "Light Green", "Light Grey", "Light Pink", "Light Salmon", "Light Sea Green", "Light Sky Blue", "Light Slate Blue", "Light Slate Grey", "Light Steel Blue", "Light Yellow", "Lime", "Lime Green", "Linen", "Maroon", "Medium Aqua Marine", "Medium Blue", "Medium Orchid", "Medium Purple", "Medium Sea Green", "Medium Slate Blue", "Medium Spring Green", "Medium Turquoise", "Medium Violet Red", "Melon", "Midnight Blue", "Mint Cream", "Misty Rose", "Moccasin", "Navajo White", "Navy", "Old Lace", "Olive", "Olive Drab", "Orange", "Orange Red", "Orchid", "Oxford Blue", "Pale Golden Rod", "Pale Green", "Pale Turquoise", "Pale Violet Red", "Papaya Whip", "Peach Puff", "Peacock", "Persian Indigo", "Persian Pink", "Peru", "Pink", "Plum", "Powder Blue", "Prussian Blue", "Purple", "Raw Sienna", "Red", "Red Devil", "Rich Black", "Rosy Brown", "Royal Blue", "Ruby Red", "Saddle Brown", "Salmon", "Sandy Brown", "Sangria", "Sap Green", "Sea Green", "Sea Shell", "Seal Brown", "Sienna", "Silver", "Sky Blue", "Slate Blue", "Slate Grey", "Smokey Black", "Snow", "Spring Green", "Steel Blue", "Steel Pink", "Tan", "Teal", "Thistle", "Tomato", "Turquoise", "Tyrian Purple", "Violet", "Violet Red", "Wheat", "White", "White Smoke", "Yellow", "Yellow Green", "Zaffre"
};

colorcode = {
"-369820161", "-1721316097", "-85207041", "16777215", "-2114061057", "-1209938433", "-7229441", "-472950785", "2081030911", "-1908896001", "-168436481", "-18103297", "16843263", "-1323521", "-10026753", "65535", "-1976835329", "-2026741505", "-16744449", "-1523963137", "-2147475201", "-558331905", "-1976168449", "-1976359681", "1604231423", "-10419201", "-6745345", "-529324801", "2147418367", "-764862721", "1029286911", "1032929535", "-8433409", "1839590655", "-467713", "-602653441", "35839", "9145343", "-1199174657", "6553855", "-1448498689", "438575615", "-1112052737", "-1962898433", "1433087999", "-7601921", "-1724723969", "-1827267329", "-376014081", "1443043839", "-1883467777", "1007949055", "-2092658177", "793726975", "13554175", "-1811885057", "-15428609", "12582911", "1768516095", "512819199", "40191", "-51983873", "13195263", "-778930689", "-1306385665", "-331521", "579543807", "-16711681", "-589505281", "-117899265", "-2686721", "-626712321", "8388863", "-1375784961", "-2139062017", "-251662081", "-9849601", "2332159", "-849584897", "1226271487", "-3841", "-253326081", "-421070081", "-985601", "2096890111", "-340481", "437326079", "-1378294017", "-260013825", "-520093697", "-84225281", "-1863413505", "-741092353", "-4800001", "-37781505", "548580095", "-2016478465", "-2072969217", "2005441023", "-1682251777", "-7937", "16711935", "852308735", "-84875521", "-2127952385", "1724754687", "52735", "-1168780289", "-1821320193", "1018393087", "2070474495", "16423679", "1170325503", "-1623423233", "-475502081", "421097727", "-167773441", "-1777153", "-1788417", "-2183681", "33023", "-34216193", "-2139094785", "1804477439", "-5963521", "-12254977", "-630139137", "2181119", "-286741761", "-1728341761", "-1293487617", "-613379073", "-1059329", "-2442753", "866241023", "840071935", "-142622977", "-846905345", "-4142081", "-576659969", "-1327438081", "3232767", "-2147450625", "-949938945", "-16776961", "-2046750209", "4210943", "-1131442177", "1097458175", "-1693376769", "-1958407169", "-92245249", "-190553857", "-1845490945", "813700351", "780883967", "-659713", "840176895", "-1605227009", "-808014337", "-2016482305", "1784335871", "1887473919", "269224191", "-328961", "16744447", "1182971135", "-869046529", "-759919361", "8421631", "-658515713", "-10270721", "1088475391", "1711422719", "-293409025", "-1623423233", "-169954305", "-1", "-168430081", "-65281", "-1697828097", "1353983"
};

function clipboardResult()
 clip1 = (numbers[1] ..'\n'.. numbers[2] ..'\n'.. numbers[3] ..'\n'.. numbers[4] ..'\n'.. numbers[5] ..'\n'.. numbers[6] ..'\n'.. numbers[7] ..'\n'.. numbers[8] ..'\n'.. numbers[9] ..'\n'.. numbers[10] ..'\n'.. numbers[11] ..'\n'.. numbers[12] ..'\n'.. numbers[13] ..'\n'.. numbers[14] ..'\n'.. numbers[15] ..'\n'.. numbers[16] ..'\n'.. numbers[17] ..'\n'.. numbers[18] ..'\n'.. numbers[19] ..'\n'.. numbers[20] ..'\n'.. numbers[21] ..'\n'.. numbers[22] ..'\n'.. numbers[23] ..'\n'.. numbers[24] ..'\n'.. numbers[25] ..'\n'.. numbers[26] ..'\n'.. numbers[27] ..'\n'.. numbers[28] ..'\n'.. numbers[29] ..'\n'.. numbers[30] ..'\n'.. numbers[31] ..'\n'.. numbers[32] ..'\n'.. numbers[33] ..'\n'.. numbers[34] ..'\n'.. numbers[35] ..'\n'.. numbers[36] ..'\n'.. numbers[37] ..'\n'.. numbers[38] ..'\n'.. numbers[39] ..'\n'.. numbers[40] ..'\n'.. numbers[41] ..'\n'.. numbers[42] ..'\n'.. numbers[43] ..'\n'.. numbers[44] ..'\n'.. numbers[45] ..'\n'.. numbers[46] ..'\n'.. numbers[47] ..'\n'.. numbers[48] ..'\n'.. numbers[49] ..'\n'.. numbers[50] ..'\n'.. numbers[51] ..'\n'.. numbers[52] ..'\n'.. numbers[53] ..'\n'.. numbers[54] ..'\n'.. numbers[55] ..'\n'.. numbers[56] ..'\n'.. numbers[57] ..'\n'.. numbers[58] ..'\n'.. numbers[59] ..'\n'.. numbers[60] ..'\n'.. numbers[61] ..'\n'.. numbers[62] ..'\n'.. numbers[63] ..'\n'.. numbers[64] ..'\n'.. numbers[65] ..'\n'.. numbers[66] ..'\n'.. numbers[67] ..'\n'.. numbers[68] ..'\n'.. numbers[69] ..'\n'.. numbers[70] ..'\n'.. numbers[71] ..'\n'.. numbers[72] ..'\n'.. numbers[73] ..'\n'.. numbers[74] ..'\n'.. numbers[75]);
  clip2 = (numbers[76] ..'\n'.. numbers[77] ..'\n'.. numbers[78] ..'\n'.. numbers[79] ..'\n'.. numbers[80] ..'\n'.. numbers[81] ..'\n'.. numbers[82] ..'\n'.. numbers[83] ..'\n'.. numbers[84] ..'\n'.. numbers[85] ..'\n'.. numbers[86] ..'\n'.. numbers[87] ..'\n'.. numbers[88] ..'\n'.. numbers[89] ..'\n'.. numbers[90] ..'\n'.. numbers[91] ..'\n'.. numbers[92] ..'\n'.. numbers[93] ..'\n'.. numbers[94] ..'\n'.. numbers[95] ..'\n'.. numbers[96] ..'\n'.. numbers[97] ..'\n'.. numbers[98] ..'\n'.. numbers[99] ..'\n'.. numbers[100] ..'\n'.. numbers[101] ..'\n'.. numbers[102] ..'\n'.. numbers[103] ..'\n'.. numbers[104] ..'\n'.. numbers[105] ..'\n'.. numbers[106] ..'\n'.. numbers[107] ..'\n'.. numbers[108] ..'\n'.. numbers[109] ..'\n'.. numbers[110] ..'\n'.. numbers[111] ..'\n'.. numbers[112] ..'\n'.. numbers[113] ..'\n'.. numbers[114] ..'\n'.. numbers[115] ..'\n'.. numbers[116] ..'\n'.. numbers[117] ..'\n'.. numbers[118] ..'\n'.. numbers[119] ..'\n'.. numbers[120] ..'\n'.. numbers[121] ..'\n'.. numbers[122] ..'\n'.. numbers[123] ..'\n'.. numbers[124] ..'\n'.. numbers[125] ..'\n'.. numbers[126] ..'\n'.. numbers[127] ..'\n'.. numbers[128] ..'\n'.. numbers[129] ..'\n'.. numbers[130] ..'\n'.. numbers[131] ..'\n'.. numbers[132] ..'\n'.. numbers[133] ..'\n'.. numbers[134] ..'\n'.. numbers[135] ..'\n'.. numbers[136] ..'\n'.. numbers[137] ..'\n'.. numbers[138] ..'\n'.. numbers[139] ..'\n'.. numbers[140] ..'\n'.. numbers[141] ..'\n'.. numbers[142] ..'\n'.. numbers[143] ..'\n'.. numbers[144] ..'\n'.. numbers[145]);
  clip3 = (numbers[146] ..'\n'.. numbers[147] ..'\n'.. numbers[148] ..'\n'.. numbers[149] ..'\n'.. numbers[150] ..'\n'.. numbers[151] ..'\n'.. numbers[152] ..'\n'.. numbers[153] ..'\n'.. numbers[154] ..'\n'.. numbers[155] ..'\n'.. numbers[156] ..'\n'.. numbers[157] ..'\n'.. numbers[158] ..'\n'.. numbers[159] ..'\n'.. numbers[160] ..'\n'.. numbers[161] ..'\n'.. numbers[162] ..'\n'.. numbers[163] ..'\n'.. numbers[164] ..'\n'.. numbers[165] ..'\n'.. numbers[166] ..'\n'.. numbers[167] ..'\n'.. numbers[168] ..'\n'.. numbers[169] ..'\n'.. numbers[170] ..'\n'.. numbers[171] ..'\n'.. numbers[172] ..'\n'.. numbers[173] ..'\n'.. numbers[174] ..'\n'.. numbers[175] ..'\n'.. numbers[176] ..'\n'.. numbers[177] ..'\n'.. numbers[178] ..'\n'.. numbers[179] ..'\n'.. numbers[180] ..'\n'.. numbers[181] ..'\n'.. numbers[182]);
  lsClipboardSet(clip1 ..'\n'.. clip2 ..'\n'.. clip3);
end

--Inventory
numbers = {};
for i=1,182 do
numbers[i] = 0;
end

ui_dark=993146367;
ui_mid=1717067007;
ui_light=-437918209;
noDataX = 20;
log = {};
logcolor = {};
wh_count = 0;

--SUM of all tiles
total = 0;
function getTotal()
  total = 0;
  if #numbers > 1 then
    for i =1,#numbers do
      total= total + numbers[i];
    end
  end
end

function formatZemplestxt()
  File = io.open("zemples.txt","w+");
  File:close();
end

function zemplestxt()
  formatZemplestxt()
  File = io.open("zemples.txt","a+");
  File:write("-- Quantity of colors from 1 Alice Blue to 182 Zaffre --\n");
  for i =1,182 do
    File:write(numbers[i] .."\n");
  end
  File:write("-- Console Log --\n");
  for i =1,#log do
    File:write(log[i] .."\n");
  end
  File:close();
end

function scaleY(y) return a[1]/(350/y); end
function scaleX(x) return a[0]/(300/x); end

function check()
  for i=1,182 do
    name = string.find(clipboard, "Raeli Tiles:".. color[i]);
      if name then
        --Problem colors
        if i == 16 then hold = string.sub(clipboard, name + 17, name + 22); lsPrintln(hold); end --Blue
        if i == 73 then hold = string.sub(clipboard, name + 18, name + 23); lsPrintln(hold); end --Green
        if i == 83 then hold = string.sub(clipboard, name + 21, name + 25); lsPrintln(hold); end --Lavender
        if i == 102 then hold = string.sub(clipboard, name + 17, name + 21); lsPrintln(hold); end --Lime
        if i == 145 then hold = string.sub(clipboard, name + 16, name + 21); lsPrintln(hold); end --Red
        if i == 175 then hold = string.sub(clipboard, name + 19, name + 21); lsPrintln(hold); end --Violet
        if i == 178 then hold = string.sub(clipboard, name + 18, name + 22); lsPrintln(hold); end --White
        if i == 180 then hold = string.sub(clipboard, name + 19, name + 23); lsPrintln(hold); end --Yellow
        if hold == "Violet" then hold = nil;
        elseif hold == "Yellow" then hold = nil;
        elseif hold == "Blush" then hold = nil;
        elseif hold == "Green" then hold = nil;
        elseif hold == "Devil" then hold = nil;
        elseif hold == "Red" then hold = nil;
        elseif hold == "Smoke" then hold = nil;
        elseif hold == "Green" then hold = nil;
        else

        num = string.sub(clipboard, name - 6, name - 2);
        num = string.gsub(num, " ", "");
        numbers[i] = numbers[i] + num;
        space = "";
        if string.len(numbers[i]) == 1 then space ="00000";
        elseif string.len(numbers[i]) == 2 then space ="0000";
        elseif string.len(numbers[i]) == 3 then space ="000";
        elseif string.len(numbers[i]) == 4 then space ="00";
        elseif string.len(numbers[i]) == 5 then space ="0";
        else space ="";
        end
        lsPrintln("Tile: ".. space .. numbers[i] .." Color: ".. color[i]);
        log[#log + 1] ="Tile: ".. space .. numbers[i] .." Color:     ".. color[i];
        logcolor[#logcolor + 1]= colorcode[i];

        end


      else
        --lsPrintln("Checking: ".. color[i] .." Num: 0");
      end
  end
end


function Run()
formatZemplestxt();
--Loop
  while not is_done do
    checkBreak();
    a = lsGetWindowSize();
    lsDisplaySystemSprite(1, 0, 0, 0, a[0], a[1], ui_mid); --BG Color
    lsDisplaySystemSprite(1, 0, 0, 1, a[0], a[1]/8.75, ui_dark);
    lsDisplaySystemSprite(1, 0, a[1] - 10, 4, a[0], a[1]/35, ui_dark);

    if wh_count =="Saved to clipboard and zemples.txt" then
    lsPrint(0, a[1] - 11, 6, scaleX(0.6), scaleX(0.6), ui_mid, wh_count);
    clipboardResult();
    elseif wh_count == 0 then
    else
    lsPrint(scaleX(135), a[1] - 11, 6, scaleX(0.5), scaleX(0.5), ui_mid, wh_count .."/47");
    progress = (a[0] * wh_count) / 100;
    lsDisplaySystemSprite(1, 0, a[1] - 10, 5, progress * 2, a[1]/35, ui_light);
    end



    getTotal();
    if total > 0 then
      x = 0; y =scaleY(10); colorplace = 0; colorWidth = 0;
      for i =1,#numbers do
        per = (numbers[i]*100) /total;
        percent =string.sub(per, 0, 4);

        colorWidth = (a[0] * percent) / 100;
        lsDisplaySystemSprite(1, x, y, 2, colorWidth, a[1]/17.5, colorcode[i]);
        colorplace = colorplace + colorWidth;
        x = colorplace;
      end
    else
      if (a[0] - 100) == noDataX then noDataDirection ="left"; end
      if noDataX == 0 then noDataDirection ="right"; end
      if noDataDirection == "left" then noDataX = noDataX - 1; else noDataX = noDataX + 1; end
      random = math.random(0,90000);
      if random > 4500 then redflash =ui_dark else redflash=-1962916353; end
      lsPrint(noDataX + scaleY(30), 15, 3, scaleY(0.5), scaleY(0.5), ui_dark, "No Data");
      lsDisplaySystemSprite(1, noDataX, scaleY(10), 2, a[1]/3.5, a[1]/17.5, ui_light);
      lsDisplaySystemSprite(1, scaleX(90), scaleY(50), 2, scaleX(50), scaleY(50), ui_light);
      lsDisplaySystemSprite(1, scaleX(140), scaleY(70), 2, scaleX(10), scaleY(30), redflash);
      lsDisplaySystemSprite(1, scaleX(150), scaleY(50), 2, scaleX(50), scaleY(50), ui_light);
      lsDisplaySystemSprite(1, scaleX(90), scaleY(105), 2, scaleX(110), scaleY(120), ui_light);
      lsPrint(scaleX(10), scaleY(250), 2, scaleX(0.6), scaleX(0.6), ui_light, "Use middle mouse click to scan each warehouse");
    end


    if #log > 1 then
      y = scaleY(50);
      xyz = #log;
      for i=1,#log do
        star = string.find(log[xyz], "*");
        if star then
          lsPrint(0, y, 2, scaleX(0.5), scaleX(0.5), ui_light, log[xyz]);
          lsDisplaySystemSprite(1, 0, y + scaleY(2), 2, scaleX(220), scaleY(8), logcolor[xyz]);
        else
          lsPrint(0, y, 2, scaleX(0.5), scaleX(0.5), ui_light, log[xyz]);
          lsDisplaySystemSprite(1, scaleX(90), y + scaleY(2), 2, scaleX(8), scaleY(8), logcolor[xyz]);
        end
        y = y + scaleX(10); xyz = xyz - 1;
      end
    end



    if lsMouseIsDown(2) then
      mouse_x, mouse_y = srMousePos();
      srClickMouseNoMove(mouse_x, mouse_y);
      lsSleep(100);
      srReadScreen();
      utility = findText("Utility");
      if utility then
        srClickMouseNoMove(utility[0] + 10, utility[1]);
        lsSleep(100);
        srReadScreen();
        copy = findText("Copy");
        if copy then
          srClickMouseNoMove(copy[0] + 10, copy[1]);
          lsSleep(100);
          clipboard = lsClipboardGet();
          log[#log + 1]="* Contents of ".. string.sub(clipboard, 0, 16) .."at ".. string.sub(clipboard, 42, 52)
          logcolor[#logcolor + 1] = ui_dark;
          --lsClipboardSet(clipboard);
          check();
          zemplestxt();
          if wh_count == 46 then wh_count = "Saved to clipboard and zemples.txt" else wh_count = wh_count + 1; end
        else lsPlaySound("fail.wav"); end
      else
        lsPlaySound("fail.wav");
      end
    end


    if lsKeyDown("c") then
      clipboard = lsClipboardGet();
      log[#log + 1]="* Contents of ".. string.sub(clipboard, 0, 16) .."at ".. string.sub(clipboard, 42, 52)
      logcolor[#logcolor + 1] = ui_dark;
      --lsClipboardSet(clipboard);
      check();
      zemplestxt();
      lsSleep(300);
    end

    if lsKeyDown("q") then
      is_done = 1;
    end

    lsDoFrame();
    lsSleep(10);
  end
end


chariot_stop.lua

Download Automato_Logo Travels to desired destination using shortest path when it is free.

--Chariot Stop v1.1 by Safa
--Thanks to Dreger for getCurrentRegion() function.
--This macro will travel to desired destination using shortest path when possible. It has to read your location from clock up top. (Use /clockloc command to open it if missing.) Do NOT walk while macro is running. Do NOT pin chariot windows. You can chat or minimize VT if you wish. Please re-open Chariot window after travel.
dofile("screen_reader_common.inc");
dofile("ui_utils.inc");
dofile("common.inc");

--Introduction
askForWindow("Chariot_Stop v1.1 (by Safa) This macro will travel to desired destination using shortest path when possible. It has to read your location from clock up top. (Use /clockloc command to open it if missing.) Do NOT walk while macro is running. Do NOT pin chariot windows. You can chat or minimize VT if you wish. Please re-open Chariot window after travel.") ;

--debugging
function spacer()
  lsPrintln(" ");
  lsPrintln(" ");
  lsPrintln(" ");
end

function clearconsole()
  for i =1,20 do
    lsPrintln(" ");
  end
end

clearconsole();
-- / debugging

function checkCS()
-- Loop if CS window not present.
srReadScreen();
cs = srFindImage("chariot/cs.png", 5000);
while not cs do
  srReadScreen();
  cs = srFindImage("chariot/cs.png", 5000);
  sleepWithStatus(4000, "Can't see Chariot Window!");
  lsPlaySound("AnvilHit.wav");
end
end

-- returns the text string for the current region from the clock window or nil if not found.
function getCurrentRegion()
  lsPrintln("Starting getCurrentRegion");
  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
    window = getWindowBorders(anchor[0], anchor[1]);
    lines = findAllText(nil, window, NOPIN);
    regionCoords = table.concat(lines[2], ",");
    regionAndCoords = string.sub(regionCoords,string.find(regionCoords,",") + 1);
    region = string.sub(regionAndCoords, 0,  string.find(regionAndCoords,":") - 1);
    return region;
  end
  return nil;
end

-- All Regions
regions = {"Cat's Claw Ridge", "Cradle of Sun", "Desert of Nomads", "Desert of Shades", "Eastern Grounds", "Four Corners", "Lake of Reeds",  "Memphis", "Midland Valley", "Old Egypt", "River Plains", "Seven Lakes", "Sinai", "South Egypt", "Valley of Kings"};
-- Adjacents
toCCR = {"Old Egypt", "Valley of Kings", "X"};
toCOS = {"Seven Lakes", "X", "X"};
toDON = {"Lake of Reeds", "Old Egypt", "Sinai"};
toDOS = {"River Plains", "Valley of Kings", "X"};
toEG = {"South Egypt", "X", "X"};
toFC = {"Midland Valley","X","X"};
toLR = {"Desert of Nomads", "Sinai", "X"};
toM = {"South Egypt", "X", "X"};
toMV = {"Four Corners", "Old Egypt","River Plains"};
toOE = {"Cat's Claw Ridge", "Desert of Nomads", "Midland Valley"};
toRP = {"Desert of Shades","Midland Valley","Seven Lakes"};
to7L = {"Cradle of Sun", "River Plains", "South Egypt"};
toS = {"Desert of Nomads", "Lake of Reeds"};
toSE = {"Eastern Grounds", "Memphis", "Seven Lakes"};
toVOK = {"Cat's Claw Ridge", "Desert of Shades", "X"};


--Adjacent Distances
--CCR
function CCR()
  far1 = {"Valley of Kings", "Old Egypt"};
  far2 = {"Midland Valley", "Desert of Nomads"};
  far3 = {"Lake of Reeds", "Sinai", "River Plains", "Four Corners"};
  far4 = {"Seven Lakes"};
  far5 = {"South Egypt", "Cradle of Sun"};
  far6 = {"Memphis", "Eastern Grounds"};
end
--COS
function COS()
  far1 = {"Seven Lakes"};
  far2 = {"River Plains", "South Egypt"};
  far3 = {"Desert of Shades", "Midland Valley", "Memphis", "Eastern Grounds"};
  far4 = {"Four Corners", "Valley of Kings", "Old Egypt"};
  far5 = {"Cat's Claw Ridge", "Desert of Nomads"};
  far6 = {"Lake of Reeds", "Sinai"};
end
--DON
function DON()
  far1 = {"Lake of Reeds", "Sinai", "Old Egypt"};
  far2 = {"Cat's Claw Ridge", "Midland Valley"};
  far3 = {"Valley of Kings", "Four Corners", "River Plains"};
  far4 = {"Desert of Shades", "Seven Lakes"};
  far5 = {"Cradle of Sun", "South Egypt"};
  far6 = {"Memphis", "Eastern Grounds"};
end
--DOS
function DOS()
  far1 = {"Valley of Kings", "River Plains"};
  far2 = {"Cat's Claw Ridge", "Midland Valley", "Seven Lakes"};
  far3 = {"Old Egypt", "Four Corners", "Cradle of Sun", "South Egypt"};
  far4 = {"Desert of Nomads", "Memphis", "Eastern Grounds"};
  far5 = {"Lake of Reeds", "Sinai"};
end
--EG
function EG()
  far1 = {"South Egypt"};
  far2 = {"Memphis", "Seven Lakes"};
  far3 = {"Cradle of Sun", "River Plains"};
  far4 = {"Desert of Shades", "Midland Valley"};
  far5 = {"Valley of Kings", "Four Corners", "Old Egypt"};
  far6 = {"Cat's Claw Ridge", "Desert of Nomads"};
  far7 = {"Lake of Reeds", "Sinai"};
end
--FC
function FC()
  far1 = {"Midland Valley"};
  far2 = {"Old Egypt", "River Plains"};
  far3 = {"Cat's Claw Ridge", "Desert of Nomads", "Desert of Shades", "Seven Lakes"};
  far4 = {"Lake of Reeds", "Sinai", "Valley of Kings", "Cradle of Sun"};
  far5 = {"South Egypt"};
  far6 = {"Memphis", "Eastern Grounds"};
end
--LR
function LR()
  far1 = {"Desert of Nomads", "Sinai"};
  far2 = {"Old Egypt"};
  far3 = {"Cat's Claw Ridge", "Midland Valley"};
  far4 = {"Valley of Kings", "Four Corners", "River Plains"};
  far5 = {"Desert of Shades", "Seven Lakes"};
  far6 = {"Cradle of Sun", "South Egypt"};
  far7 = {"Memphis", "Eastern Grounds"};
end
--M
function M()
  far1 = {"South Egypt"};
  far2 = {"Eastern Grounds", "Seven Lakes"};
  far3 = {"Cradle of Sun", "River Plains",};
  far4 = {"Desert of Shades", "Midland Valley"};
  far5 = {"Valley of Kings", "Four Corners", "Old Egypt"};
  far6 = {"Cat's Claw Ridge", "Desert of Nomads"};
  far7 = {"Lake of Reeds", "Sinai"};
end
--MV
function MV()
  far1 = {"Old Egypt", "River Plains", "Four Corners"};
  far2 = {"Cat's Claw Ridge", "Desert of Nomads", "Desert of Shades", "Seven Lakes"};
  far3 = {"Valley of Kings", "Lake of Reeds", "Sinai", "Cradle of Sun", "South Egypt"};
  far4 = {"Memphis", "Eastern Grounds"};
end
--OE
function OE()
  far1 = {"Cat's Claw Ridge", "Desert of Nomads", "Midland Valley"};
  far2 = {"Valley of Kings", "Four Corners", "River Plains", "Lake of Reeds", "Sinai"};
  far3 = {"Desert of Shades", "Seven Lakes"};
  far4 = {"Cradle of Sun", "South Egypt"};
  far5 = {"Memphis", "Eastern Grounds"};
end
--RP
function RP()
  far1 = {"Midland Valley", "Desert of Shades", "Seven Lakes"};
  far2 = {"Four Corners", "Old Egypt", "Cradle of Sun"};
  far3 = {"Cat's Claw Ridge", "Desert of Nomads", "South Egypt"};
  far4 = {"Valley of Kings", "Lake of Reeds", "Sinai", "Memphis", "Eastern Grounds"};
end
--7L
function SevenL()
  far1 = {"River Plains", "Cradle of Sun", "South Egypt"};
  far2 = {"Memphis", "Eastern Grounds", "Midland Valley", "Desert of Shades"};
  far3 = {"Four Corners", "Valley of Kings", "Old Egypt"};
  far4 = {"Cat's Claw Ridge", "Desert of Nomads"};
  far5 = {"Lake of Reeds", "Sinai"};
end
--S
function S()
  far1 = {"Lake of Reeds", "Desert of Nomads"};
  far2 = {"Old Egypt"};
  far3 = {"Cat's Claw Ridge", "Midland Valley"};
  far4 = {"Valley of Kings", "Four Corners", "River Plains"};
  far5 = {"Desert of Shades", "Seven Lakes"};
  far6 = {"Cradle of Sun", "South Egypt"};
  far7 = {"Memphis", "Eastern Grounds"};
end
--SE
function SE()
  far1 = {"Memphis", "Eastern Grounds", "Seven Lakes"};
  far2 = {"Cradle of Sun", "River Plains"};
  far3 = {"Desert of Shades", "Midland Valley"};
  far4 = {"Valley of Kings", "Four Corners", "Old Egypt"};
  far5 = {"Cat's Claw Ridge", "Desert of Nomads"};
  far6 = {"Lake of Reeds", "Sinai"};
end
--VOK
function VOK()
  far1 = {"Cat's Claw Ridge", "Desert of Shades"};
  far2 = {"Old Egypt", "River Plains"};
  far3 = {"Desert of Nomads", "Midland Valley", "Seven Lakes"};
  far4 = {"Four Corners", "Cradle of Sun", "South Egypt"};
  far5 = {"Memphis", "Eastern Grounds"};
end

--WHEREAMI
whereami = getCurrentRegion();
adjacent = {};
firstTimeRunning = "Yes";

if not whereami then
  error "Couldn't region region. Please zoom in until night sky isn't visible."
end

--Get adjacent regions.
function getAdjacent()
  if whereami == "Cat's Claw Ridge" then
    adjacent = toCCR;
    elseif whereami == "Cradle of the Sun" then
      adjacent = toCOS;
      elseif whereami == "Desert of Nomads" then
        adjacent = toDON;
        elseif whereami == "Desert of Shades" then
          adjacent = toDOS;
          elseif whereami == "Eastern Grounds" then
            adjacent = toEG;
            elseif whereami == "Four Corners" then
              adjacent = toFC;
              elseif whereami == "Lake of Reeds" then
                adjacent = toLR;
                elseif whereami == "Memphis" then
                  adjacent = toM;
                  elseif whereami == "Midland Valley" then
                    adjacent = toMV;
                    elseif whereami == "Old Egypt" then
                      adjacent = toOE;
                      elseif whereami == "River Plains" then
                        adjacent = toRP;
                        elseif whereami == "Seven Lakes" then
                          adjacent = to7L;
                          elseif whereami == "Sinai" then
                            adjacent = toS;
                            elseif whereami == "South Egypt" then
                              adjacent = toSE;
                              elseif whereami == "Valley of the Kings" then
                                adjacent = toVOK;
                              end
                              lsPrintln("Adjacent to " .. whereami .. "  :  " .. adjacent[1] .. " , " .. adjacent[2] .. "  , " .. adjacent[3]);
                              spacer();
                            end


--Needs destination to be not nil;
function pathfind()
  stack = {};
  local path_done = nil;
  while not path_done do
    lsPrintln("Pathfinding...");
    lsPrintln("whereami:   " .. whereami .. "  destination:   " .. destination);


--Get adjacent regions.
getAdjacent();


if adjacent[1] == destination then
  stack[#stack + 1] = adjacent[1];
  path_done = 1;
  elseif adjacent[2] == destination then
    stack[#stack + 1] = adjacent[2];
    path_done = 1;
    elseif adjacent[3] == destination then
      stack[#stack + 1] = adjacent[3];
      path_done = 1;
    else
--Adjacents don't match destination.

--Start comparing adjacents & nearby adjacents for distance to destination.

if destination == "Cat's Claw Ridge" then
  CCR();
  elseif destination == "Cradle of Sun" then
    COS();
    elseif destination == "Desert of Nomads" then
      DON();
      elseif destination == "Desert of Shades" then
        DOS();
        elseif destination == "Eastern Grounds" then
          EG();
          elseif destination == "Four Corners" then
            FC();
            elseif destination == "Lake of Reeds" then
              LR();
              elseif destination == "Memphis" then
                M();
                elseif destination == "Midland Valley" then
                  MV();
                  elseif destination == "Old Egypt" then
                    OE();
                    elseif destination == "River Plains" then
                      RP();
                      elseif destination == "Seven Lakes" then
                        SevenL();
                        elseif destination == "Sinai" then
                          S();
                          elseif destination == "South Egypt" then
                            SE();
                            elseif destination == "Valley of Kings" then
                              VOK();
                            end

                            stackChanged ="No";
--far1
for i=1, #far1 do
  if adjacent[1] == far1[i] then
    stack[#stack + 1] = far1[i]
    i = #far1
    stackChanged ="Yes";
    elseif adjacent[2] == far1[i] then
      stack[#stack + 1] = far1[i]
      i = #far1
      stackChanged ="Yes";
      elseif adjacent[3] == far1[i] then
        stack[#stack + 1] = far1[i]
        i = #far1
        stackChanged ="Yes";
      end
    end
--far2
if stackChanged == "No" then
  for i=1, #far2 do
    if adjacent[1] == far2[i] then
      stack[#stack + 1] = far2[i]
      i = #far2
      stackChanged ="Yes";
      elseif adjacent[2] == far2[i] then
        stack[#stack + 1] = far2[i]
        i = #far2
        stackChanged ="Yes";
        elseif adjacent[3] == far2[i] then
          stack[#stack + 1] = far2[i]
          i = #far2
          stackChanged ="Yes";
        end
      end
    end
--far3
if stackChanged == "No" then
  for i=1, #far3 do
    if adjacent[1] == far3[i] then
      stack[#stack + 1] = far3[i]
      i = #far3
      stackChanged ="Yes";
      elseif adjacent[2] == far3[i] then
        stack[#stack + 1] = far3[i]
        i = #far3
        stackChanged ="Yes";
        elseif adjacent[3] == far3[i] then
          stack[#stack + 1] = far3[i]
          i = #far3
          stackChanged ="Yes";
        end
      end
    end
--far4
if stackChanged == "No" then
  for i=1, #far4 do
    if adjacent[1] == far4[i] then
      stack[#stack + 1] = far4[i]
      i = #far4
      stackChanged ="Yes";
      elseif adjacent[2] == far4[i] then
        stack[#stack + 1] = far4[i]
        i = #far4
        stackChanged ="Yes";
        elseif adjacent[3] == far4[i] then
          stack[#stack + 1] = far4[i]
          i = #far4
          stackChanged ="Yes";
        end
      end
    end
--far5
if stackChanged == "No" then
  for i=1, #far5 do
    if adjacent[1] == far5[i] then
      stack[#stack + 1] = far5[i]
      i = #far5
      stackChanged ="Yes";
      elseif adjacent[2] == far5[i] then
        stack[#stack + 1] = far5[i]
        i = #far5
        stackChanged ="Yes";
        elseif adjacent[3] == far5[i] then
          stack[#stack + 1] = far5[i]
          i = #far5
          stackChanged ="Yes";
        end
      end
    end
--far6
if stackChanged == "No" then
  for i=1, #far6 do
    if adjacent[1] == far6[i] then
      stack[#stack + 1] = far6[i]
      i = #far6
      stackChanged ="Yes";
      elseif adjacent[2] == far6[i] then
        stack[#stack + 1] = far6[i]
        i = #far6
        stackChanged ="Yes";
        elseif adjacent[3] == far6[i] then
          stack[#stack + 1] = far6[i]
          i = #far6
          stackChanged ="Yes";
        end
      end
    end
--far7
if stackChanged == "No" then
  for i=1, #far7 do
    if adjacent[1] == far7[i] then
      stack[#stack + 1] = far7[i]
      i = #far7
      stackChanged ="Yes";
      elseif adjacent[2] == far7[i] then
        stack[#stack + 1] = far7[i]
        i = #far7
        stackChanged ="Yes";
        elseif adjacent[3] == far7[i] then
          stack[#stack + 1] = far7[i]
          i = #far7
          stackChanged ="Yes";
        end
      end
    end
    if stackChanged == "No" then
      error "Something went wrong!";
    end

    whereami = stack[#stack];

  end
  lsPrintln("endloop");
end
end



function doit()
  while 1 do

    getAdjacent();
    button_names = {adjacent[1], adjacent[2], adjacent[3]};
    if not stack then

-- 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;
  x = 30;
  y = 30;
  if not destination then
    lsPrintWrapped(90, 10, 10, lsScreenX - 10, 0.6, 0.6, 0xFFFFFFff, "Choose a destination:");
  else
    lsPrintWrapped(45, 10, 10, lsScreenX - 10, 0.6, 0.6, 0x80ff80ff, "Destination selected as: ".. destination);
  end
  for i=1, #button_names do
    if button_names[i] == "X" then
--Do Nothing
else
  if lsButtonText(x, y, 0, lsScreenX - 50, 0x80ff80ff, button_names[i]) then
    image_name = button_names[i];
    is_done = 1;
  end
end
y = y+30;
end


if lsButtonText(x, y, 0, lsScreenX - 50, 0xffff80ff, "Travel to...") then
  image_name = "Travel to...";
  is_done = 1;
end

if lsButtonText(lsScreenX - 220, lsScreenY - 30, z, 150, 0xFF0000ff, "Dismount") then
  error "Clicked End Script button";
end
lsDoFrame();
lsSleep(10);
end

if image_name == button_names[1] then
--Adjacent selected as destination
destination = button_names[1];
pathfind();

elseif image_name == button_names[2] then
--Adjacent selected as destination
destination = button_names[2];
pathfind();

elseif image_name == button_names[3] then
--Adjacent selected as destination
destination = button_names[3];
pathfind();

elseif image_name == "Travel to..." then
--"Travel to" pressed, ask which region to travel to.
local travel_to = nil;
local is_done = nil;
while not is_done do
  local y = nil;
  local x = nil;
  local bsize = nil;
  x = 30;
  y = 0;
  for i=1, #regions do
    if lsButtonText(x, y, 0, lsScreenX - 50, 0x80ff80ff, regions[i]) then
      destination = regions[i];
      is_done = 1;
    end
    y = y+30;
  end

  if lsButtonText(lsScreenX - 220, lsScreenY - 30, z, 150, 0xFF0000ff, "Dismount") then
    error "Clicked End Script button";
  end
  lsDoFrame();
  lsSleep(10);
end
pathfind();
end
end
--if not stack end
--Get ready for travel
if firstTimeRunning == "Yes" then
  lsPrintWrapped(0, 10, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Securing the saddle...");
  lsDoFrame();
  lsSleep(500);
  lsPrintWrapped(0, 10, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Securing the saddle...");
  lsPrintWrapped(0, 25, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Cleaning horseshoes...");
  lsDoFrame();
  lsSleep(500);
  lsPrintWrapped(0, 10, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Securing the saddle...");
  lsPrintWrapped(0, 25, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Cleaning horseshoes...");
  lsPrintWrapped(0, 40, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Brushing hair...");
  lsDoFrame();
  lsSleep(500);
  lsPrintWrapped(0, 10, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Securing the saddle...");
  lsPrintWrapped(0, 25, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Cleaning horseshoes...");
  lsPrintWrapped(0, 40, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Brushing hair...");
  lsPlaySound("snort.wav");
  lsPrintWrapped(0, 55, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Whispering ".. destination .." to horses...");
  lsDoFrame();
  lsSleep(500);
  lsPrintWrapped(0, 10, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Securing the saddle...");
  lsPrintWrapped(0, 25, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Cleaning horseshoes...");
  lsPrintWrapped(0, 40, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Brushing hair...");
  lsPrintWrapped(0, 55, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Whispering ".. destination .." to horses...");
  lsPrintWrapped(0, 70, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Clicking tongue...");
  lsDoFrame();
  lsSleep(1000);
  firstTimeRunning = "No";
end


--Stash CS
checkCS();
safeDrag(cs[0], cs[1], 10, 10);
sleepWithStatus(1000, "Stashing chariot...");
whereami = getCurrentRegion();
getAdjacent();
--Select Destination
if stack[1] == adjacent[1] then
  safeClick(30, 85);

  elseif stack[1] == adjacent[2] then
    safeClick(30, 100);

    elseif stack[1] == adjacent[3] then
      safeClick(30, 120);

    else
      error "Stack[1] doesn't match adjacents."

    end

--Stash Region window to 290, 10

sleepWithStatus(1000, "Stashing destination...");
srReadScreen();
regionwindow = srFindImage("chariot/travelto.png", 5000);
safeDrag(regionwindow[0], regionwindow[1], 290, 10);


--function checkFREE()
-- Check for free travel.
srReadScreen();
FREE = srFindImage("chariot/travelfree.png", 5000);
regionwindow = srFindImage("chariot/travelto.png", 5000);
tt = srFindImage("chariot/tt.png", 5000);
useTT = nil;
while not FREE do
  if alwayswhip then
    safeClick(tt[0], tt[1], rightclick);
    useTT = 1;

    sleepWithStatus(1000, "Waiting for Yes promt...");
    srReadScreen();
    yes = srFindImage("chariot/yes.png", 5000);
    safeClick(yes[0], yes[1], rightclick);
    if #stack == 1 then
      sleepWithStatus(4000, "Travelling...");
    else
      lsPlaySound("gallop.wav");
      sleepWithStatus(4000, "Travelling...");
    end
    FREE = 1;
  else


    srReadScreen();
    FREE = srFindImage("chariot/travelfree.png", 5000);
--Buttons
lsPrintWrapped(90, 10, 10, lsScreenX - 10, 0.6, 0.6, 0x80ff80ff, "Waiting for Free Travel");
if lsButtonText(30, 25, 0, lsScreenX - 50, 0x80ff80ff, "Whip horses once") then
  safeClick(tt[0], tt[1], rightclick);
  useTT = 1;

  sleepWithStatus(1000, "Waiting for Yes promt...");
  srReadScreen();
  yes = srFindImage("chariot/yes.png", 5000);
  safeClick(yes[0], yes[1], rightclick);
  if #stack == 1 then
    sleepWithStatus(4000, "Travelling...");
  else
    lsPlaySound("gallop.wav");
    sleepWithStatus(4000, "Travelling...");
  end
  FREE = 1;
end
if lsButtonText(30, 55, 0, lsScreenX - 50, 0x80ff80ff, "Whip horses every stop") then
  alwayswhip = 1;
end
if lsButtonText(30, 85, 0, lsScreenX - 50, 0xFF0000ff, "Dismount") then
  error "Clicked End Script button";
end

--Report
lsPrintWrapped(30, 110, 10, lsScreenX - 10, 0.6, 0.6, 0x80ff80ff, "Destination:   ".. destination);
lsPrintWrapped(30, 125, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, "Route:");
y = 125;
for i=1,#stack do
  y = y + 15;
  lsPrintWrapped(30, y, 10, lsScreenX - 10, 0.6, 0.6, 0xffff80ff, i.. " >> ".. stack[i]);
end


lsDoFrame();
lsSleep(100);

--If waiting for Free Travel, refresh region window.
if not useTT then
  if tt then
    safeClick(290, 10, rightclick);
  else
    error "Region window missing!"
  end
end
end
end
--end
if not useTT then
  srReadScreen();
  FREE = srFindImage("chariot/travelfree.png", 5000);
  if FREE then
    safeClick(FREE[0], FREE[1], rightclick);
    if #stack == 1 then
      sleepWithStatus(4000, "Travelling...");
    else
      lsPlaySound("gallop.wav");
      sleepWithStatus(4000, "Travelling...");
    end
  else
    error "Region window missing!";
  end
end
--Clear first item of the stack and move the rest to left.
for i=1, #stack do
  stack[i] = stack[i + 1];
end
--REACHED?
if not stack[1] then
  lsPlaySound("horsewalk.wav");
  lsSleep(3000);
  lsPlaySound("longsnort.wav");
  error "You reach your destination and dismount your horse.";
end
end
end



grass.lua

Download Walks and gathers grass.

-- run and gather grass  v1.0 by Safa

dofile("common.inc");

numGrass = 0

function pickGrass()
		srReadScreen();
		local xyWindowSize = srGetWindowSize();
		local midX = xyWindowSize[0] / 2;
		local pos = srFindImageInRange("grass.png",0,0,midX,100,1000);
		if (pos) then
		srClickMouseNoMove(pos[0], pos[1], 1);
			numGrass = numGrass + 1;
			sleepWithStatus(2500, "Picking");
		end
end


function walkeast()
    local xyWindowSize = srGetWindowSize()
		safeClick(xyWindowSize[0] / 2 + 400, xyWindowSize[1] /2 + 10);
		sleepWithStatus(1500, "Walking East");
end

function walkwest()
    local xyWindowSize = srGetWindowSize()
		safeClick(xyWindowSize[0] / 2 - 400, xyWindowSize[1] /2 + 10);
		sleepWithStatus(1500, "Walking West");
end



function doit()
	local done = false
	--Say Hi
	askForWindow("Stay on a grassy area and hit Shift to start. You can chat and perform other tasks while the macro is running as long as grass is visible in the middle of your screen. You can also minimize Automato window after the macro is started. - grass v1.0 by Safa") ;
	--Set camera to top down view.
	srKeyDown(0x76);
	srKeyDown(0x77);
	srKeyDown(0x77);
	srKeyDown(0x77);
	--doit
	while not done	
	do
		sleepWithStatus(500, "Grass collected: " .. tostring(numGrass)) ;
		pickGrass();
		walkwest();
		pickGrass();
		walkeast();
	end

end


gravel.lua

Download Drops every type of stone in your inventory and smashes them in place.

--gravel.lua
dofile("common.inc");

is_done = false; --Exit Loop?


askText = singleLine([[
  Hit SHIFT to begin. Pin inventory, press and hold ALT to drop stones. Hold middle click or S to smash.
  ]]);

function doit()
  askForWindow(askText);
  askForFocus();
  Run();
end


function Run()
--Loop
  xyWindowSize = srGetWindowSize();
  srReadScreen();

  while not is_done do
  checkBreak();

  if lsAltHeld() then
    srReadScreen();
    stone = findText("Stone");
    if stone then
      srClickMouseNoMove(stone[0] +10, stone[1], true);
      sleepWithStatus(25, "Dropping");
      srClickMouseNoMove(xyWindowSize[0]/2 + 55, xyWindowSize[1]/2 + 20, 1);
    else
       sleepWithStatus(25, "Nothing to drop.");
    end
  end

  if lsMouseIsDown(2) then
      srKeyEvent('s');
      lsSleep(25);
      srClickMouseNoMove(xyWindowSize[0], xyWindowSize[1] - xyWindowSize[1] + 10, 1);
  end

  if lsKeyDown("q") then
      is_done = 1;
  end
    lsDoFrame();
    lsSleep(25);
  end
end



markChatsAsRead.lua

Download Goes through every chat tab in a second.

dofile("common.inc");
is_done = false;
askText = singleLine([[markChatsAsRead:Safa Make sure ATITD is in focus and hit shift to mark all chat tabs as read.]]);

function doit()
  askForWindow(askText);
  askForFocus();
  run();
end

function run()
--Loop
  while not is_done do

   for i =1,100 do
     srKeyDown(0x78);
     lsSleep(20);
   end

    is_done = 1;
    lsDoFrame();
    lsSleep(50);
  end
end



mod_assist.lua

Download Automato_Logo Makes it easier to moderate boards with buttons and shortcuts.

-- mod_assist.lua by Safa
--
-- Do various modding tasks using Automato UI or Keyboard Shortcuts. Get notified when new posts are present.
-- Uses pbslog.txt to save modding history.

dofile("common.inc");

askText = singleLine([[
  mod_assist by Safa. Do various modding tasks using Automato UI or Keyboard Shortcuts. 
  Get notified when new posts are present. This macro WON'T autopost any messages. 
  Every post must be approved by the operator! Click the gear icon for more settings. 
  Hit SHIFT to begin.
  ]]);

--Done Modding
is_done = false;
--Automato Window Size
automato = lsGetWindowSize();
--Used by Timer to determine a second is passed.
frame = 0;
notifyOnce = 0;
lessTriggerHappy = 500;
animation_beep = 3000;
animation_readScreen = 0;
animation_postSent = 0;
--Timer
h=0;
m=0;
s=0;
--Number of posts approved/posted.
p_yes=0;
p_saved =0;
--Keybind Buttons
buttons = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", 
  "a", 
  "b", 
  "c", 
  "d", 
  "e", 
  "f", 
  "g", 
  "h", 
  "i", 
  "j", 
  "k", 
  "l", 
  "m", 
  "n", 
  "o", 
  "p", 
  "q", 
  "r", 
  "s", 
  "t", 
  "u", 
  "v", 
  "w", 
  "x", 
  "y", 
  "z", 
  "CAPSLOCK", 
  "F1", 
  "F2", 
  "F3", 
  "F4", 
  "F5", 
  "F6", 
  "F7", 
  "F8", 
  "F9", 
  "F10", 
  "F11", 
  "F12", 
  "PRINTSCREEN", 
  "SCROLLLOCK", 
  "PAUSE", 
  "INSERT", 
  "HOME", 
  "PAGEUP", 
  "DELETE", 
  "END", 
  "PAGEDOWN", 
  "RIGHT", 
  "LEFT", 
  "DOWN", 
  "UP", 
  "AUDIONEXT", 
  "AUDIOPREV", 
  "AUDIOSTOP", 
  "AUDIOPLAY", 
  "AUDIOMUTE", 
  "LCTRL", 
  "LSHIFT", 
  "LALT", 
  "LGUI", 
  "RCTRL", 
  "RSHIFT", 
  "RALT" 
};
--Settings
ui_size = "Default";
logsession = "On";
keyboard_shortcuts = "On";
post_button = "LALT";
save_button = "LCTRL";
sounds = "Loop";
success_sound = "On";
scribble_sound = "On";
--State.  0:Waiting for Posts  1: Post Pending  2: Settings 3: Post Sent
State=0;

function doit()
  askForWindow(askText);
  findClockInfo();
  askForFocus();
  lsPlaySound("start.wav");
  startModding();
end

function notify()
  if sounds == "Loop" then
    if animation_beep > 3000 then
      lsPlaySound("beepping.wav");
      animation_beep = 0;
    else
      animation_beep = animation_beep + 100;
    end
  elseif sounds == "On" then
    if notifyOnce == 0 then
      lsPlaySound("beepping.wav");
      notifyOnce = 1;
    end
  end
end

function exitButton()
  --Return to Automato Scripts List if "End Script" is pressed.
  if lsButtonText(0 - 20, lsScreenY - 30, z, 200, 0x000000FF, "Log & Exit") then
    if logsession == "On" then
      LogSession();
    end
    is_done = 1;
  end
end

function exitButtonSmall()
  --Return to Automato Scripts List if "End Script" is pressed.
  if lsButtonText(0, 60, z, lsScreenX, 0x000000FF, "Log & Exit") then
    if logsession == "On" then
      LogSession();
    end
    is_done = 1;
  end
end

function PBSLog(Text)
  FileFish = io.open("pbslog.txt","a+");
  FileFish:write(Text);
  FileFish:close();
end

function LogSession()
  if logTime == "Off" then
    timeStarted = "       Unknown       ";
    timeStopped = "       Unknown       ";
  else
    --Time Macro Stopped. (for pbslog.txt)
    findClockInfo();
    timeStopped = "[" .. Date .. ", " .. Time .. "] ";
  end


  --Log information about this modding session.
  if p_yes < 10 then
    PBSLog("  " .. "    (" .. h .. "h" ..  m .. "m".. s .. "s)                 " .. "-00" .. p_yes .. "-            " .. timeStarted .. "   " .. timeStopped .. "\n");
  elseif p_yes < 100 then
    PBSLog("  " .. "    (" .. h .. "h" ..  m .. "m".. s .. "s)                 " .. "-0" .. p_yes .. "-            " .. timeStarted .. "   " .. timeStopped .. "\n");
  else
    PBSLog("  " .. "    (" .. h .. "h" ..  m .. "m".. s .. "s)                 " .. "-" .. p_yes .. "-            " .. timeStarted .. "   " .. timeStopped .. "\n");
  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);
      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 updateTimer()
  if frame > 1000 then
    frame = 0;
    s = s + 1;
    if s == 60 then
      s = 0;
      m = m + 1;
    end
    if m == 60 then
      m = 0;
      s = 0;
      h = h + 1;
    end
  end
end

function playScribble()
  if scribble_sound == "On" then
    lsPlaySound("scribble.wav");
  end
end

function playSuccess()
  if success_sound == "On" then
    lsPlaySound("successful.wav");
  end
end

function waitForPosts()
  if ui_size == "Default" then -- UI Size Default
    --Show time passed below microphone.
    updateTimer();
    if lsButtonImg(200, 50, 8, 0.10, 0xFFFFFFff, "pbs/settings.png") then
      State = 2;
    end
    if p_saved == 1 then
      lsPrint(85, 10, 2, 0.6, 0.6, 0x55AAAAFF, "Holding saved post(s).");
    end
    lsPrint(90, 25, 2, 0.7, 0.7, 0xFFFFFFFF, "Waiting for posts");
    if p_yes < 10 then
      lsPrint(55, 130, 2, 2.0, 2.0, 0xFFFFFFff, "00" .. p_yes);
    elseif p_yes < 100 then
      lsPrint(55, 130, 2, 2.0, 2.0, 0xFFFFFFFF, "0" .. p_yes);
    else
      lsPrint(55, 130, 2, 2.0, 2.0, 0xFFFFFFFF, p_yes);
    end
    lsPrint(120, 220, 2, 0.7, 0.7, 0xFFFFFFFF, "(" .. h .. "h" ..  m .. "m".. s .. "s)");
    lsButtonImg(50, 50, 1, 0.40, 0xFFFFFFff, "pbs/microphone.png");
    exitButton();
  else -- UI Size Toolbar
    updateTimer();
    if lsButtonImg(240, 5, 5, 0.10, 0xFFFFFFff, "pbs/settings.png") then
      State = 2;
    end
    if p_saved == 1 then
      lsPrint(85, 10, 2, 0.6, 0.6, 0x55AAAAFF, "Holding saved post(s).");
    end
    lsPrint(140, 15, 2, 0.5, 0.5, 0xFFFFFFFF, "Waiting for posts");
    lsPrint(65, 7, 2, 2.0, 2.0, 0xFFFFFFFF, p_yes);
    lsPrint(150, 30, 2, 0.7, 0.7, 0xFFFFFFFF, "(" .. h .. "h" ..  m .. "m".. s .. "s)");
    lsButtonImg(5, 5, 1, 0.10, 0xFFFFFFff, "pbs/microphone.png");
    exitButtonSmall();
  end
end

function postButton()
  if keyboard_shortcuts == "On" then
    if post_button == "LALT" then
      if lsAltHeld() then
        if lessTriggerHappy > 500 then
          srClickMouseNoMove(POST[0] + 25, POST[1] + 5, 1);
          playScribble();
          p_yes = p_yes + 1;
          State =3;
          animation_postSent = 0;
          lessTriggerHappy = 0;
        else
          lessTriggerHappy = lessTriggerHappy + 100;
        end    
      end
    else
      if lsKeyDown(post_button) then
        if lessTriggerHappy > 500 then
          srClickMouseNoMove(POST[0] + 25, POST[1] + 5, 1);
          playScribble();
          p_yes = p_yes + 1;
          State =3;
          animation_postSent = 0;
          lessTriggerHappy = 0;
        else
          lessTriggerHappy = lessTriggerHappy + 100;
        end    
      end
    end

  end
end

function saveButton()
  if keyboard_shortcuts == "On" then
    if save_button == "LCTRL" then
      if lsControlHeld() then
        safeDrag(POST[0] - 10, POST[1] - 40, 25, 25, 1);
        safeDrag(740, 80, atitd[0] - 40, 80, 1);
      end
    else
      if lsKeyDown(save_button) then
        safeDrag(POST[0] - 10, POST[1] - 40, 25, 25, 1);
        safeDrag(740, 80, atitd[0] - 40, 80, 1);
      end
    end
  end
end

function postPending()
  updateTimer();
  if not POST then
    State =3;
    notifyOnce = 0;
    animation_postSent = 0;
  else
    if ui_size == "Default" then --UI Size Default
      notify();
      postButton();
      saveButton();

      lsPrint(100, 25, 2, 0.7, 0.7, 0xFFFFFFFF, "Post(s) Pending");
      lsPrint(143, 125, 2, 2.0, 2.0, 0x55AAAAFF, p_yes);
      lsPrint(120, 220, 2, 0.7, 0.7, 0xFFFFFFFF, "(" .. h .. "h" ..  m .. "m".. s .. "s)");
      --Expand Post Window
      if lsButtonImg(200, 50, 3, 0.15, 0xFFFFFFff, "pbs/expand.png") then
        safeDrag(POST[0] - 10, POST[1] - 40, 25, 25, 1);
        safeDrag(740, 80, atitd[0] - 40, 80, 1);
      end
      --Save Post
      if lsButtonImg(220, 120, 3, 0.15, 0xFFFFFFff, "pbs/save.png") then
        srClickMouseNoMove(POST[0] + 10, POST[1] + 5, 1);
        lsPlaySound("saved.wav");
        p_saved = 1;
      end	
      --Send Post
      if lsButtonImg(50, 50, 1, 0.40, 0xFFFFFFff, "pbs/message.png") then
        srClickMouseNoMove(POST[0] + 25, POST[1] + 5, 1);
        playScribble();
        p_yes = p_yes + 1;
        State =3;
        animation_postSent = 0;
        playSuccess();
      end
      exitButton();
    else --UI Size Toolbar
      notify();		
      postButton();
      saveButton();

      lsPrint(165, 15, 2, 0.5, 0.5, 0xFFFFFFFF, "Post(s) Pending");
      lsPrint(260, 20, 2, 1.0, 1.0, 0xFFFFFFFF, p_yes);
      lsPrint(170, 30, 2, 0.7, 0.7, 0xFFFFFFFF, "(" .. h .. "h" ..  m .. "m".. s .. "s)");
      --Expand Post Window
      if lsButtonImg(105, 5, 5, 0.10, 0xFFFFFFff, "pbs/expand.png") then
        safeDrag(POST[0] - 10, POST[1] - 40, 25, 25, 1);
        safeDrag(740, 80, atitd[0] - 40, 80, 1);
      end
      --Save Post
      if lsButtonImg(55, 5, 5, 0.10, 0xFFFFFFff, "pbs/save.png") then
        srClickMouseNoMove(POST[0] + 10, POST[1] + 5, 1);
        lsPlaySound("saved.wav");
        p_saved = 1;
      end	
      --Send Post
      if lsButtonImg(5, 5, 1, 0.10, 0xFFFFFFff, "pbs/message.png") then
        srClickMouseNoMove(POST[0] + 25, POST[1] + 5, 1);
        playScribble();
        p_yes = p_yes + 1;
        State =3;
        animation_postSent = 0;
      end
      exitButtonSmall();
    end
  end

end

function postSent()
  if ui_size == "Default" then --UI Size Default
    updateTimer();
    --Go to state 0 when 0.5 second passes.
    if animation_postSent > 500 then
      State = 0;
      notifyOnce = 0;
      lessTriggerHappy = 0;
    else
      if notifyOnce == 0 then
        playSuccess();
        notifyOnce = 1;
      end
      lsPrint(110, 25, 2, 0.9, 0.9, 0xFFFFFFFF, "All Done!");
      lsButtonImg(45, 49, 1, 0.85, 0xFFFFFFff, "pbs/yes.png");
      exitButton();
      POST = nil;
      animation_postSent = animation_postSent + 100; 
    end
  else --UI Size Toolbar
    updateTimer();
    --Go to state 0 when 0.5 second passes.
    if animation_postSent > 500 then
      State = 0;
      notifyOnce = 0;
    else
      if notifyOnce == 0 then
        playSuccess();
        notifyOnce = 1;
      end
      lsPrint(65, 7, 2, 2.0, 2.0, 0xFFFFFFFF, "All Done!");
      lsButtonImg(5, 5, 1, 0.20, 0xFFFFFFff, "pbs/yes.png");
      exitButtonSmall();
      POST = nil;
      animation_postSent = animation_postSent + 100; 
    end
  end
end

function settingsMenu()
  updateTimer();
  settings_y = 0;
  lsDisplaySystemSprite(1, 0, 0, 0, automato[0], automato[1], 0xFFFFFFFF);

  lsPrint(60, settings_y + 10, 1, 0.7, 0.7, 0x000000FF, "Small User Interface");
  if ui_size == "Default" then 
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/off.png") then
      ui_size = "Toolbar";
    end
  else
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/on.png") then
      ui_size = "Default";
    end
  end

  settings_y = settings_y + 25;
  lsPrint(60, settings_y + 10, 1, 0.7, 0.7, 0x000000FF, "Log Modding Session (pbslog.txt)");
  if logsession == "Off" then 
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/off.png") then
      logsession = "On";
    end
  else
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/on.png") then
      logsession = "Off";
    end
  end

  settings_y = settings_y + 25;

  if sounds == "Loop" then 
    lsPrint(60, settings_y + 10, 1, 0.7, 0.7, 0x000000FF, "Notify until all posts are sent");
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/mid.png") then
      sounds = "On";
    end
  elseif sounds == "On" then
    lsPrint(60, settings_y + 10, 1, 0.7, 0.7, 0x000000FF, "Notify once for every post");
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/on.png") then
      sounds = "Off";
    end
  else
    lsPrint(60, settings_y + 10, 1, 0.7, 0.7, 0x000000FF, "No Notification");
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/off.png") then
      sounds = "Loop";
    end
  end

  settings_y = settings_y + 25;
  lsPrint(60, settings_y + 10, 1, 0.7, 0.7, 0x000000FF, "Success/All Sent Sound");
  if success_sound == "Off" then 
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/off.png") then
      success_sound = "On";
    end
  else
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/on.png") then
      success_sound = "Off";
    end
  end

  settings_y = settings_y + 25;
  lsPrint(60, settings_y + 10, 1, 0.7, 0.7, 0x000000FF, "Scribble/Posting Sound");
  if scribble_sound == "Off" then 
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/off.png") then
      scribble_sound = "On";
    end
  else
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/on.png") then
      scribble_sound = "Off";
    end
  end

  settings_y = settings_y + 25;
  lsPrint(60, settings_y + 10, 1, 0.7, 0.7, 0x000000FF, "Enable Keyboard Shortcuts");
  if keyboard_shortcuts == "Off" then 
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/off.png") then
      keyboard_shortcuts = "On";
    end
  else
    if lsButtonImg(20, settings_y, 1, 0.30, 0xFFFFFFff, "pbs/on.png") then
      keyboard_shortcuts = "Off";
    end
  end


  settings_y = settings_y + 50;
  lsDisplaySystemSprite(1, 0, settings_y - 10, 1, automato[0], 1, 0x000000FF);
  lsPrint(15, settings_y - 5, 1, 0.5, 0.5, 0x000000FF, "Automato must be in focus to use custom keybindings!");
  lsPrint(70, settings_y + 5, 1, 0.7, 0.7, 0x000000FF, "Change Key Bindings");

  settings_y = settings_y + 25;
  if lsButtonImg(45, settings_y + 5, 2, 0.06, 0xFFFFFFff, "pbs/message.png") then
    bind = "post";
  end

  if bind == "post" then
    lsPrint(90, settings_y, 2, 2.0, 2.0, 0xFFFFFFff, post_button);
    lsDisplaySystemSprite(1, 0, settings_y, 1, automato[0], 40, 0x000000FF); --Black
    postKeyList();
  else
    lsPrint(90, settings_y, 2, 2.0, 2.0, 0x000000FF, post_button);
  end

  settings_y = settings_y + 35;
  if lsButtonImg(45, settings_y + 5, 2, 0.06, 0xFFFFFFff, "pbs/save.png") then
    bind = "save";
  end

  if bind == "save" then
    lsPrint(90, settings_y, 1, 2.0, 2.0, 0xFFFFFFff, save_button);
    lsDisplaySystemSprite(1, 0, settings_y, 1, automato[0], 40, 0x000000FF); --Black
    saveKeyList();
  else
    lsPrint(90, settings_y, 1, 2.0, 2.0, 0x000000FF, save_button);
  end	
  settings_y = settings_y + 35;



  if lsButtonText(0 - 20, lsScreenY - 30, 1, 200, 0x000000FF, "Save") then
    if post_button == save_button then
      error "Keyboard shortcuts for post button and save button cannot be the same!";
    else
      State=0;
    end
  end

end

function postKeyList()
  for i =1,#buttons do
    if lsKeyDown(buttons[i]) then
      post_button = buttons[i];
    end
  end
end

function saveKeyList()
  for i =1,#buttons do
    if lsKeyDown(buttons[i]) then
      save_button = buttons[i];
    end
  end
end


function startModding()
  if not Time then
    logTime = "Off";
  else
    --Time Macro Started. (for pbslog.txt)
    timeStarted = "[" .. Date .. ", " .. Time .. "]";
  end

  srReadScreen();
  atitd = srGetWindowSize();

  while not is_done do
    --Wait X seconds then read screen.
    if animation_readScreen > 1000 then
      srReadScreen();
      POST = srFindImage("pbs/S_P.png");
      O_P = srFindImage("pbs/O_P.png");
      animation_readScreen = 0;
    else
      animation_readScreen = animation_readScreen + 100;
    end

    if POST then
      if State ~= 2 then
        State = 1;
      end
    end

    if O_P then
      p_saved = 1;
    else
      p_saved = 0;
    end

    --Determine Active Menu
    if State == 0 then
      waitForPosts();
    elseif State == 1 then
      postPending();
    elseif State == 2 then
      settingsMenu();
    elseif State == 3 then
      postSent();
    end

    if lsKeyDown("q") then
      is_done = 1;
    end	
    frame = frame + 100;
    lsDoFrame();
    lsSleep(100);
  end
end



oven_timer.lua

Download Automato_Logo Finds the desired dredge rate by continuously restarting dredge process.

--oven_timer.lua
dofile("common.inc");

--ACCEPT IF TIMER IS BELOW
accept_minute = 1;
accept_second = 50;


--Exit Loop?
is_done = false;
--Timer
m=0;
s=0;
frame = 6.6;
animation_readScreen = -5000;
animation_Sound = 5000;
--# of retries
r=0;
--State
state = 0;

askText = singleLine([[
  Hit SHIFT to begin.
  ]]);

function doit()
  askForWindow(askText);
  askForFocus();
  Run();
end

function updateTimer()
  if frame > 20 then
    frame = 6.6;
    s = s + 1;
    if s == 60 then
      s = 0;
      m = m + 1;
    end
  end
end

function set0()
  lsPrint(15, 32, 5, 0.6, 0.6, 0x000000FF, "Mode:");
  lsPrint(70, 32, 6, 0.6, 0.6, -865025, "Setting Up");
  lsDisplaySystemSprite(1, 60, 32, 5, 80, 15, 0x000000FF);

  lsPrint(15, 90, 5, 0.6, 0.6, 0x000000FF, "II. Open your Raeli Oven window and stash it");
  lsPrint(15, 105, 5, 0.6, 0.6, 0x000000FF, "in a corner. Move your mouse towards the area");
  lsPrint(15, 120, 5, 0.6, 0.6, 0x000000FF, "where it says White(0) and hit shift when (0)");
  lsPrint(15, 135, 5, 0.6, 0.6, 0x000000FF, "is clearly visible below.");
  lsPrint(15, 60, 5, 0.6, 0.6, 0x000000FF, "I. Make sure your oven isn't dredging already.");

  srReadScreen();
  srMakeImage("CUSTOM", mouse_x, mouse_y, 70, 35);
  srShowImageDebug("CUSTOM", 10, 200, 5);


  if lsShiftHeld() then
    state = 1;
    dredge = findText("Start dredging");
    srClickMouseNoMove(dredge[0] +10, dredge[1], true);
    lsSleep(150);
    xyWindowSize = srGetWindowSize();
    srSetMousePos(xyWindowSize[0]/2 + 55, xyWindowSize[1]/2 + 20, 1);
  end
end

function time()
  lsPrint(15, 32, 5, 0.6, 0.6, 0x000000FF, "Mode:");
  lsPrint(70, 32, 6, 0.6, 0.6, -865025, "Timing Oven");
  lsDisplaySystemSprite(1, 60, 32, 5, 90, 15, 0x000000FF);

  lsDisplaySystemSprite(1, 10, 200, 5, automato[0] - 20, automato[1] / 2.5, 0xFFFFFFff);
  lsPrint(70, 220, 6, 4.7, 4.7, 0x000000FF, m ..":".. s);

  lsPrint(15, 75, 5, 0.6, 0.6, 0x000000FF, "Number of retries: [".. r .."]");
  lsPrint(15, 90, 5, 0.6, 0.6, 0x000000FF, "Accepting below ".. accept_minute ..":".. accept_second);


    --Wait X seconds then read screen.
    if animation_readScreen > 1000 then
      srReadScreen();
      zero = srFindImage("CUSTOM");
      animation_readScreen = 0;
     if not zero then
      state = 2;
      end
    else
      animation_readScreen = animation_readScreen + 50;
    end

    if lsButtonText(15, 105, 7, 200, -865025, "Increase Timer") then
     if accept_second == 55 then
        accept_minute = accept_minute + 1;
        accept_second = 0;
     else
      accept_second = accept_second + 5;
     end
    end
    if lsButtonText(15, 130, 7, 200, -865025, "Decrease Timer") then
     if accept_second == 5 then
        accept_minute = accept_minute - 1;
        accept_second = 55;
     else
      accept_second = accept_second - 5;
     end
    end



  updateTimer();
  if m == accept_minute then
    if s > accept_second then
      srReadScreen();
      this = findText("This is a Raeli Oven");
      srClickMouseNoMove(this[0] +10, this[1]);
      lsSleep(250);
      srReadScreen();
      bake = findText("Begin the Baking Process");
      srClickMouseNoMove(bake[0] +10, bake[1], true);
      lsSleep(250);
      srReadScreen();
      dredge = findText("Start dredging");
      srClickMouseNoMove(dredge[0] +10, dredge[1], true);
      m = 0;
      s = 0;
      r = r + 1;
    end
  end
end

function success()

   --Wait X seconds then read screen.
    if animation_Sound > 5000 then
      lsPlaySound("successful.wav");
      animation_Sound = 0;
    else
      animation_Sound = animation_Sound + 50;
    end



  lsPrint(15, 32, 5, 0.6, 0.6, 0x000000FF, "Mode:");
  lsPrint(70, 32, 6, 0.6, 0.6, -865025, "Success");
  lsDisplaySystemSprite(1, 60, 32, 5, 70, 15, -1697828097);

  lsDisplaySystemSprite(1, 10, 200, 5, automato[0] - 20, automato[1] / 2.5, -1697828097);
  lsPrint(70, 220, 6, 4.7, 4.7, 0xFFFFFFff, m ..":".. s);

  lsPrint(15, 75, 5, 0.6, 0.6, 0x000000FF, "Number of retries: [".. r .."]");
  lsPrint(15, 90, 5, 0.6, 0.6, 0x000000FF, "Accepting below ".. accept_minute ..":".. accept_second);
  lsPrint(15, 105, 5, 0.6, 0.6, 0x000000FF, "Oven rate is: ".. m ..":".. s);

end


function Run()
--Loop
  while not is_done do
    checkBreak();
    automato = lsGetWindowSize(); --Automato Window Size
    mouse_x, mouse_y = srMousePos(); --Mouse Location
    px = srReadPixel(mouse_x, mouse_y); --Pixel color @ Mouse Location

    --lsDisplaySystemSprite(1, automato[0] - automato[0] + 15, automato[1] / 1.75, 6, 50, 50, px); --COLOR PICKER

    lsPrint(15, 10, 5, 0.7, 0.7, 0x000000FF, "This is a Raeli Oven Timer");



    if lsButtonImg(automato[0] - 45, automato[1] - automato[1] + 10, 5, 1.0, 0xFFFFFFff, "blank.png") then
      is_done=true;
    end

    lsDisplaySystemSprite(1, 4, 4, 4, automato[0] - 8, automato[1] - 8, -371609345); --Background
    lsDisplaySystemSprite(1, 3, 3, 3, automato[0] - 6, automato[1] - 6, 0x000000FF); --Black 2
    lsDisplaySystemSprite(1, 2, 2, 2, automato[0] - 4, automato[1] - 4, -1804843265);--Border Light
    lsDisplaySystemSprite(1, 1, 1, 1, automato[0] - 2, automato[1] - 2, 1917857535); --Border
    lsDisplaySystemSprite(1, 0, 0, 0, automato[0], automato[1], 0x000000FF);         --Black 1

    --Determine Active Menu
    if state == 0 then
      set0();
    elseif state == 1 then
      time();
    elseif state == 2 then
      success();
    end

    if lsKeyDown("q") then
      lsClipboardSet(px);
      is_done = 1;
    end
    frame = frame + 1;
    lsDoFrame();
    lsSleep(50);
  end
end



resin.lua

Download Automato_Logo Gathers resin with middle mouse button.

--resin.lua
--Gather resin using middle mouse button. Chat must be minimized.

dofile("common.inc");
--Exit Loop?
is_done = false;

askText = singleLine([[Gather resin using middle mouse button. Chat must be minimized.]]);

function doit()
  askForWindow(askText);
  askForFocus();
  gatherResin();
end


function gatherResin()
  lsTopmost(0);
--Loop
  while not is_done do
  checkBreak();

  if lsMouseIsDown(2) then
    srKeyEvent('r');
    lsSleep(100);
  end

  if lsKeyDown("q") then
      is_done = 1;
  end
    lsDoFrame();
    lsSleep(50);
  end
end



sculptor.lua

Download Automato_Logo Moves sculpture pieces with keystrokes. Executes pre-made recipes.

--Sculptor Macro File
dofile("common.inc");

is_done = false;
askText = singleLine([[To use the click multiplier select a higher setting than 1X then right click. Keyboard control only works when automato is in focus. Keybinds are: WASD E< for movement, 8456 91(Numpad) for rotation. R to record/stop. Numpad enter to play. Use 1,2,3,4,5,6 on keyboard to switch multipliers. Hit SHIFT to begin.]]);

function doit()
  askForWindow(askText);
  askForFocus();
  Run();
end

function anchor()
  srReadScreen();
  MoveObject = findText("Move Object");
end

function click()
  --srSetMousePos(x, y);
  for i=1,multiply do
    white = blue;
    srClickMouseNoMove(x, y, 1);
  end
end

function play()
  a = 1;
  for i=1,len do
    rps[i] = string.sub(recipe, a, i*5);
    a = a + 5;
  end

  for i=1,#rps do
    multiply = string.sub(rps[i], 3, 5); lsPrintln("Multiplier: ".. multiply);
    string = string.sub(rps[i], 1, 2); lsPrintln("Move: ".. string);

    if string == "w+" then x=x+40; y=y+90; click(); end
    if string == "w-" then x=x+40; y=y+110; click(); end
    if string == "xM" then x=x+40; y=y+130; click(); end
    if string == "a+" then x=x+10; y=y+130; click(); end
    if string == "a-" then x=x+30; y=y+130; click(); end
    if string == "d+" then x=x+70; y=y+130; click(); end
    if string == "d-" then x=x+60; y=y+130; click(); end
    if string == "/+" then x=x+80; y=y+90; click(); end
    if string == "/-" then x=x+60; y=y+110; click(); end
    if string == "(+" then x=x+ 10; y=y+150; click(); end
    if string == "(-" then x=x+30; y=y+140; click(); end
  end
  recipe ="";
  --test = string.sub(rps[i], 3, 5);
  --lsPrintln(test);

end

multiply = "001";
recording = false;
recipe="";
rps={};

function Run()
--Loop
  while not is_done do
    checkBreak();
    anchor(); --Heavy on the system.
    mouse_x, mouse_y = srMousePos();
    last = string.sub(recipe, 0, 5);
    len = string.len(recipe) / 5;

    if MoveObject then
      x = MoveObject[0];
      y = MoveObject[1];
      blue = 0x4993DDFF;
      red = 0xFF0000FF;
      white = 0xFFFFFFFF;
      text_white = 0xFFFFFFFF;
    else
      blue = 0x000000FF;
      red = 0x000000FF;
      white = 0x000000FF;
      text_white = 606348543;
      lsPrint(65, 65, 4, 0.6, 0.6, 0x000000FF, "Can't see sculpture controls!");
      lsDisplaySystemSprite(1, 50, 50, 3, 200, 50, 0xFF0000FF);
    end

    if lsMouseIsDown(3) then
      for i=1,multiply - 1 do
        white = blue;
        srClickMouseNoMove(mouse_x, mouse_y, 1);
      end
      lsSleep(200);
    end
    if lsKeyDown("r") then if recording then recording = false; else recording = true end lsSleep(200); end
    if lsKeyDown("KP_ENTER") then play(); lsSleep(200); end
    --Movement keyboard shortcuts
    if lsKeyDown("w") then  x=x+40; y=y+110; if recording then recipe="w-" .. multiply .. recipe; end click(); end
    if lsKeyDown("s") then  x=x+40; y=y+140; if recording then recipe="s-" .. multiply .. recipe; end click(); end
    if lsKeyDown("a") then  x=x+30; y=y+130; if recording then recipe="a-" .. multiply .. recipe; end click(); end
    if lsKeyDown("d") then  x=x+60; y=y+130; if recording then recipe="d-" .. multiply .. recipe; end click(); end
    if lsKeyDown("e") then  x=x+60; y=y+110; if recording then recipe="/-" .. multiply .. recipe; end click(); end
    if lsKeyDown("<") then  x=x+30; y=y+140; if recording then recipe="(-" .. multiply .. recipe; end click(); end
    --Rotation keyboard shortcuts
    if lsKeyDown("KP_8") then x=x+140; y=y+90;  if recording then recipe="8+" .. multiply .. recipe; end click(); end
    if lsKeyDown("KP_5") then x=x+140; y=y+140; if recording then recipe="5-" .. multiply .. recipe; end click(); end
    if lsKeyDown("KP_4") then x=x+130; y=y+130; if recording then recipe="4-" .. multiply .. recipe; end click(); end
    if lsKeyDown("KP_6") then x=x+160; y=y+130; if recording then recipe="6-" .. multiply .. recipe; end click(); end
    if lsKeyDown("KP_9") then x=x+160; y=y+110; if recording then recipe="9-" .. multiply .. recipe; end click(); end
    if lsKeyDown("KP_1") then x=x+130; y=y+140; if recording then recipe="1-" .. multiply .. recipe; end click(); end

    if lsKeyDown(1) then multiply="001"; end
    if lsKeyDown(2) then multiply="003"; end
    if lsKeyDown(3) then multiply="005"; end
    if lsKeyDown(4) then multiply="010"; end
    if lsKeyDown(5) then multiply="050"; end
    if lsKeyDown(6) then multiply="100"; end

    lsPrint(50, 31, 2, 0.6, 0.6, text_white, recipe);
    lsPrint(0, lsScreenY - 20, 2, 0.7, 0.7, text_white, mouse_x .." ".. mouse_y .." | ".. multiply .."X | " .. last .." | ".. len);
    lsDisplaySystemSprite(1, 0, lsScreenY - 20, 0, lsScreenX, 15, blue);

    if multiply == "001" then x1=blue; else x1=white; end
    if multiply == "003" then x3=blue; else x3=white; end
    if multiply == "005" then x5=blue; else x5=white; end
    if multiply == "010" then x10=blue; else x10=white; end
    if multiply == "050" then x50=blue; else x50=white; end
    if multiply == "100" then x100=blue; else x100=white; end

    if recording then rec_color=red; else rec_color=blue; end
    if recording then rec_text="Stop"; else rec_text="Rec" end

    if lsButtonText(0 , 0, z, 50, x1, "1X") then multiply="001"; end
    if lsButtonText(50 , 0, z, 50, x3, "3X") then multiply="003"; end
    if lsButtonText(50 * 2 , 0, z, 50, x5, "5X") then multiply="005";end
    if lsButtonText(50 * 3 , 0, z, 50, x10, "10X") then multiply="010"; end
    if lsButtonText(50 * 4 , 0, z, 50, x50, "50X") then multiply="050"; end
    if lsButtonText(50 * 5 , 0, z, 50, x100, "100X") then multiply="100"; end

    if lsButtonText(0, 25, z, 50, rec_color, rec_text) then if recording then recording = false; else recording = true; end end
    if lsButtonText(0, 50, z, 50, blue, "Clear") then recipe = ""; end
    if lsButtonText(85, 60, z, 120, blue, "Play recipe") then play(); end

    lsPrint(40, 105, 2, 0.7, 0.7, text_white, "Movement");

    if lsButtonText(60, 100+25, 1, 25, white, "^") then x=x+40; y=y+90; if recording then recipe="w+" .. multiply .. recipe; end click(); end
    if lsButtonText(60, 125+25, 1, 25, white, "^") then x=x+40; y=y+110; if recording then recipe="w-" .. multiply .. recipe; end click(); end
    if lsButtonText(60, 195+25, 1, 25, white, "v") then x=x+40; y=y+140; if recording then recipe="s-" .. multiply .. recipe; end click(); end
    if lsButtonText(60, 220+25, 1, 25, white, "v") then x=x+40; y=y+150; if recording then recipe="s+" .. multiply .. recipe; end click(); end
    if lsButtonText(60, 160+25, 1, 25, white, "x") then x=x+40; y=y+130; if recording then recipe="xM" .. multiply .. recipe; end click(); end
    if lsButtonText(25, 160+25, 1, 25, white, "<") then x=x+30; y=y+130; if recording then recipe="a-" .. multiply .. recipe; end click(); end
    if lsButtonText(0, 160+25, 1, 25, white, "<") then x=x+10; y=y+130;  if recording then recipe="a+" .. multiply .. recipe; end click(); end
    if lsButtonText(95, 160+25, 1, 25, white, ">") then x=x+60; y=y+130; if recording then recipe="d-" .. multiply .. recipe; end click(); end
    if lsButtonText(120, 160+25, 1, 25, white, ">") then x=x+70; y=y+130; if recording then recipe="d+" .. multiply .. recipe; end click(); end
    if lsButtonText(95, 125+25, 1, 25, white, "/") then x=x+60; y=y+110; if recording then recipe="/-" .. multiply .. recipe; end click(); end
    if lsButtonText(120, 100+25, 1, 25, white, "/") then x=x+80; y=y+90; if recording then recipe="/+" .. multiply .. recipe; end click(); end
    if lsButtonText(25, 195+25, 1, 25, white, "/") then x=x+30; y=y+140; if recording then recipe="(-" .. multiply .. recipe; end click(); end
    if lsButtonText(0, 220+25, 1, 25, white, "/") then x=x+ 10; y=y+150; if recording then recipe="(+" .. multiply .. recipe; end click(); end

    lsPrint(195, 150, 2, 0.7, 0.7, text_white, "Rotation");

    if lsButtonText(60+150, 100+70, 1, 25, white, "^") then x=x+140; y=y+90;  if recording then recipe="8+" .. multiply .. recipe; end click(); end
    if lsButtonText(60+150, 125+70, 1, 25, white, "^") then x=x+140; y=y+110; if recording then recipe="8-" .. multiply .. recipe; end click(); end
    if lsButtonText(60+150, 195+70, 1, 25, white, "v") then x=x+140; y=y+140; if recording then recipe="5-" .. multiply .. recipe; end click();end
    if lsButtonText(60+150, 220+70, 1, 25, white, "v") then x=x+140; y=y+150; if recording then recipe="5+" .. multiply .. recipe; end click(); end
    if lsButtonText(60+150, 160+70, 1, 25, white, "x") then x=x+140; y=y+130; if recording then recipe="xR" .. multiply .. recipe; end click(); end
    if lsButtonText(25+150, 160+70, 1, 25, white, "<") then x=x+130; y=y+130; if recording then recipe="4-" .. multiply .. recipe; end click(); end
    if lsButtonText(0+150, 160+70, 1, 25, white, "<") then x=x+110; y=y+130;  if recording then recipe="4+" .. multiply .. recipe; end click(); end
    if lsButtonText(95+150, 160+70, 1, 25, white, ">") then x=x+160; y=y+130; if recording then recipe="6-" .. multiply .. recipe; end click(); end
    if lsButtonText(120+150, 160+70, 1, 25, white, ">") then x=x+170; y=y+130; if recording then recipe="6+" .. multiply .. recipe; end click(); end
    if lsButtonText(95+150, 125+70, 1, 25, white, "/") then x=x+160; y=y+110; if recording then recipe="9-" .. multiply .. recipe; end click(); end
    if lsButtonText(120+150, 100+70, 1, 25, white, "/") then x=x+180; y=y+90; if recording then recipe="9+" .. multiply .. recipe; end click(); end
    if lsButtonText(25+150, 195+70, 1, 25, white, "/") then x=x+130; y=y+140; if recording then recipe="1-" .. multiply .. recipe; end click(); end
    if lsButtonText(0+150, 220+70, 1, 25, white, "/") then x=x+110; y=y+150; if recording then recipe="1+" .. multiply .. recipe; end click(); end

    if lsKeyDown("q") then
      is_done = 1;
    end

    lsDoFrame();
    lsSleep(10);
  end
end




Off Topic

Demipharaoh Debate 2016/09

Q1. For those who have never had the opportunity to interact with you before can you share a little about yourself, what you enjoy about ATITD as well as how long you have been playing?

I discovered ATITD at a very young age when i didn't know a single word of english. This was in T3. My fascination with the game and the community resulted in me sleeping with a huge dictionary for months. I'm 23 today and still in love with ATITD for so many reasons. I mostly played in T6 and been here since the beginning of T7. I really enjoy the problemsolving that comes with complex mechanics of this game and i find travelling in the desert very calming.


Q2. How you like T7 so far, it's better or worst than previous Tales. Which Tale was your favorite?

No complaints about T7. Can't say it is better or worse than previous tales but game is finally getting some love from devs im happy about that. My favorite tale is definetly T3 because of nostalgia.


Q3. If the general consensus of the rest of the DPs were that that person should not be banned, but you felt strongly that they should, what would you do?

Personally i don't think anyone but pharaoh should have that kind of power. Sadly this test is and always have been a popularity contest. People usually vote for their friends or the most popular candidate. Therefore there is always the possibility of a DP not being objective when a friend is involved.

Q4. How's your progress in other Leadership tests?

I tend to avoid discipline of leadership for the reasons i stated in previous question but i will try to be the change i want to see in egypt if egypt finds me worthy of this task.


Q5. How are you providing leadership in the game and amongst the player base?

I've been an elder in Zfree and Zemples for a long time. These are sizeable guilds focused on helping players, with their own small communities. Zemples for example helped more than 30 people pass funerary this tale and that number is still counting. I've been organising this process since T6.


Q6. What specifically have you done to further the growth of the community?

One thing i started doing recently is creating content for the game. ATITD is really in need of content creators. We never advertise the game. Playerbase is slowly dying and new players are a rarity. My goal is to help people see beyond the dated graphics of the game and realise what a gem Atitd is. You can see the first video in this project called Beauty of Atitd here.


Q7. How do you feel about sometimes heavy use of macros in this game by many players? and If there was a choice would you support complete ban of macros in the Tale?

This is a question i like. If you scroll up you can see im one of the suppliers of these macros and i don't get this macros are evil way of thinking. If you have a vacuum cleaner and a broom. Nobody would judge you for using the vacuum cleaner. You are of course free to sweep the whole house with the broom but truthfully would you? Using macros is nothing different. You can do the same task over and over or you can leave it to your computer. ATITD is a grindy game. You will never run out of things to do even with macros. Also the community graciously shares the macros they make with the public. I don't see the logic behind choosing the broom then complaining about the vacuum.


Lastly, macros can never be banned successfully. There is always a way around any precaution. I can assure you they will get used in secret and it will be unfair when that happens.


Q8. Spouselog allows access to ban powers. Do you know who have access to your spouse account?

No one.


Q9. As DP do you think you should share your password? Do you think a DP should have access to other DP accounts?

DPs must take responsibility for their actions. Sharing passwords between each other can complicate things.


Q10. What other powers would you like to see DPs hold, in the interests of improving game play?

It would be nice to influence the game/world instead of only playing police. I would love to see DPs as loremakers or worldbuilders with some limitations.


Q11. What question would you like to be asked, and why?


Q12. Closing statement.

I promise a small loan of 1 million charcoal to every citizen who votes for me. Make ATITD great again.