戦闘ロジックの作成開始

戦闘ロジックを作ると言っても、やり方も何もわからない。
AIに助けてもらいながら作成をしていく。

ざっくりした必要データ

必要なものは以下。


  • プレイヤーデータとモンスターデータ
  • 戦闘ログ
  • ターン数、maxターン数
  • 行動順序(今回はプレイヤー先制)
  • 戦闘の流れ:
    戦闘開始 > ターン終了後のHPチェック > ターン交代 > 戦闘...
    ターン数もしくはHPの大小を判定
  • 勝った時の処理
  • 負けた時の処理
  • 経験値とお金取得処理
  • レベルアップ時の処理

大項目はこんな所。

後は攻撃力とか回避率とか命中率とか防御力とか、細かい処理を各項目に入れていく。

戦闘の流れ


  1. プレイヤー・モンスターのデータ取得
  2. 戦闘処理
    • どちらかのHPが0になるまでループ
      1. 命中判定ロジック
      2. クリティカル判定ロジック
      3. スキル発動判定ロジック
      4. ダメージ計算
        • 基礎ダメージ計算(補正値あり)
        • クリティカルorスキルの発生
        • 最終的な命中処理
        • HPの更新
      5. 攻撃ターンの交代
  3. 戦闘終了
    • ターン数もしくは、HPの大小で分岐
      • 勝った場合の処理
        • 経験値&お金の取得
        • レベルアップ処理の判定
        • DB更新
      • 負けた場合の処理
        • お金の減少処理
        • レベルアップ処理の判定
        • DB更新
    • api送信

処理の流れは大まかにこんな感じ。

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で受け取ると、
悪い知識のあるユーザーから悪用されるリスクがとっても高いからです。

私のプログラムでは「ユーザーの入力」ではなく、「バックエンドの入力」を受け取っているだけなので問題ないのです。(だぶん)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です