Exemple #1
0
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);
        }
    }
}
Exemple #2
0
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();
}
Exemple #3
0
//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;
}
Exemple #4
0
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;
}
Exemple #5
0
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;
}
Exemple #6
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;
}
Exemple #7
0
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;
}
Exemple #8
0
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;
        }

    }
}
Exemple #9
0
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()));
}