【Game A Week】Hunter*Gatherer 【番外2】

hunter*gathererのゲーム画面 Game A Week

Hunter*Gatherer

Hunter*GathererはGA Raceに続いて私が作ったはじめてのゲームらしいゲームです。集中的に作り上げて3週間弱ほどで一応完成まで作りました。実装したいことはまだ山ほどありますが、とりあえずプレイ可能です。私の究極目標を現時点で実現可能な技術のみで簡易化したプロトタイプとして制作しました。

【ブログコンセプト】私の究極目標【Part 2/2】
私の究極目標で書いたことは、なんというか表面上の目標です。長期的な究極目標はまた別のところにあるんです。一言でいえば、それは「もう一つの世界を創造する」ことです。その具体的な一つの方法がゲームを作ることです。ひきこもり宣言ひきこも...

そういった理由から技術面だけではなく、アイデアの考察にもかなりの時間を費やしています。その意味では3週間弱という制作期間はそれ以前の考察時間を省いたあくまでも表面上のものです。

こちらから実際に見ていただけたら嬉しいです。webブラウザ上でプレイできます。ただし、チュートリアル要素はゲーム上で実装できていません。ですので、こちらに文書形式で書いたやつを貼っておきます。

【Game A Week】Hunter*Gatherer 説明書【番外2】
Hunter*Gatherer 説明書この記事はの説明書です。ゲーム中ではゲームの仕組みや用語が全然説明できてないから、この記事を読んでみてね!ゲーム目標このゲームの目標は、「生き残ること」だよ。プレイヤーは一つの群れを担当...

idea

  • 非文明的世界
    • 狩猟採集生活
      • 富は蓄積されるものではない
    • 狼の群れを一応想定
  • 二重継承理論のシミュレーション
    • 遺伝的要素と価値観
  • 選択圧(例によって独自の定義をしています)
    • 自然環境(environmental selection)
    • 他種族との交流闘争(mutual selection)
    • ethicsによる憧れ(sexual selection)
  • プレイヤーの意思決定
    • 対立軸
      • 多様性と特化
      • 長期的利益と短期的利益
    • 二つの要素
      • イベントでの選択
        • ethicsと憧れを変える。それが交配の人気度に影響を与える
      • タイル移動
        • 環境変化。これも個体の健康状態から交配に影響を与える
  • 影響を受けた主要なゲーム
    • Frostpunk
      • survival
      • law
    • Stellaris
      • explore
      • ethics
    • Niche
      • gene
      • evolution
      • adaptation

What went right

  • GA Raceで課題にあった動的な選択圧は実現できた
    • 例えば、タイルの環境によって有利な遺伝子が変わる。
    • タイルに住む住人も交配を行い、進化を繰り返す
      • その住人に連関して、プレイヤーの群れの適応度も変化
    • 選択圧の多様化もできた
  • ゲームを作成する手順を計画しておおよそその通りに実行できた
  • geneとethicsは互いに規定しあうゆえに、長期的には同一のものだと言える。
    • ゲーム的に意味を持つ期間で両社に差を生み出し進化の動力源になることが理想
      • その期間は短すぎても長すぎてもダメ
    • いちおうそれっぽくはなった
  • メインのループをGameManagerに担当させた
    • Switchでフラグを分岐させる
    • 空文字の時は何もせずにループして、状態遷移させるフラグがたった時は一ループしてまた空文字に戻す
  • Manager系クラスに中央の処理を担当させたが役割分担がうまくいったと思う
  • perlin_noiseを二重に使って簡易的な自動生成マップを実装

What went wrong

  • 「なるべくリアリティのあるシミュレーションにしたい」ということと「ゲーム性を持たせたい」ということの両立が難しかった
    • 例えば、個体の適応度を計算する関数をリアルにしようとして複雑にしても、結局プレイヤーから見えるのは結果だけ。
      • つまり、結果が変わるのでなければゲーム的には意味がない。
  • イベントをミニストーリー的に書いたはいいが、プレイヤーはどうせ見ない。
    • まぁ、そこまで作りこんでいないからいいか
  • ゲーム内のパラメータが何を意味するのか、ゲーム的にどういう意味を持つのかがわかりづらい
    • パラメータは当初の予定よりかなり削ぎ落したが、削ぎ落しすぎるとシミュレーションとして価値が落ちゲーム的になりすぎるというジレンマ
  • イベントについては、機械的に選択肢を割り当てなかったのでバランス調整が全くできていない
    • 例えば、huntingのfitness_coefficientが上昇するイベントが多すぎる
  • populationクラスを親としてplayerクラスとhabitantクラスを作ったが、playerインスタンスの時のみ実行したい処理というのをpopulationクラスに記述したうえで「instanceof Player」演算子で分岐させる方法を用いた
    • 多分あまりよくない書き方。オーバーライドでクラスごとに実装すべき

What I learned

  • ajaxでjson/xmlを読み込むこと
    • jsonにfunctionを書き込むのは無理(eval()を使わない限り)ということがわかったが、そうなるとイベントデータを書いたjsonからどうやってイベント処理のfunctionにつなげるのか。
      • コード側であり得る処理をすべて関数化することはfunction数が膨大になりすぎる
      • そこでfunctionセットという複数のfunctionを保管したオブジェクトを作り、jsonから使用する関数のキーと変数を受け取る方法を考えた
      • ハードコーディングを多少削減できて、自分的には満足した
    • jsonから読み込んだデータに基づいてDOM要素にイベントを登録すること
  • preload
  • 例えば、GameManagerといったオブジェクトを管理するオブジェクトを作ること

コメント

タイトルとURLをコピーしました