Stage.hpp

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

#pragma once

//------------------------------------------------------------------------------
#include "Array.hpp"
#include "Scroll.hpp"
#include "Parameter.hpp"
#include "Rabbit.hpp"
#include "Random.hpp"
#include "Terrain.hpp"
#include "Vector2.hpp"

//------------------------------------------------------------------------------
namespace hpc {
/// 巻物の配列
using Scrolls = Array<Scroll, Parameter::MaxScrollCount>;

/// ステージ
class Stage
{
public:
    /// @name コンストラクタ
    //@{
    Stage();
    //@}

    /// @name 問い合わせ
    //@{
    /// 現在のターン数
    int turn() const;
    /// プレイヤー
    const Rabbit& rabbit() const;
    /// 巻物の配列
    const Scrolls& scrolls() const;
    /// 地形
    Terrain terrain(const Vector2& aPos) const;
    /// 
    bool isOutOfBounds(const Vector2 aPos) const;
    /// ジャンプ後の座標を得る
    Vector2 getNextPos(const Vector2& aPos, float aPower, const Vector2& aTargetPos) const;
    //@}

    /// @name 内部関数用
    //@{
    /// 初期化する
    void initialize(int aScrollCount, const RandomSeed& aStageRandomSeed);
    /// 更新する
    void update(const Vector2& aTargetPos);
    /// ターンを進める
    void advanceTurn();
    /// 終了したかどうか
    bool isEnd() const;
    //@}

private:
    /// @name プライベートメンバ変数
    //@{
    /// 現在のターン数
    int mTurn;
    /// プレイヤー
    Rabbit mRabbit;
    /// 巻物の配列
    Scrolls mScrolls;
    /// 地形
    Terrain mMap[Parameter::StageHeight][Parameter::StageWidth];
    //@}
};

} // namespace
// EOF