#現在の状態
【第X話】系の記事は、自分へ向けての作業日報のようなものになります。ゲームができていく過程がどんな感じなのか伝わればイイなと思って書いています。
見た感じ戦えそうになってきた(テストデプロイ先には未適用
アイコンが全てイイネになっているのは、ベースの機能が揃ったらなおす予定。
##最終目標を確認
最終的には、ゲームのロジック部分はサーバー側に持っていく予定。
描画のみがflutterで作られたクライアントに残る予定。
そのために画面の設定からキャラクターの設定値から全部jsonでファイルから読み込むようにしていっている。
#戦闘の仕組みについて
戦闘については戦闘クエリーをサーバーに投げて、結果オブジェクトを頂いた上でそれをもとにエフェクトを付けていくみたいな感じにする予定です。
たった今、一人で脳内会議を開き、戦闘は以下のように決定されることになりました。
###startフェイズ
状態異常や継続攻撃の成否を判定し、そのターンでのプレイヤーの開始状態を決定する。
###selectフェイズ
各プレイヤーが行動を選択する
###battleフェイズ
- サーバー:selectフェイズで取りまとめられたクエリーを処理する
- クライアント:処理された結果を受け取って、表示する
###endフェイズ
勝利条件の確認 ? 終了 : 継続;
##selectフェイズで作成するクエリーのリスト
List<SelectedBattleAction> をプレイヤー側とモンスター側で一つづつ作成される
モンスターも実体はPlayerとして処理する。
SelectedBattleAction
{
Player:<id>,
Action:<attack>,<skill>,<defend>,<item>,<swap>,<special>,<escape>,
source:<name><null>,
target:[
{
partyId:<id>,
targetType:<single><row><all><column>,
targetId:[<null>,<id>,<random>]
}
]
}
##戦闘の計算の流れ
###下準備
リスト2つを一個に取りまとめる。
SelectedBattleAction一つづつについて、行動速度を計算し、決定する。
行動速度から処理する順番を決定し、その順番に従って戦闘計算を行う。
###戦闘計算を行う順番
Playerの状態をチェックする。
ActionとSourceがそのPlayerにとって現在実行可能なのかをチェックする。
ActionとSrouceがTargetに対して現在実行可能なのかをチェックする。⇛副次的にターゲットとの距離がわかる
※攻撃対象が妥当でなくなった場合に、自動で切り替えるのか切り替えないのか、ゲームバランスになるので考慮が必要
※randomの場合、実行可能範囲に敵がいるかどうか(自分が後ろに下げられた場合に届かないことがある
Player Action Source Target を利用して戦闘の計算を行う。
計算の途中でダメージや状態異常になったとしても、それらは最後の結果反映時にまとめて反映される。
※明示的に効果の最初に状態が変化するようなものは除く
戦闘の結果を反映する。
##とりあえずは・・・
アタックが敵と味方で飛び交うようになるところまで進めようと思います。そこまでできれば多分あとはコピペで増やしていけるでしょう。
ガードについては防御がUPするとかになるのか、減算にするのか、悩ましいところ。とりあえず防御UPだけするようにして後で色々足せるように考えて作ります。
これを見て気になった人は以下で詳しく見ることができます。
テスト公開については、アタックが飛び交って、勝利か敗北ができるようになったらまた更新します。
ソースコード:https://github.com/ClozedJP/adventure
テスト公開:https://clozedjp.github.io/adventure
#FlutterタグつけたのでFlutterネタを
##Routeオブジェクトは一度使うとdisposeされる
なので、たとえ同じパスで同じページを表示するとしても、ルートオブジェクトはnewしなければならない。
MapにMaterialPageRoute(builder: (context) => Hoge())などを突っ込んで、再利用しようとするとクラッシュします。
そういうときはmapにHoge()を入れておいて、ルートに合わせてMaterialPageRoute(builder: (context) => Map[routeName])とかしましょう。
##RowとかColumnクラッシュしがち
何かと幅や高さが無限になりましたってプンスコ怒るRowくんとColumnちゃんですが、Containerに優しく包んであげると怒らなくなります。
##Container小さくなりがち
Align.start Algin.endみたいなことをやっても動かないのは、コンテナちゃんが小さいから。SizedBox.expand(child: Container(child: ,),)すると割と思った感じに配置できたりします。
##未解決:枠線のある、中塗りもされているボタンが作れない
OutlineButtonにcolorの項目があるが、何設定しても関係ない。枠線とテキストだけ塗られる。
FlatButton RaisedButtonは枠線が出ない。
Containerで枠線ごまかそうとしたけど、隙間ができてしまうためコレジャナイ感がすごい。
変則でstackで裏になんか重ねるみたいな事やればできると思うけど、そうじゃない、そうじゃないと思います。