ゆとりーなの日記

日記的な事を書いて行くと思はれる

現実的な話をしよう

ゲームで使うデータ構造でもそろそろ考えときましょうか。
取り敢えずアイテム。所持アイテムのリストはstd::vector安定でしょう。持てる限界はアイテム総重量で決める予定なので最大数とかが決まらないのでstd::arrayは不向きですかね。途中を引っこ抜いたりリスト長を取得するのも面倒そうですし。
アイテムは取り敢えずこんな感じのクラスにしておきましょうかね。

class item {
 public:
  // アイテム識別名からアイテムを初期化
  explicit item(const std::string &name);
  // アイテム名を取得
  std::string name() const;
  // アイテムメッセージを取得 HPを少し回復とか武器威力 10とか
  std::string message() const;
  // アイテムアイコンを取得 イメージのコピーコストが少ない筈という極めて実装依存な・・・
  ngy313::graphic::image icon() const;
  // アイテムタイプを取得 武器とか防具とか
  item_t type() const;
  // アイテム重量取得
  std::size_t size() const;
  // 使用
  void use() const;
};

アイテムタイプは列挙体でいいでしょうかね。

enum item_t {
  // 武器, 防具, アイテム, その他
  kWeapon, kProtector, kItem, kOther
};

というわけでアイテムコンテナはこんな感じ。

class item_list {
 public:
  // 所持重量取得
  std::size_t size() const;
  // 所持品リスト取得
  pstade::oven::any_range<std::pair<item, std::size_t>, boost::forward_traversal_tag> list() const;
  // 武器リスト抽出 装備画面で使いそう
  pstade::oven::any_range<std::pair<item, std::size_t>, boost::forward_traversal_tag> weapon_list() const;
  // 防具リスト抽出 装備画面で使いそう
  pstade::oven::any_range<std::pair<item, std::size_t>, boost::forward_traversal_tag> protector_list() const;
  // 使う インデクス経由だとイテレータに直すのめんどそう
  void use(std::size_t index);
  // 捨てる インデクス経由だとイテレータに直すのめんどそう
  void throw(std::size_t index, std::size_t num);
  // 入手 持ち切れないとfalse返し
  bool add(const item &i);

 private:
  // アイテムとサイズ
  std::vector<std::pair<item, std::size_t>> item_list_;
};

武器とか防具も型として用意して、キャラクターが装備品リストとしてこれを持っておくことにして、

class weapon {
 public:
  // アイテムから武器を読み込む
  explicit weapon(const item &i);
  // 武器威力取得
  int power() const;
  // 耐久力取得
  int hp() const;
  // 重量取得
  int size() const;
  // アイテムタイプを取得 武器の種類
  weapon_t type() const;
};

// そういえば防具に耐久力があるゲームはあまり見ない
class protector {
 public:
  // アイテムから武器を読み込む
  explicit protector(const item &i);
  // 物理防御力取得
  int physical_defense() const;
  // 魔法防御力取得
  int magic_defense() const;
  // 重量取得
  int size() const;
  // アイテムタイプを取得 防具の種類
  protector_t type() const;
  // 耐性とか属性防御とかを取得するメソッドを羅列
  // 斬属性
  protector_type cut_protector() const;
  // 打属性
  protector_type shock_protector() const;
  ...
};

enum protector_type {
  kPerfect, // 所謂耐性 ロマサガでいうところの二重○
  kGood, // 半分に減らす ロマサガでいうところの○
  kNormal, // 普通
  kBad, // 所謂弱点 ロマサガでいうところの△
  kBadness, // 所謂超弱点 ロマサガでいうところの&#9747;
};

取り敢えずこんな感じで。遅かったらその時考えます。以上メモでした。