Behind Coleus

大学生なのに特別大学で楽しいことが一 つもない。虐待と男子校病のせいにしてみる。→日本脱出しました 今ジャカルタにいます。→ジャカルタから帰ってきました。→6月19日から小笠原沖で、インドネシア人とメカジキ漁

アメリカに行ってNMIXXのライブ見る夢見た

ステーキが200ドルで、そして、AKB劇場みたいな小さい箱でNMIXX鑑賞した

www.gamespark.jp

今回の目的

目的とした像に相応しいメインメニューとゲームステート設計を考える。

 

目的への取り組み

今までの資料を振り返る。

brogmymxo.hatenablog.com

 


まず、ゲーム内のステートを考えるまず、カードを読み込むローディングステート、ゲームの準備をする、セットアップステート、ゲーム中を表すプレイステート、ゲーム終了後を表すゲームオーバーステートとします。

ローディングステートは以下の要素を持ちます。

  1. このステートがデフォルトである
  2. お互いのデッキを確定し、そのデータを読み込みます。
  3. お互いのファーストエナジーカードを確定し、そのデータを読み込みます。
  4. 読み込んだカードを山札にセットします。
  5. 山札をシャッフルします
  6. Sゾーンにファーストエナジーカードを裏向きで置きます。
  7. セットアップステートに自動で移行する

セットアップステートは以下の要素を持ちます。

  1. ドロー機能
  2. マリガン機能
  3. じゃんけんで先行後攻を決める機能
  4. ターンプレイヤーを記録する機能
  5. ファーストエナジーオープンする機能
  6. 初手とファーストエナジーを記録する機能
  7. プレイステートに自動で移行する

プレイステートは以下の要素を持ちます。

  1. ターンスタート
  2. 準備フェーズ
  3. 撤退フェーズ
  4. Xフェーズ
  5. メインフェーズ
  6. ターンエンド
  7. 1-6をターンプレイヤー、非ターンプレイヤーのステートを交互にして繰り返す
  8. 準備フェーズのドローで引けなかった時、ゲームオーバーステートに移行する
  9. Xゾーンのカードが6枚以上になって、ファーストエナジーがXゾーンに送られた時に、ゲームオーバーステートに移行するする。
  10. 降参をすると、ゲームオーバーステートに移行する

ゲームオーバーステートは以下の要素を持ちます。

  1. 勝敗を記録して表示する。
  2. 初手とファーストエナジー及び、ゲーム内でドローしたカード、デッキリストと勝敗の組み合わせをサーバーに送信する。
  3. メインメニューに戻る

次にメインメニューステートの機能について考えた。

  1. このステートがデフォルトである
  2. ゲームステートに移行できる。
  3. デッキ作成が出来る(αでは必要ない)
  4. カードと勝率に関する統計が確認できる(できれば)
  5. 公式サイトやwikiのリンクから遊び方を確認できる

また、以上の内容を確認して作成したグラフが以下のとおりである。

検証

ゲームステートは、4つのステートに大きく分けることが出来た。

メインメニューステートの機能を考えることが出来た。

反省

プレイステートでは、より細かいステートによる管理を行わなければならない。

 

 

本日2回目のセッション

 

目的 

プレイステートのステート設計を行う。

目的への取り組み

brogmymxo.hatenablog.com過去の記事を参照し、以下ターン進行ループ、以上ターン進行ループという部分について、参照した。

 

このゲームは、非ターンプレイヤーとターンプレイヤーでやることが違うので、プレイステートを二つに分けたい。ターンプレイヤーステートとノットターンプレイヤーステートを作ることにした。

そのうえで、あとは、一つ前の検証であったように

ターンスタート

準備フェーズ

撤退フェーズ

Xフェーズ

メインフェーズ

ターンエンド

の6つにステートを分ければよい。それぞれは以下の機能を持つ

ターンスタート

  1. ゲーム開始であることを示す。
  2. 自動的に準備フェーズに移行する

