Знакомьтесь с новыми соперниками: умнее и живее
У ботов теперь есть характер — они идут на обмен, строят, делают ставки, нападают на лидера и даже реагируют стикерами. Каждая игра ощущается по-новому.

Простыми словами
Играть против компьютера раньше было скучновато: старые боты бросали кубики, покупали то, на что попадали, и почти ничего больше. Теперь всё иначе. У ваших соперников появился настоящий характер, и они и вправду играют на победу.
Каждый бот собран из уровня сложности (лёгкий, средний или сложный) и характера. Вам может попасться осторожный банкир, копящий деньги, безрассудный игрок, обожающий Джекпот, специалист, гоняющийся за одной цветовой группой, или мстительный соперник, который ополчается на того, кто впереди, — на вас.
- Они присылают вам предложения обмена — лишнюю собственность плюс деньги за нужное им поле — и отвечают на ваши.
- Они строят по выгоде, ставя дома там, где аренда окупается быстрее всего.
- Они делают ставки на аукционах, а сложный бот переплатит, чтобы собрать комплект.
- Они реагируют в чате стикерами, когда сделка бьёт по карману или прилетает крупная аренда.
Поскольку уровни сложности и характеры перемешиваются за каждым столом, ни одна партия не повторяет другую. У доски теперь есть характер.
Для тех, кому интересны детали
У каждого бота есть необязательный профиль — уровень сложности, скрещённый с одним из пяти архетипов (монополист, специалист, мстительный, рисковый, черепаха), автоматически смешиваемых в каждой партии в девять стилей игры. Профиль — это набор регуляторов 0–1, которые задают каждое решение: покупку, строительство, обмен, ставки на аукционе и залог за выход из тюрьмы.
// packages/game-engine/src/bot/profile.ts
export type Difficulty = 'easy' | 'medium' | 'hard';
export type Archetype =
| 'monopolist' // hoards a colour group, denies opponents' sets
| 'specialist' // commits to one or two groups
| 'vindictive' // piles pressure on the net-worth leader
| 'risktaker' // bids high, plays the Jackpot
| 'turtle'; // builds slowly, hoards cash
export interface BotProfile {
difficulty: Difficulty;
archetype: Archetype;
aggression: number; // 0..1 — buy/bid/build appetite
tradeAppetite: number; // 0..1 — how often it proposes deals
}Профиль хранится в PlayerState.botProfile и запекается в engine_state партии при старте — ровно как поле команды, — поэтому миграции базы данных не потребовалось. Лёгкий бот без профиля побайтово совпадает с прежним соперником, поэтому все предыдущие тесты по-прежнему проходят.
Сложный бот заплатит выше указанной цены, чтобы достроить монополию, с потолком, чтобы аукционы всегда завершались:
// over-list bid, bounded so the auction always terminates
const maxBid = Math.round(listPrice * (1 + 0.4 * profile.aggression));Всё остаётся детерминированным и гарантированно завершается: обмены ботов строго ограничены (одно открытое предложение за раз, частота с сидом, предлагаются только сделки, которые получатель принял бы), а симулятор прошёл стресс-тест на 2–6 игроках в течение 400 случайных прогонов fast-check. Тесты Engine 282 / daemon 91 зелёные.
