int AIAction::clickMultiAct(vector<Targetable*>& actionTargets) { GameObserver * g = owner->getObserver(); TargetChooser * tc = g->getCurrentTargetChooser(); if(!tc) return 0; vector<Targetable*>::iterator ite = actionTargets.begin(); while(ite != actionTargets.end()) { MTGCardInstance * card = ((MTGCardInstance *) (*ite)); if(card == (MTGCardInstance*)tc->source)//click source first. { g->cardClick(card); ite = actionTargets.erase(ite); continue; } ++ite; } //shuffle to make it less predictable, otherwise ai will always seem to target from right to left. making it very obvious. owner->getRandomGenerator()->random_shuffle(actionTargets.begin(), actionTargets.end()); for(int k = 0 ;k < int(actionTargets.size()) && k < tc->maxtargets; k++) { if (MTGCardInstance * card = dynamic_cast<MTGCardInstance *>(actionTargets[k])) { if(k+1 == int(actionTargets.size())) tc->done = true; g->cardClick(card); } } tc->attemptsToFill++; return 1; }
int AIAction::Act() { GameObserver * g = owner->getObserver(); if (player && !playerAbilityTarget) { g->cardClick(NULL, player); return 1; } if (ability) { g->cardClick(click, ability); if (target && !mAbilityTargets.size()) { g->cardClick(target); return 1; } else if(playerAbilityTarget && !mAbilityTargets.size()) { g->cardClick(NULL,(Player*)playerAbilityTarget); return 1; } if(mAbilityTargets.size()) { return clickMultiAct(mAbilityTargets); } } else if(mAbilityTargets.size()) { return clickMultiAct(mAbilityTargets); } else if (click) { //Shouldn't be used, really... g->cardClick(click, click); if (target) g->cardClick(target); return 1; } return 0; }