1000日間遊んでいるソシャゲ用CLIツールを開発した話

この記事は「GMOペパボエンジニア Advent Calendar 2022」の11日目の記事です。
今回はタイトルにある通り、現在も絶賛プレイ中のソシャゲのCLI開発からリリースに至る過程などについてお話します!

adventar.org

UNI’S ON AIR(ユニエア)について

  • 今回の記事で紹介するCLIツールを開発する発端となったスマホ向けゲーム
  • 2022/12/10でゲームの活動記録(ログイン日数)が1000日に到達した
  • ゲーム内容は櫻坂46、日向坂46というアイドルグループのリズムゲーム
  • ガチャ要素やプレイヤー同士がランキングを競ういわゆるソシャゲ

※ 今回ツールの開発や説明が目的なのでゲームシステムなどについては割愛、簡略化しています🙏

keyahina-unisonair.com

2022/12/10時点でゲーム活動記録1000日になった

この合計スコアはランキング順位としては2000位ちょいくらい

ゲームの主な目的

  • セットリストランキングに参加して順位を上げるとともに自尊心も高める
    • 楽曲プレイ、石集め、ガチャ、育成を繰り返し楽曲毎のハイスコアを更新し、その上位10のスコアの合計値により全ユーザーが毎週ランキングの順位を争う
    • 自分は現在こちらをメインで毎日やっている
  • エールイベントに参加して推しメンのサイン入りグッズを入手する
    • イベントの上位入賞者にはメンバーのサイン入りグッズがもらえる
      • イベント期間中にガチャを回してイベントボーナスが付くカードをより多く集めた者だけがまず挑戦権を得られる
      • その状態でイベント期間中の約1週間はほぼ不眠不休でリズムゲームをプレイしポイントを稼ぎ続けることでやっと到達することができる領域...
    • 自分もこのイベントには参加しているが上位を狙うのではなくイベント参加報酬としてもらえる石などを目当てにやっている

ユニエアのプレイ歴など

  • 2020/3/13
    • 仲間内でそういうゲームアプリが有ることを知ってアプリをDLして開始
  • (途中のどこかの時点)
    • いつのまにか1番遅く始めた自分が仲間内でのセットリストランキングトップになっていた
  • 2022/12/10
    • ログイン日数が1000日に到達
    • 現時点ではセットリストランキングは全ユーザー内で2000位ちょいくらい
    • あくまでエンジョイレベル
    • 無(理のない)課金勢

全てはガチャを引く石のために

uniarについて説明する前にユニエアのゲーム内のサイクルについて簡単に説明すると以下のようなことを行います

  1. リズムゲームをプレイして貯めた石を使ってガチャを回しカードを獲得する
    • ハイスコアを出すためにより発生確率の高いスコアボーナススキルを持ったカードを当てたい
  2. メンバー、カードを育成する
    • 育成することでスコア計算の際のベース値が上昇する
  3. リズムゲームをプレイしスコアアタックしてハイスコアを狙う
    • 所持するカードの中から5枚を選択してリズムゲームに挑む
    • ハイスコアを出すためにはフルコンボは最低条件
    • リズムゲーム中はスコアボーナスが一定確率で発生するシステムのため同じ楽曲を何度かプレイするスコアアタックによりハイスコア更新を狙う

uniarとは?

  • 自分が開発したユニエア用のCLIツールで、現時点では主に指定した条件でのカード情報をターミナル表示して参照するためのツール
  • Go言語 + SQLite で実現している
  • 現在のところhomebrewでのinstallもサポートしておりmacOSユーザーならすぐにinstallして動かしてみることが可能

github.com

uniar開発の経緯

  • 前提として趣味と実益を兼ねることでモチベーションを維持しつつ何か自作ソフトウェアを作りたいと常々思っていた
  • ゲームアプリ内でも自分が獲得したカードの管理機能はもちろんあるが、ユニエアを遊んでいくうちに以下の情報が知りたくなった
  • 1.ガチャで獲得したこのカードは当たりなのか?(ハイスコアを更新するために使えるカードか?)
    • これについてはゲームを長く遊んでいく中でどうなのかがすぐ分かるようになった
  • 2.現環境における最強のカードは何か?
    • ゲームアプリ内では未所持のカードについてはガチャ期間中にしかそのガチャであたるカードの詳細な情報を見ることができない
  • 3.また、これらを知ることで自分が所持するカードのうちどれを優先して育成していけばよいか?