準備フェーズ

  1. 入力を受け付け山札からカードを1枚引く
  2. Fゾーンのカードをリスピンする
  3. Sゾーンのカードをリスピンする
  4. 条件を確認して、撤退フェーズに移行する
  5. 条件を確認して、Xフェーズに移行する
  6. 条件を確認して、メインフェーズに移行する

撤退フェーズ

  1. 入力を受けつけ、撤退することを選べる
  2. 条件を確認して、Xフェーズに移行する
  3. 条件を確認して、メインフェーズに移行する

Xフェーズ

  1. 入力を受け付けXスキルを使用することを選べる。
  2. Xスキルを処理する
  3. 自動的にメインフェーズに移行する

メインフェーズ

  • 入力を受け付けて、エンドフェーズに移行する
  • 入力を受け付けて、ファイターの召喚を行う
  • 入力を受け付けて、攻撃を行う
  • 入力を受け付けて、タクティクスの発動を行う。

ターンエンド

  1. ターン終了であることを示す
  2. ターンプレイヤーを、非ターンプレイヤーにする。
  3. 自動的にターンスタートに移行する

 

 

そして、厄介なのが、メインフェーズである。

これはテキストベースでやろうとすると複雑なので、ステートを3つに分けたのであった。

 

フリーステートとバトルステート、そしてカードプレイステートという3つのステートを考えた

それぞれのステートは以下の機能を持つ

フリーステート

  • デフォルトである
  • 相手の各領域にあるカードについての情報を表示する。
  • 自分の各領域にあるカードについての情報を表示する。
  • 入力を受け付け、ターンエンドに移行できるようにする。
  • 条件を確認し、プレイできるカードや、攻撃できるファイターの選択肢を表示する。
  • 入力を受け付け、カードプレイステートに移行する
  • 入力を受け付け、バトルステートに移行する。

カードプレイステート

  • 入力を受け付けフリーステートに戻る
  • エナジーに対してSゾーンでスピンするエナジーを決める
  • カードのプレイを行う。
  • 条件を確認してエナジーの調整を行う
  • 自動的にフリーステートに戻る

バトルステート

  • 攻撃対象を表示する
  • 入力を受け付けてフリーステートに戻る
  • バトルの処理を行う
  • 自動的にフリーステートに戻る

複雑なのは、カードプレイステートの調整の条件と対戦相手の入力も必要なバトルの処理である。

私の記事について、カードプレイは選択されたカードが、ファイターカードだった時と、タクティクスカードだった時でプレイに違いが出ると私の記事に書いてある。

2エナジー選択状態 
選択したカードがファイターカードだった場合は、2-1に移行する
選択したカードがタクティクスカードだった場合は、2-2に移行する

この二つを、プレイファイターステート、プレイタクティクスステートとして、場合分けした。

二つのステートがもつべき要素は以下の通りである。また、ライジングファイターが登場するなどした場合は、ステートを追加する必要がある。

 

プレイファイターステート

  • スピンさせるエナジーを選択する
  • プレイを行う
  • 効果を処理する
  • 自動でフリーステートに移行する

プレイタクティクスステート

  • スピンさせるエナジーを選択する
  • プレイを行う
  • 効果を処理する
  • 条件に応じ、入力を受け付けエナジーの調整を行う。
  • 自動でフリーステートに移行する

バトルについていくつかの処理に場合分けされている。

私の過去記事では、バトルについての認識が上手くいっていなかったため、公式Discordにあった以下のGyado56氏の記事を参考に記述した。

docs.google.com

(以下、ターンプレイヤー: タ 非ターンプレイヤー: 非)

タ:攻撃宣言

非:宣言対抗で無効化(ゴン、ライリー等)

タ:攻撃時効果

非:ガード宣言

タ非:パワー比べ、ガード時効果

タ非:バトル終了時効果 (アビス・プレデター等)、破壊時効果

タ非:撤退、墓地移動選択

※ バトル時効果は、攻撃時もしくはパワー比べで発生

以上の様になっており、これは、順序良くできておりステート設計は必要ないと考えたが、後にイベント設計をたくさんしないといけないと思われる。

