BOOL CConvention::CheckForOtherConventions(CBidEngine& bidState) { // check to see if another convention is present CConvention* pActiveConvention = bidState.GetActiveConvention(); if ((pActiveConvention) && (pActiveConvention != this)) return TRUE; else return FALSE; }
// //----------------------------------------------------- // // handle an artificial 2C opening bid (23+ pts) // BOOL CArtificial2ClubConvention::RespondToConvention(const CPlayer& player, const CConventionSet& conventions, CHandHoldings& hand, CCardLocation& cardLocation, CGuessedHandHoldings** ppGuessedHands, CBidEngine& bidState, CPlayerStatusDialog& status) { // first see if another convention is active if (bidState.GetActiveConvention() && (bidState.GetActiveConvention() != this)) return FALSE; // // Bidding in response to an opening 2C bid? check requirements // int nPartnersBid = bidState.nPartnersBid; int nPartnersSuit = bidState.nPartnersSuit; int nPartnersSuitSupport = bidState.nPartnersSuitSupport; int numSupportCards = bidState.numSupportCards; int nPartnersBidLevel = bidState.nPartnersBidLevel; int numPartnerBidsMade = bidState.m_numPartnerBidsMade; int nBid; // see if this is our second response to partner's opening 2C bid if (bidState.GetConventionStatus(this) == CONV_RESPONDED) { // see if we responded 2D last time if (bidState.nPreviousBid == BID_2D) { status << "R2CLR2! Partner showed his best suit of " & bidState.szPS & " in response to our negative 2D response.\n"; // what to do here??? // if partner shows a suit, adjust point count as dummy double fAdjPts = bidState.fAdjPts = (ISSUIT(bidState.nPartnersSuit))? hand.RevalueHand(REVALUE_DUMMY, bidState.nPartnersSuit, TRUE) : bidState.fPts; double fCardPts = bidState.fCardPts; // adjust partnership point count minimums & maximums bidState.m_fMinTPPoints = fAdjPts + bidState.m_fPartnersMin; bidState.m_fMaxTPPoints = fAdjPts + bidState.m_fPartnersMax; bidState.m_fMinTPCPoints = fCardPts + bidState.m_fPartnersMin; bidState.m_fMaxTPCPoints = fCardPts + bidState.m_fPartnersMax; // if (bidState.m_fMinTPPoints <= PTS_GAME-2) { nBid = BID_PASS; status << "R2CLR10! But with only " & bidState.m_fMinTPPoints & " points in the partnership, we have to pass.\n"; } else { // either shift to our own suit, raise partner to game, or bid 3NT if ((nPartnersSuitSupport >= SS_MODERATE_SUPPORT) && (nPartnersBid < bidState.GetGameBid(nPartnersSuit))) { nBid = bidState.GetGameBid(nPartnersSuit); status << "R2CLR20! Raise partner's & " & bidState.szPS & " to game at "& BTS(nBid) & ".\n"; } else if (bidState.IsSuitOpenable(bidState.nPrefSuit) && (nPartnersBidLevel <= 3)) { nBid = bidState.GetCheapestShiftBid(bidState.nPrefSuit); status << "R2CLR22! Bid our own " & bidState.szPrefSS & " suit in preference to partner's " & bidState.szPSS & " suit .\n"; } else if (nPartnersBid < BID_3NT) { nBid = BID_3NT; status << "R2CLR25! With only " & bidState.SLTS(nPartnersSuit) & " support for partner and no good suit of our own, bid 3NT.\n"; } else { nBid = BID_PASS; status << "R2CLR30! With only " & bidState.SLTS(nPartnersSuit) & " support for partner and no good suit of our own, we have to pass.\n"; } } // bidState.SetBid(nBid); bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } // mark this convention as completed bidState.SetConventionStatus(this, CONV_FINISHED); return FALSE; } // // // partner must've bid 2 Club at his first opportunity, // and partner's bid must have been the first bid made // if ((nPartnersBid == BID_2C) && (bidState.m_bPartnerOpenedForTeam) && (numPartnerBidsMade == 1) && (nPartnersBid == pDOC->GetValidBidRecord(0))) { // condition valid // record that we responded bidState.SetConventionStatus(this, CONV_RESPONDED); } else { return FALSE; } // state expectations status << "R2CLUB! Partner made an artificial bid of 2 Clubs, showing either a game suit or " & pCurrConvSet->GetValue(tn2ClubOpeningPoints) & "+ points. We want to respond positively if interested in a slam.\n"; // the bid is forcing to game bidState.m_bGameForceActive = TRUE; // double fPts = bidState.fPts; double fAdjPts = bidState.fAdjPts; double fCardPts = bidState.fCardPts; int nPrefSuit = bidState.nPrefSuit; int nPrefSuitStrength = bidState.nPrefSuitStrength; // bidState.AdjustPartnershipPoints(pCurrConvSet->GetValue(tn2ClubOpeningPoints), 40 - fCardPts); // respond negatively (2D) with < 33 points if (bidState.m_fMinTPPoints < PTS_SLAM) { nBid = BID_2D; status << "R2C04! With only " & fCardPts & "/" & fPts & " points, we deny interest in slam by making the negative response of " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); return TRUE; } // // else with 33+ points, state slam hopes // status << "2R2C08! With a total of " & bidState.m_fMinTPPoints & "+ points in the partnership, we want to invite slam.\n"; // show an openable suit if (nPrefSuitStrength >= SS_OPENABLE) { if (ISMAJOR(nPrefSuit)) nBid = MAKEBID(nPrefSuit,2); else nBid = MAKEBID(nPrefSuit,3); status << "R2C14! With " & fCardPts & "/" & fPts & " points in hand, and a total of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " points in the partnership, we express possible interest in slam by showing our best suit (" & bidState.szPrefS & ") with a bid of " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); return TRUE; } // or a SOLID suit (jump shift) if (bidState.bPrefSuitIsSolid) { if (ISMAJOR(nPrefSuit)) nBid = MAKEBID(nPrefSuit,3); else nBid = MAKEBID(nPrefSuit,4); status << "R2C18! With " & fCardPts & "/" & fPts & " points in hand and a total of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " points in the partnership, we express interest in a slam by showing our solid " & bidState.szPrefSS & " suit in a jump bid of " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); return TRUE; } // else assume a balanced hand // with a balanced hand & >= 26 total HCPs, bid 3NT; // with < 26 total HCPs, 2NT if (bidState.bBalanced) { if (bidState.m_fMinTPCPoints >= PTS_NT_GAME) nBid = BID_3NT; else nBid = BID_2NT; status << "R2C22! With " & fCardPts & " HCPs and a balanced hand, and a total of " & bidState.m_fMinTPCPoints & "+ HCPs in the partnership, we respond with " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); return TRUE; } // else just bid the best suit nBid = bidState.GetCheapestShiftBid(nPrefSuit, BID_2C); status << "R2C26! With " & fCardPts & "/" & fPts & " points but with no strong suit and an unbalanced hand, we have to respond with our best suit of " & bidState.szPrefS & " by bidding " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); return TRUE; } // end of 2C opening section
// //========================================================= // // RespondToConvention() // // respond to partner's preemptive shutout bid of 3, 4, or 5 // BOOL CShutoutBidsConvention::RespondToConvention(const CPlayer& player, const CConventionSet& conventions, CHandHoldings& hand, CCardLocation& cardLocation, CGuessedHandHoldings** ppGuessedHands, CBidEngine& bidState, CPlayerStatusDialog& status) { // first see if another convention is active if (bidState.GetActiveConvention()) return FALSE; // // Bidding in response to an opening preemptive shutout bid? // check requirements // int nPartnersBid = bidState.nPartnersBid; int nPartnersBidLevel = bidState.nPartnersBidLevel; int nPartnersSuit = bidState.nPartnersSuit; // // check to see if partner did in fact make a shutout bid // if (((nPartnersBidLevel >= 3) && (nPartnersBidLevel <= 5)) && (bidState.m_numPartnerBidsMade == 1) && (nPartnersSuit != NOTRUMP) && (bidState.m_bPartnerOpenedForTeam)) { // okay, met requirements } else { // failed the test return FALSE; } // // in general, pass a shutout bid unless we have an exceedingly // strong hand // // first state expectations bidState.m_fPartnersMin = OPEN_PTS(6); bidState.m_fPartnersMax = OPEN_PTS(9); status << "SHUTR0! Partner made a preemptive " & bidState.szPB & " bid, showing a " & ((bidState.nPartnersBidLevel==3)? 7:(bidState.nPartnersBidLevel==4)? 8:9) & "-card " & bidState.szPSS & " suit with no tricks outside the suit, and most likely " & bidState.m_fPartnersMin & "-" & bidState.m_fPartnersMax & " points.\n"; // adjust team point estimates double fPts = bidState.fPts; double fAdjPts = bidState.fAdjPts; double fCardPts = bidState.fCardPts; bidState.m_fMinTPPoints = fAdjPts + bidState.m_fPartnersMin; bidState.m_fMaxTPPoints = fAdjPts + bidState.m_fPartnersMax; bidState.m_fMinTPCPoints = fCardPts + bidState.m_fPartnersMin; bidState.m_fMaxTPCPoints = fCardPts + bidState.m_fPartnersMax; // raise a 3 bid to game if we have enough to make game // the requiremetns are: // 1: 4 cards in the suit, // 2: 5 playing tricks for a major suit, or 6 for a minor // 3: 2 QT's, and // 4: >= 26 team pts for a major game, or >= 29 pts for a minor game int nBid; int numSupportCards = bidState.numSupportCards; int nPartnersSuitSupport = bidState.nPartnersSuitSupport; double numQuickTricks = bidState.numQuickTricks; int numLikelyWinners = bidState.numLikelyWinners; double fMinTPPoints = bidState.m_fMinTPPoints; double fMaxTPPoints = bidState.m_fMaxTPPoints; // if ((nPartnersBidLevel == 3) && (ISMAJOR(nPartnersSuit)) && (numSupportCards >= 4) && (numQuickTricks >= 2) && (numLikelyWinners >= 5) && (fMinTPPoints >= PTS_GAME)) { nBid = MAKEBID(nPartnersSuit,4); status << "SHUTR2! We have " & fCardPts & "/" & fPts & "/" & fAdjPts & " points in hand, for a total of " & fMinTPPoints & "-" & fMaxTPPoints & " points in the partnership, strong support for partner's long " & bidState.szPSS & " suit (holding " & bidState.szHP & "), plus " & numQuickTricks & " QTs and " & numLikelyWinners & " likely winners, so we can safely bid game at " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); return TRUE; } // raise a minor to game as above, but with 5-card // support && 6+ winners && 28+ TPs if ((nPartnersBidLevel <= 4) && (ISMINOR(nPartnersSuit)) && (numSupportCards >= 5) && (numQuickTricks >= 2) && (numLikelyWinners >= 6) && (fMinTPPoints >= PTS_MINOR_GAME)) { nBid = MAKEBID(nPartnersSuit,5); status << "SHUTR4! We have " & fCardPts & "/" & fPts & "/" & fAdjPts & " points in hand, for a total of " & fMinTPPoints & "-" & fMaxTPPoints & " points in the partnership, strong support for partner's long " & bidState.szPSS & " suit (holding " & bidState.szHP & "), plus " & numQuickTricks & " QTs and " & numLikelyWinners & " likely winners, so we can safely bid a minor game at " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); return TRUE; } // raise a 3 or 4 bid to slam with strong support, // >= 32 TPs, and 4 QTs if ((nPartnersBidLevel < 5) && (nPartnersSuitSupport >= SS_GOOD_SUPPORT) && (numQuickTricks >= 4) && (fMinTPPoints >= PTS_SLAM)) { nBid = MAKEBID(nPartnersSuit,6); status << "SHUTR6! We have " & fCardPts & "/" & fPts & "/" & fAdjPts & " points in hand, for a total of " & fMinTPPoints & "-" & fMaxTPPoints & " points in the partnership, " & bidState.SLTS(nPartnersSuit) & " support for partner's long " & bidState.szPSS & " suit (holding " & bidState.szHP & "), plus " & numQuickTricks & " QTs, so we can safely bid a slam at " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); return TRUE; } // else, just pass nBid = BID_PASS; status << "SHUTR9! With " & fCardPts & "/" & fPts & "/" & fAdjPts & " points in hand, for a total of " & fMinTPPoints & "-" & fMaxTPPoints & " points in the partnership, holding " & bidState.szHP & " in support of partner's " & bidState.szPSS & " suit, and with only " & numQuickTricks & " QTs and " & numLikelyWinners & " likely winners, we have no real reason to bid anything, so just pass.\n"; bidState.SetBid(nBid); return TRUE; }
// //----------------------------------------------------- // // respond to partner's Gambling 3NT Bid // BOOL CGambling3NTConvention::RespondToConvention(const CPlayer& player, const CConventionSet& conventions, CHandHoldings& hand, CCardLocation& cardLocation, CGuessedHandHoldings** ppGuessedHands, CBidEngine& bidState, CPlayerStatusDialog& status) { // first see if another convention is active if ((bidState.GetActiveConvention() != NULL) && (bidState.GetActiveConvention() != this)) return FALSE; // // make a responding bid // int nPartnersBid = bidState.nPartnersBid; int nOpeningBid = pDOC->GetOpeningBid(); int nBid = NONE; // int nStatus = bidState.GetConventionStatus(this); if (nStatus == CONV_INACTIVE) { // // Bidding in response to partner's Gambling 3NT // // and test conditions // partner must have opened at 3NT if ( (nOpeningBid == nPartnersBid) && (bidState.nPartnersBid == BID_3NT) ) { // passed the test } else { return FALSE; } // see which version of gambling 3NT we're playing int bStandardGambling3NT = (pCurrConvSet->GetValue(tnGambling3NTVersion) == 0); // if (bStandardGambling3NT) { // standard Gambling 3NT status << "G3NT10! Partner bid a Gambling 3NT, indicating " & OPEN_PTS(10) & "-" & OPEN_PTS(12) & " HCPs, a solid 7+ card minor, " " no voids or small singletons, and no outside stoppers.\n"; // revalue partnership totals bidState.AdjustPartnershipPoints(10, 12); // if we have stoppers in at least 3 suits and no void minors, pass if ((bidState.numSuitsStopped >= 3) && (bidState.numCardsInSuit[CLUBS] > 0) && (bidState.numCardsInSuit[DIAMONDS] > 0)) { status << "G3NT12! Since we have " & bidState.numSuitsStopped & " suits stopped and no minor suit voids, we can pass.\n"; nBid = BID_3NT; } else { nBid = BID_4C; if (bidState.numSuitsStopped < 3) status << "G3NT13! But since we have only " & bidState.numSuitsStopped & " suits stopped, we have to respond with " & BTS(nBid) & ", which partner can correct to 4D if necessary.\n"; else status << "G3NT14! But since we are void in the " & ((bidState.numCardsInSuit[CLUBS] == 0)? "Club" : "Diamond") & " suit, we have to respond at " & BTS(nBid) & ", which partner can correct to 4D if necessary.\n"; // bidState.SetBid(nBid); bidState.SetConventionStatus(this, CONV_RESPONDED_ROUND1); return TRUE; } } else { // ACOL Gambling 3NT // pass unless there's interest in slam status << "G3NT20! Partner bid an ACOL Gambling 3NT, indicating " & OPEN_PTS(16) & "-" & OPEN_PTS(21) & " HCPs, a solid 7+ card minor, " " no voids or small singletons, and stoppers in at least 2 outside suits.\n"; // revalue partnership totals bidState.AdjustPartnershipPoints(16, 21); // respond positively only if there's interest in slam if (bidState.m_fMinTPPoints >= PTS_SLAM) { // bid slam directly if (bidState.m_fMinTPPoints >= PTS_GRAND_SLAM) { nBid = BID_7NT; status << "G3NT21! With a total of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMinTPPoints & " pts in the partnership, bid a grand slam directly at " & BTS(nBid) & ".\n"; } else { nBid = BID_6NT; status << "G3NT22! With a total of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMinTPPoints & " pts in the partnership, bid slam directly at " & BTS(nBid) & ".\n"; } } else { // gotta pass status << "G3NT29! But with a total of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMinTPPoints & " pts in the partnership, we have no interest in slam and have to pass.\n"; nBid = BID_PASS; } } // bidState.SetBid(nBid); bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } else if (nStatus == CONV_RESPONDED_ROUND1) { // we must have responded with a 4C, so pass here // see if partner made sense if ((nPartnersBid == BID_4D) || (nPartnersBid == BID_PASS)) status << "G3NT40! Pass partner's " & BTS(nPartnersBid) & " and conclude the Gambling 3NT convention and pass.\n"; else status << "G3NT41! Partner's " & BTS(nPartnersBid) & " bid doesn't make sense, so end the Gambling 3NT convention and pas.\n"; // bidState.SetBid(BID_PASS); bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } // return FALSE; }
// //--------------------------------------------------------------- // // RespondToConvention() // BOOL CCueBidConvention::RespondToConvention(const CPlayer& player, const CConventionSet& conventions, CHandHoldings& hand, CCardLocation& cardLocation, CGuessedHandHoldings** ppGuessedHands, CBidEngine& bidState, CPlayerStatusDialog& status) { // first see if another convention is active if (bidState.GetActiveConvention() && (bidState.GetActiveConvention() != this)) return FALSE; // basic test -- see if we had agreed on a suit last time if (bidState.m_nAgreedSuit == NONE) return FALSE; // get status int nStatus = bidState.GetConventionStatus(this); // int nPartnersBid = bidState.nPartnersBid; int nPartnersBidLevel = bidState.nPartnersBidLevel; int nPartnersSuit = bidState.nPartnersSuit; int nPartnersPrevSuit = bidState.nPartnersPrevSuit; int nAgreedSuit = bidState.m_nAgreedSuit; int nSupportLevel = bidState.nPartnersSuitSupport; int nBid; // see if partner made a cue bid // it needs to be a bid that commits the partnership to game, // after a suit has been agreed upon if ((nAgreedSuit != NONE) && (nPartnersSuit != NOTRUMP) && (nPartnersSuit != nAgreedSuit) && ((nPartnersBid > MAKEBID(nAgreedSuit,3)) && (nPartnersBid < bidState.GetGameBid(nAgreedSuit)))) { //NCR what if suit was previously bid by this player??? // EG: N->1H, S->2C, N->3C, S->3H 3H is NOT a cue bid, it's a response to this player's previous bid // NCR how to test if partner's current bid was in suit previously bid ??? // NCR what about a game bid??? int nSuit = BID_SUIT(nPartnersBid); for(int i=0; i < player.GetNumBidsMade(); i++) { // NCR had to add const to this function def int nSuitBid = pDOC->GetBidByPlayer(player.GetPosition(), i); if(BID_SUIT(nSuitBid) == nSuit) return FALSE; // NCR not cue if partner bid before ??? } // NCR-295 game bid in agreed suit??? if(bidState.IsGameBid(nPartnersBid) && (nSuit == nAgreedSuit) ) // || CheckIfSuitBid(player, BID_SUIT(nPartnersBid))) { return FALSE; //NCR don't treat Game bid as cue bid } // met the requirements status << "CUR0! Partner made a cue bid of " & BTS(nPartnersBid) & ", hinting at slam prospects.\n"; } else { // this is not a cue bid return FALSE; } // // respond to a cue bid only if we have an interest in slam // // only qualify if we have 30+ team points, _OR_ // strong trump support and 28+ poitns // if (bidState.m_fMinTPPoints >= 30) { // 30+ team points status << "2CUR1! And since we have " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & "+ points in the partnership, we want to respond favorably.\n"; } else if ((nSupportLevel >= SS_GOOD_SUPPORT) && (bidState.m_fMinTPPoints >= 28)) { // good support (4 good or 5 moderate cards) status << "2CUR2! And since we have " & bidState.SLTS(nPartnersSuit) & " trump support, " & ((bidState.m_fMinTPPoints >= 30)? " as well as " : " albeit only with ") & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " points in the partnership, we want to respond favorably.\n"; } else { // insufficient strength for slam -- correct back to the agreed suit nBid = bidState.GetCheapestShiftBid(nAgreedSuit); status << "CUR4! But we don't have the points (only " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership) or the excellent trump support needed for a marginal slam, so we decline by returning to the agreed suit at a bid of " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } // // else we're playing along -- find the cheapest response // if (nStatus == CONV_INACTIVE) { // first invocation -- find the cheapest Ace int nSuit = GetCheapestAce(hand, nPartnersSuit, bidState.m_nAgreedSuit); // found a suit with an ace? if ((nSuit != nPartnersSuit) && (nSuit != nAgreedSuit)) { // found a suit to cue bid nBid = bidState.GetCheapestShiftBid(nSuit); status << "CUR20! Respond to partner's cue bid, showing our cheapest ace (" & STS(nSuit) & ") with a bid of " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); bidState.SetConventionStatus(this, CONV_RESPONDED_ROUND1); return TRUE; } else { // found no ace, or else it's in the trump suit, so either way // just sign off at the agreed suit nBid = bidState.GetCheapestShiftBid(nAgreedSuit); if (hand.SuitHasCard(nSuit, ACE)) status << "CUR22! But our only Ace is in the trump suit of " & STSS(nAgreedSuit) & ", so sign off at a bid of " & BTS(nBid) & ".\n"; else status << "CUR24! We have no other Aces to offer, so sign off with the agreed " & STSS(nAgreedSuit) & " suit at a bid of " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } } else if (nStatus == CONV_RESPONDED_ROUND1) { // second invocation -- find cheapest King or void // first invocation -- find teh cheapest Ace int nSuit = GetCheapestKingOrVoid(hand, nPartnersSuit, bidState.m_nAgreedSuit); // found an appropriate suit? if ((nSuit != nPartnersSuit) && (nSuit != nAgreedSuit)) { // found a suit to cue bid nBid = bidState.GetCheapestShiftBid(nSuit); status << "CUR30! Respond to partner's cue bid, showing our cheapest " & ((hand.GetSuitLength(nSuit) > 0)? "King" : "void suit") & " (in " & STS(nSuit) & ") with a bid of " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); // bidState.SetConventionStatus(this, CONV_RESPONDED_ROUND2); bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } else { // found no king or void, or else found a king in the trump suit, // so either way, just sign off at the agreed suit nBid = bidState.GetCheapestShiftBid(nAgreedSuit); if (hand.SuitHasCard(nSuit, KING)) status << "CUR32! But our only Ace is in the trump suit of " & STSS(nAgreedSuit) & ", so sign off at a bid of " & BTS(nBid) & ".\n"; else status << "CUR34 We have no other Kings or void suits to offer, so sign off with the agreed " & STSS(nAgreedSuit) & " suit at a bid of " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } } else { // error! bidState.SetConventionStatus(this, CONV_ERROR); return FALSE; } }
// //----------------------------------------------------- // // respond to partner's negative double // BOOL CNegativeDoublesConvention::RespondToConvention(const CPlayer& player, const CConventionSet& conventions, CHandHoldings& hand, CCardLocation& cardLocation, CGuessedHandHoldings** ppGuessedHands, CBidEngine& bidState, CPlayerStatusDialog& status) { // first see if another convention is active if ((bidState.GetActiveConvention() != NULL) && (bidState.GetActiveConvention() != this)) return FALSE; // // Bidding in response to partner's negative bid? check requirements // // the identifying marks of a negative double are: // 1: this must be round #1 or 2 // 2: we must have opened bidding, and // 3: LHO must have bid over our initial bid, up to 2S // int nBid; int nPartnersBid = bidState.nPartnersBid; int nMajorSuits[2] = { 1, 1 }; if (bidState.nPreviousSuit == HEARTS) nMajorSuits[0] = 0; else if (bidState.nPreviousSuit == SPADES) nMajorSuits[1] = 0; // if (bidState.nLHOSuit == HEARTS) nMajorSuits[0] = 0; else if (bidState.nLHOSuit == SPADES) nMajorSuits[1] = 0; // apply tests #1, 2, and 3 if ( (nPartnersBid == BID_DOUBLE) && ((bidState.nRound == 0) || (bidState.nRound == 1)) && (bidState.m_bOpenedBiddingForTeam) && (bidState.nLHOBid > BID_PASS) && (bidState.nLHOBid <= BID_2S) // NCR-195 bid must be suit && ISSUIT(BID_SUIT(bidState.nLHOBid)) ) { // status << "NEGDR2! Partner has bid a negative double, indicating 4+ cards in the unbid majors " & ((nMajorSuits[0] && nMajorSuits[1])? "(Hearts and Spades)" : nMajorSuits[0]? "(Hearts)" : "(Spades)") & ".\n"; } else { return FALSE; } // // estimate partner's strength // if (bidState.nLHOBidLevel == 1) { // 6-9 pts for a neg dbl the 1-level (NCR TryConvention uses 19 max???) bidState.m_fPartnersMin = OPEN_PTS(6); bidState.m_fPartnersMax = Min(OPEN_PTS(19),40 - bidState.fCardPts); // NCR changed 9 to 19 bidState.m_fMinTPPoints = bidState.fPts + bidState.m_fPartnersMin; bidState.m_fMaxTPPoints = bidState.fPts + bidState.m_fPartnersMax; bidState.m_fMinTPCPoints = bidState.fCardPts + bidState.m_fPartnersMin; bidState.m_fMaxTPCPoints = bidState.fCardPts + bidState.m_fPartnersMax; status << "2NEGDR8! Partner's negative double indicates " & bidState.m_fPartnersMin & "-" & bidState.m_fPartnersMax & " points, for a total in the partnership of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " points.\n"; } else { // 11-18 pts for a neg double at the 2 level bidState.m_fPartnersMin = OPEN_PTS(11); bidState.m_fPartnersMax = Min(OPEN_PTS(18),40 - bidState.fCardPts); bidState.m_fMinTPPoints = bidState.fPts + bidState.m_fPartnersMin; bidState.m_fMaxTPPoints = bidState.fPts + bidState.m_fPartnersMax; bidState.m_fMinTPCPoints = bidState.fCardPts + bidState.m_fPartnersMin; bidState.m_fMaxTPCPoints = bidState.fCardPts + bidState.m_fPartnersMax; status << "2NEGDRT8! Partner's negative double indicates 11+ pts, for a total in the partnership of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " points.\n"; } // // and respond to the bid // int nSuit; double fCardPts = bidState.fCardPts; double fPts = bidState.fPts; int nLHOBid = bidState.nLHOBid; int nRHOBid = bidState.nRHOBid; // // with support for one or the other major, raise // but discount the majors already bid by us or LHO // int numHearts = hand.GetNumCardsInSuit(HEARTS); int numSpades = hand.GetNumCardsInSuit(SPADES); // gotta beat RHO's bid if possible int nTopBid = nLHOBid; if ((nRHOBid > BID_PASS) && (nRHOBid != BID_REDOUBLE)) nTopBid = nRHOBid; // see if the majors are available if ( (nMajorSuits[0] && nMajorSuits[1]) && ((numHearts >= 3) || (numSpades >= 3)) ) { // both majors are available, so pick the better one int nSuit = bidState.PickSuperiorSuit(HEARTS,SPADES); nBid = bidState.GetCheapestShiftBid(nSuit, nTopBid); // see if the bid is affordable if (bidState.IsBidSafe(nBid)) { status << "NEGDTR20! With " & bidState.m_fMinTPPoints & " pts in the partnership and " & " both majors available in response to the negative double, go with the " & hand.GetNumCardsInSuit(nSuit) & "-card " & STSS(nSuit) & " suit and bid " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); } else { status << "NEGDTR21! We have both majors avaialblem but with " & bidState.m_fMinTPPoints & " pts in the partnership, we do not have enough points to bid either suit and have to pass.\n"; bidState.SetBid(BID_PASS); } bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } else if ( ((nMajorSuits[0]) && (numHearts >= 3)) || ((nMajorSuits[1]) && (numSpades >= 3)) ) { // bid the suit if ((nMajorSuits[0]) && (numHearts >= 3)) nSuit = HEARTS; else nSuit = SPADES; nBid = bidState.GetCheapestShiftBid(nSuit, nTopBid); // see if the bid is affordable double fAdj = bidState.fAdjPts; // NCR-717 theApp.GetBiddingAgressiveness()*1.5; // NCR change test amt? if (bidState.IsBidSafe(nBid, fAdj)) // NCR adjust??? { status << "NEGDTR30! With " & bidState.m_fMinTPPoints & " pts in the partnership and " & hand.GetNumCardsInSuit(nSuit) & " cards available in " & STS(nSuit) &", bid " & BTS(nBid) & ".\n"; bidState.SetBid(nBid); } else { status << "NEGDTR31! We have " & hand.GetNumCardsInSuit(nSuit) & " cards in the " & STSS(nSuit) & " suit, but with only " & bidState.m_fMinTPPoints & " pts in the partnership, we can't go any higher.\n"; bidState.SetBid(BID_PASS); } bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } // // we have no majors available, so bid NT if possible // if (bidState.BidNoTrumpAsAppropriate(FALSE)) { bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } // else bid something, anything nSuit = bidState.GetRebidSuit(bidState.nPreviousSuit); if(nSuit == NONE) { //NCR test for no rebidable suit return nBid = BID_1NT; // NCR Hardcoded ??? vs get cheapest }else{ nBid = bidState.GetCheapestShiftBid(nSuit, nTopBid); } // NCR-415 Test if safe bid if (!bidState.IsBidSafe(nBid, bidState.fDistPts) // NCR-592 set adj to dist pts && (bidState.nRHOBid > BID_PASS) ) // NCR-637 Only if RHO bid { nBid = BID_PASS; status << "NEGDTR36! With a total of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership, we cannot safely bid further, so pass.\n"; } // end NCR-415 else { if (!ISMAJOR(nSuit)) status << "NEGDTR40! Unfortunately we don't have a major to respond with, so bid " & BTS(nBid) & ".\n"; else status << "NEGDTR41! Our best response is " & BTS(nBid) & ".\n"; } bidState.SetBid(nBid); bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; }
// //=============================================================================== // // RespondToConvention() // // partner bid at the 2-level (strong 2 bid) // // in general, partner's opening 2-bid denotes an extremely // powerful hand. So the question is whether to try for game // or slam. Therefore, we respond positively if we want attempt // a slam, or negatively for game // BOOL CStrongTwoBidsConvention::RespondToConvention(const CPlayer& player, const CConventionSet& conventions, CHandHoldings& hand, CCardLocation& cardLocation, CGuessedHandHoldings** ppGuessedHands, CBidEngine& bidState, CPlayerStatusDialog& status) { // first see if another convention is active if (bidState.GetActiveConvention()) return FALSE; // // Bidding in response to an opening strong 2 bid? check requirements // int nPartnersBid = bidState.nPartnersBid; int nPartnersBidLevel = bidState.nPartnersBidLevel; int nPartnersSuit = bidState.nPartnersSuit; int nPartnersSuitSupport = bidState.nPartnersSuitSupport; int numSupportCards = bidState.numSupportCards; int numPartnerBidsMade = bidState.m_numPartnerBidsMade; // // // partner must've bid at the 2 level, but not 2C, // and partner's bid must have been the first bid made // if ((nPartnersBidLevel == 2) && (nPartnersBid != BID_2C) && (bidState.m_bPartnerOpenedForTeam) && (numPartnerBidsMade == 1) && (nPartnersBid == pDOC->GetValidBidRecord(0))) { // okay, met requirements } else { // return FALSE; } // int nBid; double fPts = bidState.fPts; double fAdjPts = bidState.fAdjPts; double fCardPts = bidState.fCardPts; int nPrefSuit = bidState.nPrefSuit; int numPrefSuitCards = bidState.numPrefSuitCards; double numQuickTricks = bidState.numQuickTricks; // state expectations bidState.m_fPartnersMin = 16; bidState.m_fPartnersMax = 22; status << "RSTRT! Partner made a strong 2-bid, showing a very good suit or two solid suits, 9+ playing tricks, and 4+ quick tricks. We have to respond positively if interested in slam, or negatively otherwise.\n"; // set partnership point count minimums & maximums bidState.m_fMinTPPoints = fAdjPts + bidState.m_fPartnersMin; bidState.m_fMaxTPPoints = fAdjPts + bidState.m_fPartnersMax; bidState.m_fMinTPCPoints = fCardPts + bidState.m_fPartnersMin; bidState.m_fMaxTPCPoints = fCardPts + bidState.m_fPartnersMax; // the bid is forcing to game bidState.m_bGameForceActive = TRUE; // // if we have less than 1 Quick trick, respond negatively // if (numQuickTricks < 1.0) { nBid = BID_2NT; status << "RSTRT10! But with only " & numQuickTricks & " QT's, we have to make the negative response of " & BTS(nBid) & " to deny slam values.\n"; bidState.SetBid(nBid); return TRUE; } // // else we have >= 1 Quick trick, so respond positively // status << "2RSTRT20! We have " & numQuickTricks & " QT's, so we can make a positive response.\n"; // if we have even half-decent support for partner's suit, show it if (nPartnersSuitSupport >= SS_WEAK_SUPPORT) { nBid = MAKEBID(nPartnersSuit,3); status << "RSTRT22! And we have " & bidState.SLTS(nPartnersSuit) & " support for partner's long " & bidState.szPSS & " suit (holding " & bidState.szHP & "), so raise partner's bid to " & BTS(nBid) & ".\n"; } else if ((nPrefSuit != nPartnersSuit) && (bidState.nPrefSuitStrength >= SS_OPENABLE) && (numPrefSuitCards >= 5)) { // or show our own suit if we have a good 5+ suiter int nSuit = nPrefSuit; // jump shift if the suits is really strong if (bidState.nPrefSuitStrength >= SS_ABSOLUTE) { nBid = bidState.GetJumpShiftBid(nSuit,nPartnersBid); status << "RSTRT24! We lack good support for partner's " & bidState.szPSS & " suit (holding " & bidState.szHP & "), but we have an excellent " & bidState.LEN(nSuit) & "-card suit of our own in " & STS(nSuit) & " (holding " & bidState.SHTS(nSuit) & "), so show it in a bid of " & BTS(nBid) & ".\n"; } else { nBid = bidState.GetCheapestShiftBid(nSuit); status << "RSTRT26! But we lack good support for partner's " & bidState.szPSS & " suit (holding " & bidState.szHP & "), so show our preferred " & bidState.LEN(nSuit) & "-card " & STSS(nSuit) & " suit in a bid of " & BTS(nBid) & ".\n"; } } else if ((bidState.bBalanced) && (bidState.m_fMinTPCPoints >= 26)) { // here, we lack good support for partner's suit, and don't have a good // suit of our own. so we jump to 3NT if we have a // balanced hand & 26+ total HCPs nBid = BID_3NT; status << "RSTRT28! But we lack good support for partner's " & bidState.szPSS & " suit (holding " & bidState.szHP & ") with a balanced hand, so jump to " & BTS(nBid) & ".\n"; } else { // here, we don't have good support for partner's // suit, nor a good suit of our own, nor a balanced // hand. So bid 2NT in a negative response. nBid = BID_2NT; status << "RSTRT40! But unfortunately we have poor support for partner's " & bidState.szPSS & " suit (holding " & bidState.szHP & "), no good suit of our own, and an unbalanced hand, so we have to make the negative response of " & BTS(nBid) & ".\n"; } // bidState.SetBid(nBid); return TRUE; }
// //----------------------------------------------------- // // respond to partner's Jacoby 2NT Bid // BOOL CJacoby2NTConvention::RespondToConvention(const CPlayer& player, const CConventionSet& conventions, CHandHoldings& hand, CCardLocation& cardLocation, CGuessedHandHoldings** ppGuessedHands, CBidEngine& bidState, CPlayerStatusDialog& status) { // first see if another convention is active if ((bidState.GetActiveConvention() != NULL) && (bidState.GetActiveConvention() != this)) return FALSE; // // make a responding bid // int nPartnersBid = bidState.nPartnersBid; int nPreviousBid = bidState.nPreviousBid; int numTotalBidTurns = pDOC->GetNumBidsMade(); // int nBid; double fPts = bidState.fPts; double fCardPts = bidState.fCardPts; // // see what round this is // int nStatus = bidState.GetConventionStatus(this); if (nStatus == CONV_INACTIVE) { // // Bidding in response to partner's Jacoby 2NT bid? // // the requirements for a Jacoby 2NT Bid are: // 1: we must have opened the bidding with 1 of a major // 2: Partner responded with 2NT int nOpeningBid = pDOC->GetOpeningBid(); // test conditions if ( (bidState.m_numBidTurns == 1) && (ISMAJOR(BID_SUIT(nPreviousBid))) && (nOpeningBid == nPreviousBid) && (BID_LEVEL(nPreviousBid) == 1) && (bidState.nPartnersBid == BID_2NT) ) { // passed the test } else { return FALSE; } status << "J2N20! Partner has made a Jacoby 2NT inquiry bid, indicating " & OPEN_PTS(13) & " pts and 4+ card support.\n"; // adjust points as declarer int nSuit = bidState.nPreviousSuit; bidState.SetAgreedSuit(nSuit); fPts = bidState.fAdjPts = hand.RevalueHand(REVALUE_DECLARER, nSuit, TRUE); // partner has 13+ pts bidState.AdjustPartnershipPoints(13, 13); // // our options are as follows, in order: // // - with 18+ pts, rebid the suit at the 3 level // - with 15-17 pts and a strong 5-card side suit, bid that suit at the 4-level // - with 15-17 pts and a short suit, bid the short suit at the 3 level // - with 15-17 pts an no short suit, bid 3NT // - otherwise, sign off in game at the 4-level // check point count if (fPts >= 18) { nBid = MAKEBID(nSuit, 3); status << "J2N21! With " & fPts & " points in hand, " "respond to partner's Jacoby 2NT inquiry with a bid of " & BTS(nBid) & ".\n"; } else if (fPts >= 15) { // see if we have a strong side suit int nSideSuit = NONE; for(int i=0;i<4;i++) { if ((i != nSuit) && (bidState.nSuitStrength[i] <= SS_STRONG) && (bidState.numCardsInSuit[i] >= 5)) break; } // if (i < 4) { // bid the suit at the 4 level nSuit = i; nBid = MAKEBID(nSuit, 4); status << "J2N22! With " & fPts & " points in hand and a good " & bidState.numCardsInSuit[nSuit] & "-card suit in " & STS(nSuit) & ", respond to partner's Jacoby 2NT inquiry with " & BTS(nBid) & ".\n"; } else if (bidState.numVoids >= 1) { // bid the void suit for(nSuit=0;nSuit<4;nSuit++) { if (bidState.numCardsInSuit[nSuit] == 0) break; } nBid = MAKEBID(nSuit, 3); status << "J2N24! With " & fPts & " points in hand and a void suit in " & STS(nSuit) & ", respond to partner's Jacoby 2NT inquiry with a bid of " & BTS(nBid) & ".\n"; } else if (bidState.numSingletons >= 1) { // bid the singleton for(nSuit=0;nSuit<4;nSuit++) { if (bidState.numCardsInSuit[nSuit] == 1) break; } nBid = MAKEBID(nSuit, 3); status << "J2N26! With " & fPts & " points in hand and a singleton in " & STS(nSuit) & ", respond to partner's Jacoby 2NT inquiry with a bid of " & BTS(nBid) & ".\n"; } else { // bid 3NT nBid = BID_3NT; status << "J2N28! With " & fPts & " points in hand and no short suits, " " respond to partner's Jacoby 2NT inquiry with a bid of " & BTS(nBid) & ".\n"; } } else { // sign off at the 4-level nBid = MAKEBID(nSuit, 4); status << "J2N31! With only " & fPts & " points in hand, sign off in game at " & BTS(nBid) & ".\n"; } // and return bidState.SetBid(nBid); bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } // return FALSE; }
// //----------------------------------------------------- // // respond to partner's Michaels Cue Bid // BOOL CMichaelsCueBidConvention::RespondToConvention(const CPlayer& player, const CConventionSet& conventions, CHandHoldings& hand, CCardLocation& cardLocation, CGuessedHandHoldings** ppGuessedHands, CBidEngine& bidState, CPlayerStatusDialog& status) { // first see if another convention is active if ((bidState.GetActiveConvention() != NULL) && (bidState.GetActiveConvention() != this)) return FALSE; // // make a responding bid // int nPartnersBid = bidState.nPartnersBid; int nPartnersBidLevel = bidState.nPartnersBidLevel; int nPartnersSuit = bidState.nPartnersSuit; int nPartnersPrevSuit = bidState.nPartnersPrevSuit; // int nBid, nSuit; double fPts = bidState.fPts; double fCardPts = bidState.fCardPts; // // see what round this is // int nStatus = bidState.GetConventionStatus(this); if (nStatus == CONV_INACTIVE) { // // Bidding in response to partner's Michael's bid? check requirements // // the identifying marks of a Michaels bid are: // 1: we must not have bid yet // 2: LHO must have bid a suit at the 1 level, and // 3: partner overcalled LHO's suit at the 2 level int nLastValidBid = pDOC->GetLastValidBid(); // apply tests #1, 2, and 3 int nOpeningBid = pDOC->GetOpeningBid(); int nOpeningBidder = pDOC->GetOpeningBidder(); BOOL bLHOMajor = ISMAJOR(nOpeningBid); if (ISBID(nOpeningBid) && (GetPlayerTeam(nOpeningBidder) != player.GetTeam()) && ((nOpeningBid >= BID_1C) && (nOpeningBid <= BID_1S)) && (nPartnersSuit == bidState.nLHOSuit) && (nPartnersBidLevel == 2) && (bidState.m_numBidsMade == 0) ) { // status << "MCLR10! Partner has made a Michaels Cue bid of " & BTS(nPartnersBid) & ", indicating 5/5 length in " & (bLHOMajor? ((bidState.nLHOSuit == HEARTS)? "Spades and a minor" : "Hearts and a minor") : "the majors") & ".\n"; } else { return FALSE; } // did partner bid a minor, indicating both majors? if (ISMINOR(nPartnersSuit)) { // Pard has both majors -- pick the preferred one nSuit = bidState.PickSuperiorSuit(HEARTS, SPADES); if (hand.GetNumCardsInSuit(nSuit) < 3) { // should have at least 3 trumps int nOtherSuit = (nSuit == HEARTS)? SPADES : HEARTS; if (hand.GetNumCardsInSuit(nOtherSuit) >= 3) nSuit = nOtherSuit; } } else if (nPartnersSuit == HEARTS) { // pard has Spades + a minor // see if Spades are decent (3-card support) // if ((hand.GetNumCardsInSuit(SPADES) >= 3) && (hand.GetSuitStrength(SPADES) >= SS_MODERATE_SUPPORT)) if (hand.GetNumCardsInSuit(SPADES) >= 3) { // fine, go with Spades nSuit = SPADES; } else { // Spades are too weak; look for a minor if ((hand.GetSuitStrength(CLUBS) >= SS_MODERATE_SUPPORT) || (hand.GetSuitStrength(DIAMONDS) >= SS_MODERATE_SUPPORT)) nSuit = NOTRUMP; else nSuit = SPADES; // minors are no good either, so go with Spades } } else { // pard has Hearts + a minor // see if Hearts are decent (3-card support) // if ((hand.GetNumCardsInSuit(HEARTS) >= 3) && (hand.GetSuitStrength(HEARTS) >= SS_MODERATE_SUPPORT)) if (hand.GetNumCardsInSuit(HEARTS) >= 3) { // fine, go with Hearts nSuit = HEARTS; } else { // Spades are too weak; look for a minor if ((hand.GetSuitStrength(CLUBS) >= SS_MODERATE_SUPPORT) || (hand.GetSuitStrength(DIAMONDS) >= SS_MODERATE_SUPPORT)) nSuit = NOTRUMP; else nSuit = HEARTS; // minors are no good either, so go with Hearts } } // now adjust point count if (ISSUIT(nSuit)) { bidState.SetAgreedSuit(nSuit); fPts = bidState.fAdjPts = hand.RevalueHand(REVALUE_DECLARER, nSuit, TRUE); } // partner may have 6-11 OR 17+ pts; assume it's a weak hand bidState.AdjustPartnershipPoints(6, 11); // and make a responding bid CString strChoices = ISMINOR(nPartnersSuit)? "the two majors" : (nPartnersSuit == HEARTS)? "Spades and a minor" : "Hearts and an unknown minor"; int numTrumps = ISSUIT(nSuit)? hand.GetNumCardsInSuit(nSuit) : 0; // set initial convention status to finished bidState.SetConventionStatus(this, CONV_FINISHED); // see if we need to look at the minor if (nSuit == NOTRUMP) { // bid 2NT to ask for the minor nBid = BID_2NT; if (nBid > nLastValidBid) { if (nPartnersSuit == HEARTS) status << "MCLR12! Given a choice between a " & hand.GetNumCardsInSuit(SPADES) & "-card Spade suit and an unknown minor, we're forced to ask for the minor by bidding " & BTS(nBid) & ".\n"; else status << "MCLR12! Given a choice between a " & hand.GetNumCardsInSuit(HEARTS) & "-card Heart suit and an unknown minor, we're forced to ask for the minor by bidding " & BTS(nBid) & ".\n"; // this convention will go another round bidState.SetConventionStatus(this, CONV_RESPONDED_ROUND1); } else { nBid = BID_PASS; status << "MCLR13! We'd like to bid 2NT to ask for partner's minor, but we can't do so after RHO's interference, so we have to pass.\n"; } } else if ((numTrumps >= 5) && (bidState.m_fMinTPPoints <= PT_COUNT(20)) && ISMAJOR(nSuit) && (MAKEBID(nSuit, 4) > nLastValidBid)) { // make a preemptive bid if possible nBid = MAKEBID(nSuit, 4); status << "MCLR15! With " & numTrumps & " " & STS(nSuit) & " and a total of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership, make a shutout bid in " & STS(nSuit) & " by jumping to " & BTS(nBid) & ".\n"; } else if (bidState.m_fMinTPPoints <= PT_COUNT(21)) { // respond at the 2-level nBid = bidState.GetCheapestShiftBid(nSuit, nLastValidBid); if (BID_LEVEL(nBid) == 2) { status << "MCLR20! Given a choice between " & strChoices & ", respond to partner's Michaels with the preferred " & STSS(nSuit) & " suit with a bid of " & BTS(nBid) & ".\n"; } else { nBid = BID_PASS; status << "MCLR21! After RHO interference, we don't have the points to go to the 3-level in response to partner's Michaels, so pass.\n"; } } else if (bidState.m_fMinTPPoints <= PT_COUNT(24)) { // bid at the 3-level nBid = MAKEBID(nSuit, 3); if (nBid > nLastValidBid) { status << "MCLR24! With a total of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership and a choice between " & strChoices & ", invite game in " & STS(nSuit) & " by jumping to " & BTS(nBid) & ".\n"; } else { nBid = BID_PASS; status << "MCLR25! After RHO interference, we don't have the points to go to the 4-level in response to partner's Michaels, so pass.\n"; } } else if (ISMINOR(nSuit) && (bidState.m_fMinTPPoints <= PT_COUNT(27))) { // with 25+ pts, bid game nBid = bidState.GetGameBid(nSuit); if (nBid > nLastValidBid) { status << "MCLR27! With a total of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership and a choice between " & strChoices & ", jump to the 4-level in " & STS(nSuit) & " with a bid of " & BTS(nBid) & ".\n"; } else { nBid = BID_PASS; status << "MCLR28! After RHO interference, we don't have the points to go to the 5-level in response to partner's Michaels, so pass.\n"; } } else { // with 25+ pts in a major, or 28+ pts in a minor, bid game nBid = bidState.GetGameBid(nSuit); if (nBid > nLastValidBid) { status << "MCLR30! With a total of " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership and a choice between " & strChoices & ", jump to game in " & STS(nSuit) & " at " & BTS(nBid) & ".\n"; } else { nBid = BID_PASS; status << "MCLR31! After RHO interference, we don't want to bid past game, so pass.\n"; } } // done! bidState.SetBid(nBid); return TRUE; } else if (nStatus == CONV_RESPONDED_ROUND1) { // // round 2 -- we must've bid 2NT last time to ask for partner's minor // // see if partner cue bid the enemy suit again if (nPartnersSuit == nPartnersPrevSuit) { // partner has 17+ pts bidState.AdjustPartnershipPoints(OPEN_PTS(17), MIN(17,40 - bidState.fCardPts)); // bid 4NT to ask for the minor again if (fPts >= PT_COUNT(15)) { // else make a natural game bid nBid = BID_4NT; status << "MCLR35! Partner cue bid the enemy suit again, indicating a strong Michaels opening hand with " & OPEN_PTS(17) & "+ pts; so with " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership, ask for the other minor by bidding " & BTS(nBid) & ".\n"; bidState.SetConventionStatus(this, CONV_RESPONDED_ROUND2); } else { // else make a natural 3NT game bid nBid = BID_3NT; status << "MCLR36! Partner cue bid the enemy suit again, indicating a strong Michaels opening hand with " & OPEN_PTS(17) & "+ pts; but with " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership, stop at game with a natural bid of " & BTS(nBid) & ".\n"; bidState.SetConventionStatus(this, CONV_FINISHED); } // done bidState.SetBid(nBid); return TRUE; } // see if partner's bid is valid if (!ISMINOR(nPartnersSuit)) { status << "MCLR40! After his opening Michaels Cue Bid, partner did not respond properly to our 2NT minor suit inquiry, so michaels is off.\n"; bidState.SetConventionStatus(this, CONV_ERROR); return FALSE; } // see if we can live with partner's minor int nAgreedSuit; if (hand.GetNumCardsInSuit(nPartnersSuit) >= 3) { // stick with the minor status << "4MCLR41! Since we have " & hand.GetNumCardsInSuit(nPartnersSuit) & " cards in the " & STSS(nPartnersSuit) & " suit, choose that suit for our response.\n"; nAgreedSuit = nPartnersSuit; } else { // minor's not so great; select the better of the minor or the major nAgreedSuit = bidState.PickSuperiorSuit(nPartnersSuit, bidState.nPartnersPrevSuit); if (nAgreedSuit == nPartnersSuit) status << "4MCLR42! The " & STSS(nPartnersSuit) & " suit isn't great, but it's better than " & STS(bidState.nPartnersPrevSuit) & ", so choose that suit for our response.\n"; else status << "4MCLR43! The " & STSS(nPartnersSuit) & " suit is poor, so pick the major suit ("& STS(bidState.nPartnersPrevSuit) & ") for our response.\n"; bidState.SetAgreedSuit(bidState.PickSuperiorSuit(nPartnersSuit, bidState.nPartnersPrevSuit)); } // recalc points as dummy bidState.SetAgreedSuit(nAgreedSuit); fPts = bidState.fAdjPts = hand.RevalueHand(REVALUE_DECLARER, nAgreedSuit, TRUE); bidState.AdjustPartnershipPoints(); // select the bid level if (ISMINOR(nAgreedSuit)) { // Clubs or Diamonds if (bidState.m_fMinTPPoints <= PTS_MINOR_GAME-6) // <= 22 nBid = BID_PASS; else if (bidState.m_fMinTPPoints <= PTS_MINOR_GAME-4) // <= 24 nBid = MAKEBID(nPartnersBid, 4); else nBid = MAKEBID(nPartnersBid, 5); // go for game // if (nBid == BID_PASS) status << "MCLR45! Partner showed his minor to be " & STS(nPartnersSuit) & ", which we can support with " & hand.GetNumCardsInSuit(nPartnersSuit) & " trumps, but with only " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership, we have to pass.\n"; else status << "MCLR46! Partner showed his minor to be " & STS(nPartnersSuit) & ", which we can support with " & hand.GetNumCardsInSuit(nPartnersSuit) & " trumps, so with " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership, we bid " & BTS(nBid) & ".\n"; } else { // sticking with the major (though not a very good one!) // sign off at the 3-level or go to game if (bidState.m_fMinTPPoints < PTS_MAJOR_GAME) // < 25 nBid = MAKEBID(nPartnersBid, 3); else nBid = MAKEBID(nPartnersBid, 4); // if (BID_LEVEL(nBid) == 3) status << "MCLR47! With " & hand.GetNumCardsInSuit(nAgreedSuit) & "-card support for partner's " & STS(nAgreedSuit) & ", and with only " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership, we have to pass.\n"; else status << "MCLR47! With " & hand.GetNumCardsInSuit(nAgreedSuit) & "-card support for partner's " & STS(nAgreedSuit) & ", and with " & bidState.m_fMinTPPoints & "-" & bidState.m_fMaxTPPoints & " pts in the partnership, we can go to game at " & BTS(nBid) & ".\n"; } // done! bidState.SetBid(nBid); bidState.SetConventionStatus(this, CONV_FINISHED); return TRUE; } else if (nStatus == CONV_RESPONDED_ROUND2) { // // round 3 -- we must've bid 4NT last time to ask for partner's minor // after partner's second Michaels cue bid // } // return FALSE; }