#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. SendMode Input ; Recommended for new scripts due to its superior speed and reliability. SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. IniName := "Data.ini" #Include Maths.ahk Delimiter := "|" ReReadZybez: IniRead, ActionsHourList, % IniName, Zybez, ActionsHourList, %A_Space% IniRead, ActionsXPList, % IniName, Zybez, ActionsXPList, %A_Space% IniRead, VariableList, % IniName, Zybez, VariableList, %A_Space% IniRead, FormulaList, % IniName, Zybez, FormulaList, %A_Space% IniRead, PercentList, % IniName, Zybez, PercentList, %A_Space% IniRead, TitleList, % IniName, Zybez, TitleList, %A_Space% Loop, Parse, TitleList, % Delimiter { If (A_LoopField = "") AND (ReturnItemAtPosition(FormulaList, Delimiter, A_Index) = "") AND (ReturnItemAtPosition(ActionsXPList, Delimiter, A_Index) = "") AND (ReturnItemAtPosition(ActionsHourList, Delimiter, A_Index) = "") TitleList := ReturnListWithoutPosition(TitleList, Delimiter, A_Index), FormulaList := ReturnListWithoutPosition(FormulaList, Delimiter, A_Index), ActionsXPList := ReturnListWithoutPosition(ActionsXPList, Delimiter, A_Index), ActionsHourList := ReturnListWithoutPosition(ActionsHourList, Delimiter, A_Index) } FormulaCount := ListOperations(CountVarBy(TitleList, Delimiter) Delimiter CountVarBy(FormulaList, Delimiter) Delimiter CountVarBy(ActionsXPList, Delimiter) Delimiter CountVarBy(ActionsHourList, Delimiter), Delimiter, "Max") GoSub, IterateZybezVariables MainZybezGUI: Gui, ZybezGUI:Submit Gui, ZybezGUI:Destroy Gui, ZybezGUI:Add, Text, X41 Y10 vOriginalTitle, Title Gui, ZybezGUI:Add, Text, X206 Y10, Formula Gui, ZybezGUI:Add, Text, X505 Y10, # per Hour Gui, ZybezGUI:Add, Text, X735 Y10, XP/Action Loop, % FormulaCount { Gui, ZybezGUI:Add, Edit, % "gUpdateZybezLine W100 H20 X10 Y" A_Index * 28 " vTitle" A_Index, % ReturnItemAtPosition(TitleList, Delimiter, A_Index) Gui, ZybezGUI:Add, Edit, % "gUpdateZybezLineLong W200 H20 X125 Y" A_Index * 28 " vFormula" A_Index, % ReturnItemAtPosition(FormulaList, Delimiter, A_Index) Gui, ZybezGUI:Add, Text, % "W150 H40 X340 Y" A_Index * 28 + 3 " vProfitRange" A_Index, % "Profit: " SM_Round(SM_Solve(FormulaRange(ReturnItemAtPosition(FormulaList, Delimiter, A_Index), VariableList, Delimiter, "Max"), True), 1) " to " SM_Round(SM_Solve(FormulaRange(ReturnItemAtPosition(FormulaList, Delimiter, A_Index), VariableList, Delimiter, "Min"), True), 1) Gui, ZybezGUI:Add, Edit, % "gUpdateZybezLine Number W50 H20 X505 Y" A_Index * 28 " vActionsHour" A_Index, % ReturnItemAtPosition(ActionsHourList, Delimiter, A_Index) Gui, ZybezGUI:Add, Text, % "W150 H40 X570 Y" A_Index * 28 + 3 " vHourlyProfit" A_Index, % "Hourly Profit: " SM_Round(SM_Multiply(SM_Solve(FormulaRange(ReturnItemAtPosition(FormulaList, Delimiter, A_Index), VariableList, Delimiter, "Max"), True), ReturnItemAtPosition(ActionsHourList, Delimiter, A_Index)), 1) " to " SM_Round(SM_Multiply(SM_Solve(FormulaRange(ReturnItemAtPosition(FormulaList, Delimiter, A_Index), VariableList, Delimiter, "Min"), True), ReturnItemAtPosition(ActionsHourList, Delimiter, A_Index)), 1) Gui, ZybezGUI:Add, Edit, % "gUpdateZybezLine Number W50 H20 X735 Y" A_Index * 28 " vActionsXP" A_Index, % ReturnItemAtPosition(ActionsXPList, Delimiter, A_Index) Gui, ZybezGUI:Add, Text, % "W100 H40 X800 Y" A_Index * 28 + 3 " vGPPerXP" A_Index, % SM_Round(SM_Divide(SM_Solve(FormulaRange(ReturnItemAtPosition(FormulaList, Delimiter, A_Index), VariableList, Delimiter, "Max"), True), ReturnItemAtPosition(ActionsXPList, Delimiter, A_Index), 6), 4) " to " SM_Round(SM_Divide(SM_Solve(FormulaRange(ReturnItemAtPosition(FormulaList, Delimiter, A_Index), VariableList, Delimiter, "Min"), True), ReturnItemAtPosition(ActionsXPList, Delimiter, A_Index), 6), 4) " GP/XP" Gui, ZybezGUI:Add, Text, % "W100 H40 X915 Y" A_Index * 28 + 3 " vXPPerHour" A_Index, % ReturnItemAtPosition(ActionsXPList, Delimiter, A_Index) * ReturnItemAtPosition(ActionsHourList, Delimiter, A_Index) " XP/H" } Gui, ZybezGUI:Add, Button, % "gRefreshMainZybezGUI Default X10 Y" FormulaCount * 28 + 28, Refresh Gui, ZybezGUI:Add, Button, % "gDefineVariableZybez X65 Y" FormulaCount * 28 + 28, Define Variable Gui, ZybezGUI:Add, Button, % "gListZybezVariables X155 Y" FormulaCount * 28 + 28, List Variables Gui, ZybezGUI:Add, Text, % "X238 Y" FormulaCount * 28 + 32, Display: Gui, ZybezGUI:Add, DropDownList, % "gMainZybezGUI W38 vFormulaCount Choose" FormulaCount " X280 Y" FormulaCount * 28 + 29, 1|2|3|4|5|6|7|8|9|10|11|12|13|14|15 Gui, ZybezGUI:Show, Center, Zybez Profit Calculator Return ListZybezVariables: Gui, ZybezVariables:Add, ListView, H200 W380 +VScroll, Variable|Item Name|Max|Min|`% Exclusion Gui, ZybezVariables:Default Loop, Parse, VariableList, % Delimiter LV_Add("", A_LoopField, FindNameFromURL(%A_LoopField%), %A_LoopField%Max, %A_LoopField%Min, ReturnItemAtPosition(PercentList, Delimiter, A_Index)) LV_ModifyCol() LV_ModifyCol(3, "Integer") LV_ModifyCol(4, "Integer") LV_ModifyCol(5, "Integer") LV_ModifyCol(5, "AutoHdr", "% Exclusion") Gui, ZybezVariables:Show, Center, Zybez Variable List Gui, ZybezVariables:+AlwaysOnTop Gui, ZybezGUI:Default ListOpen := 1 Return ZybezVarGUIGuiSize: ZybezVarGUIGuiClose: ZybezVarGUIGuiEscape: If (A_ThisLabel <> "ZybezVarGUIGuiSize") OR (ErrorLevel <> 0) { NewVariableName := NewVariableValue := NewVariablePercent := Gui, ZybezVarGUI:Destroy } Return ZybezVariablesGuiSize: ZybezVariablesGuiClose: ZybezVariablesGuiEscape: If (A_ThisLabel <> "ZybezVariablesGuiSize") OR (ErrorLevel <> 0) { Gui, ZybezVariables:Destroy ListOpen := 0 } Return ZybezGUIGuiClose: ZybezGUIGuiEscape: ExitApp UpdateZybezLineLong: SetTimer, ActualZybezLineUpdate, 5000 Return UpdateZybezLine: SetTimer, ActualZybezLineUpdate, 500 Return ActualZybezLineUpdate: SetTimer, ActualZybezLineUpdate, Off Gui, ZybezGUI:Submit, NoHide GoSub, ReWriteZybez Loop, % FormulaCount { GuiControl, ZybezGUI:, ProfitRange%A_Index%, % "Profit: " SM_Round(SM_Solve(FormulaRange(Formula%A_Index%, VariableList, Delimiter, "Max"), True), 1) " to " SM_Round(SM_Solve(FormulaRange(Formula%A_Index%, VariableList, Delimiter, "Min"), True), 1) GuiControl, ZybezGUI:, HourlyProfit%A_Index%, % "Hourly Profit: " SM_Round(SM_Multiply(SM_Solve(FormulaRange(ReturnItemAtPosition(FormulaList, Delimiter, A_Index), VariableList, Delimiter, "Max"), True), ReturnItemAtPosition(ActionsHourList, Delimiter, A_Index)), 1) " to " SM_Round(SM_Multiply(SM_Solve(FormulaRange(ReturnItemAtPosition(FormulaList, Delimiter, A_Index), VariableList, Delimiter, "Min"), True), ReturnItemAtPosition(ActionsHourList, Delimiter, A_Index)), 1) GuiControl, ZybezGUI:, GPPerXP%A_Index%, % SM_Round(SM_Divide(SM_Solve(FormulaRange(ReturnItemAtPosition(FormulaList, Delimiter, A_Index), VariableList, Delimiter, "Max"), True), ReturnItemAtPosition(ActionsXPList, Delimiter, A_Index), 6), 4) " to " SM_Round(SM_Divide(SM_Solve(FormulaRange(ReturnItemAtPosition(FormulaList, Delimiter, A_Index), VariableList, Delimiter, "Min"), True), ReturnItemAtPosition(ActionsXPList, Delimiter, A_Index), 6), 4) " GP/XP" GuiControl, ZybezGUI:, XPPerHour%A_Index%, % ReturnItemAtPosition(ActionsXPList, Delimiter, A_Index) * ReturnItemAtPosition(ActionsHourList, Delimiter, A_Index) " XP/H" } Return RefreshMainZybezGUI: Gui, ZybezGUI:Submit, NoHide GoSub, ReWriteZybez If (ListOpen = 1) GoSub, ListZybezVariables GoTo, ReReadZybez IterateZybezVariables: Loop, Parse, PercentList, % Delimiter Percent%A_Index% := A_LoopField Loop, Parse, VariableList, % Delimiter { IniRead, %A_LoopField%, % IniName, Zybez, %A_LoopField%, %A_Space% TempZybezList := ListOperations(ExcludeOutliers(Zybez(%A_LoopField%, "Buy", Delimiter), Delimiter, Percent%A_Index%), Delimiter, "Max") Delimiter ListOperations(ExcludeOutliers(Zybez(%A_LoopField%, "Sell", Delimiter), Delimiter, Percent%A_Index%), Delimiter, "Min") %A_LoopField%Max := ListOperations(TempZybezList, Delimiter, "Max") %A_LoopField%Min := ListOperations(TempZybezList, Delimiter, "Min") } TempZybezList := Return DefineVariableZybez: Gui, ZybezVarGUI:Destroy Gui, ZybezVarGUI:Add, Text, R1 X10 Y13, Variable Name: Gui, ZybezVarGUI:Add, Edit, gUpdateDefineZybezVariable X85 Y10 W50 vNewVariableName, % NewVariableName Gui, ZybezVarGUI:Add, Text, X150 Y13, URL: Gui, ZybezVarGUI:Add, Edit, X180 Y10 W100 vNewVariableValue, % NewVariableValue Gui, ZybezVarGUI:Add, Text, X295 Y13, Percent Exclusion: Gui, ZybezVarGUI:Add, Edit, X390 Y10 W30 vNewVariablePercent Number Limit3, % ((NewVariablePercent <> "") ? NewVariablePercent : 10) Gui, ZybezVarGUI:Add, Button, Default X8 Y36 gSubmitNewVariableZybez, Submit Gui, ZybezVarGUI:Show, Center, Define Zybez Variable Gui, ZybezVarGUI:+AlwaysOnTop Return UpdateDefineZybezVariable: Gui, ZybezVarGUI:Submit, NoHide If (NewVariableName = "") Return StringReplace, NewVariableName, NewVariableName, % A_Space,, All GuiControl, ZybezVarGUI:, NewVariableValue, % %NewVariableName% NewVariablePercent2 := ReturnItemAtPosition(PercentList, Delimiter, ReturnPositionOfItem(VariableList, Delimiter, NewVariableName)) GuiControl, ZybezVarGUI:, NewVariablePercent, % ((NewVariablePercent2 <> "") ? NewVariablePercent2 : ((NewVariablePercent <> "") ? NewVariablePercent : 10)) NewVariablePercent2 := Return SubmitNewVariableZybez: Gui, ZybezVarGUI:Submit Gui, ZybezVarGUI:Destroy If (InStr(NewVariableName, A_Space) <> 0) { Msgbox Spaces are not allowed in Variable names. Try again. GoTo, DefineVariableZybez } Else If (NewVariableName <> "") AND (NewVariableValue = "") { IniDelete, % IniName, Zybez, % NewVariableName Loop, Parse, VariableList, % Delimiter TempVariableList .= ((A_LoopField <> NewVariableName) ? A_LoopField Delimiter : "") Loop, Parse, PercentList, % Delimiter TempPercentList .= ((A_Index <> ReturnPositionOfItem(VariableList, Delimiter, NewVariableName)) ? A_LoopField Delimiter : "") VariableList := RTrim(TempVariableList, Delimiter) PercentList := RTrim(TempPercentList, Delimiter) IniWrite, % VariableList, % IniName, Zybez, VariableList IniWrite, % PercentList, % IniName, Zybez, PercentList } Else If (NewVariableName <> "") AND (NewVariableValue <> "") { If (ReturnPositionOfItem(VariableList, Delimiter, NewVariableName) = 0) { IniWrite, % ((VariableList <> "") ? VariableList Delimiter NewVariableName : NewVariableName), % IniName, Zybez, VariableList IniWrite, % ((PercentList <> "") ? PercentList Delimiter NewVariablePercent : NewVariablePercent), % IniName, Zybez, PercentList } Else If (ReturnPositionOfItem(VariableList, Delimiter, NewVariableName) <> 0) { Loop, Parse, PercentList, % Delimiter TempPercentList .= ((ReturnPositionOfItem(VariableList, Delimiter, NewVariableName) <> A_Index) ? A_LoopField : NewVariablePercent) Delimiter IniWrite, % RTrim(TempPercentList, Delimiter), % IniName, Zybez, PercentList } IniWrite, % NewVariableValue, % IniName, Zybez, % NewVariableName } TempPercentList := TempVariableList := NewVariablePercent := NewVariableValue := NewVariableName := GoTo, ReReadZybez ReWriteZybez: Loop, % ListOperations(CountVarBy(TitleList, Delimiter) Delimiter FormulaCount, Delimiter, "Max") TempTitleList .= ((A_Index <= FormulaCount) ? Title%A_Index% : ReturnItemAtPosition(TitleList, Delimiter, A_Index)) Delimiter Loop, % ListOperations(CountVarBy(FormulaList, Delimiter) Delimiter FormulaCount, Delimiter, "Max") TempFormulaList .= ((A_Index <= FormulaCount) ? Formula%A_Index% : ReturnItemAtPosition(FormulaList, Delimiter, A_Index)) Delimiter Loop, % ListOperations(CountVarBy(ActionsXPList, Delimiter) Delimiter FormulaCount, Delimiter, "Max") TempActionsXPList .= ((A_Index <= FormulaCount) ? ActionsXP%A_Index% : ReturnItemAtPosition(ActionsXPList, Delimiter, A_Index)) Delimiter Loop, % ListOperations(CountVarBy(ActionsHourList, Delimiter) Delimiter FormulaCount, Delimiter, "Max") TempActionsHourList .= ((A_Index <= FormulaCount) ? ActionsHour%A_Index% : ReturnItemAtPosition(ActionsHourList, Delimiter, A_Index)) Delimiter TitleList := RTrim(TempTitleList, Delimiter) FormulaList := RTrim(TempFormulaList, Delimiter) ActionsXPList := RTrim(TempActionsXPList, Delimiter) ActionsHourList := RTrim(TempActionsHourList, Delimiter) IniWrite, % ActionsHourList, % IniName, Zybez, ActionsHourList IniWrite, % ActionsXPList, % IniName, Zybez, ActionsXPList IniWrite, % FormulaList, % IniName, Zybez, FormulaList IniWrite, % TitleList, % IniName, Zybez, TitleList TempActionsHourList := TempActionsXPList := TempFormulaList := TempTitleList := Return FormulaRange(Formula, VariableList, Delimiter, Type) { StringReplace, Formula, Formula, % A_Space,, All Loop, Parse, VariableList, % Delimiter { StringReplace, Formula, Formula, % A_LoopField, % "%" A_LoopField Type "%", All If ((InStr(Formula, "-%" A_LoopField Type "%") > 0)) OR ((InStr(Formula, "-(%" A_LoopField Type "%") > 0)) StringReplace, Formula, Formula, % "%" A_LoopField Type "%", % "%" A_LoopField ((Type = "Min") ? "Max" : "Min") "%", All } Return Formula } CountVarBy(Var,Char) { Count = 0 If (Var = "") Return 1 Loop, Parse, Var,%Char% Count++ Return %Count% } ReturnListWithoutPosition(List, Delimiter, Position) { Loop, Parse, List, % Delimiter TempList .= ((A_Index <> Position)? A_LoopField Delimiter : "") Return RTrim(TempList, Delimiter) } FindNameFromURL(URL) { TempURL := SubStr(URL, InStr(URL, "/",,, 4)) Loop, Parse, TempURL,- ReturnVar .= ((A_Index > 1) ? A_LoopField A_Space : "") StringUpper, ReturnVar, ReturnVar, T Return %ReturnVar% } ReturnPositionOfItem(List, Delimiter, Item) { Loop, Parse, List, % Delimiter If (A_LoopField = Item) Return A_Index Return 0 } ReturnItemAtPosition(List, Delimiter, Position) { Loop, Parse, List, % Delimiter If (A_Index = Position) Return A_LoopField } ; Min, Max, or Average, Median ListOperations(List, Delimiter, Type) { Loop, Parse, List, % Delimiter { AverageValue += A_LoopField MaxIndex := A_Index MinValue := ((A_LoopField < MinValue OR MinValue = "") ? A_LoopField : MinValue) MaxValue := ((A_LoopField > MaxValue) ? A_LoopField : MaxValue) _%A_LoopField%++ } Loop, Parse, List, % Delimiter MedianValue := ((_%A_LoopField% > _%Median%) ? A_LoopField : MedianValue) Return ((Type = "Min" OR Type = "Max") ? ((Type = "Min") ? MinValue : MaxValue) : ((Type = "Average") ? AverageValue / MaxIndex : MedianValue)) } ExcludeOutliers(List, Delimiter, Percent := 25) { Loop { Average := 0 Loop, Parse, List, % Delimiter Average += A_LoopField, MaxIndex := A_Index UpperBound := Round((Average / MaxIndex) + (Average / MaxIndex) * (Percent / 100)), LowerBound := Round((Average / MaxIndex) - (Average / MaxIndex) * (Percent / 100)), Upper := 0, Lower := 0 Loop, Parse, List, % Delimiter { If (A_LoopField > UpperBound) Upper++ Else If (A_LoopField < LowerBound) Lower++ } If (Upper = 0) AND (Lower = 0) Return List TempList := Loop, Parse, List, % Delimiter TempList .= ((A_LoopField <= UpperBound AND A_LoopField >= LowerBound OR A_LoopField > UpperBound AND Upper > Lower AND Lower > 0 OR A_LoopField < LowerBound AND Upper < Lower AND Upper > 0) ? A_LoopField Delimiter : Continue) List := RTrim(TempList, Delimiter) } } Zybez(URL, OfferType, Delimiter) { document := ComObjCreate("HTMLFile") html := URLDownloadToVar(URL) start := InStr(html, "