- Qt 5.5
- Qt Core
- JSON Save Game Example
- game.cpp Example File
- Qt 5.5.1 Reference Documentation

# game.cpp Example File

json/savegame/game.cpp

    /****************************************************************************
    **
    ** Copyright (C) 2015 The Qt Company Ltd.
    ** Contact: http://www.qt.io/licensing/
    **
    ** This file is part of the examples of the Qt Toolkit.
    **
    ** $QT_BEGIN_LICENSE:BSD$
    ** You may use this file under the terms of the BSD license as follows:
    **
    ** "Redistribution and use in source and binary forms, with or without
    ** modification, are permitted provided that the following conditions are
    ** met:
    **   * Redistributions of source code must retain the above copyright
    **     notice, this list of conditions and the following disclaimer.
    **   * Redistributions in binary form must reproduce the above copyright
    **     notice, this list of conditions and the following disclaimer in
    **     the documentation and/or other materials provided with the
    **     distribution.
    **   * Neither the name of The Qt Company Ltd nor the names of its
    **     contributors may be used to endorse or promote products derived
    **     from this software without specific prior written permission.
    **
    **
    ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
    **
    ** $QT_END_LICENSE$
    **
    ****************************************************************************/

    #include "game.h"

    #include <QFile>
    #include <QJsonArray>
    #include <QJsonDocument>

    Game::Game()
    {
    }

    const Character &Game::player() const
    {
        return mPlayer;
    }

    const QList<Level> &Game::levels() const {
        return mLevels;
    }

    void Game::newGame() {
        mPlayer = Character();
        mPlayer.setName(QStringLiteral("Hero"));
        mPlayer.setClassType(Character::Archer);
        mPlayer.setLevel(15);

        mLevels.clear();

        Level village;
        QList<Character> villageNpcs;
        villageNpcs.append(Character(QStringLiteral("Barry the Blacksmith"), 10, Character::Warrior));
        villageNpcs.append(Character(QStringLiteral("Terry the Trader"), 10, Character::Warrior));
        village.setNpcs(villageNpcs);
        mLevels.append(village);

        Level dungeon;
        QList<Character> dungeonNpcs;
        dungeonNpcs.append(Character(QStringLiteral("Eric the Evil"), 20, Character::Mage));
        dungeonNpcs.append(Character(QStringLiteral("Eric's Sidekick #1"), 5, Character::Warrior));
        dungeonNpcs.append(Character(QStringLiteral("Eric's Sidekick #2"), 5, Character::Warrior));
        dungeon.setNpcs(dungeonNpcs);
        mLevels.append(dungeon);
    }

    bool Game::loadGame(Game::SaveFormat saveFormat)
    {
        QFile loadFile(saveFormat == Json
            ? QStringLiteral("save.json")
            : QStringLiteral("save.dat"));

        if (!loadFile.open(QIODevice::ReadOnly)) {
            qWarning("Couldn't open save file.");
            return false;
        }

        QByteArray saveData = loadFile.readAll();

        QJsonDocument loadDoc(saveFormat == Json
            ? QJsonDocument::fromJson(saveData)
            : QJsonDocument::fromBinaryData(saveData));

        read(loadDoc.object());

        return true;
    }

    bool Game::saveGame(Game::SaveFormat saveFormat) const
    {
        QFile saveFile(saveFormat == Json
            ? QStringLiteral("save.json")
            : QStringLiteral("save.dat"));

        if (!saveFile.open(QIODevice::WriteOnly)) {
            qWarning("Couldn't open save file.");
            return false;
        }

        QJsonObject gameObject;
        write(gameObject);
        QJsonDocument saveDoc(gameObject);
        saveFile.write(saveFormat == Json
            ? saveDoc.toJson()
            : saveDoc.toBinaryData());

        return true;
    }

    void Game::read(const QJsonObject &json)
    {
        mPlayer.read(json["player"].toObject());

        mLevels.clear();
        QJsonArray levelArray = json["levels"].toArray();
        for (int levelIndex = 0; levelIndex < levelArray.size(); ++levelIndex) {
            QJsonObject levelObject = levelArray[levelIndex].toObject();
            Level level;
            level.read(levelObject);
            mLevels.append(level);
        }
    }

    void Game::write(QJsonObject &json) const
    {
        QJsonObject playerObject;
        mPlayer.write(playerObject);
        json["player"] = playerObject;

        QJsonArray levelArray;
        foreach (const Level level, mLevels) {
            QJsonObject levelObject;
            level.write(levelObject);
            levelArray.append(levelObject);
        }
        json["levels"] = levelArray;
    }