これを参考にバトルの処理を記述すると

  1. 攻撃対象を選択する 
  2. 相手が条件を満たしていれば、相手の入力を受け付け、効果を使用する。
  3. 攻撃時効果を使用する
  4. ガード宣言を相手からの入力を受け付け、させる。(ここまで共通)
  5. パワー比べを行う(バトル)
  6. バトル終了時効果や破壊時効果を発動させる
  7. 撤退と墓地移動選択を行う。

となるであろう。また、攻撃対象とブロック状況に応じて場合分けが発生するので、それのステートわけが必要である旨が、私の記事に書かれていた。

ターンプレイヤーが選択したカードが、Fゾーンのカードだった場合、若しくは、ガードを宣言された場合3-1Sゾーンのファイターだった場合、3-2Sゾーンのタクティクスだった場合、3-3Sゾーンのファーストエナジーだった場合、3-4
やっぱりやめた場合、1に移行する。

先ほどボールドで引用したのは、3-1である。3-1の処理は先ほどの一連の流れで行われる。

今回はそれら4つの場合分けに名前を付けて、ステート攻撃対象ブロック状況に応じて、バトルFゾーンファイター、 バトルSゾーンファイター、 バトルタクティクス、 アタックファーストエナジーの4つに分けた。

条件わけは以下のようになっている。

  1. 攻撃対象を選択する これにより、4つそれぞれ分岐する
  2. 相手が条件を満たしていれば、相手の入力を受け付け、効果を使用する。
  3. 攻撃時効果を使用する
  4. ガード宣言を相手からの入力を受け付け、させる。ブロックされた場合は、バトルFゾーンファイターに分岐する

それぞれは以下の要素を順番通りに持つ。

バトルFゾーンファイター

  1. パワー比べを行う(バトル)
  2. バトル終了時効果や破壊時効果を発動させる
  3. 撤退と墓地移動選択を行う。
  4. リセットして、フリーステートに戻る

バトルSゾーンファイター

  1. 緩いパワー比べを行う(バトル)
  2. バトル終了時効果や破壊時効果を発動させる
  3. ペナルティを行う。
  4. リセットして、フリーステートに戻る

バトルタクティクス

  1. 必ずバトルに勝つ
  2. バトル終了時効果や破壊時効果を発動させる
  3. ペナルティを行う
  4. リセットして、フリーステートに戻る

アタックファーストエナジー

  1. デッキの一番上からカードをXゾーンに1枚裏側で置くペナルティを行う。(バトル時効果は行われない)
  2. リセットして、フリーステートに戻る

また、アタックブロックで攻撃対象を決める段階にもステートが必要だと思ったので、アタックブロックステートというのを考えた。

アタックブロックステートが持つ機能は以下の通りである。

  1. デフォルトのステートである。
  2. 攻撃対象を表示する
  3. 入力を受け付けてフリーステートに戻る
  4. 入力を受け付けて攻撃対象を選択する 
  5. 相手が条件を満たしていれば、相手の入力を受け付け、効果を使用する。
  6. 攻撃時効果を使用する
  7. ガード宣言を相手からの入力を受け付け、させる。
  8. ガードが無ければ、攻撃対象に応じたステートに、ガードがあればバトルFゾーンファイターに移動する。

そのため、バトルステートの中には、アタックブロックステート、バトルFゾーンファイター、 バトルSゾーンファイター、 バトルタクティクス、 アタックファーストエナジーの5つのステート作った。

 

 

まとめるとまず、プレイステートは6つのステートと2つのステートの組み合わせで12個パターンを設けた。なかでも、メインフェーズは非常に複雑なので3つのステートに分けた。その中で、バトルステートは5つのステートを作った。また、プレイステートは、2つのステートを作った。

まとめたのが以下の画像である。

 

こういう感じである。なお、ノンターンプレイヤーステートでの詳細は省略したが、ターンプレイヤーステートの詳細と同じである。

この画像や前の説明にはないが、カードプレイステートの中は、デフォルトのステートがあったほうがよいだろう。

 

検証

プレイステートの中身を丁寧に記述することに成功した。

次回はカードの効果を実装するのに必要なイベントと共通な関数の洗い出しをしたい。