Initial revision degrime script
This commit is contained in:
commit
3c214ca006
1 changed files with 668 additions and 0 deletions
668
degrime.simba
Normal file
668
degrime.simba
Normal file
|
|
@ -0,0 +1,668 @@
|
||||||
|
{$DEFINE SCRIPT_ID := 'degrime-002'}
|
||||||
|
{$DEFINE SCRIPT_REVISION := '1'}
|
||||||
|
{$IFDEF WINDOWS}{$DEFINE SCRIPT_GUI}{$ENDIF}
|
||||||
|
{$I SRL-T/osr.simba}
|
||||||
|
{$I WaspLib/osr.simba}
|
||||||
|
|
||||||
|
{-------------------------------------------------------------------------
|
||||||
|
Constants for timing and wait values used throughout the script.
|
||||||
|
-------------------------------------------------------------------------}
|
||||||
|
const
|
||||||
|
// General wait constants
|
||||||
|
cInterfaceCloseDelay = 300; // Delay after closing interfaces
|
||||||
|
cWaitUntilDelay = 65; // Poll delay for WaitUntil calls
|
||||||
|
cRandomAdjustment = 1000; // Maximum random adjustment
|
||||||
|
|
||||||
|
// Magic interface retry and castable wait times
|
||||||
|
cMagicInterfaceRetryDelay = 500; // Delay to retry opening magic interface
|
||||||
|
cCastableWaitMin = 400; // Minimum wait time for checking castability
|
||||||
|
cCastableWaitExpected = 500; // Expected wait time for checking castability
|
||||||
|
cCastableWaitMax = 600; // Maximum wait time for checking castability
|
||||||
|
cSkewParam = 3; // Skew parameter for all srl.SkewedRand calls
|
||||||
|
|
||||||
|
// Wait times in the cast animation (WaitCast procedure)
|
||||||
|
cUnfocusedWaitMin = 5000; // Minimum wait time when unfocused
|
||||||
|
cUnfocusedWaitExpected = 7000; // Expected wait time when unfocused
|
||||||
|
cUnfocusedWaitMax = 15000; // Maximum wait time when unfocused
|
||||||
|
cFocusedWaitMin = 2400; // Minimum wait time when focused
|
||||||
|
cFocusedWaitExpected = 2600; // Expected wait time when focused
|
||||||
|
cFocusedWaitMax = 2700; // Maximum wait time when focused
|
||||||
|
|
||||||
|
// Wait times for bank deposit and withdrawal actions
|
||||||
|
cDepositWaitMin = 450; // Minimum wait time for deposit
|
||||||
|
cDepositWaitExpected = 550; // Expected wait time for deposit
|
||||||
|
cDepositWaitMax = 650; // Maximum wait time for deposit
|
||||||
|
cWithdrawWaitMin = 300; // Minimum wait time for withdrawal
|
||||||
|
cWithdrawWaitExpected = 400; // Expected wait time for withdrawal
|
||||||
|
cWithdrawWaitMax = 550; // Maximum wait time for withdrawal
|
||||||
|
cBankOpenWaitMin = 300; // Minimum wait time for bank open
|
||||||
|
cBankOpenWaitExpected = 400; // Expected wait time for bank open
|
||||||
|
cBankOpenWaitMax = 550; // Maximum wait time for bank open
|
||||||
|
cPostBankCloseDelay = 500; // Delay after closing bank
|
||||||
|
|
||||||
|
// Delay for main loop iterations in Run procedure
|
||||||
|
cLoopDelayMin = 300; // Minimum loop delay
|
||||||
|
cLoopDelayExpected = 400; // Expected loop delay
|
||||||
|
cLoopDelayMax = 500; // Maximum loop delay
|
||||||
|
|
||||||
|
// Focus duration constants (for focus-loss simulation)
|
||||||
|
cFocusSkewMin = 2; // Minimum skew for focus duration calculation
|
||||||
|
cFocusSkewMax = 4; // Maximum skew for focus duration calculation
|
||||||
|
cFocusSwitchChance = 1; // Early switch chance threshold (in 0..cFocusRandomRange scale)
|
||||||
|
cFocusRandomRange = 1000; // Random range used for early focus switch check
|
||||||
|
cFocusedDurationExpected = 15 * 60 * 1000; // Expected focused duration (15 minutes in ms)
|
||||||
|
cFocusedDurationMin = 0; // Minimum focused duration for srl.SkewedRand call
|
||||||
|
cFocusedDurationMax = 20 * 60 * 1000; // Maximum focused duration (20 minutes in ms)
|
||||||
|
cUnfocusedDurationExpected = 4 * 60 * 1000; // Expected unfocused duration (4 minutes in ms)
|
||||||
|
cUnfocusedDurationMin = 0; // Minimum unfocused duration for srl.SkewedRand call
|
||||||
|
cUnfocusedDurationMax = 8 * 60 * 1000; // Maximum unfocused duration (8 minutes in ms)
|
||||||
|
|
||||||
|
// Time conversion constant
|
||||||
|
cMsPerHour = 3600000; // Milliseconds per hour
|
||||||
|
|
||||||
|
{-------------------------------------------------------------------------
|
||||||
|
End of constants
|
||||||
|
-------------------------------------------------------------------------}
|
||||||
|
|
||||||
|
{-------------------------------------------------------------------------
|
||||||
|
Shared Helper Functions
|
||||||
|
-------------------------------------------------------------------------}
|
||||||
|
|
||||||
|
{ Returns a wait time using the skewed random function with given expected, min, and max values. }
|
||||||
|
function GetWaitTime(expected, minVal, maxVal: Integer): Integer;
|
||||||
|
begin
|
||||||
|
Result := srl.SkewedRand(expected, minVal, maxVal, cSkewParam);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Waits until the bank is open.
|
||||||
|
If the bank is not open, it walks to the bank and waits until open. }
|
||||||
|
procedure WaitForBankOpen();
|
||||||
|
begin
|
||||||
|
if not Bank.IsOpen() then
|
||||||
|
begin
|
||||||
|
Bank.WalkOpen();
|
||||||
|
WaitUntil(Bank.IsOpen(), cWaitUntilDelay, GetWaitTime(cBankOpenWaitExpected, cBankOpenWaitMin, cBankOpenWaitMax));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Deposits a bank item and waits until the specified item is no longer in the inventory. }
|
||||||
|
procedure DepositItemWithWait(bankItem: TRSBankItem; itemName: string);
|
||||||
|
begin
|
||||||
|
Bank.DepositItem(bankItem, True);
|
||||||
|
WaitUntil(not Inventory.ContainsItem(itemName), cWaitUntilDelay,
|
||||||
|
GetWaitTime(cDepositWaitExpected, cDepositWaitMin, cDepositWaitMax));
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Withdraws a bank item and waits until the specified item is present in the inventory. }
|
||||||
|
procedure WithdrawItemWithWait(bankItem: TRSBankItem; itemName: string);
|
||||||
|
begin
|
||||||
|
Bank.WithdrawItem(bankItem, True);
|
||||||
|
WaitUntil(Inventory.ContainsItem(itemName), cWaitUntilDelay,
|
||||||
|
GetWaitTime(cWithdrawWaitExpected, cWithdrawWaitMin, cWithdrawWaitMax));
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Checks if the required runes (or rune pouches) are available.}
|
||||||
|
function HasRequiredRunes(): Boolean;
|
||||||
|
begin
|
||||||
|
Result := ((Inventory.CountItem('Earth rune') >= 4) and (Inventory.CountItem('Nature rune') >= 2))
|
||||||
|
or Inventory.ContainsItem('Rune pouch')
|
||||||
|
or Inventory.ContainsItem('Divine rune pouch');
|
||||||
|
end;
|
||||||
|
|
||||||
|
{-------------------------------------------------------------------------
|
||||||
|
End of shared helpers
|
||||||
|
-------------------------------------------------------------------------}
|
||||||
|
|
||||||
|
type
|
||||||
|
// State machine reflecting in-game flow.
|
||||||
|
TDegrimeState = (
|
||||||
|
DS_INVENTORY_CHECK,
|
||||||
|
DS_CHECK_CASTABLE,
|
||||||
|
DS_CAST_WAIT,
|
||||||
|
DS_BANK,
|
||||||
|
DS_TERMINATE
|
||||||
|
);
|
||||||
|
|
||||||
|
// Enumeration for the herbs.
|
||||||
|
THerbs = (
|
||||||
|
herbHuasca,
|
||||||
|
herbTarromin,
|
||||||
|
herbHarralander,
|
||||||
|
herbMarrentill,
|
||||||
|
herbGuamLeaf,
|
||||||
|
herbIritLeaf,
|
||||||
|
herbAvantoe,
|
||||||
|
herbDwarfWeed,
|
||||||
|
herbLantadyme,
|
||||||
|
herbToadflax,
|
||||||
|
herbCadantine,
|
||||||
|
herbKwuarm,
|
||||||
|
herbTorstol,
|
||||||
|
herbRanarrWeed,
|
||||||
|
herbSnapdragon
|
||||||
|
);
|
||||||
|
|
||||||
|
const
|
||||||
|
// Mapping from enum to the full "Grimy ..." herb name.
|
||||||
|
HerbNames: array[THerbs] of string = [
|
||||||
|
'Grimy Huasca',
|
||||||
|
'Grimy Tarromin',
|
||||||
|
'Grimy Harralander',
|
||||||
|
'Grimy Marrentill',
|
||||||
|
'Grimy Guam Leaf',
|
||||||
|
'Grimy Irit Leaf',
|
||||||
|
'Grimy Avantoe',
|
||||||
|
'Grimy Dwarf Weed',
|
||||||
|
'Grimy Lantadyme',
|
||||||
|
'Grimy Toadflax',
|
||||||
|
'Grimy Cadantine',
|
||||||
|
'Grimy Kwuarm',
|
||||||
|
'Grimy Torstol',
|
||||||
|
'Grimy Ranarr Weed',
|
||||||
|
'Grimy Snapdragon'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Mapping from enum to the clean herb name.
|
||||||
|
CleanHerbNames: array[THerbs] of string = [
|
||||||
|
'Huasca',
|
||||||
|
'Tarromin',
|
||||||
|
'Harralander',
|
||||||
|
'Marrentill',
|
||||||
|
'Guam Leaf',
|
||||||
|
'Irit Leaf',
|
||||||
|
'Avantoe',
|
||||||
|
'Dwarf Weed',
|
||||||
|
'Lantadyme',
|
||||||
|
'Toadflax',
|
||||||
|
'Cadantine',
|
||||||
|
'Kwuarm',
|
||||||
|
'Torstol',
|
||||||
|
'Ranarr Weed',
|
||||||
|
'Snapdragon'
|
||||||
|
];
|
||||||
|
|
||||||
|
var
|
||||||
|
GlobalCurrentHerb: THerbs = herbIritLeaf;
|
||||||
|
SimulateFocusLoss: Boolean = False; // Global flag to enable focus-loss simulation
|
||||||
|
|
||||||
|
type
|
||||||
|
// Type for focus state.
|
||||||
|
TFocusState = (fsFocused, fsUnfocused);
|
||||||
|
|
||||||
|
// Main script record – inherits from TBaseBankScript.
|
||||||
|
TDegrimeScript = record(TBaseBankScript)
|
||||||
|
State: TDegrimeState;
|
||||||
|
CastCount: UInt32;
|
||||||
|
CastRetries: Integer;
|
||||||
|
CurrentHerb: THerbs;
|
||||||
|
CleanHerbBank: TRSBankItem;
|
||||||
|
GrimyHerbBank: TRSBankItem;
|
||||||
|
StartXP: Integer;
|
||||||
|
FocusState: TFocusState;
|
||||||
|
FocusTimer: Int64;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{-------------------------------------------------------------------------
|
||||||
|
Setup: Configure antiban settings.
|
||||||
|
-------------------------------------------------------------------------}
|
||||||
|
procedure TAntiban.Setup(); override;
|
||||||
|
begin
|
||||||
|
Antiban.Skills := [ERSSkill.TOTAL, ERSSKILL.MAGIC];
|
||||||
|
Antiban.MinZoom := 63;
|
||||||
|
Antiban.MaxZoom := 83;
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{-------------------------------------------------------------------------
|
||||||
|
Helper Methods for Script Flow
|
||||||
|
-------------------------------------------------------------------------}
|
||||||
|
|
||||||
|
{ DS_INIT: Initialization – close interfaces, set bank region, and initialize focus timer. }
|
||||||
|
procedure TDegrimeScript.Init(maxActions: UInt32; maxTime: UInt64); override;
|
||||||
|
begin
|
||||||
|
inherited;
|
||||||
|
RSInterface.Close();
|
||||||
|
Wait(cInterfaceCloseDelay);
|
||||||
|
Self.RSW.SetupNamedRegion();
|
||||||
|
|
||||||
|
// Initialize herb selection and bank items.
|
||||||
|
Self.CurrentHerb := GlobalCurrentHerb;
|
||||||
|
Self.CleanHerbBank := TRSBankItem.Setup(CleanHerbNames[Self.CurrentHerb], Bank.QUANTITY_ALL, True);
|
||||||
|
Self.GrimyHerbBank := TRSBankItem.Setup(HerbNames[Self.CurrentHerb], Bank.QUANTITY_ALL, False);
|
||||||
|
Self.CastCount := 0;
|
||||||
|
Self.CastRetries := 0;
|
||||||
|
|
||||||
|
// Initialize XP reporting and focus simulation if enabled.
|
||||||
|
Self.StartXP := XPBar.Read();
|
||||||
|
if SimulateFocusLoss then
|
||||||
|
begin
|
||||||
|
Self.FocusState := fsFocused;
|
||||||
|
Self.FocusTimer := GetTimeRunning() +
|
||||||
|
GetWaitTime(cFocusedDurationExpected, cFocusedDurationMin, cFocusedDurationMax)
|
||||||
|
+ Random(-cRandomAdjustment, cRandomAdjustment);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Self.FocusState := fsFocused;
|
||||||
|
Self.FocusTimer := 0;
|
||||||
|
end;
|
||||||
|
Self.State := DS_INVENTORY_CHECK;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ DS_INVENTORY_CHECK: Verify that the inventory contains the grimy herb and required runes. }
|
||||||
|
procedure TDegrimeScript.InventoryCheck();
|
||||||
|
begin
|
||||||
|
Self.SetAction('Checking inventory for ' + HerbNames[Self.CurrentHerb] + ' and required runes.');
|
||||||
|
if Inventory.Count() = 0 then
|
||||||
|
begin
|
||||||
|
Self.SetAction('Inventory is empty. Terminating.');
|
||||||
|
Self.State := DS_TERMINATE;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
if not Inventory.ContainsItem(HerbNames[Self.CurrentHerb]) then
|
||||||
|
begin
|
||||||
|
Self.SetAction('No grimy herb in inventory. Switching to bank.');
|
||||||
|
Self.State := DS_BANK;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
if not HasRequiredRunes() then
|
||||||
|
begin
|
||||||
|
Self.SetAction('Missing required runes/pouch in inventory. Switching to bank.');
|
||||||
|
Self.State := DS_BANK;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Self.State := DS_CHECK_CASTABLE;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ DS_CHECK_CASTABLE: Open magic interface and verify the Degrime spell is castable. }
|
||||||
|
procedure TDegrimeScript.CheckCastable();
|
||||||
|
var
|
||||||
|
waitTime: Integer;
|
||||||
|
begin
|
||||||
|
if not Magic.Open() then
|
||||||
|
begin
|
||||||
|
Self.SetAction('Magic interface failed to open. Retrying...');
|
||||||
|
Wait(cMagicInterfaceRetryDelay);
|
||||||
|
if not Magic.Open() then
|
||||||
|
begin
|
||||||
|
Self.SetAction('Unable to open magic interface. Terminating.');
|
||||||
|
Self.State := DS_TERMINATE;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
waitTime := GetWaitTime(cCastableWaitExpected, cCastableWaitMin, cCastableWaitMax);
|
||||||
|
Wait(waitTime);
|
||||||
|
if Magic.CanActivate(ERSSpell.Degrime) then
|
||||||
|
begin
|
||||||
|
Self.SetAction('Spell is castable.');
|
||||||
|
Self.State := DS_CAST_WAIT;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Self.SetAction('Spell unavailable. Terminating.');
|
||||||
|
Self.State := DS_TERMINATE;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ DS_CAST_WAIT: Attempts to cast the spell and waits the appropriate amount of time to take the next action}
|
||||||
|
procedure TDegrimeScript.CastAndWait();
|
||||||
|
var
|
||||||
|
waitTime: Integer;
|
||||||
|
begin
|
||||||
|
Self.CheckCastable();
|
||||||
|
if Self.State = DS_TERMINATE then Exit;
|
||||||
|
if Magic.CanActivate(ERSSpell.Degrime) then
|
||||||
|
begin
|
||||||
|
Self.SetAction('Casting Degrime spell.');
|
||||||
|
Inc(Self.CastCount);
|
||||||
|
Magic.CastSpell(ERSSpell.Degrime);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Self.State := DS_TERMINATE;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if SimulateFocusLoss then
|
||||||
|
Self.SwitchFocusState();
|
||||||
|
|
||||||
|
if SimulateFocusLoss and (Self.FocusState = fsUnfocused) then
|
||||||
|
begin
|
||||||
|
waitTime := GetWaitTime(cUnfocusedWaitExpected, cUnfocusedWaitMin, cUnfocusedWaitMax)
|
||||||
|
+ Random(-cRandomAdjustment, cRandomAdjustment);
|
||||||
|
Self.SetAction('Unfocused: waiting for cast animation (' + ToStr(waitTime) + ' ms).');
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
waitTime := GetWaitTime(cFocusedWaitExpected, cFocusedWaitMin, cFocusedWaitMax);
|
||||||
|
Self.SetAction('Waiting for cast animation (' + ToStr(waitTime) + ' ms).');
|
||||||
|
end;
|
||||||
|
Bank.Hover();
|
||||||
|
Wait(waitTime);
|
||||||
|
Self.Report();
|
||||||
|
Self.State := DS_BANK;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Deposits clean herbs using the shared helper function. }
|
||||||
|
procedure TDegrimeScript.DepositCleanHerbs();
|
||||||
|
begin
|
||||||
|
Self.SetAction('Depositing clean herbs.');
|
||||||
|
DepositItemWithWait(Self.CleanHerbBank, CleanHerbNames[Self.CurrentHerb]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ Withdraws grimy herbs using the shared helper function. }
|
||||||
|
procedure TDegrimeScript.WithdrawGrimyHerbs();
|
||||||
|
begin
|
||||||
|
if Inventory.ContainsItem(CleanHerbNames[Self.CurrentHerb]) then
|
||||||
|
begin
|
||||||
|
Self.SetAction('Deposit might have failed, retry');
|
||||||
|
DepositCleanHerbs();
|
||||||
|
end;
|
||||||
|
if Bank.ContainsItem(HerbNames[Self.CurrentHerb]) then
|
||||||
|
begin
|
||||||
|
Self.SetAction('Withdrawing grimy herbs.');
|
||||||
|
WithdrawItemWithWait(Self.GrimyHerbBank, HerbNames[Self.CurrentHerb]);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if (not Inventory.ContainsItem(CleanHerbNames[Self.CurrentHerb])) then
|
||||||
|
begin
|
||||||
|
Self.SetAction('No grimy herbs left in bank. Terminating.');
|
||||||
|
Self.State := DS_TERMINATE;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Self.SetAction('Deposit might have failed, retry');
|
||||||
|
DepositCleanHerbs();
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ DS_BANK: Handle bank interactions (deposit/withdraw). }
|
||||||
|
procedure TDegrimeScript.BankInteraction();
|
||||||
|
var
|
||||||
|
runesOk: Boolean;
|
||||||
|
begin
|
||||||
|
Self.SetAction('Performing bank interaction.');
|
||||||
|
WaitForBankOpen();
|
||||||
|
|
||||||
|
runesOk := ((Inventory.CountItem('Earth rune') >= 4) and (Inventory.CountItem('Nature rune') >= 2))
|
||||||
|
or Inventory.ContainsItem('Rune pouch')
|
||||||
|
or Inventory.ContainsItem('Divine rune pouch');
|
||||||
|
|
||||||
|
{ Case 1: Inventory contains grimy herbs. }
|
||||||
|
if Inventory.ContainsItem(HerbNames[Self.CurrentHerb]) then
|
||||||
|
begin
|
||||||
|
if runesOk then
|
||||||
|
begin
|
||||||
|
Self.SetAction('Grimy herb present with required runes. Closing bank.');
|
||||||
|
Bank.Close();
|
||||||
|
Wait(cPostBankCloseDelay);
|
||||||
|
Self.State := DS_CHECK_CASTABLE;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Self.SetAction('Grimy herb present but missing required runes. Terminating.');
|
||||||
|
Self.State := DS_TERMINATE;
|
||||||
|
end;
|
||||||
|
Exit;
|
||||||
|
end
|
||||||
|
{ Case 2: Inventory contains clean herbs. }
|
||||||
|
else if Inventory.ContainsItem(CleanHerbNames[Self.CurrentHerb]) then
|
||||||
|
begin
|
||||||
|
DepositCleanHerbs();
|
||||||
|
WithdrawGrimyHerbs();
|
||||||
|
if Self.State <> DS_TERMINATE then
|
||||||
|
Self.State := DS_CHECK_CASTABLE;
|
||||||
|
Exit;
|
||||||
|
end
|
||||||
|
{ Case 3: Inventory is empty. }
|
||||||
|
else if Inventory.Count() = 0 then
|
||||||
|
begin
|
||||||
|
Self.SetAction('Inventory is empty. Terminating.');
|
||||||
|
Self.State := DS_TERMINATE;
|
||||||
|
Exit;
|
||||||
|
end
|
||||||
|
{ Case 4: Fallback unexpected state. }
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if runesOk and Bank.ContainsItem(HerbNames[Self.CurrentHerb]) then
|
||||||
|
begin
|
||||||
|
WithdrawGrimyHerbs();
|
||||||
|
if Self.State <> DS_TERMINATE then
|
||||||
|
Self.State := DS_CHECK_CASTABLE;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Self.SetAction('Missing required runes/pouch or herbs. Terminating.');
|
||||||
|
Self.State := DS_TERMINATE;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{-------------------------------------------------------------------------
|
||||||
|
Focus-State Functionality
|
||||||
|
-------------------------------------------------------------------------}
|
||||||
|
|
||||||
|
{ SwitchFocusState:
|
||||||
|
Determines when to switch between focused and unfocused modes using
|
||||||
|
predefined durations and a chance for an early switch.
|
||||||
|
(inspired by BigAussie AIO Lunar Spells)
|
||||||
|
}
|
||||||
|
procedure TDegrimeScript.SwitchFocusState();
|
||||||
|
var
|
||||||
|
skewness: Integer;
|
||||||
|
focusedDuration, unfocusedDuration: Integer;
|
||||||
|
begin
|
||||||
|
skewness := Random(cFocusSkewMin, cFocusSkewMax);
|
||||||
|
focusedDuration := GetWaitTime(cFocusedDurationExpected, cFocusedDurationMin, cFocusedDurationMax)
|
||||||
|
+ Random(-cRandomAdjustment, cRandomAdjustment);
|
||||||
|
unfocusedDuration := GetWaitTime(cUnfocusedDurationExpected, cUnfocusedDurationMin, cUnfocusedDurationMax)
|
||||||
|
+ Random(-cRandomAdjustment, cRandomAdjustment);
|
||||||
|
if GetTimeRunning() >= Self.FocusTimer then
|
||||||
|
begin
|
||||||
|
if Self.FocusState = fsFocused then
|
||||||
|
begin
|
||||||
|
Self.FocusState := fsUnfocused;
|
||||||
|
Self.SetAction('Switched to Unfocused mode for ' + ToStr(unfocusedDuration) + ' ms.');
|
||||||
|
Self.FocusTimer := GetTimeRunning() + unfocusedDuration;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Self.FocusState := fsFocused;
|
||||||
|
Self.SetAction('Switched to Focused mode for ' + ToStr(focusedDuration) + ' ms.');
|
||||||
|
Self.FocusTimer := GetTimeRunning() + focusedDuration;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if Random(cFocusRandomRange) < cFocusSwitchChance then
|
||||||
|
begin
|
||||||
|
if Self.FocusState = fsFocused then
|
||||||
|
begin
|
||||||
|
Self.FocusState := fsUnfocused;
|
||||||
|
Self.SetAction('Early switch to Unfocused mode.');
|
||||||
|
Self.FocusTimer := GetTimeRunning() + unfocusedDuration;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Self.FocusState := fsFocused;
|
||||||
|
Self.SetAction('Early switch to Focused mode.');
|
||||||
|
Self.FocusTimer := GetTimeRunning() + focusedDuration;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{-------------------------------------------------------------------------
|
||||||
|
Reporting Functionality
|
||||||
|
-------------------------------------------------------------------------}
|
||||||
|
|
||||||
|
{ Report: Logs total casts, runtime, and XP splits for magic and herblore.
|
||||||
|
}
|
||||||
|
procedure TDegrimeScript.Report();
|
||||||
|
const
|
||||||
|
ReportWidth = 60;
|
||||||
|
var
|
||||||
|
currentXP, totalGainedXP, magicExp, herbloreExp: Integer;
|
||||||
|
castsPerHour, magicExpPerHour, herbloreExpPerHour: Integer;
|
||||||
|
runtimeStr, focusStateStr, header, titleLine: string;
|
||||||
|
timeInHours, leftPadding: Double;
|
||||||
|
begin
|
||||||
|
currentXP := XPBar.Read();
|
||||||
|
totalGainedXP := currentXP - Self.StartXP;
|
||||||
|
magicExp := 83 * Self.CastCount;
|
||||||
|
herbloreExp := totalGainedXP - magicExp;
|
||||||
|
timeInHours := GetTimeRunning() / cMsPerHour;
|
||||||
|
|
||||||
|
castsPerHour := Round(Self.CastCount / timeInHours);
|
||||||
|
magicExpPerHour := Round(magicExp / timeInHours);
|
||||||
|
herbloreExpPerHour := Round(herbloreExp / timeInHours);
|
||||||
|
runtimeStr := SRL.MsToTime(GetTimeRunning, Time_Short);
|
||||||
|
|
||||||
|
if Self.FocusState = fsFocused then
|
||||||
|
focusStateStr := 'Focused'
|
||||||
|
else
|
||||||
|
focusStateStr := 'Unfocused';
|
||||||
|
|
||||||
|
header := StringOfChar('=', ReportWidth);
|
||||||
|
titleLine := 'Degrime Cast Report';
|
||||||
|
leftPadding := (ReportWidth - Length(titleLine)) / 2;
|
||||||
|
|
||||||
|
WriteLn(header);
|
||||||
|
WriteLn(StringOfChar(' ', Trunc(leftPadding)) + titleLine);
|
||||||
|
WriteLn(header);
|
||||||
|
WriteLn(Format('%-16s %10s %-18s %10s', ['Casts:', ToStr(Self.CastCount), 'Casts/Hour:', ToStr(castsPerHour)]));
|
||||||
|
WriteLn(Format('%-16s %10s %-18s %10s', ['Magic Exp:', ToStr(magicExp), 'Magic Exp/Hour:', ToStr(magicExpPerHour)]));
|
||||||
|
WriteLn(Format('%-16s %10s %-18s %10s', ['Herblore Exp:', ToStr(herbloreExp), 'Herblore Exp/Hour:', ToStr(herbloreExpPerHour)]));
|
||||||
|
WriteLn(Format('%-16s %10s %-18s %10s', ['Runtime:', runtimeStr, 'Focus State:', focusStateStr]));
|
||||||
|
WriteLn(header);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{Override the standard PrintReport as I won't be using it}
|
||||||
|
procedure TDegrimeScript.PrintReport(); override;
|
||||||
|
begin
|
||||||
|
Self.PreviousAction := Self.Action;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{-------------------------------------------------------------------------
|
||||||
|
Main Run Loop
|
||||||
|
-------------------------------------------------------------------------}
|
||||||
|
|
||||||
|
procedure TDegrimeScript.Run(maxActions: UInt32; maxTime: UInt64);
|
||||||
|
var
|
||||||
|
loopDelay: Integer;
|
||||||
|
begin
|
||||||
|
Self.Init(maxActions, maxTime);
|
||||||
|
while not Self.ShouldStop() do
|
||||||
|
begin
|
||||||
|
case Self.State of
|
||||||
|
DS_INVENTORY_CHECK: Self.InventoryCheck();
|
||||||
|
DS_CHECK_CASTABLE: Self.CheckCastable();
|
||||||
|
DS_CAST_WAIT: Self.CastAndWait();
|
||||||
|
DS_BANK: Self.BankInteraction();
|
||||||
|
DS_TERMINATE: Break;
|
||||||
|
end;
|
||||||
|
Self.DoAntiban();
|
||||||
|
loopDelay := GetWaitTime(cLoopDelayExpected, cLoopDelayMin, cLoopDelayMax);
|
||||||
|
Wait(loopDelay);
|
||||||
|
end;
|
||||||
|
Self.SetAction('Script terminated. Total casts: ' + ToStr(Self.CastCount));
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$IFDEF SCRIPT_GUI}
|
||||||
|
type
|
||||||
|
TDegrimeConfig = record(TScriptForm)
|
||||||
|
HerbSelector: TLabeledCombobox;
|
||||||
|
BankCheckbox: TLabeledCheckbox;
|
||||||
|
FocusLossCheckbox: TLabeledCheckbox;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TDegrimeConfig.StartScript(sender: TObject); override;
|
||||||
|
begin
|
||||||
|
case Self.HerbSelector.GetItemIndex() of
|
||||||
|
0: GlobalCurrentHerb := herbHuasca;
|
||||||
|
1: GlobalCurrentHerb := herbTarromin;
|
||||||
|
2: GlobalCurrentHerb := herbHarralander;
|
||||||
|
3: GlobalCurrentHerb := herbMarrentill;
|
||||||
|
4: GlobalCurrentHerb := herbGuamLeaf;
|
||||||
|
5: GlobalCurrentHerb := herbIritLeaf;
|
||||||
|
6: GlobalCurrentHerb := herbAvantoe;
|
||||||
|
7: GlobalCurrentHerb := herbDwarfWeed;
|
||||||
|
8: GlobalCurrentHerb := herbLantadyme;
|
||||||
|
9: GlobalCurrentHerb := herbToadflax;
|
||||||
|
10: GlobalCurrentHerb := herbCadantine;
|
||||||
|
11: GlobalCurrentHerb := herbKwuarm;
|
||||||
|
12: GlobalCurrentHerb := herbTorstol;
|
||||||
|
13: GlobalCurrentHerb := herbRanarrWeed;
|
||||||
|
14: GlobalCurrentHerb := herbSnapdragon;
|
||||||
|
else
|
||||||
|
GlobalCurrentHerb := herbMarrentill;
|
||||||
|
end;
|
||||||
|
SimulateFocusLoss := Self.FocusLossCheckbox.IsChecked();
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TDegrimeConfig.Run(); override;
|
||||||
|
var
|
||||||
|
tab: TTabSheet;
|
||||||
|
begin
|
||||||
|
Self.Setup('Degrime Script Config');
|
||||||
|
Self.Start.SetOnClick(@Self.StartScript);
|
||||||
|
Self.AddTab('Script Settings');
|
||||||
|
tab := Self.Tabs[High(Self.Tabs)];
|
||||||
|
with Self.HerbSelector do
|
||||||
|
begin
|
||||||
|
Create(tab);
|
||||||
|
SetCaption('Select Herb:');
|
||||||
|
SetLeft(20);
|
||||||
|
SetTop(50);
|
||||||
|
Combobox.SetStyle(csDropDownList);
|
||||||
|
Combobox.GetItems.Add('Grimy Huasca');
|
||||||
|
Combobox.GetItems.Add('Grimy Tarromin');
|
||||||
|
Combobox.GetItems.Add('Grimy Harralander');
|
||||||
|
Combobox.GetItems.Add('Grimy Marrentill');
|
||||||
|
Combobox.GetItems.Add('Grimy Guam Leaf');
|
||||||
|
Combobox.GetItems.Add('Grimy Irit Leaf');
|
||||||
|
Combobox.GetItems.Add('Grimy Avantoe');
|
||||||
|
Combobox.GetItems.Add('Grimy Dwarf Weed');
|
||||||
|
Combobox.GetItems.Add('Grimy Lantadyme');
|
||||||
|
Combobox.GetItems.Add('Grimy Toadflax');
|
||||||
|
Combobox.GetItems.Add('Grimy Cadantine');
|
||||||
|
Combobox.GetItems.Add('Grimy Kwuarm');
|
||||||
|
Combobox.GetItems.Add('Grimy Torstol');
|
||||||
|
Combobox.GetItems.Add('Grimy Ranarr Weed');
|
||||||
|
Combobox.GetItems.Add('Grimy Snapdragon');
|
||||||
|
Combobox.SetItemIndex(5); // Default herb selection.
|
||||||
|
end;
|
||||||
|
with Self.FocusLossCheckbox do
|
||||||
|
begin
|
||||||
|
Create(tab);
|
||||||
|
SetCaption('Simulate Losing Focus');
|
||||||
|
SetLeft(20);
|
||||||
|
SetTop(Self.HerbSelector.GetBottom() + 20);
|
||||||
|
SetHint('Enable to occasionally switch focus state and cast with slower timers.');
|
||||||
|
end;
|
||||||
|
Self.CreateBankSettings();
|
||||||
|
Self.CreateAntibanManager();
|
||||||
|
Self.CreateWaspLibSettings();
|
||||||
|
Self.CreateAPISettings();
|
||||||
|
inherited;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
DegrimeConfig: TDegrimeConfig;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
var
|
||||||
|
DegrimeScript: TDegrimeScript;
|
||||||
|
|
||||||
|
{$IFNDEF SCRIPT_CHAIN}
|
||||||
|
begin
|
||||||
|
{$IFDEF SCRIPT_GUI}
|
||||||
|
DegrimeConfig.Run();
|
||||||
|
{$ENDIF}
|
||||||
|
DegrimeScript.Run(WLSettings.MaxActions, WLSettings.MaxTime);
|
||||||
|
end.
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue