バトルのデバッグ効率アップツール

AvatarPosted by

こんにちは。サーバーサイドエンジニアのtackです。

弊社では、1~3種類のスキルを持った1~4人のドレス(キャラクター)を使い、相手と戦うアプリを運営しています。
現在までにリリースされているドレスは170種類以上、スキルは400種類以上、スキルによってキャラクターに適用される状態ステータスが33種類あります。
この膨大な組み合わせの条件をすべてデバッグ、テストコードで網羅することは困難で、どうしても期待値通りに動かない、エラーが出る、アプリが止まってしまうなどの問題が発生してしまいます。
その際、再現確率が高く、明確な再現方法が分かっている場合はすぐに対応することができますが、ほとんど再現しなかったり、再現方法が曖昧だと、調査に数日かかってしまうことがあります。
そこで、次のような調査の工数を削減するツールを作りました。

デバッグツールの構成

デバッグツールの構成は以下の2つからできています。

バトルのターン毎の詳細ログ記録(JSON)

各キャラクターの全パラメータ、状態ステータス、フィールド情報など、バトルの状態を再現するのに最低限必要な情報を記録したJSONデータです。
このJSONデータを毎ターン、すべてのバトルで記録しています。

{
  "stageId": "2",  //クエストステージID
  "wave": 1,  //現在のWave
  "units": [  //キャラクターのステータス
    {
      "uid": 1,  //ID
      "cardId": 9999999,  //カードID
      "hp": 20000,  //現在のHP
      "mhp": 20000,  //キャラクターのHP
      "atk": 1500,  //攻撃力
      "def": 1500,  //防御力
      "agi": 80,  //速度
      "acc": 50,  //
      "res": 50,  //
      "act": 50,  //行動ゲージ
      "skillId1": "1000",  //スキルID
      "recast1": 0,  //リキャストターン数
      "slv1": 6,  //スキルレベル
      "skillId2": "1001",  //スキルID
      "recast2": 0,  //リキャストターン数
      "slv2": 4,  //スキルレベル
      "passiveSkills": []  //状態異常ステータス
    }
  ]
}

詳細ログからバトルの状態を再現するデバッグメニュー

バトルの状態を記録したJSONデータから、ゲームで使われるバトルデータを復元するためのデバッグメニューです。
JSONデータを貼り付けて「バトルデータ生成」ボタンをクリックすると、バトルデータが復元されます。

開発環境のアプリに入り直すと、途中のデータがあるので再開するか?というメッセージが表示されます。
これは既存の機能を流用したもので、バトル中にアプリが落ちてしまった場合など、途中のバトルデータが存在する場合に、そのバトルに復帰することができます。

OKボタンをクリックすると、JSONから再現したバトルをJSONデータの状態からプレイすることができます。

この機能を使うことで、バグが起こる瞬間を何度でも再現することができます。
バトルデータを復元する処理は実際にアプリ内で使われている物とは違いますが、復元後のバトル処理や描画処理は実際にアプリで使われている物なので、現象の再現性が高いです。

おわりに

このツールを作るまでは、バグチケットに記載されている内容や、お問い合わせで来た内容からデッキを編成し、何度もスキルを撃ってバグを再現するしかなく、再現するまで数時間~数日かかっていました。
ツールが完成してからは、すぐに問題の状態を再現できるため、数分で問題を再現し、その日のうちにバグを修正できる事がほとんどになりました。

今後も工数削減ツールを開発していき、バグの早期修正や、バグを無くしていきたいと思っています。