The Wiki for Tale 4 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.

Macro's

From A Tale in the Desert
Jump to navigationJump to search

Icon gather

//General purpose slate and clay collector.  Works best without water jugs
//or a fishing pole.  To begin, hover your mouse over the icon
//you wish to collect in ATITD (i.e. be over a patch of clay or a piece of
//slate and have this program active.  Press F2, and the macro will start.
Constants
Red = 0
Green = 0
Blue = 0
XPos = 0
YPos = 0
CurrKey = 0
End
SetConst XPos = {MouseX}
SetConst YPos = {MouseY}
LoadRGB $XPos, $YPos
SetConst Red = {RGBRed}
SetConst Blue = {RGBBlue}
SetConst Green = {RGBGreen}
SetConst CurrKey = {GlobalKeys}



loop 10000


GetRed  $XPos, $YPos = $Red
	GetGreen  $XPos, $YPos = $Green
		GetBlue  $XPos, $YPos = $Blue
	
			MousePos $XPos, $YPos
			Delay 5
  		LeftClick 
		End
	End
End
	
Delay 100
End

Charcoal Heart

//Charcoal Hearth
//   
//  TamBlack:
//   - Make sure TAKE is NOT an option!! Only use SETUP option ONCE!!
//   - To test the y position, start with 1 heart/oven and press begin. Then run the macro
//     with 1 oven and only checked boxes for Guilded + Need setup + Mouse check. The cursor
//     will then go over all the important locations so you can see if the y is lined up correctly.
//
//   I've made some improvements to the Hearth macro.  Depending on your resolution,
//   the macro will run up to 12 guilded hearths.  I've tested it in 1280x960
//   resolution without any need to change values.  It may work in other resolutions
//   also but I have not been able to test it.  If you are using personal hearths,
//   it will run up to 10 in 1280x960.  Maximum number in 1024x768 is 8.
//
// Setup:  I've added a setup routine to the macro.  Pin the windows on top of each
//         other in the top left corner.  I suggest at least 200 wood per hearth
//         and about 15 water per hearth to be safe.  All hearths are slightly
//         different but I suggest that you put your fastest burning hearths first
//         in line.  You can tweak the settings in the built in menu.
//
//         Hearths: Total number of hearths you are running.
//         Hearths Across: How many Hearths on the top row of windows.  Make sure
//                         you set this each time even if you are running 1 hearth.
//                         Variables in the macro are set off of this number.
//         Guilded?: Check this box if you are using guilded hearths.
//         Need Setup?: Check this box if you need the macro to position your
//                      windows that are stacked in top left corner.  This is
//                      usefull if you run another round on the hearths and your
//                      windows are set up already.  Check if needed or not.
//         Stealth Mouse: Check this if you don't want to see the mouse move around
//                        on the hearth windows.  When checked, it will save your
//                        mouse position, move to the spot it needs, perform its
//                        action then return the pointer to where it started.  Alows
//                        you to change chat windows are dig in chest while the
//                        macro is running :)
//         Heat: Threshold for Heat bar, increase or decrease as needed. If heat
//               reaches this lvl, water will be added.
//         Wood: Wood threshold, adds wood up to this point.
//         Water: Alowable water level, not much play here. If the water lvl is above
//                this lvl, water will not be added. Prevents drowning the hearth.
//         RGBGreen: Used to detect completion bar. If the macro adds a bunch of water
//                   before the macro is done then moves to the next hearth, increase
//                   this number. Or lower it if it doesnt see green.
//         RGBBlue: Works just like RGBGreen but for blue bars.  If the macro keeps
//                  adding wood till the hearth is full, it's not seeing blue.  If
//                  this happens, lower this number.  Other problem may be that the
//                  mouse pointer is not lining up over the bar correctly.  Run the
//                  Mouse Test.
//         Check Bars Interval: This is the pause time between bar checks.  The
//                              default value of 4000 works well for 1-8 hearths
//                              but you may need to decrease this number if you
//                              are running more than 8.
//         Mouse Test: This is to test if the mouse pointer is lining up correctly
//                     with your windows.  Run 1 hearth manually and start the macro
//                     with this option checked.  You don't need to worry about any
//                     other option.  It will move over the Heat, Wood, Water, Danger,
//                     and Status bar then over the Wood and Water buttons 10 times
//                     before it stops.  If these positions are off a bit, you can
//                     change the Y coordinates below in the constants section.
//
//         The macro doesn't watch Oxygen.  I was going to add a vent option but this
//         macro runs very well and never fails for me.  If your oxygen is getting too
//         high, try adding more wood.  But, by adding more wood, you add more heat
//         which may require you adding more water.  A small amount of water in the
//         presence of heat evaporates producing more Oxygen. :)  Find the balance
//         you want.
//
//  ENJOY! :)  Come visit me in LE :) 780, 6956  I have a large bar with tasting
//             tables and hookahs.
//  Anka
//
Constants
  //User Definable variables
  Hearths = 4
  HeatX = 165
  WoodX = 107
  WaterX = 76
  DangerX = 164
  RGBBlue = 220
  RGBGreen = 240
  Guild = 1

  // Y Coordinates - Don't change unless you are having a problem.
  // TamBlack: Oven value = -15 // heart value = -5 //original value
  RegY = 54//69//74      // Y coord for Regulator button, 2nd number is for vista at home
  BeginY = 225//240//245   // Y coord for Begin Button
  HeatY = 136//151//156    // Y coord for Heat Bar
  WoodY = 160//175//180    // Y coord for Wood Bar
  WaterY = 172//187//192   // Y coord for Water Bar
  DangerY = 184//199//204  // Y coord for Danger Bar
  StatusY = 196//211//216  // Y coord for Status Bar
  WoodBY = 230//245//250   // Y coord for Wood and Water buttons
  //End User variables
  
  Hrow = 0
  Hrow1 = 0
  AddX = 226
  Add2X = 15
  Add1Y = 65
  Add2Y = 17
  Add3Y = 250
  RegX = 47
  BeginX = 111
  NewX = 0
  New2X = 0
  New2Y = 0
  NewY = 0
  Heat = 0
  Wood = 0
  Water = 0
  Danger = 0
  Status = 0
  OxyY = 168
  StatusX = 167
  WoodBX = 35
  WaterBX = 85
  Num = 0
  Jump = 5
  JumpM = 0
  Jumped = 0
  Used = 0
  MDelay = 250
  SDelay = 200
  S1Delay = 100
  Count = 0
  CountM = 0
  MouseX = 0
  MouseY = 0
  CheckDelay = 0
  Setup = 0
  SetX = 10
  SetY = 40
  SetAddX = 227
  SetAddY = 250
  SetLoop = 0
  Mouse = 1
  OrigX = 0
  OrigY = 0
