| title | 内部API(バトルサーバー向け) | ||||
|---|---|---|---|---|---|
| status | current | ||||
| area | server | ||||
| related |
|
||||
| proto |
|
||||
| code |
|
||||
| updated | 2026-10-18 |
atlas.internal.v1.BattleInternalService。バトルサーバーから APIサーバーを呼ぶための gRPC の API で、Unity クライアントからは呼ばない。
- クライアント向けとは別のポート(
SERVER_ADDR、既定127.0.0.1:3000)で出す - メタデータ
x-internal-secretで認証する(認証) - 基盤の認証・冪等性・メンテナンスの判定は通らない。メンテナンス中でも結果の報告を受ける
- 業務エラー(
ErrorInfo)は使わず、gRPC の標準のステータスで返す
player_id → pachimon(player_pachimon_id・pachimon_id)
- バトルサーバーが参加を受け付けたときに呼ぶ。パーティの枠番号の順(未編成の枠は含まないため0〜6件)
- ボットとの対戦では、ボットの分もこれで取る。ボットも
playersの普通のプレイヤーなので、GetLoadouts・ReportResultも含めて 人と同じに扱う(マッチング) - 選出画面で見せるのはどのパチモンかだけなので、ステータスポイント・技は返さない
player_id・player_pachimon_ids → loadouts(player_pachimon_id・pachimon_id・effort_values・move_ids)
- バトルサーバーが選出を受け取ったときに呼ぶ。順番はリクエストの
player_pachimon_idsと同じ、move_idsは技の枠の順 - プレイヤーごとに違う所持データだけを返し、種族値・技の性能・タイプ相性はバトルサーバーが自分のマスタから引く
- 所持していない個体(他人の個体・存在しない ID)が1体でもあれば
NOT_FOUND
match_id・winner_id・player1_id・player2_id・player1_selected_pachimon・player2_selected_pachimon・turns
(turn_number・player_id・action_data_json・result_data_json)→ 本文なし
1つのトランザクションで次を行う。
battle_matchesの行をFOR UPDATEでロックし、報告済みかを確かめるbattle_matchesを終了状態に更新する(勝者ありならfinished、winner_idが空文字ならaborted)battle_turnsに行動を一括で追加する- 勝者にジェム50を付与する(勝者なしなら付与しない)
- 両方の参加者の対戦の結果と、勝者の報酬をゲームログに書く
記録できたら、マッチングに残っている両者の接続情報を消す(マッチング)。
| 状況 | 返すステータス |
|---|---|
| 対戦が無い | NOT_FOUND |
参加者でない winner_id・player1_id/player2_id・ターンの player_id、2人が同じ ID、JSON として読めない行動・結果 |
INVALID_ARGUMENT |
| 報告済み | ALREADY_EXISTS(何も変えない。ジェムを二重に付与しない) |
player1/player2はバトルサーバーに先に参加した側で、マッチ成立時の順と一致するとは限らない。ID でbattle_matchesの参加者と 突き合わせて、選出を正しい列に保存する- 相手が一度も参加しなかった場合、その側の ID は空文字・選出は空
- 行動と結果は中身を解釈せず JSON のまま保存する(HP の実数など、クライアントに送らない値も含む)。JSON として読めないものだけ拒否する
- 報告済みかどうかは選出の列が
NULLでないかで判定する。結果報告は必ず選出の列を設定し、後始末 は 設定しないため、後始末でabortedになった対戦に後から届いた報告は受け付け、内容で上書きする
- バトルサーバーが MySQL を直接読む: DB へのアクセスを APIサーバーにまとめる方針から外れるため
- マッチ成立時に
battle_tokenへパーティ全員分の所持データを入れる: 使わない個体の分までトークンに載り、トークンの役割 (参加資格の証明)とも混ざるため