Tips, Tricks and Workarounds
This page contains various tips and tricks that may help you in using KoLmafia and writing scripts.
Free Pulls
KoLmafia considers free pulls as completely separate from other items in Hangks. Because there is no resource being consumed by pulling them, they do not use the functions involved in pulls, specifically storage_amount()
and take_storage()
.
To find the quantity of a free pull in Hangks, such as a brick you need to use available_amount()
. To remove a free pull item from Hangks you need to use retrieve_item()
.
Anonymous closures
ASH does not seem to accept anonymous closures by default. This is an example of an anonymous closure.
int var1;
/* Do stuff */
{
int var1;
call_some_function();
/* Do other stuff */
}
However, you can use a workaround with a if-clause like the following example.
int var1;
/* Do stuff */
if (true)
{
int var1;
/* Do other stuff */
}
As for where stuff like this could be used... It can initialize ASH scripts without creating any unnecessary functions or variables in the "namespace". Not everyone's cup of tea, but at least you know.
Capturing an Abort
Several ASH functions return a boolean to indicate success (true
) or failure (false
). While useful for error handling, it's easy to accidentally forget to check this value. To help script authors, KoLmafia automatically checks the value for you and aborts the script, but only if the value is not used.
For example, suppose you call the hermit()
function. If you call it without using the return value in any way, KoLmafia will abort if the function fails:
hermit(1, $item[ ten-leaf clover ]);
However, if the value is "captured" and used in any way, KoLmafia assumes that you want to manually handle the failure, and will not abort regardless of the return value.
The following is considered as "capturing" a variable.
Assigning the return value to a boolean variable.
boolean fakeBool = hermit(1, $item[ ten-leaf clover ]);
Checking the return value in a conditional statement (e.g. if
-block).
if (!hermit(1, $item[ ten-leaf clover ])) {
print("Hermit looting failed: continuing on.");
}
An if-
block can be empty.
if (hermit(1, $item[ ten-leaf clover ])) {}
The most minimal method is to wrap it with a logical not operator (!
) and parentheses.
(!hermit(1, $item[ ten-leaf clover ]));
This only applies to the following built-in functions:
adv1()
adventure()
autosell()
batch_close()
bjornify_familiar()
buy()
change_mcd()
chew()
cli_execute()
create()
drink()
eatsilent()
eat()
empty_closet()
enthrone_familiar()
equip_all_familiars()
equip()
hedge_maze()
hermit()
outfit()
overdrink()
pick_pocket()
put_closet()
put_display()
put_shop()
put_stash()
refresh_shop()
refresh_stash()
refresh_status()
reprice_shop()
retrieve_item()
sell()
synthesize_effect()
synthesize_pair()
take_closet()
take_display()
take_shop()
take_stash()
take_storage()
tower_door()
use_familiar()
use_servant()
use_skill()
use()
visit()
- and possibly more...
Note: This does not affect user-defined functions
Syntax Highlighting for Notepad++
Testing Scripts Offline
Because KoLmafia CLI and ASH are interpreted, it is impossible to know whether there are any errors in your scripts until you run or validate them. If you want to check only the syntax of the script, you can validate it without logging in. From the top menu of the login pane, select "General", then "Graphical CLI". The CLI (and the rest of the mafia interface) will appear. You can then use the validate CLI command to verify their syntax. If the script is purely informational then you can even run it, but note that because you are not logged in, any functions or commands that use or interact with KoL will not work. Thus, testing scripts this way will not reveal any KoL-related logical errors.