End

Form ccHearth, Settings
  ed1=Combobox:Hearths:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
  ed13=Editbox:Hearths Across:4
  ed2=CheckBox:Guilded?:True
  ed14=Checkbox:Need Setup?:True
  ed15=Checkbox:Stealth Mouse:False
  ed3=Editbox:Heat                  (75-188):165
  //ed10=Editbox:HeatMin            (75-188):116
  //ed11=Editbox:HeatMax           (75-188):184
  //ed4=Editbox:Low Oxy            (75-188):82
  //ed5=Editbox:High Oxy           (75-188):134
  ed6=Editbox:Wood                (75-188):107
  ed7=Editbox:Water                (75-188):76
  ed8=Editbox:RGBGreen:240
  ed9=Editbox:RGBBlue:220
  ed12=Editbox:Check Bars Interval  (miliseconds):4000
  ed16=Checkbox:Mouse Check:False
end

FormLoad ccHearth, ccHearth.frm

if ShowForm ccHearth
  SetConst Hearths = ccHearth[ed1]
  If ccHearth[ed2] = True
    SetConst Guild = 1
  Else
    SetConst Guild = 0
  End
  SetConst HeatX = ccHearth[ed3]
  //SetConst Oxy1X = ccHearth[ed4]
  //SetConst Oxy2X = ccHearth[ed5]
  SetConst WoodX = ccHearth[ed6]
  SetConst WaterX = ccHearth[ed7]
  SetConst RGBGreen = ccHearth[ed8]
  SetConst RGBBlue = ccHearth[ed9]
  //SetConst HeatMin = ccHearth[ed10]
  //SetConst HeatMax = ccHearth[ed11]
  SetConst CheckDelay = ccHearth[ed12]
  Set HRow = ccHearth[ed13]
  Compute SetLoop = $Hearths - 1
  Compute HRow1 = $Hrow + 1
  If ccHearth[ed15] = True
    Set Mouse = 0
  End
else
  Stop
end

FormSave ccHearth, ccHearth.frm

MousePos 100, 20  //Activates eGenesis window.. Don't run ACTool maximized.
Delay $MDelay
LeftClick
Delay 2000

If $Guild = 1
  Call Guild
End
if ccHearth[ed16] = True
  Call HearthTest
End
If ccHearth[ed14] = True
  Call Setup
End

Call SetReg
SetConst NewX = $BeginX
SetConst NewY = $BeginY
SetConst Count = 1
Loop $Hearths
  If $Count = $HRow1 //$Jump
    SetConst NewX = $BeginX
    Compute NewY = $BeginY + $Add3Y
  End
  MousePos $NewX, $NewY
  Delay $MDelay
  Rightclick
  Delay $MDelay
  Compute NewX = $NewX + $AddX
  Compute Count = $Count + 1
End
SetConst NewX = $BeginX  //Dont remember why this is here :)
Call Main

Procedure Setup
  Set NewX = $SetX
  Set NewY = $SetY
  Loop $SetLoop
    Mousepos $SetX, $SetY
    if {loopno} = $HRow
      Set NewX = $SetX
      Compute NewY = $SetY + $SetAddY
    else
      Compute NewX = $NewX + $SetAddX
    End
    Dragto $NewX, $NewY
  End
End

