void AIStats::updateStatsCard(MTGCardInstance * cardInstance, Damage * damage, float multiplier) { MTGCard * card = cardInstance->model; if (!card) return; //card can be null because some special cardInstances (such as ExtraRules) don't have a "model" AIStat * stat = find(card); if (!stat) { stat = NEW AIStat(card->getMTGId(), 0, 1, 0); stats.push_back(stat); } if (damage->target == player) { stat->value += static_cast<int>(multiplier * STATS_PLAYER_MULTIPLIER * damage->damage); } else if (damage->target->type_as_damageable == Damageable::DAMAGEABLE_MTGCARDINSTANCE) { MTGCardInstance * target = (MTGCardInstance *) damage->target; if (target->controller() == player && !target->isInPlay(player->getObserver())) { //One of my creatures got lethal damage... stat->value += static_cast<int>(multiplier * STATS_CREATURE_MULTIPLIER * damage->damage); } } }
void GameStateShop::purchaseCard(int controlId) { MTGCard * c = srcCards->getCard(controlId - BOOSTER_SLOTS); if (!c || !c->data || playerdata->credits - mPrices[controlId] < 0) return; myCollection->Add(c); int price = mPrices[controlId]; pricelist->setPrice(c->getMTGId(), price); // In case they changed their minds after cancelling. playerdata->credits -= price; //Update prices int rnd; switch (options[Options::ECON_DIFFICULTY].number) { case Constants::ECON_HARD: rnd = rand() % 50; break; case Constants::ECON_EASY: rnd = rand() % 10; break; default: rnd = rand() % 25; break; } price = price + (rnd * price) / 100; pricelist->setPrice(c->getMTGId(), price); mPrices[controlId] = pricelist->getPurchasePrice(c->getMTGId()); //Prices go up immediately. mInventory[controlId]--; updateCounts(); mTouched = true; menu->Close(); }
//the following tells ai if a creature should be blocked or targeted bool AIStats::isInTop(MTGCardInstance * card, unsigned int max, bool tooSmallCountsForTrue) { //return true; //uncomment the above return to make Ai always multiblock your creatures. if (stats.size() < max) return tooSmallCountsForTrue; unsigned int n = 0; MTGCard * source = card->model; int id = source->getMTGId(); list<AIStat *>::iterator it; for (it = stats.begin(); it != stats.end(); ++it) { if (n >= max) return false; AIStat * stat = *it; if (stat->source == id) { if ((stat->value + card->DangerRanking()) >= 3) return true; return false; } n++; } return false; }
void GameStateShop::cancelCard(int controlId) { //Update prices MTGCard * c = srcCards->getCard(controlId - BOOSTER_SLOTS); if (!c || !c->data || playerdata->credits - mPrices[controlId] < 0) return; //We only care about their opinion if they /can/ buy it. int price = mPrices[controlId]; int rnd; switch (options[Options::ECON_DIFFICULTY].number) { case Constants::ECON_HARD: rnd = rand() % 10; break; case Constants::ECON_EASY: rnd = rand() % 50; break; default: rnd = rand() % 25; break; } price = price - (rnd * price) / 100; if (price < pricelist->getPrice(c->getMTGId())) //filters have a tendancy to increase the price instead of lowering it! pricelist->setPrice(c->getMTGId(), price); //Prices do not immediately go down when you ignore something. return; }
int Rules::getMTGId(string cardName) { int cardnb = atoi(cardName.c_str()); if (cardnb) return cardnb; if (cardName.compare("*") == 0) return -1; //Any card MTGCard * card = MTGCollection()->getCardByName(cardName); if (card) return card->getMTGId(); DebugTrace("RULES: Can't find card:" << cardName.c_str()); return 0; }
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 MTGCardInstance::copy(MTGCardInstance * card) { MTGCard * source = card->model; CardPrimitive * data = source->data; basicAbilities = card->basicAbilities; for (size_t i = 0; i < data->types.size(); i++) { types.push_back(data->types[i]); } colors = data->colors; manaCost.copy(data->getManaCost()); setText(""); //The text is retrieved from the data anyways setName(data->name); power = data->power; toughness = data->toughness; life = toughness; lifeOrig = life; magicText = data->magicText; spellTargetType = data->spellTargetType; alias = data->alias; //Now this is dirty... int backupid = mtgid; int castMethodBackUP = this->castMethod; mtgid = source->getId(); MTGCardInstance * oldStored = this->storedSourceCard; Spell * spell = NEW Spell(observer, this); observer = card->observer; AbilityFactory af(observer); af.addAbilities(observer->mLayers->actionLayer()->getMaxId(), spell); delete spell; mtgid = backupid; castMethod = castMethodBackUP; backupTargets = this->backupTargets; storedCard = oldStored; miracle = false; }
void GameStateShop::load() { for (int i = 0; i < BOOSTER_SLOTS; i++) { mBooster[i].randomize(packlist); mInventory[i] = 1 + rand() % mBooster[i].maxInventory(); mPrices[i] = pricelist->getOtherPrice(mBooster[i].basePrice()); } for (int i = BOOSTER_SLOTS; i < SHOP_ITEMS; i++) { MTGCard * c = NULL; if ((c = srcCards->getCard(i - BOOSTER_SLOTS)) == NULL) { mPrices[i] = 0; mCounts[i] = 0; mInventory[i] = 0; continue; } mPrices[i] = purchasePrice(i - BOOSTER_SLOTS); mCounts[i] = myCollection->countByName(c); switch (c->getRarity()) { case Constants::RARITY_C: mInventory[i] = 2 + rand() % 8; break; case Constants::RARITY_L: mInventory[i] = 100; break; default: //We're using some non-coded rarities (S) in cards.dat. case Constants::RARITY_U: mInventory[i] = 1 + rand() % 5; break; case Constants::RARITY_R: mInventory[i] = 1 + rand() % 2; break; } } }
int GameStateShop::purchasePrice(int offset) { MTGCard * c = NULL; if (!pricelist || !srcCards || (c = srcCards->getCard(offset)) == NULL) return 0; float price = (float) pricelist->getPurchasePrice(c->getMTGId()); int filteradd = srcCards->Size(true); filteradd = ((filteradd - srcCards->Size()) / filteradd); switch (options[Options::ECON_DIFFICULTY].number) { case Constants::ECON_EASY: filteradd /= 2; break; case Constants::ECON_HARD: filteradd *= 2; break; default: break; } return (int) (price + price * (filteradd * srcCards->filterFee())); }