use super::{call, insert_uncontested, slam};
use crate::bidding::constraint::{hcp, len, top_honors};
use crate::bidding::{Rules, Trie};
use contract_bridge::auction::Call;
use contract_bridge::{Bid, Strain, Suit};
fn jacoby_rebids(major: Suit) -> Rules {
let trump = Strain::from(major);
let side_suits: Vec<Suit> = [Suit::Clubs, Suit::Diamonds, Suit::Hearts, Suit::Spades]
.into_iter()
.filter(|&s| s != major)
.collect();
let mut rules = Rules::new();
for &side in &side_suits {
if Strain::from(side) < trump {
rules = rules.rule(
Bid::new(4, Strain::from(side)),
2.2,
len(side, 5..) & top_honors(side, 2..),
);
}
}
for &side in &side_suits {
rules = rules.rule(Bid::new(3, Strain::from(side)), 2.0, len(side, ..=1));
}
let [a, b, c] = [side_suits[0], side_suits[1], side_suits[2]];
let no_shortness = !len(a, ..=1) & !len(b, ..=1) & !len(c, ..=1);
rules = rules.rule(Bid::new(3, trump), 1.5, hcp(18..) & no_shortness.clone());
rules = rules.rule(
Bid::new(3, Strain::Notrump),
1.4,
hcp(15..=17) & no_shortness,
);
rules.rule(Bid::new(4, trump), 0.5, hcp(0..))
}
fn responder_after_jacoby(major: Suit, opener_bid: Call) -> Rules {
let four_major = call(4, Strain::from(major));
let four_nt = call(4, Strain::Notrump);
if opener_bid == four_major {
Rules::new()
.rule(four_nt, 1.0, hcp(18..))
.rule(Call::Pass, 0.0, hcp(0..))
} else {
Rules::new()
.rule(four_nt, 1.0, hcp(16..))
.rule(four_major, 0.5, hcp(0..))
}
}
pub(super) fn register(book: &mut Trie) {
for major in [Suit::Hearts, Suit::Spades] {
let our_calls = [call(1, Strain::from(major)), call(2, Strain::Notrump)];
let rebids = jacoby_rebids(major);
let distinct: Vec<Call> = {
let mut seen = std::collections::HashSet::new();
rebids
.rules()
.iter()
.filter_map(|r| seen.insert(r.call()).then_some(r.call()))
.collect()
};
insert_uncontested(book, &our_calls, rebids);
for opener_bid in distinct {
let resp = responder_after_jacoby(major, opener_bid);
let resp_calls: [Call; 3] = [
call(1, Strain::from(major)),
call(2, Strain::Notrump),
opener_bid,
];
insert_uncontested(book, &resp_calls, resp);
slam::install_rkcb(book, &resp_calls, major);
}
}
}