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; }
MTGDeck * Rules::buildDeck(int playerId) { int nbcards = 0; MTGDeck * deck = NEW MTGDeck(MTGCollection()); MTGGameZone * loadedPlayerZones[] = { initState.playerData[playerId].player->game->graveyard, initState.playerData[playerId].player->game->library, initState.playerData[playerId].player->game->hand, initState.playerData[playerId].player->game->inPlay }; for (int j = 0; j < 4; j++) { for (size_t k = 0; k < loadedPlayerZones[j]->cards.size(); k++) { int cardid = loadedPlayerZones[j]->cards[k]->getId(); deck->add(cardid); nbcards++; } } if (!nbcards) { delete (deck); return NULL; } return deck; }
Player * Rules::loadPlayerRandom(GameObserver* observer, int isAI, int mode) { int color1 = 1 + observer->getRandomGenerator()->random() % 5; int color2 = 1 + observer->getRandomGenerator()->random() % 5; int color0 = Constants::MTG_COLOR_ARTIFACT; if (mode == GAME_TYPE_RANDOM1) color2 = color1; int colors[] = { color1, color2, color0 }; int nbcolors = 3; string lands[] = { "forest", "forest", "island", "mountain", "swamp", "plains", "forest" }; MTGDeck * tempDeck = NEW MTGDeck(MTGCollection()); tempDeck->addRandomCards(9, 0, 0, -1, lands[color1].c_str()); tempDeck->addRandomCards(9, 0, 0, -1, lands[color2].c_str()); tempDeck->addRandomCards(1, 0, 0, 'U', "land"); tempDeck->addRandomCards(1, 0, 0, 'R', "land"); tempDeck->addRandomCards(12, 0, 0, -1, "creature", colors, nbcolors); tempDeck->addRandomCards(2, 0, 0, -1, "sorcery", colors, nbcolors); tempDeck->addRandomCards(2, 0, 0, -1, "enchantment", colors, nbcolors); tempDeck->addRandomCards(2, 0, 0, -1, "instant", colors, nbcolors); tempDeck->addRandomCards(2, 0, 0, -1, "artifact", colors, nbcolors); string deckFile = "random"; string deckFileSmall = "random"; Player *player = NULL; if (!isAI) // Human Player player = NEW HumanPlayer(observer, deckFile, deckFileSmall, false, tempDeck); else player = NEW AIPlayerBaka(observer, deckFile, deckFileSmall, "", tempDeck); return player; }
bool ShopBooster::unitTest() { //this tests the default random pack creation. MTGDeck * d = NEW MTGDeck(MTGCollection()); char result[1024]; randomStandard(); MTGPack * mP = MTGPacks::getDefault(); if(!altSet && mainSet->mPack) mP = mainSet->mPack; char buf[512]; if(!altSet) sprintf(buf,"set:%s;",mainSet->id.c_str()); else sprintf(buf,"set:%s;|set:%s;",mainSet->id.c_str(),altSet->id.c_str()); mP->pool = buf; mP->assemblePack(d); //Use the primary packfile. assemblePack deletes pool. DeckDataWrapper* ddw = NEW DeckDataWrapper(d); bool res = true; int u = 0, r = 0, s = 0; int card = 0; for(int i=0;i<ddw->Size(true);i++) { MTGCard * c = ddw->getCard(i); if(!c) break; if(c->getRarity() == Constants::RARITY_R || c->getRarity() == Constants::RARITY_M) r+=ddw->count(c); else if(c->getRarity() == Constants::RARITY_U) u+=ddw->count(c); else if(c->getRarity() == Constants::RARITY_S) s+=ddw->count(c); card++; } int count = ddw->getCount(); SAFE_DELETE(ddw); SAFE_DELETE(d); //Note: When there are special cards, the count IS going to be messed up, so do not perform the check for Rare and Uncommon in that case //also see http://code.google.com/p/wagic/issues/detail?id=644 if(!s && (r != 1 || u != 3) ) { sprintf(result, "<span class=\"error\">==Unexpected rarity count==</span><br />"); TestSuite::Log(result); res = false; } if(count < 14) { sprintf(result, "<span class=\"error\">==Unexpected card count==</span><br />"); TestSuite::Log(result); res = false; } sprintf(result, "<span class=\"success\">==Test Succesful !==</span><br />"); TestSuite::Log(result); SAFE_DELETE(ddw); SAFE_DELETE(d); return res; }
void StatsWrapper::updateStats(string filename, MTGAllCards *collection) { if (FileExists(filename)) { MTGDeck * mtgd = NEW MTGDeck(filename.c_str(), collection); DeckDataWrapper *deckDataWrapper = NEW DeckDataWrapper(mtgd); updateStats(deckDataWrapper); SAFE_DELETE( mtgd ); SAFE_DELETE( deckDataWrapper ); } }
Player::Player(GameObserver *observer, string file, string fileSmall, MTGDeck * deck) : Damageable(observer, 20), mAvatarName(""), offerInterruptOnPhase(MTG_PHASE_DRAW) { if(deck == NULL && file != "testsuite" && file != "remote" && file != "") deck = NEW MTGDeck(file.c_str(), MTGCollection()); premade = false; game = NULL; deckFile = file; deckFileSmall = fileSmall; handsize = 0; manaPool = NEW ManaPool(this); nomaxhandsize = false; poisonCount = 0; damageCount = 0; preventable = 0; mAvatarTex = NULL; type_as_damageable = DAMAGEABLE_PLAYER; playMode = MODE_HUMAN; skippingTurn = 0; extraTurn = 0; drawCounter = 0; epic = 0; forcefield = 0; raidcount = 0; handmodifier = 0; snowManaG = 0; snowManaR = 0; snowManaB = 0; snowManaU = 0; snowManaW = 0; snowManaC = 0; prowledTypes.clear(); doesntEmpty = NEW ManaCost(); poolDoesntEmpty = NEW ManaCost(); if (deck != NULL) { game = NEW MTGPlayerCards(deck); // This automatically sets the observer pointer on all the deck cards game->setOwner(this); deckName = deck->meta_name; } else { game = new MTGPlayerCards(); game->setOwner(this); } mDeck = deck; }
Player * Rules::loadPlayerMomir(GameObserver* observer, int isAI) { string deckFileSmall = "momir"; char empty[] = ""; MTGDeck * tempDeck = NEW MTGDeck(MTGCollection()); //Autogenerate a momir deck. Leave the "momir.txt" bits below for stats. tempDeck->addRandomCards(12, 0, 0, Constants::RARITY_L, "Forest"); tempDeck->addRandomCards(12, 0, 0, Constants::RARITY_L, "Plains"); tempDeck->addRandomCards(12, 0, 0, Constants::RARITY_L, "Swamp"); tempDeck->addRandomCards(12, 0, 0, Constants::RARITY_L, "Mountain"); tempDeck->addRandomCards(12, 0, 0, Constants::RARITY_L, "Island"); Player *player = NULL; if (!isAI) // Human Player player = NEW HumanPlayer(observer, options.profileFile("momir.txt", "", true).c_str(), deckFileSmall, false, tempDeck); else player = NEW AIMomirPlayer(observer, options.profileFile("momir.txt", "", true).c_str(), deckFileSmall, empty, tempDeck); return player; }
void GameSettings::createUsersFirstDeck(int setId) { if (theGame == NULL || MTGCollection() == NULL) return; MTGDeck *mCollection = NEW MTGDeck(options.profileFile(PLAYER_COLLECTION, "", false).c_str(), MTGCollection()); if (mCollection->totalCards() > 0) return; //10 lands of each int sets[] = { setId }; if (!mCollection->addRandomCards(10, sets, 1, Constants::RARITY_L, "Forest")) mCollection->addRandomCards(10, 0, 0, Constants::RARITY_L, "Forest"); if (!mCollection->addRandomCards(10, sets, 1, Constants::RARITY_L, "Plains")) mCollection->addRandomCards(10, 0, 0, Constants::RARITY_L, "Plains"); if (!mCollection->addRandomCards(10, sets, 1, Constants::RARITY_L, "Swamp")) mCollection->addRandomCards(10, 0, 0, Constants::RARITY_L, "Swamp"); if (!mCollection->addRandomCards(10, sets, 1, Constants::RARITY_L, "Mountain")) mCollection->addRandomCards(10, 0, 0, Constants::RARITY_L, "Mountain"); if (!mCollection->addRandomCards(10, sets, 1, Constants::RARITY_L, "Island")) mCollection->addRandomCards(10, 0, 0, Constants::RARITY_L, "Island"); //Starter Deck mCollection->addRandomCards(3, sets, 1, Constants::RARITY_R, NULL); mCollection->addRandomCards(9, sets, 1, Constants::RARITY_U, NULL); mCollection->addRandomCards(48, sets, 1, Constants::RARITY_C, NULL); //Boosters for (int i = 0; i < 2; i++) { mCollection->addRandomCards(1, sets, 1, Constants::RARITY_R); mCollection->addRandomCards(3, sets, 1, Constants::RARITY_U); mCollection->addRandomCards(11, sets, 1, Constants::RARITY_C); } mCollection->save(); SAFE_DELETE(mCollection); }
void GameStateShop::purchaseBooster(int controlId) { if (playerdata->credits - mPrices[controlId] < 0) return; playerdata->credits -= mPrices[controlId]; mInventory[controlId]--; SAFE_DELETE(booster); deleteDisplay(); booster = NEW MTGDeck(MTGCollection()); boosterDisplay = NEW BoosterDisplay(12, NULL, SCREEN_WIDTH - 200, SCREEN_HEIGHT / 2, this, NULL, 5); mBooster[controlId].addToDeck(booster, srcCards); string sort = mBooster[controlId].getSort(); DeckDataWrapper * ddw = NEW DeckDataWrapper(booster); if (sort == "alpha") ddw->Sort(WSrcCards::SORT_ALPHA); else if (sort == "collector") ddw->Sort(WSrcCards::SORT_COLLECTOR); else ddw->Sort(WSrcCards::SORT_RARITY); for (int x = 0; x < ddw->Size(); x++) { MTGCard * c = ddw->getCard(x); for (int copies = 0; copies < ddw->count(c); ++copies) { MTGCardInstance * ci = NEW MTGCardInstance(c, NULL); boosterDisplay->AddCard(ci); subBooster.push_back(ci); } } SAFE_DELETE(ddw); myCollection->loadMatches(booster); mTouched = true; save(true); menu->Close(); }
void Task::LoadAIDeckNames() { if (sAIDeckNames.empty()) { int found = 1; int nbDecks = 0; while (found) { found = 0; std::ostringstream stream; stream << "ai/baka" << "/deck" << nbDecks + 1 << ".txt"; if (fileExists(stream.str().c_str())) { found = 1; nbDecks++; // TODO: Creating MTGDeck only for getting decks name. Find an easier way. MTGDeck * mtgd = NEW MTGDeck(stream.str().c_str(), NULL, 1); sAIDeckNames.push_back(mtgd->meta_name); delete mtgd; } } } }
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; }
bool GameStateAwards::enterStats(int option) { if (option != Options::AWARD_COLLECTOR) return false; DeckDataWrapper* ddw = NEW DeckDataWrapper(NEW MTGDeck(options.profileFile(PLAYER_COLLECTION).c_str(), MTGCollection())); if (!ddw) return false; SAFE_DELETE(detailview); detailview = NEW WGuiList("Details"); detailview->Add(NEW WGuiHeader("Collection Stats")); detailview->Entering(JGE_BTN_NONE); //Discover favorite set if (setlist.size() > 0) { int * counts = (int*) calloc(setlist.size(), sizeof(int)); int setid = -1; int dupes = 0; MTGCard * many = NULL; MTGCard * costly = NULL; MTGCard * strong = NULL; MTGCard * tough = NULL; for (int t = 0; t < ddw->Size(); t++) { MTGCard * c = ddw->getCard(t); if (!c) continue; int count = ddw->count(c); if (!c->data->isLand() && (many == NULL || count > dupes)) { many = c; dupes = count; } counts[c->setId] += count; if (costly == NULL || c->data->getManaCost()->getConvertedCost() > costly->data->getManaCost()->getConvertedCost()) costly = c; if (c->data->isCreature() && (strong == NULL || c->data->getPower() > strong->data->getPower())) strong = c; if (c->data->isCreature() && (tough == NULL || c->data->getToughness() > tough->data->getToughness())) tough = c; } for (int i = 0; i < setlist.size(); i++) { if (setid < 0 || counts[i] > counts[setid]) setid = i; } free(counts); char buf[1024]; sprintf(buf, _("Total Value: %ic").c_str(), ddw->totalPrice()); detailview->Add(NEW WGuiItem(buf, WGuiItem::NO_TRANSLATE));//ddw->colors sprintf(buf, _("Total Cards (including duplicates): %i").c_str(), ddw->getCount(WSrcDeck::UNFILTERED_COPIES)); detailview->Add(NEW WGuiItem(buf, WGuiItem::NO_TRANSLATE));//ddw->colors sprintf(buf, _("Unique Cards: %i").c_str(), ddw->getCount(WSrcDeck::UNFILTERED_UNIQUE)); detailview->Add(NEW WGuiItem(buf, WGuiItem::NO_TRANSLATE)); if (many) { sprintf(buf, _("Most Duplicates: %i (%s)").c_str(), dupes, many->data->getName().c_str()); detailview->Add(NEW WGuiItem(buf, WGuiItem::NO_TRANSLATE)); } if (setid >= 0) { sprintf(buf, _("Favorite Set: %s").c_str(), setlist[setid].c_str()); detailview->Add(NEW WGuiItem(buf, WGuiItem::NO_TRANSLATE)); } if (costly) { sprintf(buf, _("Highest Mana Cost: %i (%s)").c_str(), costly->data->getManaCost()->getConvertedCost(), costly->data->getName().c_str()); detailview->Add(NEW WGuiItem(buf, WGuiItem::NO_TRANSLATE)); } if (strong) { sprintf(buf, _("Most Powerful: %i (%s)").c_str(), strong->data->getPower(), strong->data->getName().c_str()); detailview->Add(NEW WGuiItem(buf, WGuiItem::NO_TRANSLATE)); } if (tough) { sprintf(buf, _("Toughest: %i (%s)").c_str(), tough->data->getToughness(), strong->data->getName().c_str()); detailview->Add(NEW WGuiItem(buf, WGuiItem::NO_TRANSLATE)); } } SAFE_DELETE(ddw->parent); SAFE_DELETE(ddw); return true; }