Scrapbook hunting
Most bots attack whichever three opponents the arena happens to offer. That is fine for honour and useless for the scrapbook, because those three names are picked by the game, not by what you are missing.
Mercy SF crawls the Hall of Fame in the background, remembers the equipment of every player it sees, and sends the next attack at the globally best beatable target: the one carrying the most items your album does not have yet.

Turn it on with auto_scrapbook, and set arena_mode to Scrapbook.
How the pool works
The crawler builds an in-memory pool of players and their equipment, per account. Every fight is then chosen from the pool rather than from the arena's suggestion list.
The pool lives for the session and no longer, and that is deliberate. Persisting it looked like free knowledge and was not:
- it grew without limit. One measured account reached 187,136 players in 119 MB and was still climbing by about 20 MB every twenty minutes;
- every change rewrote the whole file synchronously, while holding the lock the bot needs to pick a fight and the Arena screen needs to render. Measured: a 119 MB rewrite every 27 seconds;
- the write was not atomic, and a failed parse fell back to an empty cache, so a crash mid-write silently discarded the entire crawl anyway;
- cached equipment is a snapshot of what somebody was wearing, and players re-gear constantly, so most of what survived a restart was wrong.
Rescanning each run is what the reference helper this was inspired by does, for the same reason.
Choosing a target
A player in the pool has to clear several gates before they are worth attacking.
| Gate | Setting | Default | Meaning |
|---|---|---|---|
| Level ceiling | scrapbook_max_level_diff | 0 | How many levels above yours a target may be. 0 is "never above me". |
| Level floor | scrapbook_min_level_diff | 0 | How many levels below yours a target may be. 0 is no floor. |
| Strength | scrapbook_max_attribute_pct | 120 | Cap on a target's total attributes as a percentage of yours. 100 would be "never stronger than me". |
| Blocklist | arena_never_attack | empty | Names never attacked, whatever they are carrying. |
| Alive | Names the server has rejected with "player not found" are remembered and skipped. |
The two level limits both exist because they fail in opposite directions. Far above you the fights are lost; far below you they are trivially won but the gear is low-tier, so on a nearly complete album they cost a free fight and return nothing.
Attributes predict the outcome far better than level does, so scrapbook_max_attribute_pct is the knob that actually decides. The default of 120 allows a target up to a fifth stronger than you, which is a fight lost often enough to notice. Lower it to 100 if you would rather never lose one.
The blocklist is checked against every source: the arena's three suggestions, the Hall of Fame, and the crawler's pool. A name you have said no to must not come back through a different door.
The search band
scrapbook_search_band_enabled is on, and it changes how the pool is searched rather than what qualifies.
The pool reaches six figures on an established account, and the best-scoring player in it is frequently at the far end of the level range, which is a fight that is either unwinnable or worthless. So the search starts in a band around your own level and widens only when that band runs dry.
| Setting | Default | Meaning |
|---|---|---|
scrapbook_search_band_start | 10 | Half-width of the band the search starts at, in levels. |
scrapbook_search_band_step | 10 | Levels the band grows by each time it runs dry. |
scrapbook_search_band_max | 100 | Widest the band gets before it wraps back to the start. |
The wrap also prunes. Having swept every level out to the maximum without finding a target, the likely explanation is that what is remembered has gone stale rather than that the server is empty.
Ageing
scrapbook_cache_max_age_hours defaults to 72. Cached equipment is a snapshot, and players change gear constantly, so an entry crawled a week ago says more about what somebody was wearing than what they are wearing now. Worse, a kit you have already collected is indistinguishable from one that was never worth anything. Setting it to 0 disables ageing entirely.
Dead names
Players get renamed, deleted and server-transferred. The server answers "player not found", and without memory one stale pool entry would propagate that error and park the whole module for an hour. Those names are remembered per account, so one account's dead target never hides a perfectly good player for another.
The set is bounded at ten thousand names. Reaching that means the pool has churned far more than a real session does, so it is cleared and the few names that still matter are re-learned at one wasted lookup each.
Crawl rate
Two settings, and they do different jobs.
| Setting | Default | What it limits |
|---|---|---|
scrapbook_max_hof_lookups | 20 | Lookups per bot cycle. |
scrapbook_crawl_requests_per_min | 60 | Lookups per minute, across the whole account. 0 disables the rate limit. |
Sixty a minute is roughly one lookup a second sustained: enough to grow the pool continuously without the request bursts that raising the per-cycle budget alone would produce. That is exactly why both exist. If you want the crawl to go harder, raise both.
Other settings
| Setting | Default | What it does |
|---|---|---|
auto_scrapbook | on | The module itself. |
scrapbook_crawler_enabled | on | Crawl the Hall of Fame continuously rather than only reading the arena's suggestions. |
scrapbook_after_xp_wins | on | Hunt scrapbook targets only after the experience-first fights are done. |
scrapbook_scan_arena_opponents | on | Also record the equipment of the three opponents the arena offers, which is free information. |
scrapbook_early_game_priority | on | Prefer scrapbook fights while the character is still low level, when the album fills fastest. |
scrapbook_hof_rankup | on | Maintain a candidate list for climbing the Hall of Fame rather than only for items. |
scrapbook_notify_at | 0 | Tell me once the album reaches this many items. 0 means never. |
buy_scrapbook | on | Buy scrapbook entries where the game offers them for sale. |
Where the deciding happens
Worth knowing if you are reading the source: the scrapbook used to be a bot module of its own, and that was a bug. It and the arena module both believed they owned the arena cooldown, mirrored each other's gates, and disagreed about whether a win-chance floor may veto a free fight.
The deciding half now lives in the combat module. What is left under "scrapbook" is the machinery that keeps the pool worth choosing from: the crawler, the ageing, the level limits and the rank-up candidate list.