use super::super::constraint::{balanced, hcp, len, support, top_honors};
use super::super::{Rules, Trie};
use super::{call, insert_uncontested};
use contract_bridge::auction::Call;
use contract_bridge::{Bid, Strain, Suit};
fn responses() -> Rules {
Rules::new()
.rule(Bid::new(2, Strain::Hearts), 2.0, hcp(0..=3))
.rule(
Bid::new(2, Strain::Spades),
1.5,
len(Suit::Spades, 5..) & top_honors(Suit::Spades, 2..) & hcp(8..),
)
.rule(
Bid::new(3, Strain::Clubs),
1.4,
len(Suit::Clubs, 5..) & top_honors(Suit::Clubs, 2..) & hcp(8..),
)
.rule(
Bid::new(3, Strain::Diamonds),
1.4,
len(Suit::Diamonds, 5..) & top_honors(Suit::Diamonds, 2..) & hcp(8..),
)
.rule(Bid::new(2, Strain::Notrump), 1.3, hcp(8..) & balanced())
.rule(Bid::new(2, Strain::Diamonds), 0.5, hcp(4..))
}
fn opener_rebid_after_waiting() -> Rules {
Rules::new()
.rule(Bid::new(2, Strain::Spades), 1.55, len(Suit::Spades, 5..))
.rule(Bid::new(2, Strain::Hearts), 1.5, len(Suit::Hearts, 5..))
.rule(Bid::new(2, Strain::Notrump), 1.2, hcp(22..=24) & balanced())
.rule(Bid::new(3, Strain::Notrump), 1.2, hcp(25..=27) & balanced())
.rule(Bid::new(3, Strain::Clubs), 1.0, len(Suit::Clubs, 5..))
.rule(Bid::new(3, Strain::Diamonds), 1.0, len(Suit::Diamonds, 5..))
.rule(Bid::new(2, Strain::Notrump), 0.2, hcp(22..))
}
fn opener_rebid_after_negative() -> Rules {
Rules::new()
.rule(Bid::new(2, Strain::Spades), 1.55, len(Suit::Spades, 5..))
.rule(Bid::new(3, Strain::Hearts), 1.5, len(Suit::Hearts, 5..))
.rule(Bid::new(2, Strain::Notrump), 1.2, hcp(22..=24) & balanced())
.rule(Bid::new(3, Strain::Notrump), 1.2, hcp(25..=27) & balanced())
.rule(Bid::new(3, Strain::Clubs), 1.0, len(Suit::Clubs, 5..))
.rule(Bid::new(3, Strain::Diamonds), 1.0, len(Suit::Diamonds, 5..))
.rule(Bid::new(2, Strain::Notrump), 0.2, hcp(22..))
}
fn resp_after_waiting_hearts() -> Rules {
Rules::new()
.rule(Bid::new(3, Strain::Hearts), 1.5, support(3..))
.rule(Bid::new(2, Strain::Notrump), 0.5, hcp(0..))
}
fn resp_after_waiting_spades() -> Rules {
Rules::new()
.rule(Bid::new(3, Strain::Spades), 1.5, support(3..))
.rule(Bid::new(2, Strain::Notrump), 0.5, hcp(0..))
}
fn resp_after_waiting_clubs() -> Rules {
Rules::new()
.rule(Bid::new(4, Strain::Clubs), 1.2, support(4..) & hcp(4..))
.rule(Bid::new(3, Strain::Notrump), 0.5, hcp(0..))
}
fn resp_after_waiting_diamonds() -> Rules {
Rules::new()
.rule(Bid::new(4, Strain::Diamonds), 1.2, support(4..) & hcp(4..))
.rule(Bid::new(3, Strain::Notrump), 0.5, hcp(0..))
}
fn resp_after_negative_suit(raise: Bid) -> Rules {
Rules::new()
.rule(raise, 1.0, support(4..))
.rule(Call::Pass, 0.0, hcp(0..))
}
fn opener_after_hearts_raise() -> Rules {
Rules::new()
.rule(Bid::new(4, Strain::Notrump), 1.0, hcp(28..))
.rule(Bid::new(4, Strain::Hearts), 0.5, hcp(0..))
}
fn opener_after_spades_raise() -> Rules {
Rules::new()
.rule(Bid::new(4, Strain::Notrump), 1.0, hcp(28..))
.rule(Bid::new(4, Strain::Spades), 0.5, hcp(0..))
}
fn opener_after_clubs_raise() -> Rules {
Rules::new()
.rule(Bid::new(6, Strain::Clubs), 1.0, hcp(27..))
.rule(Bid::new(5, Strain::Clubs), 0.5, hcp(0..))
}
fn opener_after_diamonds_raise() -> Rules {
Rules::new()
.rule(Bid::new(6, Strain::Diamonds), 1.0, hcp(27..))
.rule(Bid::new(5, Strain::Diamonds), 0.5, hcp(0..))
}
pub(super) fn register(book: &mut Trie) {
let c2 = call(2, Strain::Clubs);
let d2 = call(2, Strain::Diamonds);
let h2 = call(2, Strain::Hearts);
let s2 = call(2, Strain::Spades);
let c3 = call(3, Strain::Clubs);
let d3 = call(3, Strain::Diamonds);
let h3 = call(3, Strain::Hearts);
let s3 = call(3, Strain::Spades);
let h4 = call(4, Strain::Hearts);
let s4 = call(4, Strain::Spades);
let c4 = call(4, Strain::Clubs);
let d4 = call(4, Strain::Diamonds);
insert_uncontested(book, &[c2], responses());
insert_uncontested(book, &[c2, d2], opener_rebid_after_waiting());
insert_uncontested(book, &[c2, h2], opener_rebid_after_negative());
insert_uncontested(book, &[c2, d2, h2], resp_after_waiting_hearts());
insert_uncontested(book, &[c2, d2, s2], resp_after_waiting_spades());
insert_uncontested(book, &[c2, d2, c3], resp_after_waiting_clubs());
insert_uncontested(book, &[c2, d2, d3], resp_after_waiting_diamonds());
insert_uncontested(
book,
&[c2, h2, s2],
resp_after_negative_suit(Bid::new(3, Strain::Spades)),
);
insert_uncontested(
book,
&[c2, h2, c3],
resp_after_negative_suit(Bid::new(4, Strain::Clubs)),
);
insert_uncontested(
book,
&[c2, h2, d3],
resp_after_negative_suit(Bid::new(4, Strain::Diamonds)),
);
insert_uncontested(
book,
&[c2, h2, h3],
resp_after_negative_suit(Bid::new(4, Strain::Hearts)),
);
insert_uncontested(book, &[c2, d2, h2, h3], opener_after_hearts_raise());
super::slam::install_rkcb(
book,
&[
call(2, Strain::Clubs),
call(2, Strain::Diamonds),
call(2, Strain::Hearts),
call(3, Strain::Hearts),
],
Suit::Hearts,
);
insert_uncontested(book, &[c2, d2, s2, s3], opener_after_spades_raise());
super::slam::install_rkcb(
book,
&[
call(2, Strain::Clubs),
call(2, Strain::Diamonds),
call(2, Strain::Spades),
call(3, Strain::Spades),
],
Suit::Spades,
);
insert_uncontested(book, &[c2, d2, c3, c4], opener_after_clubs_raise());
insert_uncontested(book, &[c2, d2, d3, d4], opener_after_diamonds_raise());
let _ = (h4, s4);
}