Recorder.hpp

//------------------------------------------------------------------------------
/// @file
/// @author   ハル研究所プログラミングコンテスト実行委員会
///
/// @copyright  (C)HAL Laboratory, Inc.
/// @attention  このファイルの利用は、同梱のREADMEにある
///             利用条件に従ってください。
//------------------------------------------------------------------------------

#pragma once

//------------------------------------------------------------------------------
#include "Stage.hpp"

//------------------------------------------------------------------------------
namespace hpc {

/// ゲーム進行を記録するクラス
class Recorder
{
public:
    /// @name コンストラクタ
    //@{
    Recorder();
    //@}

    /// @name ダンプ
    //@{
    /// 最終結果を出力する
    void dumpResult(bool aIsSilent) const;
    /// 記録内容をJSONとして出力する
    void dumpJson() const;
    //@}

    /// @name 記録
    //@{
    /// ステージの初期化後に実行される関数
    void afterInitializeStage(const Stage& aStage);
    /// ターンを進めた後に実行される関数
    void afterAdvanceTurn(const Stage& aStage);
    /// ステージが終了した後に実行される関数
    void afterFinishStage(const Stage& aStage);
    /// 全ステージが終了した後に実行される関数
    void afterFinishAllStages();
    //@}

    /// @name 問い合わせ
    //@{
    /// ゲーム全体での総ターン数
    int totalTurn() const;
    //@}

private:
    /// @name 内部構造体
    //@{
    /// ターン情報
    struct TurnRecord
    {
        /// プレイヤー座標
        Vector2 pos;
        /// 巻物取得状況
        int leftover;
    };

    /// ステージ情報
    struct StageRecord
    {
        /// ターン数
        int turn;
        /// スコアとなるターン数
        int scoreTurn;
        /// 地形情報
        int map[Parameter::StageHeight][Parameter::StageWidth];
        /// 巻物
        Vector2 scrolls[Parameter::MaxScrollCount];
        /// 巻物の数
        int scrollCount;
        /// ターンごとの情報
        TurnRecord turnRecords[Parameter::GameTurnLimit + 1];
    };
    /// ゲーム情報。
    struct GameRecord
    {
        /// ゲーム全体での総ターン数
        int totalTurn;
        /// ステージ情報
        StageRecord stageRecords[Parameter::GameStageCount];
    };
    //@}

    /// @name 内部実装
    //@{
    /// ステージ情報を JSON として出力する
    void dumpJsonStage(const StageRecord& aRecord) const;
    /// ターン情報を JSON として出力する
    void dumpJsonTurn(const TurnRecord& aRecord) const;
    /// 現在のターン情報を記録する
    void writeTurnRecord(int aStageNumber, int aTurn, const Stage& aStage);
    //@}

    /// @name プライベートメンバ変数
    //@{
    /// ゲーム情報。
    GameRecord mGameRecord;
    /// 現在記録中のステージ番号
    int mCurrentStageNumber;
    /// 現在記録中のターン番号
    int mCurrentTurn;
    //@}

};

} // namespace
// EOF