use super::insert_uncontested;
use crate::bidding::constraint::{Cons, Constraint, balanced, hcp, len, nth_seat, pred};
use crate::bidding::context::Context;
use crate::bidding::{Rules, Trie};
use contract_bridge::auction::Call;
use contract_bridge::{Bid, Hand, Strain, Suit};
fn prefers_diamonds() -> Cons<impl Constraint + Clone> {
pred(|hand: Hand, _: &Context<'_>| {
let clubs = hand[Suit::Clubs].len();
let diamonds = hand[Suit::Diamonds].len();
diamonds > clubs || (diamonds == clubs && diamonds >= 4)
})
}
#[must_use]
pub fn openings() -> Rules {
let mut rules = Rules::new()
.rule(Bid::new(2, Strain::Clubs), 3.0, hcp(22..))
.rule(Bid::new(1, Strain::Notrump), 2.0, hcp(15..=17) & balanced())
.rule(Bid::new(2, Strain::Notrump), 2.0, hcp(20..=21) & balanced())
.rule(
Bid::new(1, Strain::Spades),
1.6,
hcp(12..=21) & len(Suit::Spades, 5..),
)
.rule(
Bid::new(1, Strain::Hearts),
1.5,
hcp(12..=21) & len(Suit::Hearts, 5..),
)
.rule(
Bid::new(1, Strain::Spades),
2.6,
hcp(9..=11) & len(Suit::Spades, 5..) & (nth_seat(3) | nth_seat(4)),
)
.rule(
Bid::new(1, Strain::Hearts),
2.5,
hcp(9..=11) & len(Suit::Hearts, 5..) & (nth_seat(3) | nth_seat(4)),
)
.rule(
Bid::new(1, Strain::Diamonds),
1.0,
hcp(12..=21) & prefers_diamonds() & len(Suit::Hearts, ..5) & len(Suit::Spades, ..5),
)
.rule(
Bid::new(1, Strain::Clubs),
1.0,
hcp(12..=21)
& len(Suit::Clubs, 3..)
& !prefers_diamonds()
& len(Suit::Hearts, ..5)
& len(Suit::Spades, ..5),
);
for suit in [Suit::Diamonds, Suit::Hearts, Suit::Spades] {
rules = rules.rule(
Bid::new(2, Strain::from(suit)),
1.0,
len(suit, 6..=6) & hcp(5..=10) & !nth_seat(4),
);
}
for suit in [Suit::Clubs, Suit::Diamonds, Suit::Hearts, Suit::Spades] {
rules = rules.rule(
Bid::new(3, Strain::from(suit)),
0.9,
len(suit, 7..) & hcp(..12) & !nth_seat(4),
);
}
rules.rule(Call::Pass, 0.0, hcp(..12))
}
pub(super) fn register(book: &mut Trie) {
insert_uncontested(book, &[], openings());
}