示例#1
0
文件: engine.cpp 项目: na1x/DeCore
void Engine::init(DataReader& reader, const std::vector<Player*> players, const std::vector<GameObserver*>& observers)
{
    // check that engine is not initialized yet
    assert(!mPlayerIdCounter);
    assert(mGeneratedIds.empty());
    assert(mPlayers.empty());
    assert(!mDeck);
    assert(mGameObservers.empty());

    // read players count
    std::vector<const PlayerId*>::size_type playersCount;
    reader.read(playersCount);

    assert(players.size() == playersCount);
    // add players
    for (std::vector<Player*>::const_iterator it = players.begin(); it != players.end(); ++it) {
        add(**it);
    }

    const Card defaultCard(SUIT_LAST, RANK_LAST);
    // read each player cards
    for (std::vector<const PlayerId*>::const_iterator it = mGeneratedIds.begin(); it != mGeneratedIds.end(); ++it) {
        CardSet& playerCards = mPlayersCards[*it];
        assert(playerCards.empty());
        reader.read(playerCards, defaultCard);
        mPlayers[*it]->cardsRestored(playerCards);
    }

    // read deck
    Deck deck;
    reader.read(deck, defaultCard);
    Suit trumpSuit;
    reader.read(trumpSuit);
    deck.setTrumpSuit(trumpSuit);
    setDeck(deck);

    // read current player index
    unsigned int currentPlayerindex;
    reader.read(currentPlayerindex);
    mCurrentPlayer = mGeneratedIds[currentPlayerindex];
    // read current round index
    reader.read(mRoundIndex);

    bool roundRunning;
    reader.read(roundRunning);
    if (roundRunning) {
        mCurrentRoundIndex = &mRoundIndex;
        // read current round data
        std::vector<const PlayerId*>::size_type attackersAmount;
        reader.read(attackersAmount);

        while (attackersAmount--) {
            unsigned int attackerIndex;
            reader.read(attackerIndex);
            mAttackers.push_back(mGeneratedIds[attackerIndex]);
        }
        unsigned int defenderIndex;
        reader.read(defenderIndex);
        mDefender = mGeneratedIds[defenderIndex];
        reader.read(mPassedCounter);
        unsigned int currentRoundAttackerIndex;
        reader.read(currentRoundAttackerIndex);
        mCurrentRoundAttackerId = mGeneratedIds[currentRoundAttackerIndex];

        std::vector<Card> attackCards;
        reader.read(attackCards, defaultCard);
        for (std::vector<Card>::iterator it = attackCards.begin(); it != attackCards.end(); ++it) {
            mTableCards.addAttackCard(*it);
        }

        std::vector<Card> defendCards;
        reader.read(defendCards, defaultCard);
        for (std::vector<Card>::iterator it = defendCards.begin(); it != defendCards.end(); ++it) {
            mTableCards.addDefendCard(*it);
        }
        reader.read(mMaxAttackCards);
        reader.read(mDefendFailed);
        mPickAttackCardFromTable = !mDefendFailed && attackCards.size() == defendCards.size() + 1;
    }

    // append observers
    mGameObservers.insert(mGameObservers.end(), observers.begin(), observers.end());

    std::map<const PlayerId*, unsigned int> playersCards;
    for (PlayerIds::const_iterator it = mGeneratedIds.begin(); it != mGeneratedIds.end(); ++it) {
        playersCards[*it] = mPlayersCards[*it].size();
    }
    std::for_each(mGameObservers.begin(), mGameObservers.end(), GameRestoredNotification(mGeneratedIds, playersCards, mDeck->size(), mDeck->trumpSuit(), mTableCards));

    // initialize observers
    unsigned int savedObservers;
    reader.read(savedObservers);
    assert(savedObservers == mGameObservers.size());
    for (std::vector<GameObserver*>::iterator it = mGameObservers.begin(); it != mGameObservers.end(); ++it) {
        unsigned int observerDataStart = reader.position();
        (*it)->init(reader);
        unsigned int actualObserverDataSize = reader.position() - observerDataStart;
        unsigned int expectedObserverDataSize;
        reader.read(expectedObserverDataSize);
        assert(actualObserverDataSize == expectedObserverDataSize);
    }
}