示例#1
0
文件: engine.cpp 项目: na1x/DeCore
void Engine::save(DataWriter& writer) const
{
    if (!mDeck || !mCurrentPlayer) {
        // save called too early - nothing to save actually because the game has not been even started
        return;
    }

    lock();

    // save players count
    writer.write(mGeneratedIds.size());
    // save each player cards
    for (std::vector<const PlayerId*>::const_iterator it = mGeneratedIds.begin(); it != mGeneratedIds.end(); ++it) {
        const CardSet& playerCards = mPlayersCards.at(*it);
        writer.write(playerCards.begin(), playerCards.end());
    }
    // save deck
    writer.write(mDeck->begin(), mDeck->end());
    // save trump suit
    writer.write(mDeck->trumpSuit());
    // save current player index
    writer.write(mGeneratedIds.index(mCurrentPlayer));
    // save current round index
    writer.write(mRoundIndex);

    // save bool if round is running
    writer.write(static_cast<bool>(mCurrentRoundIndex));
    // save current round related data
    if (mCurrentRoundIndex) {
        // save attackers
        writer.write(mAttackers.size());
        for (std::vector<const PlayerId*>::const_iterator it = mAttackers.begin(); it != mAttackers.end(); ++it) {
            writer.write(mGeneratedIds.index(*it));
        }
        assert(mDefender);
        writer.write(mGeneratedIds.index(mDefender));
        writer.write(mPassedCounter);
        assert(mCurrentRoundAttackerId);
        writer.write(mGeneratedIds.index(mCurrentRoundAttackerId));
        writer.write(mTableCards.attackCards().begin(), mTableCards.attackCards().end());
        writer.write(mTableCards.defendCards().begin(), mTableCards.defendCards().end());
        writer.write(mMaxAttackCards);
        writer.write(mDefendFailed);
    }

    // save observers data
    unsigned int observersCount = mGameObservers.size();
    writer.write(observersCount);
    for (std::vector<GameObserver*>::const_iterator it = mGameObservers.begin(); it != mGameObservers.end(); ++it) {
        unsigned int observerDataStart = writer.position();
        (*it)->save(writer);
        writer.write(static_cast<unsigned int>(writer.position() - observerDataStart));
    }
    unlock();
}