戦闘ロジックの作成開始
戦闘ロジックを作ると言っても、やり方も何もわからない。
AIに助けてもらいながら作成をしていく。
ざっくりした必要データ
必要なものは以下。
- プレイヤーデータとモンスターデータ
- 戦闘ログ
- ターン数、maxターン数
- 行動順序(今回はプレイヤー先制)
- 戦闘の流れ:
戦闘開始 > ターン終了後のHPチェック > ターン交代 > 戦闘...
ターン数もしくはHPの大小を判定 - 勝った時の処理
- 負けた時の処理
- 経験値とお金取得処理
- レベルアップ時の処理
大項目はこんな所。
後は攻撃力とか回避率とか命中率とか防御力とか、細かい処理を各項目に入れていく。
戦闘の流れ
- プレイヤー・モンスターのデータ取得
- 戦闘処理
- どちらかのHPが0になるまでループ
- 命中判定ロジック
- クリティカル判定ロジック
- スキル発動判定ロジック
- ダメージ計算
- 基礎ダメージ計算(補正値あり)
- クリティカルorスキルの発生
- 最終的な命中処理
- HPの更新
- 攻撃ターンの交代
- どちらかのHPが0になるまでループ
- 戦闘終了
- ターン数もしくは、HPの大小で分岐
- 勝った場合の処理
- 経験値&お金の取得
- レベルアップ処理の判定
- DB更新
- 負けた場合の処理
- お金の減少処理
- レベルアップ処理の判定
- DB更新
- 勝った場合の処理
- api送信
- ターン数もしくは、HPの大小で分岐
処理の流れは大まかにこんな感じ。
monsterテーブルを作成していないので、とりあえずモックデータ(スライム)を処理にベタ打ち。
エラー発生(大体タイポ)
上記を実装して戦闘ボタンを押してみると、
「logが読み取れません。」的なエラーが返ってきた。
フロントエンドでコンソールを確認したら、指定したのと違う所にlogデータが入っていました。
コントローラーのタイポが原因。
上記修正して、戦闘できた。
だがしかし、たまーに戦闘失敗してしまう。
これまたフロントエンドで戦闘失敗表示の直前にコンソール確認。
どうやら「lv」がDBに存在しないとのこと。
DBを確認したら「level」となっていた。
またタイポが原因。
タイポの場所的に、
戦闘敗北時にエラーが出ていたみたい。
1hours later...
戦闘敗北時のエラー確認のため、
「敗北しろ!」と願いつつスライムと戦闘を続ける。
こんな時に限ってなかなか負けない
10hours later...
やっと負けることが出来た。
エラーは出ていない。
だがしかし、
HP60あるはずなのに、
スライムの攻撃7ダメージで死亡してしまう。
Tips: ワンパンスライム爆誕
ワンパンスライムの原因は、
積み重ねた戦闘でHPが回復していない上に
フロントエンドで呼び出すデータを間違えていたことが原因だった。
「HP60あると思っていたら〜〜、
HP1しかありませんでした〜〜〜。
チックショー〜〜〜〜!!(寒い)」
Tips: 小梅太夫は寒くない
安定のタイポでした。
そう言えば、タイポじゃないけど
回復ロジック作っていなかったので作らないとですね。
余談
vue.jsで「v-html」を使うことは非推奨なんだけど、
PHPで生成した文字列は、v-htmlが最適解だった。初めて使った。
「なんで非推奨なのに、そんなディレクティブ用意してるんだ。イミワカラン」って思っていたけど、
こんな所で役に立つとは。
ちなみに、v-html非推奨の理由は、
ユーザーの入力(inputなど)をv-htmlで受け取ると、
悪い知識のあるユーザーから悪用されるリスクがとっても高いからです。
私のプログラムでは「ユーザーの入力」ではなく、「バックエンドの入力」を受け取っているだけなので問題ないのです。(だぶん)