ツールに求める要件

  • 現環境において指定した条件下における「カードの強さ」の順位を一覧することができること
    • カードの強さ = そのカードを使用した場合の高いスコアの出やすさを数値化したもの
  • 自分が所持するカード内からも同等のことが行えること

つまりこの時点では全てのカード情報をもつデータベースに対してSELECTクエリを実行し、その結果を画面出力するようなWebアプリケーションを作るイメージをしていました

いざ開発をはじめてみたが頓挫した…しかも2回

  • 当初はあまり深く考えずWebエンジニアなので作るならWebアプリケーションだなと考えて開発していた
  • しかしこれがうまくいかず開発はすぐに止まって頓挫してしまった
  • なんとかまたモチベーションを上げて再開したのですがすぐにまた頓挫してしまった

なぜ開発が2回も頓挫したのか?

  1. 開発が思うように進まず思い描いたようなものがなかなか作れないでいた
    • これを機にフロントエンドもやるぞーとなってNext.jsを使おうとしたところまでは良かった
    • ブラウザには一覧結果をリッチなテーブルとして表示してそこでフィルタやソートなど色々行えるようにしたいと思ったのが良くなかった
    • 結局初動において要件に対していきなりリッチなことをやろうとして思うように開発が進まなかった
  2. そうこうしていうちにモチベーションが低下した
    • 個人開発なので作業がすすまないとモチベーションが一気に0になる
    • そのうち別になくても困らないとなってしまった
  3. これまでに実装されている全てのカード情報を集めるのが簡単ではない
    • 開発を始めた時点ですでにゲームリリースから2年ほど経過しており、当時のガチャで引けたカード情報が簡単には手に入らない状況だった
    • しかし全てのデータを揃えるのはツール完成後でよかったのでこれはそこまで問題ではなかった

3度目の正直

  • ツールの実現方法をCLIツールに変えた
    • この時期ちょうど業務でCLIツールを開発していたこともありCLIの開発の知見が少しずつ蓄積されつつあった
    • また今回の要件を満たすのにWebアプリである必要はなくCLIとしてターミナルに出力されるものでも全然問題ないと気づいた
  • 動くものができるとモチベーションも上がった
    • とりあえず動くものができると使っているうちに色々直したくなってモチベーションも維持することができた
  • たまたま自分が持っていないカード情報を入手することができた
    • Youtubeでユニエアのカード性能解説動画などを配信しているチャンネルがuniarでやりたいことを先んじて実現したエクセル形式のツールを配布してくれていた
    • そのYoutubeチャンネルの方に連絡を取り、配布されているエクセル内のデータ使用許諾を得ることができた

そしてついにv0.1.0のリリース

  • 2022/09/24にv0.1.0をリリースした
    • その日のうちにv0.3.0にまでバージョンアップ
  • 記事公開時点ではv0.9.0が最新バージョン
    • これまでの主な変更点としてはカード情報をゲーム側の最新バージョンに追従したり、リスト表示のフィルタ機能を強化した
    • 出力の見方としては、デフォルトでは全カードがカードの総合力×スコアアップの期待値順に出力されるので現時点での環境最強のカードが上から順に表示されている
    • 特定のメンバーの特定のカードについて絞ることも可能
    • また自分の所持カード情報をセットアップしておくことで所持カード内で同様に順位を表示する機能も対応予定

まとめ

  • 今回自分が作りたいと思ったものに対し、当初の構想から途中でCLIツールに変更したことでまずはとりあえず動くレベルのものをモチベーションが落ちないうちに作成することができた
  • そして動くものができあがったことで機能開発が継続するようになった
  • しかしCLIツールにしたことで利用できる人の対象範囲がかなり限定されてしまっている状況ではある
    • ユーザーを増やすことを考えた場合にWebアプリケーションにして公開するほうがインストール不要ですぐ使えるので敷居がぐっと下がる
    • Webアプリケーション化は今後のマイルストーンの1つ
  • ソシャゲ用ツール特有の話
    • ほぼ毎月のように新カードが追加されるのでそれに追従するためのデータ更新が発生する
    • データ更新作業の負担を軽減するための仕組みをどうにか実現できないかと検討中
  • また今回は開発動機やリリースに至るまでの過程を主に話したので、技術的な部分については別の記事で紹介したいと思っています