Procedure Main
  SetConst CountM = 1
  SetConst Status = 0
  Compute JumpM = $HRow1 - 1 //$Jump - 1
  Loop $Hearths
    If $CountM = $HRow1 //$Jump
      // may have to use New Newx and newy variables in Main
      SetConst NewX = $StatusX
      Compute NewY = $StatusY + $Add3Y
      SetConst New2X = $WaterBX
      Compute New2Y = $WoodBY + $Add3Y
    End
    
    While $Status = 0
      Call CheckBars
      If $Status = 1
        Call Snuff
        //code to advance to next hearth
        Compute Used = $Used + 1
        If $Used = $JumpM
          Compute HeatX = $HeatX - (($Used - 1) * $AddX)
          Compute HeatY = $HeatY + $Add3Y
          Compute WoodX = $WoodX - (($Used - 1) * $AddX)
          Compute WoodY = $WoodY + $Add3Y
          Compute WaterX = $WaterX - (($Used - 1) * $AddX)
          Compute WaterY = $WaterY + $Add3Y
          Compute DangerX = $DangerX - (($Used - 1) * $AddX)
          Compute DangerY = $DangerY + $Add3Y
          Compute StatusX = $StatusX - (($Used - 1) * $AddX)
          Compute StatusY = $StatusY + $Add3Y
          //Compute WaterBX = $WaterBX - (($Used -1) * $AddX)
          //Compute WoodBX = $WoodBX - (($Used - 1 ) * $AddX)
          //Compute WoodBY = $WoodBY + $Add3Y
          SetConst Jumped = 1
          Continue
        Else
          Compute HeatX = $HeatX + $AddX
          Compute WoodX = $WoodX + $AddX
          Compute WaterX = $WaterX + $AddX
          Compute DangerX = $DangerX + $AddX
          Compute StatusX = $StatusX + $AddX
          //Compute WaterBX = $WaterBX + $AddX
          //Compute WoodBX = $WoodBX + $AddX
        End
        Continue
      End
      If $Heat = 0 and $Danger = 0 and $Wood = 0
        Call Wood
      Else
        If $Heat = 1 or $Danger = 1
          If $Water = 0
            Call Water
          End
        End
      End
      
      Delay $CheckDelay
    End
    Compute CountM = $CountM + 1
    SetConst Status = 0
  End
End

Procedure CheckBars
  If $Mouse = 1
    MousePos $HeatX, $HeatY
    Delay $SDelay
  end
  LoadRGB $HeatX, $HeatY
  if {RGBBlue} > $RGBBlue
    SetConst Heat = 1
  Else
    SetConst Heat = 0
  End
  If $Mouse = 1
    MousePos $WoodX, $WoodY
    Delay $S1Delay
  end
  LoadRGB $WoodX, $WoodY
  if {RGBBlue} > $RGBBlue
    SetConst Wood = 1
  Else
    SetConst Wood = 0
  End
  If $Mouse = 1
    MousePos $WaterX, $WaterY
    Delay $S1Delay
  End
  LoadRGB $WaterX, $WaterY
  if {RGBBlue} > $RGBBlue
    SetConst Water = 1
  Else
    SetConst Water = 0
  End
  If $Mouse = 1
    MousePos $DangerX, $DangerY
    Delay $S1Delay
  End
  LoadRGB $DangerX, $DangerY
  if {RGBBlue} > $RGBBlue
    SetConst Danger = 1
  Else
    SetConst Danger = 0
  End
  If $Mouse = 1
    MousePos $StatusX, $StatusY
  End
  LoadRGB $StatusX, $StatusY
  if {RGBGreen} > $RGBGreen
    SetConst Status = 1
  Else
    SetConst Status = 0
  End
End

Procedure Water
  SetConst NewX = $WaterBX
  SetConst NewY = $WoodBY
  Loop $Hearths
    IF {loopno} = $HRow1 //$Jump
      SetConst NewX = $WaterBX
      Compute NewY = $WoodBY + $Add3Y
    End
    If {loopno} > $Used
      If $Mouse = 0
        Set OrigX = {mousex}
        Set OrigY = {mousey}
      End
      MousePos $NewX, $NewY
      Delay $SDelay
      Rightclick
      Delay $SDelay
      If $Mouse = 0
        Mousepos $OrigX, $OrigY
      End
    End
    Compute NewX = $NewX + $AddX
  End
  SetConst NewX = $WaterBX
End

Procedure Snuff
  SetConst New2X = $WaterBX
  SetConst New2Y = $WoodBY
  Compute Num = $Used + 1
  Loop $Hearths
    IF {loopno} = $Hrow1 //$Jump
      SetConst New2X = $WaterBX
      Compute New2Y = $WoodBY + $Add3Y
    End
    If {loopno} = $Num
      If $Mouse = 0
        Set OrigX = {mousex}
        Set OrigY = {mousey}
      End
      MousePos $New2X, $New2Y
      Loop 8
        Rightclick
      End
      If $Mouse = 0
        Mousepos $OrigX, $OrigY
      End
    End
    Compute New2X = $New2X + $AddX
  End
End

