ゲームエンジンの選定と簡単な設計書
ゲームエンジンを何にするか問題
結論からいいますと、今回も人臥狼咆と同じくティラノスクリプトを使おうとしています。
理由としては以下です。
- カードゲーム風の戦闘のみであれば表現できそう
- アニメーションエフェクトが豊富
- 「人臥狼咆」で使い方に慣れている
- javascriptでコードが書ける
元々ティラノスクリプトはノベルゲーム用に開発されたプラットフォームですが
今回作るゲームは戦闘エロということで、戦闘シーンをうまく実装できるかどうかがカギとなります。
前作の「人臥狼咆」で使い方は大分理解しましたし、javascriptは公私ともに経験があるのでなんとかなるかな、と思います。
例えばRPGツクールやUnityなども候補なのですが、ツクールでカードゲームを作ろうとすると、既存の戦闘シーケンスの構造を把握するところから始めなければなりません。
いうなれば、ツクールのあらかじめ用意された実装は、カードゲームにとって過剰であり、過剰な部分を問題が起こらないように削った上で独自の実装を積み上げていくのは大変だと思います。
UnityやUE5はプラットフォームとしてできることが多すぎて、一から勉強するのも時間がかかりそう、と思ってます。
簡単な設計図
markdown+mermaidのクラス図を使って「戦々嬌々」のオブジェクトを並べてゲーム全体の構造を書いてみました。
用語がアルファベットなのは、そのままプログラムのクラス名等に使うためです。
黒い四角付きの矢印がコンポジション(構成部品)で、白い△はインヘリタンス(継承)になります。
とりあえずそれぞれのオブジェクトが何対何で構成されるのかが分かるのが大事です。
Game
今回作る「戦々嬌々」ゲーム本体です。1つ以上のStageから構成されます。
Stage
いわゆる「面」に相当します。各ステージにボスがいて、倒しても倒さなくても次のステージへ進行していきます。ステージは1つ以上のSectionから構成されます。
Section
「パート」のようなオブジェクトをイメージしています。
GuideSectionはデッキを確認したり、カードの効果を見たり、パートの合間の休憩所的なものになる予定です。
NovelSectionはノベルパートです。複数のSceneから構成されます。
BattleSectionは戦闘パートです。今回作るゲームのメインコンテンツになります。
Scene
ティラノスクリプトのシーン相当です。立ち絵と文章を組み合わせてストーリーの進行を表現します。シーンでの選択肢による分岐も入れるかもしれません。
BattleSection
Preparationは準備用の処理です。初期ハンドを作って、敵のシーケンスを決めます。
Roundはカードゲームにおけるターンを表現しています。複数のPhaseから構成されます。
Resultは戦闘終了後の処理などを入れようとしています。
Phase
Magic the Gatheringを参考に4つのフェイズに分かれます。
DrawPhaseはカードを5枚引く処理になります。
MainPhaseはカードをプレイして攻撃力と防御力を決めます。
CombatPhaseは敵と味方が攻撃対象を決定し、戦闘処理を行います。
CleanupPhaseは戦闘結果を処理するフェイズです。プレイしたカードが捨札に置かれるのもこのタイミングとなります。
デッキの構造
ゲームの流れとは別にカードたちをどう扱うかもなんとなく決めました。
attributeとmethodもとりあえず使いそうなものは書いてしまっています。
実装しながら微調整します。
こういったことを決めないと、用語の解釈違いが作っている間に発生したりするので、決めておくことが大事だと思います。
Deck
デッキです。山札の意味でつかわれることもありますが、このゲームにおいてはプレイヤーが保有するカード一式を指します。
デッキはPile(山札), Hand(手札), Trush(捨札), Armor(ライフ)を部品とし、デッキ全体を評価するeval()をmethodとして実装します(快感値の計算等に使用します)。
Pile
山札です。1枚以上のカードから構成されます。
デッキの上からカードを見るためのshow()とデッキの上や下にカードを置くput()をmethodとして実装します。
Hand
手札です。5枚のカードから構成されます。
カードを選んでプレイするplay(), カードを選んで捨てるdiscard(), カードをゲームから除外するremove(), それからカードを他の領域に移すmove()を書いています。
Trush
捨札です。0枚以上のカードから構成されます。
捨て札をシャッフルして山札を再構築するreset()を実装します。
Armor
アーマーです。これが0になった状態で攻撃を喰らうとバトルに敗北します。ダメージを喰らうとget()が実行されアーマーのカードがハンドに加わります。逆に回復効果を受けるとここにカードが追加されます。位置はトップに固定されます。
Card
ここのカードのクラスになります。idは通し番号、nameはカード名、rankはレアリティを表します。またカードをプレイした際の効果をeffect()に実装します。
おわりに
ここまで読んで頂いてありがとうございます。
設計と呼ぶにはかなりアラが目立つ感じですが、作りながら見直していこうと思います。