Охота за альбомом
Большинство ботов бьют тех трёх соперников, которых предложила арена. Для чести это нормально, а для альбома бесполезно, потому что эти три имени выбирает игра, а не то, чего вам не хватает.
Mercy SF обходит Зал славы в фоне, запоминает снаряжение каждого увиденного игрока и отправляет следующую атаку на лучшую одолимую цель в целом: ту, что несёт больше всего предметов, которых в вашем альбоме ещё нет.

Включается через auto_scrapbook, а arena_mode надо поставить в Scrapbook.
Как работает пул
Обходчик строит в памяти, отдельно для каждого аккаунта, пул игроков и их снаряжения. Дальше каждый бой выбирается из пула, а не из списка подсказок арены.
Пул живёт в пределах сессии и не дольше, и это сделано намеренно. Хранить его казалось бесплатным знанием, а им не было:
- он рос без предела. Один замеренный аккаунт дошёл до 187 136 игроков при 119 МБ и продолжал прибавлять примерно по 20 МБ каждые двадцать минут;
- каждое изменение переписывало весь файл синхронно, удерживая при этом блокировку, которая нужна боту для выбора боя, а экрану арены для отрисовки. Замерено: переписывание 119 МБ каждые 27 секунд;
- запись не была атомарной, а неудачный разбор откатывался к пустому кэшу, так что падение посреди записи всё равно молча выбрасывало весь обход;
- сохранённое снаряжение это снимок того, что кто-то носил, а игроки переодеваются постоянно, так что большая часть пережившего перезапуск была неверной.
Пересканировать при каждом запуске делает и тот эталонный помощник, которым это вдохновлено, по той же причине.
Выбор цели
Игрок в пуле должен пройти несколько фильтров, прежде чем станет достоин атаки.
| Фильтр | Настройка | По умолчанию | Смысл |
|---|---|---|---|
| Потолок уровня | scrapbook_max_level_diff | 0 | На сколько уровней выше вашего может быть цель. 0 это «никогда выше меня». |
| Пол уровня | scrapbook_min_level_diff | 0 | На сколько уровней ниже вашего может быть цель. 0 это без нижней границы. |
| Сила | scrapbook_max_attribute_pct | 120 | Потолок суммы характеристик цели в процентах от ваших. 100 означало бы «никогда сильнее меня». |
| Чёрный список | arena_never_attack | пусто | Имена, которые не атакуются никогда, что бы они ни несли. |
| Живой | Имена, которые сервер отверг с «игрок не найден», запоминаются и пропускаются. |
Обе границы по уровню существуют потому, что подводят в противоположных направлениях. Далеко выше вас бои проиграны; далеко ниже они выигрываются без труда, но снаряжение низкоуровневое, так что на почти собранном альбоме они стоят бесплатного боя и не возвращают ничего.
Характеристики предсказывают исход куда лучше уровня, поэтому scrapbook_max_attribute_pct это та ручка, которая на самом деле решает. Значение по умолчанию 120 допускает цель на пятую часть сильнее вас, а это проигранный бой достаточно часто, чтобы это заметить. Опустите до 100, если предпочитаете не проигрывать ни одного.
Чёрный список сверяется с каждым источником: тремя подсказками арены, Залом славы и пулом обходчика. Имя, которому вы сказали нет, не должно вернуться через другую дверь.
Полоса поиска
scrapbook_search_band_enabled включена, и она меняет то, как ищут в пуле, а не то, кто подходит.
На обжитом аккаунте пул доходит до шестизначных величин, и игрок с лучшим счётом в нём часто оказывается на самом краю диапазона уровней, что даёт бой либо невыигрышный, либо ничего не стоящий. Поэтому поиск начинается в полосе вокруг вашего собственного уровня и расширяется только тогда, когда эта полоса иссякла.
| Настройка | По умолчанию | Смысл |
|---|---|---|
scrapbook_search_band_start | 10 | Полуширина полосы, с которой начинается поиск, в уровнях. |
scrapbook_search_band_step | 10 | На сколько уровней полоса растёт каждый раз, когда иссякает. |
scrapbook_search_band_max | 100 | Наибольшая ширина полосы, прежде чем она вернётся к началу. |
Возврат к началу заодно прореживает. Если пройдены все уровни до максимума и цель не нашлась, вероятнее, что запомненное устарело, а не что сервер пуст.
Старение
scrapbook_cache_max_age_hours по умолчанию равен 72. Сохранённое снаряжение это снимок, а игроки меняют вещи без остановки, так что запись недельной давности говорит больше о том, что кто-то носил, чем о том, что он носит сейчас. Хуже того: комплект, который вы уже собрали, не отличить от того, который никогда ничего не стоил. Значение 0 отключает старение целиком.
Мёртвые имена
Игроков переименовывают, удаляют и переносят между серверами. Сервер отвечает «игрок не найден», и без памяти одна устаревшая запись пула разносила бы эту ошибку и ставила весь модуль на паузу на час. Такие имена запоминаются по аккаунтам, так что мёртвая цель одного аккаунта никогда не прячет вполне пригодного игрока от другого.
Набор ограничен десятью тысячами имён. Дойти до этого значит, что пул переворачивался куда сильнее, чем в настоящей сессии, поэтому он очищается, а те немногие имена, которые ещё важны, узнаются заново ценой одного потраченного запроса на каждое.
Темп обхода
Две настройки, и они делают разную работу.
| Настройка | По умолчанию | Что ограничивает |
|---|---|---|
scrapbook_max_hof_lookups | 20 | Запросов на один цикл бота. |
scrapbook_crawl_requests_per_min | 60 | Запросов в минуту по всему аккаунту. 0 отключает ограничение. |
Шестьдесят в минуту это примерно один запрос в секунду непрерывно: достаточно, чтобы пул рос постоянно, без всплесков запросов, которые дало бы одно только повышение бюджета на цикл. Именно поэтому есть обе. Если хотите, чтобы обход шёл жёстче, поднимите обе.
Прочие настройки

| Настройка | По умолчанию | Что делает |
|---|---|---|
auto_scrapbook | вкл | Сам модуль. |
scrapbook_crawler_enabled | вкл | Обходить Зал славы непрерывно, а не читать только подсказки арены. |
scrapbook_after_xp_wins | вкл | Охотиться за целями для альбома только после боёв на опыт. |
scrapbook_scan_arena_opponents | вкл | Записывать и снаряжение трёх соперников, которых предлагает арена, это бесплатные сведения. |
scrapbook_early_game_priority | вкл | Отдавать предпочтение боям ради альбома, пока персонаж низкого уровня, когда альбом наполняется быстрее всего. |
scrapbook_hof_rankup | вкл | Вести список кандидатов для подъёма в Зале славы, а не только ради предметов. |
scrapbook_notify_at | 0 | Сообщить, когда в альбоме наберётся столько предметов. 0 значит никогда. |
buy_scrapbook | вкл | Покупать записи альбома там, где игра выставляет их на продажу. |
Где принимается решение
Стоит знать, если вы читаете исходники: раньше альбом был отдельным модулем бота, и это была ошибка. Он и модуль арены оба считали, что откат арены принадлежит им, зеркалили фильтры друг друга и расходились в том, может ли нижняя граница шанса наложить вето на бесплатный бой.
Решающая половина теперь живёт в модуле боя. Под «альбомом» осталась та механика, которая держит пул достойным выбора: обходчик, старение, границы уровней и список кандидатов на подъём.