Procedure Wood
  SetConst NewX = $WoodBX
  SetConst NewY = $WoodBY
  Loop $Hearths
    IF {loopno} = $HRow1 //$Jump
      SetConst NewX = $WoodBX
      Compute NewY = $WoodBY + $Add3Y
    End
    If {loopno} > $Used
      If $Mouse = 0
        Set OrigX = {mousex}
        Set OrigY = {mousey}
      End
      MousePos $NewX, $NewY
      Delay $SDelay
      Rightclick
      Delay $SDelay
      If $Mouse = 0
        MousePos $OrigX, $OrigY
      End
    End
    Compute NewX = $NewX + $AddX
  End
  SetConst NewX = $WoodBX
End

Procedure SetReg
  SetConst NewX = $RegX
  SetConst Count = 1
  Loop $Hearths
    If $Count = $HRow1
      SetConst NewX = $RegX
      Compute RegY = $RegY + $Add3Y
    End
    MousePos $NewX, $RegY
    Delay $MDelay
// TamBlack: turn off the regulator setup
//   Rightclick
    Compute NewX = $NewX + $Add2X
    If $Count > $HRow
      Compute NewY = $RegY + $Add2Y
    else
      Compute NewY = $RegY + $Add1Y
    end
    MousePos $NewX, $NewY
    Delay $MDelay
// TamBlack: turn off the regulator setup
//    Rightclick
    Delay $MDelay
    Compute NewX = $NewX + $AddX
    Compute Count = $Count + 1
  End
  SetConst NewX = $RegX
  SetConst Count = 1
End

Procedure Guild
  Compute BeginX = $BeginX - 7
  Compute BeginY = $BeginY + 16
  Compute RegY = $RegY + 16
  Compute RegX = $RegX - 14
  Compute AddX = $AddX - 15
  Compute Add3Y = $Add3Y + 16
  Compute Add1Y = $Add1Y - 16
  Compute WoodBY = $WoodBY + 16
  Compute HeatX = $HeatX - 4
  Compute HeatY = $HeatY + 16
  Compute WoodX = $WoodX - 1
  Compute WoodY = $WoodY + 16
  Compute WaterY = $WaterY + 16
  Compute DangerX = $DangerX - 4
  Compute DangerY = $DangerY + 16
  Compute StatusX = $StatusX - 5
  Compute StatusY = $StatusY + 16
  Set SetAddX = 212
  Set SetAddY = 266
End

Procedure HearthTest
  Loop 1
    MousePos $HeatX, $HeatY
    Delay 2000
    
    MousePos $WoodX, $WoodY
    Delay 2000
    
    MousePos $WaterX, $WaterY
    Delay 2000
    
    MousePos $DangerX, $DangerY
    Delay 2000
    
    MousePos $StatusX, $StatusY
    Delay 2000
    
    MousePos $WoodBX, $WoodBY
    Delay 2000
    
    MousePos $WaterBX, $WoodBY
    Delay 2000

MousePos 104, 251
    MousePos $BeginX, $BeginY
    Delay 2000
  end
  Stop
End
//Written with ACTool 5.3.0 by Anka
Bell Asterisk

Plant flax and harvest seeds

//This Macro will plant several rows of flax in order to harvest seeds from them
//
//You will need to use double F8 view. Zoom all the way in, then 7 mousewheel clicks out
//(your avatar will be a little smaller than the size of the thumb in the Gather Grass icon
//For this to work you need to **minimize chat***
//Open the Plant menu and pin it to the top or bottom of the screen
//When the macro starts, you will need to quickly mouse-over the Plant Flax Seed instruction
//As the macro runs, your avatar should stay in the middle of the flax beds, but he will stray
//It is up to you to move him back to the middle (or close) when this happens
//It is my belief this is caused by server lag and therefore cannot be avoided
//I use screen resolution 1280x1024 on a wide-screen monitor

//MousePos 638,508 //My Head
delay 3000
Constructs
  MouseX=List // this is an array of mouse X coords 
  MouseY=List // this is an array of mouse Y coords 
END

Constants
  RowLen=7 //actually does n+1 -- Recommend 7 or fewer if Seedcycles is 3
  ColLen=2 //actually does n*2 -- Recommend 2 or fewer if Seedcycles is 3
  ActualCols=0	//program sets this
  ActualRows=0  //not used
  XHomeDist=0 //Not necessary because it plants even numbers of rows
  YHomeDist=0 //sets later
  SeedCycles=3 //harvest how many times (n+1) -- for best results use 3 or less
  InitialDelay=50000 //Time until the flax goes to seed and can be harvested
  NextDelay=0 //Program sets this - the time between subsequent harvest cycles
  LoopVal = 1 //do not modify
  
END

Compute ActualCols = $ColLen * 2
Compute YHomeDist = (($ActualCols-1) * 375)
Compute InitialDelay = $InitialDelay - (475 * ($RowLen + 1) * ($ColLen * 2)) + 475
Compute NextDelay = 60000 - ($ColLen * 2) * ($RowLen + 1) * 1950
Compute NextDelay = MAX ($NextDelay, 0)
//Acquire Location of Plant:Flax Seed
Listadd MouseX, {MouseX}
Listadd MouseY, {MouseY}

Call Plant $RowLen, $ColLen
Delay $InitialDelay

