その他
    ホーム 技術発信 DoRuby ボックスガチャの実装をしよう(ソーシャルゲームにおけるサーバーサイド) 2
    ボックスガチャの実装をしよう(ソーシャルゲームにおけるサーバーサイド) 2
     

    ボックスガチャの実装をしよう(ソーシャルゲームにおけるサーバーサイド) 2

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    この予算内で引けなかったら諦める

    前回までのあらすじ

    前回

    ボックスガチャを作る事になりました。

    必要な機能:
    ・ボックスガチャを引く
    ・現在のボックスの中身を確認
    ・各ステージでのボックスの中身の確認
    ・ボックスガチャのリセット
    必要な追加データ:
    ・ユーザーのボックスの現在状態
    ・ステージ毎のボックスの中身を定義するマスタ
    
    マスタデータ
     ┣キャラクターマスタ CharacterMaster
     ┃┣キャラスキルマスタ CharacterSkillMaster
     ┃┣キャラ成長マスタ CharacterExpMaster
     ┃┃┗キャラパラメータマスタ CharacterParameterMaster
     ┃...
      ...
     ┣ガチャの親マスタ GachaMaster
     ┃┣ガチャの中身マスタ GachaContentMaster
     ┃┗ボックスガチャの中身マスタ <= new!
     ...
    
    
    ユーザーデータ
     ┣所持キャラクター群 Characters
     ...
     ┣現在のボックスガチャの状態データ群 <= new!
     ...
    

    仕様書が来ました

    読み込むと実装に足りるだけの詳細がありました。

    ・ボックスガチャは通常ガチャと同様、1連と10連で引ける
    ・ボックスガチャで引けるものは通常ガチャと同等
    ・10連を選択した時にボックスの中身が9個以下だった場合、消費される対象はその中身分のみとなり、全てを自動で排出する
    ・リセットする度に上限までボックスの中身は変わる
    ・リセットは自由に可能。そのステージのボックスガチャを1回も引かなくともリセットが出来る
    

    さーばーえんじにあ「設計に関しても承認貰ったから実装していこう」

    まずはテーブルを作りましょう

    さーばーえんじにあ「新規テーブルは
    ・ボックスガチャの中身マスタ
    ・現在のボックスガチャの状態データ群
    か。
    名前はどうしようかな」

     ┣キャラクターマスタ CharacterMaster
     ┃┣キャラスキルマスタ CharacterSkillMaster
     ┃┣キャラ成長マスタ CharacterExpMaster
     ┃┃┗キャラパラメータマスタ CharacterParameterMaster
    
     ┣ガチャの親マスタ GachaMaster
     ┃┣ガチャの中身マスタ GachaContentMaster
     ┃┗ボックスガチャの中身マスタ
    
     ┣所持キャラクター群 Character
     ...
     ┣現在のボックスガチャの状態データ群
    

    さーばーえんじにあ「ガチャのマスタは先頭にGachaってついていた方がエディタとかで開いた時、ガチャ関連の定義ファイルが一箇所に集中していて分かりやすいよなあ。
     だと、ボックスガチャの中身マスタはGachaBoxContentMasterとかになるかな?
     で、現在のボックスガチャの状態テータ群もそれに倣う形でGachaBoxContentとかになるかなあ。
     ボックスなのにGachaBoxって逆転させるの気持ち悪いけど……でも、データの並び順序考えるとこの方が良いかな」
    さーばーえんじにあ「そんなこんなで、マスタ名、GachaBoxContentMasterにしました。通常ガチャとは別にステージ毎の中身の情報をここにお願いします。
     カラムは、通常のガチャの中身を示すGachaContentMasterの一部を変更、追加する形で、
     確率がweight: integerで定義されているのに対して、こちらが示すものは中身の数量なので、quantity: integerにします。
     後は、どのステージかを示すstage: integerをカラムとして追加してあります。
     問題ないですか?」
    ぷらんな「ok」

    API名を先に定義しておきましょう

    既存のAPIとして以下が既に定義されていました。

    ・ガチャトップ画面 GET: gachas
    ・ガチャを引く POST: gachas/draw
    ・ガチャの確率を確認する GET: gachas/rate_list
    

    さーばーえんじにあ「ガチャを引くAPIはこのままでいっか。引くものは確率確認は、ボックスガチャで各ステージでのボックスの中身の確認、としても良い気がする。
     ……でも、レスポンスの形もUIも変わるよなぁ……分けた方が良いかな?」
    くらいあんとえんじにあ「あ、分けて欲しいな」
    さーばーえんじにあ「分かりましたー」
    さーばーえんじにあ「じゃあ、追加する機能に対してのAPIはこんな感じになるかな」

    ・ボックスガチャを引く POST: gachas/draw
    ・現在のボックスの中身を確認 GET: gachas/current_box_contents
    ・各ステージでのボックスの中身の確認 GET: gachas/all_box_contents
    ・ボックスガチャのリセット POST gachas/reset_box
    

    さーばーえんじにあ「じゃあ、実装かな」

    記事を共有