AIPlayer * AIPlayerFactory::createAIPlayerTest(GameObserver *observer, MTGAllCards * collection, Player * opponent, string _folder) { char deckFile[512]; string avatarFilename; // default imagename char deckFileSmall[512]; string folder = _folder.size() ? _folder : "ai/baka/"; int deckid = 0; //random deck int nbdecks = 0; int found = 1; while (found && nbdecks < options[Options::AIDECKS_UNLOCKED].number) { found = 0; char buffer[512]; sprintf(buffer, "%sdeck%i.txt", folder.c_str(), nbdecks + 1); if (FileExists(buffer)) { found = 1; nbdecks++; } } if (!nbdecks) { if (_folder.size()) return createAIPlayerTest(observer, collection, opponent, ""); return NULL; } deckid = 1 + WRand() % (nbdecks); sprintf(deckFile, "%sdeck%i.txt", folder.c_str(), deckid); DeckMetaData *aiMeta = observer->getDeckManager()->getDeckMetaDataByFilename( deckFile, true); avatarFilename = aiMeta->getAvatarFilename(); sprintf(deckFileSmall, "ai_baka_deck%i", deckid); int deckSetting = EASY; if ( opponent ) { bool isOpponentAI = opponent->isAI() == 1; DeckMetaData *meta = observer->getDeckManager()->getDeckMetaDataByFilename( opponent->deckFile, isOpponentAI); if ( meta->getVictoryPercentage() >= 65) deckSetting = HARD; } // AIPlayerBaka will delete MTGDeck when it's time AIPlayerBaka * baka = opponent ? NEW AIPlayerBakaB(observer, deckFile, deckFileSmall, avatarFilename, NEW MTGDeck(deckFile, collection,0, deckSetting)) : NEW AIPlayerBaka(observer, deckFile, deckFileSmall, avatarFilename, NEW MTGDeck(deckFile, collection,0, deckSetting)); baka->deckId = deckid; baka->setObserver(observer); return baka; }
AIPlayer * AIPlayerFactory::createAIPlayer(GameObserver *observer, MTGAllCards * collection, Player * opponent, int deckid) { char deckFile[512]; string avatarFilename; // default imagename char deckFileSmall[512]; if (deckid == GameStateDuel::MENUITEM_EVIL_TWIN) { //Evil twin sprintf(deckFile, "%s", opponent->deckFile.c_str()); DebugTrace("Evil Twin => " << opponent->deckFile); avatarFilename = "avatar.jpg"; sprintf(deckFileSmall, "%s", "ai_baka_eviltwin"); } else { if (!deckid) { //random deck int nbdecks = MIN(AIPlayer::getTotalAIDecks(), options[Options::AIDECKS_UNLOCKED].number); if (!nbdecks) return NULL; deckid = 1 + WRand() % (nbdecks); } sprintf(deckFile, "ai/baka/deck%i.txt", deckid); DeckMetaData *aiMeta = observer->getDeckManager()->getDeckMetaDataByFilename( deckFile, true); avatarFilename = aiMeta->getAvatarFilename(); sprintf(deckFileSmall, "ai_baka_deck%i", deckid); } int deckSetting = EASY; if ( opponent ) { bool isOpponentAI = opponent->isAI() == 1; DeckMetaData *meta = observer->getDeckManager()->getDeckMetaDataByFilename( opponent->deckFile, isOpponentAI); if ( meta && meta->getVictoryPercentage() >= 65) deckSetting = HARD; } // AIPlayerBaka will delete MTGDeck when it's time AIPlayerBaka * baka = NEW AIPlayerBaka(observer, deckFile, deckFileSmall, avatarFilename, NEW MTGDeck(deckFile, collection,0, deckSetting)); baka->deckId = deckid; baka->comboHint = NULL; if (baka->opponent() && baka->opponent()->isHuman()) baka->setFastTimerMode(false); return baka; }
bool Player::parseLine(const string& s) { if(((Damageable*)this)->parseLine(s)) return true; size_t limiter = s.find("="); if (limiter == string::npos) limiter = s.find(":"); string areaS; if (limiter != string::npos) { areaS = s.substr(0, limiter); if (areaS.compare("manapool") == 0) { SAFE_DELETE(manaPool); manaPool = new ManaPool(this); ManaCost::parseManaCost(s.substr(limiter + 1), manaPool); return true; } else if (areaS.compare("mode") == 0) { this->playMode = (Player::Mode)atoi(s.substr(limiter + 1).c_str()); return true; } else if (areaS.compare("avatar") == 0) { mAvatarName = s.substr(limiter + 1); loadAvatar(mAvatarName, "bakaAvatar"); return true; } else if (areaS.compare("customphasering") == 0) { phaseRing = s.substr(limiter + 1); return true; } else if (areaS.compare("premade") == 0) { premade = (atoi(s.substr(limiter + 1).c_str())==1); return true; } else if (areaS.compare("deckfile") == 0) { deckFile = s.substr(limiter + 1); if(playMode == Player::MODE_AI) { sscanf(deckFile.c_str(), "ai/baka/deck%i.txt", &deckId); int deckSetting = EASY; if ( opponent() ) { bool isOpponentAI = opponent()->isAI() == 1; DeckMetaData *meta = observer->getDeckManager()->getDeckMetaDataByFilename( opponent()->deckFile, isOpponentAI); if ( meta && meta->getVictoryPercentage() >= 65) deckSetting = HARD; } SAFE_DELETE(mDeck); SAFE_DELETE(game); mDeck = NEW MTGDeck(deckFile.c_str(), MTGCollection(),0, deckSetting); game = NEW MTGPlayerCards(mDeck); // This automatically sets the observer pointer on all the deck cards game->setOwner(this); deckName = mDeck->meta_name; } return true; } else if (areaS.compare("deckfilesmall") == 0) { deckFileSmall = s.substr(limiter + 1); return true; } else if (areaS.compare("offerinterruptonphase") == 0) { for (int i = 0; i < NB_MTG_PHASES; i++) { string phaseStr = Constants::MTGPhaseCodeNames[i]; if (s.find(phaseStr) != string::npos) { offerInterruptOnPhase = PhaseRing::phaseStrToInt(phaseStr); return true; } } } } if(!game) { game = new MTGPlayerCards(); game->setOwner(this); } if(game->parseLine(s)) return true; return false; }