diff --git a/projects/mtg/include/AIHints.h b/projects/mtg/include/AIHints.h index 6591b63b2..e15b64dfe 100644 --- a/projects/mtg/include/AIHints.h +++ b/projects/mtg/include/AIHints.h @@ -19,6 +19,8 @@ public: string mAction; string mCombatAttackTip; string mCombatBlockTip; + string mCombatAlwaysBlockTip; + string mCombatAlwaysAttackTip; vectorcastOrder; vectorcombos; //for preformance we disect the combo on first run. @@ -50,7 +52,9 @@ public: AIHints (AIPlayerBaka * player); AIAction * suggestAbility(ManaCost * potentialMana); bool HintSaysDontAttack(GameObserver* observer,MTGCardInstance * card = NULL); + bool HintSaysAlwaysAttack(GameObserver* observer,MTGCardInstance * card = NULL); bool HintSaysDontBlock(GameObserver* observer,MTGCardInstance * card = NULL); + bool HintSaysAlwaysBlock(GameObserver* observer,MTGCardInstance * card = NULL); bool HintSaysItsForCombo(GameObserver* observer,MTGCardInstance * card = NULL); bool canWeCombo(GameObserver* observer,MTGCardInstance * card = NULL,AIPlayerBaka * Ai = NULL); vector mCastOrder(); diff --git a/projects/mtg/src/AIHints.cpp b/projects/mtg/src/AIHints.cpp index 8207cc567..1428e1a91 100644 --- a/projects/mtg/src/AIHints.cpp +++ b/projects/mtg/src/AIHints.cpp @@ -36,12 +36,24 @@ AIHint::AIHint(string _line) mCombatAttackTip = splitDontAttack[1]; } + vector splitAlwaysAttack = parseBetween(action, "alwaysattackwith(", ")"); + if(splitAlwaysAttack.size()) + { + mCombatAlwaysAttackTip = splitAlwaysAttack[1]; + } + vector splitDontBlock = parseBetween(action, "dontblockwith(", ")"); if(splitDontBlock.size()) { mCombatBlockTip = splitDontBlock[1]; } + vector splitAlwaysBlock = parseBetween(action, "alwaysblockwith(", ")"); + if(splitAlwaysBlock.size()) + { + mCombatAlwaysBlockTip = splitAlwaysBlock[1]; + } + vector splitCastOrder = parseBetween(action, "castpriority(", ")"); if(splitCastOrder.size()) { @@ -106,6 +118,26 @@ bool AIHints::HintSaysDontAttack(GameObserver* observer,MTGCardInstance * card) return false; } +bool AIHints::HintSaysAlwaysAttack(GameObserver* observer,MTGCardInstance * card) +{ + TargetChooserFactory tfc(observer); + TargetChooser * hintTc = NULL; + for(unsigned int i = 0; i < hints.size();i++) + { + if (hints[i]->mCombatAlwaysAttackTip.size()) + { + hintTc = tfc.createTargetChooser(hints[i]->mCombatAlwaysAttackTip,card); + if(hintTc && hintTc->canTarget(card,true)) + { + SAFE_DELETE(hintTc); + return true; + } + SAFE_DELETE(hintTc); + } + } + return false; +} + bool AIHints::HintSaysDontBlock(GameObserver* observer,MTGCardInstance * card) { TargetChooserFactory tfc(observer); @@ -126,6 +158,26 @@ bool AIHints::HintSaysDontBlock(GameObserver* observer,MTGCardInstance * card) return false; } +bool AIHints::HintSaysAlwaysBlock(GameObserver* observer,MTGCardInstance * card) +{ + TargetChooserFactory tfc(observer); + TargetChooser * hintTc = NULL; + for(unsigned int i = 0; i < hints.size();i++) + { + if (hints[i]->mCombatAlwaysBlockTip.size()) + { + hintTc = tfc.createTargetChooser(hints[i]->mCombatAlwaysBlockTip,card); + if(hintTc && hintTc->canTarget(card,true)) + { + SAFE_DELETE(hintTc); + return true; + } + SAFE_DELETE(hintTc); + } + } + return false; +} + bool AIHints::HintSaysItsForCombo(GameObserver* observer,MTGCardInstance * card) { TargetChooserFactory tfc(observer); diff --git a/projects/mtg/src/AIPlayerBaka.cpp b/projects/mtg/src/AIPlayerBaka.cpp index 33a66c45e..8547fcea9 100644 --- a/projects/mtg/src/AIPlayerBaka.cpp +++ b/projects/mtg/src/AIPlayerBaka.cpp @@ -2219,6 +2219,17 @@ int AIPlayerBaka::chooseAttackers() || (myForce > opponentForce) || (myForce > opponent()->life); } printf("Choose attackers : %i %i %i %i -> %i\n", opponentForce, opponentCreatures, myForce, myCreatures, attack); + + CardDescriptor cd; + cd.init(); + cd.setType("creature"); + MTGCardInstance * card = NULL; + while ((card = cd.nextmatch(game->inPlay, card))) + { + if(hints && hints->HintSaysAlwaysAttack(observer,card)) + observer->cardClick(card, MTGAbility::MTG_ATTACK_RULE); + } + if (attack) { CardDescriptor cd; @@ -2238,6 +2249,8 @@ int AIPlayerBaka::chooseAttackers() /* Can I first strike my oponent and get away with murder ? */ int AIPlayerBaka::canFirstStrikeKill(MTGCardInstance * card, MTGCardInstance *ennemy) { + if(hints && hints->HintSaysAlwaysBlock(observer,ennemy)) + return 1; if (ennemy->has(Constants::FIRSTSTRIKE) || ennemy->has(Constants::DOUBLESTRIKE)) return 0; if (!(card->has(Constants::FIRSTSTRIKE) || card->has(Constants::DOUBLESTRIKE)))