loop $SeedCycles
  Call HarvestAllSeeds $RowLen, $ColLen, 0 //This cycle harvests only
  Delay $NextDelay
end

//This cycle harvests then rips out the flax bed.
//If you like picking a lot of seeds up off the ground, remove the next line.
Call HarvestAllSeeds $RowLen, $ColLen, 1


Procedure Plant using Across, Down
//This procedure creates a grid of Flax of size (Across +1) x (Down * 2)
//It utilizes global variable MouseX and MouseY holding the location of the plant Flax pin
//It also uses global variable $YHomeDist and $InitialDelay to return to the starting point
	Compute LoopVal = 1
  loop $Down //this one controls how many columns (N+1)(B)
		mousepos {MouseX[1],MouseY[1] 
		LeftClick
		loop $RowLen //this one controls how many in a line (n) (A)
   		KeyDown {RIGHT} 375
   		Delay 100
    	mousepos {MouseX[1],MouseY[1] 
    	LeftClick
  	end

  	KeyDown {DOWN} 375
  	Delay 100
  	mousepos {MouseX[1],MouseY[1] 
  	LeftClick

  //this one controls how many in a line (n+1)
	  loop $Across //this one controls how many in a line (n+1) (A)
  		Keydown {LEFT} 375
  		Delay 100
   		mousepos {MouseX[1],MouseY[1] 
  		LeftClick	
 		end

		if $LoopVal < $Down
	  	KeyDown {DOWN} 375
	 	end
  	Delay 100
  	Compute LoopVal = $LoopVal + 1
	End 
	
	KeyDown {UP} $YHomeDist

END //Planting

Procedure HarvestAllSeeds using Across, Down, Yank
//This procedure harvesta seeds from a grid of Flax of size (Across +1) x (Down * 2)
//If Yank = 1 it will also rip out the plant
		Compute LoopVal = 1
		loop $Down //this one controls how many columns (N+1)(B)
		Call HarvestOneSeed
		if $Yank = 1
	  	Call Ripout
		end

  	loop $Across //this one controls how many in a line (n) (A)
   		KeyDown {RIGHT} 375
    	Delay 100
 			Call HarvestOneSeed
			if $Yank = 1
	  		Call Ripout
			end
		end

  	KeyDown {DOWN} 375
  	Delay 100
		Call HarvestOneSeed
		if $Yank = 1
	  	Call Ripout
		end

	
   //this one controls how many in a line (n+1)
  	loop $Across //this one controls how many in a line (n+1) (A)
  		Keydown {LEFT} 375
  		Delay 100
			Call HarvestOneSeed
			if $Yank = 1
	  		Call Ripout
			end
	 	end

		if $LoopVal < $Down
	  	KeyDown {DOWN} 375
	  end
	  Compute $LoopVal = $LoopVal + 1
  	Delay 100
	end
	KeyDown {UP} $YHomeDist
end


Procedure HarvestOneSeed 
//Clicks on flax bed your are standing in, and selects harvest
//I repeat the mousepos because I find it reduces server/client transmission miscues
//which would cause the pop up menu to stray from where it should be
  mousepos 654, 504 
	Delay 100
  mousepos 654, 504 
	LeftClick
	Delay 100
	mousepos 675, 494 //690, 499
	Delay 100
	mousepos 675, 494 //690, 499
	LeftClick
	Delay 1800
end



Procedure RipOut
//Clicks on flax bed your are standing in, and selects Utility->Rip Out
//Because picking up flax seeds off the ground is annoying.
//I repeat the mousepos because I find it reduces server/client transmission miscues
//which would cause the pop up menu to stray from where it should be  MousePos 654, 504
	Delay 100
  MousePos 654, 504
	Delay 100
  MousePos 654, 504
	LeftClick
	Delay 100
  MousePos 672, 527 //724, 527
  Delay 100
  MousePos 672, 527 //724, 527
	LeftClick
  Delay 100
	MousePos 694, 508 //746, 509
	Delay 100
	MousePos 694, 508 //746, 509
	LeftClick
	Delay 100
end

Plant, weed and harvest 20 beds


//This Macro will plant 20 beds of flax, weed/water and harvest them
//
//You will need to use double F8 view. Zoom all the way in, then 7 mousewheel clicks out
//(your avatar will be a little smaller than the size of the thumb in the Gather Grass icon
//For this to work you need to **minimize chat***
//Open the Plant menu and pin it to the top left corner
//I use screen resolution 1280x1024 on a wide-screen monitor

delay 1000

Constants
  PlantX=40
  PlantY=40

  SelfX=636 //Position of your feet
  SelfY=512 //Position of your feet

  BedLen=90 //Width of a flax bed

  RowLen=4 //actually does n+1 flax beds horizontally
  ColLen=2 //actually does n*2 flax beds vertically

  SeedCycles=3 //weed, water and harvest how many times

  InitialDelay=25750 //Time until the flax goes to first weed status
  NextDelay=7400 //Time between subsequent weed, water, harvest cycles

  DelayShort=60	//Delay between pointing and clicking
  DelayWalk=400 //Delay for walking to the next position
  DelayWeed=400 //Delay for weeding the next flax bed
  DelayTest=1000 //Not used, test setting

  i=0
	BedX=0
	BedY=0
  ActualCols=0
  ActualRows=0  //not used
  XHomeDist=0 //Not necessary because it plants even numbers of rows
  YHomeDist=0
  MenuX=0
  MenuY=0

  LoopVal = 1 //do not modify
END

Compute ActualCols = $ColLen * 2
Compute XHomeDist = $SelfX - $BedLen + 10
Compute YHomeDist = $SelfY - (($ActualCols-1) * $BedLen)

Call Plant $RowLen, $ColLen
Delay $InitialDelay

loop $SeedCycles
  Call HarvestAllSeeds $RowLen, $ColLen
  Delay $NextDelay
end

Procedure Plant using Across, Down
//This procedure creates a grid of Flax of size (Across +1) x (Down * 2)
//It utilizes global variable MouseX and MouseY holding the location of the plant Flax pin
//It also uses global variable $YHomeDist and $InitialDelay to return to the starting point
	Compute LoopVal = 1
  loop $Down //this one controls how many columns (N+1)(B)
		mousepos $PlantX, $PlantY 
		delay $DelayShort
		LeftClick
		loop $RowLen //this one controls how many in a line (n) (A)
//   		KeyDown {RIGHT} 375
			compute BedX = $SelfX + $BedLen
			mousepos $BedX, $SelfY
			delay $DelayShort
			LeftClick
   		Delay $DelayWalk
    	mousepos $PlantX, $PlantY 
			delay $DelayShort
    	LeftClick
  	end

//  	KeyDown {DOWN} 375
		compute BedY = $SelfY + $BedLen
		mousepos $SelfX, $BedY
		delay $DelayShort
		LeftClick
  	Delay $DelayWalk
  	mousepos $PlantX, $PlantY 
		delay $DelayShort
  	LeftClick

  //this one controls how many in a line (n+1)
	  loop $Across //this one controls how many in a line (n+1) (A)
//  		Keydown {LEFT} 375
			compute BedX = $SelfX - $BedLen
			mousepos $BedX, $SelfY
			delay $DelayShort
			LeftClick
  		Delay $DelayWalk
   		mousepos $PlantX, $PlantY 
			delay $DelayShort
  		LeftClick	
 		end

		if $LoopVal < $Down
//	  	KeyDown {DOWN} 375
			compute BedY = $SelfY + $BedLen
			mousepos $SelfX, $BedY
			delay $DelayShort
			LeftClick
			Delay $DelayWalk
	 	end
  	Compute LoopVal = $LoopVal + 1
	End 
	
//	KeyDown {UP} $YHomeDist
	mousepos $XHomeDist, $YHomeDist
	delay $DelayShort
	LeftClick
	Delay $DelayWalk
END //Planting

Procedure HarvestAllSeeds using Across, Down
//This procedure harvesta seeds from a grid of Flax of size (Across +1) x (Down * 2)
		Compute LoopVal = 1
		loop $Down //this one controls how many columns (N+1)(B)
		compute i = 1
		compute BedX = $SelfX + ($BedLen * $i)
		mousepos $BedX, $SelfY
//		Call HarvestOneSeed $BedX, $SelfY
		Delay $DelayShort
		LeftClick
		compute MenuX = $BedX + 20
		compute MenuY = $SelfY - 8
		mousepos $MenuX, $MenuY
		Delay $DelayShort
		LeftClick
		Delay $DelayWeed

  	loop $Across //this one controls how many in a line (n) (A)
//   		KeyDown {RIGHT} 375
			compute i = $i + 1
			compute BedX = $SelfX + ($BedLen * $i)
			mousepos $BedX, $SelfY
// 			Call HarvestOneSeed $BedX, $SelfY
			Delay $DelayShort
			LeftClick
			compute MenuX = $BedX + 20
			compute MenuY = $SelfY - 8
			mousepos $MenuX, $MenuY
			Delay $DelayShort
			LeftClick
			Delay $DelayWeed
		end

//  	KeyDown {DOWN} 375
		compute BedY = $SelfY + $BedLen
 		mousepos $SelfX, $BedY
		delay $DelayShort
		LeftClick
		Delay $DelayWalk

		compute i = $RowLen + 1
		compute BedX = $SelfX + ($BedLen * $i)
		mousepos $BedX, $SelfY	
//		Call HarvestOneSeed $BedX, $SelfY
		Delay $DelayShort
		LeftClick
		compute MenuX = $BedX + 20
		compute MenuY = $SelfY - 8
		mousepos $MenuX, $MenuY
		Delay $DelayShort
		LeftClick
		Delay $DelayWeed
	
   //this one controls how many in a line (n+1)
  	loop $Across //this one controls how many in a line (n+1) (A)
//  		Keydown {LEFT} 375
			compute i = $i - 1
			compute BedX = $SelfX + ($BedLen * $i)
			mousepos $BedX, $SelfY
//			Call HarvestOneSeed $BedX, $SelfY
			Delay $DelayShort
			LeftClick
			compute MenuX = $BedX + 20
			compute MenuY = $SelfY - 8
			mousepos $MenuX, $MenuY
			Delay $DelayShort
			LeftClick
			Delay $DelayWeed
	 	end

		if $LoopVal < $Down
//	  	KeyDown {DOWN} 375
			compute BedY = $SelfY + $BedLen
			mousepos $SelfX, $BedY
			delay $DelayShort
			LeftClick
			Delay $DelayWalk
	  end
	  Compute $LoopVal = $LoopVal + 1
	end
	
//	KeyDown {UP} $YHomeDist
	mousepos $SelfX, $YHomeDist
	delay $DelayShort
	LeftClick
	Delay $DelayWalk
end

Wood pane TO BE TESTED

// Pin Windows in 2 rows of 3,
// in top left corner of window
// works best at 1024 x 768 res
// Set line 16, for Number of loops
// usually total wood / 6
Procedure Delay300
  LeftClick
  delay 300
End

Procedure Delay600
  LeftClick
  delay 600
End

Loop 25
MousePos 120, 80
CALL Delay300
MousePos 120, 80
CALL Delay600

MousePos 400, 80
call Delay300
MousePos 400, 80
call Delay600

MousePos 690, 80
call Delay300
MousePos 690, 80
call Delay600

MousePos 120, 190
call Delay300
MousePos 120, 190
call Delay600

MousePos 400, 190
call Delay300
MousePos 400, 190
call Delay600

MousePos 690, 190
call Delay300
MousePos 690, 190
call Delay600

End

Coconut cracker TO BE TESTED

// Pin Crack Coconut Window to bottom left of screen, works best at 1024x768
// Set line 14 for number of loops desired :P
Delay 2500
MousePos 144, 701
LeftClick
MousePos 144, 701
LeftClick
MousePos 144, 701
LeftClick
MousePos 144, 701
LeftClick
MousePos 144, 701
LeftClick
Loop 100
MousePos 144, 701
LeftClick
Delay 10000
End

Iron mining

// IRON Macro - Written by: Coyan/Mosaic Guild
// This is what I suggest for setting up for this macro
// First align your view so you can see all 7 crystals clearly
// second use Alt-L to lock your camera angle
// Third before starting this, I suggest you have your mouse sitting over
//  the first crystal.
// You will have 3 seconds between the recording of each crystal's location
// place your mouse over a spot of average gem color for each crystal in turn
// Once it has identified the 7 crystals, it will run the mine
//
// Thank you Xyrrus for talking to me about using Hue
Constructs
	MouseX=List // this is an array of mouse X coords for gem sample points
	MouseY=List // this is an array of mouse X coords for gem sample points
	CrysHue=List
	OEOffset=List
END
// This macro doesn't work 100%, I have gotten between 80% and 90% return
// When it mis-id's a crystal it will fail as many times in a row as your OELevel is set
Constants
	OELevel = 4  // change this to your Ore Extraction level
	totalpulls = 5 // How many times do you want it to pull the mine
	colordiff = 10 // this is used to find a base for comparison, shouldn't need adjusting
	CDiff = 0
	CurrHigh = 0
	Compare = 0
	Currcrys = 0
	DIFFFOUND = 0
	Minval = 0
	Maxval = 0
	Tmpval = 0
	loopcnt = 1 
	Mousecnt = 1
	MouseXN = 0
	MouseYN = 0
	ColorHS = 0
	OElistcnt = 0
	OELvlset = 1
	CurrCrysHue = 0
End

// First part that requires a detailed explanation
// this loop will pause for 3 seconds then grab the current mouse location
// its purpose is to identify the 7 sampling locations for the crystals
// when it grabs the sampling spot, it will then echo a . to the chat window
// make sure you are in your main chat tab.
Loop 7
	Delay 3000
	Listadd MouseX, {MouseX}
	Listadd MouseY, {MouseY}
	SayPaste .
END

ListClear OEOffset

loop $totalpulls
	Compute loopcnt = 1
	ListClear CrysHue
	loop 7
		mousepos MouseX[$loopcnt], MouseY[$loopcnt]
		LoadRGB MouseX[$loopcnt], MouseY[$loopcnt]

		Call CALCHUECOLOR
		//SayPaste {RGBRed} {RGBGreen} {RGBBlue} CrysHue[$loopcnt] $Tmpval for testing
		Compute loopcnt = $loopcnt + 1
		Delay 100
	END
	//Delay 100000 for testing
	CALL FindtheOdd
	
	CALL OreExtractionstore
		
	ListCount OEOffset, $OElistcnt
	IF $OELevel >= $OElistcnt
		Compute OELvlset = OEOffset[1] // work the current crystal until we are at our OE Level
	ELSE
		Compute OELvlset = OEOffset[$OELevel]
	END
	//Saypaste $OELevel $OElistcnt $OELvlset
	
	mousepos MouseX[$OELvlset], MouseY[$OELvlset]
	Delay 200 //200
	leftclick
	Compute MouseXN = MouseX[$OELvlset] + 25 // adjust this if you need to for the menu click
	Compute MouseYN = MouseY[$OELvlset] + 20 // If your mouse keeps clicking on TAKE, then adjust this to -10. Adjust this if you need to for the menu click
	Mousepos $MouseXN, $MouseYN
	Delay 200
	Leftclick
	
	Delay 4300 // Delay to manage the str/perc timer on mining, adjust as needed
	
end

Procedure CALCHUECOLOR // This procedure calculates the Hue of the crystal
	Compute Minval = 0
	Compute Maxval = 255
	IF {RGBRed} > {RGBGreen}
		Compute Minval = {RGBGreen}
		Compute Maxval = {RGBRed}
	Else
		Compute Maxval = {RGBGreen}
		Compute Minval = {RGBRed}
	END
	IF {RGBBlue} < $Minval
		Compute Minval = {RGBBlue}
	ELSE
		IF {RGBBlue} > $Maxval
			Compute Maxval = {RGBBlue}
		END
	END

	Compute Tmpval = $Maxval - $Minval

	IF {RGBRed} = $Maxval
		Compute CurrCrysHue = {RGBGreen} - {RGBBlue}
		Compute CurrCrysHue = $CurrCrysHue/$Tmpval
	ELSE
		IF $Maxval = {RGBGreen}
			Compute CurrCrysHue = {RGBBlue} - {RGBRed}
			Compute CurrCrysHue = $CurrCrysHue/$Tmpval
			Compute CurrCrysHue = 2.0 + $CurrCrysHue
		ELSE
			IF $Maxval = {RGBBlue}
				Compute CurrCrysHue = {RGBRed} - {RGBGreen}
				Compute CurrCrysHue = $CurrCrysHue/$Tmpval
				Compute CurrCrysHue = 4.0 + $CurrCrysHue
			END
		END
	END
	Compute CurrCrysHue = $CurrCrysHue * 100
	Listadd CrysHue, $CurrCrysHue
END

Procedure FindtheOdd
	Call Findcompare
	Compute CDiff = 0
	Compute CurrHigh = 0
	
	Compute Currcrys = 1
	loop 7 
		IF $Currcrys <> $Compare
			Compute ColorHS = CrysHue[$Currcrys] - CrysHue[$Compare]
			IF $ColorHS < 0
				Compute ColorHS = 0 - $ColorHS
			END
			
			IF $ColorHS > $CDiff
				Compute CDiff = $ColorHS
				Compute CurrHigh = $Currcrys
			END
		END
		
		Compute Currcrys = $Currcrys + 1
	END
	
	Compute Mousecnt = $CurrHigh
END

Procedure OreExtractionstore
	ListCount OEOffset, $OElistcnt
	IF $OElistcnt = 0
		Listadd OEOffset, $Mousecnt
	ELSE
		IF $OElistcnt = 1
			Listadd OEOffset, OEOffset[1]
		END
		IF $OElistcnt = 2
			Listadd OEOffset, OEOffset[2]
			Compute OEOffset[2] = OEOffset[1]
		END
		IF $OElistcnt = 3
			Listadd OEOffset, OEOffset[3]
			Compute OEOffset[3] = OEOffset[2]
			Compute OEOffset[2] = OEOffset[1]
		END
		IF $OElistcnt = 4
			Listadd OEOffset, OEOffset[4]
			Compute OEOffset[4] = OEOffset[3]
			Compute OEOffset[3] = OEOffset[2]
			Compute OEOffset[2] = OEOffset[1]
		END
		IF $OElistcnt = 5
			Listadd OEOffset, OEOffset[5]
			Compute OEOffset[5] = OEOffset[4]
			Compute OEOffset[4] = OEOffset[3]
			Compute OEOffset[3] = OEOffset[2]
			Compute OEOffset[2] = OEOffset[1]
		END
		IF $OElistcnt = 6
			Listadd OEOffset, OEOffset[6]
			Compute OEOffset[6] = OEOffset[5]
			Compute OEOffset[5] = OEOffset[4]
			Compute OEOffset[4] = OEOffset[3]
			Compute OEOffset[3] = OEOffset[2]
			Compute OEOffset[2] = OEOffset[1]
		END
		IF $OElistcnt = 7
			Compute OEOffset[7] = OEOffset[6]
			Compute OEOffset[6] = OEOffset[5]
			Compute OEOffset[5] = OEOffset[4]
			Compute OEOffset[4] = OEOffset[3]
			Compute OEOffset[3] = OEOffset[2]
			Compute OEOffset[2] = OEOffset[1]
		END

		Compute OEOffset[1] = $Mousecnt
	END

END

Procedure FindCompare // For Iron we need to find the common crystals in the first 3
	
	Compute ColorHS = CrysHue[1] - CrysHue[2]
	IF $ColorHS < 0
		Compute ColorHS = 0 - $ColorHS
	END
	
	IF $ColorHS < $colordiff
		Compute Compare = 1
	ELSE
		Compute ColorHS = CrysHue[1] - CrysHue[3]
		IF $ColorHS < 0
			Compute ColorHS = 0 - $ColorHS
		END
			
		IF $ColorHS < $colordiff
			Compute Compare = 1
		ELSE
			Compute Compare = 2
		END
	END

END